return $link;
}
+ /**
+ * Transform path to web-accessible static resource.
+ *
+ * This is used to add a validation hash as query string.
+ * This aids various behaviors:
+ *
+ * - Put long Cache-Control max-age headers on responses for improved
+ * cache performance.
+ * - Get the correct version of a file as expected by the current page.
+ * - Instantly get the updated version of a file after deployment.
+ *
+ * Avoid using this for urls included in HTML as otherwise clients may get different
+ * versions of a resource when navigating the site depending on when the page was cached.
+ * If changes to the url propagate, this is not a problem (e.g. if the url is in
+ * an external stylesheet).
+ *
+ * @since 1.27
+ * @param Config $config
+ * @param string $path Path-absolute URL to file (from document root, must start with "/")
+ * @return string URL
+ */
+ public static function transformResourcePath( Config $config, $path ) {
+ global $IP;
+ $remotePath = $config->get( 'ResourceBasePath' );
+ if ( strpos( $path, $remotePath ) !== 0 ) {
+ // Path is outside wgResourceBasePath, ignore.
+ return $path;
+ }
+ $path = RelPath\getRelativePath( $path, $remotePath );
+ return self::transformFilePath( $remotePath, $IP, $path );
+ }
+
+ /**
+ * Utility method for transformResourceFilePath().
+ *
+ * Caller is responsible for ensuring the file exists. Emits a PHP warning otherwise.
+ *
+ * @since 1.27
+ * @param string $remotePath URL path that points to $localPath
+ * @param string $localPath File directory exposed at $remotePath
+ * @param string $file Path to target file relative to $localPath
+ * @return string URL
+ */
+ public static function transformFilePath( $remotePath, $localPath, $file ) {
+ $hash = md5_file( "$localPath/$file" );
+ if ( $hash === false ) {
+ wfLogWarning( __METHOD__ . ": Failed to hash $localPath/$file" );
+ $hash = '';
+ }
+ return "$remotePath/$file?" . substr( $hash, 0, 5 );
+ }
+
/**
* Transform "media" attribute based on request parameters
*
// Path to the actual file on the filesystem
$localFile = "{$local}/{$file}";
if ( file_exists( $localFile ) ) {
- // Add version parameter as the first five hex digits
- // of the MD5 hash of the file's contents.
- $url .= '?' . substr( md5_file( $localFile ), 0, 5 );
if ( $embed ) {
$data = self::encodeImageAsDataURI( $localFile );
if ( $data !== false ) {
return $data;
}
}
+ if ( method_exists( 'OutputPage', 'transformFilePath' ) ) {
+ $url = OutputPage::transformFilePath( $remote, $local, $file );
+ } else {
+ // Add version parameter as the first five hex digits
+ // of the MD5 hash of the file's contents.
+ $url .= '?' . substr( md5_file( $localFile ), 0, 5 );
+ }
}
// If any of these conditions failed (file missing, we don't want to embed it
// or it's not embeddable), return the URL (possibly with ?timestamp part)
* @return array
*/
public function getStyles( ResourceLoaderContext $context ) {
- $logo = $this->getConfig()->get( 'Logo' );
- $logoHD = $this->getConfig()->get( 'LogoHD' );
+ $conf = $this->getConfig();
+ $logo = $conf->get( 'Logo' );
+ $logoHD = $conf->get( 'LogoHD' );
+
+ $logo1 = OutputPage::transformResourcePath( $conf, $logo );
+ $logo15 = OutputPage::transformResourcePath( $conf, $logoHD['1.5x'] );
+ $logo2 = OutputPage::transformResourcePath( $conf, $logoHD['2x'] );
+
$styles = parent::getStyles( $context );
$styles['all'][] = '.mw-wiki-logo { background-image: ' .
- CSSMin::buildUrlValue( $logo ) .
+ CSSMin::buildUrlValue( $logo1 ) .
'; }';
if ( $logoHD ) {
if ( isset( $logoHD['1.5x'] ) ) {
'(min-resolution: 1.5dppx), ' .
'(min-resolution: 144dpi)'
][] = '.mw-wiki-logo { background-image: ' .
- CSSMin::buildUrlValue( $logoHD['1.5x'] ) . ';' .
+ CSSMin::buildUrlValue( $logo15 ) . ';' .
'background-size: 135px auto; }';
}
if ( isset( $logoHD['2x'] ) ) {
'(min-resolution: 2dppx), ' .
'(min-resolution: 192dpi)'
][] = '.mw-wiki-logo { background-image: ' .
- CSSMin::buildUrlValue( $logoHD['2x'] ) . ';' .
+ CSSMin::buildUrlValue( $logo2 ) . ';' .
'background-size: 135px auto; }';
}
}