/** @var string Inline CSS styles. Use addInlineStyle() sparingly */
protected $mInlineStyles = '';
- /** @todo Unused? */
- private $mLinkColours;
-
/**
* @var string Used by skin template.
* Example: $tpl->set( 'displaytitle', $out->mPageLinkTitle );
* Add an HTTP header that will influence on the cache
*
* @param string $header Header name
- * @param array|null $option
- * @todo FIXME: Document the $option parameter; it appears to be for
- * X-Vary-Options but what format is acceptable?
+ * @param string[]|null $option Options for X-Vary-Options. Possible options are:
+ * - "string-contains=$XXX" varies on whether the header value as a string
+ * contains $XXX as a substring.
+ * - "list-contains=$XXX" varies on whether the header value as a
+ * comma-separated list contains $XXX as one of the list items.
*/
- public function addVaryHeader( $header, $option = null ) {
+ public function addVaryHeader( $header, array $option = null ) {
if ( !array_key_exists( $header, $this->mVaryHeader ) ) {
- $this->mVaryHeader[$header] = (array)$option;
- } elseif ( is_array( $option ) ) {
- if ( is_array( $this->mVaryHeader[$header] ) ) {
- $this->mVaryHeader[$header] = array_merge( $this->mVaryHeader[$header], $option );
- } else {
- $this->mVaryHeader[$header] = $option;
- }
+ $this->mVaryHeader[$header] = array();
+ }
+ if ( !is_array( $option ) ) {
+ $option = array();
}
- $this->mVaryHeader[$header] = array_unique( (array)$this->mVaryHeader[$header] );
+ $this->mVaryHeader[$header] = array_unique( array_merge( $this->mVaryHeader[$header], $option ) );
}
/**
}
$ret .= Html::element( 'title', null, $this->getHTMLTitle() ) . "\n";
+ $ret .= $this->getInlineHeadScripts() . "\n";
+ $ret .= $this->buildCssLinks() . "\n";
+ $ret .= $this->getExternalHeadScripts() . "\n";
foreach ( $this->getHeadLinksArray() as $item ) {
$ret .= $item . "\n";
}
- $ret .= $this->buildCssLinks() . "\n";
- $ret .= $this->getHeadScripts() . "\n";
-
foreach ( $this->mHeadItems as $item ) {
$ret .= $item . "\n";
}
// Inline private modules. These can't be loaded through load.php for security
// reasons, see bug 34907. Note that these modules should be loaded from
- // getHeadScripts() before the first loader call. Otherwise other modules can't
+ // getExternalHeadScripts() before the first loader call. Otherwise other modules can't
// properly use them as dependencies (bug 30914)
if ( $group === 'private' ) {
if ( $only == ResourceLoaderModule::TYPE_STYLES ) {
// Automatically select style/script elements
if ( $only === ResourceLoaderModule::TYPE_STYLES ) {
- $media = $group === 'print' ? 'print' : 'all';
- $link = Html::linkedStyle( $url, $media );
+ $link = Html::linkedStyle( $url );
} else {
if ( $context->getRaw() || $isRaw ) {
// Startup module can't load itself, needs to use <script> instead of mw.loader.load
* @return string HTML fragment
*/
function getHeadScripts() {
+ return $this->getInlineHeadScripts() . "\n" . $this->getExternalHeadScripts();
+ }
+
+ /**
+ * <script src="..."> tags for "<head>". This is the startup module
+ * and other modules marked with position 'top'.
+ *
+ * @return string HTML fragment
+ */
+ function getExternalHeadScripts() {
+ $links = array();
+
+ // Startup - this provides the client with the module manifest and loads jquery and mediawiki base modules
+ $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
+
+ return self::getHtmlFromLoaderLinks( $links );
+ }
+
+ /**
+ * <script>...</script> tags to put in "<head>".
+ *
+ * @return string HTML fragment
+ */
+ function getInlineHeadScripts() {
$links = array();
// Client profile classes for <html>. Allows for easy hiding/showing of UI components.
. '.replace( /(^|\s)client-nojs(\s|$)/, "$1client-js$2" );'
);
- // Startup - this provides the client with the module manifest and loads jquery and mediawiki base modules
- $links[] = $this->makeResourceLoaderLink( 'startup', ResourceLoaderModule::TYPE_SCRIPTS );
-
// Load config before anything else
$links[] = ResourceLoader::makeInlineScript(
ResourceLoader::makeConfigSetScript( $this->getJSVars() )
ResourceLoaderModule::TYPE_SCRIPTS
);
- if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
- $links[] = $this->getScriptsForBottomQueue();
- }
-
return self::getHtmlFromLoaderLinks( $links );
}
/**
- * JS stuff to put at the 'bottom', which can either be the bottom of the
- * "<body>" or the bottom of the "<head>" depending on
- * $wgResourceLoaderExperimentalAsyncLoading: modules marked with position
- * 'bottom', legacy scripts ($this->mScripts), user preferences, site JS
- * and user JS.
+ * JS stuff to put at the 'bottom', which goes at the bottom of the `<body>`.
+ * These are modules marked with position 'bottom', legacy scripts ($this->mScripts),
+ * site JS, and user JS.
*
* @param bool $unused Previously used to let this method change its output based
- * on whether it was called by getHeadScripts() or getBottomScripts().
+ * on whether it was called by getExternalHeadScripts() or getBottomScripts().
* @return string
*/
function getScriptsForBottomQueue( $unused = null ) {
// In case the skin wants to add bottom CSS
$this->getSkin()->setupSkinUserCss( $this );
- if ( $this->getConfig()->get( 'ResourceLoaderExperimentalAsyncLoading' ) ) {
- // Already handled by getHeadScripts()
- return '';
- }
- return $this->getScriptsForBottomQueue();
+ return $this->getScriptsForBottomQueue();
}
/**
'resources/lib/phpjs-sha1/sha1.js',
'resources/src/mediawiki/mediawiki.js',
'resources/src/mediawiki/mediawiki.errorLogger.js',
- 'resources/src/mediawiki/mediawiki.startUp.js',
),
'debugScripts' => 'resources/src/mediawiki/mediawiki.log.js',
'targets' => array( 'desktop', 'mobile' ),
'resources/src/mediawiki/mediawiki.template.mustache.js',
),
'targets' => array( 'desktop', 'mobile' ),
+ 'dependencies' => 'mediawiki.template',
+ ),
+ 'mediawiki.template.regexp' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.template.regexp.js',
+ 'targets' => array( 'desktop', 'mobile' ),
+ 'dependencies' => 'mediawiki.template',
),
'mediawiki.apipretty' => array(
'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
'feedback-useragent'
),
),
-
+ 'mediawiki.feedlink' => array(
+ 'position' => 'top',
+ 'styles' => 'resources/src/mediawiki/mediawiki.feedlink.css',
+ ),
'mediawiki.filewarning' => array(
'scripts' => 'resources/src/mediawiki/mediawiki.filewarning.js',
'styles' => 'resources/src/mediawiki/mediawiki.filewarning.less',
'oojs-ui',
),
),
-
+ 'mediawiki.ForeignApi' => array(
+ 'targets' => array( 'desktop', 'mobile' ),
+ 'class' => 'ResourceLoaderForeignApiModule',
+ // Additional dependencies generated dynamically
+ 'dependencies' => 'mediawiki.ForeignApi.core',
+ ),
+ 'mediawiki.ForeignApi.core' => array(
+ 'scripts' => 'resources/src/mediawiki.api/mediawiki.ForeignApi.js',
+ 'dependencies' => array(
+ 'mediawiki.api',
+ 'oojs',
+ ),
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'mediawiki.helplink' => array(
'position' => 'top',
'styles' => array(
'colon-separator',
),
),
+ 'mediawiki.htmlform.styles' => array(
+ 'styles' => 'resources/src/mediawiki/mediawiki.htmlform.css',
+ 'position' => 'top',
+ ),
'mediawiki.htmlform.ooui.styles' => array(
'styles' => 'resources/src/mediawiki/mediawiki.htmlform.ooui.css',
'position' => 'top',
'styles' => 'resources/src/mediawiki/mediawiki.sectionAnchor.css',
'targets' => array( 'desktop', 'mobile' ),
),
+ 'mediawiki.storage' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.storage.js',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'mediawiki.Title' => array(
'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
'dependencies' => array(
'mediawiki.api.upload',
),
),
+ 'mediawiki.ForeignUpload' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.ForeignUpload.js',
+ 'dependencies' => array(
+ 'mediawiki.ForeignApi',
+ 'mediawiki.Upload',
+ 'oojs',
+ ),
+ ),
+ 'mediawiki.ForeignStructuredUpload' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js',
+ 'dependencies' => array(
+ 'mediawiki.ForeignUpload',
+ ),
+ ),
+ 'mediawiki.Upload.Dialog' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.Upload.Dialog.js',
+ 'dependencies' => array(
+ 'oojs-ui',
+ 'mediawiki.Upload',
+ ),
+ 'messages' => array(
+ 'upload-dialog-title',
+ 'upload-dialog-error',
+ 'upload-dialog-warning',
+ 'upload-dialog-button-cancel',
+ 'upload-dialog-button-done',
+ 'upload-dialog-button-save',
+ 'upload-dialog-button-upload',
+ 'upload-dialog-label-select-file',
+ 'upload-dialog-label-infoform-title',
+ 'upload-dialog-label-infoform-name',
+ 'upload-dialog-label-infoform-description',
+ 'upload-dialog-label-usage-title',
+ 'upload-dialog-label-usage-filename',
+ ),
+ ),
'mediawiki.toc' => array(
'scripts' => 'resources/src/mediawiki/mediawiki.toc.js',
'dependencies' => 'mediawiki.cookie',
),
'mediawiki.Uri' => array(
'scripts' => 'resources/src/mediawiki/mediawiki.Uri.js',
+ 'templates' => array(
+ 'strict.regexp' => 'resources/src/mediawiki/mediawiki.Uri.strict.regexp',
+ 'loose.regexp' => 'resources/src/mediawiki/mediawiki.Uri.loose.regexp',
+ ),
'dependencies' => 'mediawiki.util',
'targets' => array( 'desktop', 'mobile' ),
),
'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
'position' => 'top',
),
+ 'mediawiki.experiments' => array(
+ 'scripts' => 'resources/src/mediawiki/mediawiki.experiments.js',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
/* MediaWiki Action */
'prefs-editing'
),
),
+ 'mediawiki.action.view.filepage' => array(
+ 'styles' => array(
+ 'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' => array( 'media' => 'print' ),
+ 'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
+ ),
+ 'position' => 'top',
+ ),
/* MediaWiki Language */
'mediawiki.page.gallery' => array(
'scripts' => 'resources/src/mediawiki.page/mediawiki.page.gallery.js',
'dependencies' => array(
+ 'mediawiki.page.gallery.styles',
'jquery.throttle-debounce',
)
),
+ 'mediawiki.page.gallery.styles' => array(
+ 'styles' => array(
+ 'resources/src/mediawiki.page/mediawiki.page.gallery.print.css' => array( 'media' => 'print' ),
+ 'resources/src/mediawiki.page/mediawiki.page.gallery.css',
+ ),
+ 'position' => 'top',
+ 'targets' => array( 'desktop', 'mobile' ),
+ ),
'mediawiki.page.ready' => array(
'scripts' => 'resources/src/mediawiki.page/mediawiki.page.ready.js',
'dependencies' => array(
'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css',
),
),
- 'mediawiki.special.userlogin.common.js' => array(
- 'scripts' => array(
- 'resources/src/mediawiki.special/mediawiki.special.userlogin.common.js',
- ),
- 'messages' => array(
- 'createacct-captcha',
- 'createacct-imgcaptcha-ph',
- ),
- ),
'mediawiki.special.userlogin.signup.js' => array(
'scripts' => 'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.js',
'messages' => array(
'mediawiki.legacy.commonPrint' => array(
'position' => 'top',
'styles' => array(
+ // @todo: Remove mediawiki.page.gallery when cache has cleared
+ 'resources/src/mediawiki.page/mediawiki.page.gallery.print.css' => array( 'media' => 'print' ),
+ // @todo: Remove mediawiki.action.view.filepage.print.css when cache has cleared
+ 'resources/src/mediawiki.action/mediawiki.action.view.filepage.print.css' => array( 'media' => 'print' ),
'resources/src/mediawiki.legacy/commonPrint.css' => array( 'media' => 'print' )
),
- 'group' => 'print',
),
'mediawiki.legacy.protect' => array(
'scripts' => 'resources/src/mediawiki.legacy/protect.js',
'mediawiki.legacy.shared' => array(
'position' => 'top',
'styles' => array(
+ // @todo: Remove when mediawiki.page.gallery in cached html.
+ 'resources/src/mediawiki.page/mediawiki.page.gallery.css',
+ // @todo: Remove mediawiki.action.view.filepage.css
+ // and mediawiki.legacy/images/checker.png when cache has cleared
+ 'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
'resources/src/mediawiki.legacy/shared.css' => array( 'media' => 'screen' )
),
),
'resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js',
+ 'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js',
'resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js',
+ 'resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js',
),
'skinStyles' => array(
'default' => array(
),
),
'dependencies' => array(
+ 'oojs-ui',
'mediawiki.widgets.styles',
- 'jquery.autoEllipsis',
+ // DateInputWidget
+ 'moment',
+ // TitleInputWidget
'mediawiki.Title',
'mediawiki.api',
- 'moment',
- 'oojs-ui',
+ 'jquery.byteLimit',
+ // TitleOptionWidget
+ 'jquery.autoEllipsis',
),
'messages' => array(
+ // DateInputWidget
'mw-widgets-dateinput-no-date',
'mw-widgets-dateinput-placeholder-day',
'mw-widgets-dateinput-placeholder-month',
+ // NamespaceInputWidget
+ 'blanknamespace',
+ 'namespacesall',
+ // TitleInputWidget
'mw-widgets-titleinput-description-new-page',
'mw-widgets-titleinput-description-redirect',
),
'mediawiki.widgets.styles' => array(
'skinStyles' => array(
'default' => array(
- 'resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.base.css',
+ 'resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.base.css',
),
),
'position' => 'top',