/*!
* Inline script for ResourceLoader\ClientHtml.php.
*
* This is tested via an exported function that takes `document` and `$VARS`.
* See also QUnitTestResources.php.
*
* Like startup.js, this file is enforced by ESLint to be ES3-syntax compatible and
* must degrade gracefully in older browsers.
*
* Use of ES5 (e.g. forEach) or ES6 methods (not syntax) is safe within the cookie conditional.
*/
/* global $VARS */
( function () {
var className = $VARS.jsClass;
var cookie = document.cookie.match( /(?:^|; )__COOKIE_PREFIX__mwclientpreferences=([^;]+)/ );
if ( cookie ) {
// The comma is escaped by mw.cookie.set
cookie[ 1 ].split( '%2C' ).forEach( function ( pref ) {
// To avoid misuse and to allow emergency shut-off, classes are only set when a matching
// class for the same key already set. For new features, the default class must be set
// a couple of weeks before the feature toggle is deployed, to give time for the
// CDN/HTML cache to roll over.
//
// Regex explanation:
// 1. `\w+`, match the "-value" suffix, this is equivalent to [a-zA-Z0-9_].
// This is stripped from the desired class to create a match for a current class.
// 2. `[^\w-]`, any non-alphanumeric characters. This should never match but is
// stripped to ensure regex safety by keeping it simple (no need to escape).
// 3. Match an existing class name as follows:
// * (^| ) = start of string or space
// * -clientpref- = enforce present of this literal string
// * ( |$) = end of string or space
//
// Replacement examples:
// * vector-feature-foo-clientpref-2 -> vector-feature-foo-clientpref-4
// * mw-foo-clientpref-enabled -> mw-foo-clientpref-disabled
// * mw-display-clientpref-dark -> mw-display-clientpref-light
className = className.replace(
new RegExp( '(^| )' + pref.replace( /-clientpref-\w+$|[^\w-]+/g, '' ) + '-clientpref-\\w+( |$)' ),
'$1' + pref + '$2'
);
} );
}
document.documentElement.className = className;
}() );