121 lines
3.5 KiB
PHP
121 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Pager;
|
|
|
|
use MediaWiki\Context\IContextSource;
|
|
use MediaWiki\HookContainer\HookRunner;
|
|
use MediaWiki\Html\Html;
|
|
use MediaWiki\Linker\Linker;
|
|
use MediaWiki\Linker\LinkRenderer;
|
|
use MediaWiki\Page\PageIdentity;
|
|
use MediaWiki\Revision\RevisionRecord;
|
|
|
|
/**
|
|
* Generate a set of tools for a revision.
|
|
* @since 1.40
|
|
*/
|
|
class PagerTools {
|
|
/** @var bool */
|
|
private $preventClickjacking = false;
|
|
/** @var array */
|
|
private $tools = [];
|
|
|
|
/**
|
|
* Generate a set of tools for a revision.
|
|
* Will perform permission checks where necessary.
|
|
* @param RevisionRecord $revRecord The revision to generate tools for.
|
|
* @param RevisionRecord|null $previousRevRecord The previous revision (if any). Optional.
|
|
* Used to produce undo links.
|
|
* @param bool $showRollbackLink Whether to show the rollback link. Only set to true if the
|
|
* revision is the latest revision of its page and it has a parent.
|
|
* FIXME why don't we do these checks ourselves?
|
|
* @param HookRunner $hookRunner
|
|
* @param PageIdentity $title The page to generate tools for. It is the caller's responsibility
|
|
* to ensure that the page is already in the link cache.
|
|
* @param IContextSource $context
|
|
* @param LinkRenderer $linkRenderer
|
|
*/
|
|
public function __construct(
|
|
RevisionRecord $revRecord,
|
|
?RevisionRecord $previousRevRecord,
|
|
bool $showRollbackLink,
|
|
HookRunner $hookRunner,
|
|
PageIdentity $title,
|
|
IContextSource $context,
|
|
LinkRenderer $linkRenderer
|
|
) {
|
|
$tools = [];
|
|
$authority = $context->getAuthority();
|
|
# Rollback and undo links
|
|
$userCanEditTitle = $authority->probablyCan( 'edit', $title );
|
|
if ( $showRollbackLink && $userCanEditTitle ) {
|
|
if ( $authority->probablyCan( 'rollback', $title ) ) {
|
|
// Get a rollback link without the brackets
|
|
$rollbackLink = Linker::generateRollback(
|
|
$revRecord,
|
|
$context,
|
|
[ 'noBrackets' ]
|
|
);
|
|
if ( $rollbackLink ) {
|
|
$this->preventClickjacking = true;
|
|
$tools['mw-rollback'] = $rollbackLink;
|
|
}
|
|
}
|
|
}
|
|
if ( $userCanEditTitle && $previousRevRecord ) {
|
|
if ( !$revRecord->isDeleted( RevisionRecord::DELETED_TEXT )
|
|
&& !$previousRevRecord->isDeleted( RevisionRecord::DELETED_TEXT )
|
|
) {
|
|
# Create undo tooltip for the first (=latest) line only
|
|
$undoTooltip = $showRollbackLink
|
|
? [ 'title' => $context->msg( 'tooltip-undo' )->text() ]
|
|
: [];
|
|
$undolink = $linkRenderer->makeKnownLink(
|
|
$title,
|
|
$context->msg( 'editundo' )->text(),
|
|
$undoTooltip,
|
|
[
|
|
'action' => 'edit',
|
|
'undoafter' => $previousRevRecord->getId(),
|
|
'undo' => $revRecord->getId()
|
|
]
|
|
);
|
|
$tools['mw-undo'] = "<span class=\"mw-history-undo\">{$undolink}</span>";
|
|
}
|
|
}
|
|
// Allow extension to add their own links here
|
|
// FIXME previously this was only called on history; restore that and deprecate in favor
|
|
// of a more generic hook (See T326180)
|
|
$hookRunner->onHistoryTools(
|
|
$revRecord,
|
|
$tools,
|
|
$previousRevRecord,
|
|
$authority->getUser()
|
|
);
|
|
$this->tools = $tools;
|
|
}
|
|
|
|
public function shouldPreventClickjacking() {
|
|
return $this->preventClickjacking;
|
|
}
|
|
|
|
public function toHTML() {
|
|
$tools = $this->tools;
|
|
$s2 = '';
|
|
if ( $tools ) {
|
|
$s2 .= ' ' . Html::openElement( 'span', [ 'class' => 'mw-changeslist-links mw-pager-tools' ] );
|
|
foreach ( $tools as $tool ) {
|
|
$s2 .= Html::rawElement( 'span', [], $tool );
|
|
}
|
|
$s2 .= Html::closeElement( 'span' );
|
|
}
|
|
return $s2;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Retain the old class name for backwards compatibility.
|
|
* @deprecated since 1.41
|
|
*/
|
|
class_alias( PagerTools::class, 'PagerTools' );
|