Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/twbs/mq4-hover-shim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorChris Rebert <code@rebertia.com>2015-01-19 03:57:41 +0300
committerChris Rebert <code@rebertia.com>2015-01-19 03:57:41 +0300
commit9d035dd8ce8301982f3f28b6017625c29f0f59da (patch)
tree18317c4ef659c9e6a1bb3f86261cfffe15429dbc /src
parent2ee4471b3df5e924109d22461b8c67432322116d (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.js55
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.
+ }
+ }
});
});