title = $title; $this->config = $config; $this->user = $user; $this->output = $output; $this->skinOptions = $skinOptions; $this->contentHandler = $contentHandler; } /** * Gets whether or not the action is allowed. * * Actions isn't allowed when: *
MinervaPageActions
* configuration variable; or
* $wgMinervaAlwaysShowLanguageButton
is truthy.
*
* @inheritDoc
* @throws ConfigException
*/
public function isAllowed( $action ) {
global $wgHideInterlanguageLinks;
// T206406: Enable "Talk" or "Discussion" button on Main page, also, not forgetting
// the "switch-language" button. But disable "edit" and "watch" actions.
if ( $this->title->isMainPage() ) {
if ( !in_array( $action, $this->config->get( 'MinervaPageActions' ) ) ) {
return false;
}
if ( $action === self::SWITCH_LANGUAGE ) {
return !$wgHideInterlanguageLinks;
}
return $action === self::TALK;
}
if ( $action === self::HISTORY && $this->title->exists() ) {
return $this->skinOptions->get( SkinOptions::OPTIONS_HISTORY_PAGE_ACTIONS );
}
if ( $action === SkinOptions::OPTION_OVERFLOW_SUBMENU ) {
return $this->skinOptions->get( SkinOptions::OPTION_OVERFLOW_SUBMENU );
}
if ( !in_array( $action, $this->config->get( 'MinervaPageActions' ) ) ) {
return false;
}
if ( $action === self::EDIT ) {
return $this->isCurrentPageContentModelEditable();
}
if ( $action === self::WATCH ) {
return $this->title->isWatchable()
? $this->user->isAllowedAll( 'viewmywatchlist', 'editmywatchlist' )
: false;
}
if ( $action === self::SWITCH_LANGUAGE ) {
if ( $wgHideInterlanguageLinks ) {
return false;
}
$hasVariants = $this->title->getPageLanguage()->hasVariants();
$hasLanguages = count( $this->output->getLanguageLinks() );
return $hasVariants || $hasLanguages ||
$this->config->get( 'MinervaAlwaysShowLanguageButton' );
}
return true;
}
/**
* @inheritDoc
*/
public function isTalkAllowed() {
return $this->isAllowed( self::TALK ) &&
( $this->title->isTalkPage() || $this->title->canHaveTalkPage() ) &&
$this->user->isLoggedIn();
}
/**
* Checks whether the editor can handle the existing content handler type.
*
* @return bool
*/
protected function isCurrentPageContentModelEditable() {
return $this->contentHandler->supportsDirectEditing()
&& $this->contentHandler->supportsDirectApiEditing();
}
}