From 261542d738c7622227a9c637fe5cfaef796eed21 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Mon, 17 Feb 2014 23:12:02 +0200 Subject: [PATCH] Log tofu detection event This only works if webfonts enabled (the checkbox is checked). Change-Id: Ibbedc6a34dacb983f156d8a33afa5ab625e32f5f --- Resources.php | 5 ++++- UniversalLanguageSelector.php | 17 +++++++++++++---- resources/js/ext.uls.eventlogger.js | 25 ++++++++++++++++++++++--- resources/js/ext.uls.webfonts.js | 12 +++++++++--- 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/Resources.php b/Resources.php index c504361a..cb01d805 100644 --- a/Resources.php +++ b/Resources.php @@ -79,7 +79,10 @@ $wgResourceModules['ext.uls.init'] = array( $wgResourceModules['ext.uls.eventlogger'] = array( 'scripts' => 'resources/js/ext.uls.eventlogger.js', - 'dependencies' => 'schema.UniversalLanguageSelector', + 'dependencies' => array( + 'schema.UniversalLanguageSelector', + 'schema.UniversalLanguageSelector-tofu', + ), ) + $resourcePaths; $wgResourceModules['ext.uls.i18n'] = array( diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index b21c7af4..1164a303 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -216,20 +216,29 @@ $GLOBALS['wgExtensionFunctions'][] = function () { }; } - // If EventLogging integration is enabled, first ensure that the - // EventLogging extension is present, then declare schema module. + // If EventLogging integration is enabled, first ensure that + // the EventLogging extension is present, then declare schema module. // If it is not present, emit a warning and disable logging. if ( $wgULSEventLogging ) { if ( class_exists( 'ResourceLoaderSchemaModule' ) ) { + // NB: When updating the schema, remember also to update the version + // in the schema default in the JavaScript library. /// @see https://meta.wikimedia.org/wiki/Schema:UniversalLanguageSelector $wgResourceModules['schema.UniversalLanguageSelector'] = array( 'class' => 'ResourceLoaderSchemaModule', 'schema' => 'UniversalLanguageSelector', 'revision' => 7327441, ); + + /// @see https://meta.wikimedia.org/wiki/Schema:UniversalLanguageSelector-tofu + $wgResourceModules['schema.UniversalLanguageSelector-tofu'] = array( + 'class' => 'ResourceLoaderSchemaModule', + 'schema' => 'UniversalLanguageSelector-tofu', + 'revision' => 7629564, + ); } else { - wfWarn( 'UniversalLanguageSelector is configured to use EventLogging, but ' - . 'the extension is is not available. Disabling wgULSEventLogging.' ); + wfWarn( 'UniversalLanguageSelector is configured to use EventLogging, ' + . 'but the extension is not available. Disabling wgULSEventLogging.' ); $wgULSEventLogging = false; } } diff --git a/resources/js/ext.uls.eventlogger.js b/resources/js/ext.uls.eventlogger.js index 110f7fb1..ced14600 100644 --- a/resources/js/ext.uls.eventlogger.js +++ b/resources/js/ext.uls.eventlogger.js @@ -35,7 +35,6 @@ init: function () { var eventLogger = this; - // Set event defaults and make the mw.eventLog.setDefaults( 'UniversalLanguageSelector', { version: 1, token: mw.user.id(), @@ -43,6 +42,11 @@ interfaceLanguage: mw.config.get( 'wgUserLanguage' ) } ); + mw.eventLog.setDefaults( 'UniversalLanguageSelector-tofu', { + version: 1, + token: mw.user.id() + } ); + eventLogger.logEventQueue.fire(); }, @@ -50,17 +54,20 @@ * Local wrapper for 'mw.eventLog.logEvent' * * @param {Object} event Event action and optional fields + * @param {String} schema The schema; 'UniversalLanguageSelector' is the default * @return {jQuery.Promise} jQuery Promise object for the logging call */ - log: function ( event ) { + log: function ( event, schema ) { // 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. var deferred = $.Deferred(); + schema = schema || 'UniversalLanguageSelector'; + this.logEventQueue.add( function () { - mw.eventLog.logEvent( 'UniversalLanguageSelector', event ) + mw.eventLog.logEvent( schema, event ) .done( deferred.resolve ) .fail( deferred.reject ); } ); @@ -85,6 +92,7 @@ mw.hook( 'mw.uls.font.change' ).add( $.proxy( this.fontChange, this ) ); mw.hook( 'mw.uls.webfonts.enable' ).add( $.proxy( this.enableWebfonts, this ) ); mw.hook( 'mw.uls.webfonts.disable' ).add( $.proxy( this.disableWebfonts, this ) ); + mw.hook( 'mw.uls.webfonts.tofudetected' ).add( $.proxy( this.tofuDetected, this ) ); $( 'body' ).on( 'noresults.uls', '.uls-menu .languagefilter', $.proxy( this.noSearchResults, this ) @@ -227,6 +235,17 @@ this.log( { action: 'webfonts-enable', context: context } ); }, + /** + * Log tofu detection + * @param {string} language Code of the element in which tofu was detected + */ + tofuDetected: function ( language ) { + this.log( { + tofuElementLanguage: language, + webfontsEnabled: mw.webfonts.preferences.isEnabled() + }, 'UniversalLanguageSelector-tofu' ); + }, + /** * Log search strings which produce no search results. * @param {jQuery.event} event The orignal event diff --git a/resources/js/ext.uls.webfonts.js b/resources/js/ext.uls.webfonts.js index 461cf899..a1e3bd41 100644 --- a/resources/js/ext.uls.webfonts.js +++ b/resources/js/ext.uls.webfonts.js @@ -168,9 +168,15 @@ detectTofu( $.uls.data.getAutonym( language ) ); if ( tofu ) { - mw.log( 'tofu detected for ' + language ); - // Cache the languages with tofu - tofuLanguages[language] = true; + // Log the tofu detection only once per page per language + if ( !tofuLanguages[language] ) { + mw.log( 'tofu detected for ' + language ); + mw.hook( 'mw.uls.webfonts.tofudetected' ).fire( language ); + + // Cache the languages with tofu + tofuLanguages[language] = true; + } + font = autonym ? 'Autonym' : defaultFont; } else { // No tofu and no font preference. Use system font.