mediawiki-extensions-CodeEd.../includes/CodeEditorHooks.php
Brian Wolff f8d9cdebdb Make CodeEditor compatible with CSP
Adds a "script-src blob:" directive on pages using CodeEditor.
This should allow using the blob-based web-worker that ACE uses.

This bumps the MediaWiki dependency to current master (1.35.0+).

Bug: T214743
Depends-on: I68054644220cd03bc96cf8ffb9c7ee375be77f96
Change-Id: I40612274a7e1d964119433442d992a8bf67f61af
2019-10-28 12:41:05 +00:00

60 lines
1.6 KiB
PHP

<?php
class CodeEditorHooks {
/**
* @param Title $title
* @param string $model
* @param string $format
* @return null|string
*/
public static function getPageLanguage( Title $title, $model, $format ) {
if ( $model === CONTENT_MODEL_JAVASCRIPT ) {
return 'javascript';
} elseif ( $model === CONTENT_MODEL_CSS ) {
return 'css';
} elseif ( $model === CONTENT_MODEL_JSON ) {
return 'json';
}
// Give extensions a chance
// Note: $model and $format were added around the time of MediaWiki 1.28.
$lang = null;
Hooks::run( 'CodeEditorGetPageLanguage', [ $title, &$lang, $model, $format ] );
return $lang;
}
/**
* @param User $user
* @param array &$defaultPreferences
*/
public static function getPreferences( User $user, &$defaultPreferences ) {
$defaultPreferences['usecodeeditor'] = [
'type' => 'api',
'default' => '1',
];
}
/**
* @param EditPage $editpage
* @param OutputPage $output
* @throws ErrorPageError
*/
public static function editPageShowEditFormInitial( EditPage $editpage, OutputPage $output ) {
global $wgTitle;
$model = $editpage->contentModel;
$format = $editpage->contentFormat;
$lang = self::getPageLanguage( $wgTitle, $model, $format );
if ( $lang && $output->getUser()->getOption( 'usebetatoolbar' ) ) {
$output->addModules( 'ext.codeEditor' );
$output->addJsConfigVars( 'wgCodeEditorCurrentLanguage', $lang );
// Needed because ACE adds a blob: url web-worker.
$output->getCSP()->addScriptSrc( "blob:" );
} elseif ( !ExtensionRegistry::getInstance()->isLoaded( "WikiEditor" ) ) {
throw new ErrorPageError( "codeeditor-error-title", "codeeditor-error-message" );
}
}
}