mediawiki-extensions-Popups/resources/ext.popups.logger.js

118 lines
2.6 KiB
JavaScript
Raw Normal View History

( function ( $, mw ) {
/**
* @class mw.popups.logger
* @singleton
*/
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
*
* @method logClick
* @param {Object} event
*/
logger.logClick = function ( event ) {
if ( event.which === 2 ) { // middle click
logger.action = 'opened in new tab';
} else if ( event.which === 1 ) {
if ( event.ctrlKey || event.metaKey ) {
logger.action = 'opened in new tab';
} else if ( event.shiftKey ) {
logger.action = '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();
}
}
};
/**
* 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
*/
logger.log = function ( href ) {
if ( mw.eventLog === undefined ) {
return false;
}
var
deferred = $.Deferred(),
event = {
'duration': Math.round( logger.duration ),
'action': logger.action
};
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;
};
/**
* 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 );