From aa015eba2667830b007a98b9af75187e308aaf33 Mon Sep 17 00:00:00 2001 From: jrobson Date: Mon, 13 May 2013 15:09:33 -0700 Subject: [PATCH] Give skin more control of OutputPage modules Remove addDefaultModules from OutputPage Instead only enforce mediawiki.page.startup Add a method getDefaultModules which groups modules by type allowing a skin to tweak Change-Id: I89d529f0378d90af0fe0a5adea5d5dbdca83a86e --- includes/OutputPage.php | 81 +++++++++++++---------------------------- includes/Skin.php | 58 +++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 55 deletions(-) diff --git a/includes/OutputPage.php b/includes/OutputPage.php index b63e658ddd..6bb29d2eec 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -1986,7 +1986,8 @@ class OutputPage extends ContextSource { * the object, let's actually output it: */ public function output() { - global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP; + global $wgLanguageCode, $wgDebugRedirects, $wgMimeType, $wgVaryOnXFP, + $wgUseAjax, $wgResponsiveImages; if ( $this->mDoNothing ) { return; @@ -2051,9 +2052,32 @@ class OutputPage extends ContextSource { if ( $this->mArticleBodyOnly ) { echo $this->mBodytext; } else { - $this->addDefaultModules(); $sk = $this->getSkin(); + // add skin specific modules + $modules = $sk->getDefaultModules(); + + // enforce various default modules for all skins + $coreModules = array( + // keep this list as small as possible + 'mediawiki.page.startup', + 'mediawiki.user', + ); + + // Support for high-density display images if enabled + if ( $wgResponsiveImages ) { + $coreModules[] = 'mediawiki.hidpi'; + } + + $this->addModules( $coreModules ); + foreach ( $modules as $group ) { + $this->addModules( $group ); + } + MWDebug::addModules( $this ); + if ( $wgUseAjax ) { + // FIXME: deprecate? - not clear why this is useful + wfRunHooks( 'AjaxAddScript', array( &$this ) ); + } // Hook that allows last minute changes to the output page, e.g. // adding of CSS or Javascript by extensions. @@ -2553,59 +2577,6 @@ $templates return $ret; } - /** - * Add the default ResourceLoader modules to this object - */ - private function addDefaultModules() { - global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax, - $wgAjaxWatch, $wgResponsiveImages; - - // Add base resources - $this->addModules( array( - 'mediawiki.user', - 'mediawiki.page.startup', - 'mediawiki.page.ready', - ) ); - if ( $wgIncludeLegacyJavaScript ) { - $this->addModules( 'mediawiki.legacy.wikibits' ); - } - - if ( $wgPreloadJavaScriptMwUtil ) { - $this->addModules( 'mediawiki.util' ); - } - - MWDebug::addModules( $this ); - - // Add various resources if required - if ( $wgUseAjax ) { - $this->addModules( 'mediawiki.legacy.ajax' ); - - wfRunHooks( 'AjaxAddScript', array( &$this ) ); - - if ( $wgAjaxWatch && $this->getUser()->isLoggedIn() ) { - $this->addModules( 'mediawiki.page.watch.ajax' ); - } - - if ( !$this->getUser()->getOption( 'disablesuggest', false ) ) { - $this->addModules( 'mediawiki.searchSuggest' ); - } - } - - if ( $this->getUser()->getBoolOption( 'editsectiononrightclick' ) ) { - $this->addModules( 'mediawiki.action.view.rightClickEdit' ); - } - - # Crazy edit-on-double-click stuff - if ( $this->isArticle() && $this->getUser()->getOption( 'editondblclick' ) ) { - $this->addModules( 'mediawiki.action.view.dblClickEdit' ); - } - - // Support for high-density display images - if ( $wgResponsiveImages ) { - $this->addModules( 'mediawiki.hidpi' ); - } - } - /** * Get a ResourceLoader object associated with this OutputPage * diff --git a/includes/Skin.php b/includes/Skin.php index 15b85453b7..07abcb5740 100644 --- a/includes/Skin.php +++ b/includes/Skin.php @@ -197,6 +197,64 @@ abstract class Skin extends ContextSource { wfProfileOut( __METHOD__ ); } + /** + * Defines the ResourceLoader modules that should be added to the skin + * It is recommended that skins wishing to override call parent::getDefaultModules() + * and substitute out any modules they wish to change by using a key to look them up + * @return Array of modules with helper keys for easy overriding + */ + public function getDefaultModules() { + global $wgIncludeLegacyJavaScript, $wgPreloadJavaScriptMwUtil, $wgUseAjax, + $wgAjaxWatch; + + $out = $this->getOutput(); + $user = $out->getUser(); + $modules = array( + // modules that enhance the page content in some way + 'content' => array( + 'mediawiki.page.ready', + ), + // modules that exist for legacy reasons + 'legacy' => array(), + // modules relating to search functionality + 'search' => array(), + // modules relating to functionality relating to watching an article + 'watch' => array(), + // modules which relate to the current users preferences + 'user' => array(), + ); + if ( $wgIncludeLegacyJavaScript ) { + $modules['legacy'][] = 'mediawiki.legacy.wikibits'; + } + + if ( $wgPreloadJavaScriptMwUtil ) { + $modules['legacy'][] = 'mediawiki.util'; + } + + // Add various resources if required + if ( $wgUseAjax ) { + $modules['legacy'][] = 'mediawiki.legacy.ajax'; + + if ( $wgAjaxWatch && $user->isLoggedIn() ) { + $modules['watch'][] = 'mediawiki.page.watch.ajax'; + } + + if ( !$user->getOption( 'disablesuggest', false ) ) { + $modules['search'][] = 'mediawiki.searchSuggest'; + } + } + + if ( $user->getBoolOption( 'editsectiononrightclick' ) ) { + $modules['user'][] = 'mediawiki.action.view.rightClickEdit'; + } + + // Crazy edit-on-double-click stuff + if ( $out->isArticle() && $user->getOption( 'editondblclick' ) ) { + $modules['user'][] = 'mediawiki.action.view.dblClickEdit'; + } + return $modules; + } + /** * Preload the existence of three commonly-requested pages in a single query */ -- 2.20.1