ResourceLoaderStartUpModule: Use hashMtime to detect config changes
Changes to the static startup.js file are covered by the file mtime in #getModifiedTime. Changes to the module registrations are covered by the max module mtime loop in #getModifiedTime. But changes to LocalSettings.php etc. affecting mw.config values embedded in #getScript aren't traceable. Resort to hashing those and detecting changes between calls that way. Without this, changes to mw.config never made it live (not even after the rebuild every 5 minutes) because of 304 Not Modified being sent between Apache and Varnish. Changes to config either didn't matter to front-end right away and made it with the next deployment that changes a different module, or by touching startup.js to force a version bump. Simple third party installs were not affected by this bug as their settings would only be coming from LocalSettings.php (as opposed to included files) and $wgInvalidateCacheOnLocalSettingsChange is true by default. Bug: 28899 Change-Id: I484166923d97368d95beeb40bb209dec9b849033
This commit is contained in:
parent
45ffc8c937
commit
f9a951abc2
1 changed files with 30 additions and 2 deletions
|
|
@ -27,6 +27,7 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
|||
/* Protected Members */
|
||||
|
||||
protected $modifiedTime = array();
|
||||
protected $configVars = array();
|
||||
protected $targets = array( 'desktop', 'mobile' );
|
||||
|
||||
/* Protected Methods */
|
||||
|
|
@ -36,6 +37,12 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
|||
* @return array
|
||||
*/
|
||||
protected function getConfig( $context ) {
|
||||
|
||||
$hash = $context->getHash();
|
||||
if ( isset( $this->configVars[$hash] ) ) {
|
||||
return $this->configVars[$hash];
|
||||
}
|
||||
|
||||
global $wgLoadScript, $wgScript, $wgStylePath, $wgScriptExtension,
|
||||
$wgArticlePath, $wgScriptPath, $wgServer, $wgContLang,
|
||||
$wgVariantArticlePath, $wgActionPaths, $wgVersion,
|
||||
|
|
@ -106,7 +113,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
|||
|
||||
wfRunHooks( 'ResourceLoaderGetConfigVars', array( &$vars ) );
|
||||
|
||||
return $vars;
|
||||
$this->configVars[$hash] = $vars;
|
||||
return $this->configVars[$hash];
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -278,7 +286,8 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
|||
|
||||
$time = max(
|
||||
wfTimestamp( TS_UNIX, $wgCacheEpoch ),
|
||||
filemtime( "$IP/resources/startup.js" )
|
||||
filemtime( "$IP/resources/startup.js" ),
|
||||
$this->getHashMtime( $context )
|
||||
);
|
||||
|
||||
// ATTENTION!: Because of the line below, this is not going to cause
|
||||
|
|
@ -297,6 +306,25 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
|
|||
return $this->modifiedTime[$hash];
|
||||
}
|
||||
|
||||
/**
|
||||
* Hash of all dynamic data embedded in getScript().
|
||||
*
|
||||
* Detect changes to mw.config settings embedded in #getScript (bug 28899).
|
||||
*
|
||||
* @param $context ResourceLoaderContext
|
||||
* @return string: Hash
|
||||
*/
|
||||
public function getModifiedHash( ResourceLoaderContext $context ) {
|
||||
global $wgLegacyJavaScriptGlobals;
|
||||
|
||||
$data = array(
|
||||
'vars' => $this->getConfig( $context ),
|
||||
'wgLegacyJavaScriptGlobals' => $wgLegacyJavaScriptGlobals,
|
||||
);
|
||||
|
||||
return md5( serialize( $data ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue