diff --git a/src/Asset/CssOptimizer.php b/src/Asset/CssOptimizer.php index 494e9af..0d278e3 100644 --- a/src/Asset/CssOptimizer.php +++ b/src/Asset/CssOptimizer.php @@ -109,7 +109,7 @@ class CssOptimizer extends AssetOptimizer { * @return string * The updated contents. */ - protected function updateUrls($contents, $path) { + public function updateUrls($contents, $path) { // Determine the file's directory. $directory = '/' . dirname($path); @@ -119,6 +119,8 @@ class CssOptimizer extends AssetOptimizer { // Alter all internal url() paths. Leave external paths alone. We don't need // to normalize absolute paths here because that will be done later. + // Expected form: url("/images/file.jpg") which gets converted to + // url("${directory}/images/file.jpg"). return preg_replace('/url\(\s*([\'"]?)(?![a-z]+:|\/+)([^\'")]+)([\'"]?)\s*\)/i', 'url(\1' . $directory . '\2\3)', $contents); } diff --git a/tests/src/Kernel/Asset/CssOptimizerUnitTest.php b/tests/src/Kernel/Asset/CssOptimizerUnitTest.php new file mode 100644 index 0000000..c52474a --- /dev/null +++ b/tests/src/Kernel/Asset/CssOptimizerUnitTest.php @@ -0,0 +1,83 @@ +installConfig('advagg'); + $this->optimizer = \Drupal::service('advagg.optimizer.css'); + $this->dir = base_path() . 'modules/contrib/advagg/tests/src/Kernel/Asset/'; + } + + /** + * Provides data for the url update test. + */ + public function providerTestUrlUpdate() { + return [ + [ + 'url_test_same_dir.css', + $this->dir . 'css_test_files/icon-foo.svg', + ], + [ + 'url_test_child_dir.css', + $this->dir . 'css_test_files/images/icon-foo.svg', + ], + [ + 'url_test_parent_dir.css', + $this->dir . 'css_test_files/../images/icon-foo.svg', + ], + ]; + } + + /** + * Tests the urlUpdate() method. + * + * @param string $file + * The file to test. + * @param string $expected + * The expected url string. + * + * @dataProvider providerTestUrlUpdate + */ + public function testUrlUpdate($file, $expected) { + $path = $this->dir . 'css_test_files/' . $file; + $absolute_path = dirname(__FIlE__) . '/css_test_files/'; + $contents = file_get_contents($absolute_path . $file); + $replaced_urls = $this->optimizer->updateUrls($contents, $path); + $this->assertTrue(strstr($replaced_urls, $expected)); + } + +} diff --git a/tests/src/Kernel/Asset/css_test_files/url_test_child_dir.css b/tests/src/Kernel/Asset/css_test_files/url_test_child_dir.css new file mode 100644 index 0000000..8a91715 --- /dev/null +++ b/tests/src/Kernel/Asset/css_test_files/url_test_child_dir.css @@ -0,0 +1,3 @@ +.icon-foo { + background-image: url("images/icon-foo.svg"); +} diff --git a/tests/src/Kernel/Asset/css_test_files/url_test_parent_dir.css b/tests/src/Kernel/Asset/css_test_files/url_test_parent_dir.css new file mode 100644 index 0000000..acd77cc --- /dev/null +++ b/tests/src/Kernel/Asset/css_test_files/url_test_parent_dir.css @@ -0,0 +1,3 @@ +.icon-foo { + background-image: url("../images/icon-foo.svg"); +} diff --git a/tests/src/Kernel/Asset/css_test_files/url_test_same_dir.css b/tests/src/Kernel/Asset/css_test_files/url_test_same_dir.css new file mode 100644 index 0000000..0a88f0c --- /dev/null +++ b/tests/src/Kernel/Asset/css_test_files/url_test_same_dir.css @@ -0,0 +1,3 @@ +.icon-foo { + background-image: url("icon-foo.svg"); +}