@@ -375,6 +375,7 @@ def resetInsertionMode(self):
375
375
# The name of this method is mostly historical. (It's also used in the
376
376
# specification.)
377
377
last = False
378
+ foreign = False
378
379
newModes = {
379
380
"select" :"inSelect" ,
380
381
"td" :"inCell" ,
@@ -388,38 +389,36 @@ def resetInsertionMode(self):
388
389
"table" :"inTable" ,
389
390
"head" :"inBody" ,
390
391
"body" :"inBody" ,
391
- "frameset" :"inFrameset"
392
+ "frameset" :"inFrameset" ,
393
+ "html" :"beforeHead"
392
394
}
393
395
for node in self .tree .openElements [::- 1 ]:
394
396
nodeName = node .name
397
+ new_phase = None
395
398
if node == self .tree .openElements [0 ]:
399
+ assert self .innerHTML
396
400
last = True
397
- if nodeName not in ['td' , 'th' ]:
398
- # XXX
399
- assert self .innerHTML
400
- nodeName = self .innerHTML
401
+ nodeName = self .innerHTML
401
402
# Check for conditions that should only happen in the innerHTML
402
403
# case
403
- if nodeName in ("select" , "colgroup" , "head" , "frameset" ):
404
- # XXX
404
+ if nodeName in ("select" , "colgroup" , "head" , "frameset" , "html" ):
405
405
assert self .innerHTML
406
+
406
407
if nodeName in newModes :
407
- self . phase = self .phases [newModes [nodeName ]]
408
+ new_phase = self .phases [newModes [nodeName ]]
408
409
break
409
410
elif node .namespace in (namespaces ["mathml" ], namespaces ["svg" ]):
410
- self .phase = self .phases ["inForeignContent" ]
411
- self .secondaryPhase = self .phases ["inBody" ]
412
- break
413
- elif nodeName == "html" :
414
- if self .tree .headPointer is None :
415
- self .phase = self .phases ["beforeHead" ]
416
- else :
417
- self .phase = self .phases ["afterHead" ]
418
- break
411
+ foreign = True
419
412
elif last :
420
- self . phase = self .phases ["inBody" ]
413
+ new_phase = self .phases ["inBody" ]
421
414
break
422
415
416
+ if foreign :
417
+ self .phase = self .phases ["inForeignContent" ]
418
+ self .secondaryPhase = new_phase
419
+ else :
420
+ self .phase = new_phase
421
+
423
422
def parseRCDataRawtext (self , token , contentType ):
424
423
"""Generic RCDATA/RAWTEXT Parsing algorithm
425
424
contentType - RCDATA or RAWTEXT
@@ -2195,7 +2194,8 @@ def __init__(self, parser, tree):
2195
2194
("option" , self .startTagOption ),
2196
2195
("optgroup" , self .startTagOptgroup ),
2197
2196
("select" , self .startTagSelect ),
2198
- (("input" , "keygen" , "textarea" ), self .startTagInput )
2197
+ (("input" , "keygen" , "textarea" ), self .startTagInput ),
2198
+ ("script" , self .startTagScript )
2199
2199
])
2200
2200
self .startTagHandler .default = self .startTagOther
2201
2201
@@ -2241,6 +2241,9 @@ def startTagInput(self, token):
2241
2241
self .endTagSelect (impliedTagToken ("select" ))
2242
2242
self .parser .phase .processStartTag (token )
2243
2243
2244
+ def startTagScript (self , token ):
2245
+ self .parser .phases ["inHead" ].processStartTag (token )
2246
+
2244
2247
def startTagOther (self , token ):
2245
2248
self .parser .parseError ("unexpected-start-tag-in-select" ,
2246
2249
{"name" : token ["name" ]})
0 commit comments