From: Thomas Arrow Date: Wed, 3 Feb 2016 12:26:01 +0000 (+0000) Subject: Split ImagePage.php into separate classes X-Git-Tag: 1.31.0-rc.0~8089^2 X-Git-Url: http://git.cyclocoop.org/%22%20.%20generer_url_aide%28?a=commitdiff_plain;h=2c2d6248f91ff6b93685e95b6bef82bb96b78f85;p=lhc%2Fweb%2Fwiklou.git Split ImagePage.php into separate classes Change-Id: Id2ca94c50b75d24da4d02fe82747a7ce7edccd9f --- diff --git a/autoload.php b/autoload.php index 8720186b69..b4c31dca0d 100644 --- a/autoload.php +++ b/autoload.php @@ -566,8 +566,8 @@ $wgAutoloadLocalClasses = array( 'ImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php', 'ImageGalleryBase' => __DIR__ . '/includes/gallery/ImageGalleryBase.php', 'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php', - 'ImageHistoryList' => __DIR__ . '/includes/page/ImagePage.php', - 'ImageHistoryPseudoPager' => __DIR__ . '/includes/page/ImagePage.php', + 'ImageHistoryList' => __DIR__ . '/includes/page/ImageHistoryList.php', + 'ImageHistoryPseudoPager' => __DIR__ . '/includes/page/ImageHistoryPseudoPager.php', 'ImageListPager' => __DIR__ . '/includes/specials/SpecialListfiles.php', 'ImagePage' => __DIR__ . '/includes/page/ImagePage.php', 'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php', diff --git a/includes/page/ImageHistoryList.php b/includes/page/ImageHistoryList.php new file mode 100644 index 0000000000..32638a5db1 --- /dev/null +++ b/includes/page/ImageHistoryList.php @@ -0,0 +1,327 @@ +current = $imagePage->getFile(); + $this->img = $imagePage->getDisplayedFile(); + $this->title = $imagePage->getTitle(); + $this->imagePage = $imagePage; + $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender(); + $this->setContext( $imagePage->getContext() ); + } + + /** + * @return ImagePage + */ + public function getImagePage() { + return $this->imagePage; + } + + /** + * @return File + */ + public function getFile() { + return $this->img; + } + + /** + * @param string $navLinks + * @return string + */ + public function beginImageHistoryList( $navLinks = '' ) { + return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) + . "\n" + . "
\n" + . $this->msg( 'filehist-help' )->parseAsBlock() + . $navLinks . "\n" + . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n" + . '' + . ( $this->current->isLocal() + && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '' : '' ) + . '' . $this->msg( 'filehist-datetime' )->escaped() . '' + . ( $this->showThumb ? '' . $this->msg( 'filehist-thumb' )->escaped() . '' : '' ) + . '' . $this->msg( 'filehist-dimensions' )->escaped() . '' + . '' . $this->msg( 'filehist-user' )->escaped() . '' + . '' . $this->msg( 'filehist-comment' )->escaped() . '' + . "\n"; + } + + /** + * @param string $navLinks + * @return string + */ + public function endImageHistoryList( $navLinks = '' ) { + return "\n$navLinks\n
\n"; + } + + /** + * @param bool $iscur + * @param File $file + * @return string + */ + public function imageHistoryLine( $iscur, $file ) { + global $wgContLang; + + $user = $this->getUser(); + $lang = $this->getLanguage(); + $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() ); + $img = $iscur ? $file->getName() : $file->getArchiveName(); + $userId = $file->getUser( 'id' ); + $userText = $file->getUser( 'text' ); + $description = $file->getDescription( File::FOR_THIS_USER, $user ); + + $local = $this->current->isLocal(); + $row = $selected = ''; + + // Deletion link + if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) { + $row .= ''; + # Link to remove from history + if ( $user->isAllowed( 'delete' ) ) { + $q = array( 'action' => 'delete' ); + if ( !$iscur ) { + $q['oldimage'] = $img; + } + $row .= Linker::linkKnown( + $this->title, + $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(), + array(), $q + ); + } + # Link to hide content. Don't show useless link to people who cannot hide revisions. + $canHide = $user->isAllowed( 'deleterevision' ); + if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) { + if ( $user->isAllowed( 'delete' ) ) { + $row .= '
'; + } + // If file is top revision or locked from this user, don't link + if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) { + $del = Linker::revDeleteLinkDisabled( $canHide ); + } else { + list( $ts, ) = explode( '!', $img, 2 ); + $query = array( + 'type' => 'oldimage', + 'target' => $this->title->getPrefixedText(), + 'ids' => $ts, + ); + $del = Linker::revDeleteLink( $query, + $file->isDeleted( File::DELETED_RESTRICTED ), $canHide ); + } + $row .= $del; + } + $row .= ''; + } + + // Reversion link/current indicator + $row .= ''; + if ( $iscur ) { + $row .= $this->msg( 'filehist-current' )->escaped(); + } elseif ( $local && $this->title->quickUserCan( 'edit', $user ) + && $this->title->quickUserCan( 'upload', $user ) + ) { + if ( $file->isDeleted( File::DELETED_FILE ) ) { + $row .= $this->msg( 'filehist-revert' )->escaped(); + } else { + $row .= Linker::linkKnown( + $this->title, + $this->msg( 'filehist-revert' )->escaped(), + array(), + array( + 'action' => 'revert', + 'oldimage' => $img, + 'wpEditToken' => $user->getEditToken( $img ) + ) + ); + } + } + $row .= ''; + + // Date/time and image link + if ( $file->getTimestamp() === $this->img->getTimestamp() ) { + $selected = "class='filehistory-selected'"; + } + $row .= ""; + if ( !$file->userCan( File::DELETED_FILE, $user ) ) { + # Don't link to unviewable files + $row .= '' + . $lang->userTimeAndDate( $timestamp, $user ) . ''; + } elseif ( $file->isDeleted( File::DELETED_FILE ) ) { + if ( $local ) { + $this->preventClickjacking(); + $revdel = SpecialPage::getTitleFor( 'Revisiondelete' ); + # Make a link to review the image + $url = Linker::linkKnown( + $revdel, + $lang->userTimeAndDate( $timestamp, $user ), + array(), + array( + 'target' => $this->title->getPrefixedText(), + 'file' => $img, + 'token' => $user->getEditToken( $img ) + ) + ); + } else { + $url = $lang->userTimeAndDate( $timestamp, $user ); + } + $row .= '' . $url . ''; + } elseif ( !$file->exists() ) { + $row .= '' + . $lang->userTimeAndDate( $timestamp, $user ) . ''; + } else { + $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img ); + $row .= Xml::element( + 'a', + array( 'href' => $url ), + $lang->userTimeAndDate( $timestamp, $user ) + ); + } + $row .= ""; + + // Thumbnail + if ( $this->showThumb ) { + $row .= '' . $this->getThumbForLine( $file ) . ''; + } + + // Image dimensions + size + $row .= ''; + $row .= htmlspecialchars( $file->getDimensionsString() ); + $row .= $this->msg( 'word-separator' )->escaped(); + $row .= ''; + $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped(); + $row .= ''; + $row .= ''; + + // Uploading user + $row .= ''; + // Hide deleted usernames + if ( $file->isDeleted( File::DELETED_USER ) ) { + $row .= '' + . $this->msg( 'rev-deleted-user' )->escaped() . ''; + } else { + if ( $local ) { + $row .= Linker::userLink( $userId, $userText ); + $row .= ''; + $row .= Linker::userToolLinks( $userId, $userText ); + $row .= ''; + } else { + $row .= htmlspecialchars( $userText ); + } + } + $row .= ''; + + // Don't show deleted descriptions + if ( $file->isDeleted( File::DELETED_COMMENT ) ) { + $row .= '' . + $this->msg( 'rev-deleted-comment' )->escaped() . ''; + } else { + $row .= '' . + Linker::formatComment( $description, $this->title ) . ''; + } + + $rowClass = null; + Hooks::run( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) ); + $classAttr = $rowClass ? " class='$rowClass'" : ''; + + return "{$row}\n"; + } + + /** + * @param File $file + * @return string + */ + protected function getThumbForLine( $file ) { + $lang = $this->getLanguage(); + $user = $this->getUser(); + if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user ) + && !$file->isDeleted( File::DELETED_FILE ) + ) { + $params = array( + 'width' => '120', + 'height' => '120', + ); + $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() ); + + $thumbnail = $file->transform( $params ); + $options = array( + 'alt' => $this->msg( 'filehist-thumbtext', + $lang->userTimeAndDate( $timestamp, $user ), + $lang->userDate( $timestamp, $user ), + $lang->userTime( $timestamp, $user ) )->text(), + 'file-link' => true, + ); + + if ( !$thumbnail ) { + return $this->msg( 'filehist-nothumb' )->escaped(); + } + + return $thumbnail->toHtml( $options ); + } else { + return $this->msg( 'filehist-nothumb' )->escaped(); + } + } + + /** + * @param bool $enable + */ + protected function preventClickjacking( $enable = true ) { + $this->preventClickjacking = $enable; + } + + /** + * @return bool + */ + public function getPreventClickjacking() { + return $this->preventClickjacking; + } +} diff --git a/includes/page/ImageHistoryPseudoPager.php b/includes/page/ImageHistoryPseudoPager.php new file mode 100644 index 0000000000..e421d23277 --- /dev/null +++ b/includes/page/ImageHistoryPseudoPager.php @@ -0,0 +1,205 @@ +getContext() ); + $this->mImagePage = $imagePage; + $this->mTitle = clone $imagePage->getTitle(); + $this->mTitle->setFragment( '#filehistory' ); + $this->mImg = null; + $this->mHist = array(); + $this->mRange = array( 0, 0 ); // display range + } + + /** + * @return Title + */ + function getTitle() { + return $this->mTitle; + } + + function getQueryInfo() { + return false; + } + + /** + * @return string + */ + function getIndexField() { + return ''; + } + + /** + * @param object $row + * @return string + */ + function formatRow( $row ) { + return ''; + } + + /** + * @return string + */ + function getBody() { + $s = ''; + $this->doQuery(); + if ( count( $this->mHist ) ) { + if ( $this->mImg->isLocal() ) { + // Do a batch existence check for user pages and talkpages + $linkBatch = new LinkBatch(); + for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) { + $file = $this->mHist[$i]; + $user = $file->getUser( 'text' ); + $linkBatch->add( NS_USER, $user ); + $linkBatch->add( NS_USER_TALK, $user ); + } + $linkBatch->execute(); + } + + $list = new ImageHistoryList( $this->mImagePage ); + # Generate prev/next links + $navLink = $this->getNavigationBar(); + $s = $list->beginImageHistoryList( $navLink ); + // Skip rows there just for paging links + for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) { + $file = $this->mHist[$i]; + $s .= $list->imageHistoryLine( !$file->isOld(), $file ); + } + $s .= $list->endImageHistoryList( $navLink ); + + if ( $list->getPreventClickjacking() ) { + $this->preventClickjacking(); + } + } + return $s; + } + + function doQuery() { + if ( $this->mQueryDone ) { + return; + } + $this->mImg = $this->mImagePage->getFile(); // ensure loading + if ( !$this->mImg->exists() ) { + return; + } + $queryLimit = $this->mLimit + 1; // limit plus extra row + if ( $this->mIsBackwards ) { + // Fetch the file history + $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false ); + // The current rev may not meet the offset/limit + $numRows = count( $this->mHist ); + if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) { + $this->mHist = array_merge( array( $this->mImg ), $this->mHist ); + } + } else { + // The current rev may not meet the offset + if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) { + $this->mHist[] = $this->mImg; + } + // Old image versions (fetch extra row for nav links) + $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1; + // Fetch the file history + $this->mHist = array_merge( $this->mHist, + $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) ); + } + $numRows = count( $this->mHist ); // Total number of query results + if ( $numRows ) { + # Index value of top item in the list + $firstIndex = $this->mIsBackwards ? + $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp(); + # Discard the extra result row if there is one + if ( $numRows > $this->mLimit && $numRows > 1 ) { + if ( $this->mIsBackwards ) { + # Index value of item past the index + $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp(); + # Index value of bottom item in the list + $lastIndex = $this->mHist[1]->getTimestamp(); + # Display range + $this->mRange = array( 1, $numRows - 1 ); + } else { + # Index value of item past the index + $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp(); + # Index value of bottom item in the list + $lastIndex = $this->mHist[$numRows - 2]->getTimestamp(); + # Display range + $this->mRange = array( 0, $numRows - 2 ); + } + } else { + # Setting indexes to an empty string means that they will be + # omitted if they would otherwise appear in URLs. It just so + # happens that this is the right thing to do in the standard + # UI, in all the relevant cases. + $this->mPastTheEndIndex = ''; + # Index value of bottom item in the list + $lastIndex = $this->mIsBackwards ? + $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp(); + # Display range + $this->mRange = array( 0, $numRows - 1 ); + } + } else { + $firstIndex = ''; + $lastIndex = ''; + $this->mPastTheEndIndex = ''; + } + if ( $this->mIsBackwards ) { + $this->mIsFirst = ( $numRows < $queryLimit ); + $this->mIsLast = ( $this->mOffset == '' ); + $this->mLastShown = $firstIndex; + $this->mFirstShown = $lastIndex; + } else { + $this->mIsFirst = ( $this->mOffset == '' ); + $this->mIsLast = ( $numRows < $queryLimit ); + $this->mLastShown = $lastIndex; + $this->mFirstShown = $firstIndex; + } + $this->mQueryDone = true; + } + + /** + * @param bool $enable + */ + protected function preventClickjacking( $enable = true ) { + $this->preventClickjacking = $enable; + } + + /** + * @return bool + */ + public function getPreventClickjacking() { + return $this->preventClickjacking; + } + +} diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php index 0ba1328c0e..d171e89bf8 100644 --- a/includes/page/ImagePage.php +++ b/includes/page/ImagePage.php @@ -1242,497 +1242,3 @@ EOT } } - -/** - * Builds the image revision log shown on image pages - * - * @ingroup Media - */ -class ImageHistoryList extends ContextSource { - - /** - * @var Title - */ - protected $title; - - /** - * @var File - */ - protected $img; - - /** - * @var ImagePage - */ - protected $imagePage; - - /** - * @var File - */ - protected $current; - - protected $repo, $showThumb; - protected $preventClickjacking = false; - - /** - * @param ImagePage $imagePage - */ - public function __construct( $imagePage ) { - global $wgShowArchiveThumbnails; - $this->current = $imagePage->getFile(); - $this->img = $imagePage->getDisplayedFile(); - $this->title = $imagePage->getTitle(); - $this->imagePage = $imagePage; - $this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender(); - $this->setContext( $imagePage->getContext() ); - } - - /** - * @return ImagePage - */ - public function getImagePage() { - return $this->imagePage; - } - - /** - * @return File - */ - public function getFile() { - return $this->img; - } - - /** - * @param string $navLinks - * @return string - */ - public function beginImageHistoryList( $navLinks = '' ) { - return Xml::element( 'h2', array( 'id' => 'filehistory' ), $this->msg( 'filehist' )->text() ) - . "\n" - . "
\n" - . $this->msg( 'filehist-help' )->parseAsBlock() - . $navLinks . "\n" - . Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n" - . '' - . ( $this->current->isLocal() - && ( $this->getUser()->isAllowedAny( 'delete', 'deletedhistory' ) ) ? '' : '' ) - . '' . $this->msg( 'filehist-datetime' )->escaped() . '' - . ( $this->showThumb ? '' . $this->msg( 'filehist-thumb' )->escaped() . '' : '' ) - . '' . $this->msg( 'filehist-dimensions' )->escaped() . '' - . '' . $this->msg( 'filehist-user' )->escaped() . '' - . '' . $this->msg( 'filehist-comment' )->escaped() . '' - . "\n"; - } - - /** - * @param string $navLinks - * @return string - */ - public function endImageHistoryList( $navLinks = '' ) { - return "\n$navLinks\n
\n"; - } - - /** - * @param bool $iscur - * @param File $file - * @return string - */ - public function imageHistoryLine( $iscur, $file ) { - global $wgContLang; - - $user = $this->getUser(); - $lang = $this->getLanguage(); - $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() ); - $img = $iscur ? $file->getName() : $file->getArchiveName(); - $userId = $file->getUser( 'id' ); - $userText = $file->getUser( 'text' ); - $description = $file->getDescription( File::FOR_THIS_USER, $user ); - - $local = $this->current->isLocal(); - $row = $selected = ''; - - // Deletion link - if ( $local && ( $user->isAllowedAny( 'delete', 'deletedhistory' ) ) ) { - $row .= ''; - # Link to remove from history - if ( $user->isAllowed( 'delete' ) ) { - $q = array( 'action' => 'delete' ); - if ( !$iscur ) { - $q['oldimage'] = $img; - } - $row .= Linker::linkKnown( - $this->title, - $this->msg( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' )->escaped(), - array(), $q - ); - } - # Link to hide content. Don't show useless link to people who cannot hide revisions. - $canHide = $user->isAllowed( 'deleterevision' ); - if ( $canHide || ( $user->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) { - if ( $user->isAllowed( 'delete' ) ) { - $row .= '
'; - } - // If file is top revision or locked from this user, don't link - if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED, $user ) ) { - $del = Linker::revDeleteLinkDisabled( $canHide ); - } else { - list( $ts, ) = explode( '!', $img, 2 ); - $query = array( - 'type' => 'oldimage', - 'target' => $this->title->getPrefixedText(), - 'ids' => $ts, - ); - $del = Linker::revDeleteLink( $query, - $file->isDeleted( File::DELETED_RESTRICTED ), $canHide ); - } - $row .= $del; - } - $row .= ''; - } - - // Reversion link/current indicator - $row .= ''; - if ( $iscur ) { - $row .= $this->msg( 'filehist-current' )->escaped(); - } elseif ( $local && $this->title->quickUserCan( 'edit', $user ) - && $this->title->quickUserCan( 'upload', $user ) - ) { - if ( $file->isDeleted( File::DELETED_FILE ) ) { - $row .= $this->msg( 'filehist-revert' )->escaped(); - } else { - $row .= Linker::linkKnown( - $this->title, - $this->msg( 'filehist-revert' )->escaped(), - array(), - array( - 'action' => 'revert', - 'oldimage' => $img, - 'wpEditToken' => $user->getEditToken( $img ) - ) - ); - } - } - $row .= ''; - - // Date/time and image link - if ( $file->getTimestamp() === $this->img->getTimestamp() ) { - $selected = "class='filehistory-selected'"; - } - $row .= ""; - if ( !$file->userCan( File::DELETED_FILE, $user ) ) { - # Don't link to unviewable files - $row .= '' - . $lang->userTimeAndDate( $timestamp, $user ) . ''; - } elseif ( $file->isDeleted( File::DELETED_FILE ) ) { - if ( $local ) { - $this->preventClickjacking(); - $revdel = SpecialPage::getTitleFor( 'Revisiondelete' ); - # Make a link to review the image - $url = Linker::linkKnown( - $revdel, - $lang->userTimeAndDate( $timestamp, $user ), - array(), - array( - 'target' => $this->title->getPrefixedText(), - 'file' => $img, - 'token' => $user->getEditToken( $img ) - ) - ); - } else { - $url = $lang->userTimeAndDate( $timestamp, $user ); - } - $row .= '' . $url . ''; - } elseif ( !$file->exists() ) { - $row .= '' - . $lang->userTimeAndDate( $timestamp, $user ) . ''; - } else { - $url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img ); - $row .= Xml::element( - 'a', - array( 'href' => $url ), - $lang->userTimeAndDate( $timestamp, $user ) - ); - } - $row .= ""; - - // Thumbnail - if ( $this->showThumb ) { - $row .= '' . $this->getThumbForLine( $file ) . ''; - } - - // Image dimensions + size - $row .= ''; - $row .= htmlspecialchars( $file->getDimensionsString() ); - $row .= $this->msg( 'word-separator' )->escaped(); - $row .= ''; - $row .= $this->msg( 'parentheses' )->sizeParams( $file->getSize() )->escaped(); - $row .= ''; - $row .= ''; - - // Uploading user - $row .= ''; - // Hide deleted usernames - if ( $file->isDeleted( File::DELETED_USER ) ) { - $row .= '' - . $this->msg( 'rev-deleted-user' )->escaped() . ''; - } else { - if ( $local ) { - $row .= Linker::userLink( $userId, $userText ); - $row .= ''; - $row .= Linker::userToolLinks( $userId, $userText ); - $row .= ''; - } else { - $row .= htmlspecialchars( $userText ); - } - } - $row .= ''; - - // Don't show deleted descriptions - if ( $file->isDeleted( File::DELETED_COMMENT ) ) { - $row .= '' . - $this->msg( 'rev-deleted-comment' )->escaped() . ''; - } else { - $row .= '' . - Linker::formatComment( $description, $this->title ) . ''; - } - - $rowClass = null; - Hooks::run( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) ); - $classAttr = $rowClass ? " class='$rowClass'" : ''; - - return "{$row}\n"; - } - - /** - * @param File $file - * @return string - */ - protected function getThumbForLine( $file ) { - $lang = $this->getLanguage(); - $user = $this->getUser(); - if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE, $user ) - && !$file->isDeleted( File::DELETED_FILE ) - ) { - $params = array( - 'width' => '120', - 'height' => '120', - ); - $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() ); - - $thumbnail = $file->transform( $params ); - $options = array( - 'alt' => $this->msg( 'filehist-thumbtext', - $lang->userTimeAndDate( $timestamp, $user ), - $lang->userDate( $timestamp, $user ), - $lang->userTime( $timestamp, $user ) )->text(), - 'file-link' => true, - ); - - if ( !$thumbnail ) { - return $this->msg( 'filehist-nothumb' )->escaped(); - } - - return $thumbnail->toHtml( $options ); - } else { - return $this->msg( 'filehist-nothumb' )->escaped(); - } - } - - /** - * @param bool $enable - */ - protected function preventClickjacking( $enable = true ) { - $this->preventClickjacking = $enable; - } - - /** - * @return bool - */ - public function getPreventClickjacking() { - return $this->preventClickjacking; - } -} - -class ImageHistoryPseudoPager extends ReverseChronologicalPager { - protected $preventClickjacking = false; - - /** - * @var File - */ - protected $mImg; - - /** - * @var Title - */ - protected $mTitle; - - /** - * @param ImagePage $imagePage - */ - function __construct( $imagePage ) { - parent::__construct( $imagePage->getContext() ); - $this->mImagePage = $imagePage; - $this->mTitle = clone $imagePage->getTitle(); - $this->mTitle->setFragment( '#filehistory' ); - $this->mImg = null; - $this->mHist = array(); - $this->mRange = array( 0, 0 ); // display range - } - - /** - * @return Title - */ - function getTitle() { - return $this->mTitle; - } - - function getQueryInfo() { - return false; - } - - /** - * @return string - */ - function getIndexField() { - return ''; - } - - /** - * @param object $row - * @return string - */ - function formatRow( $row ) { - return ''; - } - - /** - * @return string - */ - function getBody() { - $s = ''; - $this->doQuery(); - if ( count( $this->mHist ) ) { - if ( $this->mImg->isLocal() ) { - // Do a batch existence check for user pages and talkpages - $linkBatch = new LinkBatch(); - for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) { - $file = $this->mHist[$i]; - $user = $file->getUser( 'text' ); - $linkBatch->add( NS_USER, $user ); - $linkBatch->add( NS_USER_TALK, $user ); - } - $linkBatch->execute(); - } - - $list = new ImageHistoryList( $this->mImagePage ); - # Generate prev/next links - $navLink = $this->getNavigationBar(); - $s = $list->beginImageHistoryList( $navLink ); - // Skip rows there just for paging links - for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) { - $file = $this->mHist[$i]; - $s .= $list->imageHistoryLine( !$file->isOld(), $file ); - } - $s .= $list->endImageHistoryList( $navLink ); - - if ( $list->getPreventClickjacking() ) { - $this->preventClickjacking(); - } - } - return $s; - } - - function doQuery() { - if ( $this->mQueryDone ) { - return; - } - $this->mImg = $this->mImagePage->getFile(); // ensure loading - if ( !$this->mImg->exists() ) { - return; - } - $queryLimit = $this->mLimit + 1; // limit plus extra row - if ( $this->mIsBackwards ) { - // Fetch the file history - $this->mHist = $this->mImg->getHistory( $queryLimit, null, $this->mOffset, false ); - // The current rev may not meet the offset/limit - $numRows = count( $this->mHist ); - if ( $numRows <= $this->mLimit && $this->mImg->getTimestamp() > $this->mOffset ) { - $this->mHist = array_merge( array( $this->mImg ), $this->mHist ); - } - } else { - // The current rev may not meet the offset - if ( !$this->mOffset || $this->mImg->getTimestamp() < $this->mOffset ) { - $this->mHist[] = $this->mImg; - } - // Old image versions (fetch extra row for nav links) - $oiLimit = count( $this->mHist ) ? $this->mLimit : $this->mLimit + 1; - // Fetch the file history - $this->mHist = array_merge( $this->mHist, - $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) ); - } - $numRows = count( $this->mHist ); // Total number of query results - if ( $numRows ) { - # Index value of top item in the list - $firstIndex = $this->mIsBackwards ? - $this->mHist[$numRows - 1]->getTimestamp() : $this->mHist[0]->getTimestamp(); - # Discard the extra result row if there is one - if ( $numRows > $this->mLimit && $numRows > 1 ) { - if ( $this->mIsBackwards ) { - # Index value of item past the index - $this->mPastTheEndIndex = $this->mHist[0]->getTimestamp(); - # Index value of bottom item in the list - $lastIndex = $this->mHist[1]->getTimestamp(); - # Display range - $this->mRange = array( 1, $numRows - 1 ); - } else { - # Index value of item past the index - $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp(); - # Index value of bottom item in the list - $lastIndex = $this->mHist[$numRows - 2]->getTimestamp(); - # Display range - $this->mRange = array( 0, $numRows - 2 ); - } - } else { - # Setting indexes to an empty string means that they will be - # omitted if they would otherwise appear in URLs. It just so - # happens that this is the right thing to do in the standard - # UI, in all the relevant cases. - $this->mPastTheEndIndex = ''; - # Index value of bottom item in the list - $lastIndex = $this->mIsBackwards ? - $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp(); - # Display range - $this->mRange = array( 0, $numRows - 1 ); - } - } else { - $firstIndex = ''; - $lastIndex = ''; - $this->mPastTheEndIndex = ''; - } - if ( $this->mIsBackwards ) { - $this->mIsFirst = ( $numRows < $queryLimit ); - $this->mIsLast = ( $this->mOffset == '' ); - $this->mLastShown = $firstIndex; - $this->mFirstShown = $lastIndex; - } else { - $this->mIsFirst = ( $this->mOffset == '' ); - $this->mIsLast = ( $numRows < $queryLimit ); - $this->mLastShown = $lastIndex; - $this->mFirstShown = $firstIndex; - } - $this->mQueryDone = true; - } - - /** - * @param bool $enable - */ - protected function preventClickjacking( $enable = true ) { - $this->preventClickjacking = $enable; - } - - /** - * @return bool - */ - public function getPreventClickjacking() { - return $this->preventClickjacking; - } - -}