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