mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 12:05:37 +00:00
BUGFIX Added Requirements::path_for_file() to support external URLs in required paths (incl. unit test)
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/trunk@60415 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
15b11e3f13
commit
655802177c
@ -278,7 +278,6 @@ class Requirements {
|
||||
if(isset($_GET['debug_profile'])) Profiler::mark("Requirements::includeInHTML");
|
||||
|
||||
if(strpos($content, '</head') !== false && (Requirements::$javascript || Requirements::$css || Requirements::$customScript || Requirements::$customHeadTags)) {
|
||||
$prefix = Director::absoluteBaseURL();
|
||||
$requirements = '';
|
||||
$jsRequirements = '';
|
||||
|
||||
@ -286,10 +285,9 @@ class Requirements {
|
||||
self::process_combined_files();
|
||||
|
||||
foreach(array_diff_key(self::$javascript,self::$blocked) as $file => $dummy) {
|
||||
if(substr($file,0,7) == 'http://' || Director::fileExists($file)) {
|
||||
if(Director::fileExists($file)) $mtimesuffix = "?m=" . filemtime(Director::baseFolder() . '/' . $file);
|
||||
else $mtimesuffix = '';
|
||||
$jsRequirements .= "<script type=\"text/javascript\" src=\"$prefix$file$mtimesuffix\"></script>\n";
|
||||
$path = self::path_for_file($file);
|
||||
if($path) {
|
||||
$jsRequirements .= "<script type=\"text/javascript\" src=\"$path\"></script>\n";
|
||||
}
|
||||
}
|
||||
|
||||
@ -304,11 +302,10 @@ class Requirements {
|
||||
}
|
||||
|
||||
foreach(array_diff_key(self::$css,self::$blocked) as $file => $params) {
|
||||
if(Director::fileExists($file)) {
|
||||
$path = self::path_for_file($file);
|
||||
if($path) {
|
||||
$media = (isset($params['media']) && !empty($params['media'])) ? " media=\"{$params['media']}\"" : "";
|
||||
if(Director::fileExists($file)) $mtimesuffix = "?m=" . filemtime(Director::baseFolder() . '/' .$file);
|
||||
else $mtimesuffix = '';
|
||||
$requirements .= "<link rel=\"stylesheet\" type=\"text/css\"{$media} href=\"$prefix$file$mtimesuffix\" />\n";
|
||||
$requirements .= "<link rel=\"stylesheet\" type=\"text/css\"{$media} href=\"$path\" />\n";
|
||||
}
|
||||
}
|
||||
foreach(array_diff_key(self::$customCSS,self::$blocked) as $css) {
|
||||
@ -348,6 +345,24 @@ class Requirements {
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param string $fileOrUrl
|
||||
* @return string|boolean
|
||||
*/
|
||||
protected static function path_for_file($fileOrUrl) {
|
||||
if(preg_match('/^http[s]?/', $fileOrUrl)) {
|
||||
return $fileOrUrl;
|
||||
} elseif(Director::fileExists($fileOrUrl)) {
|
||||
$prefix = Director::absoluteBaseURL();
|
||||
$mtimesuffix = "?m=" . filemtime(Director::baseFolder() . '/' . $fileOrUrl);
|
||||
return "{$prefix}{$fileOrUrl}{$mtimesuffix}";
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Concatenate several css or javascript files into a single dynamically generated
|
||||
* file (stored in {@link Director::baseFolder()}). This increases performance
|
||||
|
@ -10,6 +10,32 @@ class RequirementsTest extends SapphireTest {
|
||||
|
||||
static $html_template = '<html><head></head><body></body></html>';
|
||||
|
||||
function testExternalUrls() {
|
||||
Requirements::javascript('http://www.mydomain.com/test.js');
|
||||
Requirements::javascript('https://www.mysecuredomain.com/test.js');
|
||||
Requirements::css('http://www.mydomain.com/test.css');
|
||||
Requirements::css('https://www.mysecuredomain.com/test.css');
|
||||
|
||||
$html = Requirements::includeInHTML(false, self::$html_template);
|
||||
|
||||
$this->assertTrue(
|
||||
(strpos($html, 'http://www.mydomain.com/test.js') !== false),
|
||||
'Load external javascript URL'
|
||||
);
|
||||
$this->assertTrue(
|
||||
(strpos($html, 'https://www.mysecuredomain.com/test.js') !== false),
|
||||
'Load external secure javascript URL'
|
||||
);
|
||||
$this->assertTrue(
|
||||
(strpos($html, 'http://www.mydomain.com/test.css') !== false),
|
||||
'Load external CSS URL'
|
||||
);
|
||||
$this->assertTrue(
|
||||
(strpos($html, 'https://www.mysecuredomain.com/test.css') !== false),
|
||||
'Load external secure CSS URL'
|
||||
);
|
||||
}
|
||||
|
||||
function testCombinedJavascript() {
|
||||
$this->setupCombinedRequirements();
|
||||
|
||||
@ -39,13 +65,15 @@ class RequirementsTest extends SapphireTest {
|
||||
|
||||
function testBlockedCombinedJavascript() {
|
||||
$combinedFilePath = Director::baseFolder() . '/' . 'bc.js';
|
||||
|
||||
|
||||
/* BLOCKED COMBINED FILES ARE NOT INCLUDED */
|
||||
$this->setupCombinedRequirements();
|
||||
Requirements::block('bc.js');
|
||||
Requirements::clear_combined_files('bc.js');
|
||||
|
||||
clearstatcache(); // needed to get accurate file_exists() results
|
||||
$html = Requirements::includeInHTML(false, self::$html_template);
|
||||
|
||||
$this->assertFalse((bool)preg_match('/src=".*\/bc\.js/', $html), 'blocked combined files are not included ');
|
||||
Requirements::unblock('bc.js');
|
||||
|
||||
@ -73,7 +101,8 @@ class RequirementsTest extends SapphireTest {
|
||||
$combinedFiles = Requirements::get_combine_files();
|
||||
$this->assertEquals(
|
||||
array_keys($combinedFiles),
|
||||
array('bc.js')
|
||||
array('bc.js'),
|
||||
"A single file can't be included in two combined files"
|
||||
);
|
||||
|
||||
Requirements::clear_combined_files('bc.js');
|
||||
@ -104,6 +133,7 @@ class RequirementsTest extends SapphireTest {
|
||||
'sapphire/tests/forms/c.js'
|
||||
)
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user