* and does not rely on global state or the database.
*/
class Title {
- /** @var MapCacheLRU */
+ /** @var HashBagOStuff */
static private $titleCache = null;
/**
* Create a new Title from text, such as what one would find in a link. De-
* codes any HTML entities in the text.
*
- * @param string $text The link text; spaces, prefixes, and an
+ * @param string|null $text The link text; spaces, prefixes, and an
* initial ':' indicating the main namespace are accepted.
* @param int $defaultNamespace The namespace to use if none is specified
* by a prefix. If you want to force a specific namespace even if
public static function newFromText( $text, $defaultNamespace = NS_MAIN ) {
if ( is_object( $text ) ) {
throw new InvalidArgumentException( '$text must be a string.' );
- } elseif ( !is_string( $text ) ) {
+ }
+ if ( $text !== null && !is_string( $text ) ) {
wfDebugLog( 'T76305', wfGetAllCallers( 5 ) );
- wfWarn(
- __METHOD__ . ': $text must be a string. ' .
- 'This will throw an InvalidArgumentException in future.',
- 2
- );
+ return null;
+ }
+ if ( $text === null ) {
+ return null;
}
try {
*/
public static function newFromTextThrow( $text, $defaultNamespace = NS_MAIN ) {
if ( is_object( $text ) ) {
- throw new MWException( 'Title::newFromTextThrow given an object' );
+ throw new MWException( '$text must be a string, given an object' );
}
- $cache = self::getTitleCache();
+ $titleCache = self::getTitleCache();
- /**
- * Wiki pages often contain multiple links to the same page.
- * Title normalization and parsing can become expensive on
- * pages with many links, so we can save a little time by
- * caching them.
- *
- * In theory these are value objects and won't get changed...
- */
- if ( $defaultNamespace == NS_MAIN && $cache->has( $text ) ) {
- return $cache->get( $text );
+ // Wiki pages often contain multiple links to the same page.
+ // Title normalization and parsing can become expensive on pages with many
+ // links, so we can save a little time by caching them.
+ // In theory these are value objects and won't get changed...
+ if ( $defaultNamespace == NS_MAIN ) {
+ $t = $titleCache->get( $text );
+ if ( $t ) {
+ return $t;
+ }
}
- # Convert things like é ā or 〗 into normalized (bug 14952) text
+ // Convert things like é ā or 〗 into normalized (bug 14952) text
$filteredText = Sanitizer::decodeCharReferencesAndNormalize( $text );
$t = new Title();
$t->secureAndSplit();
if ( $defaultNamespace == NS_MAIN ) {
- $cache->set( $text, $t );
+ $titleCache->set( $text, $t );
}
return $t;
}
}
/**
- * @return MapCacheLRU
+ * @return HashBagOStuff
*/
private static function getTitleCache() {
if ( self::$titleCache == null ) {
- self::$titleCache = new MapCacheLRU( self::CACHE_MAX );
+ self::$titleCache = new HashBagOStuff( array( 'maxKeys' => self::CACHE_MAX ) );
}
return self::$titleCache;
}
*/
public function getNsText() {
if ( $this->isExternal() ) {
- // This probably shouldn't even happen. ohh man, oh yuck.
- // But for interwiki transclusion it sometimes does.
- // Shit. Shit shit shit.
- //
+ // This probably shouldn't even happen,
+ // but for interwiki transclusion it sometimes does.
// Use the canonical namespaces if possible to try to
// resolve a foreign namespace.
if ( MWNamespace::exists( $this->mNamespace ) ) {
* Deprecated for public use, use Title::makeTitle() with fragment parameter.
* Still in active use privately.
*
+ * @private
* @param string $fragment Text
*/
public function setFragment( $fragment ) {
* - secure : does cheap and expensive checks, using the master as needed
* @param array $ignoreErrors Array of Strings Set this to a list of message keys
* whose corresponding errors may be ignored.
- * @return array Array of arguments to wfMessage to explain permissions problems.
+ * @return array Array of arrays of the arguments to wfMessage to explain permissions problems.
*/
public function getUserPermissionsErrors(
$action, $user, $rigor = 'secure', $ignoreErrors = array()
// Remove the errors being ignored.
foreach ( $errors as $index => $error ) {
- $error_key = is_array( $error ) ? $error[0] : $error;
+ $errKey = is_array( $error ) ? $error[0] : $error;
- if ( in_array( $error_key, $ignoreErrors ) ) {
+ if ( in_array( $errKey, $ignoreErrors ) ) {
+ unset( $errors[$index] );
+ }
+ if ( $errKey instanceof MessageSpecifier && in_array( $errKey->getKey(), $ignoreErrors ) ) {
unset( $errors[$index] );
}
}
} elseif ( $result !== '' && is_string( $result ) ) {
// A string representing a message-id
$errors[] = array( $result );
+ } elseif ( $result instanceof MessageSpecifier ) {
+ // A message specifier representing an error
+ $errors[] = array( $result );
} elseif ( $result === false ) {
// a generic "We don't want them to do that"
$errors[] = array( 'badaccess-group0' );
/**
* Updates page_touched for this page; called from LinksUpdate.php
*
- * @param integer $purgeTime TS_MW timestamp [optional]
+ * @param string $purgeTime [optional] TS_MW timestamp
* @return bool True if the update succeeded
*/
public function invalidateCache( $purgeTime = null ) {
* on the number of links. Typically called on create and delete.
*/
public function touchLinks() {
- $u = new HTMLCacheUpdate( $this, 'pagelinks' );
- $u->doUpdate();
-
+ DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'pagelinks' ) );
if ( $this->getNamespace() == NS_CATEGORY ) {
- $u = new HTMLCacheUpdate( $this, 'categorylinks' );
- $u->doUpdate();
+ DeferredUpdates::addUpdate( new HTMLCacheUpdate( $this, 'categorylinks' ) );
}
}