Source/WebCore/ChangeLog

 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
11432012-07-18 Joshua Bell <jsbell@chromium.org>
2144
3145 IndexedDB: Direction parameter ignored by some openCursor() overloads

Source/WebCore/html/parser/HTMLConstructionSite.cpp

3939#include "HTMLNames.h"
4040#include "HTMLParserIdioms.h"
4141#include "HTMLScriptElement.h"
 42#include "HTMLStackNode.h"
4243#include "HTMLToken.h"
4344#include "HTMLTokenizer.h"
4445#include "LocalizedStrings.h"

@@void HTMLConstructionSite::dispatchDocumentElementAvailableIfNeeded()
192193 m_document->frame()->loader()->dispatchDocumentElementAvailable();
193194}
194195
195 void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken& token)
 196void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken* token)
196197{
197198 RefPtr<HTMLHtmlElement> element = HTMLHtmlElement::create(m_document);
198  element->parserSetAttributes(token.attributes(), m_fragmentScriptingPermission);
 199 element->parserSetAttributes(token->attributes(), m_fragmentScriptingPermission);
199200 attachLater(m_attachmentRoot, element);
200  m_openElements.pushHTMLHtmlElement(element);
 201 m_openElements.pushHTMLHtmlElement(HTMLStackNode::create(element, token));
201202
202203 executeQueuedTasks();
203204 element->insertedByParser();
204205 dispatchDocumentElementAvailableIfNeeded();
205206}
206207
207 void HTMLConstructionSite::mergeAttributesFromTokenIntoElement(AtomicHTMLToken& token, Element* element)
 208void HTMLConstructionSite::mergeAttributesFromTokenIntoElement(AtomicHTMLToken* token, Element* element)
208209{
209  if (token.attributes().isEmpty())
 210 if (token->attributes().isEmpty())
210211 return;
211212
212213 ElementAttributeData* elementAttributeData = element->ensureAttributeData();
213214
214  for (unsigned i = 0; i < token.attributes().size(); ++i) {
215  const Attribute& tokenAttribute = token.attributes().at(i);
 215 for (unsigned i = 0; i < token->attributes().size(); ++i) {
 216 const Attribute& tokenAttribute = token->attributes().at(i);
216217 if (!elementAttributeData->getAttributeItem(tokenAttribute.name()))
217218 element->setAttribute(tokenAttribute.name(), tokenAttribute.value());
218219 }
219220}
220221
221 void HTMLConstructionSite::insertHTMLHtmlStartTagInBody(AtomicHTMLToken& token)
 222void HTMLConstructionSite::insertHTMLHtmlStartTagInBody(AtomicHTMLToken* token)
222223{
223224 // FIXME: parse error
224225

@@void HTMLConstructionSite::insertHTMLHtmlStartTagInBody(AtomicHTMLToken& token)
230231 mergeAttributesFromTokenIntoElement(token, m_openElements.htmlElement());
231232}
232233
233 void HTMLConstructionSite::insertHTMLBodyStartTagInBody(AtomicHTMLToken& token)
 234void HTMLConstructionSite::insertHTMLBodyStartTagInBody(AtomicHTMLToken* token)
234235{
235236 // FIXME: parse error
236237 mergeAttributesFromTokenIntoElement(token, m_openElements.bodyElement());
237238}
238239
239 void HTMLConstructionSite::insertDoctype(AtomicHTMLToken& token)
 240void HTMLConstructionSite::insertDoctype(AtomicHTMLToken* token)
240241{
241  ASSERT(token.type() == HTMLTokenTypes::DOCTYPE);
 242 ASSERT(token->type() == HTMLTokenTypes::DOCTYPE);
242243
243  RefPtr<DocumentType> doctype = DocumentType::create(m_document, token.name(), String::adopt(token.publicIdentifier()), String::adopt(token.systemIdentifier()));
 244 RefPtr<DocumentType> doctype = DocumentType::create(m_document, token->name(), String::adopt(token->publicIdentifier()), String::adopt(token->systemIdentifier()));
244245 attachLater(m_attachmentRoot, doctype.release());
245246
246247 // DOCTYPE nodes are only processed when parsing fragments w/o contextElements, which

@@void HTMLConstructionSite::insertDoctype(AtomicHTMLToken& token)
252253 if (m_isParsingFragment)
253254 return;
254255
255  if (token.forceQuirks())
 256 if (token->forceQuirks())
256257 m_document->setCompatibilityMode(Document::QuirksMode);
257258 else {
258259 // We need to actually add the Doctype node to the DOM.

@@void HTMLConstructionSite::insertDoctype(AtomicHTMLToken& token)
261262 }
262263}
263264
264 void HTMLConstructionSite::insertComment(AtomicHTMLToken& token)
 265void HTMLConstructionSite::insertComment(AtomicHTMLToken* token)
265266{
266  ASSERT(token.type() == HTMLTokenTypes::Comment);
267  attachLater(currentNode(), Comment::create(currentNode()->document(), token.comment()));
 267 ASSERT(token->type() == HTMLTokenTypes::Comment);
 268 attachLater(currentNode(), Comment::create(currentNode()->document(), token->comment()));
268269}
269270
270 void HTMLConstructionSite::insertCommentOnDocument(AtomicHTMLToken& token)
 271void HTMLConstructionSite::insertCommentOnDocument(AtomicHTMLToken* token)
271272{
272  ASSERT(token.type() == HTMLTokenTypes::Comment);
273  attachLater(m_attachmentRoot, Comment::create(m_document, token.comment()));
 273 ASSERT(token->type() == HTMLTokenTypes::Comment);
 274 attachLater(m_attachmentRoot, Comment::create(m_document, token->comment()));
274275}
275276
276 void HTMLConstructionSite::insertCommentOnHTMLHtmlElement(AtomicHTMLToken& token)
 277void HTMLConstructionSite::insertCommentOnHTMLHtmlElement(AtomicHTMLToken* token)
277278{
278  ASSERT(token.type() == HTMLTokenTypes::Comment);
 279 ASSERT(token->type() == HTMLTokenTypes::Comment);
279280 ContainerNode* parent = m_openElements.rootNode();
280  attachLater(parent, Comment::create(parent->document(), token.comment()));
 281 attachLater(parent, Comment::create(parent->document(), token->comment()));
281282}
282283
283 void HTMLConstructionSite::insertHTMLHeadElement(AtomicHTMLToken& token)
 284void HTMLConstructionSite::insertHTMLHeadElement(AtomicHTMLToken* token)
284285{
285286 ASSERT(!shouldFosterParent());
286287 m_head = createHTMLElement(token);
287288 attachLater(currentNode(), m_head);
288  m_openElements.pushHTMLHeadElement(m_head);
 289 m_openElements.pushHTMLHeadElement(HTMLStackNode::create(m_head, token));
289290}
290291
291 void HTMLConstructionSite::insertHTMLBodyElement(AtomicHTMLToken& token)
 292void HTMLConstructionSite::insertHTMLBodyElement(AtomicHTMLToken* token)
292293{
293294 ASSERT(!shouldFosterParent());
294295 RefPtr<Element> body = createHTMLElement(token);
295296 attachLater(currentNode(), body);
296  m_openElements.pushHTMLBodyElement(body.release());
 297 m_openElements.pushHTMLBodyElement(HTMLStackNode::create(body.release(), token));
297298}
298299
299 void HTMLConstructionSite::insertHTMLFormElement(AtomicHTMLToken& token, bool isDemoted)
 300void HTMLConstructionSite::insertHTMLFormElement(AtomicHTMLToken* token, bool isDemoted)
300301{
301302 RefPtr<Element> element = createHTMLElement(token);
302303 ASSERT(element->hasTagName(formTag));
303304 m_form = static_pointer_cast<HTMLFormElement>(element.release());
304305 m_form->setDemoted(isDemoted);
305306 attachLater(currentNode(), m_form);
306  m_openElements.push(m_form);
 307 m_openElements.push(HTMLStackNode::create(m_form, token));
307308}
308309
309 void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken& token)
 310void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken* token)
310311{
311312 RefPtr<Element> element = createHTMLElement(token);
312313 attachLater(currentNode(), element);
313  m_openElements.push(element.release());
 314 m_openElements.push(HTMLStackNode::create(element.release(), token));
314315}
315316
316 void HTMLConstructionSite::insertSelfClosingHTMLElement(AtomicHTMLToken& token)
 317void HTMLConstructionSite::insertSelfClosingHTMLElement(AtomicHTMLToken* token)
317318{
318  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 319 ASSERT(token->type() == HTMLTokenTypes::StartTag);
319320 // Normally HTMLElementStack is responsible for calling finishParsingChildren,
320321 // but self-closing elements are never in the element stack so the stack
321322 // doesn't get a chance to tell them that we're done parsing their children.

@@void HTMLConstructionSite::insertSelfClosingHTMLElement(AtomicHTMLToken& token)
324325 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#acknowledge-self-closing-flag
325326}
326327
327 void HTMLConstructionSite::insertFormattingElement(AtomicHTMLToken& token)
 328void HTMLConstructionSite::insertFormattingElement(AtomicHTMLToken* token)
328329{
329330 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements
330331 // Possible active formatting elements include:
331332 // a, b, big, code, em, font, i, nobr, s, small, strike, strong, tt, and u.
332333 insertHTMLElement(token);
333  m_activeFormattingElements.append(currentElement());
 334 m_activeFormattingElements.append(currentElementRecord()->stackNode());
334335}
335336
336 void HTMLConstructionSite::insertScriptElement(AtomicHTMLToken& token)
 337void HTMLConstructionSite::insertScriptElement(AtomicHTMLToken* token)
337338{
338339 // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#already-started
339340 // http://html5.org/specs/dom-parsing.html#dom-range-createcontextualfragment

@@void HTMLConstructionSite::insertScriptElement(AtomicHTMLToken& token)
344345 const bool alreadyStarted = m_isParsingFragment && parserInserted;
345346 RefPtr<HTMLScriptElement> element = HTMLScriptElement::create(scriptTag, currentNode()->document(), parserInserted, alreadyStarted);
346347 if (m_fragmentScriptingPermission != DisallowScriptingContent)
347  element->parserSetAttributes(token.attributes(), m_fragmentScriptingPermission);
 348 element->parserSetAttributes(token->attributes(), m_fragmentScriptingPermission);
348349 attachLater(currentNode(), element);
349  m_openElements.push(element.release());
 350 m_openElements.push(HTMLStackNode::create(element.release(), token));
350351}
351352
352 void HTMLConstructionSite::insertForeignElement(AtomicHTMLToken& token, const AtomicString& namespaceURI)
 353void HTMLConstructionSite::insertForeignElement(AtomicHTMLToken* token, const AtomicString& namespaceURI)
353354{
354  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 355 ASSERT(token->type() == HTMLTokenTypes::StartTag);
355356 notImplemented(); // parseError when xmlns or xmlns:xlink are wrong.
356357
357358 RefPtr<Element> element = createElement(token, namespaceURI);
358  attachLater(currentNode(), element, token.selfClosing());
359  if (!token.selfClosing())
360  m_openElements.push(element.release());
 359 attachLater(currentNode(), element, token->selfClosing());
 360 if (!token->selfClosing())
 361 m_openElements.push(HTMLStackNode::create(element.release(), token, namespaceURI));
361362}
362363
363364void HTMLConstructionSite::insertTextNode(const String& characters, WhitespaceMode whitespaceMode)

@@void HTMLConstructionSite::insertTextNode(const String& characters, WhitespaceMo
401402 }
402403}
403404
404 PassRefPtr<Element> HTMLConstructionSite::createElement(AtomicHTMLToken& token, const AtomicString& namespaceURI)
 405PassRefPtr<Element> HTMLConstructionSite::createElement(AtomicHTMLToken* token, const AtomicString& namespaceURI)
405406{
406  QualifiedName tagName(nullAtom, token.name(), namespaceURI);
 407 QualifiedName tagName(nullAtom, token->name(), namespaceURI);
407408 RefPtr<Element> element = currentNode()->document()->createElement(tagName, true);
408  element->parserSetAttributes(token.attributes(), m_fragmentScriptingPermission);
 409 element->parserSetAttributes(token->attributes(), m_fragmentScriptingPermission);
409410 return element.release();
410411}
411412
412 PassRefPtr<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken& token)
 413PassRefPtr<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken* token)
413414{
414  QualifiedName tagName(nullAtom, token.name(), xhtmlNamespaceURI);
 415 QualifiedName tagName(nullAtom, token->name(), xhtmlNamespaceURI);
415416 // FIXME: This can't use HTMLConstructionSite::createElement because we
416417 // have to pass the current form element. We should rework form association
417418 // to occur after construction to allow better code sharing here.
418419 RefPtr<Element> element = HTMLElementFactory::createHTMLElement(tagName, currentNode()->document(), form(), true);
419  element->parserSetAttributes(token.attributes(), m_fragmentScriptingPermission);
 420 element->parserSetAttributes(token->attributes(), m_fragmentScriptingPermission);
420421 ASSERT(element->isHTMLElement());
421422 return element.release();
422423}
423424
424 PassRefPtr<Element> HTMLConstructionSite::createHTMLElementFromElementRecord(HTMLElementStack::ElementRecord* record)
 425PassRefPtr<HTMLStackNode> HTMLConstructionSite::createElementFromSavedToken(PassRefPtr<HTMLStackNode> node)
425426{
426  return createHTMLElementFromSavedElement(record->element());
427 }
428 
429 PassRefPtr<Element> HTMLConstructionSite::createHTMLElementFromSavedElement(Element* element)
430 {
431  // FIXME: This method is wrong. We should be using the original token.
432  // Using an Element* causes us to fail examples like this:
433  // <b id="1"><p><script>document.getElementById("1").id = "2"</script></p>TEXT</b>
434  // When reconstructTheActiveFormattingElements calls this method to open
435  // a second <b> tag to wrap TEXT, it will have id "2", even though the HTML5
436  // spec implies it should be "1". Minefield matches the HTML5 spec here.
437 
438  ASSERT(element->isHTMLElement()); // otherwise localName() might be wrong.
439 
440  Vector<Attribute> clonedAttributes;
441  if (ElementAttributeData* attributeData = element->updatedAttributeData())
442  clonedAttributes = attributeData->clonedAttributeVector();
443 
444  AtomicHTMLToken fakeToken(HTMLTokenTypes::StartTag, element->localName(), clonedAttributes);
445  return createHTMLElement(fakeToken);
 427 RefPtr<Element> element;
 428 if (node->namespaceURI() == HTMLNames::xhtmlNamespaceURI)
 429 element = createHTMLElement(node->token());
 430 else
 431 element = createElement(node->token(), node->namespaceURI());
 432 return HTMLStackNode::create(element.release(), node->token(), node->namespaceURI());
446433}
447434
448435bool HTMLConstructionSite::indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const

@@void HTMLConstructionSite::reconstructTheActiveFormattingElements()
472459 ASSERT(unopenEntryIndex < m_activeFormattingElements.size());
473460 for (; unopenEntryIndex < m_activeFormattingElements.size(); ++unopenEntryIndex) {
474461 HTMLFormattingElementList::Entry& unopenedEntry = m_activeFormattingElements.at(unopenEntryIndex);
475  RefPtr<Element> reconstructed = createHTMLElementFromSavedElement(unopenedEntry.element());
476  attachLater(currentNode(), reconstructed);
477  m_openElements.push(reconstructed.release());
478  unopenedEntry.replaceElement(currentElement());
 462 RefPtr<HTMLStackNode> reconstructed = createElementFromSavedToken(unopenedEntry.stackNode());
 463 attachLater(currentNode(), reconstructed->node());
 464 m_openElements.push(reconstructed);
 465 unopenedEntry.replaceElement(reconstructed.release());
479466 }
480467}
481468

Source/WebCore/html/parser/HTMLConstructionSite.h

