/**
* Get a message object.
*
- * Shorcut for `new mw.Message( mw.messages, key, parameters )`.
+ * Shortcut for `new mw.Message( mw.messages, key, parameters )`.
*
* @see mw.Message
* @param {string} key Key of message to get
*/
/**
- * Write a message the console's warning channel.
+ * Write a message to the console's warning channel.
* Actions not supported by the browser console are silently ignored.
*
* @param {...string} msg Messages to output to console
$.noop;
/**
- * Write a message the console's error channel.
+ * Write a message to the console's error channel.
*
* Most browsers provide a stacktrace by default if the argument
* is a caught Error object.
obj[ key ] = val;
} : function ( obj, key, val, msg ) {
msg = 'Use of "' + key + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
- // Support: IE8
- // Can throw on Object.defineProperty.
- try {
- Object.defineProperty( obj, key, {
- configurable: true,
- enumerable: true,
- get: function () {
- mw.track( 'mw.deprecate', key );
- mw.log.warn( msg );
- return val;
- },
- set: function ( newVal ) {
- mw.track( 'mw.deprecate', key );
- mw.log.warn( msg );
- val = newVal;
- }
- } );
- } catch ( err ) {
- // Fallback to creating a copy of the value to the object.
- obj[ key ] = val;
- }
+ Object.defineProperty( obj, key, {
+ configurable: true,
+ enumerable: true,
+ get: function () {
+ mw.track( 'mw.deprecate', key );
+ mw.log.warn( msg );
+ return val;
+ },
+ set: function ( newVal ) {
+ mw.track( 'mw.deprecate', key );
+ mw.log.warn( msg );
+ val = newVal;
+ }
+ } );
+
};
return log;
/**
* A module has entered state 'ready', 'error', or 'missing'. Automatically update
* pending jobs and modules that depend upon this module. If the given module failed,
- * propagate the 'error' state up the dependency tree. Otherwise, go ahead an execute
+ * propagate the 'error' state up the dependency tree. Otherwise, go ahead and execute
* all jobs/modules now having their dependencies satisfied.
*
* Jobs that depend on a failed module, will have their error callback ran (if any).
script( $, $ );
markModuleReady();
} else if ( typeof script === 'string' ) {
- // Site and user modules are a legacy scripts that run in the global scope.
+ // Site and user modules are legacy scripts that run in the global scope.
// This is transported as a string instead of a function to avoid needing
// to use string manipulation to undo the function wrapper.
if ( module === 'user' ) {
}
/**
- * Adds a dependencies to the queue with optional callbacks to be run
+ * Adds all dependencies to the queue with optional callbacks to be run
* when the dependencies are ready or fail
*
* @private
* When #load or #using requests one or more modules, the server
* response contain calls to this function.
*
- * All arguments are required.
- *
* @param {string} module Name of module
- * @param {Function|Array} script Function with module code or Array of URLs to
+ * @param {Function|Array} [script] Function with module code or Array of URLs to
* be used as the src attribute of a new `<script>` tag.
* @param {Object} [style] Should follow one of the following patterns:
*
// Whether the store is in use on this page.
enabled: null,
- // Modules whose string representation exceeds 100 kB (30 kB on FF) are
- // ineligible for storage due to bug T66721. The quota is stricter on
- // Firefox due to <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
- MODULE_SIZE_MAX: ( /Firefox/.test( navigator.userAgent ) ? 30 : 100 ) * 1000,
+ MODULE_SIZE_MAX: 100 * 1000,
// The contents of the store, mapping '[module name]@[version]' keys
// to module implementations.
return;
}
- if ( !mw.config.get( 'wgResourceLoaderStorageEnabled' ) ) {
+ if (
+ // Disabled because localStorage quotas are tight and (in Firefox's case)
+ // shared by multiple origins.
+ // See T66721, and <https://bugzilla.mozilla.org/show_bug.cgi?id=1064466>.
+ /Firefox|Opera/.test( navigator.userAgent ) ||
+
// Disabled by configuration.
+ !mw.config.get( 'wgResourceLoaderStorageEnabled' )
+ ) {
// Clear any previous store to free up space. (T66721)
mw.loader.store.clear();
mw.loader.store.enabled = false;
*/
clear: function () {
mw.loader.store.items = {};
- localStorage.removeItem( mw.loader.store.getStoreKey() );
+ try {
+ localStorage.removeItem( mw.loader.store.getStoreKey() );
+ } catch ( ignored ) {}
},
/**
/**
* Log a message to window.console, if possible.
*
- * Useful to force logging of some errors that are otherwise hard to detect (i.e., this logs
+ * Useful to force logging of some errors that are otherwise hard to detect (i.e., this logs
* also in production mode). Gets console references in each invocation instead of caching the
* reference, so that debugging tools loaded later are supported (e.g. Firebug Lite in IE).
*
msg += ( e ? ':' : '.' );
console.log( msg );
- // If we have an exception object, log it to the error channel to trigger a
- // proper stacktraces in browsers that support it. No fallback as we have no browsers
- // that don't support error(), but do support log().
+ // If we have an exception object, log it to the error channel to trigger
+ // proper stacktraces in browsers that support it. No fallback as we have
+ // no browsers that don't support error(), but do support log().
if ( e && console.error ) {
console.error( String( e ), e );
}