Pmiazga has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/327696 )

Change subject: [WIP] Implement necessary wiring for preferences
......................................................................

[WIP] Implement necessary wiring for preferences

Additionally improve existing code quality

Change-Id: I3cbcdc1303411b28b613afa6dd1a00b410891471
---
M Popups.hooks.php
M extension.json
M includes/Module.php
3 files changed, 95 insertions(+), 52 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Popups 
refs/changes/96/327696/1

diff --git a/Popups.hooks.php b/Popups.hooks.php
index 5972d14..6a2db6e 100644
--- a/Popups.hooks.php
+++ b/Popups.hooks.php
@@ -18,20 +18,17 @@
  * @file
  * @ingroup extensions
  */
-use MediaWiki\Logger\LoggerFactory;
+use Popups\Module;
 
 class PopupsHooks {
-       const PREVIEWS_ENABLED = 'enabled';
-       const PREVIEWS_DISABLED = 'disabled';
-       const PREVIEWS_OPTIN_PREFERENCE_NAME = 'popups-enable';
        const PREVIEWS_PREFERENCES_SECTION = 'rendering/reading';
 
-       static function getPreferences( User $user, array &$prefs ) {
+       static function onGetBetaPreferences( User $user, array &$prefs ) {
                global $wgExtensionAssetsPath;
-               if ( self::getConfig()->get( 'PopupsBetaFeature' ) !== true ) {
+               if ( self::getModule()->getConfig()->get( 'PopupsBetaFeature' ) 
!== true ) {
                        return;
                }
-               $prefs['popups'] = [
+               $prefs[Module::PREVIEWS_OPTIN_BETA_PREFERENCE_NAME] = [
                        'label-message' => 'popups-message',
                        'desc-message' => 'popups-desc',
                        'screenshot' => [
@@ -53,66 +50,52 @@
         * @param array $prefs
         */
        static function onGetPreferences( User $user, array &$prefs ) {
-               $module = new \Popups\Module( self::getConfig() );
+               $module = self::getModule();
 
                if ( !$module->showPreviewsOptInOnPreferencesPage() ) {
                        return;
                }
-               $prefs[self::PREVIEWS_OPTIN_PREFERENCE_NAME] = [
+               $prefs[Module::PREVIEWS_OPTIN_PREFERENCE_NAME] = [
                        'type' => 'radio',
                        'label-message' => 'popups-prefs-optin-title',
                        'options' => [
-                               wfMessage( 'popups-prefs-optin-enabled-label' 
)->text() => self::PREVIEWS_ENABLED,
-                               wfMessage( 'popups-prefs-optin-disabled-label' 
)->text() => self::PREVIEWS_DISABLED
+                               wfMessage( 'popups-prefs-optin-enabled-label' 
)->text() => Module::PREVIEWS_ENABLED,
+                               wfMessage( 'popups-prefs-optin-disabled-label' 
)->text() => Module::PREVIEWS_DISABLED
                        ],
                        'section' => self::PREVIEWS_PREFERENCES_SECTION
                ];
        }
 
        /**
-        * @return Config
+        * @return Module
         */
-       public static function getConfig() {
-               static $config;
-               if ( !$config ) {
-                       $config = 
ConfigFactory::getDefaultInstance()->makeConfig( 'popups' );
+       public static function getModule() {
+               static $module;
+               if ( !$module ) {
+                       $config = \MediaWiki\MediaWikiServices::getInstance()
+                               ->getConfigFactory()->makeConfig( 
Module::EXTENSION_NAME );
+                       $module = new \Popups\Module( $config );
                }
-               return $config;
+               return $module;
+       }
+
+       private static function areDependenciesMet() {
+               $registry = ExtensionRegistry::getInstance();
+               return $registry->isLoaded( 'TextExtracts' ) && class_exists( 
'ApiQueryPageImages' );
        }
 
        public static function onBeforePageDisplay( OutputPage &$out, Skin 
&$skin ) {
-               // Enable only if the user has turned it on in Beta 
Preferences, or BetaFeatures is not installed.
-               // Will only be loaded if PageImages & TextExtracts extensions 
are installed.
+               $module = self::getModule();
 
-               $registry = ExtensionRegistry::getInstance();
-               if ( !$registry->isLoaded( 'TextExtracts' ) || !class_exists( 
'ApiQueryPageImages' ) ) {
-                       $logger = LoggerFactory::getInstance( 'popups' );
+               if ( !self::areDependenciesMet() ) {
+                       $logger = $module->getLogger();
                        $logger->error( 'Popups requires the PageImages and 
TextExtracts extensions.' );
                        return true;
                }
 
-               $config = self::getConfig();
-               $isExperimentEnabled = $config->get( 'PopupsExperiment' );
-
-               if (
-                       // If Popups are enabled as an experiment, then bypass 
checking whether the user has enabled
-                       // it as a beta feature.
-                       !$isExperimentEnabled &&
-                       $config->get( 'PopupsBetaFeature' ) === true
-               ) {
-                       if ( !class_exists( 'BetaFeatures' ) ) {
-                               $logger = LoggerFactory::getInstance( 'popups' 
);
-                               $logger->error( 'PopupsMode cannot be used as a 
beta feature unless ' .
-                                                               'the 
BetaFeatures extension is present.' );
-                               return true;
-                       }
-                       if ( !BetaFeatures::isFeatureEnabled( $skin->getUser(), 
'popups' ) ) {
-                               return true;
-                       }
+               if ( $module->isExperimentEnabled() || 
$module->isEnabledByUser( $skin->getUser() ) ) {
+                       $out->addModules( [ 'ext.popups' ] );
                }
-
-               $out->addModules( [ 'ext.popups' ] );
-
                return true;
        }
 
@@ -158,10 +141,11 @@
         * @param array $vars
         */
        public static function onResourceLoaderGetConfigVars( array &$vars ) {
-               $conf = self::getConfig();
+               $module = self::getModule();
+               $conf = $module->getConfig();
                $vars['wgPopupsSchemaPopupsSamplingRate'] = $conf->get( 
'SchemaPopupsSamplingRate' );
 
-               if ( $conf->get( 'PopupsExperiment' ) ) {
+               if ( $module->isExperimentEnabled() ) {
                        $vars['wgPopupsExperiment'] = true;
                        $vars['wgPopupsExperimentConfig'] = $conf->get( 
'PopupsExperimentConfig' );
                }
@@ -176,12 +160,12 @@
         * @param OutputPage $out
         */
        public static function onMakeGlobalVariablesScript( array &$vars, 
OutputPage $out ) {
-               $config = self::getConfig();
+               $module = self::getModule();
                $user = $out->getUser();
 
-               if ( $config->get( 'PopupsExperiment' ) ) {
-                       $vars['wgPopupsExperimentIsBetaFeatureEnabled'] =
-                               class_exists( 'BetaFeatures' ) && 
BetaFeatures::isFeatureEnabled( $user, 'popups' );
+               if ( $module->isExperimentEnabled() ) {
+                       $vars['wgPopupsExperimentIsBetaFeatureEnabled'] = 
class_exists( 'BetaFeatures' )
+                               && BetaFeatures::isFeatureEnabled( $user,  
Module::PREVIEWS_BETA_PREFERENCE_NAME );
                }
        }
 
@@ -198,7 +182,7 @@
                 * or when ConfigRegistry gets populated before calling 
`callback` ExtensionRegistry hook
                 */
                $config = 
\MediaWiki\MediaWikiServices::getInstance()->getMainConfig();
-               $wgDefaultUserOptions[ self::PREVIEWS_OPTIN_PREFERENCE_NAME ] =
+               $wgDefaultUserOptions[ Module::PREVIEWS_OPTIN_PREFERENCE_NAME ] 
=
                        $config->get( 'PopupsOptInDefaultState' );
        }
 }
diff --git a/extension.json b/extension.json
index 638a4bb..2b38d0c 100644
--- a/extension.json
+++ b/extension.json
@@ -17,7 +17,7 @@
        },
        "Hooks": {
                "GetBetaFeaturePreferences": [
-                       "PopupsHooks::getPreferences"
+                       "PopupsHooks::onGetBetaPreferences"
                ],
                "BeforePageDisplay": [
                        "PopupsHooks::onBeforePageDisplay"
@@ -51,7 +51,7 @@
                "SchemaPopupsSamplingRate": 0,
                "PopupsExperiment": false,
                "@PopupsHideOptInOnPreferencesPage": "@var bool: Whether the 
option to enable/disable Page Previews should be hidden on Preferences page. 
Please note if PopupsBetaFeature is set to true this option will be always 
hidden. False by default",
-               "PopupsHideOptInOnPreferencesPage": true,
+               "PopupsHideOptInOnPreferencesPage": false,
                "@PopupsOptInDefaultState" : "@var string:[enabled|disabled] 
Default Page Previews visibility",
                "PopupsOptInDefaultState" : "disabled"
        },
diff --git a/includes/Module.php b/includes/Module.php
index 448aa1d..6bd6ec7 100644
--- a/includes/Module.php
+++ b/includes/Module.php
@@ -4,12 +4,30 @@
  */
 namespace Popups;
 
+use MediaWiki\Logger\LoggerFactory;
+
 /**
  * Popups Module
  *
  * @package Popups
  */
 final class Module {
+
+       /**
+        * Extension name
+        * @var string
+        */
+       const EXTENSION_NAME = 'popups';
+       /**
+        * Logger channel (name)
+        * @var string
+        */
+       const LOGGER_CHANNEL = 'popups';
+       const PREVIEWS_ENABLED = 'enabled';
+       const PREVIEWS_DISABLED = 'disabled';
+       const PREVIEWS_OPTIN_PREFERENCE_NAME = 'popups-enable';
+       const PREVIEWS_BETA_PREFERENCE_NAME = 'poups';
+
        /**
         * @var \Config
         */
@@ -32,4 +50,45 @@
                return $this->config->get( 'PopupsBetaFeature' ) === false
                        && $this->config->get( 
'PopupsHideOptInOnPreferencesPage' ) === false;
        }
+
+       /**
+        * @return bool
+        */
+       public function isExperimentEnabled() {
+               return $this->config->get( 'PopupsExperiment' );
+       }
+       /**
+        * @param \User $user
+        * @return bool
+        */
+       public function isEnabledByUser( \User $user ) {
+               if ( $this->config->get( 'PopupsBetaFeature' ) ) {
+                       if ( !class_exists( 'BetaFeatures' ) ) {
+                               $this->getLogger()->error( 'PopupsMode cannot 
be used as a beta feature unless ' .
+                                       'the BetaFeatures extension is 
present.' );
+                               return false;
+                       }
+                       return \BetaFeatures::isFeatureEnabled( $user, 
self::PREVIEWS_BETA_PREFERENCE_NAME );
+               };
+
+               return $user->getOption( self::PREVIEWS_OPTIN_PREFERENCE_NAME ) 
== self::PREVIEWS_ENABLED;
+       }
+
+       /**
+        * Get module logger
+        *
+        * @return \Psr\Log\LoggerInterface
+        */
+       public function getLogger() {
+               return LoggerFactory::getInstance( self::LOGGER_CHANNEL );
+       }
+
+       /**
+        * Get Module config
+        *
+        * @return \Config
+        */
+       public function getConfig() {
+               return $this->config;
+       }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/327696
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3cbcdc1303411b28b613afa6dd1a00b410891471
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Popups
Gerrit-Branch: mpga
Gerrit-Owner: Pmiazga <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to