Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
63.92% covered (warning)
63.92%
62 / 97
28.57% covered (danger)
28.57%
2 / 7
CRAP
0.00% covered (danger)
0.00%
0 / 1
PageRestHelperFactory
63.92% covered (warning)
63.92%
62 / 97
28.57% covered (danger)
28.57%
2 / 7
18.76
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
 newRevisionContentHelper
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
 newPageContentHelper
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
 newHtmlOutputRendererHelper
80.77% covered (warning)
80.77%
21 / 26
0.00% covered (danger)
0.00%
0 / 1
4.11
 newHtmlShadowOutputHelper
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
1 / 1
1
 newHtmlInputTransformHelper
94.12% covered (success)
94.12%
16 / 17
0.00% covered (danger)
0.00%
0 / 1
3.00
 newPageRedirectHelper
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Rest\Handler\Helper;
4
5use MediaWiki\ChangeTags\ChangeTagsStore;
6use MediaWiki\Config\ServiceOptions;
7use MediaWiki\Content\IContentHandlerFactory;
8use MediaWiki\Edit\ParsoidOutputStash;
9use MediaWiki\Language\LanguageConverterFactory;
10use MediaWiki\Language\LanguageFactory;
11use MediaWiki\Page\PageIdentity;
12use MediaWiki\Page\PageLookup;
13use MediaWiki\Page\ParserOutputAccess;
14use MediaWiki\Page\RedirectStore;
15use MediaWiki\Parser\ParserOptions;
16use MediaWiki\Parser\Parsoid\Config\SiteConfig as ParsoidSiteConfig;
17use MediaWiki\Parser\Parsoid\HtmlTransformFactory;
18use MediaWiki\Permissions\Authority;
19use MediaWiki\Rest\RequestInterface;
20use MediaWiki\Rest\ResponseFactory;
21use MediaWiki\Rest\Router;
22use MediaWiki\Revision\RevisionLookup;
23use MediaWiki\Revision\RevisionRecord;
24use MediaWiki\Revision\RevisionRenderer;
25use MediaWiki\ShadowPage\ShadowPageLoader;
26use MediaWiki\Title\TitleFactory;
27use MediaWiki\Title\TitleFormatter;
28use Wikimedia\Bcp47Code\Bcp47Code;
29use Wikimedia\Rdbms\IConnectionProvider;
30use Wikimedia\Stats\StatsFactory;
31
32/**
33 * @since 1.40 Factory for helper objects designed for sharing logic between REST handlers that deal with page content.
34 * @unstable during Parsoid migration
35 */
36class PageRestHelperFactory {
37
38    /**
39     * @internal
40     */
41    public const CONSTRUCTOR_OPTIONS = PageContentHelper::CONSTRUCTOR_OPTIONS;
42
43    private ServiceOptions $options;
44    private RevisionLookup $revisionLookup;
45    private RevisionRenderer $revisionRenderer;
46    private TitleFormatter $titleFormatter;
47    private PageLookup $pageLookup;
48    private ParsoidOutputStash $parsoidOutputStash;
49    private ParserOutputAccess $parserOutputAccess;
50    private ParsoidSiteConfig $parsoidSiteConfig;
51    private HtmlTransformFactory $htmlTransformFactory;
52    private IContentHandlerFactory $contentHandlerFactory;
53    private LanguageFactory $languageFactory;
54    private RedirectStore $redirectStore;
55    private LanguageConverterFactory $languageConverterFactory;
56    private TitleFactory $titleFactory;
57    private IConnectionProvider $dbProvider;
58    private ChangeTagsStore $changeTagsStore;
59    private StatsFactory $statsFactory;
60    private ShadowPageLoader $shadowPageLoader;
61
62    public function __construct(
63        ServiceOptions $options,
64        RevisionLookup $revisionLookup,
65        RevisionRenderer $revisionRenderer,
66        TitleFormatter $titleFormatter,
67        PageLookup $pageLookup,
68        ParsoidOutputStash $parsoidOutputStash,
69        ParserOutputAccess $parserOutputAccess,
70        ParsoidSiteConfig $parsoidSiteConfig,
71        HtmlTransformFactory $htmlTransformFactory,
72        IContentHandlerFactory $contentHandlerFactory,
73        LanguageFactory $languageFactory,
74        RedirectStore $redirectStore,
75        LanguageConverterFactory $languageConverterFactory,
76        TitleFactory $titleFactory,
77        IConnectionProvider $dbProvider,
78        ChangeTagsStore $changeTagsStore,
79        StatsFactory $statsFactory,
80        ShadowPageLoader $shadowPageLoader,
81    ) {
82        $this->options = $options;
83        $this->revisionLookup = $revisionLookup;
84        $this->revisionRenderer = $revisionRenderer;
85        $this->titleFormatter = $titleFormatter;
86        $this->pageLookup = $pageLookup;
87        $this->parsoidOutputStash = $parsoidOutputStash;
88        $this->parserOutputAccess = $parserOutputAccess;
89        $this->parsoidSiteConfig = $parsoidSiteConfig;
90        $this->htmlTransformFactory = $htmlTransformFactory;
91        $this->contentHandlerFactory = $contentHandlerFactory;
92        $this->languageFactory = $languageFactory;
93        $this->redirectStore = $redirectStore;
94        $this->languageConverterFactory = $languageConverterFactory;
95        $this->statsFactory = $statsFactory;
96        $this->titleFactory = $titleFactory;
97        $this->dbProvider = $dbProvider;
98        $this->changeTagsStore = $changeTagsStore;
99        $this->shadowPageLoader = $shadowPageLoader;
100    }
101
102    public function newRevisionContentHelper(): RevisionContentHelper {
103        return new RevisionContentHelper(
104            $this->options,
105            $this->revisionLookup,
106            $this->titleFormatter,
107            $this->pageLookup,
108            $this->titleFactory,
109            $this->dbProvider,
110            $this->changeTagsStore,
111            $this->shadowPageLoader,
112        );
113    }
114
115    public function newPageContentHelper(): PageContentHelper {
116        return new PageContentHelper(
117            $this->options,
118            $this->revisionLookup,
119            $this->titleFormatter,
120            $this->pageLookup,
121            $this->titleFactory,
122            $this->dbProvider,
123            $this->changeTagsStore,
124            $this->shadowPageLoader,
125        );
126    }
127
128    /**
129     * Should we ignore page id mismatches between page and revision objects
130     * in HTML/pagebundle requests? Mismatches arise because of page moves.
131     * This is recommended only for handling calls to internal APIs.
132     * @note Since 1.43, passing 'null' for $page has been deprecated.
133     * @note Since 1.43, passing 'null' for $authority has been deprecated.
134     * @note Since 1.43, passing $lenientRevHandling as the first parameter
135     *  has been deprecated.
136     * @param bool|PageIdentity|null $page
137     *  If `false`, this argument is used as the value for $lenientRevHandling,
138     *  for backward-compatibility.
139     * @param array $parameters
140     * @param ?Authority $authority
141     * @param int|RevisionRecord|null $revision
142     * @param bool $lenientRevHandling
143     * @param ParserOptions|null $parserOptions
144     * @return HtmlOutputRendererHelper
145     */
146    public function newHtmlOutputRendererHelper(
147        $page = null,
148        array $parameters = [],
149        ?Authority $authority = null,
150        $revision = null,
151        bool $lenientRevHandling = false,
152        ?ParserOptions $parserOptions = null
153    ): HtmlOutputRendererHelper {
154        if ( is_bool( $page ) ) {
155            // Backward compatibility w/ pre-1.43 (deprecated)
156            $lenientRevHandling = $page;
157            $page = null;
158            wfDeprecated( __METHOD__ . ' with boolean first parameter', '1.43' );
159        }
160        if ( $page === null ) {
161            wfDeprecated( __METHOD__ . ' with null $page', '1.43' );
162        }
163        if ( $authority === null ) {
164            wfDeprecated( __METHOD__ . ' with null $authority', '1.43' );
165        }
166        return new HtmlOutputRendererHelper(
167            $this->parsoidOutputStash,
168            $this->statsFactory,
169            $this->parserOutputAccess,
170            $this->pageLookup,
171            $this->revisionLookup,
172            $this->revisionRenderer,
173            $this->parsoidSiteConfig,
174            $this->htmlTransformFactory,
175            $this->contentHandlerFactory,
176            $this->languageFactory,
177            $page,
178            $parameters,
179            $authority,
180            $revision,
181            $lenientRevHandling,
182            $parserOptions
183        );
184    }
185
186    public function newHtmlShadowOutputHelper( PageIdentity $page, ParserOptions $parserOptions
187    ): HtmlShadowOutputHelper {
188        return new HtmlShadowOutputHelper(
189            $this->shadowPageLoader,
190            $this->titleFormatter,
191            $this->parsoidSiteConfig,
192            $parserOptions,
193            $page
194        );
195    }
196
197    /**
198     * @param array $envOptions
199     * @param ?PageIdentity $page
200     * @param array|string|null $body
201     * @param array $parameters
202     * @param RevisionRecord|null $originalRevision
203     * @param Bcp47Code|null $pageLanguage
204     */
205    public function newHtmlInputTransformHelper(
206        $envOptions = [],
207        ?PageIdentity $page = null,
208        $body = null,
209        array $parameters = [],
210        ?RevisionRecord $originalRevision = null,
211        ?Bcp47Code $pageLanguage = null
212    ): HtmlInputTransformHelper {
213        if ( $page === null || $body === null ) {
214            wfDeprecated( __METHOD__ . ' without $page or $body' );
215        }
216        return new HtmlInputTransformHelper(
217            $this->statsFactory,
218            $this->htmlTransformFactory,
219            $this->parsoidOutputStash,
220            $this->parserOutputAccess,
221            $this->pageLookup,
222            $this->revisionLookup,
223            $this->parsoidSiteConfig,
224            $envOptions,
225            $page,
226            $body ?? '',
227            $parameters,
228            $originalRevision,
229            $pageLanguage
230        );
231    }
232
233    /**
234     * @since 1.41
235     */
236    public function newPageRedirectHelper(
237        ResponseFactory $responseFactory,
238        Router $router,
239        string $pathWithModulePrefix,
240        RequestInterface $request
241    ): PageRedirectHelper {
242        return new PageRedirectHelper(
243            $this->redirectStore,
244            $this->titleFormatter,
245            $responseFactory,
246            $router,
247            $pathWithModulePrefix,
248            $request,
249            $this->languageConverterFactory
250        );
251    }
252
253}