Skip to content

Commit 125adce

Browse files
committed
Only rewrite mq rules if necessary
1 parent da273e9 commit 125adce

File tree

2 files changed

+39
-7
lines changed

2 files changed

+39
-7
lines changed

src/mediaQueryHelper.js

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -142,25 +142,46 @@ var mediaQueryHelper = (function (cssMediaQuery) {
142142
};
143143

144144
var substituteEmWithPx = function (mediaQuery) {
145-
var parsedQuery = cssMediaQuery.parse(mediaQuery);
145+
var parsedQuery = cssMediaQuery.parse(mediaQuery),
146+
hasChanges = false;
146147

147148
parsedQuery.forEach(function (q) {
148149
q.expressions.forEach(function (exp) {
149-
exp.value = replaceEmValueWithPx(exp.value);
150+
var rewrittenValue = replaceEmValueWithPx(exp.value);
151+
152+
hasChanges |= rewrittenValue !== exp.value;
153+
exp.value = rewrittenValue;
150154
});
151155
});
152156

153-
return module.serializeQuery(parsedQuery);
157+
if (hasChanges) {
158+
mediaQuery = module.serializeQuery(parsedQuery);
159+
}
160+
161+
return mediaQuery;
154162
};
155163

156164
var replaceEmsWithPx = function (mediaQueryRules) {
165+
var anyRuleHasChanges = false;
166+
157167
mediaQueryRules.forEach(function (rule) {
168+
var hasChanges = false;
169+
158170
var reworkedMediaQueries = asArray(rule.media).map(function (mediaQuery) {
159-
return substituteEmWithPx(mediaQuery);
171+
var rewrittenMediaQuery = substituteEmWithPx(mediaQuery);
172+
173+
hasChanges |= rewrittenMediaQuery !== mediaQuery;
174+
return rewrittenMediaQuery;
160175
});
161176

162-
changeCssRule(rule, mediaQueryRule(reworkedMediaQueries, rule.cssRules));
177+
if (hasChanges) {
178+
changeCssRule(rule, mediaQueryRule(reworkedMediaQueries, rule.cssRules));
179+
}
180+
181+
anyRuleHasChanges |= hasChanges;
163182
});
183+
184+
return anyRuleHasChanges;
164185
};
165186

166187
module.workAroundWebKitEmSizeIssue = function (document) {
@@ -171,8 +192,10 @@ var mediaQueryHelper = (function (cssMediaQuery) {
171192
return rule.type === window.CSSRule.MEDIA_RULE;
172193
});
173194

174-
replaceEmsWithPx(mediaQueryRules);
175-
rewriteStyleContent(style);
195+
var hasChanges = replaceEmsWithPx(mediaQueryRules);
196+
if (hasChanges) {
197+
rewriteStyleContent(style);
198+
}
176199
});
177200
};
178201

test/specs/MediaQueryHelperSpec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,15 @@ describe("Media Query Helper", function () {
8686

8787
expect(doc.querySelector('style').textContent).toMatch(/@media (all and )?\(min-width: 19.2px\)/);
8888
});
89+
90+
it("should not crash on errors by avoiding rewrite of rules", function () {
91+
// Let's add an invalid media query and make sure it doesn't get changed (Firefox and Chrome complain)
92+
addStyle('@media (min-width: 2) {}');
93+
94+
mediaQueryHelper.workAroundWebKitEmSizeIssue(doc);
95+
96+
expect(doc.querySelector('style').textContent).toMatch(/@media \(min-width: 2\)/);
97+
});
8998
});
9099

91100
// this functionality should sit inside css-mediaquery

0 commit comments

Comments
 (0)