Skip to content

Commit 60e94ec

Browse files
committed
Initial fixes for the frameset-OK flag
1 parent 36f73ec commit 60e94ec

File tree

1 file changed

+49
-7
lines changed

1 file changed

+49
-7
lines changed

src/html5lib/html5parser.py

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ def reset(self):
125125
self.secondaryPhase = None
126126

127127
self.beforeRCDataPhase = None
128+
129+
self.framesetOK = True
128130

129131
def mainLoop(self):
130132
(CharactersToken,
@@ -788,6 +790,7 @@ def processCharacters(self, token):
788790
self.parser.phase.processCharacters(token)
789791

790792
def startTagBody(self, token):
793+
self.parser.framesetOK = False
791794
self.tree.insertElement(token)
792795
self.parser.phase = self.parser.phases["inBody"]
793796

@@ -823,6 +826,7 @@ def endTagOther(self, token):
823826
def anythingElse(self):
824827
self.tree.insertElement(impliedTagToken("body", "StartTag"))
825828
self.parser.phase = self.parser.phases["inBody"]
829+
self.parser.framesetOK = True
826830

827831

828832
class InBodyPhase(Phase):
@@ -839,6 +843,7 @@ def __init__(self, parser, tree):
839843
(("base", "link", "meta", "script", "style", "title"),
840844
self.startTagProcessInHead),
841845
("body", self.startTagBody),
846+
("frameset", self.startTagFrameset),
842847
(("address", "article", "aside", "blockquote", "center", "datagrid",
843848
"details", "dialog", "dir", "div", "dl", "fieldset", "figure",
844849
"footer", "h1", "h2", "h3", "h4", "h5", "h6", "header", "listing",
@@ -863,13 +868,14 @@ def __init__(self, parser, tree):
863868
("input", self.startTagInput),
864869
("isindex", self.startTagIsIndex),
865870
("textarea", self.startTagTextarea),
866-
(("iframe", "noembed", "noframes", "noscript"), self.startTagCdata),
871+
("iframe", self.startTagIFrame),
872+
(("noembed", "noframes", "noscript"), self.startTagCdata),
867873
("select", self.startTagSelect),
868874
(("rp", "rt"), self.startTagRpRt),
869875
(("option", "optgroup"), self.startTagOpt),
870876
(("math"), self.startTagMath),
871877
(("svg"), self.startTagSvg),
872-
(("caption", "col", "colgroup", "frame", "frameset", "head",
878+
(("caption", "col", "colgroup", "frame", "head",
873879
"tbody", "td", "tfoot", "th", "thead",
874880
"tr"), self.startTagMisplaced),
875881
(("event-source", "command"), self.startTagNew)
@@ -930,6 +936,7 @@ def processCharacters(self, token):
930936
# do it for space characters.
931937
self.tree.reconstructActiveFormattingElements()
932938
self.tree.insertText(token["data"])
939+
self.framesetOK = False
933940

934941
#This matches the current spec but may not match the real world
935942
def processSpaceCharacters(self, token):
@@ -949,11 +956,28 @@ def startTagBody(self, token):
949956
if attr not in self.tree.openElements[1].attributes:
950957
self.tree.openElements[1].attributes[attr] = value
951958

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+
952975
def startTagCloseP(self, token):
953976
if self.tree.elementInScope("p"):
954977
self.endTagP(impliedTagToken("p"))
955978
self.tree.insertElement(token)
956979
if token["name"] in ("pre", "listing"):
980+
self.parser.framesetOK = False
957981
self.processSpaceCharacters = self.processSpaceCharactersDropNewline
958982

959983
def startTagForm(self, token):
@@ -966,6 +990,7 @@ def startTagForm(self, token):
966990
self.tree.formPointer = self.tree.openElements[-1]
967991

968992
def startTagListItem(self, token):
993+
self.parser.framesetOK = False
969994
if self.tree.elementInScope("p"):
970995
self.endTagP(impliedTagToken("p"))
971996
stopNames = {"li":("li"), "dd":("dd", "dt"), "dt":("dd", "dt")}
@@ -1054,32 +1079,40 @@ def startTagButton(self, token):
10541079
self.tree.reconstructActiveFormattingElements()
10551080
self.tree.insertElement(token)
10561081
self.tree.activeFormattingElements.append(Marker)
1082+
self.parser.framesetOK = False
10571083

10581084
def startTagAppletMarqueeObject(self, token):
10591085
self.tree.reconstructActiveFormattingElements()
10601086
self.tree.insertElement(token)
10611087
self.tree.activeFormattingElements.append(Marker)
1088+
self.parser.framesetOK = False
10621089

10631090
def startTagXmp(self, token):
10641091
self.tree.reconstructActiveFormattingElements()
10651092
self.parser.parseRCDataCData(token, "CDATA")
1093+
self.parser.framesetOK = False
10661094

10671095
def startTagTable(self, token):
10681096
if self.tree.elementInScope("p"):
10691097
self.processEndTag(impliedTagToken("p"))
10701098
self.tree.insertElement(token)
1099+
self.parser.framesetOK = False
10711100
self.parser.phase = self.parser.phases["inTable"]
10721101

10731102
def startTagVoidFormatting(self, token):
10741103
self.tree.reconstructActiveFormattingElements()
10751104
self.tree.insertElement(token)
10761105
self.tree.openElements.pop()
1106+
token["selfClosingAcknowledged"] = True
1107+
self.parser.framesetOK = False
10771108

10781109
def startTagHr(self, token):
10791110
if self.tree.elementInScope("p"):
10801111
self.endTagP(impliedTagToken("p"))
10811112
self.tree.insertElement(token)
10821113
self.tree.openElements.pop()
1114+
token["selfClosingAcknowledged"] = True
1115+
self.parser.framesetOK = False
10831116

10841117
def startTagImage(self, token):
10851118
# No really...
@@ -1125,6 +1158,11 @@ def startTagTextarea(self, token):
11251158
self.tree.insertElement(token)
11261159
self.parser.tokenizer.contentModelFlag = contentModelFlags["RCDATA"]
11271160
self.processSpaceCharacters = self.processSpaceCharactersDropNewline
1161+
self.parser.framesetOK = False
1162+
1163+
def startTagIFrame(self, token):
1164+
self.parser.framesetOK = False
1165+
self.startTagCdata(token)
11281166

11291167
def startTagCdata(self, token):
11301168
"""iframe, noembed noframes, noscript(if scripting enabled)"""
@@ -1139,6 +1177,7 @@ def startTagOpt(self, token):
11391177
def startTagSelect(self, token):
11401178
self.tree.reconstructActiveFormattingElements()
11411179
self.tree.insertElement(token)
1180+
self.parser.framesetOK = False
11421181
if self.parser.phase in (self.parser.phases["inTable"],
11431182
self.parser.phases["inCaption"],
11441183
self.parser.phases["inColumnGroup"],
@@ -1264,18 +1303,17 @@ def endTagBlock(self, token):
12641303
node = self.tree.openElements.pop()
12651304

12661305
def endTagForm(self, token):
1306+
node = self.tree.formPointer
12671307
self.tree.formPointer = None
1268-
if not self.tree.elementInScope(token["name"]):
1308+
if node is None or not self.tree.elementInScope(token["name"]):
12691309
self.parser.parseError("unexpected-end-tag",
12701310
{"name":"form"})
12711311
else:
12721312
self.tree.generateImpliedEndTags()
1273-
if self.tree.openElements[-1].name != token["name"]:
1313+
if self.tree.openElements[-1].name != node:
12741314
self.parser.parseError("end-tag-too-early-ignored",
12751315
{"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)
12791317

12801318
def endTagListItem(self, token):
12811319
# AT Could merge this with the Block case
@@ -2254,6 +2292,10 @@ def adjustSVGTagNames(self, token):
22542292
if token["name"] in replacements:
22552293
token["name"] = replacements[token["name"]]
22562294

2295+
def processCharacters(self, token):
2296+
self.parser.framesetOK = False
2297+
Phase.processCharacters(self, token)
2298+
22572299
def processEOF(self):
22582300
pass
22592301

0 commit comments

Comments
 (0)