function ( MediaWikiServices $services ): Definitions { return new Definitions( RequestContext::getMain(), $services->getSpecialPageFactory() ); }, 'Minerva.Menu.UserMenuDirector' => function ( MediaWikiServices $services ): UserMenuDirector { $options = $services->getService( 'Minerva.SkinOptions' ); $definitions = $services->getService( 'Minerva.Menu.Definitions' ); $context = RequestContext::getMain(); $builder = $options->get( SkinOptions::PERSONAL_MENU ) ? new AdvancedUserMenuBuilder( $context, $context->getUser(), $definitions ) : new DefaultUserMenuBuilder(); return new UserMenuDirector( $builder, $context->getSkin() ); }, 'Minerva.Menu.MainDirector' => function ( MediaWikiServices $services ): MainMenuDirector { $context = RequestContext::getMain(); /** @var SkinOptions $options */ $options = $services->getService( 'Minerva.SkinOptions' ); $definitions = $services->getService( 'Minerva.Menu.Definitions' ); $showMobileOptions = $options->get( SkinOptions::MOBILE_OPTIONS ); $user = $context->getUser(); // Add a donate link (see https://phabricator.wikimedia.org/T219793) $showDonateLink = $options->get( SkinOptions::SHOW_DONATE ); $builder = $options->get( SkinOptions::MAIN_MENU_EXPANDED ) ? new AdvancedMainMenuBuilder( $showMobileOptions, $showDonateLink, $user, $definitions ) : new DefaultMainMenuBuilder( $showMobileOptions, $showDonateLink, $user, $definitions ); return new MainMenuDirector( $builder, $context, $services->getSpecialPageFactory() ); }, 'Minerva.Menu.PageActionsDirector' => function ( MediaWikiServices $services ): PageActionsMenu\PageActionsDirector { /** * @var SkinOptions $skinOptions * @var SkinMinerva $skin * @var SkinUserPageHelper $userPageHelper */ $skinOptions = $services->getService( 'Minerva.SkinOptions' ); $context = RequestContext::getMain(); $title = $context->getTitle(); $user = $context->getUser(); $userPageHelper = $services->getService( 'Minerva.SkinUserPageHelper' ); $languagesHelper = $services->getService( 'Minerva.LanguagesHelper' ); $relevantUserPageHelper = $title->inNamespace( NS_USER_TALK ) ? new SkinUserPageHelper( $context->getSkin()->getRelevantTitle()->getSubjectPage() ) : $userPageHelper; $toolbarBuilder = new PageActionsMenu\ToolbarBuilder( $title, $user, $context, $services->getService( 'Minerva.Permissions' ), $skinOptions, $relevantUserPageHelper, $languagesHelper ); if ( $skinOptions->get( SkinOptions::TOOLBAR_SUBMENU ) ) { $overflowBuilder = $relevantUserPageHelper->isUserPage() ? new PageActionsMenu\UserNamespaceOverflowBuilder( $title, $context, $services->getService( 'Minerva.Permissions' ), $languagesHelper ) : new PageActionsMenu\DefaultOverflowBuilder( $context ); } else { $overflowBuilder = new PageActionsMenu\EmptyOverflowBuilder(); } return new PageActionsMenu\PageActionsDirector( $toolbarBuilder, $overflowBuilder, $context ); }, 'Minerva.SkinUserPageHelper' => function (): SkinUserPageHelper { return new SkinUserPageHelper( RequestContext::getMain()->getSkin()->getRelevantTitle() ); }, 'Minerva.LanguagesHelper' => function (): LanguagesHelper { return new LanguagesHelper( RequestContext::getMain()->getOutput() ); }, 'Minerva.SkinOptions' => function (): SkinOptions { return new SkinOptions(); }, 'Minerva.Permissions' => function ( MediaWikiServices $services ): IMinervaPagePermissions { $permissions = new MinervaPagePermissions( $services->getService( 'Minerva.SkinOptions' ), $services->getService( 'Minerva.LanguagesHelper' ), $services->getPermissionManager() ); // TODO: This should not be allowed, this is basically global $wgTitle and $wgUser. $permissions->setContext( RequestContext::getMain() ); return $permissions; } ];