Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
ActionPageFactory
100.00% covered (success)
100.00%
17 / 17
100.00% covered (success)
100.00%
3 / 3
4
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 getPage
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
2
 getNames
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace MediaWiki\Extension\SecurePoll;
4
5use MediaWiki\Extension\SecurePoll\Pages\ActionPage;
6use MediaWiki\Extension\SecurePoll\Pages\ArchivedPage;
7use MediaWiki\Extension\SecurePoll\Pages\ArchivePage;
8use MediaWiki\Extension\SecurePoll\Pages\CreatePage;
9use MediaWiki\Extension\SecurePoll\Pages\DetailsPage;
10use MediaWiki\Extension\SecurePoll\Pages\DumpPage;
11use MediaWiki\Extension\SecurePoll\Pages\EntryPage;
12use MediaWiki\Extension\SecurePoll\Pages\ListPage;
13use MediaWiki\Extension\SecurePoll\Pages\LoginPage;
14use MediaWiki\Extension\SecurePoll\Pages\MessageDumpPage;
15use MediaWiki\Extension\SecurePoll\Pages\TallyPage;
16use MediaWiki\Extension\SecurePoll\Pages\TranslatePage;
17use MediaWiki\Extension\SecurePoll\Pages\UnarchivePage;
18use MediaWiki\Extension\SecurePoll\Pages\VotePage;
19use MediaWiki\Extension\SecurePoll\Pages\VoterEligibilityPage;
20use MediaWiki\Languages\LanguageFallback;
21use MediaWiki\User\Options\UserOptionsLookup;
22use Wikimedia\ObjectFactory\ObjectFactory;
23
24class ActionPageFactory {
25    /**
26     * List of page names to the subclass of ActionPage which handles them.
27     */
28    private const PAGE_LIST = [
29        'archive' => [
30            'class' => ArchivePage::class,
31            'services' => [
32                'JobQueueGroup'
33            ],
34        ],
35        'archived' => [
36            'class' => ArchivedPage::class,
37            'services' => [
38                'LinkRenderer',
39                'DBLoadBalancer',
40            ],
41        ],
42        'create' => [
43            'class' => CreatePage::class,
44            'services' => [
45                'DBLoadBalancerFactory',
46                'LanguageNameUtils',
47                'WikiPageFactory',
48                'UserFactory',
49            ],
50        ],
51        'edit' => [
52            'class' => CreatePage::class,
53            'services' => [
54                'DBLoadBalancerFactory',
55                'LanguageNameUtils',
56                'WikiPageFactory',
57                'UserFactory',
58            ],
59        ],
60        'details' => [
61            'class' => DetailsPage::class,
62        ],
63        'dump' => [
64            'class' => DumpPage::class,
65        ],
66        'entry' => [
67            'class' => EntryPage::class,
68            'services' => [
69                'LinkRenderer',
70                'DBLoadBalancer',
71            ],
72        ],
73        'list' => [
74            'class' => ListPage::class,
75            'services' => [
76                'JobQueueGroup',
77            ],
78        ],
79        'login' => [
80            'class' => LoginPage::class,
81        ],
82        'msgdump' => [
83            'class' => MessageDumpPage::class,
84        ],
85        'tally' => [
86            'class' => TallyPage::class,
87            'services' => [
88                'DBLoadBalancer',
89                'JobQueueGroup',
90            ],
91        ],
92        'translate' => [
93            'class' => TranslatePage::class,
94            'services' => [
95                'LanguageNameUtils',
96                'SecurePoll.TranslationRepo'
97            ],
98        ],
99        'unarchive' => [
100            'class' => UnarchivePage::class,
101            'services' => [
102                'JobQueueGroup'
103            ],
104        ],
105        'vote' => [
106            'class' => VotePage::class,
107            'services' => [
108                'DBLoadBalancer',
109                'HookContainer',
110            ],
111        ],
112        'votereligibility' => [
113            'class' => VoterEligibilityPage::class,
114            'services' => [
115                'DBLoadBalancerFactory',
116                'LinkRenderer',
117                'TitleFactory',
118                'UserGroupManager',
119                'WikiPageFactory',
120            ]
121        ],
122    ];
123
124    /** @var ObjectFactory */
125    private $objectFactory;
126
127    /** @var UserOptionsLookup */
128    private $userOptionsLookup;
129
130    /** @var LanguageFallback */
131    private $languageFallback;
132
133    /**
134     * @param ObjectFactory $objectFactory
135     * @param UserOptionsLookup $userOptionsLookup
136     * @param LanguageFallback $languageFallback
137     */
138    public function __construct(
139        ObjectFactory $objectFactory,
140        UserOptionsLookup $userOptionsLookup,
141        LanguageFallback $languageFallback
142    ) {
143        $this->objectFactory = $objectFactory;
144        $this->userOptionsLookup = $userOptionsLookup;
145        $this->languageFallback = $languageFallback;
146    }
147
148    /**
149     * Find the object with a given name and return it (or NULL)
150     *
151     * @param string $name Action page name
152     * @param SpecialSecurePoll $specialPage
153     * @return ActionPage|null ActionPage object or null if the page doesn't exist
154     */
155    public function getPage( $name, $specialPage ) {
156        if ( empty( self::PAGE_LIST[$name] ) ) {
157            return null;
158        }
159        /** @var ActionPage $page */
160        // ObjectFactory::createObject accepts an array, not just a callable (phan bug)
161        // @phan-suppress-next-line PhanTypeInvalidCallableArrayKey
162        $page = $this->objectFactory->createObject(
163            self::PAGE_LIST[$name],
164            [
165                'allowClassName' => true,
166                'allowCallable' => true,
167                'extraArgs' => [ $specialPage ],
168            ]
169        );
170
171        // These are needed for standard parts of ActionPage, so we don't
172        // want every single subclass to need to declare them. (See: how
173        // SpecialPageFactory handles this.)
174        $page->setUserOptionsLookup( $this->userOptionsLookup );
175        $page->setLanguageFallback( $this->languageFallback );
176        return $page;
177    }
178
179    /**
180     * Returns a list of action page names.
181     *
182     * @return string[]
183     */
184    public function getNames() {
185        return array_keys( self::PAGE_LIST );
186    }
187}