Merge "CSSMin: remove dot segments in relative local URLs"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 20 Aug 2015 14:11:36 +0000 (14:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 20 Aug 2015 14:11:36 +0000 (14:11 +0000)
1  2 
includes/libs/CSSMin.php
tests/phpunit/includes/libs/CSSMinTest.php

diff --combined includes/libs/CSSMin.php
@@@ -399,16 -399,16 +399,16 @@@ class CSSMin 
  
                if ( $local === false ) {
                        // Assume that all paths are relative to $remote, and make them absolute
-                       return $remote . '/' . $url;
+                       $url = $remote . '/' . $url;
                } else {
                        // We drop the query part here and instead make the path relative to $remote
                        $url = "{$remote}/{$file}";
                        // Path to the actual file on the filesystem
                        $localFile = "{$local}/{$file}";
                        if ( file_exists( $localFile ) ) {
 -                              // Add version parameter as a time-stamp in ISO 8601 format,
 -                              // using Z for the timezone, meaning GMT
 -                              $url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $localFile ), -2 ) );
 +                              // Add version parameter as the first five hex digits
 +                              // of the MD5 hash of the file's contents.
 +                              $url .= '?' . substr( md5_file( $localFile ), 0, 5 );
                                if ( $embed ) {
                                        $data = self::encodeImageAsDataURI( $localFile );
                                        if ( $data !== false ) {
                        }
                        // If any of these conditions failed (file missing, we don't want to embed it
                        // or it's not embeddable), return the URL (possibly with ?timestamp part)
-                       return $url;
                }
