| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. |
| 3 * Copyright (C) 2011 Apple Inc. All rights reserved. | 3 * Copyright (C) 2011 Apple Inc. All rights reserved. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 */ | 25 */ |
| 26 | 26 |
| 27 #include "core/html/parser/HTMLConstructionSite.h" | 27 #include "core/html/parser/HTMLConstructionSite.h" |
| 28 | 28 |
| 29 #include "core/HTMLElementFactory.h" | 29 #include "core/HTMLElementFactory.h" |
| 30 #include "core/HTMLNames.h" | 30 #include "core/HTMLNames.h" |
| 31 #include "core/dom/Comment.h" | 31 #include "core/dom/Comment.h" |
| 32 #include "core/dom/DocumentFragment.h" | 32 #include "core/dom/DocumentFragment.h" |
| 33 #include "core/dom/DocumentType.h" | 33 #include "core/dom/DocumentType.h" |
| 34 #include "core/dom/Element.h" | 34 #include "core/dom/Element.h" |
| 35 #include "core/dom/ElementTraversal.h" |
| 35 #include "core/dom/ScriptLoader.h" | 36 #include "core/dom/ScriptLoader.h" |
| 36 #include "core/dom/TemplateContentDocumentFragment.h" | 37 #include "core/dom/TemplateContentDocumentFragment.h" |
| 37 #include "core/dom/Text.h" | 38 #include "core/dom/Text.h" |
| 38 #include "core/frame/LocalFrame.h" | 39 #include "core/frame/LocalFrame.h" |
| 39 #include "core/html/HTMLFormElement.h" | 40 #include "core/html/HTMLFormElement.h" |
| 40 #include "core/html/HTMLHtmlElement.h" | 41 #include "core/html/HTMLHtmlElement.h" |
| 41 #include "core/html/HTMLPlugInElement.h" | 42 #include "core/html/HTMLPlugInElement.h" |
| 42 #include "core/html/HTMLScriptElement.h" | 43 #include "core/html/HTMLScriptElement.h" |
| 43 #include "core/html/HTMLTemplateElement.h" | 44 #include "core/html/HTMLTemplateElement.h" |
| 44 #include "core/html/parser/AtomicHTMLToken.h" | 45 #include "core/html/parser/AtomicHTMLToken.h" |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 : m_document(&document) | 318 : m_document(&document) |
| 318 , m_attachmentRoot(document) | 319 , m_attachmentRoot(document) |
| 319 , m_parserContentPolicy(parserContentPolicy) | 320 , m_parserContentPolicy(parserContentPolicy) |
| 320 , m_isParsingFragment(false) | 321 , m_isParsingFragment(false) |
| 321 , m_redirectAttachToFosterParent(false) | 322 , m_redirectAttachToFosterParent(false) |
| 322 , m_inQuirksMode(document.inQuirksMode()) | 323 , m_inQuirksMode(document.inQuirksMode()) |
| 323 { | 324 { |
| 324 ASSERT(m_document->isHTMLDocument() || m_document->isXHTMLDocument()); | 325 ASSERT(m_document->isHTMLDocument() || m_document->isXHTMLDocument()); |
| 325 } | 326 } |
| 326 | 327 |
| 327 void HTMLConstructionSite::initFragmentParsing(DocumentFragment* fragment) | 328 void HTMLConstructionSite::initFragmentParsing(DocumentFragment* fragment, Eleme
nt* contextElement) |
| 328 { | 329 { |
| 330 DCHECK(contextElement); |
| 329 DCHECK_EQ(m_document, &fragment->document()); | 331 DCHECK_EQ(m_document, &fragment->document()); |
| 330 DCHECK_EQ(m_inQuirksMode, fragment->document().inQuirksMode()); | 332 DCHECK_EQ(m_inQuirksMode, fragment->document().inQuirksMode()); |
| 331 DCHECK(!m_isParsingFragment); | 333 DCHECK(!m_isParsingFragment); |
| 334 DCHECK(!m_form); |
| 332 | 335 |
| 333 m_attachmentRoot = fragment; | 336 m_attachmentRoot = fragment; |
| 334 m_isParsingFragment = true; | 337 m_isParsingFragment = true; |
| 338 |
| 339 if (!contextElement->document().isTemplateDocument()) |
| 340 m_form = Traversal<HTMLFormElement>::firstAncestorOrSelf(*contextElement
); |
| 335 } | 341 } |
| 336 | 342 |
| 337 HTMLConstructionSite::~HTMLConstructionSite() | 343 HTMLConstructionSite::~HTMLConstructionSite() |
| 338 { | 344 { |
| 339 // Depending on why we're being destroyed it might be OK | 345 // Depending on why we're being destroyed it might be OK |
| 340 // to forget queued tasks, but currently we don't expect to. | 346 // to forget queued tasks, but currently we don't expect to. |
| 341 ASSERT(m_taskQueue.isEmpty()); | 347 ASSERT(m_taskQueue.isEmpty()); |
| 342 // Currently we assume that text will never be the last token in the | 348 // Currently we assume that text will never be the last token in the |
| 343 // document and that we'll always queue some additional task to cause it to
flush. | 349 // document and that we'll always queue some additional task to cause it to
flush. |
| 344 ASSERT(m_pendingText.isEmpty()); | 350 ASSERT(m_pendingText.isEmpty()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 359 void HTMLConstructionSite::detach() | 365 void HTMLConstructionSite::detach() |
| 360 { | 366 { |
| 361 // FIXME: We'd like to ASSERT here that we're canceling and not just discard
ing | 367 // FIXME: We'd like to ASSERT here that we're canceling and not just discard
ing |
| 362 // text that really should have made it into the DOM earlier, but there | 368 // text that really should have made it into the DOM earlier, but there |
| 363 // doesn't seem to be a nice way to do that. | 369 // doesn't seem to be a nice way to do that. |
| 364 m_pendingText.discard(); | 370 m_pendingText.discard(); |
| 365 m_document = nullptr; | 371 m_document = nullptr; |
| 366 m_attachmentRoot = nullptr; | 372 m_attachmentRoot = nullptr; |
| 367 } | 373 } |
| 368 | 374 |
| 369 void HTMLConstructionSite::setForm(HTMLFormElement* form) | |
| 370 { | |
| 371 // This method should only be needed for HTMLTreeBuilder in the fragment cas
e. | |
| 372 ASSERT(!m_form); | |
| 373 m_form = form; | |
| 374 } | |
| 375 | |
| 376 HTMLFormElement* HTMLConstructionSite::takeForm() | 375 HTMLFormElement* HTMLConstructionSite::takeForm() |
| 377 { | 376 { |
| 378 return m_form.release(); | 377 return m_form.release(); |
| 379 } | 378 } |
| 380 | 379 |
| 381 void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken* tok
en) | 380 void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken* tok
en) |
| 382 { | 381 { |
| 383 ASSERT(m_document); | 382 ASSERT(m_document); |
| 384 HTMLHtmlElement* element = HTMLHtmlElement::create(*m_document); | 383 HTMLHtmlElement* element = HTMLHtmlElement::create(*m_document); |
| 385 setAttributes(element, token, m_parserContentPolicy); | 384 setAttributes(element, token, m_parserContentPolicy); |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 593 attachLater(currentNode(), body); | 592 attachLater(currentNode(), body); |
| 594 m_openElements.pushHTMLBodyElement(HTMLStackItem::create(body, token)); | 593 m_openElements.pushHTMLBodyElement(HTMLStackItem::create(body, token)); |
| 595 if (m_document) | 594 if (m_document) |
| 596 m_document->willInsertBody(); | 595 m_document->willInsertBody(); |
| 597 } | 596 } |
| 598 | 597 |
| 599 void HTMLConstructionSite::insertHTMLFormElement(AtomicHTMLToken* token, bool is
Demoted) | 598 void HTMLConstructionSite::insertHTMLFormElement(AtomicHTMLToken* token, bool is
Demoted) |
| 600 { | 599 { |
| 601 HTMLElement* element = createHTMLElement(token); | 600 HTMLElement* element = createHTMLElement(token); |
| 602 ASSERT(isHTMLFormElement(element)); | 601 ASSERT(isHTMLFormElement(element)); |
| 603 m_form = toHTMLFormElement(element); | 602 HTMLFormElement* formElement = toHTMLFormElement(element); |
| 604 m_form->setDemoted(isDemoted); | 603 if (!ownerDocumentForCurrentNode().isTemplateDocument()) |
| 605 attachLater(currentNode(), m_form.get()); | 604 m_form = formElement; |
| 606 m_openElements.push(HTMLStackItem::create(m_form.get(), token)); | 605 formElement->setDemoted(isDemoted); |
| 606 attachLater(currentNode(), formElement); |
| 607 m_openElements.push(HTMLStackItem::create(formElement, token)); |
| 607 } | 608 } |
| 608 | 609 |
| 609 void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken* token) | 610 void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken* token) |
| 610 { | 611 { |
| 611 HTMLElement* element = createHTMLElement(token); | 612 HTMLElement* element = createHTMLElement(token); |
| 612 attachLater(currentNode(), element); | 613 attachLater(currentNode(), element); |
| 613 m_openElements.push(HTMLStackItem::create(element, token)); | 614 m_openElements.push(HTMLStackItem::create(element, token)); |
| 614 } | 615 } |
| 615 | 616 |
| 616 void HTMLConstructionSite::insertSelfClosingHTMLElementDestroyingToken(AtomicHTM
LToken* token) | 617 void HTMLConstructionSite::insertSelfClosingHTMLElementDestroyingToken(AtomicHTM
LToken* token) |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 if (isHTMLTemplateElement(*currentNode())) | 745 if (isHTMLTemplateElement(*currentNode())) |
| 745 return toHTMLTemplateElement(currentElement())->content()->document(); | 746 return toHTMLTemplateElement(currentElement())->content()->document(); |
| 746 return currentNode()->document(); | 747 return currentNode()->document(); |
| 747 } | 748 } |
| 748 | 749 |
| 749 HTMLElement* HTMLConstructionSite::createHTMLElement(AtomicHTMLToken* token) | 750 HTMLElement* HTMLConstructionSite::createHTMLElement(AtomicHTMLToken* token) |
| 750 { | 751 { |
| 751 Document& document = ownerDocumentForCurrentNode(); | 752 Document& document = ownerDocumentForCurrentNode(); |
| 752 // Only associate the element with the current form if we're creating the ne
w element | 753 // Only associate the element with the current form if we're creating the ne
w element |
| 753 // in a document with a browsing context (rather than in <template> contents
). | 754 // in a document with a browsing context (rather than in <template> contents
). |
| 754 HTMLFormElement* form = document.frame() ? m_form.get() : 0; | 755 HTMLFormElement* form = document.frame() ? m_form.get() : nullptr; |
| 755 // FIXME: This can't use HTMLConstructionSite::createElement because we | 756 // FIXME: This can't use HTMLConstructionSite::createElement because we |
| 756 // have to pass the current form element. We should rework form association | 757 // have to pass the current form element. We should rework form association |
| 757 // to occur after construction to allow better code sharing here. | 758 // to occur after construction to allow better code sharing here. |
| 758 HTMLElement* element = HTMLElementFactory::createHTMLElement(token->name(),
document, form, getCreateElementFlags()); | 759 HTMLElement* element = HTMLElementFactory::createHTMLElement(token->name(),
document, form, getCreateElementFlags()); |
| 759 setAttributes(element, token, m_parserContentPolicy); | 760 setAttributes(element, token, m_parserContentPolicy); |
| 760 return element; | 761 return element; |
| 761 } | 762 } |
| 762 | 763 |
| 763 HTMLStackItem* HTMLConstructionSite::createElementFromSavedToken(HTMLStackItem*
item) | 764 HTMLStackItem* HTMLConstructionSite::createElementFromSavedToken(HTMLStackItem*
item) |
| 764 { | 765 { |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 queueTask(task); | 875 queueTask(task); |
| 875 } | 876 } |
| 876 | 877 |
| 877 DEFINE_TRACE(HTMLConstructionSite::PendingText) | 878 DEFINE_TRACE(HTMLConstructionSite::PendingText) |
| 878 { | 879 { |
| 879 visitor->trace(parent); | 880 visitor->trace(parent); |
| 880 visitor->trace(nextChild); | 881 visitor->trace(nextChild); |
| 881 } | 882 } |
| 882 | 883 |
| 883 } // namespace blink | 884 } // namespace blink |
| OLD | NEW |