Bmansurov has uploaded a new change for review. https://gerrit.wikimedia.org/r/251001
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 'loaded', '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/Hooks.php A resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js M resources/ext.relatedArticles.readMore.minerva/index.js 4 files changed, 127 insertions(+), 3 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/RelatedArticles refs/changes/01/251001/1 diff --git a/extension.json b/extension.json index 7de70a7..7285c7a 100644 --- a/extension.json +++ b/extension.json @@ -42,6 +42,12 @@ ], "BeforePageDisplay": [ "RelatedArticles\\ReadMoreHooks::onBeforePageDisplay" + ], + "EventLoggingRegisterSchemas": [ + "RelatedArticles\\Hooks::onEventLoggingRegisterSchemas" + ], + "ResourceLoaderGetConfigVars": [ + "RelatedArticles\\Hooks::onResourceLoaderGetConfigVars" ] }, "MessagesDirs": { @@ -64,7 +70,11 @@ ] }, "ext.relatedArticles.readMore.minerva": { + "dependencies": [ + "ext.eventLogging.Schema" + ], "scripts": [ + "resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js", "resources/ext.relatedArticles.readMore.minerva/index.js" ], "styles": [ @@ -81,5 +91,8 @@ "ResourceFileModulePaths": { "localBasePath": "", "remoteExtPath": "RelatedArticles" + }, + "config": { + "RelatedArticlesLoggingSamplingRate": 0.01 } } diff --git a/includes/Hooks.php b/includes/Hooks.php index c83c95a..7e0a27d 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -278,4 +278,38 @@ 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'] = 14376180; + + 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 ) { + global $wgRelatedArticlesLoggingSamplingRate; + $vars['wgRelatedArticlesLoggingSamplingRate']= $wgRelatedArticlesLoggingSamplingRate; + + return true; + } } diff --git a/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js new file mode 100644 index 0000000..5a23b13 --- /dev/null +++ b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js @@ -0,0 +1,22 @@ +( function () { + // See https://meta.wikimedia.org/wiki/Schema:RelatedArticles + var skin = mw.config.get( 'skin' ), + 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() + } + ); + + mw.trackSubscribe( 'ext.relatedArticles.log', function ( _, data ) { + schemaRelatedArticles.log( data ); + } ); + +} )(); diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js b/resources/ext.relatedArticles.readMore.minerva/index.js index 7a6b3b3..860d65a 100644 --- a/resources/ext.relatedArticles.readMore.minerva/index.js +++ b/resources/ext.relatedArticles.readMore.minerva/index.js @@ -1,6 +1,8 @@ ( function ( $ ) { - var MOBILE_WEB_WATCHING_FUNNEL = 'read-more'; + var MOBILE_WEB_WATCHING_FUNNEL = 'read-more', + $window = $( window ), + $readMore; /** * Converts the set of pages generated in the init script into a set of @@ -22,11 +24,43 @@ } ); } + /** + * 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.readmore' ); + mw.track( 'ext.relatedArticles.log', { eventName: 'seen' } ); + } + } + mw.trackSubscribe( 'ext.relatedArticles.init', function ( _, data ) { var WatchstarPageList = mw.mobileFrontend.require( 'mobile.pagelist.scripts/WatchstarPageList' ), pageList, - $container = $( '#content' ), - $readMore; + $container = $( '#content' ); pageList = new WatchstarPageList( { pages: convertPages( data.pages ), @@ -49,6 +83,27 @@ $readMore.append( pageList.$el ); $container.append( $readMore ); + + // the read more code is loaded + mw.track( 'ext.relatedArticles.log', { eventName: 'loaded' } ); + + // log when readmore is seen by the user + $window.on( + 'scroll.readmore', + $.debounce( 250, logReadMoreSeen ) + ); + logReadMoreSeen(); + + // track the clicked event + pageList.$el.find( 'a' ).on( 'click', function () { + var index = $( this ).parents( 'li' ).index(); + + mw.track( 'ext.relatedArticles.log', { + eventName: 'clicked', + clickIndex: index + 1 + } ); + } ); + } ); }( jQuery ) ); -- To view, visit https://gerrit.wikimedia.org/r/251001 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I649d0817cbd10ad734989da548d20ad33e7f7360 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/RelatedArticles Gerrit-Branch: dev Gerrit-Owner: Bmansurov <[email protected]> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
