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:
Ingo Schommer 2008-08-11 07:22:50 +00:00
parent 15b11e3f13
commit 655802177c
2 changed files with 56 additions and 11 deletions

View File

@ -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

View File

@ -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'
)
);
}
}