Legoktm has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/122086

Change subject: isFeatureEnabled: Check current Skin compatability
......................................................................

isFeatureEnabled: Check current Skin compatability

Certain features depend on a certain skin, but that wasn't being
taken into consideration. This makes checking whether a certain
feature is enabled context-dependent.

BetaFeaturesHooks::getBetaFeaturesFeaturesConfig is introduced as
a simple caching caching layer for the GetBetaFeaturePreferences
hook, since we might need to access the config multiple times in a
single request.

Bug: 62897
Change-Id: I46f3beed142dfc3af75b4165aa7cf97284ba62a9
---
M BetaFeaturesHooks.php
M includes/ApiListBetaFeatures.php
M includes/BetaFeaturesUtil.php
3 files changed, 26 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/BetaFeatures 
refs/changes/86/122086/1

diff --git a/BetaFeaturesHooks.php b/BetaFeaturesHooks.php
index 0030b22..eca2f8b 100644
--- a/BetaFeaturesHooks.php
+++ b/BetaFeaturesHooks.php
@@ -113,8 +113,7 @@
 
                // Let's find out what's changed
                $oldUser = User::newFromName( $user->getName() );
-               $betaFeatures = array();
-               wfRunHooks( 'GetBetaFeaturePreferences', array( $user, 
&$betaFeatures ) );
+               $betaFeatures = self::getBetaFeaturesFeaturesConfig( $user );
 
                foreach ( $betaFeatures as $name => $option ) {
                        $newVal = $user->getOption( $name );
@@ -139,6 +138,17 @@
                return true;
        }
 
+       public static function getBetaFeaturesFeaturesConfig( User $user ) {
+               static $storage = array();
+               if ( !isset( $storage[$user->getId()] ) ) {
+                       $prefs = array();
+                       wfRunHooks( 'GetBetaFeaturePreferences', array( $user, 
&$prefs ) );
+                       $storage[$user->getId()] = $prefs;
+               }
+
+               return $storage[$user->getId()];
+       }
+
        /**
         * @param User $user
         * @param array $prefs
@@ -148,10 +158,8 @@
        public static function getPreferences( User $user, array &$prefs ) {
                global $wgBetaFeaturesWhitelist;
 
-               $betaPrefs = array();
+               $betaPrefs = self::getBetaFeaturesFeaturesConfig( $user );
                $depHooks = array();
-
-               wfRunHooks( 'GetBetaFeaturePreferences', array( $user, 
&$betaPrefs ) );
 
                $prefs['betafeatures-popup-disable'] = array(
                        'type' => 'api',
diff --git a/includes/ApiListBetaFeatures.php b/includes/ApiListBetaFeatures.php
index 5ef1c67..c8cf2a4 100644
--- a/includes/ApiListBetaFeatures.php
+++ b/includes/ApiListBetaFeatures.php
@@ -31,9 +31,8 @@
                wfProfileIn( __METHOD__ );
                $params = $this->extractRequestParams();
 
-               $prefs = array();
                $user = User::newFromName( 'MediaWiki default' );
-               wfRunHooks( 'GetBetaFeaturePreferences', array( $user, &$prefs 
) );
+               $prefs = BetaFeaturesHooks::getBetaFeaturesFeaturesConfig( 
$user );
 
                $counts = isset( $params['counts'] )
                        ? BetaFeaturesHooks::getUserCounts( array_keys( $prefs 
) )
diff --git a/includes/BetaFeaturesUtil.php b/includes/BetaFeaturesUtil.php
index 731ed56..dd63f05 100644
--- a/includes/BetaFeaturesUtil.php
+++ b/includes/BetaFeaturesUtil.php
@@ -30,9 +30,20 @@
         *
         * @param User $user The user to check
         * @param string $feature The key passed back to BetaFeatures from the 
GetBetaFeaturePreferences hook
+        * @param IContextSource $ctx
         * @return bool
         */
-       static function isFeatureEnabled( $user, $feature ) {
+       static function isFeatureEnabled( $user, $feature, $ctx = null ) {
+               $ctx = $ctx ?: RequestContext::getMain();
+               $prefs = BetaFeaturesHooks::getBetaFeaturesFeaturesConfig( 
$user );
+               // Bug 62897: If the feature depends on a skin, make sure that 
skin is being used
+               if ( isset( $prefs[$feature] ) && isset( 
$prefs[$feature]['requirements'] )
+                       && isset( $prefs[$feature]['requirements']['skins'] )
+               ) {
+                       if ( !in_array( $ctx->getSkin()->getSkinName(), 
$prefs[$feature]['requirements']['skins'] ) ) {
+                               return false;
+                       }
+               }
                return $user->getOption( $feature ) === 
HTMLFeatureField::OPTION_ENABLED;
        }
 }

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I46f3beed142dfc3af75b4165aa7cf97284ba62a9
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/BetaFeatures
Gerrit-Branch: master
Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to