. * * @file * @ingroup extensions */ namespace Popups; use MediaWiki\MediaWikiServices; use User; use OutputPage; use Skin; /** * Hooks definitions for Popups extension * * @package Popups */ class PopupsHooks { private const PREVIEWS_PREFERENCES_SECTION = 'rendering/reading'; /** * Add Page Previews options to user Preferences page * * @param User $user User whose preferences are being modified * @param array[] &$prefs Preferences description array, to be fed to a HTMLForm object */ public static function onGetPreferences( User $user, array &$prefs ) { /** @var PopupsContext $context */ $context = MediaWikiServices::getInstance()->getService( 'Popups.Context' ); if ( !$context->showPreviewsOptInOnPreferencesPage() ) { return; } $option = [ 'type' => 'radio', 'label-message' => 'popups-prefs-optin-title', 'help-message' => 'popups-prefs-conflicting-gadgets-info', 'options' => [ wfMessage( 'popups-prefs-optin-enabled-label' )->escaped() => PopupsContext::PREVIEWS_ENABLED, wfMessage( 'popups-prefs-optin-disabled-label' )->escaped() => PopupsContext::PREVIEWS_DISABLED ], 'section' => self::PREVIEWS_PREFERENCES_SECTION ]; if ( $context->conflictsWithNavPopupsGadget( $user ) ) { $option[ 'disabled' ] = true; $option[ 'help-message' ] = [ 'popups-prefs-disable-nav-gadgets-info', 'Special:Preferences#mw-prefsection-gadgets' ]; } $skinPosition = array_search( 'skin', array_keys( $prefs ) ); $readingOptions = [ PopupsContext::PREVIEWS_OPTIN_PREFERENCE_NAME => $option, ]; $config = MediaWikiServices::getInstance()->getService( 'Popups.Config' ); if ( $config->get( 'PopupsReferencePreviews' ) && !$config->get( 'PopupsReferencePreviewsBetaFeature' ) ) { $readingOptions[PopupsContext::REFERENCE_PREVIEWS_PREFERENCE_NAME] = [ 'type' => 'toggle', 'label-message' => 'popups-refpreview-user-preference-label', 'section' => self::PREVIEWS_PREFERENCES_SECTION, 'disabled' => $option['disabled'] ?? false, ]; }; if ( $skinPosition !== false ) { $injectIntoIndex = $skinPosition + 1; $prefs = array_slice( $prefs, 0, $injectIntoIndex, true ) + $readingOptions + array_slice( $prefs, $injectIntoIndex, null, true ); } else { $prefs += $readingOptions; } } /** * Allows last minute changes to the output page, e.g. adding of CSS or JavaScript by extensions. * * @param OutputPage $out The Output page object * @param Skin $skin Skin object that will be used to generate the page */ public static function onBeforePageDisplay( OutputPage $out, Skin $skin ) { /** @var PopupsContext $context */ $context = MediaWikiServices::getInstance()->getService( 'Popups.Context' ); if ( $context->isTitleBlacklisted( $out->getTitle() ) ) { return; } if ( !$context->areDependenciesMet() ) { $logger = $context->getLogger(); $logger->error( 'Popups requires the PageImages extensions. TextExtracts extension is required when using mwApiPlain gateway.' ); return; } $user = $out->getUser(); if ( $context->shouldSendModuleToUser( $user ) ) { $out->addModules( [ 'ext.popups' ] ); } } /** * Hook handler for the ResourceLoaderStartUpModule that makes static configuration visible to * the frontend. These variables end in the only "startup" ResourceLoader module that is loaded * before all others. * * Dynamic configuration that depends on the context needs to be published via the * MakeGlobalVariablesScript hook. * * @param array &$vars Array of variables to be added into the output of the startup module * @param string $skin */ public static function onResourceLoaderGetConfigVars( array &$vars, $skin ) { /** @var \Config $config */ $config = MediaWikiServices::getInstance()->getService( 'Popups.Config' ); $vars['wgPopupsVirtualPageViews'] = $config->get( 'PopupsVirtualPageViews' ); $vars['wgPopupsGateway'] = $config->get( 'PopupsGateway' ); $vars['wgPopupsEventLogging'] = $config->get( 'PopupsEventLogging' ); $vars['wgPopupsRestGatewayEndpoint'] = $config->get( 'PopupsRestGatewayEndpoint' ); $vars['wgPopupsStatsvSamplingRate'] = $config->get( 'PopupsStatsvSamplingRate' ); } /** * Hook handler publishing dynamic configuration that depends on the context, e.g. the page or * the users settings. These variables end in an inline