}
// Show a footer allowing the user to patrol the shown revision or page if possible
- $this->showPatrolFooter();
+ $patrolFooterShown = $this->showPatrolFooter();
- wfRunHooks( 'ArticleViewFooter', array( $this ) );
+ wfRunHooks( 'ArticleViewFooter', array( $this, $patrolFooterShown ) );
}
* desired, does nothing.
* Side effect: When the patrol link is build, this method will call
* OutputPage::preventClickjacking() and load mediawiki.page.patrol.ajax.
+ *
+ * @return bool
*/
public function showPatrolFooter() {
- global $wgUseRCPatrol, $wgUseNPPatrol, $wgRCMaxAge;
+ global $wgUseNPPatrol, $wgUseRCPatrol, $wgEnableAPI, $wgEnableWriteAPI;
- $request = $this->getContext()->getRequest();
$outputPage = $this->getContext()->getOutput();
$user = $this->getContext()->getUser();
$cache = wfGetMainCache();
+ $rc = false;
- // Conditions to potentially patrol the current revision
- // patrolPage is set in case we want to patrol the first
- // revision and not the current one (set in Special:NewPages)
- $useRCPatrol = $wgUseRCPatrol && !$request->getBool( 'patrolpage' );
-
- if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || ( !$wgUseNPPatrol && !$wgUseRCPatrol ) ) {
- // Patrolling is fully disabled or the user isn't allowed to
- return;
+ if ( !$this->getTitle()->quickUserCan( 'patrol', $user ) || !( $wgUseRCPatrol || $wgUseNPPatrol ) ) {
+ // Patrolling is disabled or the user isn't allowed to
+ return false;
}
wfProfileIn( __METHOD__ );
- if ( $useRCPatrol ) {
- // Check for cached results
- if ( $cache->get( wfMemcKey( 'NotPatrollableRevId', $this->getRevIdFetched() ) ) ) {
- wfProfileOut( __METHOD__ );
- return;
- }
-
- // We make use of a little index trick over here:
- // First we get the timestamp of the last revision and then
- // we look up the RC row by that as the timestamp is indexed
- // and usually very few rows exist for one timestamp
- // (While several thousand can exists for a single page)
- if ( !$this->mRevision ) {
- $this->mRevision = Revision::newFromId( $this->getRevIdFetched() );
- }
+ // New page patrol: Get the timestamp of the oldest revison which
+ // the revision table holds for the given page. Then we look
+ // whether it's within the RC lifespan and if it is, we try
+ // to get the recentchanges row belonging to that entry
+ // (with rc_new = 1).
- if ( !$this->mRevision || !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 ) ) {
- // The revision is more than 6 hours older than the Max RC age
- // no need to torture the DB any further (6h because the RC might not be cleaned out regularly)
- wfProfileOut( __METHOD__ );
- return;
- }
- $rc = RecentChange::newFromConds(
- array(
- 'rc_this_oldid' => $this->getRevIdFetched(),
- 'rc_timestamp' => $this->mRevision->getTimestamp(),
- 'rc_cur_id' => $this->getTitle()->getArticleID(),
- 'rc_patrolled' => 0
- ),
- __METHOD__,
- array( 'USE INDEX' => 'rc_timestamp' )
- );
- } else {
- // RC patrol is disabled so we have to patrol the first
- // revision (new page patrol) in case it's in the RC table.
- // To achieve this we get the timestamp of the oldest revison
- // the revision table holds for the given page. Then we look
- // whether it's within the RC lifespan and if it is, we try
- // to get the recentchanges row belonging to that entry
- // (with rc_new = 1).
-
- // Check for cached results
- if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
- wfProfileOut( __METHOD__ );
- return;
- }
+ // Check for cached results
+ if ( $cache->get( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ) ) ) {
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
- $dbr = wfGetDB( DB_SLAVE );
- $oldestRevisionTimestamp = $dbr->selectField(
- 'revision',
- 'MIN( rev_timestamp )',
- array( 'rev_page' => $this->getTitle()->getArticleID() ),
- __METHOD__
- );
+ if ( $this->mRevision && !RecentChange::isInRCLifespan( $this->mRevision->getTimestamp(), 21600 ) ) {
+ // The current revision is already older than what could be in the RC table
+ // 6h tolerance because the RC might not be cleaned out regularly
+ wfProfileOut( __METHOD__ );
+ return false;
+ }
- if ( !$oldestRevisionTimestamp || !RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 ) ) {
- // We either didn't find the oldest revision for the given page
- // or it's to old for the RC table (with 6h tolerance)
- wfProfileOut( __METHOD__ );
- return;
- }
+ $dbr = wfGetDB( DB_SLAVE );
+ $oldestRevisionTimestamp = $dbr->selectField(
+ 'revision',
+ 'MIN( rev_timestamp )',
+ array( 'rev_page' => $this->getTitle()->getArticleID() ),
+ __METHOD__
+ );
+ if ( $oldestRevisionTimestamp && RecentChange::isInRCLifespan( $oldestRevisionTimestamp, 21600 ) ) {
+ // 6h tolerance because the RC might not be cleaned out regularly
$rc = RecentChange::newFromConds(
array(
'rc_new' => 1,
);
}
- wfProfileOut( __METHOD__ );
-
if ( !$rc ) {
// No RC entry around
// Cache the information we gathered above in case we can't patrol
// Don't cache in case we can patrol as this could change
- if( $useRCPatrol ) {
- $cache->set( wfMemcKey( 'NotPatrollableRevId', $this->getRevIdFetched() ), '1', $wgRCMaxAge );
- } else {
- $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1', $wgRCMaxAge );
- }
+ $cache->set( wfMemcKey( 'NotPatrollablePage', $this->getTitle()->getArticleID() ), '1' );
- return;
+ wfProfileOut( __METHOD__ );
+ return false;
}
$rcid = $rc->getAttribute( 'rc_id' );
$token = $user->getEditToken( $rcid );
$outputPage->preventClickjacking();
- $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+ if ( $wgEnableAPI && $wgEnableWriteAPI && $user->isAllowed( 'writeapi' ) ) {
+ $outputPage->addModules( 'mediawiki.page.patrol.ajax' );
+ }
$link = Linker::linkKnown(
$this->getTitle(),
wfMessage( 'markaspatrolledlink' )->rawParams( $link )->escaped() .
'</div>'
);
+
+ wfProfileOut( __METHOD__ );
+ return true;
}
/**
$this->doDelete( $reason, $suppress );
- if ( $user->isLoggedIn() && $request->getCheck( 'wpWatch' ) != $user->isWatched( $title ) ) {
- if ( $request->getCheck( 'wpWatch' ) ) {
- WatchAction::doWatch( $title, $user );
- } else {
- WatchAction::doUnwatch( $title, $user );
- }
- }
+ WatchAction::doWatchOrUnwatch( $request->getCheck( 'wpWatch' ), $title, $user );
return;
}