jenkins-bot has submitted this change and it was merged.

Change subject: Compatibility filters for BetaFeatures
......................................................................


Compatibility filters for BetaFeatures

* JavaScript test
* Browser detection via jQuery.client
* Dependency on other beta features
* Skin detection

Change-Id: Ia4cdc2dbbb29364ecbf55799b85880dd3968de6b
---
M BetaFeatures.i18n.php
M BetaFeatures.php
M BetaFeaturesHooks.php
M css/betafeatures.css
M includes/HTMLFeatureField.php
A js/betafeatures.js
6 files changed, 189 insertions(+), 2 deletions(-)

Approvals:
  MarkTraceur: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/BetaFeatures.i18n.php b/BetaFeatures.i18n.php
index 6a4087a..521ea39 100644
--- a/BetaFeatures.i18n.php
+++ b/BetaFeatures.i18n.php
@@ -31,6 +31,11 @@
        'mw-ui-feature-info'            => 'information',
        'mw-ui-feature-user-count'      => '{{PLURAL:$1|One user has|$1 users 
have}} enabled this feature.',
 
+       'mw-ui-feature-requirements-betafeatures' => 'This feature requires the 
following {{PLURAL:$1|feature|features}} to be enabled:',
+       'mw-ui-feature-requirements-browser' => 'The following 
{{PLURAL:$1|browser|browsers}} are not supported:',
+       'mw-ui-feature-requirements-javascript' => 'This feature requires 
JavaScript.',
+       'mw-ui-feature-requirements-skins' => 'This feature requires you to be 
using {{PLURAL:$1|the following skin|one of the following skins}}:',
+
        'prefs-betafeatures' => 'Beta features',
        'betafeatures-desc' => 'Lets user enable or disable features on the 
wiki that are still not ready for prime-time',
        'betafeatures-toplink' => 'Beta',
@@ -59,6 +64,21 @@
 
 Parameters:
 * $1 - number of users',
+
+       'mw-ui-feature-requirements-betafeatures' => 'Error message shown when 
other features are required and not enabled.
+
+Parameters:
+* $1 - number of features in list',
+       'mw-ui-feature-requirements-browser' => 'Error message shown when the 
browser is not supported.
+
+Parameters:
+* $1 - number of browsers in list',
+       'mw-ui-feature-requirements-javascript' => 'Error message shown when 
the feature requires javascript.',
+       'mw-ui-feature-requirements-skins' => 'Error message shown when the 
skin is not supported.
+
+Parameters:
+* $1 - number of skins in list',
+
        'prefs-betafeatures' => 'Used as section title for beta features in 
[[Special:Preferences]].
 {{Identical|Beta feature}}',
        'betafeatures-desc' => '{{desc|name=Beta 
Features|url=http://www.mediawiki.org/wiki/Extension:BetaFeatures}}',
diff --git a/BetaFeatures.php b/BetaFeatures.php
index 44eaa17..fdeee86 100644
--- a/BetaFeatures.php
+++ b/BetaFeatures.php
@@ -39,6 +39,7 @@
 $wgHooks['UnitTestsList'][] = 'BetaFeaturesHooks::getUnitTestsList';
 $wgHooks['LoadExtensionSchemaUpdates'][] = 
'BetaFeaturesHooks::getSchemaUpdates';
 $wgHooks['BeforePageDisplay'][] = 'BetaFeaturesHooks::loadPopupScript';
+$wgHooks['MakeGlobalVariablesScript'][] = 
'BetaFeaturesHooks::onMakeGlobalVariablesScript';
 
 $wgJobClasses['updateBetaFeaturesUserCounts'] = 
'UpdateBetaFeatureUserCountsJob';
 
