@@ -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 + ) + - ) ? k e y f r a m e s / ) ;
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