Merge "preprocessDump.php: Fix invalid Preprocessor instantiation"
[lhc/web/wiklou.git] / includes / content / AbstractContent.php
index 733d85a..eb9ef85 100644 (file)
@@ -180,6 +180,17 @@ abstract class AbstractContent implements Content {
        }
 
        /**
+        * Decides whether two Content objects are equal.
+        * Two Content objects MUST not be considered equal if they do not share the same content model.
+        * Two Content objects that are equal SHOULD have the same serialization.
+        *
+        * This default implementation relies on equalsInternal() to determin whether the
+        * Content objects are logically equivalent. Subclasses that need to implement a custom
+        * equality check should consider overriding equalsInternal(). Subclasses that override
+        * equals() itself MUST make sure that the implementation returns false for $that === null,
+        * and true for $that === this. It MUST also return false if $that does not have the same
+        * content model.
+        *
         * @since 1.21
         *
         * @param Content|null $that
@@ -201,7 +212,34 @@ abstract class AbstractContent implements Content {
                        return false;
                }
 
-               return $this->getNativeData() === $that->getNativeData();
+               // For type safety. Needed for odd cases like MessageContent using CONTENT_MODEL_WIKITEXT
+               if ( get_class( $that ) !== get_class( $this ) ) {
+                       return false;
+               }
+
+               return $this->equalsInternal( $that );
+       }
+
+       /**
+        * Checks whether $that is logically equal to this Content object.
+        *
+        * This method can be overwritten by subclasses that need to implement custom
+        * equality checks.
+        *
+        * This default implementation checks whether the serializations
+        * of $this and $that are the same: $this->serialize() === $that->serialize()
+        *
+        * Implementors can assume that $that is an instance of the same class
+        * as the present Content object, as long as equalsInternal() is only called
+        * by the standard implementation of equals().
+        *
+        * @note Do not call this method directly, call equals() instead.
+        *
+        * @param Content $that
+        * @return bool
+        */
+       protected function equalsInternal( Content $that ) {
+               return $this->serialize() === $that->serialize();
        }
 
        /**
@@ -491,7 +529,7 @@ abstract class AbstractContent implements Content {
         * @since 1.24
         *
         * @param Title $title Context title for parsing
-        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param int|null $revId Revision ID being rendered
         * @param ParserOptions|null $options
         * @param bool $generateHtml Whether or not to generate HTML
         *
@@ -537,7 +575,8 @@ abstract class AbstractContent implements Content {
         * @since 1.24
         *
         * @param Title $title Context title for parsing
-        * @param int|null $revId Revision ID (for {{REVISIONID}})
+        * @param int|null $revId ID of the revision being rendered.
+        *  See Parser::parse() for the ramifications.
         * @param ParserOptions $options
         * @param bool $generateHtml Whether or not to generate HTML
         * @param ParserOutput &$output The output object to fill (reference).