@@ -49,12 +50,15 @@
 
 $wgResourceModules['ext.betaFeatures'] = array(
        'scripts' => array(
+               'js/betafeatures.js',
                'js/mediawiki.ui.checkbox.js',
        ),
-
        'styles' => array(
                'css/betafeatures.css',
        ),
+       'dependencies' => array(
+               'jquery.client',
+       ),
 ) + $moduleInfo;
 
 $wgResourceModules['ext.betaFeatures.popup'] = array(
diff --git a/BetaFeaturesHooks.php b/BetaFeaturesHooks.php
index 7d2a740..8406b27 100644
--- a/BetaFeaturesHooks.php
+++ b/BetaFeaturesHooks.php
@@ -29,6 +29,8 @@
        // 30 minutes
        const COUNT_CACHE_TTL = 1800;
 
+       private static $features = array();
+
        /**
         * @param array $prefs
         * @return array|mixed
@@ -141,7 +143,7 @@
         * @return bool
         * @throws BetaFeaturesMissingFieldException
         */
-       static function getPreferences( $user, &$prefs ) {
+       public static function getPreferences( User $user, array &$prefs ) {
                global $wgSitename;
 
                $betaPrefs = array();
@@ -216,6 +218,7 @@
                                'info-link' => true,
                                'discussion-link' => true,
                                'screenshot' => false,
+                               'requirements' => false,
                        );
 
                        foreach ( $requiredFields as $field => $required ) {
@@ -254,11 +257,51 @@
                        }
                }
 
+               foreach ( $betaPrefs as $key => $info ) {
+                       $features = array();
+
+                       if ( isset( $prefs[$key]['requirements'] ) ) {
+
+                               // Check which other beta features are 
required, and fetch their labels
+                               if ( isset( 
$prefs[$key]['requirements']['betafeatures'] ) ) {
+                                       $requiredPrefs = array();
+                                       foreach( 
$prefs[$key]['requirements']['betafeatures'] as $preference ) {
+                                               if ( !$user->getOption( 
$preference ) ) {
+                                                       $requiredPrefs[] = 
$prefs[$preference]['label-message'];
+                                               }
+                                       }
+                                       if ( count( $requiredPrefs ) ) {
+                                               
$prefs[$key]['requirements']['betafeatures-messages'] = $requiredPrefs;
+                                       }
+                               }
+
+                               // If a browser blacklist is supplied, store so 
it can be passed as JSON
+                               if ( isset( 
$prefs[$key]['requirements']['blacklist'] ) ) {
+                                       $features['blacklist'] = 
$prefs[$key]['requirements']['blacklist'];
+                               }
+
+                               // Test skin support
+                               if (
+                                       isset( 
$prefs[$key]['requirements']['skins'] ) &&
+                                       !in_array( 
$user->getSkin()->getSkinName(), $prefs[$key]['requirements']['skins'] )
+                               ) {
+                                       
$prefs[$key]['requirements']['skin-not-supported'] = true;
+                               }
+                       }
+                       self::$features[$key] = !empty( $features ) ? $features 
: null;
+               }
+
                $user->saveSettings();
 
                return true;
        }
 
