public function execute($parameters)
 {
     global $wgContentTranslationUseMagnusTool, $wgContentTranslationTranslateInTarget;
     $out = $this->getOutput();
     $skin = $this->getSkin();
     $request = $this->getRequest();
     $user = $this->getUser();
     $hasToken = $this->hasToken();
     $campaign = $request->getVal('campaign');
     $isCampaign = $this->isValidCampaign($campaign);
     // Direct access, isListed only affects Special:SpecialPages
     if (!ContentTranslationHooks::isEnabledForUser($user)) {
         if ($hasToken || $isCampaign) {
             // User has a token. Enabled cx for the user in this wiki.
             $this->enableCXBetaFeature();
         } else {
             if ($campaign) {
                 // Show login page if the URL has campaign parameter
                 $out->showPermissionsErrorPage(array(array('badaccess-groups')), 'edit');
                 return;
             }
             $out->showErrorPage('nosuchspecialpage', 'nospecialpagetext');
             return;
         }
     }
     // Preloading to avoid FOUC
     $out->addModuleStyles('ext.cx.header.skin');
     if ($hasToken) {
         $out->addModules('ext.cx.translationview');
         // If Wikibase is installed, load the module for linking
         // the published article with the source article
         if ($wgContentTranslationTranslateInTarget && defined('WBC_VERSION')) {
             $out->addModules('ext.cx.wikibase.link');
         }
     } else {
         $out->addModules('ext.cx.dashboard');
         if ($wgContentTranslationUseMagnusTool) {
             $out->addModules('ext.cx.magnuslink');
         }
     }
     $this->setHeaders();
     $out->setArticleBodyOnly(true);
     // Default modules copied from OutputPage::addDefaultModules
     $out->addModules(array('mediawiki.user', 'mediawiki.page.startup', 'mediawiki.page.ready'));
     // Load legacy modules if any, for the skin.
     // Some wikis have Common.js scripts that depend on this module.
     $defaultSkinModules = $skin->getDefaultModules();
     $out->addModules($defaultSkinModules['legacy']);
     Hooks::run('BeforePageDisplay', array(&$out, &$skin));
     // T111668: Make sure we generate the personal tools
     // before we output the head, as extensions may add
     // things using the PersonalUrls hook.
     $toolbarList = Html::rawElement('ul', null, $skin->getPersonalToolsList());
     $out->addHTML($out->headElement($skin));
     $out->addHTML(Html::element('noscript', array(), $this->msg('cx-javascript')->text()));
     $out->addHtml(MWDebug::getDebugHTML($this->getContext()));
     $out->addHTML(Html::rawElement('div', array('id' => 'p-personal'), $toolbarList));
     $out->addHTML($skin->bottomScripts());
     $out->addHTML('</body></html>');
 }
 /**
  * Hook: SpecialContributionsBeforeMainOutput
  * @param int $id
  * @param User $user
  * @param SpecialPage $page
  */
 public static function addNewContributionButton($id, User $user, SpecialPage $page)
 {
     global $wgContentTranslationEventLogging;
     if ($user->getId() === $page->getUser()->getId() && ContentTranslationHooks::isEnabledForUser($user)) {
         // If EventLogging integration is enabled, load the event logging functions module
         if ($wgContentTranslationEventLogging) {
             $page->getOutput()->addModules('ext.cx.eventlogging');
         }
         $page->getOutput()->addModules('ext.cx.contributions.init');
     }
 }