() */ use MediaWiki\MediaWikiServices; class MinervaHooks { /** * ResourceLoaderGetLessVars hook handler * * Add the context-based less variables. * * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderGetLessVars * @param array &$lessVars Variables already added */ public static function onResourceLoaderGetLessVars( &$lessVars ) { $config = MediaWikiServices::getInstance()->getConfigFactory() ->makeConfig( 'minerva' ); $lessVars['wgMinervaApplyKnownTemplateHacks'] = $config->get( 'MinervaApplyKnownTemplateHacks' ); } /** * Register mobile web beta features * @see https://www.mediawiki.org/wiki/ * Extension:MobileFrontend/MobileFrontendFeaturesRegistration * * @param MobileFrontend\Features\FeaturesManager $featureManager * @return bool */ public static function onMobileFrontendFeaturesRegistration( $featureManager ) { $config = MediaWikiServices::getInstance()->getConfigFactory() ->makeConfig( 'minerva' ); try { $featureManager->registerFeature( new MobileFrontend\Features\Feature( 'MinervaShowCategoriesButton', 'skin-minerva', $config->get( 'MinervaShowCategoriesButton' ) ) ); $featureManager->registerFeature( new MobileFrontend\Features\Feature( 'MinervaEnableBackToTop', 'skin-minerva', $config->get( 'MinervaEnableBackToTop' ) ) ); } catch ( RuntimeException $e ) { // features already registered... // due to a bug it's possible for this to run twice // https://phabricator.wikimedia.org/T165068 } } /** * Skin registration callback. */ public static function onRegistration() { // Set LESS importpath global $wgResourceLoaderLESSImportPaths; $wgResourceLoaderLESSImportPaths[] = dirname( __DIR__ ) . "/minerva.less/"; } /** * ResourceLoaderTestModules hook handler * @see https://www.mediawiki.org/wiki/Manual:Hooks/ResourceLoaderTestModules * * @param array &$testModules * @param ResourceLoader &$resourceLoader * @return bool */ public static function onResourceLoaderTestModules( array &$testModules, ResourceLoader &$resourceLoader ) { $testModule = [ 'dependencies' => [ 'mobile.startup', 'skins.minerva.notifications.badge' ], 'localBasePath' => dirname( __DIR__ ), 'remoteSkinPath' => 'MinervaNeue', 'targets' => [ 'mobile', 'desktop' ], 'scripts' => [ // additional scaffolding (minus initialisation scripts) 'resources/skins.minerva.scripts/DownloadIcon.js', // test files 'tests/qunit/skins.minerva.scripts/test_DownloadIcon.js', 'tests/qunit/skins.minerva.notifications.badge/test_NotificationBadge.js' ], ]; // Expose templates module $testModules['qunit']["tests.skins.minerva"] = $testModule; } /** * Invocation of hook SpecialPageBeforeExecute * * We use this hook to ensure that login/account creation pages * are redirected to HTTPS if they are not accessed via HTTPS and * $wgSecureLogin == true - but only when using the * mobile site. * * @param SpecialPage $special * @param string $subpage * @return bool */ public static function onSpecialPageBeforeExecute( SpecialPage $special, $subpage ) { $name = $special->getName(); $out = $special->getOutput(); $skin = $out->getSkin(); $request = $special->getRequest(); // Ensure desktop version of Special:Preferences page gets mobile targeted modules // FIXME: Upstream to core (?) if ( $skin instanceof SkinMinerva ) { switch ( $name ) { case 'MobileMenu': $out->addModuleStyles( [ 'skins.minerva.mainMenu.icons', 'skins.minerva.mainMenu.styles', ] ); $out->addModules( [ 'skins.minerva.mainMenu' ] ); break; case 'Preferences': $out->addModules( 'skins.minerva.special.preferences.scripts' ); break; case 'Userlogin': case 'CreateAccount': // FIXME: Note mobile.ajax.styles should not be necessary here. // It's used by the Captcha extension (see T162196) $out->addModuleStyles( [ 'mobile.ajax.styles' ] ); // Add default warning message to Special:UserLogin and Special:UserCreate // if no warning message set. if ( !$request->getVal( 'warning', null ) && !$special->getUser()->isLoggedIn() && !$request->wasPosted() ) { $request->setVal( 'warning', 'mobile-frontend-generic-login-new' ); } break; } } } /** * BeforePageDisplayMobile hook handler. * * @param MobileContext $mobileContext * @param Skin $skin */ public static function onRequestContextCreateSkinMobile( MobileContext $mobileContext, Skin $skin ) { // setSkinOptions is not available if ( $skin instanceof SkinMinerva ) { $featureManager = \MediaWiki\MediaWikiServices::getInstance() ->getService( 'MobileFrontend.FeaturesManager' ); $isBeta = $mobileContext->isBetaGroupMember(); $skin->setSkinOptions( [ SkinMinerva::OPTIONS_MOBILE_BETA => $isBeta, SkinMinerva::OPTION_CATEGORIES => $featureManager->isFeatureAvailableInContext( 'MinervaShowCategoriesButton', $mobileContext ), SkinMinerva::OPTION_BACK_TO_TOP => $featureManager->isFeatureAvailableInContext( 'MinervaEnableBackToTop', $mobileContext ), SkinMinerva::OPTION_TOGGLING => true, SkinMinerva::OPTION_MOBILE_OPTIONS => true, ] ); } } }