@@ -125,6 +125,8 @@ def reset(self):
125
125
self .secondaryPhase = None
126
126
127
127
self .beforeRCDataPhase = None
128
+
129
+ self .framesetOK = True
128
130
129
131
def mainLoop (self ):
130
132
(CharactersToken ,
@@ -788,6 +790,7 @@ def processCharacters(self, token):
788
790
self .parser .phase .processCharacters (token )
789
791
790
792
def startTagBody (self , token ):
793
+ self .parser .framesetOK = False
791
794
self .tree .insertElement (token )
792
795
self .parser .phase = self .parser .phases ["inBody" ]
793
796
@@ -823,6 +826,7 @@ def endTagOther(self, token):
823
826
def anythingElse (self ):
824
827
self .tree .insertElement (impliedTagToken ("body" , "StartTag" ))
825
828
self .parser .phase = self .parser .phases ["inBody" ]
829
+ self .parser .framesetOK = True
826
830
827
831
828
832
class InBodyPhase (Phase ):
@@ -839,6 +843,7 @@ def __init__(self, parser, tree):
839
843
(("base" , "link" , "meta" , "script" , "style" , "title" ),
840
844
self .startTagProcessInHead ),
841
845
("body" , self .startTagBody ),
846
+ ("frameset" , self .startTagFrameset ),
842
847
(("address" , "article" , "aside" , "blockquote" , "center" , "datagrid" ,
843
848
"details" , "dialog" , "dir" , "div" , "dl" , "fieldset" , "figure" ,
844
849
"footer" , "h1" , "h2" , "h3" , "h4" , "h5" , "h6" , "header" , "listing" ,
@@ -863,13 +868,14 @@ def __init__(self, parser, tree):
863
868
("input" , self .startTagInput ),
864
869
("isindex" , self .startTagIsIndex ),
865
870
("textarea" , self .startTagTextarea ),
866
- (("iframe" , "noembed" , "noframes" , "noscript" ), self .startTagCdata ),
871
+ ("iframe" , self .startTagIFrame ),
872
+ (("noembed" , "noframes" , "noscript" ), self .startTagCdata ),
867
873
("select" , self .startTagSelect ),
868
874
(("rp" , "rt" ), self .startTagRpRt ),
869
875
(("option" , "optgroup" ), self .startTagOpt ),
870
876
(("math" ), self .startTagMath ),
871
877
(("svg" ), self .startTagSvg ),
872
- (("caption" , "col" , "colgroup" , "frame" , "frameset" , " head" ,
878
+ (("caption" , "col" , "colgroup" , "frame" , "head" ,
873
879
"tbody" , "td" , "tfoot" , "th" , "thead" ,
874
880
"tr" ), self .startTagMisplaced ),
875
881
(("event-source" , "command" ), self .startTagNew )
@@ -930,6 +936,7 @@ def processCharacters(self, token):
930
936
# do it for space characters.
931
937
self .tree .reconstructActiveFormattingElements ()
932
938
self .tree .insertText (token ["data" ])
939
+ self .framesetOK = False
933
940
934
941
#This matches the current spec but may not match the real world
935
942
def processSpaceCharacters (self , token ):
@@ -949,11 +956,28 @@ def startTagBody(self, token):
949
956
if attr not in self .tree .openElements [1 ].attributes :
950
957
self .tree .openElements [1 ].attributes [attr ] = value
951
958
959
+ def startTagFrameset (self , token ):
960
+ self .parser .parseError ("unexpected-start-tag" , {"name" : "frameset" })
961
+ print self .parser .framesetOK
962
+ if (self .tree .openElements [1 ].name != "body" or len (self .tree .openElements ) == 1 ):
963
+ assert self .parser .innerHTML
964
+ elif not self .parser .framesetOK :
965
+ pass
966
+ else :
967
+ print self .tree .openElements [1 ].parent
968
+ if self .tree .openElements [1 ].parent :
969
+ self .tree .openElements [1 ].parent .removeChild (self .tree .openElements [1 ])
970
+ while self .tree .openElements [- 1 ].name != "html" :
971
+ self .tree .openElements .pop ()
972
+ self .tree .insertElement (token )
973
+ self .parser .phase = self .parser .phases ["inFrameset" ]
974
+
952
975
def startTagCloseP (self , token ):
953
976
if self .tree .elementInScope ("p" ):
954
977
self .endTagP (impliedTagToken ("p" ))
955
978
self .tree .insertElement (token )
956
979
if token ["name" ] in ("pre" , "listing" ):
980
+ self .parser .framesetOK = False
957
981
self .processSpaceCharacters = self .processSpaceCharactersDropNewline
958
982
959
983
def startTagForm (self , token ):
@@ -966,6 +990,7 @@ def startTagForm(self, token):
966
990
self .tree .formPointer = self .tree .openElements [- 1 ]
967
991
968
992
def startTagListItem (self , token ):
993
+ self .parser .framesetOK = False
969
994
if self .tree .elementInScope ("p" ):
970
995
self .endTagP (impliedTagToken ("p" ))
971
996
stopNames = {"li" :("li" ), "dd" :("dd" , "dt" ), "dt" :("dd" , "dt" )}
@@ -1054,32 +1079,40 @@ def startTagButton(self, token):
1054
1079
self .tree .reconstructActiveFormattingElements ()
1055
1080
self .tree .insertElement (token )
1056
1081
self .tree .activeFormattingElements .append (Marker )
1082
+ self .parser .framesetOK = False
1057
1083
1058
1084
def startTagAppletMarqueeObject (self , token ):
1059
1085
self .tree .reconstructActiveFormattingElements ()
1060
1086
self .tree .insertElement (token )
1061
1087
self .tree .activeFormattingElements .append (Marker )
1088
+ self .parser .framesetOK = False
1062
1089
1063
1090
def startTagXmp (self , token ):
1064
1091
self .tree .reconstructActiveFormattingElements ()
1065
1092
self .parser .parseRCDataCData (token , "CDATA" )
1093
+ self .parser .framesetOK = False
1066
1094
1067
1095
def startTagTable (self , token ):
1068
1096
if self .tree .elementInScope ("p" ):
1069
1097
self .processEndTag (impliedTagToken ("p" ))
1070
1098
self .tree .insertElement (token )
1099
+ self .parser .framesetOK = False
1071
1100
self .parser .phase = self .parser .phases ["inTable" ]
1072
1101
1073
1102
def startTagVoidFormatting (self , token ):
1074
1103
self .tree .reconstructActiveFormattingElements ()
1075
1104
self .tree .insertElement (token )
1076
1105
self .tree .openElements .pop ()
1106
+ token ["selfClosingAcknowledged" ] = True
1107
+ self .parser .framesetOK = False
1077
1108
1078
1109
def startTagHr (self , token ):
1079
1110
if self .tree .elementInScope ("p" ):
1080
1111
self .endTagP (impliedTagToken ("p" ))
1081
1112
self .tree .insertElement (token )
1082
1113
self .tree .openElements .pop ()
1114
+ token ["selfClosingAcknowledged" ] = True
1115
+ self .parser .framesetOK = False
1083
1116
1084
1117
def startTagImage (self , token ):
1085
1118
# No really...
@@ -1125,6 +1158,11 @@ def startTagTextarea(self, token):
1125
1158
self .tree .insertElement (token )
1126
1159
self .parser .tokenizer .contentModelFlag = contentModelFlags ["RCDATA" ]
1127
1160
self .processSpaceCharacters = self .processSpaceCharactersDropNewline
1161
+ self .parser .framesetOK = False
1162
+
1163
+ def startTagIFrame (self , token ):
1164
+ self .parser .framesetOK = False
1165
+ self .startTagCdata (token )
1128
1166
1129
1167
def startTagCdata (self , token ):
1130
1168
"""iframe, noembed noframes, noscript(if scripting enabled)"""
@@ -1139,6 +1177,7 @@ def startTagOpt(self, token):
1139
1177
def startTagSelect (self , token ):
1140
1178
self .tree .reconstructActiveFormattingElements ()
1141
1179
self .tree .insertElement (token )
1180
+ self .parser .framesetOK = False
1142
1181
if self .parser .phase in (self .parser .phases ["inTable" ],
1143
1182
self .parser .phases ["inCaption" ],
1144
1183
self .parser .phases ["inColumnGroup" ],
@@ -1264,18 +1303,17 @@ def endTagBlock(self, token):
1264
1303
node = self .tree .openElements .pop ()
1265
1304
1266
1305
def endTagForm (self , token ):
1306
+ node = self .tree .formPointer
1267
1307
self .tree .formPointer = None
1268
- if not self .tree .elementInScope (token ["name" ]):
1308
+ if node is None or not self .tree .elementInScope (token ["name" ]):
1269
1309
self .parser .parseError ("unexpected-end-tag" ,
1270
1310
{"name" :"form" })
1271
1311
else :
1272
1312
self .tree .generateImpliedEndTags ()
1273
- if self .tree .openElements [- 1 ].name != token [ "name" ] :
1313
+ if self .tree .openElements [- 1 ].name != node :
1274
1314
self .parser .parseError ("end-tag-too-early-ignored" ,
1275
1315
{"name" : "form" })
1276
- node = self .tree .openElements .pop ()
1277
- while node .name != token ["name" ]:
1278
- node = self .tree .openElements .pop ()
1316
+ self .tree .openElements .remove (node )
1279
1317
1280
1318
def endTagListItem (self , token ):
1281
1319
# AT Could merge this with the Block case
@@ -2254,6 +2292,10 @@ def adjustSVGTagNames(self, token):
2254
2292
if token ["name" ] in replacements :
2255
2293
token ["name" ] = replacements [token ["name" ]]
2256
2294
2295
+ def processCharacters (self , token ):
2296
+ self .parser .framesetOK = False
2297
+ Phase .processCharacters (self , token )
2298
+
2257
2299
def processEOF (self ):
2258
2300
pass
2259
2301
0 commit comments