X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FTitle.php;h=5d8b07230bfd797ca90298cedb472f008c9d65ce;hb=5e73afa7bc3d07badf9daa9e8ab0fc6f96317150;hp=b347edbb6ad98a5ed6cb7794f0af8ac487bb927f;hpb=35f61c7c4b38388dc498f898193f1dda0461e0b3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Title.php b/includes/Title.php index b347edbb6a..5d8b07230b 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -31,7 +31,7 @@ * and does not rely on global state or the database. */ class Title { - /** @var MapCacheLRU */ + /** @var HashBagOStuff */ static private $titleCache = null; /** @@ -206,7 +206,7 @@ class Title { * @return TitleFormatter */ private static function getTitleFormatter() { - //NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec, + // NOTE: we know that getTitleParser() returns a MediaWikiTitleCodec, // which implements TitleFormatter. return self::getTitleParser(); } @@ -252,7 +252,7 @@ class Title { * 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 @@ -264,9 +264,13 @@ class Title { 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 { @@ -292,24 +296,23 @@ class Title { */ 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(); @@ -318,7 +321,7 @@ class Title { $t->secureAndSplit(); if ( $defaultNamespace == NS_MAIN ) { - $cache->set( $text, $t ); + $titleCache->set( $text, $t ); } return $t; } @@ -359,11 +362,11 @@ class Title { } /** - * @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; } @@ -526,7 +529,7 @@ class Title { * @param string $title Database key form * @param string $fragment The link fragment (after the "#") * @param string $interwiki Interwiki prefix - * @return Title The new object, or null on an error + * @return Title|null The new object, or null on an error */ public static function makeTitleSafe( $ns, $title, $fragment = '', $interwiki = '' ) { if ( !MWNamespace::exists( $ns ) ) { @@ -1004,10 +1007,8 @@ class Title { */ 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 ) ) { @@ -1416,6 +1417,7 @@ class Title { * Deprecated for public use, use Title::makeTitle() with fragment parameter. * Still in active use privately. * + * @private * @param string $fragment Text */ public function setFragment( $fragment ) { @@ -1822,7 +1824,7 @@ class Title { /** * Get the URL form for an internal link. - * - Used in various Squid-related code, in case we have a different + * - Used in various CDN-related code, in case we have a different * internal hostname for the server from the exposed one. * * This uses $wgInternalServer to qualify the path, or $wgServer @@ -1941,7 +1943,7 @@ class Title { * - 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() @@ -1950,9 +1952,12 @@ class Title { // 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] ); } } @@ -2051,6 +2056,9 @@ class Title { } 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' ); @@ -2944,7 +2952,7 @@ class Title { $this->mRestrictions['move'] = explode( ',', trim( $temp[0] ) ); } else { $restriction = trim( $temp[1] ); - if ( $restriction != '' ) { //some old entries are empty + if ( $restriction != '' ) { // some old entries are empty $this->mRestrictions[$temp[0]] = explode( ',', $restriction ); } } @@ -3549,12 +3557,12 @@ class Title { } /** - * Get a list of URLs to purge from the Squid cache when this + * Get a list of URLs to purge from the CDN cache when this * page changes * * @return string[] Array of String the URLs */ - public function getSquidURLs() { + public function getCdnUrls() { $urls = array( $this->getInternalURL(), $this->getInternalURL( 'action=history' ) @@ -3580,15 +3588,20 @@ class Title { } /** - * Purge all applicable Squid URLs + * @deprecated since 1.27 use getCdnUrls() + */ + public function getSquidURLs() { + return $this->getCdnUrls(); + } + + /** + * Purge all applicable CDN URLs */ public function purgeSquid() { - global $wgUseSquid; - if ( $wgUseSquid ) { - $urls = $this->getSquidURLs(); - $u = new SquidUpdate( $urls ); - $u->doUpdate(); - } + DeferredUpdates::addUpdate( + new CdnCacheUpdate( $this->getCdnUrls() ), + DeferredUpdates::PRESEND + ); } /** @@ -4379,7 +4392,7 @@ class Title { /** * 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 ) { @@ -4409,24 +4422,21 @@ class Title { } /** - * Update page_touched timestamps and send squid purge messages for + * Update page_touched timestamps and send CDN purge messages for * pages linking to this title. May be sent to the job queue depending * 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' ) ); } } /** * Get the last touched timestamp * - * @param DatabaseBase $db Optional db + * @param IDatabase $db Optional db * @return string Last-touched timestamp */ public function getTouched( $db = null ) {