+               if ( function_exists( 'wfRemoveDotSegments' ) ) {
+                       $url = wfRemoveDotSegments( $url );
+               }
+               return $url;
        }
  
        /**
@@@ -102,12 -102,12 +102,12 @@@ class CSSMinTest extends MediaWikiTestC
                        array(
                                'Without trailing slash',
                                array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux', false ),
-                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                               'foo { prop: url(http://example.org/bar.png); }',
                        ),
                        array(
                                'With trailing slash on remote (bug 27052)',
                                array( 'foo { prop: url(../bar.png); }', false, 'http://example.org/quux/', false ),
-                               'foo { prop: url(http://example.org/quux/../bar.png); }',
+                               'foo { prop: url(http://example.org/bar.png); }',
                        ),
                        array(
                                'Guard against stripping double slashes from query',
                $remotePath = 'http://localhost/w/';
  
                $realOutput = CSSMin::remap( $input, $localPath, $remotePath );
 -
 -              $this->assertEquals(
 -                      $expectedOutput,
 -                      preg_replace( '/\d+-\d+-\d+T\d+:\d+:\d+Z/', 'timestamp', $realOutput ),
 -                      "CSSMin::remap: $message"
 -              );
 +              $this->assertEquals( $expectedOutput, $realOutput, "CSSMin::remap: $message" );
        }
  
        public static function provideIsRemoteUrl() {
                        array(
                                'Regular file',
                                'foo { background: url(red.gif); }',
 -                              'foo { background: url(http://localhost/w/red.gif?timestamp); }',
 +                              'foo { background: url(http://localhost/w/red.gif?34ac6); }',
                        ),
                        array(
                                'Regular file (missing)',
                        array(
                                'Embedded file',
                                'foo { /* @embed */ background: url(red.gif); }',
 -                              "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; }",
 +                              "foo { background: url($red); background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Embedded file, other comments before the rule',
                                "foo { /* Bar. */ /* @embed */ background: url(red.gif); }",
 -                              "foo { /* Bar. */ background: url($red); /* Bar. */ background: url(http://localhost/w/red.gif?timestamp)!ie; }",
 +                              "foo { /* Bar. */ background: url($red); /* Bar. */ background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Can not re-embed data: URIs',
                                'Embedded file (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif); }',
                                "foo { background: url($red); "
 -                                      . "background: url(http://localhost/w/red.gif?timestamp)!ie; }",
 +                                      . "background: url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Can not embed large files',
                                'foo { /* @embed */ background: url(large.png); }',
 -                              "foo { background: url(http://localhost/w/large.png?timestamp); }",
 +                              "foo { background: url(http://localhost/w/large.png?e3d1f); }",
                        ),
                        array(
                                'SVG files are embedded without base64 encoding and unnecessary IE 6 and 7 fallback',
                        array(
                                'Two regular files in one rule',
                                'foo { background: url(red.gif), url(green.gif); }',
 -                              'foo { background: url(http://localhost/w/red.gif?timestamp), '
 -                                      . 'url(http://localhost/w/green.gif?timestamp); }',
 +                              'foo { background: url(http://localhost/w/red.gif?34ac6), '
 +                                      . 'url(http://localhost/w/green.gif?13651); }',
                        ),
                        array(
                                'Two embedded files in one rule',
                                'foo { /* @embed */ background: url(red.gif), url(green.gif); }',
                                "foo { background: url($red), url($green); "
 -                                      . "background: url(http://localhost/w/red.gif?timestamp), "
 -                                      . "url(http://localhost/w/green.gif?timestamp)!ie; }",
 +                                      . "background: url(http://localhost/w/red.gif?34ac6), "
 +                                      . "url(http://localhost/w/green.gif?13651)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed)',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(green.gif); }',
                                "foo { background: url($red), url($green); "
 -                                      . "background: url(http://localhost/w/red.gif?timestamp), "
 -                                      . "url(http://localhost/w/green.gif?timestamp)!ie; }",
 +                                      . "background: url(http://localhost/w/red.gif?34ac6), "
 +                                      . "url(http://localhost/w/green.gif?13651)!ie; }",
                        ),
                        array(
                                'Two embedded files in one rule (inline @embed), one too large',
                                'foo { background: /* @embed */ url(red.gif), /* @embed */ url(large.png); }',
 -                              "foo { background: url($red), url(http://localhost/w/large.png?timestamp); "
 -                                      . "background: url(http://localhost/w/red.gif?timestamp), "
 -                                      . "url(http://localhost/w/large.png?timestamp)!ie; }",
 +                              "foo { background: url($red), url(http://localhost/w/large.png?e3d1f); "
 +                                      . "background: url(http://localhost/w/red.gif?34ac6), "
 +                                      . "url(http://localhost/w/large.png?e3d1f)!ie; }",
                        ),
                        array(
                                'Practical example with some noise',
                                'foo { /* @embed */ background: #f9f9f9 url(red.gif) 0 0 no-repeat; }',
                                "foo { background: #f9f9f9 url($red) 0 0 no-repeat; "
 -                                      . "background: #f9f9f9 url(http://localhost/w/red.gif?timestamp) 0 0 no-repeat!ie; }",
 +                                      . "background: #f9f9f9 url(http://localhost/w/red.gif?34ac6) 0 0 no-repeat!ie; }",
                        ),
                        array(
                                'Does not mess with other properties',
                                'foo { color: red; background: url(red.gif); font-size: small; }',
 -                              'foo { color: red; background: url(http://localhost/w/red.gif?timestamp); font-size: small; }',
 +                              'foo { color: red; background: url(http://localhost/w/red.gif?34ac6); font-size: small; }',
                        ),
                        array(
                                'Spacing and miscellanea not changed (1)',
                                'foo {   background:    url(red.gif);  }',
 -                              'foo {   background:    url(http://localhost/w/red.gif?timestamp);  }',
 +                              'foo {   background:    url(http://localhost/w/red.gif?34ac6);  }',
                        ),
                        array(
                                'Spacing and miscellanea not changed (2)',
                                'foo {background:url(red.gif)}',
 -                              'foo {background:url(http://localhost/w/red.gif?timestamp)}',
 +                              'foo {background:url(http://localhost/w/red.gif?34ac6)}',
                        ),
                        array(
                                'Spaces within url() parentheses are ignored',
                                'foo { background: url( red.gif ); }',
 -                              'foo { background: url(http://localhost/w/red.gif?timestamp); }',
 +                              'foo { background: url(http://localhost/w/red.gif?34ac6); }',
                        ),
                        array(
                                '@import rule to local file (should we remap this?)',
                        array(
                                'Simple case with comments after url',
                                'foo { prop: url(red.gif)/* some {funny;} comment */ ; }',
 -                              'foo { prop: url(http://localhost/w/red.gif?timestamp)/* some {funny;} comment */ ; }',
 +                              'foo { prop: url(http://localhost/w/red.gif?34ac6)/* some {funny;} comment */ ; }',
                        ),
                        array(
                                'Embedded file with comment before url',
                                'foo { /* @embed */ background: /* some {funny;} comment */ url(red.gif); }',
 -                              "foo { background: /* some {funny;} comment */ url($red); background: /* some {funny;} comment */ url(http://localhost/w/red.gif?timestamp)!ie; }",
 +                              "foo { background: /* some {funny;} comment */ url($red); background: /* some {funny;} comment */ url(http://localhost/w/red.gif?34ac6)!ie; }",
                        ),
                        array(
                                'Embedded file with comments inside and outside the rule',
                                'foo { /* @embed */ background: url(red.gif) /* some {foo;} comment */; /* some {bar;} comment */ }',
 -                              "foo { background: url($red) /* some {foo;} comment */; background: url(http://localhost/w/red.gif?timestamp) /* some {foo;} comment */!ie; /* some {bar;} comment */ }",
 +                              "foo { background: url($red) /* some {foo;} comment */; background: url(http://localhost/w/red.gif?34ac6) /* some {foo;} comment */!ie; /* some {bar;} comment */ }",
                        ),
                        array(
                                'Embedded file with comment outside the rule',
                                'foo { /* @embed */ background: url(red.gif); /* some {funny;} comment */ }',
 -                              "foo { background: url($red); background: url(http://localhost/w/red.gif?timestamp)!ie; /* some {funny;} comment */ }",
 +                              "foo { background: url($red); background: url(http://localhost/w/red.gif?34ac6)!ie; /* some {funny;} comment */ }",
                        ),
                        array(
                                'Rule with two urls, each with comments',