Commit 7faedbdd authored by Dries's avatar Dries

- Patch #460448 by sun: some CSS rules are broken once CSS aggregation is enabled.

parent 17d30dc3
......@@ -3463,13 +3463,34 @@ function drupal_load_stylesheet_content($contents, $optimize = FALSE) {
$double_quot = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
// Regexp to match single quoted strings.
$single_quot = "'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
// Strip all comment blocks, but keep double/single quoted strings.
$contents = preg_replace(
"<($double_quot|$single_quot)|$comment>Ss", // Strip all comment blocks
"$1", // but keep double/single
$contents); // quoted strings.
$contents = preg_replace(
'<\s*([@{}:;,]|\)\s|\s\()\s*>S', // Remove whitespace around separators,
'\1', $contents); // but keep space around parentheses.
"<($double_quot|$single_quot)|$comment>Ss",
"$1",
$contents
);
// Remove certain whitespace.
// There are different conditions for removing leading and trailing
// whitespace. To be able to use a single backreference in the replacement
// string, the outer pattern uses the ?| modifier, which makes all contained
// subpatterns appear in \1.
// @see http://php.net/manual/en/regexp.reference.subpatterns.php
$contents = preg_replace('<
(?|
# Strip leading and trailing whitespace.
\s*([@{};,])\s*
# Strip only leading whitespace from:
# - Closing parenthesis: Retain "@media (bar) and foo".
| \s+([\)])
# Strip only trailing whitespace from:
# - Opening parenthesis: Retain "@media (bar) and foo".
# - Colon: Retain :pseudo-selectors.
| ([\(:])\s+
)
>xS',
'\1',
$contents
);
// End the file with a new line.
$contents .= "\n";
}
......
......@@ -19,10 +19,9 @@ body {
}
/**
* CSS spec says that all whitespace is valid whitespace, so this selector should be just as
* good as the one above.
* CSS spec says that all whitespace is valid whitespace, so this selector
* should be just as good as the one above.
*/
.this
.is
.a
......@@ -31,6 +30,39 @@ font: 1em/100% Verdana, sans-serif;
color: #494949;
}
some :pseudo .thing {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10');
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";
}
::-moz-selection {
background: #000;
color:#fff;
}
::selection {
background: #000;
color: #fff;
}
@media print {
* {
background: #000 !important;
color: #fff !important;
}
@page {
margin: 0.5cm;
}
}
@media screen and (max-device-width: 480px) {
background: #000;
color: #fff;
}
textarea, select {
font: 1em/160% Verdana, sans-serif;
color: #494949;
......
......@@ -6,4 +6,4 @@
body{margin:0;padding:0;background:#edf5fa;font:76%/170% Verdana,sans-serif;color:#494949;}.this .is .a .test{font:1em/100% Verdana,sans-serif;color:#494949;}.this
.is
.a
.test{font:1em/100% Verdana,sans-serif;color:#494949;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;}
.test{font:1em/100% Verdana,sans-serif;color:#494949;}some :pseudo .thing{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10');-ms-filter:"progid:DXImageTransform.Microsoft.Shadow(color=#000000,direction='180',strength='10')";}::-moz-selection{background:#000;color:#fff;}::selection{background:#000;color:#fff;}@media print{*{background:#000 !important;color:#fff !important;}@page{margin:0.5cm;}}@media screen and (max-device-width:480px){background:#000;color:#fff;}textarea,select{font:1em/160% Verdana,sans-serif;color:#494949;}
......@@ -19,10 +19,9 @@ body {
}
/**
* CSS spec says that all whitespace is valid whitespace, so this selector should be just as
* good as the one above.
* CSS spec says that all whitespace is valid whitespace, so this selector
* should be just as good as the one above.
*/
.this
.is
.a
......@@ -31,6 +30,39 @@ font: 1em/100% Verdana, sans-serif;
color: #494949;
}
some :pseudo .thing {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
filter: progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10');
-ms-filter: "progid:DXImageTransform.Microsoft.Shadow(color=#000000, direction='180', strength='10')";
}
::-moz-selection {
background: #000;
color:#fff;
}
::selection {
background: #000;
color: #fff;
}
@media print {
* {
background: #000 !important;
color: #fff !important;
}
@page {
margin: 0.5cm;
}
}
@media screen and (max-device-width: 480px) {
background: #000;
color: #fff;
}
textarea, select {
font: 1em/160% Verdana, sans-serif;
color: #494949;
......
......@@ -862,11 +862,10 @@ class CascadingStylesheetsUnitTest extends DrupalUnitTestCase {
/**
* Tests basic CSS loading with and without optimization via drupal_load_stylesheet().
*
* This can be enhanced by adding additional CSS files with variant test cases.
* Currently, this is specifically testing to make sure that whitespace
* is treated with adequate respect (see http://drupal.org/node/472820) and
* that image paths in imported files are preserved (see
* http://drupal.org/node/265719).
* Known tests:
* - Retain white-space in selectors. (http://drupal.org/node/472820)
* - Proper URLs in imported files. (http://drupal.org/node/265719)
* - Retain pseudo-selectors. (http://drupal.org/node/460448)
*/
function testLoadCssBasic() {
// Array of files to test living in 'simpletest/files/css_test_files/'.
......@@ -882,10 +881,16 @@ class CascadingStylesheetsUnitTest extends DrupalUnitTestCase {
foreach ($testfiles as $file) {
$expected = file_get_contents("$path/$file.unoptimized.css");
$unoptimized_output = drupal_load_stylesheet("$path/$file.unoptimized.css", FALSE);
$this->verbose('Expected:<pre>' . $expected . '</pre>'
. 'Actual:<pre>' . $unoptimized_output . '</pre>'
);
$this->assertEqual($unoptimized_output, $expected, t('Unoptimized CSS file has expected contents (@file)', array('@file' => $file)));
$expected = file_get_contents("$path/$file.optimized.css");
$optimized_output = drupal_load_stylesheet("$path/$file", TRUE);
$this->verbose('Expected:<pre>' . $expected . '</pre>'
. 'Actual:<pre>' . $optimized_output . '</pre>'
);
$this->assertEqual($optimized_output, $expected, t('Optimized CSS file has expected contents (@file)', array('@file' => $file)));
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment