12012-07-20 Kwang Yul Seo <skyul@company100.net>
2
3 Use the original token to create an element in "reconstruct the active formatting elements" and "call the adoption agency"
4 https://bugs.webkit.org/show_bug.cgi?id=91703
5
6 Reviewed by NOBODY (OOPS!).
7
8 The current WebKit HTML5 parser implementation does not hold the original token
9 in the stack of open elements and the active formatting elements. This is
10 problematic because the original token is used to create an element in
11 "reconstruct the active formatting elements" and "call the adoption agency".
12
13 As a workaround, WebKit uses the saved element instead of the original token
14 to create an element. But this causes us to fail examples like this:
15 <b id="1"><p><script>document.getElementById("1").id = "2"</script></p>TEXT</b>
16 reconstructTheActiveFormattingElements calls this method to open a second <b>
17 tag to wrap TEXT, it will have id "2", even though the HTML5 spec implies it
18 should be "1".
19
20 Created a ref-counted container class, HTMLStackNode to hold the original token
21 and the namespace URI as well as the element. Changed HTMLElementStack and
22 HTMLFormattingElementList to use HTMLStackNode.
23 Changed HTMLConstructionSite::reconstructTheActiveFormattingElements and
24 HTMLTreeBuilder::callTheAdoptionAgency to create an element from the saved token
25 instead of the saved element.
26
27 Updated test expectation for html5lib/runner-expected.txt
28 because now resources/scripted/adoption01.dat passes.
29
30 * html/parser/HTMLConstructionSite.cpp:
31 (WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML):
32 (WebCore::HTMLConstructionSite::mergeAttributesFromTokenIntoElement):
33 (WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagInBody):
34 (WebCore::HTMLConstructionSite::insertHTMLBodyStartTagInBody):
35 (WebCore::HTMLConstructionSite::insertDoctype):
36 (WebCore::HTMLConstructionSite::insertComment):
37 (WebCore::HTMLConstructionSite::insertCommentOnDocument):
38 (WebCore::HTMLConstructionSite::insertCommentOnHTMLHtmlElement):
39 (WebCore::HTMLConstructionSite::insertHTMLHeadElement):
40 (WebCore::HTMLConstructionSite::insertHTMLBodyElement):
41 (WebCore::HTMLConstructionSite::insertHTMLFormElement):
42 (WebCore::HTMLConstructionSite::insertHTMLElement):
43 (WebCore::HTMLConstructionSite::insertSelfClosingHTMLElement):
44 (WebCore::HTMLConstructionSite::insertFormattingElement):
45 (WebCore::HTMLConstructionSite::insertScriptElement):
46 (WebCore::HTMLConstructionSite::insertForeignElement):
47 (WebCore::HTMLConstructionSite::createElement):
48 (WebCore::HTMLConstructionSite::createHTMLElement):
49 (WebCore::HTMLConstructionSite::createElementFromSavedToken):
50 (WebCore::HTMLConstructionSite::reconstructTheActiveFormattingElements):
51 * html/parser/HTMLConstructionSite.h:
52 (HTMLConstructionSite):
53 (WebCore::HTMLConstructionSite::currentElementRecord):
54 * html/parser/HTMLElementStack.cpp:
55 (WebCore::HTMLElementStack::ElementRecord::ElementRecord):
56 (WebCore::HTMLElementStack::ElementRecord::replaceElement):
57 (WebCore::HTMLElementStack::pushRootNode):
58 (WebCore::HTMLElementStack::pushHTMLHtmlElement):
59 (WebCore::HTMLElementStack::pushRootNodeCommon):
60 (WebCore::HTMLElementStack::pushHTMLHeadElement):
61 (WebCore::HTMLElementStack::pushHTMLBodyElement):
62 (WebCore::HTMLElementStack::push):
63 (WebCore::HTMLElementStack::insertAbove):
64 (WebCore::HTMLElementStack::pushCommon):
65 * html/parser/HTMLElementStack.h:
66 (WebCore::HTMLElementStack::ElementRecord::element):
67 (WebCore::HTMLElementStack::ElementRecord::node):
68 (WebCore::HTMLElementStack::ElementRecord::stackNode):
69 (ElementRecord):
70 (HTMLElementStack):
71 * html/parser/HTMLFormattingElementList.cpp:
72 (WebCore::HTMLFormattingElementList::swapTo):
73 (WebCore::HTMLFormattingElementList::append):
74 * html/parser/HTMLFormattingElementList.h:
75 (WebCore::HTMLFormattingElementList::Entry::Entry):
76 (WebCore::HTMLFormattingElementList::Entry::isMarker):
77 (WebCore::HTMLFormattingElementList::Entry::stackNode):
78 (WebCore::HTMLFormattingElementList::Entry::element):
79 (WebCore::HTMLFormattingElementList::Entry::replaceElement):
80 (WebCore::HTMLFormattingElementList::Entry::operator==):
81 (WebCore::HTMLFormattingElementList::Entry::operator!=):
82 (Entry):
83 (HTMLFormattingElementList):
84 * html/parser/HTMLStackNode.h: Added.
85 (WebCore):
86 (HTMLStackNode):
87 (WebCore::HTMLStackNode::create):
88 (WebCore::HTMLStackNode::element):
89 (WebCore::HTMLStackNode::node):
90 (WebCore::HTMLStackNode::token):
91 (WebCore::HTMLStackNode::namespaceURI):
92 (WebCore::HTMLStackNode::HTMLStackNode):
93 * html/parser/HTMLToken.h:
94 (WebCore::AtomicHTMLToken::create):
95 (AtomicHTMLToken):
96 (WebCore::AtomicHTMLToken::AtomicHTMLToken):
97 * html/parser/HTMLTreeBuilder.cpp:
98 (WebCore::HTMLTreeBuilder::ExternalCharacterTokenBuffer::ExternalCharacterTokenBuffer):
99 (WebCore::HTMLTreeBuilder::HTMLTreeBuilder):
100 (WebCore::HTMLTreeBuilder::constructTreeFromToken):
101 (WebCore::HTMLTreeBuilder::constructTreeFromAtomicToken):
102 (WebCore::HTMLTreeBuilder::processToken):
103 (WebCore::HTMLTreeBuilder::processDoctypeToken):
104 (WebCore::HTMLTreeBuilder::processFakeStartTag):
105 (WebCore::HTMLTreeBuilder::processFakeEndTag):
106 (WebCore::HTMLTreeBuilder::processFakePEndTagIfPInButtonScope):
107 (WebCore::HTMLTreeBuilder::attributesForIsindexInput):
108 (WebCore::HTMLTreeBuilder::processIsindexStartTagForInBody):
109 (WebCore):
110 (WebCore::HTMLTreeBuilder::processCloseWhenNestedTag):
111 (WebCore::HTMLTreeBuilder::processStartTagForInBody):
112 (WebCore::HTMLTreeBuilder::processStartTagForInTable):
113 (WebCore::HTMLTreeBuilder::processStartTag):
114 (WebCore::HTMLTreeBuilder::processBodyEndTagForInBody):
115 (WebCore::HTMLTreeBuilder::processAnyOtherEndTagForInBody):
116 (WebCore::HTMLTreeBuilder::callTheAdoptionAgency):
117 (WebCore::HTMLTreeBuilder::processEndTagForInTableBody):
118 (WebCore::HTMLTreeBuilder::processEndTagForInRow):
119 (WebCore::HTMLTreeBuilder::processEndTagForInCell):
120 (WebCore::HTMLTreeBuilder::processEndTagForInBody):
121 (WebCore::HTMLTreeBuilder::processEndTagForInTable):
122 (WebCore::HTMLTreeBuilder::processEndTag):
123 (WebCore::HTMLTreeBuilder::processComment):
124 (WebCore::HTMLTreeBuilder::processCharacter):
125 (WebCore::HTMLTreeBuilder::processEndOfFile):
126 (WebCore::HTMLTreeBuilder::defaultForBeforeHTML):
127 (WebCore::HTMLTreeBuilder::defaultForBeforeHead):
128 (WebCore::HTMLTreeBuilder::defaultForInHead):
129 (WebCore::HTMLTreeBuilder::defaultForInHeadNoscript):
130 (WebCore::HTMLTreeBuilder::defaultForAfterHead):
131 (WebCore::HTMLTreeBuilder::processStartTagForInHead):
132 (WebCore::HTMLTreeBuilder::processGenericRCDATAStartTag):
133 (WebCore::HTMLTreeBuilder::processGenericRawTextStartTag):
134 (WebCore::HTMLTreeBuilder::processScriptStartTag):
135 (WebCore::HTMLTreeBuilder::shouldProcessTokenInForeignContent):
136 (WebCore::HTMLTreeBuilder::processTokenInForeignContent):
137 (WebCore::HTMLTreeBuilder::parseError):
138 * html/parser/HTMLTreeBuilder.h:
139 (HTMLTreeBuilder):
140 * html/parser/TextDocumentParser.cpp:
141 (WebCore::TextDocumentParser::insertFakePreElement):
142