From 2bc191889a36343f61b8ea33fa5219c155fb4de9 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 24 Aug 2012 20:49:19 +0200 Subject: [PATCH] Fixing creation of DifferenceEninge Creation of DifferenceEninge insteances was based on invalid assumptions in several places. Change-Id: Ib67ca893ea53a27d4ac7efd8a9ca0d3b2d93949f --- includes/Article.php | 12 ++++++++++- includes/FeedUtils.php | 25 +++++++++++++++-------- includes/actions/RollbackAction.php | 2 +- includes/api/ApiComparePages.php | 9 +++++++- includes/api/ApiQueryRevisions.php | 2 +- includes/specials/SpecialComparePages.php | 22 ++++++++++++-------- includes/specials/SpecialUndelete.php | 3 +-- 7 files changed, 52 insertions(+), 23 deletions(-) diff --git a/includes/Article.php b/includes/Article.php index dc6294f2b7..3aca498107 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -787,6 +787,8 @@ class Article extends Page { /** * Show a diff page according to current request variables. For use within * Article::view() only, other callers should use the DifferenceEngine class. + * + * @todo: make protected */ public function showDiffPage() { $request = $this->getContext()->getRequest(); @@ -798,7 +800,15 @@ class Article extends Page { $unhide = $request->getInt( 'unhide' ) == 1; $oldid = $this->getOldID(); - $contentHandler = ContentHandler::getForTitle( $this->getTitle() ); + $rev = $this->getRevisionFetched(); + + if ( !$rev ) { + $this->getContext()->getOutput()->setPageTitle( wfMessage( 'errorpagetitle' )->text() ); + $this->getContext()->getOutput()->addWikiMsg( 'difference-missing-revision', $oldid, 1 ); + return; + } + + $contentHandler = $rev->getContentHandler(); $de = $contentHandler->createDifferenceEngine( $this->getContext(), $oldid, $diff, $rcid, $purge, $unhide ); // DifferenceEngine directly fetched the revision: diff --git a/includes/FeedUtils.php b/includes/FeedUtils.php index 5eb81ceb3a..0add262328 100644 --- a/includes/FeedUtils.php +++ b/includes/FeedUtils.php @@ -138,14 +138,23 @@ class FeedUtils { $diffText = ''; // Don't bother generating the diff if we won't be able to show it if ( $wgFeedDiffCutoff > 0 ) { - $contentHandler = ContentHandler::getForTitle( $title ); - $de = $contentHandler->createDifferenceEngine( $title, $oldid, $newid ); - $diffText = $de->getDiff( - wfMsg( 'previousrevision' ), // hack - wfMsg( 'revisionasof', - $wgLang->timeanddate( $timestamp ), - $wgLang->date( $timestamp ), - $wgLang->time( $timestamp ) ) ); + $rev = Revision::newFromId( $oldid ); + + if ( !$rev ) { + $diffText = false; + } else { + $context = clone RequestContext::getMain(); + $context->setTitle( $title ); + + $contentHandler = $rev->getContentHandler(); + $de = $contentHandler->createDifferenceEngine( $context, $oldid, $newid ); + $diffText = $de->getDiff( + wfMsg( 'previousrevision' ), // hack + wfMsg( 'revisionasof', + $wgLang->timeanddate( $timestamp ), + $wgLang->date( $timestamp ), + $wgLang->time( $timestamp ) ) ); + } } if ( $wgFeedDiffCutoff <= 0 || ( strlen( $diffText ) > $wgFeedDiffCutoff ) ) { diff --git a/includes/actions/RollbackAction.php b/includes/actions/RollbackAction.php index 5ee6786ed6..54d5e83c7f 100644 --- a/includes/actions/RollbackAction.php +++ b/includes/actions/RollbackAction.php @@ -109,7 +109,7 @@ class RollbackAction extends FormlessAction { $this->getOutput()->returnToMain( false, $this->getTitle() ); if ( !$request->getBool( 'hidediff', false ) && !$this->getUser()->getBoolOption( 'norollbackdiff', false ) ) { - $contentHandler = ContentHandler::getForTitle( $this->getTitle() ); + $contentHandler = $current->getContentHandler(); $de = $contentHandler->createDifferenceEngine( $this->getContext(), $current->getId(), $newId, false, true ); $de->showDiff( '', '' ); } diff --git a/includes/api/ApiComparePages.php b/includes/api/ApiComparePages.php index 08085214a8..67412598a8 100644 --- a/includes/api/ApiComparePages.php +++ b/includes/api/ApiComparePages.php @@ -35,7 +35,14 @@ class ApiComparePages extends ApiBase { $rev1 = $this->revisionOrTitleOrId( $params['fromrev'], $params['fromtitle'], $params['fromid'] ); $rev2 = $this->revisionOrTitleOrId( $params['torev'], $params['totitle'], $params['toid'] ); - $contentHandler = ContentHandler::getForModelID( $rev1->getContentModel() ); + $revision = Revision::newFromId( $rev1 ); + + if ( !$revision ) { + $this->dieUsage( 'The diff cannot be retrieved, ' . + 'one revision does not exist or you do not have permission to view it.', 'baddiff' ); + } + + $contentHandler = $revision->getContentHandler(); $de = $contentHandler->createDifferenceEngine( $this->getContext(), $rev1, $rev2, diff --git a/includes/api/ApiQueryRevisions.php b/includes/api/ApiQueryRevisions.php index 5e4b8f6e57..3590093f19 100644 --- a/includes/api/ApiQueryRevisions.php +++ b/includes/api/ApiQueryRevisions.php @@ -572,7 +572,7 @@ class ApiQueryRevisions extends ApiQueryBase { $vals['diff'] = array(); $context = new DerivativeContext( $this->getContext() ); $context->setTitle( $title ); - $handler = ContentHandler::getForTitle( $title ); + $handler = $revision->getContentHandler(); if ( !is_null( $this->difftotext ) ) { $model = $title->getContentModel(); diff --git a/includes/specials/SpecialComparePages.php b/includes/specials/SpecialComparePages.php index 565bfda214..2b7036c4f4 100644 --- a/includes/specials/SpecialComparePages.php +++ b/includes/specials/SpecialComparePages.php @@ -111,15 +111,19 @@ class SpecialComparePages extends SpecialPage { $rev2 = self::revOrTitle( $data['Revision2'], $data['Page2'] ); if( $rev1 && $rev2 ) { - $contentHandler = ContentHandler::getForModelID( $rev1->getContentModel() ); - $de = $contentHandler->createDifferenceEngine( $form->getContext(), - $rev1, - $rev2, - null, // rcid - ( $data['Action'] == 'purge' ), - ( $data['Unhide'] == '1' ) - ); - $de->showDiffPage( true ); + $revision = Revision::newFromId( $rev1 ); + + if ( $revision ) { // NOTE: $rev1 was already checked, should exist. + $contentHandler = $revision->getContentHandler(); + $de = $contentHandler->createDifferenceEngine( $form->getContext(), + $rev1, + $rev2, + null, // rcid + ( $data['Action'] == 'purge' ), + ( $data['Unhide'] == '1' ) + ); + $de->showDiffPage( true ); + } } } diff --git a/includes/specials/SpecialUndelete.php b/includes/specials/SpecialUndelete.php index b51879ce65..ebcf78c145 100644 --- a/includes/specials/SpecialUndelete.php +++ b/includes/specials/SpecialUndelete.php @@ -934,8 +934,7 @@ class SpecialUndelete extends SpecialPage { * @return String: HTML */ function showDiff( $previousRev, $currentRev ) { - $contentHandler = ContentHandler::getForTitle( $this->getTitle() ); - $diffEngine = $contentHandler->createDifferenceEngine( $this->getContext() ); + $diffEngine = $currentRev->getContentHandler()->createDifferenceEngine( $this->getContext() ); $diffEngine->showDiffStyle(); $this->getOutput()->addHTML( "
" . -- 2.20.1