-{$medialink}{$dirmark}
-$longDesc
+{$medialink}{$dirmark} $longDesc
EOT
);
}
}
- if( !$this->displayImg->isLocal() ) {
+ if ( !$this->displayImg->isLocal() ) {
$this->printSharedImageText();
}
} else {
@@ -486,15 +471,45 @@ EOT
$uploadTitle = SpecialPage::getTitleFor( 'Upload' );
$nofile = array(
'filepage-nofile-link',
- $uploadTitle->getFullUrl( array( 'wpDestFile' => $this->img->getName() ) )
+ $uploadTitle->getFullURL( array( 'wpDestFile' => $this->mPage->getFile()->getName() ) )
);
- }
- else
- {
+ } else {
$nofile = 'filepage-nofile';
}
+ // Note, if there is an image description page, but
+ // no image, then this setRobotPolicy is overriden
+ // by Article::View().
$wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->wrapWikiMsg( "\n$1\n
", $nofile );
+ if ( !$this->getID() && $wgSend404Code ) {
+ // If there is no image, no shared image, and no description page,
+ // output a 404, to be consistent with articles.
+ $wgRequest->response()->header( 'HTTP/1.1 404 Not Found' );
+ }
+ }
+ $wgOut->setFileVersion( $this->displayImg );
+ }
+
+ /**
+ * Creates an thumbnail of specified size and returns an HTML link to it
+ * @param $params array Scaler parameters
+ * @param $width int
+ * @param $height int
+ * @return string
+ */
+ private function makeSizeLink( $params, $width, $height ) {
+ $params['width'] = $width;
+ $params['height'] = $height;
+ $thumbnail = $this->displayImg->transform( $params );
+ if ( $thumbnail && !$thumbnail->isError() ) {
+ return Html::rawElement( 'a', array(
+ 'href' => $thumbnail->getUrl(),
+ 'class' => 'mw-thumbnail-link'
+ ), wfMessage( 'show-big-image-size' )->numParams(
+ $thumbnail->getWidth(), $thumbnail->getHeight()
+ )->parse() );
+ } else {
+ return '';
}
}
@@ -506,14 +521,18 @@ EOT
$this->loadFile();
- $descUrl = $this->img->getDescriptionUrl();
- $descText = $this->img->getDescriptionText();
+ $descUrl = $this->mPage->getFile()->getDescriptionUrl();
+ $descText = $this->mPage->getFile()->getDescriptionText();
+
+ /* Add canonical to head if there is no local page for this shared file */
+ if( $descUrl && $this->mPage->getID() == 0 ) {
+ $wgOut->addLink( array( 'rel' => 'canonical', 'href' => $descUrl ) );
+ }
$wrap = "\n$1\n
\n";
- $repo = $this->img->getRepo()->getDisplayName();
+ $repo = $this->mPage->getFile()->getRepo()->getDisplayName();
- $msg = '';
- if( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-' ) {
+ if ( $descUrl && $descText && wfMsgNoTrans( 'sharedupload-desc-here' ) !== '-' ) {
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-here', $repo, $descUrl ) );
} elseif ( $descUrl && wfMsgNoTrans( 'sharedupload-desc-there' ) !== '-' ) {
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload-desc-there', $repo, $descUrl ) );
@@ -521,7 +540,7 @@ EOT
$wgOut->wrapWikiMsg( $wrap, array( 'sharedupload', $repo ), ''/*BACKCOMPAT*/ );
}
- if( $descText ) {
+ if ( $descText ) {
$this->mExtraDescription = $descText;
}
}
@@ -529,8 +548,8 @@ EOT
public function getUploadUrl() {
$this->loadFile();
$uploadTitle = SpecialPage::getTitleFor( 'Upload' );
- return $uploadTitle->getFullUrl( array(
- 'wpDestFile' => $this->img->getName(),
+ return $uploadTitle->getFullURL( array(
+ 'wpDestFile' => $this->mPage->getFile()->getName(),
'wpForReUpload' => 1
) );
}
@@ -540,168 +559,215 @@ EOT
* external editing (and instructions link) etc.
*/
protected function uploadLinksBox() {
- global $wgUser, $wgOut, $wgEnableUploads;
+ global $wgUser, $wgOut, $wgEnableUploads, $wgUseExternalEditor;
- if( !$wgEnableUploads ) { return; }
+ if ( !$wgEnableUploads ) {
+ return;
+ }
$this->loadFile();
- if( !$this->img->isLocal() )
+ if ( !$this->mPage->getFile()->isLocal() ) {
return;
-
- $sk = $wgUser->getSkin();
+ }
$wgOut->addHTML( "
\n" );
# "Upload a new version of this file" link
- if( UploadBase::userCanReUpload($wgUser,$this->img->name) ) {
- $ulink = $sk->makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
+ if ( UploadBase::userCanReUpload( $wgUser, $this->mPage->getFile()->name ) ) {
+ $ulink = Linker::makeExternalLink( $this->getUploadUrl(), wfMsg( 'uploadnewversion-linktext' ) );
$wgOut->addHTML( "{$ulink}
\n" );
}
# External editing link
- $elink = $sk->link(
- $this->mTitle,
- wfMsgHtml( 'edit-externally' ),
- array(),
- array(
- 'action' => 'edit',
- 'externaledit' => 'true',
- 'mode' => 'file'
- ),
- array( 'known', 'noclasses' )
- );
- $wgOut->addHTML( '- ' . $elink . ' ' . wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) . "
\n" );
+ if ( $wgUseExternalEditor ) {
+ $elink = Linker::link(
+ $this->getTitle(),
+ wfMsgHtml( 'edit-externally' ),
+ array(),
+ array(
+ 'action' => 'edit',
+ 'externaledit' => 'true',
+ 'mode' => 'file'
+ ),
+ array( 'known', 'noclasses' )
+ );
+ $wgOut->addHTML(
+ '- ' . $elink . ' ' .
+ wfMsgExt( 'edit-externally-help', array( 'parseinline' ) ) .
+ "
\n"
+ );
+ }
$wgOut->addHTML( "
\n" );
}
- protected function closeShowImage() {} # For overloading
+ protected function closeShowImage() { } # For overloading
/**
* If the page we've just displayed is in the "Image" namespace,
* we follow it with an upload history of the image and its usage.
*/
protected function imageHistory() {
- global $wgOut, $wgUseExternalEditor;
+ global $wgOut;
$this->loadFile();
$pager = new ImageHistoryPseudoPager( $this );
$wgOut->addHTML( $pager->getBody() );
+ $wgOut->preventClickjacking( $pager->getPreventClickjacking() );
- $this->img->resetHistory(); // free db resources
+ $this->mPage->getFile()->resetHistory(); // free db resources
# Exist check because we don't want to show this on pages where an image
# doesn't exist along with the noimage message, that would suck. -ævar
- if( $wgUseExternalEditor && $this->img->exists() ) {
+ if ( $this->mPage->getFile()->exists() ) {
$this->uploadLinksBox();
}
}
- protected function imageLinks() {
- global $wgUser, $wgOut, $wgLang;
-
- $limit = 100;
-
+ /**
+ * @param $target
+ * @param $limit
+ * @return ResultWrapper
+ */
+ protected function queryImageLinks( $target, $limit ) {
$dbr = wfGetDB( DB_SLAVE );
- $res = $dbr->select(
+ return $dbr->select(
array( 'imagelinks', 'page' ),
- array( 'page_namespace', 'page_title' ),
- array( 'il_to' => $this->mTitle->getDBkey(), 'il_from = page_id' ),
+ array( 'page_namespace', 'page_title', 'page_is_redirect', 'il_to' ),
+ array( 'il_to' => $target, 'il_from = page_id' ),
__METHOD__,
- array( 'LIMIT' => $limit + 1)
+ array( 'LIMIT' => $limit + 1, 'ORDER BY' => 'il_from', )
);
- $count = $dbr->numRows( $res );
- if( $count == 0 ) {
- $wgOut->addHTML( "\n" );
- $wgOut->addWikiMsg( 'nolinkstoimage' );
- $wgOut->addHTML( "
\n" );
+ }
+
+ protected function imageLinks() {
+ global $wgOut, $wgLang;
+
+ $limit = 100;
+
+ $res = $this->queryImageLinks( $this->getTitle()->getDbKey(), $limit + 1);
+ $rows = array();
+ $redirects = array();
+ foreach ( $res as $row ) {
+ if ( $row->page_is_redirect ) {
+ $redirects[$row->page_title] = array();
+ }
+ $rows[] = $row;
+ }
+ $count = count( $rows );
+
+ $hasMore = $count > $limit;
+ if ( !$hasMore && count( $redirects ) ) {
+ $res = $this->queryImageLinks( array_keys( $redirects ),
+ $limit - count( $rows ) + 1 );
+ foreach ( $res as $row ) {
+ $redirects[$row->il_to][] = $row;
+ $count++;
+ }
+ $hasMore = ( $res->numRows() + count( $rows ) ) > $limit;
+ }
+
+ if ( $count == 0 ) {
+ $wgOut->wrapWikiMsg(
+ Html::rawElement( 'div',
+ array( 'id' => 'mw-imagepage-nolinkstoimage' ), "\n$1\n" ),
+ 'nolinkstoimage'
+ );
return;
}
-
+
$wgOut->addHTML( "\n" );
- if( $count <= $limit - 1 ) {
+ if ( !$hasMore ) {
$wgOut->addWikiMsg( 'linkstoimage', $count );
} else {
// More links than the limit. Add a link to [[Special:Whatlinkshere]]
$wgOut->addWikiMsg( 'linkstoimage-more',
$wgLang->formatNum( $limit ),
- $this->mTitle->getPrefixedDBkey()
+ $this->getTitle()->getPrefixedDBkey()
);
}
- $wgOut->addHTML( "
\n" );
- $sk = $wgUser->getSkin();
+ $wgOut->addHTML(
+ Html::openElement( 'ul',
+ array( 'class' => 'mw-imagepage-linkstoimage' ) ) . "\n"
+ );
$count = 0;
- while ( $s = $res->fetchObject() ) {
- $count++;
- if( $count <= $limit ) {
- // We have not yet reached the extra one that tells us there is more to fetch
- $link = $sk->link(
- Title::makeTitle( $s->page_namespace, $s->page_title ),
- null,
- array(),
- array(),
- array( 'known', 'noclasses' )
- );
- $wgOut->addHTML( "- {$link}
\n" );
- }
- }
- $wgOut->addHTML( "
\n" );
- $res->free();
- // Add a links to [[Special:Whatlinkshere]]
- if( $count > $limit )
- $wgOut->addWikiMsg( 'morelinkstoimage', $this->mTitle->getPrefixedDBkey() );
- $wgOut->addHTML( "
\n" );
- }
-
- protected function imageRedirects() {
- global $wgUser, $wgOut, $wgLang;
+ // Sort the list by namespace:title
+ usort( $rows, array( $this, 'compare' ) );
- $redirects = $this->getTitle()->getRedirectsHere( NS_FILE );
- if( count( $redirects ) == 0 ) return;
+ // Create links for every element
+ $currentCount = 0;
+ foreach( $rows as $element ) {
+ $currentCount++;
+ if ( $currentCount > $limit ) {
+ break;
+ }
- $wgOut->addHTML( "\n" );
- $wgOut->addWikiMsg( 'redirectstofile',
- $wgLang->formatNum( count( $redirects ) )
- );
- $wgOut->addHTML( "
\n" );
+ $link = Linker::linkKnown( Title::makeTitle( $element->page_namespace, $element->page_title ) );
+ if ( !isset( $redirects[$element->page_title] ) ) {
+ $liContents = $link;
+ } else {
+ $ul = "\n";
+ foreach ( $redirects[$element->page_title] as $row ) {
+ $currentCount++;
+ if ( $currentCount > $limit ) {
+ break;
+ }
- $sk = $wgUser->getSkin();
- foreach ( $redirects as $title ) {
- $link = $sk->link(
- $title,
- null,
- array(),
- array( 'redirect' => 'no' ),
- array( 'known', 'noclasses' )
+ $link2 = Linker::linkKnown( Title::makeTitle( $row->page_namespace, $row->page_title ) );
+ $ul .= Html::rawElement(
+ 'li',
+ array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ $link2
+ ) . "\n";
+ }
+ $ul .= '
';
+ $liContents = wfMessage( 'linkstoimage-redirect' )->rawParams(
+ $link, $ul )->parse();
+ }
+ $wgOut->addHTML( Html::rawElement(
+ 'li',
+ array( 'id' => 'mw-imagepage-linkstoimage-ns' . $element->page_namespace ),
+ $liContents
+ ) . "\n"
);
- $wgOut->addHTML( "- {$link}
\n" );
- }
- $wgOut->addHTML( "
\n" );
+ };
+ $wgOut->addHTML( Html::closeElement( 'ul' ) . "\n" );
+ $res->free();
+
+ // Add a links to [[Special:Whatlinkshere]]
+ if ( $count > $limit ) {
+ $wgOut->addWikiMsg( 'morelinkstoimage', $this->getTitle()->getPrefixedDBkey() );
+ }
+ $wgOut->addHTML( Html::closeElement( 'div' ) . "\n" );
}
protected function imageDupes() {
- global $wgOut, $wgUser, $wgLang;
+ global $wgOut, $wgLang;
$this->loadFile();
- $dupes = $this->getDuplicates();
- if( count( $dupes ) == 0 ) return;
+ $dupes = $this->mPage->getDuplicates();
+ if ( count( $dupes ) == 0 ) {
+ return;
+ }
$wgOut->addHTML( "\n" );
$wgOut->addWikiMsg( 'duplicatesoffile',
- $wgLang->formatNum( count( $dupes ) ), $this->mTitle->getDBkey()
+ $wgLang->formatNum( count( $dupes ) ), $this->getTitle()->getDBkey()
);
$wgOut->addHTML( "
\n" );
- $sk = $wgUser->getSkin();
+ /**
+ * @var $file File
+ */
foreach ( $dupes as $file ) {
$fromSrc = '';
- if( $file->isLocal() ) {
- $link = $sk->link(
+ if ( $file->isLocal() ) {
+ $link = Linker::link(
$file->getTitle(),
null,
array(),
@@ -709,7 +775,7 @@ EOT
array( 'known', 'noclasses' )
);
} else {
- $link = $sk->makeExternalLink( $file->getDescriptionUrl(),
+ $link = Linker::makeExternalLink( $file->getDescriptionUrl(),
$file->getTitle()->getPrefixedText() );
$fromSrc = wfMsg( 'shared-repo-from', $file->getRepo()->getDisplayName() );
}
@@ -722,64 +788,46 @@ EOT
* Delete the file, or an earlier version of it
*/
public function delete() {
- global $wgUploadMaintenance;
- if( $wgUploadMaintenance && $this->mTitle && $this->mTitle->getNamespace() == NS_FILE ) {
- global $wgOut;
- $wgOut->wrapWikiMsg( "\n$1
\n", array( 'filedelete-maintenance' ) );
- return;
- }
-
- $this->loadFile();
- if( !$this->img->exists() || !$this->img->isLocal() || $this->img->getRedirected() ) {
+ $file = $this->mPage->getFile();
+ if ( !$file->exists() || !$file->isLocal() || $file->getRedirected() ) {
// Standard article deletion
- Article::delete();
+ parent::delete();
return;
}
- $deleter = new FileDeleteForm( $this->img );
- $deleter->execute();
- }
-
- /**
- * Revert the file to an earlier version
- */
- public function revert() {
- $this->loadFile();
- $reverter = new FileRevertForm( $this->img );
- $reverter->execute();
- }
- /**
- * Override handling of action=purge
- */
- public function doPurge() {
- $this->loadFile();
- if( $this->img->exists() ) {
- wfDebug( "ImagePage::doPurge purging " . $this->img->getName() . "\n" );
- $update = new HTMLCacheUpdate( $this->mTitle, 'imagelinks' );
- $update->doUpdate();
- $this->img->upgradeRow();
- $this->img->purgeCache();
- } else {
- wfDebug( "ImagePage::doPurge no image for " . $this->img->getName() . "; limiting purge to cache only\n" );
- // even if the file supposedly doesn't exist, force any cached information
- // to be updated (in case the cached information is wrong)
- $this->img->purgeCache();
- }
- parent::doPurge();
+ $deleter = new FileDeleteForm( $file );
+ $deleter->execute();
}
/**
* Display an error with a wikitext description
+ *
+ * @param $description String
*/
function showError( $description ) {
global $wgOut;
- $wgOut->setPageTitle( wfMsg( "internalerror" ) );
- $wgOut->setRobotPolicy( "noindex,nofollow" );
+ $wgOut->setPageTitle( wfMessage( 'internalerror' ) );
+ $wgOut->setRobotPolicy( 'noindex,nofollow' );
$wgOut->setArticleRelated( false );
$wgOut->enableClientCache( false );
$wgOut->addWikiText( $description );
}
+ /**
+ * Callback for usort() to do link sorts by (namespace, title)
+ * Function copied from Title::compare()
+ *
+ * @param $a object page to compare with
+ * @param $b object page to compare with
+ * @return Integer: result of string comparison, or namespace comparison
+ */
+ protected function compare( $a, $b ) {
+ if ( $a->page_namespace == $b->page_namespace ) {
+ return strcmp( $a->page_title, $b->page_title );
+ } else {
+ return $a->page_namespace - $b->page_namespace;
+ }
+ }
}
/**
@@ -789,11 +837,34 @@ EOT
*/
class ImageHistoryList {
- protected $imagePage, $img, $skin, $title, $repo, $showThumb;
+ /**
+ * @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 $wgUser, $wgShowArchiveThumbnails;
- $this->skin = $wgUser->getSkin();
+ global $wgShowArchiveThumbnails;
$this->current = $imagePage->getFile();
$this->img = $imagePage->getDisplayedFile();
$this->title = $imagePage->getTitle();
@@ -801,18 +872,24 @@ class ImageHistoryList {
$this->showThumb = $wgShowArchiveThumbnails && $this->img->canRender();
}
+ /**
+ * @return ImagePage
+ */
public function getImagePage() {
return $this->imagePage;
}
- public function getSkin() {
- return $this->skin;
- }
-
+ /**
+ * @return File
+ */
public function getFile() {
return $this->img;
}
+ /**
+ * @param $navLinks string
+ * @return string
+ */
public function beginImageHistoryList( $navLinks = '' ) {
global $wgOut, $wgUser;
return Xml::element( 'h2', array( 'id' => 'filehistory' ), wfMsg( 'filehist' ) ) . "\n"
@@ -821,7 +898,7 @@ class ImageHistoryList {
. $navLinks . "\n"
. Xml::openElement( 'table', array( 'class' => 'wikitable filehistory' ) ) . "\n"
. ' | '
- . ( $this->current->isLocal() && ($wgUser->isAllowed('delete') || $wgUser->isAllowed('deletedhistory') ) ? ' | ' : '' )
+ . ( $this->current->isLocal() && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ? ' | ' : '' )
. '' . wfMsgHtml( 'filehist-datetime' ) . ' | '
. ( $this->showThumb ? '' . wfMsgHtml( 'filehist-thumb' ) . ' | ' : '' )
. '' . wfMsgHtml( 'filehist-dimensions' ) . ' | '
@@ -830,82 +907,86 @@ class ImageHistoryList {
. "
\n";
}
+ /**
+ * @param $navLinks string
+ * @return string
+ */
public function endImageHistoryList( $navLinks = '' ) {
return "\n$navLinks\n
\n";
}
+ /**
+ * @param $iscur
+ * @param $file File
+ * @return string
+ */
public function imageHistoryLine( $iscur, $file ) {
- global $wgUser, $wgLang, $wgContLang, $wgTitle;
+ global $wgUser, $wgLang, $wgContLang;
- $timestamp = wfTimestamp(TS_MW, $file->getTimestamp());
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
$img = $iscur ? $file->getName() : $file->getArchiveName();
- $user = $file->getUser('id');
- $usertext = $file->getUser('text');
+ $user = $file->getUser( 'id' );
+ $usertext = $file->getUser( 'text' );
$description = $file->getDescription();
$local = $this->current->isLocal();
- $row = $css = $selected = '';
+ $row = $selected = '';
// Deletion link
- if( $local && ($wgUser->isAllowed('delete') || $wgUser->isAllowed('deletedhistory') ) ) {
+ if ( $local && ( $wgUser->isAllowedAny( 'delete', 'deletedhistory' ) ) ) {
$row .= '';
# Link to remove from history
- if( $wgUser->isAllowed( 'delete' ) ) {
+ if ( $wgUser->isAllowed( 'delete' ) ) {
$q = array( 'action' => 'delete' );
- if( !$iscur )
+ if ( !$iscur ) {
$q['oldimage'] = $img;
- $row .= $this->skin->link(
+ }
+ $row .= Linker::link(
$this->title,
wfMsgHtml( $iscur ? 'filehist-deleteall' : 'filehist-deleteone' ),
array(), $q, array( 'known' )
);
}
# Link to hide content. Don't show useless link to people who cannot hide revisions.
- if( $wgUser->isAllowed('deleterevision') || ($wgUser->isAllowed('deletedhistory') && $file->getVisibility()) ) {
- if( $wgUser->isAllowed('delete') ) {
- $row .= ' ';
+ $canHide = $wgUser->isAllowed( 'deleterevision' );
+ if ( $canHide || ( $wgUser->isAllowed( 'deletedhistory' ) && $file->getVisibility() ) ) {
+ if ( $wgUser->isAllowed( 'delete' ) ) {
+ $row .= ' ';
}
// If file is top revision or locked from this user, don't link
- if( $iscur || !$file->userCan(File::DELETED_RESTRICTED) ) {
- $del = wfMsgHtml( 'rev-delundel' );
+ if ( $iscur || !$file->userCan( File::DELETED_RESTRICTED ) ) {
+ $del = Linker::revDeleteLinkDisabled( $canHide );
} else {
list( $ts, $name ) = explode( '!', $img, 2 );
- $del = $this->skin->link(
- SpecialPage::getTitleFor( 'Revisiondelete' ),
- wfMsgHtml( 'rev-delundel' ),
- array(),
- array(
- 'type' => 'oldimage',
- 'target' => $wgTitle->getPrefixedText(),
- 'ids' => $ts,
- ),
- array( 'known' )
+ $query = array(
+ 'type' => 'oldimage',
+ 'target' => $this->title->getPrefixedText(),
+ 'ids' => $ts,
);
- // Bolden oversighted content
- if( $file->isDeleted(File::DELETED_RESTRICTED) )
- $del = "$del";
+ $del = Linker::revDeleteLink( $query,
+ $file->isDeleted( File::DELETED_RESTRICTED ), $canHide );
}
- $row .= "$del";
+ $row .= $del;
}
$row .= ' | ';
}
// Reversion link/current indicator
$row .= '';
- if( $iscur ) {
+ if ( $iscur ) {
$row .= wfMsgHtml( 'filehist-current' );
- } elseif( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
- if( $file->isDeleted(File::DELETED_FILE) ) {
- $row .= wfMsgHtml('filehist-revert');
+ } elseif ( $local && $wgUser->isLoggedIn() && $this->title->userCan( 'edit' ) ) {
+ if ( $file->isDeleted( File::DELETED_FILE ) ) {
+ $row .= wfMsgHtml( 'filehist-revert' );
} else {
- $row .= $this->skin->link(
+ $row .= Linker::link(
$this->title,
wfMsgHtml( 'filehist-revert' ),
array(),
array(
'action' => 'revert',
'oldimage' => $img,
- 'wpEditToken' => $wgUser->editToken( $img )
+ 'wpEditToken' => $wgUser->getEditToken( $img )
),
array( 'known', 'noclasses' )
);
@@ -914,28 +995,33 @@ class ImageHistoryList {
$row .= ' | ';
// Date/time and image link
- if( $file->getTimestamp() === $this->img->getTimestamp() ) {
+ if ( $file->getTimestamp() === $this->img->getTimestamp() ) {
$selected = "class='filehistory-selected'";
}
$row .= "";
- if( !$file->userCan(File::DELETED_FILE) ) {
+ if ( !$file->userCan( File::DELETED_FILE ) ) {
# Don't link to unviewable files
$row .= '' . $wgLang->timeAndDate( $timestamp, true ) . '';
- } elseif( $file->isDeleted(File::DELETED_FILE) ) {
- $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
- # Make a link to review the image
- $url = $this->skin->link(
- $revdel,
- $wgLang->timeAndDate( $timestamp, true ),
- array(),
- array(
- 'target' => $wgTitle->getPrefixedText(),
- 'file' => $img,
- 'token' => $wgUser->editToken( $img )
- ),
- array( 'known', 'noclasses' )
- );
- $row .= ''.$url.'';
+ } elseif ( $file->isDeleted( File::DELETED_FILE ) ) {
+ if ( $local ) {
+ $this->preventClickjacking();
+ $revdel = SpecialPage::getTitleFor( 'Revisiondelete' );
+ # Make a link to review the image
+ $url = Linker::link(
+ $revdel,
+ $wgLang->timeAndDate( $timestamp, true ),
+ array(),
+ array(
+ 'target' => $this->title->getPrefixedText(),
+ 'file' => $img,
+ 'token' => $wgUser->getEditToken( $img )
+ ),
+ array( 'known', 'noclasses' )
+ );
+ } else {
+ $url = $wgLang->timeAndDate( $timestamp, true );
+ }
+ $row .= '' . $url . '';
} else {
$url = $iscur ? $this->current->getUrl() : $this->current->getArchiveUrl( $img );
$row .= Xml::element( 'a', array( 'href' => $url ), $wgLang->timeAndDate( $timestamp, true ) );
@@ -950,47 +1036,51 @@ class ImageHistoryList {
// Image dimensions + size
$row .= ' | ';
$row .= htmlspecialchars( $file->getDimensionsString() );
- $row .= " (" . $this->skin->formatSize( $file->getSize() ) . ')';
+ $row .= ' (' . Linker::formatSize( $file->getSize() ) . ')';
$row .= ' | ';
// Uploading user
$row .= '';
- if( $local ) {
- // Hide deleted usernames
- if( $file->isDeleted(File::DELETED_USER) ) {
- $row .= '' . wfMsgHtml( 'rev-deleted-user' ) . '';
+ // Hide deleted usernames
+ if ( $file->isDeleted( File::DELETED_USER ) ) {
+ $row .= '' . wfMsgHtml( 'rev-deleted-user' ) . '';
+ } else {
+ if ( $local ) {
+ $row .= Linker::userLink( $user, $usertext ) . ' ' .
+ Linker::userToolLinks( $user, $usertext ) . '';
} else {
- $row .= $this->skin->userLink( $user, $usertext ) . " " .
- $this->skin->userToolLinks( $user, $usertext ) . "";
+ $row .= htmlspecialchars( $usertext );
}
- } else {
- $row .= htmlspecialchars( $usertext );
}
- $row .= ' | ';
+ $row .= ' | ';
// Don't show deleted descriptions
- if( $file->isDeleted(File::DELETED_COMMENT) ) {
- $row .= '' . wfMsgHtml('rev-deleted-comment') . '';
+ if ( $file->isDeleted( File::DELETED_COMMENT ) ) {
+ $row .= '' . wfMsgHtml( 'rev-deleted-comment' ) . ' | ';
} else {
- $row .= $this->skin->commentBlock( $description, $this->title );
+ $row .= '' . Linker::formatComment( $description, $this->title ) . ' | ';
}
- $row .= '';
+ $rowClass = null;
wfRunHooks( 'ImagePageFileHistoryLine', array( $this, $file, &$row, &$rowClass ) );
- $classAttr = $rowClass ? " class='$rowClass'" : "";
+ $classAttr = $rowClass ? " class='$rowClass'" : '';
return "{$row}
\n";
}
+ /**
+ * @param $file File
+ * @return string
+ */
protected function getThumbForLine( $file ) {
global $wgLang;
- if( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
+ if ( $file->allowInlineDisplay() && $file->userCan( File::DELETED_FILE ) && !$file->isDeleted( File::DELETED_FILE ) ) {
$params = array(
'width' => '120',
'height' => '120',
);
- $timestamp = wfTimestamp(TS_MW, $file->getTimestamp());
+ $timestamp = wfTimestamp( TS_MW, $file->getTimestamp() );
$thumbnail = $file->transform( $params );
$options = array(
@@ -1000,27 +1090,61 @@ class ImageHistoryList {
$wgLang->time( $timestamp, true ) ),
'file-link' => true,
);
-
- if ( !$thumbnail ) return wfMsgHtml( 'filehist-nothumb' );
+
+ if ( !$thumbnail ) {
+ return wfMsgHtml( 'filehist-nothumb' );
+ }
return $thumbnail->toHtml( $options );
} else {
return wfMsgHtml( 'filehist-nothumb' );
}
}
+
+ /**
+ * @param $enable bool
+ */
+ 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();
$this->mImagePage = $imagePage;
- $this->mTitle = clone( $imagePage->getTitle() );
+ $this->mTitle = clone ( $imagePage->getTitle() );
$this->mTitle->setFragment( '#filehistory' );
- $this->mImg = NULL;
+ $this->mImg = null;
$this->mHist = array();
$this->mRange = array( 0, 0 ); // display range
}
-
+
+ /**
+ * @return Title
+ */
function getTitle() {
return $this->mTitle;
}
@@ -1029,79 +1153,94 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
return false;
}
+ /**
+ * @return string
+ */
function getIndexField() {
return '';
}
+ /**
+ * @return string
+ */
function formatRow( $row ) {
return '';
}
-
+
+ /**
+ * @return string
+ */
function getBody() {
$s = '';
$this->doQuery();
- if( count($this->mHist) ) {
+ if ( count( $this->mHist ) ) {
$list = new ImageHistoryList( $this->mImagePage );
# Generate prev/next links
$navLink = $this->getNavigationBar();
- $s = $list->beginImageHistoryList($navLink);
+ $s = $list->beginImageHistoryList( $navLink );
// Skip rows there just for paging links
- for( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
+ for ( $i = $this->mRange[0]; $i <= $this->mRange[1]; $i++ ) {
$file = $this->mHist[$i];
$s .= $list->imageHistoryLine( !$file->isOld(), $file );
}
- $s .= $list->endImageHistoryList($navLink);
+ $s .= $list->endImageHistoryList( $navLink );
+
+ if ( $list->getPreventClickjacking() ) {
+ $this->preventClickjacking();
+ }
}
return $s;
}
function doQuery() {
- if( $this->mQueryDone ) return;
+ if ( $this->mQueryDone ) {
+ return;
+ }
$this->mImg = $this->mImagePage->getFile(); // ensure loading
- if( !$this->mImg->exists() ) {
+ if ( !$this->mImg->exists() ) {
return;
}
$queryLimit = $this->mLimit + 1; // limit plus extra row
- if( $this->mIsBackwards ) {
+ if ( $this->mIsBackwards ) {
// Fetch the file history
- $this->mHist = $this->mImg->getHistory($queryLimit,null,$this->mOffset,false);
+ $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 );
+ $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 ) {
+ 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;
+ $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) );
+ $this->mImg->getHistory( $oiLimit, $this->mOffset, null, false ) );
}
- $numRows = count($this->mHist); // Total number of query results
- if( $numRows ) {
+ $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();
+ $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 ) {
+ 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 );
+ $this->mRange = array( 1, $numRows - 1 );
} else {
# Index value of item past the index
- $this->mPastTheEndIndex = $this->mHist[$numRows-1]->getTimestamp();
+ $this->mPastTheEndIndex = $this->mHist[$numRows - 1]->getTimestamp();
# Index value of bottom item in the list
- $lastIndex = $this->mHist[$numRows-2]->getTimestamp();
+ $lastIndex = $this->mHist[$numRows - 2]->getTimestamp();
# Display range
- $this->mRange = array( 0, $numRows-2 );
+ $this->mRange = array( 0, $numRows - 2 );
}
} else {
# Setting indexes to an empty string means that they will be
@@ -1111,16 +1250,16 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
$this->mPastTheEndIndex = '';
# Index value of bottom item in the list
$lastIndex = $this->mIsBackwards ?
- $this->mHist[0]->getTimestamp() : $this->mHist[$numRows-1]->getTimestamp();
+ $this->mHist[0]->getTimestamp() : $this->mHist[$numRows - 1]->getTimestamp();
# Display range
- $this->mRange = array( 0, $numRows-1 );
+ $this->mRange = array( 0, $numRows - 1 );
}
} else {
$firstIndex = '';
$lastIndex = '';
$this->mPastTheEndIndex = '';
}
- if( $this->mIsBackwards ) {
+ if ( $this->mIsBackwards ) {
$this->mIsFirst = ( $numRows < $queryLimit );
$this->mIsLast = ( $this->mOffset == '' );
$this->mLastShown = $firstIndex;
@@ -1133,4 +1272,19 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
}
$this->mQueryDone = true;
}
+
+ /**
+ * @param $enable bool
+ */
+ protected function preventClickjacking( $enable = true ) {
+ $this->preventClickjacking = $enable;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getPreventClickjacking() {
+ return $this->preventClickjacking;
+ }
+
}