@@ -257,6 +257,7 @@ def __init__(self, parser, tree):
257257self .tree = tree
258258
259259def processEOF (self ):
260+ raise NotImplementedError
260261self .tree .generateImpliedEndTags ()
261262if len (self .tree .openElements )> 2 :
262263self .parser .parseError ("expected-closing-tag-but-got-eof" )
@@ -547,11 +548,11 @@ def appendToHead(self, element):
547548self .tree .openElements [- 1 ].appendChild (element )
548549
549550# the real thing
550- def processEOF (self ):
551+ def processEOF (self ):
551552if self .tree .openElements [- 1 ].name in ("title" ,"style" ,"script" ,"noscript" ):
552553self .parser .parseError ("expected-named-closing-tag-but-got-eof" ,
553554 {"name" :self .tree .openElements [- 1 ].name })
554- self .tree .openElements .pop ()
555+ self .tree .openElements .pop ()
555556self .anythingElse ()
556557self .parser .phase .processEOF ()
557558
@@ -776,6 +777,15 @@ def addFormattingElement(self, name, attributes):
776777self .tree .openElements [- 1 ])
777778
778779# the real deal
780+ def processEOF (self ):
781+ allowed_elements = set (("dd" ,"dt" ,"li" ,"p" ,"tbody" ,"td" ,"tfoot" ,
782+ "th" ,"thead" ,"tr" ,"body" ,"html" ))
783+ for node in self .tree .openElements [::- 1 ]:
784+ if node .name not in allowed_elements :
785+ self .parser .parseError ("expected-closing-tag-but-got-eof" )
786+ break
787+ #Stop parsing
788+
779789def processSpaceCharactersDropNewline (self ,data ):
780790# Sometimes (start of <pre>, <listing>, and <textarea> blocks) we
781791# want to drop leading newlines
@@ -1311,8 +1321,8 @@ def __init__(self, parser, tree):
13111321def clearStackToTableContext (self ):
13121322# "clear the stack back to a table context"
13131323while self .tree .openElements [- 1 ].name not in ("table" ,"html" ):
1314- self .parser .parseError ("unexpected-implied-end-tag-in-table" ,
1315- {"name" :self .tree .openElements [- 1 ].name })
1324+ # self.parser.parseError("unexpected-implied-end-tag-in-table",
1325+ # {"name": self.tree.openElements[-1].name})
13161326self .tree .openElements .pop ()
13171327# When the current node is <html> it's an innerHTML case
13181328
@@ -1323,6 +1333,13 @@ def getCurrentTable(self):
13231333return self .tree .openElements [i ]
13241334
13251335# processing methods
1336+ def processEOF (self ):
1337+ if self .tree .openElements [- 1 ].name != "html" :
1338+ self .parser .parseError ("eof-in-table" )
1339+ else :
1340+ assert self .parser .innerHTML
1341+ #Stop parsing
1342+
13261343def processSpaceCharacters (self ,data ):
13271344if "tainted" not in self .getCurrentTable ()._flags :
13281345self .tree .insertText (data )
@@ -1454,6 +1471,9 @@ def __init__(self, parser, tree):
14541471def ignoreEndTagCaption (self ):
14551472return not self .tree .elementInScope ("caption" ,True )
14561473
1474+ def processEOF (self ):
1475+ self .parser .phases ["inBody" ].processEOF ()
1476+
14571477def processCharacters (self ,data ):
14581478self .parser .phases ["inBody" ].processCharacters (data )
14591479
@@ -1521,6 +1541,16 @@ def __init__(self, parser, tree):
15211541def ignoreEndTagColgroup (self ):
15221542return self .tree .openElements [- 1 ].name == "html"
15231543
1544+ def processEOF (self ):
1545+ if self .tree .openElements [- 1 ].name == "html" :
1546+ assert self .parser .innerHTML
1547+ return
1548+ else :
1549+ ignoreEndTag = self .ignoreEndTagColgroup ()
1550+ self .endTagColgroup ("colgroup" )
1551+ if not ignoreEndTag :
1552+ self .parser .phase .processEOF ()
1553+
15241554def processCharacters (self ,data ):
15251555ignoreEndTag = self .ignoreEndTagColgroup ()
15261556self .endTagColgroup ("colgroup" )
@@ -1564,7 +1594,8 @@ def __init__(self, parser, tree):
15641594 ("html" ,self .startTagHtml ),
15651595 ("tr" ,self .startTagTr ),
15661596 (("td" ,"th" ),self .startTagTableCell ),
1567- (("caption" ,"col" ,"colgroup" ,"tbody" ,"tfoot" ,"thead" ),self .startTagTableOther )
1597+ (("caption" ,"col" ,"colgroup" ,"tbody" ,"tfoot" ,"thead" ),
1598+ self .startTagTableOther )
15681599 ])
15691600self .startTagHandler .default = self .startTagOther
15701601
@@ -1580,13 +1611,18 @@ def __init__(self, parser, tree):
15801611def clearStackToTableBodyContext (self ):
15811612while self .tree .openElements [- 1 ].name not in ("tbody" ,"tfoot" ,
15821613"thead" ,"html" ):
1583- self .parser .parseError ("unexpected-implied-end-tag-in-table" ,
1584- {"name" :self .tree .openElements [- 1 ].name })
1614+ # self.parser.parseError("unexpected-implied-end-tag-in-table",
1615+ # {"name": self.tree.openElements[-1].name})
15851616self .tree .openElements .pop ()
1617+ if self .tree .openElements [- 1 ].name == "html" :
1618+ assert self .parser .innerHTML
15861619
15871620# the rest
1621+ def processEOF (self ):
1622+ self .parser .phases ["inTable" ].processEOF ()
1623+
15881624def processSpaceCharacters (self ,data ):
1589- self .parser .phases ["inTable" ].processSpaceCharacters (data )
1625+ self .parser .phases ["inTable" ].processSpaceCharacters (data )
15901626
15911627def processCharacters (self ,data ):
15921628self .parser .phases ["inTable" ].processCharacters (data )
@@ -1676,6 +1712,9 @@ def ignoreEndTagTr(self):
16761712return not self .tree .elementInScope ("tr" ,tableVariant = True )
16771713
16781714# the rest
1715+ def processEOF (self ):
1716+ self .parser .phases ["inTable" ].processEOF ()
1717+
16791718def processSpaceCharacters (self ,data ):
16801719self .parser .phases ["inTable" ].processSpaceCharacters (data )
16811720
@@ -1757,6 +1796,9 @@ def closeCell(self):
17571796self .endTagTableCell ("th" )
17581797
17591798# the rest
1799+ def processEOF (self ):
1800+ self .parser .phases ["inBody" ].processEOF ()
1801+
17601802def processCharacters (self ,data ):
17611803self .parser .phases ["inBody" ].processCharacters (data )
17621804
@@ -1834,6 +1876,12 @@ def __init__(self, parser, tree):
18341876self .endTagHandler .default = self .endTagOther
18351877
18361878# http://www.whatwg.org/specs/web-apps/current-work/#in-select
1879+ def processEOF (self ):
1880+ if self .tree .openElements [- 1 ].name != "html" :
1881+ self .parser .parseError ("eof-in-select" )
1882+ else :
1883+ assert self .parser .innerHtml
1884+
18371885def processCharacters (self ,data ):
18381886self .tree .insertText (data )
18391887
@@ -1919,6 +1967,9 @@ def __init__(self, parser, tree):
19191967 ])
19201968self .endTagHandler .default = self .endTagOther
19211969
1970+ def processEOF (self ):
1971+ self .parser .phases ["inSelect" ].processEOF ()
1972+
19221973def processCharacters (self ,data ):
19231974self .parser .phases ["inSelect" ].processCharacters (data )
19241975
@@ -1948,6 +1999,10 @@ def __init__(self, parser, tree):
19481999self .endTagHandler = utils .MethodDispatcher ([("html" ,self .endTagHtml )])
19492000self .endTagHandler .default = self .endTagOther
19502001
2002+ def processEOF (self ):
2003+ #Stop parsing
2004+ pass
2005+
19512006def processComment (self ,data ):
19522007# This is needed because data is to be appended to the <html> element
19532008# here and not to whatever is currently open.
@@ -1966,7 +2021,7 @@ def processStartTag(self, name, attributes):
19662021
19672022def endTagHtml (self ,name ):
19682023if self .parser .innerHTML :
1969- self .parser .parseError ()
2024+ self .parser .parseError ("unexpected-end-tag-after-body-innerhtml" )
19702025else :
19712026# XXX: This may need to be done, not sure:
19722027# Don't set lastPhase to the current phase but to the inBody phase
@@ -2001,6 +2056,12 @@ def __init__(self, parser, tree):
20012056 ])
20022057self .endTagHandler .default = self .endTagOther
20032058
2059+ def processEOF (self ):
2060+ if self .tree .openElements [- 1 ].name != "html" :
2061+ self .parser .parseError ("eof-in-frameset" )
2062+ else :
2063+ assert self .parser .innerHTML
2064+
20042065def processCharacters (self ,data ):
20052066self .parser .parseError ("unexpected-char-in-frameset" )
20062067
@@ -2054,6 +2115,10 @@ def __init__(self, parser, tree):
20542115 ])
20552116self .endTagHandler .default = self .endTagOther
20562117
2118+ def processEOF (self ):
2119+ #Stop parsing
2120+ pass
2121+
20572122def processCharacters (self ,data ):
20582123self .parser .parseError ("unexpected-char-after-frameset" )
20592124