| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#form
atting | 130 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#form
atting |
| 131 static bool isFormattingTag(const AtomicString& tagName) | 131 static bool isFormattingTag(const AtomicString& tagName) |
| 132 { | 132 { |
| 133 return tagName == aTag || isNonAnchorFormattingTag(tagName); | 133 return tagName == aTag || isNonAnchorFormattingTag(tagName); |
| 134 } | 134 } |
| 135 | 135 |
| 136 static HTMLFormElement* closestFormAncestor(Element* element) | 136 static HTMLFormElement* closestFormAncestor(Element* element) |
| 137 { | 137 { |
| 138 ASSERT(isMainThread()); | 138 ASSERT(isMainThread()); |
| 139 while (element) { | 139 while (element) { |
| 140 if (element->hasTagName(formTag)) | 140 if (isHTMLFormElement(*element)) |
| 141 return toHTMLFormElement(element); | 141 return toHTMLFormElement(element); |
| 142 ContainerNode* parent = element->parentNode(); | 142 ContainerNode* parent = element->parentNode(); |
| 143 if (!parent || !parent->isElementNode()) | 143 if (!parent || !parent->isElementNode()) |
| 144 return 0; | 144 return 0; |
| 145 element = toElement(parent); | 145 element = toElement(parent); |
| 146 } | 146 } |
| 147 return 0; | 147 return 0; |
| 148 } | 148 } |
| 149 | 149 |
| 150 class HTMLTreeBuilder::CharacterTokenBuffer { | 150 class HTMLTreeBuilder::CharacterTokenBuffer { |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 ASSERT(isMainThread()); | 304 ASSERT(isMainThread()); |
| 305 // FIXME: This assertion will become invalid if <http://webkit.org/b/60316>
is fixed. | 305 // FIXME: This assertion will become invalid if <http://webkit.org/b/60316>
is fixed. |
| 306 ASSERT(contextElement); | 306 ASSERT(contextElement); |
| 307 if (contextElement) { | 307 if (contextElement) { |
| 308 // Steps 4.2-4.6 of the HTML5 Fragment Case parsing algorithm: | 308 // Steps 4.2-4.6 of the HTML5 Fragment Case parsing algorithm: |
| 309 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.h
tml#fragment-case | 309 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.h
tml#fragment-case |
| 310 // For efficiency, we skip step 4.2 ("Let root be a new html element wit
h no attributes") | 310 // For efficiency, we skip step 4.2 ("Let root be a new html element wit
h no attributes") |
| 311 // and instead use the DocumentFragment as a root node. | 311 // and instead use the DocumentFragment as a root node. |
| 312 m_tree.openElements()->pushRootNode(HTMLStackItem::create(fragment, HTML
StackItem::ItemForDocumentFragmentNode)); | 312 m_tree.openElements()->pushRootNode(HTMLStackItem::create(fragment, HTML
StackItem::ItemForDocumentFragmentNode)); |
| 313 | 313 |
| 314 if (contextElement->hasTagName(templateTag)) | 314 if (isHTMLTemplateElement(*contextElement)) |
| 315 m_templateInsertionModes.append(TemplateContentsMode); | 315 m_templateInsertionModes.append(TemplateContentsMode); |
| 316 | 316 |
| 317 resetInsertionModeAppropriately(); | 317 resetInsertionModeAppropriately(); |
| 318 m_tree.setForm(closestFormAncestor(contextElement)); | 318 m_tree.setForm(closestFormAncestor(contextElement)); |
| 319 } | 319 } |
| 320 } | 320 } |
| 321 | 321 |
| 322 HTMLTreeBuilder::~HTMLTreeBuilder() | 322 HTMLTreeBuilder::~HTMLTreeBuilder() |
| 323 { | 323 { |
| 324 } | 324 } |
| (...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 905 m_tree.activeFormattingElements()->appendMarker(); | 905 m_tree.activeFormattingElements()->appendMarker(); |
| 906 m_tree.insertHTMLElement(token); | 906 m_tree.insertHTMLElement(token); |
| 907 m_templateInsertionModes.append(TemplateContentsMode); | 907 m_templateInsertionModes.append(TemplateContentsMode); |
| 908 setInsertionMode(TemplateContentsMode); | 908 setInsertionMode(TemplateContentsMode); |
| 909 } | 909 } |
| 910 | 910 |
| 911 bool HTMLTreeBuilder::processTemplateEndTag(AtomicHTMLToken* token) | 911 bool HTMLTreeBuilder::processTemplateEndTag(AtomicHTMLToken* token) |
| 912 { | 912 { |
| 913 ASSERT(token->name() == templateTag.localName()); | 913 ASSERT(token->name() == templateTag.localName()); |
| 914 if (!m_tree.openElements()->hasTemplateInHTMLScope()) { | 914 if (!m_tree.openElements()->hasTemplateInHTMLScope()) { |
| 915 ASSERT(m_templateInsertionModes.isEmpty() || (m_templateInsertionModes.s
ize() == 1 && m_fragmentContext.contextElement()->hasTagName(templateTag))); | 915 ASSERT(m_templateInsertionModes.isEmpty() || (m_templateInsertionModes.s
ize() == 1 && isHTMLTemplateElement(m_fragmentContext.contextElement()))); |
| 916 parseError(token); | 916 parseError(token); |
| 917 return false; | 917 return false; |
| 918 } | 918 } |
| 919 m_tree.generateImpliedEndTags(); | 919 m_tree.generateImpliedEndTags(); |
| 920 if (!m_tree.currentStackItem()->hasTagName(templateTag)) | 920 if (!m_tree.currentStackItem()->hasTagName(templateTag)) |
| 921 parseError(token); | 921 parseError(token); |
| 922 m_tree.openElements()->popUntilPopped(templateTag); | 922 m_tree.openElements()->popUntilPopped(templateTag); |
| 923 m_tree.activeFormattingElements()->clearToLastMarker(); | 923 m_tree.activeFormattingElements()->clearToLastMarker(); |
| 924 m_templateInsertionModes.removeLast(); | 924 m_templateInsertionModes.removeLast(); |
| 925 resetInsertionModeAppropriately(); | 925 resetInsertionModeAppropriately(); |
| 926 return true; | 926 return true; |
| 927 } | 927 } |
| 928 | 928 |
| 929 bool HTMLTreeBuilder::processEndOfFileForInTemplateContents(AtomicHTMLToken* tok
en) | 929 bool HTMLTreeBuilder::processEndOfFileForInTemplateContents(AtomicHTMLToken* tok
en) |
| 930 { | 930 { |
| 931 AtomicHTMLToken endTemplate(HTMLToken::EndTag, templateTag.localName()); | 931 AtomicHTMLToken endTemplate(HTMLToken::EndTag, templateTag.localName()); |
| 932 if (!processTemplateEndTag(&endTemplate)) | 932 if (!processTemplateEndTag(&endTemplate)) |
| 933 return false; | 933 return false; |
| 934 | 934 |
| 935 processEndOfFile(token); | 935 processEndOfFile(token); |
| 936 return true; | 936 return true; |
| 937 } | 937 } |
| 938 | 938 |
| 939 bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() | 939 bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() |
| 940 { | 940 { |
| 941 if (m_tree.currentIsRootNode() || m_tree.currentNode()->hasTagName(templateT
ag)) { | 941 if (m_tree.currentIsRootNode() || isHTMLTemplateElement(*m_tree.currentNode(
))) { |
| 942 ASSERT(isParsingFragmentOrTemplateContents()); | 942 ASSERT(isParsingFragmentOrTemplateContents()); |
| 943 // FIXME: parse error | 943 // FIXME: parse error |
| 944 return false; | 944 return false; |
| 945 } | 945 } |
| 946 m_tree.openElements()->pop(); | 946 m_tree.openElements()->pop(); |
| 947 setInsertionMode(InTableMode); | 947 setInsertionMode(InTableMode); |
| 948 return true; | 948 return true; |
| 949 } | 949 } |
| 950 | 950 |
| 951 // http://www.whatwg.org/specs/web-apps/current-work/#adjusted-current-node | 951 // http://www.whatwg.org/specs/web-apps/current-work/#adjusted-current-node |
| (...skipping 1496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2448 return; | 2448 return; |
| 2449 case AfterFramesetMode: | 2449 case AfterFramesetMode: |
| 2450 case AfterAfterFramesetMode: | 2450 case AfterAfterFramesetMode: |
| 2451 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); | 2451 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterA
fterFramesetMode); |
| 2452 break; | 2452 break; |
| 2453 case InColumnGroupMode: | 2453 case InColumnGroupMode: |
| 2454 if (m_tree.currentIsRootNode()) { | 2454 if (m_tree.currentIsRootNode()) { |
| 2455 ASSERT(isParsingFragment()); | 2455 ASSERT(isParsingFragment()); |
| 2456 return; // FIXME: Should we break here instead of returning? | 2456 return; // FIXME: Should we break here instead of returning? |
| 2457 } | 2457 } |
| 2458 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || m_tree.currentNo
de()->hasTagName(templateTag)); | 2458 ASSERT(m_tree.currentNode()->hasTagName(colgroupTag) || isHTMLTemplateEl
ement(m_tree.currentNode())); |
| 2459 processColgroupEndTagForInColumnGroup(); | 2459 processColgroupEndTagForInColumnGroup(); |
| 2460 // Fall through | 2460 // Fall through |
| 2461 case InFramesetMode: | 2461 case InFramesetMode: |
| 2462 case InTableMode: | 2462 case InTableMode: |
| 2463 case InTableBodyMode: | 2463 case InTableBodyMode: |
| 2464 case InSelectInTableMode: | 2464 case InSelectInTableMode: |
| 2465 case InSelectMode: | 2465 case InSelectMode: |
| 2466 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode
|| insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode); | 2466 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInT
ableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode
|| insertionMode() == InTableBodyMode || insertionMode() == InColumnGroupMode); |
| 2467 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) | 2467 if (m_tree.currentNode() != m_tree.openElements()->rootNode()) |
| 2468 parseError(token); | 2468 parseError(token); |
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2789 ASSERT(m_isAttached); | 2789 ASSERT(m_isAttached); |
| 2790 // Warning, this may detach the parser. Do not do anything else after this. | 2790 // Warning, this may detach the parser. Do not do anything else after this. |
| 2791 m_tree.finishedParsing(); | 2791 m_tree.finishedParsing(); |
| 2792 } | 2792 } |
| 2793 | 2793 |
| 2794 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) | 2794 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) |
| 2795 { | 2795 { |
| 2796 } | 2796 } |
| 2797 | 2797 |
| 2798 } // namespace WebCore | 2798 } // namespace WebCore |
| OLD | NEW |