From c88091b193aaeeb805b370fb2b8c107c0c92052c Mon Sep 17 00:00:00 2001 From: Jakub Pawlowicz Date: Sat, 2 Sep 2017 20:35:26 +0200 Subject: [PATCH] Fixes #966 - remote `@import`s referenced from local ones. This is an edge case when local `@import` was given by hash and referenced a remote one which was processed synchronously but should have been asynchronously. --- History.md | 1 + lib/reader/read-sources.js | 11 +++++++---- test/protocol-imports-test.js | 21 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/History.md b/History.md index 67ffe34e9..643b93989 100644 --- a/History.md +++ b/History.md @@ -12,6 +12,7 @@ * Fixed issue [#959](https://github.com/jakubpawlowicz/clean-css/issues/959) - regression in shortening long hex values. * Fixed issue [#960](https://github.com/jakubpawlowicz/clean-css/issues/960) - better explanation of `efficiency` stat. * Fixed issue [#965](https://github.com/jakubpawlowicz/clean-css/issues/965) - edge case in parsing comment endings. +* Fixed issue [#966](https://github.com/jakubpawlowicz/clean-css/issues/966) - remote `@import`s referenced from local ones. [4.1.7 / 2017-07-14](https://github.com/jakubpawlowicz/clean-css/compare/v4.1.6...v4.1.7) ================== diff --git a/lib/reader/read-sources.js b/lib/reader/read-sources.js index c9173ed62..1338f6adc 100644 --- a/lib/reader/read-sources.js +++ b/lib/reader/read-sources.js @@ -288,7 +288,6 @@ function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) { path.resolve(inlinerContext.rebaseTo, uri); var relativeToCurrentPath = path.relative(currentPath, absoluteUri); var importedStyles; - var importedTokens; var isAllowed = isAllowedResource(uri, false, inlinerContext.inline); var normalizedPath = normalizePath(relativeToCurrentPath); var isLoaded = normalizedPath in inlinerContext.externalContext.sourcesContent; @@ -316,10 +315,14 @@ function inlineLocalStylesheet(uri, mediaQuery, metadata, inlinerContext) { inlinerContext.externalContext.sourcesContent[normalizedPath] = importedStyles; inlinerContext.externalContext.stats.originalSize += importedStyles.length; - importedTokens = fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (tokens) { return tokens; }); - importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata); + return fromStyles(importedStyles, inlinerContext.externalContext, inlinerContext, function (importedTokens) { + importedTokens = wrapInMedia(importedTokens, mediaQuery, metadata); - inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens); + inlinerContext.outputTokens = inlinerContext.outputTokens.concat(importedTokens); + inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1); + + return doInlineImports(inlinerContext); + }); } inlinerContext.sourceTokens = inlinerContext.sourceTokens.slice(1); diff --git a/test/protocol-imports-test.js b/test/protocol-imports-test.js index 8144c440a..2d315f45a 100644 --- a/test/protocol-imports-test.js +++ b/test/protocol-imports-test.js @@ -472,6 +472,27 @@ vows.describe('protocol imports').addBatch({ nock.cleanAll(); } }, + 'of a remote resource referenced from local one given via hash': { + topic: function () { + this.reqMocks = nock('http://127.0.0.1') + .get('/remote.css') + .reply(200, 'div{padding:0}'); + + new CleanCSS({ inline: 'all' }).minify({ 'local.css': { styles: '@import url(http://127.0.0.1/remote.css);' } }, this.callback); + }, + 'should not raise errors': function (errors, minified) { + assert.isNull(errors); + }, + 'should process @import': function (errors, minified) { + assert.equal(minified.styles, 'div{padding:0}'); + }, + 'hits the endpoint': function () { + assert.isTrue(this.reqMocks.isDone()); + }, + teardown: function () { + nock.cleanAll(); + } + }, 'of a remote resource after content and no callback': { topic: function () { var source = '.one{color:red}@import url(http://127.0.0.1/remote.css);';