jenkins-bot has submitted this change and it was merged. Change subject: Add event logging to read more ......................................................................
Add event logging to read more * Schema is located at https://meta.wikimedia.org/wiki/Schema:RelatedArticles. * Track 'ready', 'seen', and 'clicked' events. * The sampling rate can be set using the RelatedArticlesLoggingSamplingRate variable. If the variable is not set, sampling will be disabled. The default sampling rate is 0.01. * Events are tracked using a unique user session token. Dependency: Iea00d534371353c3ae5c06c74a08aa10cb60047b Bug: T114303 Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360 --- M extension.json M includes/ReadMoreHooks.php A resources/ext.relatedArticles.readMore.minerva/eventLogging.js M resources/ext.relatedArticles.readMore.minerva/index.js 4 files changed, 177 insertions(+), 18 deletions(-) Approvals: Phuedx: Looks good to me, approved jenkins-bot: Verified diff --git a/extension.json b/extension.json index fd69291..f3f0a9d 100644 --- a/extension.json +++ b/extension.json @@ -45,6 +45,15 @@ ], "BeforePageDisplay": [ "RelatedArticles\\ReadMoreHooks::onBeforePageDisplay" + ], + "EventLoggingRegisterSchemas": [ + "RelatedArticles\\ReadMoreHooks::onEventLoggingRegisterSchemas" + ], + "ResourceLoaderGetConfigVars": [ + "RelatedArticles\\ReadMoreHooks::onResourceLoaderGetConfigVars" + ], + "ResourceLoaderRegisterModules": [ + "RelatedArticles\\ReadMoreHooks::onResourceLoaderRegisterModules" ] }, "MessagesDirs": { @@ -78,28 +87,15 @@ "mobile", "desktop" ] - }, - "ext.relatedArticles.readMore.minerva": { - "scripts": [ - "resources/ext.relatedArticles.readMore.minerva/index.js" - ], - "styles": [ - "resources/ext.relatedArticles.readMore.minerva/readMore.less" - ], - "messages": [ - "relatedarticles-read-more-heading" - ], - "targets": [ - "mobile" - ] } }, "config": { "RelatedArticlesShowReadMore": false, - "RelatedArticlesUseCirrusSearch": false + "RelatedArticlesUseCirrusSearch": false, + "RelatedArticlesLoggingSamplingRate": 0.01 }, "ConfigRegistry": { - "relatedarticles": "GlobalVarConfig::newInstance" + "RelatedArticles": "GlobalVarConfig::newInstance" }, "ResourceFileModulePaths": { "localBasePath": "", diff --git a/includes/ReadMoreHooks.php b/includes/ReadMoreHooks.php index b9703f0..ec76bd8 100644 --- a/includes/ReadMoreHooks.php +++ b/includes/ReadMoreHooks.php @@ -3,6 +3,7 @@ namespace RelatedArticles; use OutputPage; +use ResourceLoader; use Skin; use ConfigFactory; @@ -44,7 +45,7 @@ * @return boolean Always <code>true</code> */ public static function onMakeGlobalVariablesScript( &$vars, OutputPage $out ) { - $config = ConfigFactory::getDefaultInstance()->makeConfig( 'relatedarticles' ); + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $vars['wgRelatedArticles'] = $out->getProperty( 'RelatedArticles' ); $vars['wgRelatedArticlesUseCirrusSearch'] = $config->get( 'RelatedArticlesUseCirrusSearch' ); @@ -73,7 +74,7 @@ * @return boolean Always <code>true</code> */ public static function onBeforePageDisplay( OutputPage $out, Skin $skin ) { - $config = ConfigFactory::getDefaultInstance()->makeConfig( 'relatedarticles' ); + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); $showReadMore = $config->get( 'RelatedArticlesShowReadMore' ); $title = $out->getContext()->getTitle(); @@ -90,4 +91,83 @@ return true; } + + /** + * EventLoggingRegisterSchemas hook handler. + * + * Registers our EventLogging schemas so that they can be converted to + * ResourceLoaderSchemaModules by the EventLogging extension. + * + * If the module has already been registered in + * onResourceLoaderRegisterModules, then it is overwritten. + * + * @param array $schemas The schemas currently registered with the EventLogging + * extension + * @return bool Always true + */ + public static function onEventLoggingRegisterSchemas( &$schemas ) { + // @see https://meta.wikimedia.org/wiki/Schema:RelatedArticles + $schemas['RelatedArticles'] = 14496900; + + return true; + } + + /** + * ResourceLoaderGetConfigVars hook handler for setting a config variable + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetConfigVars + * + * @param array $vars + * @return boolean + */ + public static function onResourceLoaderGetConfigVars( &$vars ) { + $config = ConfigFactory::getDefaultInstance()->makeConfig( 'RelatedArticles' ); + $vars['wgRelatedArticlesLoggingSamplingRate'] = + $config->get( 'RelatedArticlesLoggingSamplingRate' ); + + return true; + } + + /** + * Register the "ext.relatedArticles.readMore.minerva" module. + * Optionally update the dependencies and scripts if EventLogging is installed. + * + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderRegisterModules + * + * @param ResourceLoader &$resourceLoader The ResourceLoader object + * @return boolean + */ + public static function onResourceLoaderRegisterModules( ResourceLoader &$resourceLoader ) { + $dependencies = array( + "mediawiki.user" + ); + $scripts = array( + "resources/ext.relatedArticles.readMore.minerva/index.js" + ); + + if ( class_exists( 'EventLogging' ) ) { + $dependencies[] = "ext.eventLogging.Schema"; + $scripts[] = "resources/ext.relatedArticles.readMore.minerva/eventLogging.js"; + } + + $resourceLoader->register( + "ext.relatedArticles.readMore.minerva", + array( + "dependencies" => $dependencies, + "scripts" => $scripts, + "styles" => array( + "resources/ext.relatedArticles.readMore.minerva/readMore.less" + ), + "messages" => array( + "relatedarticles-read-more-heading" + ), + "targets" => array( + "mobile" + ), + "localBasePath" => __DIR__ . "/..", + "remoteExtPath" => "RelatedArticles" + ) + ); + + return true; + } } diff --git a/resources/ext.relatedArticles.readMore.minerva/eventLogging.js b/resources/ext.relatedArticles.readMore.minerva/eventLogging.js new file mode 100644 index 0000000..8dc048e --- /dev/null +++ b/resources/ext.relatedArticles.readMore.minerva/eventLogging.js @@ -0,0 +1,80 @@ +// See https://meta.wikimedia.org/wiki/Schema:RelatedArticles +( function ( $ ) { + var $readMore, + schemaRelatedArticles, + skin = mw.config.get( 'skin' ), + $window = $( window ); + + /** + * Check if at least half of the element's height and half of its width are in viewport + * + * @method + * @param {jQuery.Object} $el - element that's being tested + * @return {boolean} + */ + function isElementInViewport( $el ) { + var windowHeight = $window.height(), + windowWidth = $window.width(), + windowScrollLeft = $window.scrollLeft(), + windowScrollTop = $window.scrollTop(), + elHeight = $el.height(), + elWidth = $el.width(), + elOffset = $el.offset(); + + return ( + ( windowScrollTop + windowHeight >= elOffset.top + elHeight / 2 ) && + ( windowScrollLeft + windowWidth >= elOffset.left + elWidth / 2 ) && + ( windowScrollTop <= elOffset.top + elHeight / 2 ) + ); + } + + /** + * Log when ReadMore is seen by the user + */ + function logReadMoreSeen() { + if ( isElementInViewport( $readMore ) ) { + $window.off( 'scroll', logReadMoreSeen ); + schemaRelatedArticles.log( { eventName: 'seen' } ); + } + } + + mw.trackSubscribe( 'ext.relatedArticles.logReady', function ( _, data ) { + schemaRelatedArticles = new mw.eventLog.Schema( + 'RelatedArticles', + // not sampled if the config variable is not set + mw.config.get( 'wgRelatedArticlesLoggingSamplingRate', 0 ), + { + pageId: mw.config.get( 'wgArticleId' ), + skin: ( skin === 'minerva' ) ? skin + '-' + mw.config.get( 'wgMFMode' ) : skin, + // We cannot depend on the uniqueness of mw.user.generateRandomSessionId(), + // thus append the timestamp. See mw.user documentation for more info. + userSessionToken: mw.user.generateRandomSessionId() + + ( new Date() ).getTime().toString() + } + ); + + $readMore = data.$readMore; + + // log ready + schemaRelatedArticles.log( { eventName: 'ready' } ); + + // log when ReadMore is seen by the user + $window.on( + 'scroll', + $.debounce( 250, logReadMoreSeen ) + ); + logReadMoreSeen(); + + // track the clicked event + // TODO: This should be moved into the PageList component or, preferably, the CardList/Card views. + $readMore.on( 'click', 'a', function () { + var index = $( this ).parents( 'li' ).index(); + + schemaRelatedArticles.log( { + eventName: 'clicked', + clickIndex: index + 1 + } ); + } ); + } ); + +} )( jQuery ); diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js b/resources/ext.relatedArticles.readMore.minerva/index.js index 807a182..08e73fa 100644 --- a/resources/ext.relatedArticles.readMore.minerva/index.js +++ b/resources/ext.relatedArticles.readMore.minerva/index.js @@ -44,6 +44,9 @@ $readMore.append( pageList.$el ); $container.append( $readMore ); + + // the ReadMore code is ready + mw.track( 'ext.relatedArticles.logReady', { $readMore: $readMore } ); } ); }( jQuery ) ); -- To view, visit https://gerrit.wikimedia.org/r/251001 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360 Gerrit-PatchSet: 9 Gerrit-Project: mediawiki/extensions/RelatedArticles Gerrit-Branch: dev Gerrit-Owner: Bmansurov <[email protected]> Gerrit-Reviewer: Bmansurov <[email protected]> Gerrit-Reviewer: Jdlrobson <[email protected]> Gerrit-Reviewer: Phuedx <[email protected]> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
