Resolve complex arguments to LESS helper functions
authorErik Bernhardson <ebernhardson@wikimedia.org>
Wed, 23 Apr 2014 02:16:53 +0000 (19:16 -0700)
committerOri.livneh <ori@wikimedia.org>
Wed, 23 Apr 2014 18:50:02 +0000 (18:50 +0000)
The icons in Flow and the Compact Personal Bar beta feature are missing,
their generated background-image 7 is empty.

The lessphp implementation passes full data frames into the helper
functions.  Utilize the now-public compileValue method of less
to evaluate the data frame into a string.

Additionally adds a small abstraction to run pairs of less/css files
as unit tests by executing the less file and comparing it to the
equivalent css file.

Change-Id: I1704f84638d86a0e6e6b9c190972ab19180bd484

includes/resourceloader/ResourceLoaderLESSFunctions.php
tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css [new file with mode: 0644]
tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less [new file with mode: 0644]

index c7570f6..e016a33 100644 (file)
@@ -37,7 +37,7 @@ class ResourceLoaderLESSFunctions {
         */
        public static function embeddable( $frame, $less ) {
                $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = $frame[2][0];
+               $url = trim( $less->compileValue( $frame ), '"\'' );
                $file = realpath( $base . '/' . $url );
                return $less->toBool( $file
                        && strpos( $url, '//' ) === false
@@ -57,7 +57,7 @@ class ResourceLoaderLESSFunctions {
         */
        public static function embed( $frame, $less ) {
                $base = pathinfo( $less->parser->sourceName, PATHINFO_DIRNAME );
-               $url = $frame[2][0];
+               $url = trim( $less->compileValue( $frame ), '"\'' );
                $file = realpath( $base . '/' . $url );
 
                $data = CSSMin::encodeImageAsDataURI( $file );
diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderLESSTest.php
new file mode 100644 (file)
index 0000000..75e54d3
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+class ResourceLoaderLESSTest extends MediaWikiTestCase {
+       public static function lessProvider() {
+               $result = array();
+               foreach ( glob( __DIR__ . '/fixtures/*.less' ) as $file ) {
+                       $result[] = array( $file );
+               }
+
+               return $result;
+       }
+
+       /**
+        * @dataProvider lessProvider
+        */
+       public function testLessFile( $lessFile ) {
+               $cssFile = substr( $lessFile, 0, -4 ) . 'css';
+               if ( !file_exists( $cssFile ) ) {
+                       $this->fail( "No css file found to assert equal to $lessFile" );
+                       return;
+               }
+
+               $expect = file_get_contents( $cssFile );
+               $content = file_get_contents( $lessFile );
+               $result = ResourceLoader::getLessCompiler()->compile( $content, $lessFile );
+               $this->assertEquals( $expect, $result );
+       }
+}
diff --git a/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css b/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.css
new file mode 100644 (file)
index 0000000..b291c5e
--- /dev/null
@@ -0,0 +1,9 @@
+.box {
+  content: not-embeddable;
+}
+.box {
+  content: embeddable;
+}
+.box {
+  content: embeddable;
+}
diff --git a/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less b/tests/phpunit/includes/resourceloader/fixtures/001-embeddable.less
new file mode 100644 (file)
index 0000000..7018aa2
--- /dev/null
@@ -0,0 +1,20 @@
+@base: '../fixtures/';
+
+.helper(@url) when (embeddable(@url)) {
+       content: embeddable;
+}
+.helper(@url) when not (embeddable(@url)) {
+       content: not-embeddable;
+}
+
+.box {
+       .helper('path/to/nonexistent/file');
+}
+
+.box {
+       .helper('001-embeddable.css');
+}
+
+.box {
+       .helper("@{base}001-embeddable.css");
+}