summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>2021-12-13 17:23:20 +0000
committerGerrit Code Review <gerrit@wikimedia.org>2021-12-13 17:23:20 +0000
commita3bc9779e93e34ff3e014a2faa546dc5c03cd7c9 (patch)
tree4059e58e8c19f724df9425b3eb8156615c020c43
parentaecc9e1b2bacd0edc9c9cd584cc600851da4eabe (diff)
parente3c0032f2260cc85d11772798fbf18f79ffb3c52 (diff)
Merge "Add SpecialPage::newSearchPage to replace Skin::setSearchPageTitle"
-rw-r--r--RELEASE-NOTES-1.3810
-rw-r--r--includes/DefaultSettings.php1
-rw-r--r--includes/preferences/DefaultPreferencesFactory.php4
-rw-r--r--includes/skins/Skin.php24
-rw-r--r--includes/skins/SkinTemplate.php11
-rw-r--r--includes/specialpage/SpecialPage.php24
6 files changed, 62 insertions, 12 deletions
diff --git a/RELEASE-NOTES-1.38 b/RELEASE-NOTES-1.38
index 9419a6427f62..e75fbb797d43 100644
--- a/RELEASE-NOTES-1.38
+++ b/RELEASE-NOTES-1.38
@@ -185,7 +185,6 @@ because of Phabricator reports.
- Skin::makeUrl()
- Skin::getSearchLink()
- Skin::mainPageLink()
- For these, use Skin::getSearchPageTitle() instead.
* Parser::getUser and ::mUser, as well as ParserOptions::getUser, deprecated
since 1.37, has been removed.
* Parser::$mStripState, deprecated in 1.35, has been made private. Use
@@ -280,11 +279,14 @@ because of Phabricator reports.
* User::setOption(), deprecated since 1.35, now emits deprecation warnings.
* Linker::formatComment(), ::formatLinksInComment(), ::commentBlock() and
revComment() were deprecated. Use the new CommentFormatter service.
-* Skin::getSkinStylePath now triggers deprecation warnings. Direct string path
+* Several Skin methods have been deprecated.
+ - Skin::setSearchPageTitle(), Skin::getSearchPageTitle(). For these,
+ use SpecialPage::newSearchPage() or associated user preference instead.
+ - Skin::getSkinStylePath now triggers deprecation warnings. Direct string path
should be used instead.
-* DatabaseBlock::purgeExpired(), deprecated since 1.36, now emits
+ - SkinTemplate::getPersonalToolsList(), deprecated since 1.35, now emits
deprecation warnings.
-* SkinTemplate::getPersonalToolsList(), deprecated since 1.35, now emits
+* DatabaseBlock::purgeExpired(), deprecated since 1.36, now emits
deprecation warnings.
* The following methods from the User class now trigger deprecation warnings:
- ::blockedBy
diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php
index 232e2eadbdc7..24f9c7f9d188 100644
--- a/includes/DefaultSettings.php
+++ b/includes/DefaultSettings.php
@@ -5698,6 +5698,7 @@ $wgDefaultUserOptions = [
'rcenhancedfilters-disable' => 0,
'rclimit' => 50,
'search-match-redirect' => true,
+ 'search-special-page' => 'Search',
'showhiddencats' => 0,
'shownumberswatching' => 1,
'showrollbackconfirmation' => 0,
diff --git a/includes/preferences/DefaultPreferencesFactory.php b/includes/preferences/DefaultPreferencesFactory.php
index abe9efcfa286..ef70b02a11e9 100644
--- a/includes/preferences/DefaultPreferencesFactory.php
+++ b/includes/preferences/DefaultPreferencesFactory.php
@@ -1390,6 +1390,10 @@ class DefaultPreferencesFactory implements PreferencesFactory {
* @param array &$defaultPreferences
*/
protected function searchPreferences( &$defaultPreferences ) {
+ $defaultPreferences['search-special-page'] = [
+ 'type' => 'api',
+ ];
+
foreach ( $this->nsInfo->getValidNamespaces() as $n ) {
$defaultPreferences['searchNs' . $n] = [
'type' => 'api',
diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php
index de71e89e64f5..5236dd1db81f 100644
--- a/includes/skins/Skin.php
+++ b/includes/skins/Skin.php
@@ -74,8 +74,6 @@ abstract class Skin extends ContextSource {
/** The current major version of the skin specification. */
protected const VERSION_MAJOR = 1;
- private $searchPageTitle = null;
-
/** @var string cached action for cheap lookup */
protected $action;
@@ -2657,12 +2655,30 @@ abstract class Skin extends ContextSource {
return Html::rawElement( 'div', $realBodyAttribs, $html );
}
+ /**
+ * @deprecated 1.38 Use SpecialPage::newSearchPage instead.
+ */
public function getSearchPageTitle(): Title {
- return $this->searchPageTitle ?? SpecialPage::getTitleFor( 'Search' );
+ wfDeprecated( __METHOD__, '1.38 Use SpecialPage::newSearchPage' );
+ return SpecialPage::newSearchPage( $this->getUser() );
}
+ /**
+ * @deprecated 1.38 to change the search page title change the value of the
+ * preference 'search-special-page' instead.
+ */
public function setSearchPageTitle( Title $title ) {
- $this->searchPageTitle = $title;
+ $userOptionsManager = MediaWikiServices::getInstance()->getUserOptionsManager();
+ $user = $this->getUser();
+ $currentTitle = $userOptionsManager->getOption( $user, 'search-special-page' );
+ $newTitle = $title->getText();
+ if ( $currentTitle !== $newTitle ) {
+ $userOptionsManager->setOption( $user, 'search-special-page', $newTitle );
+ if ( !$user->isAnon() ) {
+ // avoid this check for logged in users on future visits.
+ $userOptionsManager->saveOptions( $user );
+ }
+ }
}
/**
diff --git a/includes/skins/SkinTemplate.php b/includes/skins/SkinTemplate.php
index fd598c804af6..ec4f39a436d4 100644
--- a/includes/skins/SkinTemplate.php
+++ b/includes/skins/SkinTemplate.php
@@ -236,11 +236,12 @@ class SkinTemplate extends Skin {
$tpl->set( 'loggedin', $this->loggedin );
$tpl->set( 'notspecialpage', !$title->isSpecialPage() );
- // Deprecated since 1.36
- $searchLink = $this->getSearchPageTitle()->getLocalURL();
+ // The template variable `searchaction` is deprecated since 1.36
+ $searchTitle = SpecialPage::newSearchPage( $this->getUser() );
+ $searchLink = $searchTitle->getLocalURL();
$tpl->set( 'searchaction', $searchLink );
- $tpl->set( 'searchtitle', $this->getSearchPageTitle()->getPrefixedDBkey() );
+ $tpl->set( 'searchtitle', $searchTitle->getPrefixedDBkey() );
$tpl->set( 'search', trim( $request->getVal( 'search' ) ) );
$tpl->set( 'stylepath', $config->get( 'StylePath' ) );
$tpl->set( 'articlepath', $config->get( 'ArticlePath' ) );
@@ -905,7 +906,9 @@ class SkinTemplate extends Skin {
),
'html-input' => $this->makeSearchInput( [ 'id' => 'searchInput' ] ),
'msg-search' => $this->msg( 'search' )->text(),
- 'page-title' => $this->getSearchPageTitle()->getPrefixedDBkey(),
+ 'page-title' => SpecialPage::newSearchPage(
+ $this->getUser()
+ )->getPrefixedDBkey(),
// @since 1.38
'html-button-go-attributes' => Html::expandAttributes(
$searchButtonAttributes + $buttonAttributes + [
diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php
index e9836c161052..95b642a52394 100644
--- a/includes/specialpage/SpecialPage.php
+++ b/includes/specialpage/SpecialPage.php
@@ -91,6 +91,30 @@ class SpecialPage implements MessageLocalizer {
private $specialPageFactory;
/**
+ * Get the users prefered search page.
+ *
+ * It will fall back to Special:Search if the preference points to a page
+ * that doesn't exist or is not defined.
+ *
+ * @since 1.38
+ * @param User $user Search page can be customized by user preference.
+ * @return Title
+ */
+ public static function newSearchPage( User $user ) {
+ // Try user preference first
+ $userOptionsManager = MediaWikiServices::getInstance()->getUserOptionsManager();
+ $title = $userOptionsManager->getOption( $user, 'search-special-page' );
+ if ( $title ) {
+ $page = self::getTitleFor( $title );
+ $factory = MediaWikiServices::getInstance()->getSpecialPageFactory();
+ if ( $factory->exists( $page->getText() ) ) {
+ return $page;
+ }
+ }
+ return self::getTitleFor( 'Search' );
+ }
+
+ /**
* Get a localised Title object for a specified special page name
* If you don't need a full Title object, consider using TitleValue through
* getTitleValueFor() below.