responsiveMode ) { $out = $this->getOutput(); $out->addMeta( 'viewport', 'width=device-width, initial-scale=1' ); $out->addModuleStyles( 'skins.vector.styles.responsive' ); $this->responsiveMode = true; } } /** * Initializes output page and sets up skin-specific parameters * @param OutputPage $out Object to initialize */ public function initPage( OutputPage $out ) { parent::initPage( $out ); if ( $this->getConfig()->get( 'VectorResponsive' ) ) { $this->enableResponsiveMode(); } } /** * Called by OutputPage::headElement when it is creating the * `` tag. Overrides method in Skin class. * @param OutputPage $out * @param array &$bodyAttrs */ public function addToBodyAttributes( $out, &$bodyAttrs ) { if ( $this->isLegacy() ) { $bodyAttrs['class'] .= ' skin-vector-legacy'; } } /** * @inheritDoc * @return array */ public function getDefaultModules() { $modules = parent::getDefaultModules(); if ( $this->isLegacy() ) { $modules['styles']['skin'][] = 'skins.vector.styles.legacy'; $modules[Constants::SKIN_NAME] = 'skins.vector.legacy.js'; } else { $modules['styles'] = array_merge( $modules['styles'], [ 'skins.vector.styles', 'mediawiki.ui.icon', 'skins.vector.icons' ] ); $modules[Constants::SKIN_NAME][] = 'skins.vector.js'; } return $modules; } /** * Set up the VectorTemplate. Overrides the default behaviour of SkinTemplate allowing * the safe calling of constructor with additional arguments. If dropping this method * please ensure that VectorTemplate constructor arguments match those in SkinTemplate. * * @internal * @param string $classname * @return VectorTemplate */ protected function setupTemplate( $classname ) { $tp = new TemplateParser( __DIR__ . '/templates' ); return new VectorTemplate( $this->getConfig(), $tp, $this->isLegacy() ); } /** * Whether the logo should be preloaded with an HTTP link header or not * @since 1.29 * @return bool */ public function shouldPreloadLogo() { return true; } /** * Whether or not the legacy version of the skin is being used. * * @return bool */ private function isLegacy() : bool { $isLatestSkinFeatureEnabled = MediaWikiServices::getInstance() ->getService( Constants::SERVICE_FEATURE_MANAGER ) ->isFeatureEnabled( Constants::FEATURE_LATEST_SKIN ); return !$isLatestSkinFeatureEnabled; } /** * @internal only for use inside VectorTemplate * @return array of data for a Mustache template */ public function getTemplateData() { $out = $this->getOutput(); $title = $out->getTitle(); return [ // HTML strings: 'html-printtail' => WrappedString::join( "\n", [ MWDebug::getDebugHTML( $this->getContext() ), $this->bottomScripts(), wfReportTime( $out->getCSP()->getNonce() ) ] ) . '', 'html-sitenotice' => $this->getSiteNotice(), 'html-userlangattributes' => $this->prepareUserLanguageAttributes(), 'html-subtitle' => $this->prepareSubtitle(), // Always returns string, cast to null if empty. 'html-undelete' => $this->prepareUndeleteLink() ?: null, // Result of OutputPage::addHTML calls 'html-bodycontent' => $this->wrapHTML( $title, $out->mBodytext ), 'html-dataAfterContent' => $this->afterContentHook(), // From MWDebug::getHTMLDebugLog (when $wgShowDebug is enabled) 'html-debuglog' => $this->generateDebugHTML(), ]; } /** * @internal only for use inside VectorTemplate * @return array */ public function getMenuProps() { return $this->buildContentNavigationUrls(); } }