diff options
author | Chris Rebert <code@rebertia.com> | 2015-01-19 03:57:41 +0300 |
---|---|---|
committer | Chris Rebert <code@rebertia.com> | 2015-01-19 03:57:41 +0300 |
commit | 9d035dd8ce8301982f3f28b6017625c29f0f59da (patch) | |
tree | 18317c4ef659c9e6a1bb3f86261cfffe15429dbc /src | |
parent | 2ee4471b3df5e924109d22461b8c67432322116d (diff) |
Fix handling of media-type-only media queries
@media print {...} (& similar) were making us crash.
Diffstat (limited to 'src')
-rw-r--r-- | src/nodejs/postprocessor.js | 55 |
1 files changed, 43 insertions, 12 deletions
diff --git a/src/nodejs/postprocessor.js b/src/nodejs/postprocessor.js index 2173bec..c0c5163 100644 --- a/src/nodejs/postprocessor.js +++ b/src/nodejs/postprocessor.js @@ -12,21 +12,27 @@ var postcss = require('postcss'); var mediaQuery = require('css-mediaquery'); -// Checks whether the at-rule is: @media (hover: hover) {...} -function isSimpleMediaHoverHover(atRule) { +// Returns media type iff the at-rule is: @media optional-media-type (hover: hover) {...} +function mediaTypeIfSimpleHoverHover(atRule) { var mediaOrs = mediaQuery.parse(atRule.params); - if (mediaOrs.length > 1) { + if (mediaOrs.length !== 1) { return false; } var mediaAnds = mediaOrs[0]; if (mediaAnds.inverse) { return false; } - if (mediaAnds.expressions.length > 1) { + if (mediaAnds.expressions.length !== 1) { return false; } + var mediaExpr = mediaAnds.expressions[0]; - return mediaExpr.feature === 'hover' && mediaExpr.value === 'hover'; + if (mediaExpr.feature === 'hover' && mediaExpr.value === 'hover') { + return mediaAnds.type; + } + else { + return undefined; + } } function replaceWithItsChildren(atRule) { @@ -69,14 +75,39 @@ module.exports = postcss(function process(css, opts) { } css.eachAtRule('media', function (atRule) { - if (!isSimpleMediaHoverHover(atRule)) { - return; - } + var mediaType = mediaTypeIfSimpleHoverHover(atRule); + switch (mediaType) { + case 'all': + /* falls through */ + case 'screen': { + atRule.eachRule(function (rule) { + prefixSelectorsWith(rule, hoverSelectorPrefix); + }); + if (mediaType === 'screen') { + atRule.params = 'screen'; + } + else { + // Remove tautological @media all {...} wrapper + replaceWithItsChildren(atRule); + } + return; + } - atRule.eachRule(function (rule) { - prefixSelectorsWith(rule, hoverSelectorPrefix); - }); + case 'print': + /* falls through */ + case 'speech': { + // These media types never support hovering + // Delete always-false media query + atRule.removeSelf(); + return; + } - replaceWithItsChildren(atRule); + case undefined: { + return; // Media query irrelevant or too complicated + } + default: { + return; // Deprecated media type; take no action. + } + } }); }); |