@@public:
8787 void detach();
8888 void executeQueuedTasks();
8989
90  void insertDoctype(AtomicHTMLToken&);
91  void insertComment(AtomicHTMLToken&);
92  void insertCommentOnDocument(AtomicHTMLToken&);
93  void insertCommentOnHTMLHtmlElement(AtomicHTMLToken&);
94  void insertHTMLElement(AtomicHTMLToken&);
95  void insertSelfClosingHTMLElement(AtomicHTMLToken&);
96  void insertFormattingElement(AtomicHTMLToken&);
97  void insertHTMLHeadElement(AtomicHTMLToken&);
98  void insertHTMLBodyElement(AtomicHTMLToken&);
99  void insertHTMLFormElement(AtomicHTMLToken&, bool isDemoted = false);
100  void insertScriptElement(AtomicHTMLToken&);
 90 void insertDoctype(AtomicHTMLToken*);
 91 void insertComment(AtomicHTMLToken*);
 92 void insertCommentOnDocument(AtomicHTMLToken*);
 93 void insertCommentOnHTMLHtmlElement(AtomicHTMLToken*);
 94 void insertHTMLElement(AtomicHTMLToken*);
 95 void insertSelfClosingHTMLElement(AtomicHTMLToken*);
 96 void insertFormattingElement(AtomicHTMLToken*);
 97 void insertHTMLHeadElement(AtomicHTMLToken*);
 98 void insertHTMLBodyElement(AtomicHTMLToken*);
 99 void insertHTMLFormElement(AtomicHTMLToken*, bool isDemoted = false);
 100 void insertScriptElement(AtomicHTMLToken*);
101101 void insertTextNode(const String&, WhitespaceMode = WhitespaceUnknown);
102  void insertForeignElement(AtomicHTMLToken&, const AtomicString& namespaceURI);
 102 void insertForeignElement(AtomicHTMLToken*, const AtomicString& namespaceURI);
103103
104  void insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken&);
105  void insertHTMLHtmlStartTagInBody(AtomicHTMLToken&);
106  void insertHTMLBodyStartTagInBody(AtomicHTMLToken&);
 104 void insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken*);
 105 void insertHTMLHtmlStartTagInBody(AtomicHTMLToken*);
 106 void insertHTMLBodyStartTagInBody(AtomicHTMLToken*);
107107
108  PassRefPtr<Element> createHTMLElement(AtomicHTMLToken&);
109  PassRefPtr<Element> createHTMLElementFromElementRecord(HTMLElementStack::ElementRecord*);
 108 PassRefPtr<Element> createHTMLElement(AtomicHTMLToken*);
 109 PassRefPtr<HTMLStackNode> createElementFromSavedToken(PassRefPtr<HTMLStackNode>);
110110
111111 bool shouldFosterParent() const;
112112 void fosterParent(PassRefPtr<Node>);

@@public:
118118 void generateImpliedEndTagsWithExclusion(const AtomicString& tagName);
119119
120120 bool isEmpty() const { return !m_openElements.stackDepth(); }
 121 HTMLElementStack::ElementRecord* currentElementRecord() const { return m_openElements.topRecord(); }
121122 Element* currentElement() const { return m_openElements.top(); }
122123 ContainerNode* currentNode() const { return m_openElements.topNode(); }
123124 Element* oneBelowTop() const { return m_openElements.oneBelowTop(); }

@@private:
160161
161162 void findFosterSite(HTMLConstructionSiteTask&);
162163
163  PassRefPtr<Element> createHTMLElementFromSavedElement(Element*);
164  PassRefPtr<Element> createElement(AtomicHTMLToken&, const AtomicString& namespaceURI);
 164 PassRefPtr<Element> createElement(AtomicHTMLToken*, const AtomicString& namespaceURI);
165165
166  void mergeAttributesFromTokenIntoElement(AtomicHTMLToken&, Element*);
 166 void mergeAttributesFromTokenIntoElement(AtomicHTMLToken*, Element*);
167167 void dispatchDocumentElementAvailableIfNeeded();
168168
169169 Document* m_document;

Source/WebCore/html/parser/HTMLElementStack.cpp

@@inline bool isSelectScopeMarker(ContainerNode* node)
125125
126126}
127127
128 HTMLElementStack::ElementRecord::ElementRecord(PassRefPtr<ContainerNode> node, PassOwnPtr<ElementRecord> next)
 128HTMLElementStack::ElementRecord::ElementRecord(PassRefPtr<HTMLStackNode> node, PassOwnPtr<ElementRecord> next)
129129 : m_node(node)
130130 , m_next(next)
131131{

@@HTMLElementStack::ElementRecord::~ElementRecord()
136136{
137137}
138138
139 void HTMLElementStack::ElementRecord::replaceElement(PassRefPtr<Element> element)
 139void HTMLElementStack::ElementRecord::replaceElement(PassRefPtr<HTMLStackNode> node)
140140{
141  ASSERT(element);
142  ASSERT(!m_node || m_node->isElementNode());
 141 ASSERT(node);
 142 ASSERT(!m_node || m_node->node()->isElementNode());
143143 // FIXME: Should this call finishParsingChildren?
144  m_node = element;
 144 m_node = node;
145145}
146146
147147bool HTMLElementStack::ElementRecord::isAbove(ElementRecord* other) const

@@void HTMLElementStack::popUntilForeignContentScopeMarker()
307307 pop();
308308}
309309
310 void HTMLElementStack::pushRootNode(PassRefPtr<ContainerNode> rootNode)
 310void HTMLElementStack::pushRootNode(PassRefPtr<HTMLStackNode> rootNode)
311311{
312  ASSERT(rootNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE);
 312 ASSERT(rootNode->node()->nodeType() == Node::DOCUMENT_FRAGMENT_NODE);
313313 pushRootNodeCommon(rootNode);
314314}
315315
316 void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<Element> element)
 316void HTMLElementStack::pushHTMLHtmlElement(PassRefPtr<HTMLStackNode> node)
317317{
318  ASSERT(element->hasTagName(HTMLNames::htmlTag));
319  pushRootNodeCommon(element);
 318 ASSERT(node->element()->hasTagName(HTMLNames::htmlTag));
 319 pushRootNodeCommon(node);
320320}
321321
322 void HTMLElementStack::pushRootNodeCommon(PassRefPtr<ContainerNode> rootNode)
 322void HTMLElementStack::pushRootNodeCommon(PassRefPtr<HTMLStackNode> rootNode)
323323{
324324 ASSERT(!m_top);
325325 ASSERT(!m_rootNode);
326  m_rootNode = rootNode.get();
 326 m_rootNode = rootNode->node();
327327 pushCommon(rootNode);
328328}
329329
330 void HTMLElementStack::pushHTMLHeadElement(PassRefPtr<Element> element)
 330void HTMLElementStack::pushHTMLHeadElement(PassRefPtr<HTMLStackNode> node)
331331{
332  ASSERT(element->hasTagName(HTMLNames::headTag));
 332 ASSERT(node->element()->hasTagName(HTMLNames::headTag));
333333 ASSERT(!m_headElement);
334  m_headElement = element.get();
335  pushCommon(element);
 334 m_headElement = node->element();
 335 pushCommon(node);
336336}
337337
338 void HTMLElementStack::pushHTMLBodyElement(PassRefPtr<Element> element)
 338void HTMLElementStack::pushHTMLBodyElement(PassRefPtr<HTMLStackNode> node)
339339{
340  ASSERT(element->hasTagName(HTMLNames::bodyTag));
 340 ASSERT(node->element()->hasTagName(HTMLNames::bodyTag));
341341 ASSERT(!m_bodyElement);
342  m_bodyElement = element.get();
343  pushCommon(element);
 342 m_bodyElement = node->element();
 343 pushCommon(node);
344344}
345345
346 void HTMLElementStack::push(PassRefPtr<Element> element)
 346void HTMLElementStack::push(PassRefPtr<HTMLStackNode> node)
347347{
348  ASSERT(!element->hasTagName(HTMLNames::htmlTag));
349  ASSERT(!element->hasTagName(HTMLNames::headTag));
350  ASSERT(!element->hasTagName(HTMLNames::bodyTag));
 348 ASSERT(!node->element()->hasTagName(HTMLNames::htmlTag));
 349 ASSERT(!node->element()->hasTagName(HTMLNames::headTag));
 350 ASSERT(!node->element()->hasTagName(HTMLNames::bodyTag));
351351 ASSERT(m_rootNode);
352  pushCommon(element);
 352 pushCommon(node);
353353}
354354
355 void HTMLElementStack::insertAbove(PassRefPtr<Element> element, ElementRecord* recordBelow)
 355void HTMLElementStack::insertAbove(PassRefPtr<HTMLStackNode> node, ElementRecord* recordBelow)
356356{
357  ASSERT(element);
 357 ASSERT(node);
358358 ASSERT(recordBelow);
359359 ASSERT(m_top);
360  ASSERT(!element->hasTagName(HTMLNames::htmlTag));
361  ASSERT(!element->hasTagName(HTMLNames::headTag));
362  ASSERT(!element->hasTagName(HTMLNames::bodyTag));
 360 ASSERT(!node->element()->hasTagName(HTMLNames::htmlTag));
 361 ASSERT(!node->element()->hasTagName(HTMLNames::headTag));
 362 ASSERT(!node->element()->hasTagName(HTMLNames::bodyTag));
363363 ASSERT(m_rootNode);
364364 if (recordBelow == m_top) {
365  push(element);
 365 push(node);
366366 return;
367367 }
368368

@@void HTMLElementStack::insertAbove(PassRefPtr<Element> element, ElementRecord* r
371371 continue;
372372
373373 m_stackDepth++;
374  recordAbove->setNext(adoptPtr(new ElementRecord(element, recordAbove->releaseNext())));
 374 recordAbove->setNext(adoptPtr(new ElementRecord(node, recordAbove->releaseNext())));
375375 recordAbove->next()->element()->beginParsingChildren();
376376 return;
377377 }

@@ContainerNode* HTMLElementStack::rootNode() const
567567 return m_rootNode;
568568}
569569
570 void HTMLElementStack::pushCommon(PassRefPtr<ContainerNode> node)
 570void HTMLElementStack::pushCommon(PassRefPtr<HTMLStackNode> node)
571571{
572572 ASSERT(m_rootNode);
573573

Source/WebCore/html/parser/HTMLElementStack.h

2929
3030#include "Element.h"
3131#include "HTMLNames.h"
 32#include "HTMLStackNode.h"
3233#include <wtf/Forward.h>
3334#include <wtf/Noncopyable.h>
3435#include <wtf/OwnPtr.h>

@@public:
5556 public:
5657 ~ElementRecord(); // Public for ~PassOwnPtr()
5758
58  Element* element() const { return toElement(m_node.get()); }
59  ContainerNode* node() const { return m_node.get(); }
60  void replaceElement(PassRefPtr<Element>);
 59 Element* element() const { return m_node->element(); }
 60 ContainerNode* node() const { return m_node->node(); }
 61 PassRefPtr<HTMLStackNode> stackNode() const { return m_node; }
 62
 63 void replaceElement(PassRefPtr<HTMLStackNode>);
6164
6265 bool isAbove(ElementRecord*) const;
6366
6467 ElementRecord* next() const { return m_next.get(); }
65 
6668 private:
6769 friend class HTMLElementStack;
6870
69  ElementRecord(PassRefPtr<ContainerNode>, PassOwnPtr<ElementRecord>);
 71 ElementRecord(PassRefPtr<HTMLStackNode>, PassOwnPtr<ElementRecord>);
7072
7173 PassOwnPtr<ElementRecord> releaseNext() { return m_next.release(); }
7274 void setNext(PassOwnPtr<ElementRecord> next) { m_next = next; }
7375
74  RefPtr<ContainerNode> m_node;
 76 RefPtr<HTMLStackNode> m_node;
7577 OwnPtr<ElementRecord> m_next;
7678 };
7779

@@public:
9799 ElementRecord* find(Element*) const;
98100 ElementRecord* topmost(const AtomicString& tagName) const;
99101
100  void insertAbove(PassRefPtr<Element>, ElementRecord*);
 102 void insertAbove(PassRefPtr<HTMLStackNode>, ElementRecord*);
101103
102  void push(PassRefPtr<Element>);
103  void pushRootNode(PassRefPtr<ContainerNode>);
104  void pushHTMLHtmlElement(PassRefPtr<Element>);
105  void pushHTMLHeadElement(PassRefPtr<Element>);
106  void pushHTMLBodyElement(PassRefPtr<Element>);
 104 void push(PassRefPtr<HTMLStackNode>);
 105 void pushRootNode(PassRefPtr<HTMLStackNode>);
 106 void pushHTMLHtmlElement(PassRefPtr<HTMLStackNode>);
 107 void pushHTMLHeadElement(PassRefPtr<HTMLStackNode>);
 108 void pushHTMLBodyElement(PassRefPtr<HTMLStackNode>);
107109
108110 void pop();
109111 void popUntil(const AtomicString& tagName);

@@public:
156158#endif
157159
158160private:
159  void pushCommon(PassRefPtr<ContainerNode>);
160  void pushRootNodeCommon(PassRefPtr<ContainerNode>);
 161 void pushCommon(PassRefPtr<HTMLStackNode>);
 162 void pushRootNodeCommon(PassRefPtr<HTMLStackNode>);
161163 void popCommon();
162164 void removeNonTopCommon(Element*);
163165

Source/WebCore/html/parser/HTMLFormattingElementList.cpp

@@HTMLFormattingElementList::Bookmark HTMLFormattingElementList::bookmarkFor(Eleme
8787 return Bookmark(&at(index));
8888}
8989
90 void HTMLFormattingElementList::swapTo(Element* oldElement, Element* newElement, const Bookmark& bookmark)
 90void HTMLFormattingElementList::swapTo(Element* oldElement, PassRefPtr<HTMLStackNode> prpNewNode, const Bookmark& bookmark)
9191{
 92 RefPtr<HTMLStackNode> newNode = prpNewNode;
 93
9294 ASSERT(contains(oldElement));
93  ASSERT(!contains(newElement));
 95 ASSERT(!contains(newNode->element()));
9496 if (!bookmark.hasBeenMoved()) {
9597 ASSERT(bookmark.mark()->element() == oldElement);
96  bookmark.mark()->replaceElement(newElement);
 98 bookmark.mark()->replaceElement(newNode);
9799 return;
98100 }
99101 size_t index = bookmark.mark() - first();
100102 ASSERT(index < size());
101  m_entries.insert(index + 1, newElement);
 103 m_entries.insert(index + 1, newNode);
102104 remove(oldElement);
103105}
104106
105 void HTMLFormattingElementList::append(Element* element)
 107void HTMLFormattingElementList::append(PassRefPtr<HTMLStackNode> node)
106108{
107  ensureNoahsArkCondition(element);
108  m_entries.append(element);
 109 ensureNoahsArkCondition(node->element());
 110 m_entries.append(node);
109111}
110112
111113void HTMLFormattingElementList::remove(Element* element)

Source/WebCore/html/parser/HTMLFormattingElementList.h

2626#ifndef HTMLFormattingElementList_h
2727#define HTMLFormattingElementList_h
2828
 29#include "HTMLStackNode.h"
2930#include <wtf/Forward.h>
3031#include <wtf/RefPtr.h>
3132#include <wtf/Vector.h>

