Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
MobileFrontendHandlers
0.00% covered (danger)
0.00%
0 / 23
0.00% covered (danger)
0.00%
0 / 6
380
0.00% covered (danger)
0.00%
0 / 1
 shouldShowStoriesOnSkin
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 shouldShowStoriesForAction
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 shouldShowStoriesForUser
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
56
 shouldShowStoriesOnPage
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
12
 shouldShowStories
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
 onBeforePageDisplayMobile
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace MediaWiki\Extension\Wikistories\Hooks;
4
5use ExtensionRegistry;
6use IContextSource;
7use MediaWiki\Config\Config;
8use MediaWiki\Extension\BetaFeatures\BetaFeatures;
9use MediaWiki\Extension\Wikistories\Hooks;
10use MediaWiki\MediaWikiServices;
11use MediaWiki\Output\OutputPage;
12use MediaWiki\Title\Title;
13use MediaWiki\User\Options\UserOptionsLookup;
14use MediaWiki\User\User;
15use MobileFrontend\Hooks\BeforePageDisplayMobileHook;
16use Skin;
17
18class MobileFrontendHandlers implements BeforePageDisplayMobileHook {
19
20    /**
21     * @param Skin $skin
22     * @return bool
23     */
24    private static function shouldShowStoriesOnSkin( Skin $skin ) {
25        return $skin->getSkinName() === 'minerva';
26    }
27
28    /**
29     * @param IContextSource $context
30     * @return bool
31     */
32    private static function shouldShowStoriesForAction( IContextSource $context ) {
33        return $context->getActionName() === 'view' &&
34            $context->getRequest()->getText( 'diff' ) === '';
35    }
36
37    /**
38     * @param User $user
39     * @param Config $config
40     * @return bool
41     */
42    private static function shouldShowStoriesForUser( User $user, Config $config ): bool {
43        if ( Hooks::isBetaDiscoveryMode( $config ) ) {
44            return $user->isNamed()
45                && ExtensionRegistry::getInstance()->isLoaded( 'BetaFeatures' )
46                && BetaFeatures::isFeatureEnabled( $user, BetaFeaturesHandlers::WIKISTORIES_BETA_FEATURE );
47        } elseif ( Hooks::isPublicDiscoveryMode( $config ) ) {
48            /** @var UserOptionsLookup $userOptionsLookup */
49            $userOptionsLookup = MediaWikiServices::getInstance()->getUserOptionsLookup();
50            return ( $user->isAnon() || $user->isTemp() )
51                || (bool)$userOptionsLookup->getOption( $user, Hooks::WIKISTORIES_PREF_SHOW_DISCOVERY, true );
52        } else {
53            // unknown discovery mode
54            return false;
55        }
56    }
57
58    /**
59     * @param Title $title
60     * @return bool
61     */
62    private static function shouldShowStoriesOnPage( Title $title ): bool {
63        return !$title->isMainPage()
64            && $title->inNamespace( NS_MAIN )
65            && $title->exists();
66    }
67
68    /**
69     * @param User $user
70     * @param Title $title
71     * @param Skin $skin
72     * @param IContextSource $context
73     * @return bool
74     */
75    private static function shouldShowStories( User $user, Title $title, Skin $skin, IContextSource $context ): bool {
76        return self::shouldShowStoriesForUser( $user, $context->getConfig() )
77            && self::shouldShowStoriesOnSkin( $skin )
78            && self::shouldShowStoriesOnPage( $title )
79            && self::shouldShowStoriesForAction( $context );
80    }
81
82    /**
83     * @param OutputPage &$out
84     * @param Skin &$skin
85     */
86    public function onBeforePageDisplayMobile( OutputPage &$out, Skin &$skin ) {
87        $title = $out->getTitle();
88        if ( self::shouldShowStories( $out->getUser(), $title, $out->getSkin(), $out->getContext() ) ) {
89            $out->addModules( [ 'ext.wikistories.discover' ] );
90            $out->addModuleStyles( 'ext.wikistories.discover.styles' );
91        }
92    }
93}