104 $msgs = [
'deletionlog',
'undeleteviewlink',
'diff' ];
105 foreach ( $msgs as $msg ) {
106 $this->messages[$msg] = $this->
msg( $msg )->text();
110 $this->hookRunner =
new HookRunner( $hookContainer );
118 $query = parent::getDefaultQuery();
128 $this->actorMigration->getWhere(
135 if ( !$this->permissionManager->userHasRight( $user,
'deletedhistory' ) ) {
136 $conds[] =
$dbr->bitAnd(
'ar_deleted', RevisionRecord::DELETED_USER ) .
' = 0';
137 } elseif ( !$this->permissionManager->userHasAnyRight( $user,
'suppressrevision',
'viewsuppressed' ) ) {
138 $conds[] =
$dbr->bitAnd(
'ar_deleted', RevisionRecord::SUPPRESSED_USER ) .
139 ' != ' . RevisionRecord::SUPPRESSED_USER;
142 $commentQuery = $this->commentStore->getJoin(
'ar_comment' );
143 $actorQuery = $this->actorMigration->getJoin(
'ar_user' );
146 'tables' => [
'archive' ] + $commentQuery[
'tables'] + $actorQuery[
'tables'],
148 'ar_rev_id',
'ar_id',
'ar_namespace',
'ar_title',
'ar_timestamp',
149 'ar_minor_edit',
'ar_deleted'
150 ] + $commentQuery[
'fields'] + $actorQuery[
'fields'],
153 'join_conds' => $commentQuery[
'joins'] + $actorQuery[
'joins'],
167 $data = [ parent::reallyDoQuery( $offset, $limit, $order ) ];
171 $this->hookRunner->onDeletedContribsPager__reallyDoQuery(
172 $data, $this, $offset, $limit, $order );
177 foreach ( $data as $query ) {
178 foreach ( $query as $i => $row ) {
185 if ( $order === self::QUERY_ASCENDING ) {
192 $result = array_slice( $result, 0, $limit );
195 $result = array_values( $result );
201 return 'ar_timestamp';
208 return $this->target;
215 return $this->namespace;
227 if ( isset( $this->mNavigationBar ) ) {
228 return $this->mNavigationBar;
232 'prev' => $this->msg(
'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
233 'next' => $this->msg(
'pager-older-n' )->numParams( $this->mLimit )->escaped(),
234 'first' => $this->msg(
'histlast' )->escaped(),
235 'last' => $this->msg(
'histfirst' )->escaped()
238 $pagingLinks = $this->getPagingLinks( $linkTexts );
239 $limitLinks = $this->getLimitLinks();
240 $lang = $this->getLanguage();
241 $limits =
$lang->pipeList( $limitLinks );
243 $firstLast =
$lang->pipeList( [ $pagingLinks[
'first'], $pagingLinks[
'last'] ] );
244 $firstLast = $this->msg(
'parentheses' )->rawParams( $firstLast )->escaped();
245 $prevNext = $this->msg(
'viewprevnext' )
247 $pagingLinks[
'prev'],
248 $pagingLinks[
'next'],
251 $separator = $this->msg(
'word-separator' )->escaped();
252 $this->mNavigationBar = $firstLast . $separator . $prevNext;
254 return $this->mNavigationBar;
258 if ( $this->
namespace !==
'' ) {
259 return [
'ar_namespace' => (int)$this->
namespace ];
284 Wikimedia\suppressWarnings();
286 $revRecord = $this->revisionFactory->newRevisionFromArchiveRow( $row );
287 $validRevision = (bool)$revRecord->getId();
288 }
catch ( Exception $e ) {
289 $validRevision =
false;
291 Wikimedia\restoreWarnings();
293 if ( $validRevision ) {
294 $attribs[
'data-mw-revid'] = $revRecord->getId();
295 $ret = $this->formatRevisionRow( $row );
299 $this->hookRunner->onDeletedContributionsLineEnding(
300 $this, $ret, $row, $classes, $attribs );
301 $attribs = array_filter( $attribs,
302 [ Sanitizer::class,
'isReservedDataAttribute' ],
306 if ( $classes === [] && $attribs === [] && $ret ===
'' ) {
307 wfDebug(
"Dropping Special:DeletedContribution row that could not be formatted" );
308 $ret =
"<!-- Could not format Special:DeletedContribution row. -->\n";
310 $attribs[
'class'] = $classes;
332 $linkRenderer = $this->getLinkRenderer();
334 $revRecord = $this->revisionFactory->newRevisionFromArchiveRow(
336 RevisionFactory::READ_NORMAL,
343 $dellog = $linkRenderer->makeKnownLink(
345 $this->messages[
'deletionlog'],
349 'page' => $page->getPrefixedText()
353 $reviewlink = $linkRenderer->makeKnownLink(
355 $this->messages[
'undeleteviewlink']
360 if ( $this->permissionManager->userHasRight( $user,
'deletedtext' ) ) {
361 $last = $linkRenderer->makeKnownLink(
363 $this->messages[
'diff'],
366 'target' => $page->getPrefixedText(),
367 'timestamp' => $revRecord->getTimestamp(),
372 $last = htmlspecialchars( $this->messages[
'diff'] );
376 $date = $this->getLanguage()->userTimeAndDate( $revRecord->getTimestamp(), $user );
378 if ( !$this->permissionManager->userHasRight( $user,
'undelete' ) ||
379 !RevisionRecord::userCanBitfield(
380 $revRecord->getVisibility(),
381 RevisionRecord::DELETED_TEXT,
385 $link = htmlspecialchars( $date );
387 $link = $linkRenderer->makeKnownLink(
390 [
'class' =>
'mw-changeslist-date' ],
392 'target' => $page->getPrefixedText(),
393 'timestamp' => $revRecord->getTimestamp()
398 if ( $revRecord->isDeleted( RevisionRecord::DELETED_TEXT ) ) {
399 $link =
'<span class="history-deleted">' . $link .
'</span>';
402 $pagelink = $linkRenderer->makeLink(
405 [
'class' =>
'mw-changeslist-title' ]
408 if ( $revRecord->isMinor() ) {
422 [
'class' =>
'mw-deletedcontribs-tools' ],
423 $this->msg(
'parentheses' )->rawParams( $this->getLanguage()->pipeList(
424 [ $last, $dellog, $reviewlink ] ) )->escaped()
427 $separator =
'<span class="mw-changeslist-separator">. .</span>';
428 $ret =
"{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
430 # Denote if username is redacted for this edit
431 if ( $revRecord->isDeleted( RevisionRecord::DELETED_USER ) ) {
432 $ret .=
" <strong>" . $this->msg(
'rev-deleted-user-contribs' )->escaped() .
"</strong>";