X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2Fcontent%2FAbstractContent.php;h=c82b4734ca725be5dec55f4a4ad00b2363551ffa;hb=4821c63624e123043bddc54293cf6a286505955e;hp=b6211b0604c99739353fae61d30c1fd280823146;hpb=df6491f78bb62a7c8da01c67ae518572cafe4c5b;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php index b6211b0604..c82b4734ca 100644 --- a/includes/content/AbstractContent.php +++ b/includes/content/AbstractContent.php @@ -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(); } /** @@ -505,6 +543,7 @@ abstract class AbstractContent implements Content { } $po = new ParserOutput(); + $options->registerWatcher( [ $po, 'recordOption' ] ); if ( Hooks::run( 'ContentGetParserOutput', [ $this, $title, $revId, $options, $generateHtml, &$po ] ) @@ -518,6 +557,7 @@ abstract class AbstractContent implements Content { } Hooks::run( 'ContentAlterParserOutput', [ $this, $title, $po ] ); + $options->registerWatcher( null ); return $po; }