Skip to content

Commit 89deaac

Browse files
committed
Parser: Avoid code duplication in the handling of @Keyframes tokens.
Also support any vendor prefix, not just @-webkit-keyframes and @-moz-keyframes.
1 parent 1487380 commit 89deaac

1 file changed

Lines changed: 16 additions & 25 deletions

File tree

lib/parse.js

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -134,31 +134,22 @@ CSSOM.parse = function parse(token) {
134134
i += "import".length;
135135
buffer += "@import";
136136
break;
137-
} else if (token.indexOf("@-webkit-keyframes", i) === i) {
138-
state = "keyframesRule-begin";
139-
keyframesRule = new CSSOM.CSSKeyframesRule;
140-
keyframesRule.__starts = i;
141-
keyframesRule._vendorPrefix = '-webkit-';
142-
i += "-webkit-keyframes".length;
143-
buffer = "";
144-
break;
145-
} else if (token.indexOf("@-moz-keyframes", i) == i) {
146-
state = "keyframesRule-begin";
147-
keyframesRule = new CSSOM.CSSKeyframesRule;
148-
keyframesRule.__starts = i;
149-
keyframesRule._vendorPrefix = '-moz-';
150-
i += "-moz-keyframes".length;
151-
buffer = "";
152-
break;
153-
} else if (token.indexOf("@keyframes", i) == i) {
154-
state = "keyframesRule-begin";
155-
keyframesRule = new CSSOM.CSSKeyframesRule;
156-
keyframesRule.__starts = i;
157-
i += "keyframes".length;
158-
buffer = "";
159-
break;
160-
} else if (state == "selector") {
161-
state = "atRule";
137+
} else {
138+
// A @keyframes rule can have an arbitrary vendor prefix, but unfortunately we cannot match a regular expression
139+
// against 'token' starting at index 'i'. Extract a substring and match against that:
140+
var nextBraceIndex = token.indexOf('{', i);
141+
var matchKeyframes = token.substring(i, nextBraceIndex === -1 ? token.length : nextBraceIndex).match(/@((?:-\w+)+-)?keyframes/);
142+
if (matchKeyframes) {
143+
state = "keyframesRule-begin";
144+
keyframesRule = new CSSOM.CSSKeyframesRule;
145+
keyframesRule.__starts = i;
146+
keyframesRule._vendorPrefix = matchKeyframes[1]; // Will come out as undefined if no prefix was found
147+
i += matchKeyframes[0].length - 1;
148+
buffer = "";
149+
break;
150+
} else if (state == "selector") {
151+
state = "atRule";
152+
}
162153
}
163154
buffer += character;
164155
break;

0 commit comments

Comments
 (0)