@@ -44,9 +44,12 @@ CSSOM.parse = function parse(token) {
4444
4545 var styleSheet = new CSSOM . CSSStyleSheet ;
4646
47- // @type CSSStyleSheet|CSSMediaRule
47+ // @type CSSStyleSheet|CSSMediaRule|CSSKeyframesRule
4848 var currentScope = styleSheet ;
4949
50+ // @type CSSMediaRule|CSSKeyframesRule
51+ var parentRule ;
52+
5053 var selector , name , value , priority = "" , styleRule , mediaRule , importRule , keyframesRule , keyframeRule ;
5154
5255 for ( var character ; character = token . charAt ( i ) ; i ++ ) {
@@ -152,14 +155,17 @@ CSSOM.parse = function parse(token) {
152155 state = "before-name" ;
153156 } else if ( state === "atBlock" ) {
154157 mediaRule . media . mediaText = buffer . trim ( ) ;
155- mediaRule . parentRule = currentScope ;
156- currentScope = mediaRule ;
158+ currentScope = parentRule = mediaRule ;
159+ mediaRule . parentStyleSheet = styleSheet ;
157160 buffer = "" ;
158161 state = "before-selector" ;
159162 } else if ( state === "keyframesRule-begin" ) {
160163 keyframesRule . name = buffer . trim ( ) ;
161- keyframesRule . parentRule = currentScope ;
162- currentScope = keyframesRule ;
164+ if ( parentRule ) {
165+ keyframesRule . parentRule = parentRule ;
166+ }
167+ keyframesRule . parentStyleSheet = styleSheet ;
168+ currentScope = parentRule = keyframesRule ;
163169 buffer = "" ;
164170 state = "keyframeRule-begin" ;
165171 } else if ( state === "keyframeRule-begin" ) {
@@ -217,9 +223,9 @@ CSSOM.parse = function parse(token) {
217223 break ;
218224 case "importRule" :
219225 importRule = new CSSOM . CSSImportRule ;
220- importRule . parentRule = currentScope ;
226+ importRule . parentStyleSheet = importRule . styleSheet . parentStyleSheet = styleSheet ;
221227 importRule . cssText = buffer + character ;
222- currentScope . cssRules . push ( importRule ) ;
228+ styleSheet . cssRules . push ( importRule ) ;
223229 buffer = "" ;
224230 state = "before-selector" ;
225231 break ;
@@ -237,7 +243,10 @@ CSSOM.parse = function parse(token) {
237243 case "before-name" :
238244 case "name" :
239245 styleRule . __ends = i + 1 ;
240- styleRule . parentRule = currentScope ;
246+ if ( parentRule ) {
247+ styleRule . parentRule = parentRule ;
248+ }
249+ styleRule . parentStyleSheet = styleSheet ;
241250 currentScope . cssRules . push ( styleRule ) ;
242251 buffer = "" ;
243252 if ( currentScope . constructor === CSSOM . CSSKeyframesRule ) {
@@ -250,13 +259,14 @@ CSSOM.parse = function parse(token) {
250259 case "before-selector" :
251260 case "selector" :
252261 // End of media rule.
253- // Nesting rules aren't supported yet
254- if ( ! currentScope . parentRule ) {
262+ if ( ! parentRule ) {
255263 throw "unexpected }" ;
256264 }
257265 currentScope . __ends = i + 1 ;
258- currentScope . parentRule . cssRules . push ( currentScope ) ;
259- currentScope = currentScope . parentRule ;
266+ // Nesting rules aren’t supported yet
267+ styleSheet . cssRules . push ( currentScope ) ;
268+ currentScope = styleSheet ;
269+ parentRule = null ;
260270 buffer = "" ;
261271 state = "before-selector" ;
262272 break ;
0 commit comments