From c8642b2fbebfef9ae398aa792be9228e6adef6ae Mon Sep 17 00:00:00 2001 From: jdlrobson Date: Tue, 1 Sep 2020 12:31:15 -0700 Subject: [PATCH] Use feature management for search in header This will allow us to add the A/B testing requirement for logged in users. In preparation for the new A/B test requirement, a custom requirement is added as the feature management system does not support OR operations and the desired effect is the case where: * the SearchInHeader feature flag has been enabled * OR the SearchInHeaderABTest feature flag has been enabled and the user is bucketed Bug: T259250 Change-Id: If948603bd598e1b5597345f4268736417f4c3a24 --- includes/Constants.php | 10 +++ .../SearchInHeaderRequirement.php | 70 +++++++++++++++++++ includes/Hooks.php | 4 +- includes/ServiceWiring.php | 18 +++++ includes/SkinVector.php | 5 +- 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 includes/FeatureManagement/Requirements/SearchInHeaderRequirement.php diff --git a/includes/Constants.php b/includes/Constants.php index a394fda..b8a37a6 100644 --- a/includes/Constants.php +++ b/includes/Constants.php @@ -79,6 +79,11 @@ final class Constants { */ public const CONFIG_SEARCH_IN_HEADER = 'VectorIsSearchInHeader'; + /** + * @var string + */ + public const REQUIREMENT_SEARCH_IN_HEADER = 'VectorIsSearchInHeaderIsEnabled'; + /** * @var string */ @@ -111,6 +116,11 @@ final class Constants { */ public const FEATURE_LATEST_SKIN = 'LatestSkin'; + /** + * @var string + */ + public const FEATURE_SEARCH_IN_HEADER = 'TemporarySearchInHeader'; + /** * @var string */ diff --git a/includes/FeatureManagement/Requirements/SearchInHeaderRequirement.php b/includes/FeatureManagement/Requirements/SearchInHeaderRequirement.php new file mode 100644 index 0000000..71cfb7c --- /dev/null +++ b/includes/FeatureManagement/Requirements/SearchInHeaderRequirement.php @@ -0,0 +1,70 @@ +config = $config; + } + + /** + * @inheritDoc + */ + public function getName() : string { + return Constants::REQUIREMENT_SEARCH_IN_HEADER; + } + + /** + * @inheritDoc + * @throws \ConfigException + */ + public function isMet() : bool { + return (bool)$this->config->get( Constants::CONFIG_SEARCH_IN_HEADER ); + } +} diff --git a/includes/Hooks.php b/includes/Hooks.php index b4cc915..b078c3c 100644 --- a/includes/Hooks.php +++ b/includes/Hooks.php @@ -274,7 +274,9 @@ class Hooks { // // See https://codesearch.wmcloud.org/deployed/?q=skin-vector-search- for an up-to-date // list. - if ( self::getConfig( Constants::CONFIG_SEARCH_IN_HEADER ) ) { + + $featureManager = VectorServices::getFeatureManager(); + if ( $featureManager->isFeatureEnabled( Constants::FEATURE_SEARCH_IN_HEADER ) ) { $bodyAttrs['class'] .= ' skin-vector-search-header'; } else { $bodyAttrs['class'] .= ' skin-vector-search-header-legacy'; diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index cddcf54..3fcc0ad 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -27,6 +27,7 @@ use Vector\Constants; use Vector\FeatureManagement\FeatureManager; use Vector\FeatureManagement\Requirements\DynamicConfigRequirement; use Vector\FeatureManagement\Requirements\LatestSkinVersionRequirement; +use Vector\FeatureManagement\Requirements\SearchInHeaderRequirement; use Vector\SkinVersionLookup; return [ @@ -66,6 +67,23 @@ return [ ] ); + // Feature (temporary): search in header + // ======================================== + $featureManager->registerRequirement( + new SearchInHeaderRequirement( + $services->getMainConfig() + ) + ); + + $featureManager->registerFeature( + Constants::FEATURE_SEARCH_IN_HEADER, + // Requirements + [ + Constants::REQUIREMENT_FULLY_INITIALISED, + Constants::REQUIREMENT_SEARCH_IN_HEADER + ] + ); + return $featureManager; } ]; diff --git a/includes/SkinVector.php b/includes/SkinVector.php index 8d5e5cd..2ea8867 100644 --- a/includes/SkinVector.php +++ b/includes/SkinVector.php @@ -24,6 +24,7 @@ use MediaWiki\MediaWikiServices; use Vector\Constants; +use Vector\VectorServices; /** * Skin subclass for Vector @@ -99,6 +100,8 @@ class SkinVector extends SkinMustache { $out = $skin->getOutput(); $title = $out->getTitle(); + $featureManager = VectorServices::getFeatureManager(); + // Naming conventions for Mustache parameters. // // Value type (first segment): @@ -130,7 +133,7 @@ class SkinVector extends SkinMustache { 'html-categories' => $skin->getCategories(), 'data-footer' => $this->getFooterData(), - 'is-search-in-header' => $this->getConfig()->get( Constants::CONFIG_SEARCH_IN_HEADER ), + 'is-search-in-header' => $featureManager->isFeatureEnabled( Constants::FEATURE_SEARCH_IN_HEADER ), // Header 'data-logos' => ResourceLoaderSkinModule::getAvailableLogos( $this->getConfig() ),