* @class mw.errorLogger
* @singleton
*/
-( function () {
- 'use strict';
+mw.errorLogger = {
+ /**
+ * Fired via mw.track when an error is not handled by local code and is caught by the
+ * window.onerror handler.
+ *
+ * @event global_error
+ * @param {string} errorMessage Error errorMessage.
+ * @param {string} url URL where error was raised.
+ * @param {number} lineNumber Line number where error was raised.
+ * @param {number} [columnNumber] Line number where error was raised. Not all browsers
+ * support this.
+ * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
+ * (even a primitive value) passed to a throw clause will end up here.
+ */
- mw.errorLogger = {
- /**
- * Fired via mw.track when an error is not handled by local code and is caught by the
- * window.onerror handler.
- *
- * @event global_error
- * @param {string} errorMessage Error errorMessage.
- * @param {string} url URL where error was raised.
- * @param {number} lineNumber Line number where error was raised.
- * @param {number} [columnNumber] Line number where error was raised. Not all browsers
- * support this.
- * @param {Error|Mixed} [errorObject] The error object. Typically an instance of Error, but anything
- * (even a primitive value) passed to a throw clause will end up here.
- */
+ /**
+ * Install a window.onerror handler that will report via mw.track, while preserving
+ * any previous handler.
+ *
+ * @param {Object} window
+ */
+ installGlobalHandler: function ( window ) {
+ // We will preserve the return value of the previous handler. window.onerror works the
+ // opposite way than normal event handlers (returning true will prevent the default
+ // action, returning false will let the browser handle the error normally, by e.g.
+ // logging to the console), so our fallback old handler needs to return false.
+ var oldHandler = window.onerror || function () {
+ return false;
+ };
/**
- * Install a window.onerror handler that will report via mw.track, while preserving
- * any previous handler.
+ * Dumb window.onerror handler which forwards the errors via mw.track.
*
- * @param {Object} window
+ * @param {string} errorMessage
+ * @param {string} url
+ * @param {number} lineNumber
+ * @param {number} [columnNumber]
+ * @param {Error|Mixed} [errorObject]
+ * @return {boolean} True to prevent the default action
+ * @fires global_error
*/
- installGlobalHandler: function ( window ) {
- // We will preserve the return value of the previous handler. window.onerror works the
- // opposite way than normal event handlers (returning true will prevent the default
- // action, returning false will let the browser handle the error normally, by e.g.
- // logging to the console), so our fallback old handler needs to return false.
- var oldHandler = window.onerror || function () {
- return false;
- };
-
- /**
- * Dumb window.onerror handler which forwards the errors via mw.track.
- *
- * @param {string} errorMessage
- * @param {string} url
- * @param {number} lineNumber
- * @param {number} [columnNumber]
- * @param {Error|Mixed} [errorObject]
- * @return {boolean} True to prevent the default action
- * @fires global_error
- */
- window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
- mw.track( 'global.error', { errorMessage: errorMessage, url: url,
- lineNumber: lineNumber, columnNumber: columnNumber, errorObject: errorObject } );
- return oldHandler.apply( this, arguments );
- };
- }
- };
+ window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
+ mw.track( 'global.error', {
+ errorMessage: errorMessage,
+ url: url,
+ lineNumber: lineNumber,
+ columnNumber: columnNumber,
+ errorObject: errorObject
+ } );
+ return oldHandler.apply( this, arguments );
+ };
+ }
+};
- mw.errorLogger.installGlobalHandler( window );
-}() );
+mw.errorLogger.installGlobalHandler( window );
/* global mw */
-( function () {
- var maxBusy = 50;
+mw.requestIdleCallbackInternal = function ( callback ) {
+ setTimeout( function () {
+ var start = mw.now();
+ callback( {
+ didTimeout: false,
+ timeRemaining: function () {
+ // Hard a target maximum busy time of 50 milliseconds
+ return Math.max( 0, 50 - ( mw.now() - start ) );
+ }
+ } );
+ }, 1 );
+};
- mw.requestIdleCallbackInternal = function ( callback ) {
- setTimeout( function () {
- var start = mw.now();
- callback( {
- didTimeout: false,
- timeRemaining: function () {
- return Math.max( 0, maxBusy - ( mw.now() - start ) );
- }
- } );
- }, 1 );
- };
-
- /**
- * Schedule a deferred task to run in the background.
- *
- * This allows code to perform tasks in the main thread without impacting
- * time-critical operations such as animations and response to input events.
- *
- * Basic logic is as follows:
- *
- * - User input event should be acknowledged within 100ms per [RAIL].
- * - Idle work should be grouped in blocks of upto 50ms so that enough time
- * remains for the event handler to execute and any rendering to take place.
- * - Whenever a native event happens (e.g. user input), the deadline for any
- * running idle callback drops to 0.
- * - As long as the deadline is non-zero, other callbacks pending may be
- * executed in the same idle period.
- *
- * See also:
- *
- * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
- * - <https://w3c.github.io/requestidlecallback/>
- * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
- * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
- *
- * @member mw
- * @param {Function} callback
- * @param {Object} [options]
- * @param {number} [options.timeout] If set, the callback will be scheduled for
- * immediate execution after this amount of time (in milliseconds) if it didn't run
- * by that time.
- */
- mw.requestIdleCallback = window.requestIdleCallback ?
- // Bind because it throws TypeError if context is not window
- window.requestIdleCallback.bind( window ) :
- mw.requestIdleCallbackInternal;
- // Note: Polyfill was previously disabled due to
- // https://bugs.chromium.org/p/chromium/issues/detail?id=647870
- // See also <http://codepen.io/Krinkle/full/XNGEvv>
-}() );
+/**
+ * Schedule a deferred task to run in the background.
+ *
+ * This allows code to perform tasks in the main thread without impacting
+ * time-critical operations such as animations and response to input events.
+ *
+ * Basic logic is as follows:
+ *
+ * - User input event should be acknowledged within 100ms per [RAIL].
+ * - Idle work should be grouped in blocks of upto 50ms so that enough time
+ * remains for the event handler to execute and any rendering to take place.
+ * - Whenever a native event happens (e.g. user input), the deadline for any
+ * running idle callback drops to 0.
+ * - As long as the deadline is non-zero, other callbacks pending may be
+ * executed in the same idle period.
+ *
+ * See also:
+ *
+ * - <https://developer.mozilla.org/en-US/docs/Web/API/Window/requestIdleCallback>
+ * - <https://w3c.github.io/requestidlecallback/>
+ * - <https://developers.google.com/web/updates/2015/08/using-requestidlecallback>
+ * [RAIL]: https://developers.google.com/web/fundamentals/performance/rail
+ *
+ * @member mw
+ * @param {Function} callback
+ * @param {Object} [options]
+ * @param {number} [options.timeout] If set, the callback will be scheduled for
+ * immediate execution after this amount of time (in milliseconds) if it didn't run
+ * by that time.
+ */
+mw.requestIdleCallback = window.requestIdleCallback ?
+ // Bind because it throws TypeError if context is not window
+ window.requestIdleCallback.bind( window ) :
+ mw.requestIdleCallbackInternal;
+// Note: Polyfill was previously disabled due to
+// https://bugs.chromium.org/p/chromium/issues/detail?id=647870
+// See also <http://codepen.io/Krinkle/full/XNGEvv>