*
* @file
*/
+use MediaWiki\Linker\LinkTarget;
+use MediaWiki\MediaWikiServices;
/**
* Represents a title within MediaWiki.
private $mIsBigDeletion = null;
// @}
- /**
- * B/C kludge: provide a TitleParser for use by Title.
- * Ideally, Title would have no methods that need this.
- * Avoid usage of this singleton by using TitleValue
- * and the associated services when possible.
- *
- * @return MediaWikiTitleCodec
- */
- private static function getMediaWikiTitleCodec() {
- global $wgContLang, $wgLocalInterwikis;
-
- static $titleCodec = null;
- static $titleCodecFingerprint = null;
-
- // $wgContLang and $wgLocalInterwikis may change (especially while testing),
- // make sure we are using the right one. To detect changes over the course
- // of a request, we remember a fingerprint of the config used to create the
- // codec singleton, and re-create it if the fingerprint doesn't match.
- $fingerprint = spl_object_hash( $wgContLang ) . '|' . implode( '+', $wgLocalInterwikis );
-
- if ( $fingerprint !== $titleCodecFingerprint ) {
- $titleCodec = null;
- }
-
- if ( !$titleCodec ) {
- $titleCodec = new MediaWikiTitleCodec(
- $wgContLang,
- GenderCache::singleton(),
- $wgLocalInterwikis
- );
- $titleCodecFingerprint = $fingerprint;
- }
-
- return $titleCodec;
- }
-
/**
* B/C kludge: provide a TitleParser for use by Title.
* Ideally, Title would have no methods that need this.
* @return TitleFormatter
*/
private static function getTitleFormatter() {
- // NOTE: we know that getMediaWikiTitleCodec() returns a MediaWikiTitleCodec,
- // which implements TitleFormatter.
- return self::getMediaWikiTitleCodec();
+ return MediaWikiServices::getInstance()->getTitleFormatter();
}
+ /**
+ * @access protected
+ */
function __construct() {
}
* @return Title
*/
public static function newFromLinkTarget( LinkTarget $linkTarget ) {
+ if ( $linkTarget instanceof Title ) {
+ // Special case if it's already a Title object
+ return $linkTarget;
+ }
return self::makeTitle(
$linkTarget->getNamespace(),
$linkTarget->getText(),
- $linkTarget->getFragment() );
+ $linkTarget->getFragment(),
+ $linkTarget->getInterwiki()
+ );
}
/**
$this->mTitleValue = new TitleValue(
$this->getNamespace(),
$this->getDBkey(),
- $this->getFragment() );
+ $this->getFragment(),
+ $this->getInterwiki()
+ );
} catch ( InvalidArgumentException $ex ) {
wfDebug( __METHOD__ . ': Can\'t create a TitleValue for [[' .
$this->getPrefixedText() . ']]: ' . $ex->getMessage() . "\n" );
* specified fragment before setting, so it assumes you're passing it with
* an initial "#".
*
- * Deprecated for public use, use Title::makeTitle() with fragment parameter.
+ * Deprecated for public use, use Title::makeTitle() with fragment parameter,
+ * or Title::createFragmentTarget().
* Still in active use privately.
*
* @private
$this->mFragment = strtr( substr( $fragment, 1 ), '_', ' ' );
}
+ /**
+ * Creates a new Title for a different fragment of the same page.
+ *
+ * @since 1.27
+ * @param string $fragment
+ * @return Title
+ */
+ public function createFragmentTarget( $fragment ) {
+ return self::makeTitle(
+ $this->getNamespace(),
+ $this->getText(),
+ $fragment,
+ $this->getInterwiki()
+ );
+
+ }
+
/**
* Prefix some arbitrary text with the namespace or interwiki prefix
* of this object
}
if ( !$user->isAllowed( $right ) ) {
$errors[] = [ 'protectedpagetext', $right, $action ];
- } elseif ( $this->mCascadeRestriction && !$user->isAllowed( 'protect' ) ) {
+ } elseif ( $this->mCascadeRestriction &&
+ !$user->isAllowedAny( 'editcascadeprotected', 'protect' ) )
+ {
$errors[] = [ 'protectedpagetext', 'protect', $action ];
}
}
if ( $right == 'autoconfirmed' ) {
$right = 'editsemiprotected';
}
- if ( $right != '' && !$user->isAllowedAll( 'protect', $right ) ) {
+ if ( $right != '' && !$user->isAllowed( $right ) &&
+ !$user->isAllowedAny( 'editcascadeprotected', 'protect' ) )
+ {
$pages = '';
foreach ( $cascadingSources as $page ) {
$pages .= '* [[:' . $page->getPrefixedText() . "]]\n";
// @note: splitTitleString() is a temporary hack to allow MediaWikiTitleCodec to share
// the parsing code with Title, while avoiding massive refactoring.
// @todo: get rid of secureAndSplit, refactor parsing code.
- $titleParser = self::getMediaWikiTitleCodec();
+ // @note: getTitleParser() returns a TitleParser implementation which does not have a
+ // splitTitleString method, but the only implementation (MediaWikiTitleCodec) does
+ $titleCodec = MediaWikiServices::getInstance()->getTitleParser();
// MalformedTitleException can be thrown here
- $parts = $titleParser->splitTitleString( $dbkey, $this->getDefaultNamespace() );
+ $parts = $titleCodec->splitTitleString( $dbkey, $this->getDefaultNamespace() );
# Fill fields
$this->setFragment( '#' . $parts['fragment'] );
$this->mNotificationTimestamp = [];
}
- $watchedItem = WatchedItemStore::getDefaultInstance()->getWatchedItem( $user, $this );
+ $store = MediaWikiServices::getInstance()->getWatchedItemStore();
+ $watchedItem = $store->getWatchedItem( $user, $this );
if ( $watchedItem ) {
$this->mNotificationTimestamp[$uid] = $watchedItem->getNotificationTimestamp();
} else {