@@public:
4748 class Entry {
4849 public:
4950 // Inline because they're hot and Vector<T> uses them.
50  explicit Entry(Element* element)
51  : m_element(element)
 51 explicit Entry(PassRefPtr<HTMLStackNode> node)
 52 : m_node(node)
5253 {
53  ASSERT(element);
5454 }
5555 enum MarkerEntryType { MarkerEntry };
5656 Entry(MarkerEntryType)
57  : m_element(0)
 57 : m_node(0)
5858 {
5959 }
6060 ~Entry() {}
6161
62  bool isMarker() const { return !m_element; }
 62 bool isMarker() const { return !m_node; }
6363
 64 PassRefPtr<HTMLStackNode> stackNode() const { return m_node; }
6465 Element* element() const
6566 {
66  // The fact that !m_element == isMarker() is an implementation detail
 67 // The fact that !m_node == isMarker() is an implementation detail
6768 // callers should check isMarker() before calling element().
68  ASSERT(m_element);
69  return m_element.get();
 69 ASSERT(m_node);
 70 return m_node->element();
7071 }
71  void replaceElement(PassRefPtr<Element> element) { m_element = element; }
 72 void replaceElement(PassRefPtr<HTMLStackNode> node) { m_node = node; }
7273
7374 // Needed for use with Vector. These are super-hot and must be inline.
74  bool operator==(Element* element) const { return m_element == element; }
75  bool operator!=(Element* element) const { return m_element != element; }
 75 bool operator==(Element* element) const { return !m_node ? !element : m_node->element() == element; }
 76 bool operator!=(Element* element) const { return !m_node ? !!element : m_node->element() != element; }
7677
7778 private:
78  RefPtr<Element> m_element;
 79 RefPtr<HTMLStackNode> m_node;
7980 };
8081
8182 class Bookmark {

@@public:
107108
108109 Entry* find(Element*);
109110 bool contains(Element*);
110  void append(Element*);
 111 void append(PassRefPtr<HTMLStackNode>);
111112 void remove(Element*);
112113
113114 Bookmark bookmarkFor(Element*);
114  void swapTo(Element* oldElement, Element* newElement, const Bookmark&);
 115 void swapTo(Element* oldElement, PassRefPtr<HTMLStackNode> prpNewNode, const Bookmark&);
115116
116117 void appendMarker();
117118 // clearToLastMarker also clears the marker (per the HTML5 spec).

Source/WebCore/html/parser/HTMLStackNode.h

 1/*
 2 * Copyright (C) 2012 Company 100, Inc. All rights reserved.
 3 *
 4 * Redistribution and use in source and binary forms, with or without
 5 * modification, are permitted provided that the following conditions
 6 * are met:
 7 * 1. Redistributions of source code must retain the above copyright
 8 * notice, this list of conditions and the following disclaimer.
 9 * 2. Redistributions in binary form must reproduce the above copyright
 10 * notice, this list of conditions and the following disclaimer in the
 11 * documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GOOGLE INC. OR
 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 24 */
 25
 26#ifndef HTMLStackNode_h
 27#define HTMLStackNode_h
 28
 29#include "Element.h"
 30#include "HTMLNames.h"
 31#include "HTMLToken.h"
 32
 33#include <wtf/RefCounted.h>
 34#include <wtf/RefPtr.h>
 35#include <wtf/text/AtomicString.h>
 36
 37namespace WebCore {
 38
 39class ContainerNode;
 40
 41class HTMLStackNode : public RefCounted<HTMLStackNode> {
 42public:
 43 // DocumentFragment case.
 44 static PassRefPtr<HTMLStackNode> create(PassRefPtr<ContainerNode> node)
 45 {
 46 RefPtr<AtomicHTMLToken> fakeToken = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, "");
 47 return adoptRef(new HTMLStackNode(node, fakeToken.get()));
 48 }
 49
 50 // Used by HTMLElementStack.
 51 static PassRefPtr<HTMLStackNode> create(PassRefPtr<ContainerNode> node, AtomicHTMLToken* token, const AtomicString& namespaceURI = HTMLNames::xhtmlNamespaceURI)
 52 {
 53 return adoptRef(new HTMLStackNode(node, token, namespaceURI));
 54 }
 55
 56 // Used by HTMLFormattingElementList.
 57 static PassRefPtr<HTMLStackNode> create(Element* element, AtomicHTMLToken* token, const AtomicString& namespaceURI = HTMLNames::xhtmlNamespaceURI)
 58 {
 59 return adoptRef(new HTMLStackNode(element, token, namespaceURI));
 60 }
 61
 62 Element* element() const { return toElement(m_node.get()); }
 63 ContainerNode* node() const { return m_node.get(); }
 64
 65 AtomicHTMLToken* token() { return m_token.get(); }
 66 const AtomicString& namespaceURI() const { return m_namespaceURI; }
 67
 68private:
 69 HTMLStackNode(PassRefPtr<ContainerNode> node, AtomicHTMLToken* token, const AtomicString& namespaceURI = HTMLNames::xhtmlNamespaceURI)
 70 : m_node(node)
 71 , m_token(token)
 72 , m_namespaceURI(namespaceURI)
 73 {
 74 }
 75
 76 HTMLStackNode(Element* element, AtomicHTMLToken* token, const AtomicString& namespaceURI = HTMLNames::xhtmlNamespaceURI)
 77 : m_node(element)
 78 , m_token(token)
 79 , m_namespaceURI(namespaceURI)
 80 {
 81 }
 82
 83 RefPtr<ContainerNode> m_node;
 84
 85 RefPtr<AtomicHTMLToken> m_token;
 86 AtomicString m_namespaceURI;
 87};
 88
 89} // namespace WebCore
 90
 91#endif // HTMLStackNode_h

Source/WebCore/html/parser/HTMLToken.h

2727#define HTMLToken_h
2828
2929#include "MarkupTokenBase.h"
 30#include <wtf/RefCounted.h>
 31#include <wtf/RefPtr.h>
3032
3133namespace WebCore {
3234

@@public:
8183 }
8284};
8385
84 class AtomicHTMLToken : public AtomicMarkupTokenBase<HTMLToken> {
 86class AtomicHTMLToken : public AtomicMarkupTokenBase<HTMLToken>, public RefCounted<AtomicHTMLToken> {
8587 WTF_MAKE_NONCOPYABLE(AtomicHTMLToken);
8688public:
87  AtomicHTMLToken(HTMLToken& token) : AtomicMarkupTokenBase<HTMLToken>(&token) { }
 89 static PassRefPtr<AtomicHTMLToken> create(HTMLToken& token)
 90 {
 91 return adoptRef(new AtomicHTMLToken(token));
 92 }
8893
89  AtomicHTMLToken(HTMLTokenTypes::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>())
90  : AtomicMarkupTokenBase<HTMLToken>(type, name, attributes)
 94 static PassRefPtr<AtomicHTMLToken> create(HTMLTokenTypes::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>())
9195 {
 96 return adoptRef(new AtomicHTMLToken(type, name, attributes));
9297 }
9398
9499 bool forceQuirks() const

@@public:
96101 ASSERT(m_type == HTMLTokenTypes::DOCTYPE);
97102 return m_doctypeData->m_forceQuirks;
98103 }
 104
 105private:
 106 AtomicHTMLToken(HTMLToken& token) : AtomicMarkupTokenBase<HTMLToken>(&token) { }
 107
 108 AtomicHTMLToken(HTMLTokenTypes::Type type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>())
 109 : AtomicMarkupTokenBase<HTMLToken>(type, name, attributes)
 110 {
 111 }
 112
99113};
100114
101115}

Source/WebCore/html/parser/HTMLTreeBuilder.cpp

4040#include "HTMLNames.h"
4141#include "HTMLParserIdioms.h"
4242#include "HTMLScriptElement.h"
 43#include "HTMLStackNode.h"
4344#include "HTMLToken.h"
4445#include "HTMLTokenizer.h"
4546#include "LocalizedStrings.h"

