Merge "mw.Upload.BookletLayout: Use $.Deferred(), not $.Deferred"
[lhc/web/wiklou.git] / includes / Title.php
index 9ada4f3..5d8b072 100644 (file)
@@ -31,7 +31,7 @@
  *       and does not rely on global state or the database.
  */
 class Title {
-       /** @var MapCacheLRU */
+       /** @var HashBagOStuff */
        static private $titleCache = null;
 
        /**
@@ -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,13 +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 {
@@ -296,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();
@@ -322,7 +321,7 @@ class Title {
 
                $t->secureAndSplit();
                if ( $defaultNamespace == NS_MAIN ) {
-                       $cache->set( $text, $t );
+                       $titleCache->set( $text, $t );
                }
                return $t;
        }
@@ -363,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;
        }
@@ -1825,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
@@ -1944,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()
@@ -1953,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] );
                        }
                }
@@ -2054,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' );
@@ -3552,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' )
@@ -3583,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
+               );
        }
 
        /**
@@ -4412,7 +4422,7 @@ 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.
         */