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: * * * The "edit" action is not allowed if editing is not possible on the page * see @method: isCurrentPageContentModelEditable * * The "switch-language" is allowed if there are interlanguage links on the page, * or $wgMinervaAlwaysShowLanguageButton is truthy. * * @inheritDoc * @throws ConfigException */ public function isAllowed( $action ) { // 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() ) { return ( in_array( $action, $this->config->get( 'MinervaPageActions' ) ) && ( $action === self::TALK || $action === self::SWITCH_LANGUAGE ) ); } 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 ) { $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(); } }