Implement the new schema for when the popups are enabled

Bug: T88167
Change-Id: I38c9e474e0ec7da45af8338a458430e5d7427463
This commit is contained in:
Prateek Saxena 2015-03-19 16:34:29 +05:30
parent d49cfb9b65
commit 2971d90831
4 changed files with 47 additions and 87 deletions

View file

@ -42,7 +42,7 @@ class PopupsHooks {
* @param array $schemas
*/
public static function onEventLoggingRegisterSchemas( array &$schemas ) {
$schemas['Popups'] = 7536956;
$schemas['Popups'] = 11625443;
}
/**

View file

@ -7,43 +7,21 @@
var logger = {};
/**
* Unix timestamp of when the popup was rendered
* @property time
*/
logger.time = undefined;
/**
* How long was the popup open in milliseconds
* @property {Number} duration
*/
logger.duration = undefined;
/**
* Was the popup clicked, middle clicked or dismissed
* @property {String} action
*/
logger.action = undefined;
/**
* Logs different actions such as meta and shift click on the popup
* Is bound to the `click` event
* Get action based on click event
*
* @method logClick
* @method getAction
* @param {Object} event
*/
logger.logClick = function ( event ) {
logger.getAction = function ( event ) {
if ( event.which === 2 ) { // middle click
logger.action = 'opened in new tab';
return 'opened in new tab';
} else if ( event.which === 1 ) {
if ( event.ctrlKey || event.metaKey ) {
logger.action = 'opened in new tab';
return 'opened in new tab';
} else if ( event.shiftKey ) {
logger.action = 'opened in new window';
return 'opened in new window';
} else {
logger.action = 'opened in same tab';
logger.duration = mw.now() - logger.time;
logger.log( mw.popups.render.currentLink.attr( 'href' ) );
event.preventDefault();
return 'opened in same tab';
}
}
};
@ -51,67 +29,23 @@
/**
* Logs the popup event as defined in the following schema-
* https://meta.wikimedia.org/wiki/Schema:Popups
* If `href` is passed it redirects to that location after the event is logged.
*
* @method log
* @param {String} href
* @return {Boolean} logged Whether or not the event was logged
* @param {Object} event
* @return {jQuery.Promise}
*/
logger.log = function ( href ) {
logger.log = function ( event ) {
if ( mw.eventLog === undefined ) {
return false;
return $.Deferred().resolve();
}
var
deferred = $.Deferred(),
event = {
'duration': Math.round( logger.duration ),
'action': logger.action
};
// Get duration from time
event.duration = Math.floor( mw.now() - event.time );
delete event.time;
if ( logger.sessionId !== null ) {
event.sessionId = logger.sessionId;
}
if ( href ) {
deferred.always( function () {
location.href = href;
} );
}
mw.eventLog.logEvent( 'Popups', event ).then( deferred.resolve, deferred.reject );
// reset
logger.time = undefined;
logger.duration = undefined;
logger.action = undefined;
return true;
return mw.eventLog.logEvent( 'Popups', event );
};
/**
* Generates a unique sessionId or pulls an existing one from localStorage
*
* @method getSessionsId
* @return {String} sessionId
*/
logger.getSessionId = function () {
var sessionId = null;
try {
sessionId = localStorage.getItem( 'popupsSessionId' );
if ( sessionId === null ) {
sessionId = mw.user.generateRandomSessionId();
localStorage.setItem( 'popupsSessionId', sessionId );
}
} catch ( e ) {}
return sessionId;
};
/**
* @property sessionId
*/
logger.sessionId = logger.getSessionId();
mw.popups.logger = logger;
} ) ( jQuery, mediaWiki );

View file

@ -133,6 +133,7 @@
$div = $( '<div>' ).append( $thumbnail, $contentbox, $timestamp );
mw.popups.render.cache[ href ].settings = {
'title': page.title,
'tall': ( tall === undefined ) ? false : tall,
'thumbnail': ( thumbnail === undefined ) ? false : thumbnail
};

View file

@ -153,9 +153,16 @@
cache.process( link );
// Event logging
mw.popups.logger.time = mw.now();
mw.popups.logger.action = 'dismissed';
mw.popups.$popup.find( 'a.mwe-popups-extract, a.mwe-popups-discreet' ).click( mw.popups.logger.logClick );
if ( mw.popups.logger ) {
mw.popups.render.logEvent = {
pageTitleHover: cache.settings.title,
pageTitleSource: mw.config.get( 'wgTitle' ),
popupEnabled: mw.popups.enabled,
time: mw.now(),
action: 'dismissed'
};
mw.popups.$popup.find( 'a.mwe-popups-extract, a.mwe-popups-discreet' ).click( mw.popups.render.clickHandler );
}
link
.off( 'mouseleave blur', mw.popups.render.leaveInactive )
@ -164,6 +171,22 @@
$( document ).on( 'keydown', mw.popups.render.closeOnEsc );
};
/**
* Click handler for the hovercard
*
* @method clickHandler
* @param {Object} event
*/
mw.popups.render.clickHandler = function ( event ) {
mw.popups.render.logEvent.action = mw.popups.logger.getAction( event );
if ( mw.popups.render.logEvent.action === 'opened in same tab' ) {
event.preventDefault();
mw.popups.logger.log( mw.popups.render.logEvent ).then( function () {
window.location.href = mw.popups.render.currentLink.attr( 'href' );
} );
}
};
/**
* Removes the hover class from the link and unbinds events
* Hides the popup, clears timers and sets it and the resets the renderer
@ -175,8 +198,10 @@
return false;
}
mw.popups.logger.duration = mw.now() - mw.popups.logger.time;
mw.popups.logger.log();
// Event logging
if ( mw.popups.logger ) {
mw.popups.logger.log( mw.popups.render.logEvent );
}
$( mw.popups.render.currentLink ).off( 'mouseleave blur', mw.popups.render.leaveActive );