Clone the Title object to prevent mutations.
authorDavid Barratt <dbarratt@wikimedia.org>
Wed, 23 Jan 2019 22:53:56 +0000 (17:53 -0500)
committerDavid Barratt <dbarratt@wikimedia.org>
Wed, 23 Jan 2019 22:53:56 +0000 (17:53 -0500)
The Title object that is loaded from master gets reloaded from the replicas
and mutates the original object. When pages are moved, the Title no longer
exists on master, but still exists on the replicas. Cloning the object allows
the item to be loaded from the replicas, without mutating the original Title.

Bug: T210739
Change-Id: I9ad973e9a609124749909605f37bc1e1fc549585

includes/Title.php

index 1bb54df..6ada9b3 100644 (file)
@@ -2708,8 +2708,13 @@ class Title implements LinkTarget, IDBAccessObject {
                // will get the action where the restriction is the same. This may result
                // in actions being blocked that shouldn't be.
                if ( Action::exists( $action ) ) {
                // will get the action where the restriction is the same. This may result
                // in actions being blocked that shouldn't be.
                if ( Action::exists( $action ) ) {
+                       // Clone the title to prevent mutations to this object which is done
+                       // by Title::loadFromRow() in WikiPage::loadFromRow().
+                       $page = WikiPage::factory( clone $this );
+                       // Creating an action will perform several database queries to ensure that
+                       // the action has not been overridden by the content type.
                        // @todo FIXME: Pass the relevant context into this function.
                        // @todo FIXME: Pass the relevant context into this function.
-                       $action = Action::factory( $action, WikiPage::factory( $this ), RequestContext::getMain() );
+                       $action = Action::factory( $action, $page, RequestContext::getMain() );
                } else {
                        $action = null;
                }
                } else {
                        $action = null;
                }