mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge branch '3.5' into 3
This commit is contained in:
commit
1f0e1913cd
@ -21,7 +21,7 @@
|
|||||||
<% end_if %>
|
<% end_if %>
|
||||||
<ul class="cms-tabset-nav-primary">
|
<ul class="cms-tabset-nav-primary">
|
||||||
<% loop $ManagedModelTabs %>
|
<% loop $ManagedModelTabs %>
|
||||||
<li class="tab-$ClassName $LinkOrCurrent<% if $LinkOrCurrent == 'current' %> ui-tabs-active<% end_if %>">
|
<li class="tab-$ClassName $LinkOrCurrent<% if $LinkOrCurrent == 'current' %> ui-tabs-active<% end_if %>" aria-controls="Form_EditForm">
|
||||||
<a href="$Link" class="cms-panel-link" title="$Title.ATT">$Title</a>
|
<a href="$Link" class="cms-panel-link" title="$Title.ATT">$Title</a>
|
||||||
</li>
|
</li>
|
||||||
<% end_loop %>
|
<% end_loop %>
|
||||||
|
@ -452,6 +452,36 @@ class RequirementsTest extends SapphireTest {
|
|||||||
$this->assertNotRegexp('/RequirementsTest_b\.css\?m=[\d]*&foo=bar&bla=blubb"/', $html);
|
$this->assertNotRegexp('/RequirementsTest_b\.css\?m=[\d]*&foo=bar&bla=blubb"/', $html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensure that if a JS snippet somewhere in the page (via requirements) contains </head> that it doesn't
|
||||||
|
* get injected with requirements
|
||||||
|
*/
|
||||||
|
public function testHeadTagIsNotInjectedTwice() {
|
||||||
|
$template = '<html><head></head><body><header>My header</header><p>Body</p></body></html>';
|
||||||
|
$basePath = $this->getCurrentRelativePath();
|
||||||
|
|
||||||
|
$backend = new Requirements_Backend;
|
||||||
|
// The offending snippet that contains a closing head tag
|
||||||
|
$backend->customScript('var myvar="<head></head>";');
|
||||||
|
// Insert a variety of random requirements
|
||||||
|
$backend->css($basePath .'/RequirementsTest_a.css');
|
||||||
|
$backend->javascript($basePath .'/RequirementsTest_a.js');
|
||||||
|
$backend->insertHeadTags('<link rel="alternate" type="application/atom+xml" title="test" href="/" />');
|
||||||
|
|
||||||
|
// Case A: JS forced to bottom
|
||||||
|
$backend->set_force_js_to_bottom(true);
|
||||||
|
$this->assertContains('var myvar="<head></head>";', $backend->includeInHTML(false, $template));
|
||||||
|
|
||||||
|
// Case B: JS written to body
|
||||||
|
$backend->set_force_js_to_bottom(false);
|
||||||
|
$backend->set_write_js_to_body(true);
|
||||||
|
$this->assertContains('var myvar="<head></head>";', $backend->includeInHTML(false, $template));
|
||||||
|
|
||||||
|
// Case C: Neither of the above
|
||||||
|
$backend->set_write_js_to_body(false);
|
||||||
|
$this->assertContains('var myvar="<head></head>";', $backend->includeInHTML(false, $template));
|
||||||
|
}
|
||||||
|
|
||||||
public function assertFileIncluded($backend, $type, $files) {
|
public function assertFileIncluded($backend, $type, $files) {
|
||||||
$type = strtolower($type);
|
$type = strtolower($type);
|
||||||
switch (strtolower($type)) {
|
switch (strtolower($type)) {
|
||||||
|
@ -863,19 +863,18 @@ class Requirements_Backend {
|
|||||||
$requirements .= "$customHeadTag\n";
|
$requirements .= "$customHeadTag\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$replacements = array();
|
||||||
if ($this->force_js_to_bottom) {
|
if ($this->force_js_to_bottom) {
|
||||||
// Remove all newlines from code to preserve layout
|
$jsRequirements = $this->removeNewlinesFromCode($jsRequirements);
|
||||||
$jsRequirements = preg_replace('/>\n*/', '>', $jsRequirements);
|
|
||||||
|
|
||||||
// Forcefully put the scripts at the bottom of the body instead of before the first
|
// Forcefully put the scripts at the bottom of the body instead of before the first
|
||||||
// script tag.
|
// script tag.
|
||||||
$content = preg_replace("/(<\/body[^>]*>)/i", $jsRequirements . "\\1", $content);
|
$replacements["/(<\/body[^>]*>)/i"] = $jsRequirements . "\\1";
|
||||||
|
|
||||||
// Put CSS at the bottom of the head
|
// Put CSS at the bottom of the head
|
||||||
$content = preg_replace("/(<\/head>)/i", $requirements . "\\1", $content);
|
$replacements["/(<\/head>)/i"] = $requirements . "\\1";
|
||||||
} elseif($this->write_js_to_body) {
|
} elseif ($this->write_js_to_body) {
|
||||||
// Remove all newlines from code to preserve layout
|
$jsRequirements = $this->removeNewlinesFromCode($jsRequirements);
|
||||||
$jsRequirements = preg_replace('/>\n*/', '>', $jsRequirements);
|
|
||||||
|
|
||||||
// If your template already has script tags in the body, then we try to put our script
|
// If your template already has script tags in the body, then we try to put our script
|
||||||
// tags just before those. Otherwise, we put it at the bottom.
|
// tags just before those. Otherwise, we put it at the bottom.
|
||||||
@ -892,23 +891,38 @@ class Requirements_Backend {
|
|||||||
$commentTags[1] == '-->'
|
$commentTags[1] == '-->'
|
||||||
);
|
);
|
||||||
|
|
||||||
if($canWriteToBody) {
|
if ($canWriteToBody) {
|
||||||
$content = substr($content,0,$p1) . $jsRequirements . substr($content,$p1);
|
$content = substr($content, 0, $p1) . $jsRequirements . substr($content, $p1);
|
||||||
} else {
|
} else {
|
||||||
$content = preg_replace("/(<\/body[^>]*>)/i", $jsRequirements . "\\1", $content);
|
$replacements["/(<\/body[^>]*>)/i"] = $jsRequirements . "\\1";
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put CSS at the bottom of the head
|
// Put CSS at the bottom of the head
|
||||||
$content = preg_replace("/(<\/head>)/i", $requirements . "\\1", $content);
|
$replacements["/(<\/head>)/i"] = $requirements . "\\1";
|
||||||
} else {
|
} else {
|
||||||
$content = preg_replace("/(<\/head>)/i", $requirements . "\\1", $content);
|
// Put CSS and Javascript together before the closing head tag
|
||||||
$content = preg_replace("/(<\/head>)/i", $jsRequirements . "\\1", $content);
|
$replacements["/(<\/head>)/i"] = $requirements . $jsRequirements. "\\1";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($replacements)) {
|
||||||
|
// Replace everything at once (only once)
|
||||||
|
$content = preg_replace(array_keys($replacements), array_values($replacements), $content, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $content;
|
return $content;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all newlines from code to preserve layout
|
||||||
|
*
|
||||||
|
* @param string $code
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected function removeNewlinesFromCode($code) {
|
||||||
|
return preg_replace('/>\n*/', '>', $code);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Attach requirements inclusion to X-Include-JS and X-Include-CSS headers on the given
|
* Attach requirements inclusion to X-Include-JS and X-Include-CSS headers on the given
|
||||||
* HTTP Response
|
* HTTP Response
|
||||||
|
Loading…
Reference in New Issue
Block a user