Merge "Remove block notice tracking"
[lhc/web/wiklou.git] / resources / src / startup / startup.js
index 7e7fd6a..f2d964a 100644 (file)
@@ -3,8 +3,8 @@
  *
  * - Beware: This file MUST parse without errors on even the most ancient of browsers!
  */
-/* eslint-disable vars-on-top, no-unmodified-loop-condition */
-/* global mw, isCompatible, $VARS, $CODE */
+/* eslint-disable no-implicit-globals, vars-on-top, no-unmodified-loop-condition */
+/* global $VARS, $CODE */
 
 /**
  * See <https://www.mediawiki.org/wiki/Compatibility#Browsers>
  *
  * Other browsers that pass the check are considered Grade X.
  *
- * @param {string} [str] User agent, defaults to navigator.userAgent
+ * @private
+ * @param {string} ua User agent string
  * @return {boolean} User agent is compatible with MediaWiki JS
  */
-window.isCompatible = function ( str ) {
-       var ua = str || navigator.userAgent;
+function isCompatible( ua ) {
        return !!(
                // https://caniuse.com/#feat=es5
                // https://caniuse.com/#feat=use-strict
                // https://caniuse.com/#feat=json / https://phabricator.wikimedia.org/T141344#2784065
                ( function () {
                        'use strict';
-                       return !this && !!Function.prototype.bind && !!window.JSON;
+                       return !this && Function.prototype.bind && window.JSON;
                }() ) &&
 
                // https://caniuse.com/#feat=queryselector
@@ -69,44 +69,50 @@ window.isCompatible = function ( str ) {
                // https://caniuse.com/#feat=addeventlistener
                'addEventListener' in window &&
 
-               // Hardcoded exceptions for browsers that pass the requirement but we don't want to
-               // support in the modern run-time.
-               // Note: Please extend the regex instead of adding new ones
+               // Hardcoded exceptions for browsers that pass the requirement but we don't
+               // want to support in the modern run-time.
+               //
+               // Please extend the regex instead of adding new ones!
+               // And add a test case to startup.test.js
                !ua.match( /MSIE 10|webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$|googleweblight|PLAYSTATION|PlayStation/ )
        );
-};
+}
 
-( function () {
-       var NORLQ;
+if ( !isCompatible( navigator.userAgent ) ) {
        // Handle Grade C
-       if ( !isCompatible() ) {
-               // Undo speculative Grade A <html> class. See ResourceLoaderClientHtml::getDocumentAttributes().
-               document.documentElement.className = document.documentElement.className
-                       .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
+       // Undo speculative Grade A <html> class. See ResourceLoaderClientHtml::getDocumentAttributes().
+       document.documentElement.className = document.documentElement.className
+               .replace( /(^|\s)client-js(\s|$)/, '$1client-nojs$2' );
 
-               // Process any callbacks for Grade C
-               NORLQ = window.NORLQ;
-               while ( NORLQ && NORLQ[ 0 ] ) {
-                       NORLQ.shift()();
+       // Process any callbacks for Grade C
+       while ( window.NORLQ && window.NORLQ[ 0 ] ) {
+               window.NORLQ.shift()();
+       }
+       window.NORLQ = {
+               push: function ( fn ) {
+                       fn();
                }
-               window.NORLQ = {
-                       push: function ( fn ) {
-                               fn();
-                       }
-               };
+       };
 
-               // Clear and disable the Grade A queue
-               window.RLQ = {
-                       push: function () {}
-               };
+       // Clear and disable the Grade A queue
+       window.RLQ = {
+               push: function () {}
+       };
+} else {
+       // Handle Grade A
 
-               return;
+       if ( window.performance && performance.mark ) {
+               performance.mark( 'mwStartup' );
        }
 
+       // This embeds mediawiki.js, which defines 'mw' and 'mw.loader'.
+       $CODE.defineLoader();
+
        /**
         * The $CODE and $VARS placeholders are substituted in ResourceLoaderStartUpModule.php.
         */
-       function startUp() {
+       ( function () {
+               /* global mw */
                mw.config = new mw.Map( $VARS.wgLegacyJavaScriptGlobals );
 
                $CODE.registrations();
@@ -114,9 +120,10 @@ window.isCompatible = function ( str ) {
                mw.config.set( $VARS.configuration );
 
                // Process callbacks for Grade A
-               // Must be after registrations and mw.config.set, which mw.loader depends on.
                var queue = window.RLQ;
-               // Redefine push(), but keep type as array for storing callbacks that require modules.
+               // Replace RLQ placeholder from ResourceLoaderClientHtml with an implementation
+               // that executes simple callbacks, but continues to store callbacks that require
+               // modules.
                window.RLQ = [];
                /* global RLQ */
                RLQ.push = function ( fn ) {
@@ -128,7 +135,7 @@ window.isCompatible = function ( str ) {
                        }
                };
                while ( queue && queue[ 0 ] ) {
-                       // Re-use our push()
+                       // Re-use our new push() method
                        RLQ.push( queue.shift() );
                }
 
@@ -136,14 +143,5 @@ window.isCompatible = function ( str ) {
                window.NORLQ = {
                        push: function () {}
                };
-       }
-
-       if ( window.performance && performance.mark ) {
-               performance.mark( 'mwStartup' );
-       }
-
-       // This embeds mediawiki.js, which defines 'mw' and 'mw.loader'.
-       $CODE.defineLoader();
-
-       mw.requestIdleCallback( startUp );
-}() );
+       }() );
+}