wiki.techinc.nl/includes/resourceloader/ResourceLoaderFilePath.php
Timo Tijhof 526c6a4172 resourceloader: Fix remote bash path at document root passed into SkinModule
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
2021-06-08 23:18:22 -07:00

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;
}
}