@@HTMLFormElement* closestFormAncestor(Element* element)
245246class HTMLTreeBuilder::ExternalCharacterTokenBuffer {
246247 WTF_MAKE_NONCOPYABLE(ExternalCharacterTokenBuffer);
247248public:
248  explicit ExternalCharacterTokenBuffer(AtomicHTMLToken& token)
249  : m_current(token.characters().data())
250  , m_end(m_current + token.characters().size())
 249 explicit ExternalCharacterTokenBuffer(AtomicHTMLToken* token)
 250 : m_current(token->characters().data())
 251 , m_end(m_current + token->characters().size())
251252 {
252253 ASSERT(!isEmpty());
253254 }

@@HTMLTreeBuilder::HTMLTreeBuilder(HTMLDocumentParser* parser, DocumentFragment* f
382383 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case
383384 // For efficiency, we skip step 4.2 ("Let root be a new html element with no attributes")
384385 // and instead use the DocumentFragment as a root node.
385  m_tree.openElements()->pushRootNode(fragment);
 386 m_tree.openElements()->pushRootNode(HTMLStackNode::create(fragment));
386387 resetInsertionModeAppropriately();
387388 m_tree.setForm(closestFormAncestor(contextElement));
388389 }

@@PassRefPtr<Element> HTMLTreeBuilder::takeScriptToProcess(TextPosition& scriptSta
435436
436437void HTMLTreeBuilder::constructTreeFromToken(HTMLToken& rawToken)
437438{
438  AtomicHTMLToken token(rawToken);
 439 RefPtr<AtomicHTMLToken> token = AtomicHTMLToken::create(rawToken);
439440
440441 // We clear the rawToken in case constructTreeFromAtomicToken
441442 // synchronously re-enters the parser. We don't clear the token immedately

@@void HTMLTreeBuilder::constructTreeFromToken(HTMLToken& rawToken)
450451 if (rawToken.type() != HTMLTokenTypes::Character)
451452 rawToken.clear();
452453
453  constructTreeFromAtomicToken(token);
 454 constructTreeFromAtomicToken(token.get());
454455
455456 if (!rawToken.isUninitialized()) {
456457 ASSERT(rawToken.type() == HTMLTokenTypes::Character);

@@void HTMLTreeBuilder::constructTreeFromToken(HTMLToken& rawToken)
458459 }
459460}
460461
461 void HTMLTreeBuilder::constructTreeFromAtomicToken(AtomicHTMLToken& token)
 462void HTMLTreeBuilder::constructTreeFromAtomicToken(AtomicHTMLToken* token)
462463{
463464 if (shouldProcessTokenInForeignContent(token))
464465 processTokenInForeignContent(token);

@@void HTMLTreeBuilder::constructTreeFromAtomicToken(AtomicHTMLToken& token)
477478 // We might be detached now.
478479}
479480
480 void HTMLTreeBuilder::processToken(AtomicHTMLToken& token)
 481void HTMLTreeBuilder::processToken(AtomicHTMLToken* token)
481482{
482  switch (token.type()) {
 483 switch (token->type()) {
483484 case HTMLTokenTypes::Uninitialized:
484485 ASSERT_NOT_REACHED();
485486 break;

@@void HTMLTreeBuilder::processToken(AtomicHTMLToken& token)
509510 }
510511}
511512
512 void HTMLTreeBuilder::processDoctypeToken(AtomicHTMLToken& token)
 513void HTMLTreeBuilder::processDoctypeToken(AtomicHTMLToken* token)
513514{
514  ASSERT(token.type() == HTMLTokenTypes::DOCTYPE);
 515 ASSERT(token->type() == HTMLTokenTypes::DOCTYPE);
515516 if (m_insertionMode == InitialMode) {
516517 m_tree.insertDoctype(token);
517518 setInsertionMode(BeforeHTMLMode);

@@void HTMLTreeBuilder::processDoctypeToken(AtomicHTMLToken& token)
528529void HTMLTreeBuilder::processFakeStartTag(const QualifiedName& tagName, const Vector<Attribute>& attributes)
529530{
530531 // FIXME: We'll need a fancier conversion than just "localName" for SVG/MathML tags.
531  AtomicHTMLToken fakeToken(HTMLTokenTypes::StartTag, tagName.localName(), attributes);
532  processStartTag(fakeToken);
 532 RefPtr<AtomicHTMLToken> fakeToken = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, tagName.localName(), attributes);
 533 processStartTag(fakeToken.get());
533534}
534535
535536void HTMLTreeBuilder::processFakeEndTag(const QualifiedName& tagName)
536537{
537538 // FIXME: We'll need a fancier conversion than just "localName" for SVG/MathML tags.
538  AtomicHTMLToken fakeToken(HTMLTokenTypes::EndTag, tagName.localName());
539  processEndTag(fakeToken);
 539 RefPtr<AtomicHTMLToken> fakeToken = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, tagName.localName());
 540 processEndTag(fakeToken.get());
540541}
541542
542543void HTMLTreeBuilder::processFakeCharacters(const String& characters)

@@void HTMLTreeBuilder::processFakePEndTagIfPInButtonScope()
550551{
551552 if (!m_tree.openElements()->inButtonScope(pTag.localName()))
552553 return;
553  AtomicHTMLToken endP(HTMLTokenTypes::EndTag, pTag.localName());
554  processEndTag(endP);
 554 RefPtr<AtomicHTMLToken> endP = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, pTag.localName());
 555 processEndTag(endP.get());
555556}
556557
557 Vector<Attribute> HTMLTreeBuilder::attributesForIsindexInput(AtomicHTMLToken& token)
 558Vector<Attribute> HTMLTreeBuilder::attributesForIsindexInput(AtomicHTMLToken* token)
558559{
559  Vector<Attribute> attributes = token.attributes();
 560 Vector<Attribute> attributes = token->attributes();
560561 for (int i = attributes.size() - 1; i >= 0; --i) {
561562 const QualifiedName& name = attributes.at(i).name();
562563 if (name.matches(nameAttr) || name.matches(actionAttr) || name.matches(promptAttr))

@@Vector<Attribute> HTMLTreeBuilder::attributesForIsindexInput(AtomicHTMLToken& to
567568 return attributes;
568569}
569570
570 void HTMLTreeBuilder::processIsindexStartTagForInBody(AtomicHTMLToken& token)
 571void HTMLTreeBuilder::processIsindexStartTagForInBody(AtomicHTMLToken* token)
571572{
572  ASSERT(token.type() == HTMLTokenTypes::StartTag);
573  ASSERT(token.name() == isindexTag);
 573 ASSERT(token->type() == HTMLTokenTypes::StartTag);
 574 ASSERT(token->name() == isindexTag);
574575 parseError(token);
575576 if (m_tree.form())
576577 return;
577578 notImplemented(); // Acknowledge self-closing flag
578579 processFakeStartTag(formTag);
579  Attribute* actionAttribute = token.getAttributeItem(actionAttr);
 580 Attribute* actionAttribute = token->getAttributeItem(actionAttr);
580581 if (actionAttribute)
581582 m_tree.form()->setAttribute(actionAttr, actionAttribute->value());
582583 processFakeStartTag(hrTag);
583584 processFakeStartTag(labelTag);
584  Attribute* promptAttribute = token.getAttributeItem(promptAttr);
 585 Attribute* promptAttribute = token->getAttributeItem(promptAttr);
585586 if (promptAttribute)
586587 processFakeCharacters(promptAttribute->value());
587588 else

@@bool isDdOrDt(const ContainerNode* element)
609610}
610611
611612template <bool shouldClose(const ContainerNode*)>
612 void HTMLTreeBuilder::processCloseWhenNestedTag(AtomicHTMLToken& token)
 613void HTMLTreeBuilder::processCloseWhenNestedTag(AtomicHTMLToken* token)
613614{
614615 m_framesetOk = false;
615616 HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord();

@@void mapLoweredLocalNameToName(PrefixedNameToQualifiedNameMap* map, QualifiedNam
643644 }
644645}
645646
646 void adjustSVGTagNameCase(AtomicHTMLToken& token)
 647void adjustSVGTagNameCase(AtomicHTMLToken* token)
647648{
648649 static PrefixedNameToQualifiedNameMap* caseMap = 0;
649650 if (!caseMap) {

@@void adjustSVGTagNameCase(AtomicHTMLToken& token)
653654 mapLoweredLocalNameToName(caseMap, svgTags, length);
654655 }
655656
656  const QualifiedName& casedName = caseMap->get(token.name());
 657 const QualifiedName& casedName = caseMap->get(token->name());
657658 if (casedName.localName().isNull())
658659 return;
659  token.setName(casedName.localName());
 660 token->setName(casedName.localName());
660661}
661662
662663template<QualifiedName** getAttrs(size_t* length)>
663 void adjustAttributes(AtomicHTMLToken& token)
 664void adjustAttributes(AtomicHTMLToken* token)
664665{
665666 static PrefixedNameToQualifiedNameMap* caseMap = 0;
666667 if (!caseMap) {

@@void adjustAttributes(AtomicHTMLToken& token)
670671 mapLoweredLocalNameToName(caseMap, attrs, length);
671672 }
672673
673  for (unsigned i = 0; i < token.attributes().size(); ++i) {
674  Attribute& tokenAttribute = token.attributes().at(i);
 674 for (unsigned i = 0; i < token->attributes().size(); ++i) {
 675 Attribute& tokenAttribute = token->attributes().at(i);
675676 const QualifiedName& casedName = caseMap->get(tokenAttribute.localName());
676677 if (!casedName.localName().isNull())
677678 tokenAttribute.parserSetName(casedName);
678679 }
679680}
680681
681 void adjustSVGAttributes(AtomicHTMLToken& token)
 682void adjustSVGAttributes(AtomicHTMLToken* token)
682683{
683684 adjustAttributes<SVGNames::getSVGAttrs>(token);
684685}
685686
686 void adjustMathMLAttributes(AtomicHTMLToken& token)
 687void adjustMathMLAttributes(AtomicHTMLToken* token)
687688{
688689 adjustAttributes<MathMLNames::getMathMLAttrs>(token);
689690}

@@void addNamesWithPrefix(PrefixedNameToQualifiedNameMap* map, const AtomicString&
699700 }
700701}
701702
702 void adjustForeignAttributes(AtomicHTMLToken& token)
 703void adjustForeignAttributes(AtomicHTMLToken* token)
703704{
704705 static PrefixedNameToQualifiedNameMap* map = 0;
705706 if (!map) {

@@void adjustForeignAttributes(AtomicHTMLToken& token)
715716 map->add("xmlns:xlink", QualifiedName("xmlns", "xlink", XMLNSNames::xmlnsNamespaceURI));
716717 }
717718
718  for (unsigned i = 0; i < token.attributes().size(); ++i) {
719  Attribute& tokenAttribute = token.attributes().at(i);
 719 for (unsigned i = 0; i < token->attributes().size(); ++i) {
 720 Attribute& tokenAttribute = token->attributes().at(i);
720721 const QualifiedName& name = map->get(tokenAttribute.localName());
721722 if (!name.localName().isNull())
722723 tokenAttribute.parserSetName(name);

@@void adjustForeignAttributes(AtomicHTMLToken& token)
725726
726727}
727728
728 void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
 729void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken* token)
729730{
730  ASSERT(token.type() == HTMLTokenTypes::StartTag);
731  if (token.name() == htmlTag) {
 731 ASSERT(token->type() == HTMLTokenTypes::StartTag);
 732 if (token->name() == htmlTag) {
732733 m_tree.insertHTMLHtmlStartTagInBody(token);
733734 return;
734735 }
735  if (token.name() == baseTag
736  || token.name() == basefontTag
737  || token.name() == bgsoundTag
738  || token.name() == commandTag
739  || token.name() == linkTag
740  || token.name() == metaTag
741  || token.name() == noframesTag
742  || token.name() == scriptTag
743  || token.name() == styleTag
744  || token.name() == titleTag) {
 736 if (token->name() == baseTag
 737 || token->name() == basefontTag
 738 || token->name() == bgsoundTag
 739 || token->name() == commandTag
 740 || token->name() == linkTag
 741 || token->name() == metaTag
 742 || token->name() == noframesTag
 743 || token->name() == scriptTag
 744 || token->name() == styleTag
 745 || token->name() == titleTag) {
745746 bool didProcess = processStartTagForInHead(token);
746747 ASSERT_UNUSED(didProcess, didProcess);
747748 return;
748749 }
749  if (token.name() == bodyTag) {
 750 if (token->name() == bodyTag) {
750751 parseError(token);
751752 if (!m_tree.openElements()->secondElementIsHTMLBodyElement() || m_tree.openElements()->hasOnlyOneElement()) {
752753 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
756757 m_tree.insertHTMLBodyStartTagInBody(token);
757758 return;
758759 }
759  if (token.name() == framesetTag) {
 760 if (token->name() == framesetTag) {
760761 parseError(token);
761762 if (!m_tree.openElements()->secondElementIsHTMLBodyElement() || m_tree.openElements()->hasOnlyOneElement()) {
762763 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
774775 setInsertionMode(InFramesetMode);
775776 return;
776777 }
777  if (token.name() == addressTag
778  || token.name() == articleTag
779  || token.name() == asideTag
780  || token.name() == blockquoteTag
781  || token.name() == centerTag
782  || token.name() == detailsTag
783  || token.name() == dirTag
784  || token.name() == divTag
785  || token.name() == dlTag
786  || token.name() == fieldsetTag
787  || token.name() == figcaptionTag
788  || token.name() == figureTag
789  || token.name() == footerTag
790  || token.name() == headerTag
791  || token.name() == hgroupTag
792  || token.name() == menuTag
793  || token.name() == navTag
794  || token.name() == olTag
795  || token.name() == pTag
796  || token.name() == sectionTag
797  || token.name() == summaryTag
798  || token.name() == ulTag) {
 778 if (token->name() == addressTag
 779 || token->name() == articleTag
 780 || token->name() == asideTag
 781 || token->name() == blockquoteTag
 782 || token->name() == centerTag
 783 || token->name() == detailsTag
 784 || token->name() == dirTag
 785 || token->name() == divTag
 786 || token->name() == dlTag
 787 || token->name() == fieldsetTag
 788 || token->name() == figcaptionTag
 789 || token->name() == figureTag
 790 || token->name() == footerTag
 791 || token->name() == headerTag
 792 || token->name() == hgroupTag
 793 || token->name() == menuTag
 794 || token->name() == navTag
 795 || token->name() == olTag
 796 || token->name() == pTag
 797 || token->name() == sectionTag
 798 || token->name() == summaryTag
 799 || token->name() == ulTag) {
799800 processFakePEndTagIfPInButtonScope();
800801 m_tree.insertHTMLElement(token);
801802 return;
802803 }
803  if (isNumberedHeaderTag(token.name())) {
 804 if (isNumberedHeaderTag(token->name())) {
804805 processFakePEndTagIfPInButtonScope();
805806 if (isNumberedHeaderTag(m_tree.currentNode()->localName())) {
806807 parseError(token);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
809810 m_tree.insertHTMLElement(token);
810811 return;
811812 }
812  if (token.name() == preTag || token.name() == listingTag) {
 813 if (token->name() == preTag || token->name() == listingTag) {
813814 processFakePEndTagIfPInButtonScope();
814815 m_tree.insertHTMLElement(token);
815816 m_shouldSkipLeadingNewline = true;
816817 m_framesetOk = false;
817818 return;
818819 }
819  if (token.name() == formTag) {
 820 if (token->name() == formTag) {
820821 if (m_tree.form()) {
821822 parseError(token);
822823 return;

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
825826 m_tree.insertHTMLFormElement(token);
826827 return;
827828 }
828  if (token.name() == liTag) {
 829 if (token->name() == liTag) {
829830 processCloseWhenNestedTag<isLi>(token);
830831 return;
831832 }
832  if (token.name() == ddTag || token.name() == dtTag) {
 833 if (token->name() == ddTag || token->name() == dtTag) {
833834 processCloseWhenNestedTag<isDdOrDt>(token);
834835 return;
835836 }
836  if (token.name() == plaintextTag) {
 837 if (token->name() == plaintextTag) {
837838 processFakePEndTagIfPInButtonScope();
838839 m_tree.insertHTMLElement(token);
839840 m_parser->tokenizer()->setState(HTMLTokenizerState::PLAINTEXTState);
840841 return;
841842 }
842  if (token.name() == buttonTag) {
 843 if (token->name() == buttonTag) {
843844 if (m_tree.openElements()->inScope(buttonTag)) {
844845 parseError(token);
845846 processFakeEndTag(buttonTag);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
851852 m_framesetOk = false;
852853 return;
853854 }
854  if (token.name() == aTag) {
 855 if (token->name() == aTag) {
855856 Element* activeATag = m_tree.activeFormattingElements()->closestElementInScopeWithName(aTag.localName());
856857 if (activeATag) {
857858 parseError(token);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
864865 m_tree.insertFormattingElement(token);
865866 return;
866867 }
867  if (isNonAnchorNonNobrFormattingTag(token.name())) {
 868 if (isNonAnchorNonNobrFormattingTag(token->name())) {
868869 m_tree.reconstructTheActiveFormattingElements();
869870 m_tree.insertFormattingElement(token);
870871 return;
871872 }
872  if (token.name() == nobrTag) {
 873 if (token->name() == nobrTag) {
873874 m_tree.reconstructTheActiveFormattingElements();
874875 if (m_tree.openElements()->inScope(nobrTag)) {
875876 parseError(token);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
879880 m_tree.insertFormattingElement(token);
880881 return;
881882 }
882  if (token.name() == appletTag
883  || token.name() == marqueeTag
884  || token.name() == objectTag) {
 883 if (token->name() == appletTag
 884 || token->name() == marqueeTag
 885 || token->name() == objectTag) {
885886 m_tree.reconstructTheActiveFormattingElements();
886887 m_tree.insertHTMLElement(token);
887888 m_tree.activeFormattingElements()->appendMarker();
888889 m_framesetOk = false;
889890 return;
890891 }
891  if (token.name() == tableTag) {
 892 if (token->name() == tableTag) {
892893 if (!m_document->inQuirksMode() && m_tree.openElements()->inButtonScope(pTag))
893894 processFakeEndTag(pTag);
894895 m_tree.insertHTMLElement(token);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
896897 setInsertionMode(InTableMode);
897898 return;
898899 }
899  if (token.name() == imageTag) {
 900 if (token->name() == imageTag) {
900901 parseError(token);
901902 // Apparently we're not supposed to ask.
902  token.setName(imgTag.localName());
 903 token->setName(imgTag.localName());
903904 // Note the fall through to the imgTag handling below!
904905 }
905  if (token.name() == areaTag
906  || token.name() == brTag
907  || token.name() == embedTag
908  || token.name() == imgTag
909  || token.name() == keygenTag
910  || token.name() == wbrTag) {
 906 if (token->name() == areaTag
 907 || token->name() == brTag
 908 || token->name() == embedTag
 909 || token->name() == imgTag
 910 || token->name() == keygenTag
 911 || token->name() == wbrTag) {
911912 m_tree.reconstructTheActiveFormattingElements();
912913 m_tree.insertSelfClosingHTMLElement(token);
913914 m_framesetOk = false;
914915 return;
915916 }
916  if (token.name() == inputTag) {
917  Attribute* typeAttribute = token.getAttributeItem(typeAttr);
 917 if (token->name() == inputTag) {
 918 Attribute* typeAttribute = token->getAttributeItem(typeAttr);
918919 m_tree.reconstructTheActiveFormattingElements();
919920 m_tree.insertSelfClosingHTMLElement(token);
920921 if (!typeAttribute || !equalIgnoringCase(typeAttribute->value(), "hidden"))
921922 m_framesetOk = false;
922923 return;
923924 }
924  if (token.name() == paramTag
925  || token.name() == sourceTag
926  || token.name() == trackTag) {
 925 if (token->name() == paramTag
 926 || token->name() == sourceTag
 927 || token->name() == trackTag) {
927928 m_tree.insertSelfClosingHTMLElement(token);
928929 return;
929930 }
930  if (token.name() == hrTag) {
 931 if (token->name() == hrTag) {
931932 processFakePEndTagIfPInButtonScope();
932933 m_tree.insertSelfClosingHTMLElement(token);
933934 m_framesetOk = false;
934935 return;
935936 }
936  if (token.name() == isindexTag) {
 937 if (token->name() == isindexTag) {
937938 processIsindexStartTagForInBody(token);
938939 return;
939940 }
940  if (token.name() == textareaTag) {
 941 if (token->name() == textareaTag) {
941942 m_tree.insertHTMLElement(token);
942943 m_shouldSkipLeadingNewline = true;
943944 m_parser->tokenizer()->setState(HTMLTokenizerState::RCDATAState);

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
946947 setInsertionMode(TextMode);
947948 return;
948949 }
949  if (token.name() == xmpTag) {
 950 if (token->name() == xmpTag) {
950951 processFakePEndTagIfPInButtonScope();
951952 m_tree.reconstructTheActiveFormattingElements();
952953 m_framesetOk = false;
953954 processGenericRawTextStartTag(token);
954955 return;
955956 }
956  if (token.name() == iframeTag) {
 957 if (token->name() == iframeTag) {
957958 m_framesetOk = false;
958959 processGenericRawTextStartTag(token);
959960 return;
960961 }
961  if (token.name() == noembedTag && pluginsEnabled(m_document->frame())) {
 962 if (token->name() == noembedTag && pluginsEnabled(m_document->frame())) {
962963 processGenericRawTextStartTag(token);
963964 return;
964965 }
965  if (token.name() == noscriptTag && scriptEnabled(m_document->frame())) {
 966 if (token->name() == noscriptTag && scriptEnabled(m_document->frame())) {
966967 processGenericRawTextStartTag(token);
967968 return;
968969 }
969  if (token.name() == selectTag) {
 970 if (token->name() == selectTag) {
970971 m_tree.reconstructTheActiveFormattingElements();
971972 m_tree.insertHTMLElement(token);
972973 m_framesetOk = false;

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
981982 setInsertionMode(InSelectMode);
982983 return;
983984 }
984  if (token.name() == optgroupTag || token.name() == optionTag) {
 985 if (token->name() == optgroupTag || token->name() == optionTag) {
985986 if (m_tree.currentNode()->hasTagName(optionTag)) {
986  AtomicHTMLToken endOption(HTMLTokenTypes::EndTag, optionTag.localName());
987  processEndTag(endOption);
 987 RefPtr<AtomicHTMLToken> endOption = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, optionTag.localName());
 988 processEndTag(endOption.get());
988989 }
989990 m_tree.reconstructTheActiveFormattingElements();
990991 m_tree.insertHTMLElement(token);
991992 return;
992993 }
993  if (token.name() == rpTag || token.name() == rtTag) {
 994 if (token->name() == rpTag || token->name() == rtTag) {
994995 if (m_tree.openElements()->inScope(rubyTag.localName())) {
995996 m_tree.generateImpliedEndTags();
996997 if (!m_tree.currentNode()->hasTagName(rubyTag))

@@void HTMLTreeBuilder::processStartTagForInBody(AtomicHTMLToken& token)
9991000 m_tree.insertHTMLElement(token);
10001001 return;
10011002 }
1002  if (token.name() == MathMLNames::mathTag.localName()) {
 1003 if (token->name() == MathMLNames::mathTag.localName()) {
10031004 m_tree.reconstructTheActiveFormattingElements();
10041005 adjustMathMLAttributes(token);
10051006 adjustForeignAttributes(token);
10061007 m_tree.insertForeignElement(token, MathMLNames::mathmlNamespaceURI);
10071008 return;
10081009 }
1009  if (token.name() == SVGNames::svgTag.localName()) {
 1010 if (token->name() == SVGNames::svgTag.localName()) {
10101011 m_tree.reconstructTheActiveFormattingElements();
10111012 adjustSVGAttributes(token);
10121013 adjustForeignAttributes(token);
10131014 m_tree.insertForeignElement(token, SVGNames::svgNamespaceURI);
10141015 return;
10151016 }
1016  if (isCaptionColOrColgroupTag(token.name())
1017  || token.name() == frameTag
1018  || token.name() == headTag
1019  || isTableBodyContextTag(token.name())
1020  || isTableCellContextTag(token.name())
1021  || token.name() == trTag) {
 1017 if (isCaptionColOrColgroupTag(token->name())
 1018 || token->name() == frameTag
 1019 || token->name() == headTag
 1020 || isTableBodyContextTag(token->name())
 1021 || isTableCellContextTag(token->name())
 1022 || token->name() == trTag) {
10221023 parseError(token);
10231024 return;
10241025 }

@@void HTMLTreeBuilder::closeTheCell()
10521053 ASSERT(insertionMode() == InRowMode);
10531054}
10541055
1055 void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken& token)
 1056void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken* token)
10561057{
1057  ASSERT(token.type() == HTMLTokenTypes::StartTag);
1058  if (token.name() == captionTag) {
 1058 ASSERT(token->type() == HTMLTokenTypes::StartTag);
 1059 if (token->name() == captionTag) {
10591060 m_tree.openElements()->popUntilTableScopeMarker();
10601061 m_tree.activeFormattingElements()->appendMarker();
10611062 m_tree.insertHTMLElement(token);
10621063 setInsertionMode(InCaptionMode);
10631064 return;
10641065 }
1065  if (token.name() == colgroupTag) {
 1066 if (token->name() == colgroupTag) {
10661067 m_tree.openElements()->popUntilTableScopeMarker();
10671068 m_tree.insertHTMLElement(token);
10681069 setInsertionMode(InColumnGroupMode);
10691070 return;
10701071 }
1071  if (token.name() == colTag) {
 1072 if (token->name() == colTag) {
10721073 processFakeStartTag(colgroupTag);
10731074 ASSERT(InColumnGroupMode);
10741075 processStartTag(token);
10751076 return;
10761077 }
1077  if (isTableBodyContextTag(token.name())) {
 1078 if (isTableBodyContextTag(token->name())) {
10781079 m_tree.openElements()->popUntilTableScopeMarker();
10791080 m_tree.insertHTMLElement(token);
10801081 setInsertionMode(InTableBodyMode);
10811082 return;
10821083 }
1083  if (isTableCellContextTag(token.name())
1084  || token.name() == trTag) {
 1084 if (isTableCellContextTag(token->name())
 1085 || token->name() == trTag) {
10851086 processFakeStartTag(tbodyTag);
10861087 ASSERT(insertionMode() == InTableBodyMode);
10871088 processStartTag(token);
10881089 return;
10891090 }
1090  if (token.name() == tableTag) {
 1091 if (token->name() == tableTag) {
10911092 parseError(token);
10921093 if (!processTableEndTagForInTable()) {
10931094 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken& token)
10961097 processStartTag(token);
10971098 return;
10981099 }
1099  if (token.name() == styleTag || token.name() == scriptTag) {
 1100 if (token->name() == styleTag || token->name() == scriptTag) {
11001101 processStartTagForInHead(token);
11011102 return;
11021103 }
1103  if (token.name() == inputTag) {
1104  Attribute* typeAttribute = token.getAttributeItem(typeAttr);
 1104 if (token->name() == inputTag) {
 1105 Attribute* typeAttribute = token->getAttributeItem(typeAttr);
11051106 if (typeAttribute && equalIgnoringCase(typeAttribute->value(), "hidden")) {
11061107 parseError(token);
11071108 m_tree.insertSelfClosingHTMLElement(token);

@@void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken& token)
11091110 }
11101111 // Fall through to "anything else" case.
11111112 }
1112  if (token.name() == formTag) {
 1113 if (token->name() == formTag) {
11131114 parseError(token);
11141115 if (m_tree.form())
11151116 return;

@@void HTMLTreeBuilder::processStartTagForInTable(AtomicHTMLToken& token)
11221123 processStartTagForInBody(token);
11231124}
11241125
1125 void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
 1126void HTMLTreeBuilder::processStartTag(AtomicHTMLToken* token)
11261127{
1127  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 1128 ASSERT(token->type() == HTMLTokenTypes::StartTag);
11281129 switch (insertionMode()) {
11291130 case InitialMode:
11301131 ASSERT(insertionMode() == InitialMode);

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
11321133 // Fall through.
11331134 case BeforeHTMLMode:
11341135 ASSERT(insertionMode() == BeforeHTMLMode);
1135  if (token.name() == htmlTag) {
 1136 if (token->name() == htmlTag) {
11361137 m_tree.insertHTMLHtmlStartTagBeforeHTML(token);
11371138 setInsertionMode(BeforeHeadMode);
11381139 return;

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
11411142 // Fall through.
11421143 case BeforeHeadMode:
11431144 ASSERT(insertionMode() == BeforeHeadMode);
1144  if (token.name() == htmlTag) {
 1145 if (token->name() == htmlTag) {
11451146 m_tree.insertHTMLHtmlStartTagInBody(token);
11461147 return;
11471148 }
1148  if (token.name() == headTag) {
 1149 if (token->name() == headTag) {
11491150 m_tree.insertHTMLHeadElement(token);
11501151 setInsertionMode(InHeadMode);
11511152 return;

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
11601161 // Fall through.
11611162 case AfterHeadMode:
11621163 ASSERT(insertionMode() == AfterHeadMode);
1163  if (token.name() == htmlTag) {
 1164 if (token->name() == htmlTag) {
11641165 m_tree.insertHTMLHtmlStartTagInBody(token);
11651166 return;
11661167 }
1167  if (token.name() == bodyTag) {
 1168 if (token->name() == bodyTag) {
11681169 m_framesetOk = false;
11691170 m_tree.insertHTMLBodyElement(token);
11701171 setInsertionMode(InBodyMode);
11711172 return;
11721173 }
1173  if (token.name() == framesetTag) {
 1174 if (token->name() == framesetTag) {
11741175 m_tree.insertHTMLElement(token);
11751176 setInsertionMode(InFramesetMode);
11761177 return;
11771178 }
1178  if (token.name() == baseTag
1179  || token.name() == basefontTag
1180  || token.name() == bgsoundTag
1181  || token.name() == linkTag
1182  || token.name() == metaTag
1183  || token.name() == noframesTag
1184  || token.name() == scriptTag
1185  || token.name() == styleTag
1186  || token.name() == titleTag) {
 1179 if (token->name() == baseTag
 1180 || token->name() == basefontTag
 1181 || token->name() == bgsoundTag
 1182 || token->name() == linkTag
 1183 || token->name() == metaTag
 1184 || token->name() == noframesTag
 1185 || token->name() == scriptTag
 1186 || token->name() == styleTag
 1187 || token->name() == titleTag) {
11871188 parseError(token);
11881189 ASSERT(m_tree.head());
1189  m_tree.openElements()->pushHTMLHeadElement(m_tree.head());
 1190 m_tree.openElements()->pushHTMLHeadElement(HTMLStackNode::create(m_tree.head(), token));
11901191 processStartTagForInHead(token);
11911192 m_tree.openElements()->removeHTMLHeadElement(m_tree.head());
11921193 return;
11931194 }
1194  if (token.name() == headTag) {
 1195 if (token->name() == headTag) {
11951196 parseError(token);
11961197 return;
11971198 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
12071208 break;
12081209 case InCaptionMode:
12091210 ASSERT(insertionMode() == InCaptionMode);
1210  if (isCaptionColOrColgroupTag(token.name())
1211  || isTableBodyContextTag(token.name())
1212  || isTableCellContextTag(token.name())
1213  || token.name() == trTag) {
 1211 if (isCaptionColOrColgroupTag(token->name())
 1212 || isTableBodyContextTag(token->name())
 1213 || isTableCellContextTag(token->name())
 1214 || token->name() == trTag) {
12141215 parseError(token);
12151216 if (!processCaptionEndTagForInCaption()) {
12161217 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
12231224 break;
12241225 case InColumnGroupMode:
12251226 ASSERT(insertionMode() == InColumnGroupMode);
1226  if (token.name() == htmlTag) {
 1227 if (token->name() == htmlTag) {
12271228 m_tree.insertHTMLHtmlStartTagInBody(token);
12281229 return;
12291230 }
1230  if (token.name() == colTag) {
 1231 if (token->name() == colTag) {
12311232 m_tree.insertSelfClosingHTMLElement(token);
12321233 return;
12331234 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
12391240 break;
12401241 case InTableBodyMode:
12411242 ASSERT(insertionMode() == InTableBodyMode);
1242  if (token.name() == trTag) {
 1243 if (token->name() == trTag) {
12431244 m_tree.openElements()->popUntilTableBodyScopeMarker(); // How is there ever anything to pop?
12441245 m_tree.insertHTMLElement(token);
12451246 setInsertionMode(InRowMode);
12461247 return;
12471248 }
1248  if (isTableCellContextTag(token.name())) {
 1249 if (isTableCellContextTag(token->name())) {
12491250 parseError(token);
12501251 processFakeStartTag(trTag);
12511252 ASSERT(insertionMode() == InRowMode);
12521253 processStartTag(token);
12531254 return;
12541255 }
1255  if (isCaptionColOrColgroupTag(token.name()) || isTableBodyContextTag(token.name())) {
 1256 if (isCaptionColOrColgroupTag(token->name()) || isTableBodyContextTag(token->name())) {
12561257 // FIXME: This is slow.
12571258 if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) {
12581259 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
12691270 break;
12701271 case InRowMode:
12711272 ASSERT(insertionMode() == InRowMode);
1272  if (isTableCellContextTag(token.name())) {
 1273 if (isTableCellContextTag(token->name())) {
12731274 m_tree.openElements()->popUntilTableRowScopeMarker();
12741275 m_tree.insertHTMLElement(token);
12751276 setInsertionMode(InCellMode);
12761277 m_tree.activeFormattingElements()->appendMarker();
12771278 return;
12781279 }
1279  if (token.name() == trTag
1280  || isCaptionColOrColgroupTag(token.name())
1281  || isTableBodyContextTag(token.name())) {
 1280 if (token->name() == trTag
 1281 || isCaptionColOrColgroupTag(token->name())
 1282 || isTableBodyContextTag(token->name())) {
12821283 if (!processTrEndTagForInRow()) {
12831284 ASSERT(isParsingFragment());
12841285 return;

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
12911292 break;
12921293 case InCellMode:
12931294 ASSERT(insertionMode() == InCellMode);
1294  if (isCaptionColOrColgroupTag(token.name())
1295  || isTableCellContextTag(token.name())
1296  || token.name() == trTag
1297  || isTableBodyContextTag(token.name())) {
 1295 if (isCaptionColOrColgroupTag(token->name())
 1296 || isTableCellContextTag(token->name())
 1297 || token->name() == trTag
 1298 || isTableBodyContextTag(token->name())) {
12981299 // FIXME: This could be more efficient.
12991300 if (!m_tree.openElements()->inTableScope(tdTag) && !m_tree.openElements()->inTableScope(thTag)) {
13001301 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
13101311 case AfterBodyMode:
13111312 case AfterAfterBodyMode:
13121313 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode);
1313  if (token.name() == htmlTag) {
 1314 if (token->name() == htmlTag) {
13141315 m_tree.insertHTMLHtmlStartTagInBody(token);
13151316 return;
13161317 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
13191320 break;
13201321 case InHeadNoscriptMode:
13211322 ASSERT(insertionMode() == InHeadNoscriptMode);
1322  if (token.name() == htmlTag) {
 1323 if (token->name() == htmlTag) {
13231324 m_tree.insertHTMLHtmlStartTagInBody(token);
13241325 return;
13251326 }
1326  if (token.name() == basefontTag
1327  || token.name() == bgsoundTag
1328  || token.name() == linkTag
1329  || token.name() == metaTag
1330  || token.name() == noframesTag
1331  || token.name() == styleTag) {
 1327 if (token->name() == basefontTag
 1328 || token->name() == bgsoundTag
 1329 || token->name() == linkTag
 1330 || token->name() == metaTag
 1331 || token->name() == noframesTag
 1332 || token->name() == styleTag) {
13321333 bool didProcess = processStartTagForInHead(token);
13331334 ASSERT_UNUSED(didProcess, didProcess);
13341335 return;
13351336 }
1336  if (token.name() == htmlTag || token.name() == noscriptTag) {
 1337 if (token->name() == htmlTag || token->name() == noscriptTag) {
13371338 parseError(token);
13381339 return;
13391340 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
13421343 break;
13431344 case InFramesetMode:
13441345 ASSERT(insertionMode() == InFramesetMode);
1345  if (token.name() == htmlTag) {
 1346 if (token->name() == htmlTag) {
13461347 m_tree.insertHTMLHtmlStartTagInBody(token);
13471348 return;
13481349 }
1349  if (token.name() == framesetTag) {
 1350 if (token->name() == framesetTag) {
13501351 m_tree.insertHTMLElement(token);
13511352 return;
13521353 }
1353  if (token.name() == frameTag) {
 1354 if (token->name() == frameTag) {
13541355 m_tree.insertSelfClosingHTMLElement(token);
13551356 return;
13561357 }
1357  if (token.name() == noframesTag) {
 1358 if (token->name() == noframesTag) {
13581359 processStartTagForInHead(token);
13591360 return;
13601361 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
13631364 case AfterFramesetMode:
13641365 case AfterAfterFramesetMode:
13651366 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode);
1366  if (token.name() == htmlTag) {
 1367 if (token->name() == htmlTag) {
13671368 m_tree.insertHTMLHtmlStartTagInBody(token);
13681369 return;
13691370 }
1370  if (token.name() == noframesTag) {
 1371 if (token->name() == noframesTag) {
13711372 processStartTagForInHead(token);
13721373 return;
13731374 }

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
13751376 break;
13761377 case InSelectInTableMode:
13771378 ASSERT(insertionMode() == InSelectInTableMode);
1378  if (token.name() == captionTag
1379  || token.name() == tableTag
1380  || isTableBodyContextTag(token.name())
1381  || token.name() == trTag
1382  || isTableCellContextTag(token.name())) {
 1379 if (token->name() == captionTag
 1380 || token->name() == tableTag
 1381 || isTableBodyContextTag(token->name())
 1382 || token->name() == trTag
 1383 || isTableCellContextTag(token->name())) {
13831384 parseError(token);
1384  AtomicHTMLToken endSelect(HTMLTokenTypes::EndTag, selectTag.localName());
1385  processEndTag(endSelect);
 1385 RefPtr<AtomicHTMLToken> endSelect = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, selectTag.localName());
 1386 processEndTag(endSelect.get());
13861387 processStartTag(token);
13871388 return;
13881389 }
13891390 // Fall through
13901391 case InSelectMode:
13911392 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode);
1392  if (token.name() == htmlTag) {
 1393 if (token->name() == htmlTag) {
13931394 m_tree.insertHTMLHtmlStartTagInBody(token);
13941395 return;
13951396 }
1396  if (token.name() == optionTag) {
 1397 if (token->name() == optionTag) {
13971398 if (m_tree.currentNode()->hasTagName(optionTag)) {
1398  AtomicHTMLToken endOption(HTMLTokenTypes::EndTag, optionTag.localName());
1399  processEndTag(endOption);
 1399 RefPtr<AtomicHTMLToken> endOption = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, optionTag.localName());
 1400 processEndTag(endOption.get());
14001401 }
14011402 m_tree.insertHTMLElement(token);
14021403 return;
14031404 }
1404  if (token.name() == optgroupTag) {
 1405 if (token->name() == optgroupTag) {
14051406 if (m_tree.currentNode()->hasTagName(optionTag)) {
1406  AtomicHTMLToken endOption(HTMLTokenTypes::EndTag, optionTag.localName());
1407  processEndTag(endOption);
 1407 RefPtr<AtomicHTMLToken> endOption = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, optionTag.localName());
 1408 processEndTag(endOption.get());
14081409 }
14091410 if (m_tree.currentNode()->hasTagName(optgroupTag)) {
1410  AtomicHTMLToken endOptgroup(HTMLTokenTypes::EndTag, optgroupTag.localName());
1411  processEndTag(endOptgroup);
 1411 RefPtr<AtomicHTMLToken> endOptgroup = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, optgroupTag.localName());
 1412 processEndTag(endOptgroup.get());
14121413 }
14131414 m_tree.insertHTMLElement(token);
14141415 return;
14151416 }
1416  if (token.name() == selectTag) {
 1417 if (token->name() == selectTag) {
14171418 parseError(token);
1418  AtomicHTMLToken endSelect(HTMLTokenTypes::EndTag, selectTag.localName());
1419  processEndTag(endSelect);
 1419 RefPtr<AtomicHTMLToken> endSelect = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, selectTag.localName());
 1420 processEndTag(endSelect.get());
14201421 return;
14211422 }
1422  if (token.name() == inputTag
1423  || token.name() == keygenTag
1424  || token.name() == textareaTag) {
 1423 if (token->name() == inputTag
 1424 || token->name() == keygenTag
 1425 || token->name() == textareaTag) {
14251426 parseError(token);
14261427 if (!m_tree.openElements()->inSelectScope(selectTag)) {
14271428 ASSERT(isParsingFragment());
14281429 return;
14291430 }
1430  AtomicHTMLToken endSelect(HTMLTokenTypes::EndTag, selectTag.localName());
1431  processEndTag(endSelect);
 1431 RefPtr<AtomicHTMLToken> endSelect = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, selectTag.localName());
 1432 processEndTag(endSelect.get());
14321433 processStartTag(token);
14331434 return;
14341435 }
1435  if (token.name() == scriptTag) {
 1436 if (token->name() == scriptTag) {
14361437 bool didProcess = processStartTagForInHead(token);
14371438 ASSERT_UNUSED(didProcess, didProcess);
14381439 return;

@@void HTMLTreeBuilder::processStartTag(AtomicHTMLToken& token)
14481449 }
14491450}
14501451
1451 bool HTMLTreeBuilder::processBodyEndTagForInBody(AtomicHTMLToken& token)
 1452bool HTMLTreeBuilder::processBodyEndTagForInBody(AtomicHTMLToken* token)
14521453{
1453  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1454  ASSERT(token.name() == bodyTag);
 1454 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1455 ASSERT(token->name() == bodyTag);
14551456 if (!m_tree.openElements()->inScope(bodyTag.localName())) {
14561457 parseError(token);
14571458 return false;

@@bool HTMLTreeBuilder::processBodyEndTagForInBody(AtomicHTMLToken& token)
14611462 return true;
14621463}
14631464
1464 void HTMLTreeBuilder::processAnyOtherEndTagForInBody(AtomicHTMLToken& token)
 1465void HTMLTreeBuilder::processAnyOtherEndTagForInBody(AtomicHTMLToken* token)
14651466{
1466  ASSERT(token.type() == HTMLTokenTypes::EndTag);
 1467 ASSERT(token->type() == HTMLTokenTypes::EndTag);
14671468 HTMLElementStack::ElementRecord* record = m_tree.openElements()->topRecord();
14681469 while (1) {
14691470 RefPtr<ContainerNode> node = record->node();
1470  if (node->hasLocalName(token.name())) {
1471  m_tree.generateImpliedEndTagsWithExclusion(token.name());
1472  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1471 if (node->hasLocalName(token->name())) {
 1472 m_tree.generateImpliedEndTagsWithExclusion(token->name());
 1473 if (!m_tree.currentNode()->hasLocalName(token->name()))
14731474 parseError(token);
14741475 m_tree.openElements()->popUntilPopped(toElement(node.get()));
14751476 return;

@@HTMLElementStack::ElementRecord* HTMLTreeBuilder::furthestBlockForFormattingElem
14981499}
14991500
15001501// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#parsing-main-inbody
1501 void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token)
 1502void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken* token)
15021503{
15031504 // The adoption agency algorithm is N^2. We limit the number of iterations
15041505 // to stop from hanging the whole browser. This limit is specified in the

@@void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token)
15091510
15101511 for (int i = 0; i < outerIterationLimit; ++i) {
15111512 // 1.
1512  Element* formattingElement = m_tree.activeFormattingElements()->closestElementInScopeWithName(token.name());
 1513 Element* formattingElement = m_tree.activeFormattingElements()->closestElementInScopeWithName(token->name());
15131514 if (!formattingElement || ((m_tree.openElements()->contains(formattingElement)) && !m_tree.openElements()->inScope(formattingElement))) {
15141515 parseError(token);
15151516 notImplemented(); // Check the stack of open elements for a more specific parse error.

@@void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token)
15551556 if (node == formattingElementRecord)
15561557 break;
15571558 // 6.5
1558  RefPtr<Element> newElement = m_tree.createHTMLElementFromElementRecord(node);
 1559 RefPtr<HTMLStackNode> newElement = m_tree.createElementFromSavedToken(node->stackNode());
 1560
15591561 HTMLFormattingElementList::Entry* nodeEntry = m_tree.activeFormattingElements()->find(node->element());
1560  nodeEntry->replaceElement(newElement.get());
 1562 nodeEntry->replaceElement(newElement);
15611563 node->replaceElement(newElement.release());
15621564 // 6.4 -- Intentionally out of order to handle the case where node
15631565 // was replaced in 6.5.

@@void HTMLTreeBuilder::callTheAdoptionAgency(AtomicHTMLToken& token)
15911593 lastNode->element()->lazyAttach();
15921594 }
15931595 // 8
1594  RefPtr<Element> newElement = m_tree.createHTMLElementFromElementRecord(formattingElementRecord);
 1596 RefPtr<HTMLStackNode> newElement = m_tree.createElementFromSavedToken(formattingElementRecord->stackNode());
15951597 // 9
1596  newElement->takeAllChildrenFrom(furthestBlock->element());
 1598 newElement->element()->takeAllChildrenFrom(furthestBlock->element());
15971599 // 10
15981600 Element* furthestBlockElement = furthestBlock->element();
15991601 // FIXME: All this creation / parserAddChild / attach business should
16001602 // be in HTMLConstructionSite. My guess is that steps 8--12
16011603 // should all be in some HTMLConstructionSite function.
1602  furthestBlockElement->parserAddChild(newElement);
1603  if (furthestBlockElement->attached() && !newElement->attached()) {
 1604 furthestBlockElement->parserAddChild(newElement->element());
 1605 if (furthestBlockElement->attached() && !newElement->element()->attached()) {
16041606 // Notice that newElement might already be attached if, for example, one of the reparented
16051607 // children is a style element, which attaches itself automatically.
1606  newElement->attach();
 1608 newElement->element()->attach();
16071609 }
16081610 // 11
1609  m_tree.activeFormattingElements()->swapTo(formattingElement, newElement.get(), bookmark);
 1611 m_tree.activeFormattingElements()->swapTo(formattingElement, newElement, bookmark);
16101612 // 12
16111613 m_tree.openElements()->remove(formattingElement);
16121614 m_tree.openElements()->insertAbove(newElement, furthestBlock);

@@void HTMLTreeBuilder::resetInsertionModeAppropriately()
16651667 }
16661668}
16671669
1668 void HTMLTreeBuilder::processEndTagForInTableBody(AtomicHTMLToken& token)
 1670void HTMLTreeBuilder::processEndTagForInTableBody(AtomicHTMLToken* token)
16691671{
1670  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1671  if (isTableBodyContextTag(token.name())) {
1672  if (!m_tree.openElements()->inTableScope(token.name())) {
 1672 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1673 if (isTableBodyContextTag(token->name())) {
 1674 if (!m_tree.openElements()->inTableScope(token->name())) {
16731675 parseError(token);
16741676 return;
16751677 }

@@void HTMLTreeBuilder::processEndTagForInTableBody(AtomicHTMLToken& token)
16781680 setInsertionMode(InTableMode);
16791681 return;
16801682 }
1681  if (token.name() == tableTag) {
 1683 if (token->name() == tableTag) {
16821684 // FIXME: This is slow.
16831685 if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) {
16841686 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processEndTagForInTableBody(AtomicHTMLToken& token)
16911693 processEndTag(token);
16921694 return;
16931695 }
1694  if (token.name() == bodyTag
1695  || isCaptionColOrColgroupTag(token.name())
1696  || token.name() == htmlTag
1697  || isTableCellContextTag(token.name())
1698  || token.name() == trTag) {
 1696 if (token->name() == bodyTag
 1697 || isCaptionColOrColgroupTag(token->name())
 1698 || token->name() == htmlTag
 1699 || isTableCellContextTag(token->name())
 1700 || token->name() == trTag) {
16991701 parseError(token);
17001702 return;
17011703 }
17021704 processEndTagForInTable(token);
17031705}
17041706
1705 void HTMLTreeBuilder::processEndTagForInRow(AtomicHTMLToken& token)
 1707void HTMLTreeBuilder::processEndTagForInRow(AtomicHTMLToken* token)
17061708{
1707  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1708  if (token.name() == trTag) {
 1709 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1710 if (token->name() == trTag) {
17091711 processTrEndTagForInRow();
17101712 return;
17111713 }
1712  if (token.name() == tableTag) {
 1714 if (token->name() == tableTag) {
17131715 if (!processTrEndTagForInRow()) {
17141716 ASSERT(isParsingFragment());
17151717 return;

@@void HTMLTreeBuilder::processEndTagForInRow(AtomicHTMLToken& token)
17181720 processEndTag(token);
17191721 return;
17201722 }
1721  if (isTableBodyContextTag(token.name())) {
1722  if (!m_tree.openElements()->inTableScope(token.name())) {
 1723 if (isTableBodyContextTag(token->name())) {
 1724 if (!m_tree.openElements()->inTableScope(token->name())) {
17231725 parseError(token);
17241726 return;
17251727 }

@@void HTMLTreeBuilder::processEndTagForInRow(AtomicHTMLToken& token)
17281730 processEndTag(token);
17291731 return;
17301732 }
1731  if (token.name() == bodyTag
1732  || isCaptionColOrColgroupTag(token.name())
1733  || token.name() == htmlTag
1734  || isTableCellContextTag(token.name())) {
 1733 if (token->name() == bodyTag
 1734 || isCaptionColOrColgroupTag(token->name())
 1735 || token->name() == htmlTag
 1736 || isTableCellContextTag(token->name())) {
17351737 parseError(token);
17361738 return;
17371739 }
17381740 processEndTagForInTable(token);
17391741}
17401742
1741 void HTMLTreeBuilder::processEndTagForInCell(AtomicHTMLToken& token)
 1743void HTMLTreeBuilder::processEndTagForInCell(AtomicHTMLToken* token)
17421744{
1743  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1744  if (isTableCellContextTag(token.name())) {
1745  if (!m_tree.openElements()->inTableScope(token.name())) {
 1745 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1746 if (isTableCellContextTag(token->name())) {
 1747 if (!m_tree.openElements()->inTableScope(token->name())) {
17461748 parseError(token);
17471749 return;
17481750 }
17491751 m_tree.generateImpliedEndTags();
1750  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1752 if (!m_tree.currentNode()->hasLocalName(token->name()))
17511753 parseError(token);
1752  m_tree.openElements()->popUntilPopped(token.name());
 1754 m_tree.openElements()->popUntilPopped(token->name());
17531755 m_tree.activeFormattingElements()->clearToLastMarker();
17541756 setInsertionMode(InRowMode);
17551757 return;
17561758 }
1757  if (token.name() == bodyTag
1758  || isCaptionColOrColgroupTag(token.name())
1759  || token.name() == htmlTag) {
 1759 if (token->name() == bodyTag
 1760 || isCaptionColOrColgroupTag(token->name())
 1761 || token->name() == htmlTag) {
17601762 parseError(token);
17611763 return;
17621764 }
1763  if (token.name() == tableTag
1764  || token.name() == trTag
1765  || isTableBodyContextTag(token.name())) {
1766  if (!m_tree.openElements()->inTableScope(token.name())) {
1767  ASSERT(isTableBodyContextTag(token.name()) || isParsingFragment());
 1765 if (token->name() == tableTag
 1766 || token->name() == trTag
 1767 || isTableBodyContextTag(token->name())) {
 1768 if (!m_tree.openElements()->inTableScope(token->name())) {
 1769 ASSERT(isTableBodyContextTag(token->name()) || isParsingFragment());
17681770 parseError(token);
17691771 return;
17701772 }

@@void HTMLTreeBuilder::processEndTagForInCell(AtomicHTMLToken& token)
17751777 processEndTagForInBody(token);
17761778}
17771779
1778 void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token)
 1780void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken* token)
17791781{
1780  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1781  if (token.name() == bodyTag) {
 1782 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1783 if (token->name() == bodyTag) {
17821784 processBodyEndTagForInBody(token);
17831785 return;
17841786 }
1785  if (token.name() == htmlTag) {
1786  AtomicHTMLToken endBody(HTMLTokenTypes::EndTag, bodyTag.localName());
1787  if (processBodyEndTagForInBody(endBody))
 1787 if (token->name() == htmlTag) {
 1788 RefPtr<AtomicHTMLToken> endBody = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, bodyTag.localName());
 1789 if (processBodyEndTagForInBody(endBody.get()))
17881790 processEndTag(token);
17891791 return;
17901792 }
1791  if (token.name() == addressTag
1792  || token.name() == articleTag
1793  || token.name() == asideTag
1794  || token.name() == blockquoteTag
1795  || token.name() == buttonTag
1796  || token.name() == centerTag
1797  || token.name() == detailsTag
1798  || token.name() == dirTag
1799  || token.name() == divTag
1800  || token.name() == dlTag
1801  || token.name() == fieldsetTag
1802  || token.name() == figcaptionTag
1803  || token.name() == figureTag
1804  || token.name() == footerTag
1805  || token.name() == headerTag
1806  || token.name() == hgroupTag
1807  || token.name() == listingTag
1808  || token.name() == menuTag
1809  || token.name() == navTag
1810  || token.name() == olTag
1811  || token.name() == preTag
1812  || token.name() == sectionTag
1813  || token.name() == summaryTag
1814  || token.name() == ulTag) {
1815  if (!m_tree.openElements()->inScope(token.name())) {
 1793 if (token->name() == addressTag
 1794 || token->name() == articleTag
 1795 || token->name() == asideTag
 1796 || token->name() == blockquoteTag
 1797 || token->name() == buttonTag
 1798 || token->name() == centerTag
 1799 || token->name() == detailsTag
 1800 || token->name() == dirTag
 1801 || token->name() == divTag
 1802 || token->name() == dlTag
 1803 || token->name() == fieldsetTag
 1804 || token->name() == figcaptionTag
 1805 || token->name() == figureTag
 1806 || token->name() == footerTag
 1807 || token->name() == headerTag
 1808 || token->name() == hgroupTag
 1809 || token->name() == listingTag
 1810 || token->name() == menuTag
 1811 || token->name() == navTag
 1812 || token->name() == olTag
 1813 || token->name() == preTag
 1814 || token->name() == sectionTag
 1815 || token->name() == summaryTag
 1816 || token->name() == ulTag) {
 1817 if (!m_tree.openElements()->inScope(token->name())) {
18161818 parseError(token);
18171819 return;
18181820 }
18191821 m_tree.generateImpliedEndTags();
1820  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1822 if (!m_tree.currentNode()->hasLocalName(token->name()))
18211823 parseError(token);
1822  m_tree.openElements()->popUntilPopped(token.name());
 1824 m_tree.openElements()->popUntilPopped(token->name());
18231825 return;
18241826 }
1825  if (token.name() == formTag) {
 1827 if (token->name() == formTag) {
18261828 RefPtr<Element> node = m_tree.takeForm();
18271829 if (!node || !m_tree.openElements()->inScope(node.get())) {
18281830 parseError(token);

@@void HTMLTreeBuilder::processEndTagForInBody(AtomicHTMLToken& token)
18331835 parseError(token);
18341836 m_tree.openElements()->remove(node.get());
18351837 }
1836  if (token.name() == pTag) {
1837  if (!m_tree.openElements()->inButtonScope(token.name())) {
 1838 if (token->name() == pTag) {
 1839 if (!m_tree.openElements()->inButtonScope(token->name())) {
18381840 parseError(token);
18391841 processFakeStartTag(pTag);
1840  ASSERT(m_tree.openElements()->inScope(token.name()));
 1842 ASSERT(m_tree.openElements()->inScope(token->name()));
18411843 processEndTag(token);
18421844 return;
18431845 }
1844  m_tree.generateImpliedEndTagsWithExclusion(token.name());
1845  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1846 m_tree.generateImpliedEndTagsWithExclusion(token->name());
 1847 if (!m_tree.currentNode()->hasLocalName(token->name()))
18461848 parseError(token);
1847  m_tree.openElements()->popUntilPopped(token.name());
 1849 m_tree.openElements()->popUntilPopped(token->name());
18481850 return;
18491851 }
1850  if (token.name() == liTag) {
1851  if (!m_tree.openElements()->inListItemScope(token.name())) {
 1852 if (token->name() == liTag) {
 1853 if (!m_tree.openElements()->inListItemScope(token->name())) {
18521854 parseError(token);
18531855 return;
18541856 }
1855  m_tree.generateImpliedEndTagsWithExclusion(token.name());
1856  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1857 m_tree.generateImpliedEndTagsWithExclusion(token->name());
 1858 if (!m_tree.currentNode()->hasLocalName(token->name()))
18571859 parseError(token);
1858  m_tree.openElements()->popUntilPopped(token.name());
 1860 m_tree.openElements()->popUntilPopped(token->name());
18591861 return;
18601862 }
1861  if (token.name() == ddTag
1862  || token.name() == dtTag) {
1863  if (!m_tree.openElements()->inScope(token.name())) {
 1863 if (token->name() == ddTag
 1864 || token->name() == dtTag) {
 1865 if (!m_tree.openElements()->inScope(token->name())) {
18641866 parseError(token);
18651867 return;
18661868 }
1867  m_tree.generateImpliedEndTagsWithExclusion(token.name());
1868  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1869 m_tree.generateImpliedEndTagsWithExclusion(token->name());
 1870 if (!m_tree.currentNode()->hasLocalName(token->name()))
18691871 parseError(token);
1870  m_tree.openElements()->popUntilPopped(token.name());
 1872 m_tree.openElements()->popUntilPopped(token->name());
18711873 return;
18721874 }
1873  if (isNumberedHeaderTag(token.name())) {
 1875 if (isNumberedHeaderTag(token->name())) {
18741876 if (!m_tree.openElements()->hasNumberedHeaderElementInScope()) {
18751877 parseError(token);
18761878 return;
18771879 }
18781880 m_tree.generateImpliedEndTags();
1879  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1881 if (!m_tree.currentNode()->hasLocalName(token->name()))
18801882 parseError(token);
18811883 m_tree.openElements()->popUntilNumberedHeaderElementPopped();
18821884 return;
18831885 }
1884  if (isFormattingTag(token.name())) {
 1886 if (isFormattingTag(token->name())) {
18851887 callTheAdoptionAgency(token);
18861888 return;
18871889 }
1888  if (token.name() == appletTag
1889  || token.name() == marqueeTag
1890  || token.name() == objectTag) {
1891  if (!m_tree.openElements()->inScope(token.name())) {
 1890 if (token->name() == appletTag
 1891 || token->name() == marqueeTag
 1892 || token->name() == objectTag) {
 1893 if (!m_tree.openElements()->inScope(token->name())) {
18921894 parseError(token);
18931895 return;
18941896 }
18951897 m_tree.generateImpliedEndTags();
1896  if (!m_tree.currentNode()->hasLocalName(token.name()))
 1898 if (!m_tree.currentNode()->hasLocalName(token->name()))
18971899 parseError(token);
1898  m_tree.openElements()->popUntilPopped(token.name());
 1900 m_tree.openElements()->popUntilPopped(token->name());
18991901 m_tree.activeFormattingElements()->clearToLastMarker();
19001902 return;
19011903 }
1902  if (token.name() == brTag) {
 1904 if (token->name() == brTag) {
19031905 parseError(token);
19041906 processFakeStartTag(brTag);
19051907 return;

@@bool HTMLTreeBuilder::processTableEndTagForInTable()
19481950 return true;
19491951}
19501952
1951 void HTMLTreeBuilder::processEndTagForInTable(AtomicHTMLToken& token)
 1953void HTMLTreeBuilder::processEndTagForInTable(AtomicHTMLToken* token)
19521954{
1953  ASSERT(token.type() == HTMLTokenTypes::EndTag);
1954  if (token.name() == tableTag) {
 1955 ASSERT(token->type() == HTMLTokenTypes::EndTag);
 1956 if (token->name() == tableTag) {
19551957 processTableEndTagForInTable();
19561958 return;
19571959 }
1958  if (token.name() == bodyTag
1959  || isCaptionColOrColgroupTag(token.name())
1960  || token.name() == htmlTag
1961  || isTableBodyContextTag(token.name())
1962  || isTableCellContextTag(token.name())
1963  || token.name() == trTag) {
 1960 if (token->name() == bodyTag
 1961 || isCaptionColOrColgroupTag(token->name())
 1962 || token->name() == htmlTag
 1963 || isTableBodyContextTag(token->name())
 1964 || isTableCellContextTag(token->name())
 1965 || token->name() == trTag) {
19641966 parseError(token);
19651967 return;
19661968 }

@@void HTMLTreeBuilder::processEndTagForInTable(AtomicHTMLToken& token)
19691971 processEndTagForInBody(token);
19701972}
19711973
1972 void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
 1974void HTMLTreeBuilder::processEndTag(AtomicHTMLToken* token)
19731975{
1974  ASSERT(token.type() == HTMLTokenTypes::EndTag);
 1976 ASSERT(token->type() == HTMLTokenTypes::EndTag);
19751977 switch (insertionMode()) {
19761978 case InitialMode:
19771979 ASSERT(insertionMode() == InitialMode);

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
19791981 // Fall through.
19801982 case BeforeHTMLMode:
19811983 ASSERT(insertionMode() == BeforeHTMLMode);
1982  if (token.name() != headTag && token.name() != bodyTag && token.name() != htmlTag && token.name() != brTag) {
 1984 if (token->name() != headTag && token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) {
19831985 parseError(token);
19841986 return;
19851987 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
19871989 // Fall through.
19881990 case BeforeHeadMode:
19891991 ASSERT(insertionMode() == BeforeHeadMode);
1990  if (token.name() != headTag && token.name() != bodyTag && token.name() != htmlTag && token.name() != brTag) {
 1992 if (token->name() != headTag && token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) {
19911993 parseError(token);
19921994 return;
19931995 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
19951997 // Fall through.
19961998 case InHeadMode:
19971999 ASSERT(insertionMode() == InHeadMode);
1998  if (token.name() == headTag) {
 2000 if (token->name() == headTag) {
19992001 m_tree.openElements()->popHTMLHeadElement();
20002002 setInsertionMode(AfterHeadMode);
20012003 return;
20022004 }
2003  if (token.name() != bodyTag && token.name() != htmlTag && token.name() != brTag) {
 2005 if (token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) {
20042006 parseError(token);
20052007 return;
20062008 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20082010 // Fall through.
20092011 case AfterHeadMode:
20102012 ASSERT(insertionMode() == AfterHeadMode);
2011  if (token.name() != bodyTag && token.name() != htmlTag && token.name() != brTag) {
 2013 if (token->name() != bodyTag && token->name() != htmlTag && token->name() != brTag) {
20122014 parseError(token);
20132015 return;
20142016 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20242026 break;
20252027 case InCaptionMode:
20262028 ASSERT(insertionMode() == InCaptionMode);
2027  if (token.name() == captionTag) {
 2029 if (token->name() == captionTag) {
20282030 processCaptionEndTagForInCaption();
20292031 return;
20302032 }
2031  if (token.name() == tableTag) {
 2033 if (token->name() == tableTag) {
20322034 parseError(token);
20332035 if (!processCaptionEndTagForInCaption()) {
20342036 ASSERT(isParsingFragment());

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20372039 processEndTag(token);
20382040 return;
20392041 }
2040  if (token.name() == bodyTag
2041  || token.name() == colTag
2042  || token.name() == colgroupTag
2043  || token.name() == htmlTag
2044  || isTableBodyContextTag(token.name())
2045  || isTableCellContextTag(token.name())
2046  || token.name() == trTag) {
 2042 if (token->name() == bodyTag
 2043 || token->name() == colTag
 2044 || token->name() == colgroupTag
 2045 || token->name() == htmlTag
 2046 || isTableBodyContextTag(token->name())
 2047 || isTableCellContextTag(token->name())
 2048 || token->name() == trTag) {
20472049 parseError(token);
20482050 return;
20492051 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20512053 break;
20522054 case InColumnGroupMode:
20532055 ASSERT(insertionMode() == InColumnGroupMode);
2054  if (token.name() == colgroupTag) {
 2056 if (token->name() == colgroupTag) {
20552057 processColgroupEndTagForInColumnGroup();
20562058 return;
20572059 }
2058  if (token.name() == colTag) {
 2060 if (token->name() == colTag) {
20592061 parseError(token);
20602062 return;
20612063 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20792081 break;
20802082 case AfterBodyMode:
20812083 ASSERT(insertionMode() == AfterBodyMode);
2082  if (token.name() == htmlTag) {
 2084 if (token->name() == htmlTag) {
20832085 if (isParsingFragment()) {
20842086 parseError(token);
20852087 return;

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
20962098 break;
20972099 case InHeadNoscriptMode:
20982100 ASSERT(insertionMode() == InHeadNoscriptMode);
2099  if (token.name() == noscriptTag) {
 2101 if (token->name() == noscriptTag) {
21002102 ASSERT(m_tree.currentElement()->hasTagName(noscriptTag));
21012103 m_tree.openElements()->pop();
21022104 ASSERT(m_tree.currentElement()->hasTagName(headTag));
21032105 setInsertionMode(InHeadMode);
21042106 return;
21052107 }
2106  if (token.name() != brTag) {
 2108 if (token->name() != brTag) {
21072109 parseError(token);
21082110 return;
21092111 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21112113 processToken(token);
21122114 break;
21132115 case TextMode:
2114  if (token.name() == scriptTag) {
 2116 if (token->name() == scriptTag) {
21152117 // Pause ourselves so that parsing stops until the script can be processed by the caller.
21162118 ASSERT(m_tree.currentElement()->hasTagName(scriptTag));
21172119 m_scriptToProcess = m_tree.currentElement();

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21332135 break;
21342136 case InFramesetMode:
21352137 ASSERT(insertionMode() == InFramesetMode);
2136  if (token.name() == framesetTag) {
 2138 if (token->name() == framesetTag) {
21372139 if (m_tree.currentNode() == m_tree.openElements()->rootNode()) {
21382140 parseError(token);
21392141 return;

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21462148 break;
21472149 case AfterFramesetMode:
21482150 ASSERT(insertionMode() == AfterFramesetMode);
2149  if (token.name() == htmlTag) {
 2151 if (token->name() == htmlTag) {
21502152 setInsertionMode(AfterAfterFramesetMode);
21512153 return;
21522154 }

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21572159 break;
21582160 case InSelectInTableMode:
21592161 ASSERT(insertionMode() == InSelectInTableMode);
2160  if (token.name() == captionTag
2161  || token.name() == tableTag
2162  || isTableBodyContextTag(token.name())
2163  || token.name() == trTag
2164  || isTableCellContextTag(token.name())) {
 2162 if (token->name() == captionTag
 2163 || token->name() == tableTag
 2164 || isTableBodyContextTag(token->name())
 2165 || token->name() == trTag
 2166 || isTableCellContextTag(token->name())) {
21652167 parseError(token);
2166  if (m_tree.openElements()->inTableScope(token.name())) {
2167  AtomicHTMLToken endSelect(HTMLTokenTypes::EndTag, selectTag.localName());
2168  processEndTag(endSelect);
 2168 if (m_tree.openElements()->inTableScope(token->name())) {
 2169 RefPtr<AtomicHTMLToken> endSelect = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, selectTag.localName());
 2170 processEndTag(endSelect.get());
21692171 processEndTag(token);
21702172 }
21712173 return;

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21732175 // Fall through.
21742176 case InSelectMode:
21752177 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode);
2176  if (token.name() == optgroupTag) {
 2178 if (token->name() == optgroupTag) {
21772179 if (m_tree.currentNode()->hasTagName(optionTag) && m_tree.oneBelowTop() && m_tree.oneBelowTop()->hasTagName(optgroupTag))
21782180 processFakeEndTag(optionTag);
21792181 if (m_tree.currentNode()->hasTagName(optgroupTag)) {

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21832185 parseError(token);
21842186 return;
21852187 }
2186  if (token.name() == optionTag) {
 2188 if (token->name() == optionTag) {
21872189 if (m_tree.currentNode()->hasTagName(optionTag)) {
21882190 m_tree.openElements()->pop();
21892191 return;

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
21912193 parseError(token);
21922194 return;
21932195 }
2194  if (token.name() == selectTag) {
2195  if (!m_tree.openElements()->inSelectScope(token.name())) {
 2196 if (token->name() == selectTag) {
 2197 if (!m_tree.openElements()->inSelectScope(token->name())) {
21962198 ASSERT(isParsingFragment());
21972199 parseError(token);
21982200 return;

@@void HTMLTreeBuilder::processEndTag(AtomicHTMLToken& token)
22092211 }
22102212}
22112213
2212 void HTMLTreeBuilder::processComment(AtomicHTMLToken& token)
 2214void HTMLTreeBuilder::processComment(AtomicHTMLToken* token)
22132215{
2214  ASSERT(token.type() == HTMLTokenTypes::Comment);
 2216 ASSERT(token->type() == HTMLTokenTypes::Comment);
22152217 if (m_insertionMode == InitialMode
22162218 || m_insertionMode == BeforeHTMLMode
22172219 || m_insertionMode == AfterAfterBodyMode

@@void HTMLTreeBuilder::processComment(AtomicHTMLToken& token)
22312233 m_tree.insertComment(token);
22322234}
22332235
2234 void HTMLTreeBuilder::processCharacter(AtomicHTMLToken& token)
 2236void HTMLTreeBuilder::processCharacter(AtomicHTMLToken* token)
22352237{
2236  ASSERT(token.type() == HTMLTokenTypes::Character);
 2238 ASSERT(token->type() == HTMLTokenTypes::Character);
22372239 ExternalCharacterTokenBuffer buffer(token);
22382240 processCharacterBuffer(buffer);
22392241}

@@void HTMLTreeBuilder::processCharacterBufferForInBody(ExternalCharacterTokenBuff
24142416 m_framesetOk = false;
24152417}
24162418
2417 void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken& token)
 2419void HTMLTreeBuilder::processEndOfFile(AtomicHTMLToken* token)
24182420{
2419  ASSERT(token.type() == HTMLTokenTypes::EndOfFile);
 2421 ASSERT(token->type() == HTMLTokenTypes::EndOfFile);
24202422 switch (insertionMode()) {
24212423 case InitialMode:
24222424 ASSERT(insertionMode() == InitialMode);

@@void HTMLTreeBuilder::defaultForInitial()
25072509
25082510void HTMLTreeBuilder::defaultForBeforeHTML()
25092511{
2510  AtomicHTMLToken startHTML(HTMLTokenTypes::StartTag, htmlTag.localName());
2511  m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML);
 2512 RefPtr<AtomicHTMLToken> startHTML = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, htmlTag.localName());
 2513 m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML.get());
25122514 setInsertionMode(BeforeHeadMode);
25132515}
25142516
25152517void HTMLTreeBuilder::defaultForBeforeHead()
25162518{
2517  AtomicHTMLToken startHead(HTMLTokenTypes::StartTag, headTag.localName());
2518  processStartTag(startHead);
 2519 RefPtr<AtomicHTMLToken> startHead = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, headTag.localName());
 2520 processStartTag(startHead.get());
25192521}
25202522
25212523void HTMLTreeBuilder::defaultForInHead()
25222524{
2523  AtomicHTMLToken endHead(HTMLTokenTypes::EndTag, headTag.localName());
2524  processEndTag(endHead);
 2525 RefPtr<AtomicHTMLToken> endHead = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, headTag.localName());
 2526 processEndTag(endHead.get());
25252527}
25262528
25272529void HTMLTreeBuilder::defaultForInHeadNoscript()
25282530{
2529  AtomicHTMLToken endNoscript(HTMLTokenTypes::EndTag, noscriptTag.localName());
2530  processEndTag(endNoscript);
 2531 RefPtr<AtomicHTMLToken> endNoscript = AtomicHTMLToken::create(HTMLTokenTypes::EndTag, noscriptTag.localName());
 2532 processEndTag(endNoscript.get());
25312533}
25322534
25332535void HTMLTreeBuilder::defaultForAfterHead()
25342536{
2535  AtomicHTMLToken startBody(HTMLTokenTypes::StartTag, bodyTag.localName());
2536  processStartTag(startBody);
 2537 RefPtr<AtomicHTMLToken> startBody = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, bodyTag.localName());
 2538 processStartTag(startBody.get());
25372539 m_framesetOk = true;
25382540}
25392541

@@void HTMLTreeBuilder::defaultForInTableText()
25542556 setInsertionMode(m_originalInsertionMode);
25552557}
25562558
2557 bool HTMLTreeBuilder::processStartTagForInHead(AtomicHTMLToken& token)
 2559bool HTMLTreeBuilder::processStartTagForInHead(AtomicHTMLToken* token)
25582560{
2559  ASSERT(token.type() == HTMLTokenTypes::StartTag);
2560  if (token.name() == htmlTag) {
 2561 ASSERT(token->type() == HTMLTokenTypes::StartTag);
 2562 if (token->name() == htmlTag) {
25612563 m_tree.insertHTMLHtmlStartTagInBody(token);
25622564 return true;
25632565 }
2564  if (token.name() == baseTag
2565  || token.name() == basefontTag
2566  || token.name() == bgsoundTag
2567  || token.name() == commandTag
2568  || token.name() == linkTag
2569  || token.name() == metaTag) {
 2566 if (token->name() == baseTag
 2567 || token->name() == basefontTag
 2568 || token->name() == bgsoundTag
 2569 || token->name() == commandTag
 2570 || token->name() == linkTag
 2571 || token->name() == metaTag) {
25702572 m_tree.insertSelfClosingHTMLElement(token);
25712573 // Note: The custom processing for the <meta> tag is done in HTMLMetaElement::process().
25722574 return true;
25732575 }
2574  if (token.name() == titleTag) {
 2576 if (token->name() == titleTag) {
25752577 processGenericRCDATAStartTag(token);
25762578 return true;
25772579 }
2578  if (token.name() == noscriptTag) {
 2580 if (token->name() == noscriptTag) {
25792581 if (scriptEnabled(m_document->frame())) {
25802582 processGenericRawTextStartTag(token);
25812583 return true;

@@bool HTMLTreeBuilder::processStartTagForInHead(AtomicHTMLToken& token)
25842586 setInsertionMode(InHeadNoscriptMode);
25852587 return true;
25862588 }
2587  if (token.name() == noframesTag || token.name() == styleTag) {
 2589 if (token->name() == noframesTag || token->name() == styleTag) {
25882590 processGenericRawTextStartTag(token);
25892591 return true;
25902592 }
2591  if (token.name() == scriptTag) {
 2593 if (token->name() == scriptTag) {
25922594 processScriptStartTag(token);
2593  if (m_usePreHTML5ParserQuirks && token.selfClosing())
 2595 if (m_usePreHTML5ParserQuirks && token->selfClosing())
25942596 processFakeEndTag(scriptTag);
25952597 return true;
25962598 }
2597  if (token.name() == headTag) {
 2599 if (token->name() == headTag) {
25982600 parseError(token);
25992601 return true;
26002602 }
26012603 return false;
26022604}
26032605
2604 void HTMLTreeBuilder::processGenericRCDATAStartTag(AtomicHTMLToken& token)
 2606void HTMLTreeBuilder::processGenericRCDATAStartTag(AtomicHTMLToken* token)
26052607{
2606  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 2608 ASSERT(token->type() == HTMLTokenTypes::StartTag);
26072609 m_tree.insertHTMLElement(token);
26082610 m_parser->tokenizer()->setState(HTMLTokenizerState::RCDATAState);
26092611 m_originalInsertionMode = m_insertionMode;
26102612 setInsertionMode(TextMode);
26112613}
26122614
2613 void HTMLTreeBuilder::processGenericRawTextStartTag(AtomicHTMLToken& token)
 2615void HTMLTreeBuilder::processGenericRawTextStartTag(AtomicHTMLToken* token)
26142616{
2615  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 2617 ASSERT(token->type() == HTMLTokenTypes::StartTag);
26162618 m_tree.insertHTMLElement(token);
26172619 m_parser->tokenizer()->setState(HTMLTokenizerState::RAWTEXTState);
26182620 m_originalInsertionMode = m_insertionMode;
26192621 setInsertionMode(TextMode);
26202622}
26212623
2622 void HTMLTreeBuilder::processScriptStartTag(AtomicHTMLToken& token)
 2624void HTMLTreeBuilder::processScriptStartTag(AtomicHTMLToken* token)
26232625{
2624  ASSERT(token.type() == HTMLTokenTypes::StartTag);
 2626 ASSERT(token->type() == HTMLTokenTypes::StartTag);
26252627 m_tree.insertScriptElement(token);
26262628 m_parser->tokenizer()->setState(HTMLTokenizerState::ScriptDataState);
26272629 m_originalInsertionMode = m_insertionMode;

@@void HTMLTreeBuilder::processScriptStartTag(AtomicHTMLToken& token)
26342636}
26352637
26362638// http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#tree-construction
2637 bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken& token)
 2639bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token)
26382640{
26392641 if (m_tree.isEmpty())
26402642 return false;

@@bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken& token)
26422644 if (isInHTMLNamespace(node))
26432645 return false;
26442646 if (HTMLElementStack::isMathMLTextIntegrationPoint(node)) {
2645  if (token.type() == HTMLTokenTypes::StartTag
2646  && token.name() != MathMLNames::mglyphTag
2647  && token.name() != MathMLNames::malignmarkTag)
 2647 if (token->type() == HTMLTokenTypes::StartTag
 2648 && token->name() != MathMLNames::mglyphTag
 2649 && token->name() != MathMLNames::malignmarkTag)
26482650 return false;
2649  if (token.type() == HTMLTokenTypes::Character)
 2651 if (token->type() == HTMLTokenTypes::Character)
26502652 return false;
26512653 }
26522654 if (node->hasTagName(MathMLNames::annotation_xmlTag)
2653  && token.type() == HTMLTokenTypes::StartTag
2654  && token.name() == SVGNames::svgTag)
 2655 && token->type() == HTMLTokenTypes::StartTag
 2656 && token->name() == SVGNames::svgTag)
26552657 return false;
26562658 if (HTMLElementStack::isHTMLIntegrationPoint(node)) {
2657  if (token.type() == HTMLTokenTypes::StartTag)
 2659 if (token->type() == HTMLTokenTypes::StartTag)
26582660 return false;
2659  if (token.type() == HTMLTokenTypes::Character)
 2661 if (token->type() == HTMLTokenTypes::Character)
26602662 return false;
26612663 }
2662  if (token.type() == HTMLTokenTypes::EndOfFile)
 2664 if (token->type() == HTMLTokenTypes::EndOfFile)
26632665 return false;
26642666 return true;
26652667}
26662668
2667 void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken& token)
 2669void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token)
26682670{
2669  switch (token.type()) {
 2671 switch (token->type()) {
26702672 case HTMLTokenTypes::Uninitialized:
26712673 ASSERT_NOT_REACHED();
26722674 break;

@@void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken& token)
26742676 parseError(token);
26752677 break;
26762678 case HTMLTokenTypes::StartTag: {
2677  if (token.name() == bTag
2678  || token.name() == bigTag
2679  || token.name() == blockquoteTag
2680  || token.name() == bodyTag
2681  || token.name() == brTag
2682  || token.name() == centerTag
2683  || token.name() == codeTag
2684  || token.name() == ddTag
2685  || token.name() == divTag
2686  || token.name() == dlTag
2687  || token.name() == dtTag
2688  || token.name() == emTag
2689  || token.name() == embedTag
2690  || isNumberedHeaderTag(token.name())
2691  || token.name() == headTag
2692  || token.name() == hrTag
2693  || token.name() == iTag
2694  || token.name() == imgTag
2695  || token.name() == liTag
2696  || token.name() == listingTag
2697  || token.name() == menuTag
2698  || token.name() == metaTag
2699  || token.name() == nobrTag
2700  || token.name() == olTag
2701  || token.name() == pTag
2702  || token.name() == preTag
2703  || token.name() == rubyTag
2704  || token.name() == sTag
2705  || token.name() == smallTag
2706  || token.name() == spanTag
2707  || token.name() == strongTag
2708  || token.name() == strikeTag
2709  || token.name() == subTag
2710  || token.name() == supTag
2711  || token.name() == tableTag
2712  || token.name() == ttTag
2713  || token.name() == uTag
2714  || token.name() == ulTag
2715  || token.name() == varTag
2716  || (token.name() == fontTag && (token.getAttributeItem(colorAttr) || token.getAttributeItem(faceAttr) || token.getAttributeItem(sizeAttr)))) {
 2679 if (token->name() == bTag
 2680 || token->name() == bigTag
 2681 || token->name() == blockquoteTag
 2682 || token->name() == bodyTag
 2683 || token->name() == brTag
 2684 || token->name() == centerTag
 2685 || token->name() == codeTag
 2686 || token->name() == ddTag
 2687 || token->name() == divTag
 2688 || token->name() == dlTag
 2689 || token->name() == dtTag
 2690 || token->name() == emTag
 2691 || token->name() == embedTag
 2692 || isNumberedHeaderTag(token->name())
 2693 || token->name() == headTag
 2694 || token->name() == hrTag
 2695 || token->name() == iTag
 2696 || token->name() == imgTag
 2697 || token->name() == liTag
 2698 || token->name() == listingTag
 2699 || token->name() == menuTag
 2700 || token->name() == metaTag
 2701 || token->name() == nobrTag
 2702 || token->name() == olTag
 2703 || token->name() == pTag
 2704 || token->name() == preTag
 2705 || token->name() == rubyTag
 2706 || token->name() == sTag
 2707 || token->name() == smallTag
 2708 || token->name() == spanTag
 2709 || token->name() == strongTag
 2710 || token->name() == strikeTag
 2711 || token->name() == subTag
 2712 || token->name() == supTag
 2713 || token->name() == tableTag
 2714 || token->name() == ttTag
 2715 || token->name() == uTag
 2716 || token->name() == ulTag
 2717 || token->name() == varTag
 2718 || (token->name() == fontTag && (token->getAttributeItem(colorAttr) || token->getAttributeItem(faceAttr) || token->getAttributeItem(sizeAttr)))) {
27172719 parseError(token);
27182720 m_tree.openElements()->popUntilForeignContentScopeMarker();
27192721 processStartTag(token);

@@void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken& token)
27342736 if (m_tree.currentNode()->namespaceURI() == SVGNames::svgNamespaceURI)
27352737 adjustSVGTagNameCase(token);
27362738
2737  if (token.name() == SVGNames::scriptTag && m_tree.currentNode()->hasTagName(SVGNames::scriptTag)) {
 2739 if (token->name() == SVGNames::scriptTag && m_tree.currentNode()->hasTagName(SVGNames::scriptTag)) {
27382740 m_scriptToProcess = m_tree.currentElement();
27392741 m_tree.openElements()->pop();
27402742 return;

@@void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken& token)
27422744 if (!isInHTMLNamespace(m_tree.currentNode())) {
27432745 // FIXME: This code just wants an Element* iterator, instead of an ElementRecord*
27442746 HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord();
2745  if (!nodeRecord->node()->hasLocalName(token.name()))
 2747 if (!nodeRecord->node()->hasLocalName(token->name()))
27462748 parseError(token);
27472749 while (1) {
2748  if (nodeRecord->node()->hasLocalName(token.name())) {
 2750 if (nodeRecord->node()->hasLocalName(token->name())) {
27492751 m_tree.openElements()->popUntilPopped(nodeRecord->element());
27502752 return;
27512753 }

@@void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken& token)
27632765 m_tree.insertComment(token);
27642766 return;
27652767 case HTMLTokenTypes::Character: {
2766  String characters = String(token.characters().data(), token.characters().size());
 2768 String characters = String(token->characters().data(), token->characters().size());
27672769 m_tree.insertTextNode(characters);
27682770 if (m_framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))
27692771 m_framesetOk = false;

@@void HTMLTreeBuilder::finished()
27852787 m_document->finishedParsing();
27862788}
27872789
2788 void HTMLTreeBuilder::parseError(AtomicHTMLToken&)
 2790void HTMLTreeBuilder::parseError(AtomicHTMLToken*)
27892791{
27902792}
27912793

Source/WebCore/html/parser/HTMLTreeBuilder.h

@@public:
7272
7373 // The token really should be passed as a const& since it's never modified.
7474 void constructTreeFromToken(HTMLToken&);
75  void constructTreeFromAtomicToken(AtomicHTMLToken&);
 75 void constructTreeFromAtomicToken(AtomicHTMLToken*);
7676
7777 bool hasParserBlockingScript() const { return !!m_scriptToProcess; }
7878 // Must be called to take the parser-blocking script before calling the parser again.

@@private:
118118 HTMLTreeBuilder(HTMLDocumentParser*, HTMLDocument*, bool reportErrors, bool usePreHTML5ParserQuirks, unsigned maximumDOMTreeDepth);
119119 HTMLTreeBuilder(HTMLDocumentParser*, DocumentFragment*, Element* contextElement, FragmentScriptingPermission, bool usePreHTML5ParserQuirks, unsigned maximumDOMTreeDepth);
120120
121  void processToken(AtomicHTMLToken&);
122 
123  void processDoctypeToken(AtomicHTMLToken&);
124  void processStartTag(AtomicHTMLToken&);
125  void processEndTag(AtomicHTMLToken&);
126  void processComment(AtomicHTMLToken&);
127  void processCharacter(AtomicHTMLToken&);
128  void processEndOfFile(AtomicHTMLToken&);
129 
130  bool processStartTagForInHead(AtomicHTMLToken&);
131  void processStartTagForInBody(AtomicHTMLToken&);
132  void processStartTagForInTable(AtomicHTMLToken&);
133  void processEndTagForInBody(AtomicHTMLToken&);
134  void processEndTagForInTable(AtomicHTMLToken&);
135  void processEndTagForInTableBody(AtomicHTMLToken&);
136  void processEndTagForInRow(AtomicHTMLToken&);
137  void processEndTagForInCell(AtomicHTMLToken&);
138 
139  void processIsindexStartTagForInBody(AtomicHTMLToken&);
140  bool processBodyEndTagForInBody(AtomicHTMLToken&);
 121 void processToken(AtomicHTMLToken*);
 122
 123 void processDoctypeToken(AtomicHTMLToken*);
 124 void processStartTag(AtomicHTMLToken*);
 125 void processEndTag(AtomicHTMLToken*);
 126 void processComment(AtomicHTMLToken*);
 127 void processCharacter(AtomicHTMLToken*);
 128 void processEndOfFile(AtomicHTMLToken*);
 129
 130 bool processStartTagForInHead(AtomicHTMLToken*);
 131 void processStartTagForInBody(AtomicHTMLToken*);
 132 void processStartTagForInTable(AtomicHTMLToken*);
 133 void processEndTagForInBody(AtomicHTMLToken*);
 134 void processEndTagForInTable(AtomicHTMLToken*);
 135 void processEndTagForInTableBody(AtomicHTMLToken*);
 136 void processEndTagForInRow(AtomicHTMLToken*);
 137 void processEndTagForInCell(AtomicHTMLToken*);
 138
 139 void processIsindexStartTagForInBody(AtomicHTMLToken*);
 140 bool processBodyEndTagForInBody(AtomicHTMLToken*);
141141 bool processTableEndTagForInTable();
142142 bool processCaptionEndTagForInCaption();
143143 bool processColgroupEndTagForInColumnGroup();
144144 bool processTrEndTagForInRow();
145145 // FIXME: This function should be inlined into its one call site or it
146146 // needs to assert which tokens it can be called with.
147  void processAnyOtherEndTagForInBody(AtomicHTMLToken&);
 147 void processAnyOtherEndTagForInBody(AtomicHTMLToken*);
148148
149149 void processCharacterBuffer(ExternalCharacterTokenBuffer&);
150150 inline void processCharacterBufferForInBody(ExternalCharacterTokenBuffer&);

@@private:
154154 void processFakeCharacters(const String&);
155155 void processFakePEndTagIfPInButtonScope();
156156
157  void processGenericRCDATAStartTag(AtomicHTMLToken&);
158  void processGenericRawTextStartTag(AtomicHTMLToken&);
159  void processScriptStartTag(AtomicHTMLToken&);
 157 void processGenericRCDATAStartTag(AtomicHTMLToken*);
 158 void processGenericRawTextStartTag(AtomicHTMLToken*);
 159 void processScriptStartTag(AtomicHTMLToken*);
160160
161161 // Default processing for the different insertion modes.
162162 void defaultForInitial();

@@private:
167167 void defaultForAfterHead();
168168 void defaultForInTableText();
169169
170  inline bool shouldProcessTokenInForeignContent(AtomicHTMLToken&);
171  void processTokenInForeignContent(AtomicHTMLToken&);
 170 inline bool shouldProcessTokenInForeignContent(AtomicHTMLToken*);
 171 void processTokenInForeignContent(AtomicHTMLToken*);
172172
173  Vector<Attribute> attributesForIsindexInput(AtomicHTMLToken&);
 173 Vector<Attribute> attributesForIsindexInput(AtomicHTMLToken*);
174174
175175 HTMLElementStack::ElementRecord* furthestBlockForFormattingElement(Element*);
176  void callTheAdoptionAgency(AtomicHTMLToken&);
 176 void callTheAdoptionAgency(AtomicHTMLToken*);
177177
178178 void closeTheCell();
179179
180180 template <bool shouldClose(const ContainerNode*)>
181  void processCloseWhenNestedTag(AtomicHTMLToken&);
 181 void processCloseWhenNestedTag(AtomicHTMLToken*);
182182
183183 bool m_framesetOk;
184184
185  void parseError(AtomicHTMLToken&);
 185 void parseError(AtomicHTMLToken*);
186186
187187 InsertionMode insertionMode() const { return m_insertionMode; }
188188 void setInsertionMode(InsertionMode mode) { m_insertionMode = mode; }

Source/WebCore/html/parser/TextDocumentParser.cpp

@@void TextDocumentParser::insertFakePreElement()
6262
6363 Vector<Attribute> attributes;
6464 attributes.append(Attribute(styleAttr, "word-wrap: break-word; white-space: pre-wrap;"));
65  AtomicHTMLToken fakePre(HTMLTokenTypes::StartTag, preTag.localName(), attributes);
 65 RefPtr<AtomicHTMLToken> fakePre = AtomicHTMLToken::create(HTMLTokenTypes::StartTag, preTag.localName(), attributes);
6666
67  treeBuilder()->constructTreeFromAtomicToken(fakePre);
 67 treeBuilder()->constructTreeFromAtomicToken(fakePre.get());
6868 // Normally we would skip the first \n after a <pre> element, but we don't
6969 // want to skip the first \n for text documents!
7070 treeBuilder()->setShouldSkipLeadingNewline(false);

LayoutTests/ChangeLog

 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 Updated test expectation for html5lib/runner-expected.txt
 9 because now resources/scripted/adoption01.dat passes.
 10
 11 * html5lib/runner-expected.txt:
 12
1132012-07-18 Joshua Bell <jsbell@chromium.org>
214
315 IndexedDB: Direction parameter ignored by some openCursor() overloads

LayoutTests/html5lib/runner-expected.txt

@@resources/tables01.dat: PASS
4343
4444resources/tricky01.dat: PASS
4545
46 resources/scripted/adoption01.dat:
47 1
48 
49 Test 1 of 1 in resources/scripted/adoption01.dat failed. Input:
50 <p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b>
51 Got:
52 | <html>
53 | <head>
54 | <body>
55 | <p>
56 | <b>
57 | id="B"
58 | <script>
59 | "document.getElementById("A").id = "B""
60 | <b>
61 | id="B"
62 | "TEXT"
63 Expected:
64 | <html>
65 | <head>
66 | <body>
67 | <p>
68 | <b>
69 | id="B"
70 | <script>
71 | "document.getElementById("A").id = "B""
72 | <b>
73 | id="A"
74 | "TEXT"
 46resources/scripted/adoption01.dat: PASS
 47
7548resources/scripted/webkit01.dat: PASS