Clone WikiPage before delete and pass the cloned copy to ArticleDeleteComplete
authorAndrew Otto <acotto@gmail.com>
Thu, 14 Jul 2016 16:45:11 +0000 (12:45 -0400)
committerAaron Schulz <aschulz@wikimedia.org>
Mon, 15 Aug 2016 20:46:49 +0000 (20:46 +0000)
This allows the hook to examine the state of the WikiPage instance before
the data is actually deleted from the page table.

E.g. The hook can now do $wikiPage->isRedirect(); and get correct information.

Bug: T134502
Change-Id: I715046dc8157047aff4d5bd03ea6b5a47aee58bb

includes/page/WikiPage.php

index 8eba1cc..f3cc26a 100644 (file)
@@ -90,6 +90,14 @@ class WikiPage implements Page, IDBAccessObject {
                $this->mTitle = $title;
        }
 
+       /**
+        * Makes sure that the mTitle object is cloned
+        * to the newly cloned WikiPage.
+        */
+       public function __clone() {
+               $this->mTitle = clone $this->mTitle;
+       }
+
        /**
         * Create a WikiPage object of the appropriate class for the given title.
         *
@@ -1048,9 +1056,9 @@ class WikiPage implements Page, IDBAccessObject {
         * @param bool          $forceParse Force reindexing, regardless of cache settings
         * @return bool|ParserOutput ParserOutput or false if the revision was not found
         */
-       public function getParserOutput( ParserOptions $parserOptions, $oldid = null,
-                                        $forceParse = false ) {
-
+       public function getParserOutput(
+               ParserOptions $parserOptions, $oldid = null, $forceParse = false
+       ) {
                $useParserCache =
                        ( !$forceParse ) && $this->shouldCheckParserCache( $parserOptions, $oldid );
                wfDebug( __METHOD__ .
@@ -2934,6 +2942,11 @@ class WikiPage implements Page, IDBAccessObject {
                // Save this so we can pass it to the ArticleDeleteComplete hook.
                $archivedRevisionCount = $dbw->affectedRows();
 
+               // Clone the title and wikiPage, so we have the information we need when
+               // we log and run the ArticleDeleteComplete hook.
+               $logTitle = clone $this->mTitle;
+               $wikiPageBeforeDelete = clone $this;
+
                // Now that it's safely backed up, delete it
                $dbw->delete( 'page', [ 'page_id' => $id ], __METHOD__ );
 
@@ -2941,9 +2954,6 @@ class WikiPage implements Page, IDBAccessObject {
                        $dbw->delete( 'revision', [ 'rev_page' => $id ], __METHOD__ );
                }
 
-               // Clone the title, so we have the information we need when we log
-               $logTitle = clone $this->mTitle;
-
                // Log the deletion, if the page was suppressed, put it in the suppression log instead
                $logtype = $suppress ? 'suppress' : 'delete';
 
@@ -2962,8 +2972,15 @@ class WikiPage implements Page, IDBAccessObject {
 
                $this->doDeleteUpdates( $id, $content );
 
-               Hooks::run( 'ArticleDeleteComplete',
-                       [ &$this, &$user, $reason, $id, $content, $logEntry, $archivedRevisionCount ] );
+               Hooks::run( 'ArticleDeleteComplete', [
+                       &$wikiPageBeforeDelete,
+                       &$user,
+                       $reason,
+                       $id,
+                       $content,
+                       $logEntry,
+                       $archivedRevisionCount
+               ] );
                $status->value = $logid;
 
                // Show log excerpt on 404 pages rather than just a link