$sitedir = MediaWikiServices::getInstance()->getContentLanguage()->getDir();
$pieces = [];
- $pieces[] = Html::htmlHeader( Sanitizer::mergeAttributes(
+ $htmlAttribs = Sanitizer::mergeAttributes(
$this->getRlClient()->getDocumentAttributes(),
$sk->getHtmlElementAttributes()
- ) );
+ );
+ $pieces[] = Html::htmlHeader( $htmlAttribs );
$pieces[] = Html::openElement( 'head' );
if ( $this->getHTMLTitle() == '' ) {
}
$pieces[] = Html::element( 'title', null, $this->getHTMLTitle() );
- $pieces[] = $this->getRlClient()->getHeadHtml();
+ $pieces[] = $this->getRlClient()->getHeadHtml( $htmlAttribs['class'] ?? null );
$pieces[] = $this->buildExemptModules();
$pieces = array_merge( $pieces, array_values( $this->getHeadLinksArray() ) );
$pieces = array_merge( $pieces, array_values( $this->mHeadItems ) );
* - Inline scripts can't be asynchronous.
* - For styles, earlier is better.
*
+ * @param string|null $nojsClass Class name that caller uses on HTML document element
* @return string|WrappedStringList HTML
*/
- public function getHeadHtml() {
+ public function getHeadHtml( $nojsClass = null ) {
$nonce = $this->options['nonce'];
$data = $this->getData();
$chunks = [];
// Change "client-nojs" class to client-js. This allows easy toggling of UI components.
// This must happen synchronously on every page view to avoid flashes of wrong content.
- // See also #getDocumentAttributes() and /resources/src/startup.js.
- $script = <<<'JAVASCRIPT'
-document.documentElement.className = document.documentElement.className
- .replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );
+ // See also startup/startup.js.
+ $nojsClass = $nojsClass ?? $this->getDocumentAttributes()['class'];
+ $jsClass = preg_replace( '/(^|\s)client-nojs(\s|$)/', '$1client-js$2', $nojsClass );
+ $jsClassJson = ResourceLoader::encodeJsonForScript( $jsClass );
+ $script = <<<JAVASCRIPT
+document.documentElement.className = {$jsClassJson};
JAVASCRIPT;
// Inline script: Declare mw.config variables for this page.
// phpcs:disable Generic.Files.LineLength
$expected = '<script>'
- . 'document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");'
+ . 'document.documentElement.className="client-js";'
. 'RLCONF={"key":"value"};'
. 'RLSTATE={"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready"};'
. 'RLPAGEMODULES=["test"];'
);
// phpcs:disable Generic.Files.LineLength
- $expected = '<script>document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");</script>' . "\n"
+ $expected = '<script>document.documentElement.className="client-js";</script>' . "\n"
. '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&raw=1&target=example"></script>';
// phpcs:enable
);
// phpcs:disable Generic.Files.LineLength
- $expected = '<script>document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");</script>' . "\n"
+ $expected = '<script>document.documentElement.className="client-js";</script>' . "\n"
. '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&raw=1&safemode=1"></script>';
// phpcs:enable
);
// phpcs:disable Generic.Files.LineLength
- $expected = '<script>document.documentElement.className=document.documentElement.className.replace(/(^|\s)client-nojs(\s|$)/,"$1client-js$2");</script>' . "\n"
+ $expected = '<script>document.documentElement.className="client-js";</script>' . "\n"
. '<script async="" src="/w/load.php?lang=nl&modules=startup&only=scripts&raw=1"></script>';
// phpcs:enable