Bmansurov has uploaded a new change for review. https://gerrit.wikimedia.org/r/249798
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. The default rate is 1%. * Events are tracked using a unique user session token. 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, 164 insertions(+), 3 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/RelatedArticles refs/changes/98/249798/1 diff --git a/extension.json b/extension.json index 334c23e..34f98df 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": [ + "mobile.startup" + ], "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..6adc4cc 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 registering enabled surveys + * @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..1464e32 --- /dev/null +++ b/resources/ext.relatedArticles.readMore.minerva/SchemaRelatedArticles.js @@ -0,0 +1,54 @@ +( function ( M, $ ) { + var Schema = M.require( 'mobile.startup/Schema' ), + SchemaRelatedArticles, + schemaRelatedArticles; + + /** + * @class SchemaRelatedArticles + * @extends Schema + */ + SchemaRelatedArticles = Schema.extend( { + /** @inheritdoc **/ + name: 'RelatedArticles', + /** + * https://meta.wikimedia.org/wiki/Schema:RelatedArticles + * @inheritdoc + * @cfg {Object} defaults The options hash. + */ + defaults: $.extend( {}, Schema.prototype.defaults, { + pageId: mw.config.get( 'wgArticleId' ), + skin: mw.config.get( 'skin' ), + userSessionToken: mw.user.generateRandomSessionId() + ( new Date() ).getTime().toString() + } ), + /** + * @inheritdoc + */ + isSampled: true, + /** + * @inheritdoc + * Defaults to 0.01 + */ + samplingRate: mw.config.get( 'wgRelatedArticlesLoggingSamplingRate', 0.01 ), + /** + * @inheritdoc + */ + initialize: function () { + Schema.prototype.initialize.call( this, arguments ); + // See the schema definition at https://meta.wikimedia.org/wiki/Schema:RelatedArticles + if ( this.defaults.skin === 'minerva' ) { + this.defaults.skin += '-' + mw.config.get( 'wgMFMode' ); + } + } + } ); + + schemaRelatedArticles = new SchemaRelatedArticles(); + + mw.trackSubscribe( 'ext.relatedArticles.log', function ( _, data ) { + if ( data.eventName === 'clicked' ) { + schemaRelatedArticles.logBeacon( data ); + } else { + schemaRelatedArticles.log( data ); + } + } ); + +} )( mw.mobileFrontend, jQuery ); diff --git a/resources/ext.relatedArticles.readMore.minerva/index.js b/resources/ext.relatedArticles.readMore.minerva/index.js index 888c5ab..c603e27 100644 --- a/resources/ext.relatedArticles.readMore.minerva/index.js +++ b/resources/ext.relatedArticles.readMore.minerva/index.js @@ -1,6 +1,9 @@ ( function ( $ ) { - var MOBILE_WEB_WATCHING_FUNNEL = 'read-more'; + var MOBILE_WEB_WATCHING_FUNNEL = 'read-more', + $window = $( window ), + timer = null, + $readMore; /** * Converts the set of pages generated in the init script into a set of @@ -22,11 +25,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 ), @@ -47,6 +82,31 @@ $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 + function () { + clearTimeout( timer ); + timer = setTimeout( logReadMoreSeen, 250 ); + } + ); + logReadMoreSeen(); + + // track the clicked event + pageList.$el.find( 'a' ).each( function ( i ) { + $( this ).on( 'click', function () { + mw.track( 'ext.relatedArticles.log', { + eventName: 'clicked', + clickIndex: i + 1 + } ); + } ); + } ); + } ); }( jQuery ) ); -- To view, visit https://gerrit.wikimedia.org/r/249798 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: master Gerrit-Owner: Bmansurov <[email protected]> _______________________________________________ MediaWiki-commits mailing list [email protected] https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits
