For any other module, the document root would get processed only once, but for SkinModule the internal paths would be for the skin directory, and the path for core ends up processed once. Once in SkinModule::getStyleFiles via extractBasePaths(), which turns a document root (wgScript=wgResourceBasePath="") empty string into a slash (as it should). And then again later by FilePath::getRemotePath when it is time to perform background image remapping. The hybrid approach of SkinModule hasn't really been supported or tested for in this case, but it hasn't been an issue for most installs because the paths naturally don't end up ambiguous, except for document root installs. This is likely not the last we've seen of this, but for now it seems feasible to try to make FilePath responsible for handling this when it is encountered . Bug: T284391 Change-Id: I6f5f232bd6da6c655246a5e678a5600889cd78aa
85 lines
2.4 KiB
PHP
85 lines
2.4 KiB
PHP
<?php
|
|
/**
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* @file
|
|
*/
|
|
|
|
/**
|
|
* An object to represent a path to a JavaScript/CSS file, along with a remote
|
|
* and local base path, for use with ResourceLoaderFileModule.
|
|
*
|
|
* @ingroup ResourceLoader
|
|
* @since 1.17
|
|
*/
|
|
class ResourceLoaderFilePath {
|
|
/** @var string Local base path */
|
|
protected $localBasePath;
|
|
|
|
/** @var string Remote base path */
|
|
protected $remoteBasePath;
|
|
|
|
/** @var string Path to the file */
|
|
protected $path;
|
|
|
|
/**
|
|
* @param string $path Relative path to the file, no leading slash.
|
|
* @param string $localBasePath Base path to prepend when generating a local path.
|
|
* @param string $remoteBasePath Base path to prepend when generating a remote path.
|
|
* Should not have a trailing slash unless at web document root.
|
|
*/
|
|
public function __construct( $path, $localBasePath = '', $remoteBasePath = '' ) {
|
|
$this->path = $path;
|
|
$this->localBasePath = $localBasePath;
|
|
$this->remoteBasePath = $remoteBasePath;
|
|
}
|
|
|
|
/** @return string */
|
|
public function getLocalPath() {
|
|
return $this->localBasePath === '' ?
|
|
$this->path :
|
|
"{$this->localBasePath}/{$this->path}";
|
|
}
|
|
|
|
/** @return string */
|
|
public function getRemotePath() {
|
|
if ( $this->remoteBasePath === '' ) {
|
|
// No base path configured
|
|
return $this->path;
|
|
}
|
|
if ( $this->remoteBasePath === '/' ) {
|
|
// In document root
|
|
// Don't insert another slash (T284391).
|
|
return $this->remoteBasePath . $this->path;
|
|
}
|
|
return "{$this->remoteBasePath}/{$this->path}";
|
|
}
|
|
|
|
/** @return string */
|
|
public function getLocalBasePath() {
|
|
return $this->localBasePath;
|
|
}
|
|
|
|
/** @return string */
|
|
public function getRemoteBasePath() {
|
|
return $this->remoteBasePath;
|
|
}
|
|
|
|
/** @return string */
|
|
public function getPath() {
|
|
return $this->path;
|
|
}
|
|
}
|