+       public static function onMakeGlobalVariablesScript( array &$vars ) {
+               $vars['wgBetaFeaturesFeatures'] = self::$features;
+
+               return true;
+       }
+
        /**
         * @param array $personal_urls
         * @param Title $title
diff --git a/css/betafeatures.css b/css/betafeatures.css
index 6ff8061..573683f 100644
--- a/css/betafeatures.css
+++ b/css/betafeatures.css
@@ -144,3 +144,20 @@
 .mw-htmlform-field-HTMLTextBlockField .mw-input {
        padding-bottom: 15px;
 }
+
+.mw-ui-feature-requirements-list {
+       margin-left: 0;
+}
+
+.mw-ui-feature-requirements-list li {
+       color: #c00;
+}
+
+.mw-ui-feature-requirements-list > li {
+       list-style-type: none;
+       list-style-image: none;
+}
+
+.mw-ui-feature-requirements-list .mw-ui-feature-requirements-browser {
+       display: none;
+}
diff --git a/includes/HTMLFeatureField.php b/includes/HTMLFeatureField.php
index e361f18..3068df5 100644
--- a/includes/HTMLFeatureField.php
+++ b/includes/HTMLFeatureField.php
@@ -122,6 +122,89 @@
                                $parent->msg( $this->mParams['desc-message'] 
)->escaped() );
                }
 
+               $html .= Html::openElement( 'ul', array(
+                       'class' => 'mw-ui-feature-requirements-list',
+               ) );
+
+               if ( isset( $this->mParams['requirements'] ) ) {
+                       if (
+                               isset( 
$this->mParams['requirements']['javascript'] ) &&
+                               $this->mParams['requirements']['javascript']
+                       ) {
+                               $html .= Html::rawElement(
+                                       'li',
+                                       array( 'class' => 
'mw-ui-feature-requirements-javascript' ),
+                                       $parent->msg( 
'mw-ui-feature-requirements-javascript' )->escaped()
+                               );
+                       }
+
+                       if ( isset( $this->mParams['requirements']['blacklist'] 
) ) {
+                               $html .= Html::openElement(
+                                       'li',
+                                       array( 'class' => 
'mw-ui-feature-requirements-browser' )
+                               );
+                               $browserCount = count( 
$this->mParams['requirements']['blacklist'] );
+                               $html .= $parent->msg( 
'mw-ui-feature-requirements-browser', $browserCount )->escaped();
+                               $html .= Html::openElement( 'ul' );
+                               foreach( 
$this->mParams['requirements']['blacklist'] as $browser => $versions ) {
+                                       $browserString = $browser;
+                                       if ( $versions ) {
+                                               foreach ( $versions as $version 
) {
+                                                       $browserString .= ' ' . 
implode( ' ', $version );
+                                               }
+                                       }
+                                       $html .= Html::element(
+                                               'li',
+                                               array(),
+                                               $browserString
+                                       );
+                               }
+                               $html .= Html::closeElement( 'ul' );
+                               $html .= Html::closeElement( 'li' );
+                       }
+
+                       if ( isset( 
$this->mParams['requirements']['skin-not-supported'] ) ) {
+                               $html .= Html::openElement(
+                                       'li',
+                                       array( 'class' => 
'mw-ui-feature-requirements-skins' )
+                               );
+                               $skinCount = count( 
$this->mParams['requirements']['skins'] );
+                               $html .= $parent->msg( 
'mw-ui-feature-requirements-skins', $skinCount )->escaped();
+                               $html .= Html::openElement( 'ul' );
+                               foreach( 
$this->mParams['requirements']['skins'] as $skin ) {
+                                       $html .= Html::element(
+                                               'li',
+                                               array(),
+                                               $skin
+                                       );
+                               }
+                               $html .= Html::closeElement( 'ul' );
+                               $html .= Html::closeElement( 'li' );
+                       }
+
+                       if ( isset( 
$this->mParams['requirements']['betafeatures-messages'] ) ) {
+                               $html .= Html::openElement(
+                                       'li',
+                                       array( 'class' => 
'mw-ui-feature-requirements-betafeatures' )
+                               );
+                               $featureCount = count( 
$this->mParams['requirements']['betafeatures-messages'] );
+                               $html .= $parent->msg( 
'mw-ui-feature-requirements-betafeatures', $featureCount )->escaped();
+                               $html .= Html::openElement( 'ul' );
+                               foreach( 
$this->mParams['requirements']['betafeatures-messages'] as $message ) {
+                                       $html .= Html::rawElement(
+                                               'li',
+                                               array(),
+                                               $parent->msg( $message 
)->escaped()
+                                       );
+                               }
+                               $html .= Html::closeElement( 'ul' );
+                               $html .= Html::closeElement( 'li' );
+                       }
+               }
+
+               // mw-ui-feature-requirements-list
+               $html .= Html::closeElement( 'ul' );
+
                // Close -meta
                $html .= Html::closeElement( 'div' );
 
diff --git a/js/betafeatures.js b/js/betafeatures.js
new file mode 100644
index 0000000..c353dbb
--- /dev/null
+++ b/js/betafeatures.js
@@ -0,0 +1,20 @@
+( function ( mw, $ ) {
+       $( function () {
+               var preference, blacklist, $input, $field,
+                       features = mw.config.get( 'wgBetaFeaturesFeatures' );
+
+               for ( preference in features ) {
+                       $input = $( '#mw-input-wp' + preference );
+                       $field = $input.closest( '.mw-ui-feature-field' );
+                       blacklist = features[preference] && 
features[preference].blacklist;
+
+                       // We're here so JavaScript works
+                       $field.find( '.mw-ui-feature-requirements-javascript' 
).hide();
+
+                       if ( blacklist && $.client.test( blacklist, null, true 
) ) {
+                               // Browser not compatible
+                               $field.find( 
'.mw-ui-feature-requirements-browser' ).show();
+                       }
+               }
+       } );
+}( mediaWiki, jQuery ) );

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia4cdc2dbbb29364ecbf55799b85880dd3968de6b
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/BetaFeatures
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Catrope <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Krinkle <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: MarkTraceur <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: jenkins-bot

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

Reply via email to