Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
Hooks
0.00% covered (danger)
0.00%
0 / 29
0.00% covered (danger)
0.00%
0 / 5
156
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getPageLanguage
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
20
 onGetPreferences
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 onEditPage__showEditForm_initial
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
30
 onEditPage__showReadOnlyForm_initial
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace MediaWiki\Extension\CodeEditor;
4
5use ErrorPageError;
6use ExtensionRegistry;
7use MediaWiki\EditPage\EditPage;
8use MediaWiki\Extension\CodeEditor\Hooks\HookRunner;
9use MediaWiki\Hook\EditPage__showEditForm_initialHook;
10use MediaWiki\Hook\EditPage__showReadOnlyForm_initialHook;
11use MediaWiki\HookContainer\HookContainer;
12use MediaWiki\Output\OutputPage;
13use MediaWiki\Preferences\Hook\GetPreferencesHook;
14use MediaWiki\Title\Title;
15use MediaWiki\User\Options\UserOptionsLookup;
16use MediaWiki\User\User;
17
18/**
19 * @phpcs:disable MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName
20 */
21class Hooks implements
22    GetPreferencesHook,
23    EditPage__showEditForm_initialHook,
24    EditPage__showReadOnlyForm_initialHook
25{
26    /** @var UserOptionsLookup */
27    private $userOptionsLookup;
28
29    /** @var HookRunner */
30    private $hookRunner;
31
32    /**
33     * @param UserOptionsLookup $userOptionsLookup
34     * @param HookContainer $hookContainer
35     */
36    public function __construct(
37        UserOptionsLookup $userOptionsLookup,
38        HookContainer $hookContainer
39    ) {
40        $this->userOptionsLookup = $userOptionsLookup;
41        $this->hookRunner = new HookRunner( $hookContainer );
42    }
43
44    /**
45     * @param Title $title
46     * @param string $model
47     * @param string $format
48     * @return null|string
49     */
50    private function getPageLanguage( Title $title, $model, $format ) {
51        if ( $model === CONTENT_MODEL_JAVASCRIPT ) {
52            return 'javascript';
53        } elseif ( $model === CONTENT_MODEL_CSS ) {
54            return 'css';
55        } elseif ( $model === CONTENT_MODEL_JSON ) {
56            return 'json';
57        }
58
59        // Give extensions a chance
60        $lang = null;
61        $this->hookRunner->onCodeEditorGetPageLanguage( $title, $lang, $model, $format );
62
63        return $lang;
64    }
65
66    /**
67     * @param User $user
68     * @param array &$defaultPreferences
69     */
70    public function onGetPreferences( $user, &$defaultPreferences ) {
71        $defaultPreferences['usecodeeditor'] = [
72            'type' => 'api',
73            'default' => '1',
74        ];
75    }
76
77    /**
78     * @param EditPage $editpage
79     * @param OutputPage $output
80     * @throws ErrorPageError
81     */
82    public function onEditPage__showEditForm_initial( $editpage, $output ) {
83        $title = $editpage->getContextTitle();
84        $model = $editpage->contentModel;
85        $format = $editpage->contentFormat;
86
87        $lang = $this->getPageLanguage( $title, $model, $format );
88        if ( $lang && $this->userOptionsLookup->getOption( $output->getUser(), 'usebetatoolbar' ) ) {
89            $output->addModules( 'ext.codeEditor' );
90            $output->addModuleStyles( 'ext.codeEditor.styles' );
91            $output->addJsConfigVars( 'wgCodeEditorCurrentLanguage', $lang );
92            // Needed because ACE adds a blob: url web-worker.
93            $output->getCSP()->addScriptSrc( 'blob:' );
94
95            if ( $this->userOptionsLookup->getOption( $output->getUser(), 'usecodeeditor' ) ) {
96                $output->addBodyClasses( 'codeeditor-loading' );
97            }
98        } elseif ( !ExtensionRegistry::getInstance()->isLoaded( 'WikiEditor' ) ) {
99            throw new ErrorPageError( 'codeeditor-error-title', 'codeeditor-error-message' );
100        }
101    }
102
103    /**
104     * @param EditPage $editpage
105     * @param OutputPage $output
106     * @throws ErrorPageError
107     */
108    public function onEditPage__showReadOnlyForm_initial( $editpage, $output ) {
109        $this->onEditPage__showEditForm_initial( $editpage, $output );
110    }
111}