Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(760)

Side by Side Diff: Source/core/html/parser/HTMLTreeBuilder.cpp

Issue 44333002: Move innerHTML and outerHTML to Element (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased to latest master Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/html/parser/HTMLTreeBuilder.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 } 368 }
369 369
370 void HTMLTreeBuilder::constructTree(AtomicHTMLToken* token) 370 void HTMLTreeBuilder::constructTree(AtomicHTMLToken* token)
371 { 371 {
372 if (shouldProcessTokenInForeignContent(token)) 372 if (shouldProcessTokenInForeignContent(token))
373 processTokenInForeignContent(token); 373 processTokenInForeignContent(token);
374 else 374 else
375 processToken(token); 375 processToken(token);
376 376
377 if (m_parser->tokenizer()) { 377 if (m_parser->tokenizer()) {
378 bool inForeignContent = !m_tree.isEmpty() 378 bool inForeignContent = false;
379 && !m_tree.currentStackItem()->isInHTMLNamespace() 379 if (!m_tree.isEmpty()) {
380 && !HTMLElementStack::isHTMLIntegrationPoint(m_tree.currentStackItem ()) 380 RefPtr<HTMLStackItem> adjustedCurrentNode = adjustedCurrentStackItem ();
381 && !HTMLElementStack::isMathMLTextIntegrationPoint(m_tree.currentSta ckItem()); 381 inForeignContent = !adjustedCurrentNode->isInHTMLNamespace()
382 && !HTMLElementStack::isHTMLIntegrationPoint(adjustedCurrentNode .get())
383 && !HTMLElementStack::isMathMLTextIntegrationPoint(adjustedCurre ntNode.get());
384 }
382 385
383 m_parser->tokenizer()->setForceNullCharacterReplacement(m_insertionMode == TextMode || inForeignContent); 386 m_parser->tokenizer()->setForceNullCharacterReplacement(m_insertionMode == TextMode || inForeignContent);
384 m_parser->tokenizer()->setShouldAllowCDATA(inForeignContent); 387 m_parser->tokenizer()->setShouldAllowCDATA(inForeignContent);
385 } 388 }
386 389
387 m_tree.executeQueuedTasks(); 390 m_tree.executeQueuedTasks();
388 // We might be detached now. 391 // We might be detached now.
389 } 392 }
390 393
391 void HTMLTreeBuilder::processToken(AtomicHTMLToken* token) 394 void HTMLTreeBuilder::processToken(AtomicHTMLToken* token)
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 if (m_tree.currentIsRootNode() || m_tree.currentNode()->hasTagName(templateT ag)) { 991 if (m_tree.currentIsRootNode() || m_tree.currentNode()->hasTagName(templateT ag)) {
989 ASSERT(isParsingFragmentOrTemplateContents()); 992 ASSERT(isParsingFragmentOrTemplateContents());
990 // FIXME: parse error 993 // FIXME: parse error
991 return false; 994 return false;
992 } 995 }
993 m_tree.openElements()->pop(); 996 m_tree.openElements()->pop();
994 setInsertionMode(InTableMode); 997 setInsertionMode(InTableMode);
995 return true; 998 return true;
996 } 999 }
997 1000
1001 // http://www.whatwg.org/specs/web-apps/current-work/#adjusted-current-node
1002 PassRefPtr<HTMLStackItem> HTMLTreeBuilder::adjustedCurrentStackItem() const
1003 {
1004 ASSERT(!m_tree.isEmpty());
1005 if (isParsingFragment() && m_tree.openElements()->hasOnlyOneElement())
1006 return HTMLStackItem::create(m_fragmentContext.contextElement(), HTMLSta ckItem::ItemForContextElement);
1007
1008 return m_tree.currentStackItem();
1009 }
1010
998 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html #close-the-cell 1011 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html #close-the-cell
999 void HTMLTreeBuilder::closeTheCell() 1012 void HTMLTreeBuilder::closeTheCell()
1000 { 1013 {
1001 ASSERT(insertionMode() == InCellMode); 1014 ASSERT(insertionMode() == InCellMode);
1002 if (m_tree.openElements()->inTableScope(tdTag)) { 1015 if (m_tree.openElements()->inTableScope(tdTag)) {
1003 ASSERT(!m_tree.openElements()->inTableScope(thTag)); 1016 ASSERT(!m_tree.openElements()->inTableScope(thTag));
1004 processFakeEndTag(tdTag); 1017 processFakeEndTag(tdTag);
1005 return; 1018 return;
1006 } 1019 }
1007 ASSERT(m_tree.openElements()->inTableScope(thTag)); 1020 ASSERT(m_tree.openElements()->inTableScope(thTag));
(...skipping 1660 matching lines...) Expand 10 before | Expand all | Expand 10 after
2668 m_scriptToProcessStartPosition = position; 2681 m_scriptToProcessStartPosition = position;
2669 2682
2670 setInsertionMode(TextMode); 2683 setInsertionMode(TextMode);
2671 } 2684 }
2672 2685
2673 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction .html#tree-construction 2686 // http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction .html#tree-construction
2674 bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token) 2687 bool HTMLTreeBuilder::shouldProcessTokenInForeignContent(AtomicHTMLToken* token)
2675 { 2688 {
2676 if (m_tree.isEmpty()) 2689 if (m_tree.isEmpty())
2677 return false; 2690 return false;
2678 HTMLStackItem* item = m_tree.currentStackItem(); 2691 RefPtr<HTMLStackItem> adjustedCurrentNode = adjustedCurrentStackItem();
eseidel 2013/11/12 21:05:23 This change looks like it's adding a malloc here j
2679 if (item->isInHTMLNamespace()) 2692
2693 if (adjustedCurrentNode->isInHTMLNamespace())
2680 return false; 2694 return false;
2681 if (HTMLElementStack::isMathMLTextIntegrationPoint(item)) { 2695 if (HTMLElementStack::isMathMLTextIntegrationPoint(adjustedCurrentNode.get() )) {
2682 if (token->type() == HTMLToken::StartTag 2696 if (token->type() == HTMLToken::StartTag
2683 && token->name() != MathMLNames::mglyphTag 2697 && token->name() != MathMLNames::mglyphTag
2684 && token->name() != MathMLNames::malignmarkTag) 2698 && token->name() != MathMLNames::malignmarkTag)
2685 return false; 2699 return false;
2686 if (token->type() == HTMLToken::Character) 2700 if (token->type() == HTMLToken::Character)
2687 return false; 2701 return false;
2688 } 2702 }
2689 if (item->hasTagName(MathMLNames::annotation_xmlTag) 2703 if (adjustedCurrentNode->hasTagName(MathMLNames::annotation_xmlTag)
2690 && token->type() == HTMLToken::StartTag 2704 && token->type() == HTMLToken::StartTag
2691 && token->name() == SVGNames::svgTag) 2705 && token->name() == SVGNames::svgTag)
2692 return false; 2706 return false;
2693 if (HTMLElementStack::isHTMLIntegrationPoint(item)) { 2707 if (HTMLElementStack::isHTMLIntegrationPoint(adjustedCurrentNode.get())) {
2694 if (token->type() == HTMLToken::StartTag) 2708 if (token->type() == HTMLToken::StartTag)
2695 return false; 2709 return false;
2696 if (token->type() == HTMLToken::Character) 2710 if (token->type() == HTMLToken::Character)
2697 return false; 2711 return false;
2698 } 2712 }
2699 if (token->type() == HTMLToken::EndOfFile) 2713 if (token->type() == HTMLToken::EndOfFile)
2700 return false; 2714 return false;
2701 return true; 2715 return true;
2702 } 2716 }
2703 2717
2704 void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token) 2718 void HTMLTreeBuilder::processTokenInForeignContent(AtomicHTMLToken* token)
2705 { 2719 {
2720 RefPtr<HTMLStackItem> adjustedCurrentNode = adjustedCurrentStackItem();
2721
2706 switch (token->type()) { 2722 switch (token->type()) {
2707 case HTMLToken::Uninitialized: 2723 case HTMLToken::Uninitialized:
2708 ASSERT_NOT_REACHED(); 2724 ASSERT_NOT_REACHED();
2709 break; 2725 break;
2710 case HTMLToken::DOCTYPE: 2726 case HTMLToken::DOCTYPE:
2711 parseError(token); 2727 parseError(token);
2712 break; 2728 break;
2713 case HTMLToken::StartTag: { 2729 case HTMLToken::StartTag: {
2714 if (token->name() == bTag 2730 if (token->name() == bTag
2715 || token->name() == bigTag 2731 || token->name() == bigTag
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
2749 || token->name() == ttTag 2765 || token->name() == ttTag
2750 || token->name() == uTag 2766 || token->name() == uTag
2751 || token->name() == ulTag 2767 || token->name() == ulTag
2752 || token->name() == varTag 2768 || token->name() == varTag
2753 || (token->name() == fontTag && (token->getAttributeItem(colorAttr) || token->getAttributeItem(faceAttr) || token->getAttributeItem(sizeAttr)))) { 2769 || (token->name() == fontTag && (token->getAttributeItem(colorAttr) || token->getAttributeItem(faceAttr) || token->getAttributeItem(sizeAttr)))) {
2754 parseError(token); 2770 parseError(token);
2755 m_tree.openElements()->popUntilForeignContentScopeMarker(); 2771 m_tree.openElements()->popUntilForeignContentScopeMarker();
2756 processStartTag(token); 2772 processStartTag(token);
2757 return; 2773 return;
2758 } 2774 }
2759 const AtomicString& currentNamespace = m_tree.currentStackItem()->namesp aceURI(); 2775 const AtomicString& currentNamespace = adjustedCurrentNode->namespaceURI ();
2760 if (currentNamespace == MathMLNames::mathmlNamespaceURI) 2776 if (currentNamespace == MathMLNames::mathmlNamespaceURI)
2761 adjustMathMLAttributes(token); 2777 adjustMathMLAttributes(token);
2762 if (currentNamespace == SVGNames::svgNamespaceURI) { 2778 if (currentNamespace == SVGNames::svgNamespaceURI) {
2763 adjustSVGTagNameCase(token); 2779 adjustSVGTagNameCase(token);
2764 adjustSVGAttributes(token); 2780 adjustSVGAttributes(token);
2765 } 2781 }
2766 adjustForeignAttributes(token); 2782 adjustForeignAttributes(token);
2767 m_tree.insertForeignElement(token, currentNamespace); 2783 m_tree.insertForeignElement(token, currentNamespace);
2768 break; 2784 break;
2769 } 2785 }
2770 case HTMLToken::EndTag: { 2786 case HTMLToken::EndTag: {
2771 if (m_tree.currentStackItem()->namespaceURI() == SVGNames::svgNamespaceU RI) 2787 if (adjustedCurrentNode->namespaceURI() == SVGNames::svgNamespaceURI)
2772 adjustSVGTagNameCase(token); 2788 adjustSVGTagNameCase(token);
2773 2789
2774 if (token->name() == SVGNames::scriptTag && m_tree.currentStackItem()->h asTagName(SVGNames::scriptTag)) { 2790 if (token->name() == SVGNames::scriptTag && m_tree.currentStackItem()->h asTagName(SVGNames::scriptTag)) {
2775 if (scriptingContentIsAllowed(m_tree.parserContentPolicy())) 2791 if (scriptingContentIsAllowed(m_tree.parserContentPolicy()))
2776 m_scriptToProcess = m_tree.currentElement(); 2792 m_scriptToProcess = m_tree.currentElement();
2777 m_tree.openElements()->pop(); 2793 m_tree.openElements()->pop();
2778 return; 2794 return;
2779 } 2795 }
2780 if (!m_tree.currentStackItem()->isInHTMLNamespace()) { 2796 if (!m_tree.currentStackItem()->isInHTMLNamespace()) {
2781 // FIXME: This code just wants an Element* iterator, instead of an E lementRecord* 2797 // FIXME: This code just wants an Element* iterator, instead of an E lementRecord*
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2822 ASSERT(m_isAttached); 2838 ASSERT(m_isAttached);
2823 // Warning, this may detach the parser. Do not do anything else after this. 2839 // Warning, this may detach the parser. Do not do anything else after this.
2824 m_tree.finishedParsing(); 2840 m_tree.finishedParsing();
2825 } 2841 }
2826 2842
2827 void HTMLTreeBuilder::parseError(AtomicHTMLToken*) 2843 void HTMLTreeBuilder::parseError(AtomicHTMLToken*)
2828 { 2844 {
2829 } 2845 }
2830 2846
2831 } // namespace WebCore 2847 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/html/parser/HTMLTreeBuilder.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698