+ return if open_els.length < 2
+ second_i = open_els.length - 2
+ second = open_els[second_i]
+ return unless second.ns is NS_HTML
+ return unless second.name is 'body'
+ flag_frameset_ok = false
+ if second.parent?
+ for el, i in second.parent.children
+ if el is second
+ second.parent.children.splice i, 1
+ break
+ open_els.splice second_i, 1
+ # pop everything except the "root html element"
+ while open_els.length > 1
+ open_els.shift()
+ insert_html_element t
+ ins_mode = ins_mode_in_frameset
+ return
+ if t.type is TYPE_EOF
+ ok_tags = {
+ dd:NS_HTML, dt:NS_HTML, li:NS_HTML, p:NS_HTML, tbody:NS_HTML,
+ td:NS_HTML, tfoot:NS_HTML, th:NS_HTML, thead:NS_HTML,
+ tr:NS_HTML, body:NS_HTML, html:NS_HTML,
+ }
+ for el in open_els
+ unless ok_tags[t.name] is el.namespace
+ parse_error()
+ break
+ if template_ins_modes.length > 0
+ ins_mode_in_template t
+ else
+ stop_parsing()
+ return
+ if t.type is TYPE_END_TAG and t.name is 'body'
+ unless is_in_scope 'body'
+ parse_error()
+ return
+ ok_tags = {
+ dd:NS_HTML, dt:NS_HTML, li:NS_HTML, optgroup:NS_HTML,
+ option:NS_HTML, p:NS_HTML, rb:NS_HTML, rp:NS_HTML, rt:NS_HTML,
+ rtc:NS_HTML, tbody:NS_HTML, td:NS_HTML, tfoot:NS_HTML,
+ th:NS_HTML, thead:NS_HTML, tr:NS_HTML, body:NS_HTML,
+ html:NS_HTML
+ }
+ for el in open_els
+ unless ok_tags[t.name] is el.namespace
+ parse_error()
+ break
+ ins_mode = ins_mode_after_body
+ return
+ if t.type is TYPE_END_TAG and t.name is 'html'
+ unless is_in_scope 'body'
+ parse_error()
+ return
+ ok_tags = {
+ dd:NS_HTML, dt:NS_HTML, li:NS_HTML, optgroup:NS_HTML,
+ option:NS_HTML, p:NS_HTML, rb:NS_HTML, rp:NS_HTML, rt:NS_HTML,
+ rtc:NS_HTML, tbody:NS_HTML, td:NS_HTML, tfoot:NS_HTML,
+ th:NS_HTML, thead:NS_HTML, tr:NS_HTML, body:NS_HTML,
+ html:NS_HTML
+ }
+ for el in open_els
+ unless ok_tags[t.name] is el.namespace
+ parse_error()
+ break
+ ins_mode = ins_mode_after_body
+ ins_mode t