Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
100.00% |
17 / 17 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
1 / 1 |
ActionPageFactory | |
100.00% |
17 / 17 |
|
100.00% |
3 / 3 |
4 | |
100.00% |
1 / 1 |
__construct | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
1 | |||
getPage | |
100.00% |
13 / 13 |
|
100.00% |
1 / 1 |
2 | |||
getNames | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 |
1 | <?php |
2 | |
3 | namespace MediaWiki\Extension\SecurePoll; |
4 | |
5 | use MediaWiki\Extension\SecurePoll\Pages\ActionPage; |
6 | use MediaWiki\Extension\SecurePoll\Pages\ArchivedPage; |
7 | use MediaWiki\Extension\SecurePoll\Pages\ArchivePage; |
8 | use MediaWiki\Extension\SecurePoll\Pages\CreatePage; |
9 | use MediaWiki\Extension\SecurePoll\Pages\DetailsPage; |
10 | use MediaWiki\Extension\SecurePoll\Pages\DumpPage; |
11 | use MediaWiki\Extension\SecurePoll\Pages\EntryPage; |
12 | use MediaWiki\Extension\SecurePoll\Pages\ListPage; |
13 | use MediaWiki\Extension\SecurePoll\Pages\LoginPage; |
14 | use MediaWiki\Extension\SecurePoll\Pages\MessageDumpPage; |
15 | use MediaWiki\Extension\SecurePoll\Pages\TallyPage; |
16 | use MediaWiki\Extension\SecurePoll\Pages\TranslatePage; |
17 | use MediaWiki\Extension\SecurePoll\Pages\UnarchivePage; |
18 | use MediaWiki\Extension\SecurePoll\Pages\VotePage; |
19 | use MediaWiki\Extension\SecurePoll\Pages\VoterEligibilityPage; |
20 | use MediaWiki\Languages\LanguageFallback; |
21 | use MediaWiki\User\Options\UserOptionsLookup; |
22 | use Wikimedia\ObjectFactory\ObjectFactory; |
23 | |
24 | class 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 | } |