Separating event logging out of ULS functionality. Event logging is now loosely coupled with ULS. ULS core modules can emit an event whenever EventLogging is required. The eventlogger module will act on the event if configured. Change-Id: I59dfcfb25c1acb85376b56239f2355ee7c4aff1e
182 lines
5.1 KiB
JavaScript
182 lines
5.1 KiB
JavaScript
/**
|
|
* ULS Event logger
|
|
*
|
|
* Copyright (C) 2012-2013 Alolita Sharma, Amir Aharoni, Arun Ganesh, Brandon Harris,
|
|
* Niklas Laxström, Pau Giner, Santhosh Thottingal, Siebrand Mazeland and other
|
|
* contributors. See CREDITS for a list.
|
|
*
|
|
* UniversalLanguageSelector is dual licensed GPLv2 or later and MIT. You don't
|
|
* have to do anything special to choose one license or the other and you don't
|
|
* have to notify anyone which license you are using. You are free to use
|
|
* UniversalLanguageSelector in commercial projects as long as the copyright
|
|
* header is left intact. See files GPL-LICENSE and MIT-LICENSE for details.
|
|
*
|
|
* @file
|
|
* @ingroup Extensions
|
|
* @licence GNU General Public Licence 2.0 or later
|
|
* @licence MIT License
|
|
*/
|
|
|
|
( function ( $, mw ) {
|
|
'use strict';
|
|
|
|
/**
|
|
* ULS Event logger
|
|
*
|
|
* @since 2013.08
|
|
* @see https://meta.wikimedia.org/wiki/Schema:UniversalLanguageSelector
|
|
*/
|
|
function ULSEventLogger() {
|
|
this.logEventQueue = $.Callbacks( 'memory once' );
|
|
this.init();
|
|
this.listen();
|
|
}
|
|
|
|
ULSEventLogger.prototype = {
|
|
init: function () {
|
|
var eventLogger = this;
|
|
|
|
// Set event defaults and make the
|
|
mw.eventLog.setDefaults( 'UniversalLanguageSelector', {
|
|
version: 1,
|
|
token: mw.user.id(),
|
|
contentLanguage: mw.config.get( 'wgContentLanguage' ),
|
|
interfaceLanguage: mw.config.get( 'wgUserLanguage' )
|
|
} );
|
|
|
|
eventLogger.logEventQueue.fire();
|
|
},
|
|
|
|
/**
|
|
* Local wrapper for 'mw.eventLog.logEvent' which handles default params
|
|
* and ensures the correct schema is loaded.
|
|
*
|
|
* @param {Object} event Event action and optional fields
|
|
* @param {int} [timeout] Fail the request if it is not completed within
|
|
* the specified timeout. Can be use for example to log actions that
|
|
* cause the browser to navigate to other pages.
|
|
* @return {jQuery.Promise} jQuery Promise object for the logging call
|
|
*/
|
|
log: function ( event, timeout ) {
|
|
// We need to create our own deferred for two reasons:
|
|
// - logEvent might not be executed immediately
|
|
// - we cannot reject a promise returned by it
|
|
// So we proxy the original promises status updates
|
|
// and register our timeout if requested (for links).
|
|
var deferred = $.Deferred();
|
|
|
|
this.logEventQueue.add( function () {
|
|
mw.eventLog.logEvent( 'UniversalLanguageSelector', event )
|
|
.done( deferred.resolve )
|
|
.fail( deferred.reject );
|
|
} );
|
|
|
|
if ( timeout !== undefined ) {
|
|
window.setTimeout( deferred.reject, timeout );
|
|
}
|
|
|
|
return deferred.promise();
|
|
},
|
|
|
|
/**
|
|
* Listen for event logging
|
|
*/
|
|
listen: function () {
|
|
// Register handlers for event logging triggers
|
|
mw.hook( 'mw.uls.settings.open' ).add( $.proxy( this.ulsSettingsOpen, this ) );
|
|
mw.hook( 'mw.uls.language.revert' ).add( $.proxy( this.ulsLanguageRevert, this ) );
|
|
mw.hook( 'mw.uls.ime.enable' ).add( $.proxy( this.enableIME, this ) );
|
|
mw.hook( 'mw.uls.ime.disable' ).add( $.proxy( this.disableIME, this ) );
|
|
mw.hook( 'mw.uls.login.click' ).add( $.proxy( this.loginClick, this ) );
|
|
mw.hook( 'mw.uls.ime.morelanguages' ).add( $.proxy( this.imeMoreLanguages, this ) );
|
|
mw.hook( 'mw.uls.interface.morelanguages' ).add( $.proxy( this.interfaceMoreLanguages, this ) );
|
|
mw.hook( 'mw.uls.interface.language.change' ).add( $.proxy( this.interfaceLanguageChange, this ) );
|
|
},
|
|
|
|
/**
|
|
* Log language settings open
|
|
* @param {Array} args
|
|
*/
|
|
ulsSettingsOpen: function ( args ) {
|
|
this.log( {
|
|
action: 'settings-open',
|
|
context: args
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Log language revert
|
|
*
|
|
* @param {Function} callback
|
|
*/
|
|
ulsLanguageRevert: function ( callback ) {
|
|
this.log( { action: 'ui-lang-revert' }, 500 ).always( callback );
|
|
},
|
|
|
|
/**
|
|
* Log IME disabling
|
|
*/
|
|
disableIME: function () {
|
|
this.log( { action: 'ime-disable' } );
|
|
},
|
|
|
|
/**
|
|
* Log IME enabling
|
|
*/
|
|
enableIME: function () {
|
|
this.log( { action: 'ime-enable' } );
|
|
},
|
|
|
|
/**
|
|
* Log login link click in display settings. Since this will navigate
|
|
* away from the current page, provide a callback option.
|
|
*
|
|
* If page is navigating away, event logging will fail because it is not
|
|
* yet completed. With the callback, the navigation can be executed in
|
|
* callback. The waiting for callback is not indefinite, but with a timeout.
|
|
*
|
|
* @param {Function} callback
|
|
*/
|
|
loginClick: function ( callback ) {
|
|
this.log( { action: 'login-click' }, 500 ).always( callback );
|
|
},
|
|
|
|
/**
|
|
* More languages item in IME menu is clicked
|
|
*/
|
|
imeMoreLanguages: function () {
|
|
this.log( {
|
|
action: 'more-languages-access',
|
|
context: 'ime'
|
|
} );
|
|
},
|
|
|
|
/**
|
|
* Log interface language change
|
|
*
|
|
* @param {string} language language code
|
|
* @param {Function} callback
|
|
*/
|
|
interfaceLanguageChange: function ( language, callback ) {
|
|
this.log( {
|
|
action: 'language-change',
|
|
context: 'interface',
|
|
interfaceLanguage: language
|
|
}, 500 ).always( callback );
|
|
},
|
|
|
|
/**
|
|
* More languages in display settings is clicked
|
|
*/
|
|
interfaceMoreLanguages: function () {
|
|
this.log( {
|
|
action: 'more-languages-access',
|
|
context: 'interface'
|
|
} );
|
|
}
|
|
};
|
|
|
|
mw.uls = mw.uls || {};
|
|
mw.uls.eventlogger= new ULSEventLogger();
|
|
}( jQuery, mediaWiki ) );
|