Changeset 62599 in webkit
- Timestamp:
- Jul 6, 2010 3:51:18 PM (14 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r62598 r62599 1 2010-07-06 Adam Barth <abarth@webkit.org> 2 3 Reviewed by Eric Seidel. 4 5 Factor HTMLConstructionSite out of HTMLTreeBuilder 6 https://bugs.webkit.org/show_bug.cgi?id=41716 7 8 The HTMLContructionSite is the model object on which the 9 HTMLTreeBuilder (a controller) acts. 10 11 No behavior change. I'll move this class into its own file in a 12 followup patch. 13 14 * html/HTMLFormattingElementList.h: 15 (WebCore::HTMLFormattingElementList::at): 16 * html/HTMLTreeBuilder.cpp: 17 (WebCore::HTMLTreeBuilder::HTMLTreeBuilder): 18 (WebCore::HTMLConstructionSite::HTMLConstructionSite): 19 (WebCore::HTMLTreeBuilder::passTokenToLegacyParser): 20 (WebCore::HTMLTreeBuilder::processDoctypeToken): 21 (WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML): 22 (WebCore::HTMLConstructionSite::mergeAttributesFromTokenIntoElement): 23 (WebCore::HTMLConstructionSite::insertHTMLHtmlStartTagInBody): 24 (WebCore::HTMLConstructionSite::insertHTMLBodyStartTagInBody): 25 (WebCore::HTMLTreeBuilder::processFakePEndTagIfPInScope): 26 (WebCore::HTMLTreeBuilder::processIsindexStartTagForInBody): 27 (WebCore::HTMLTreeBuilder::processStartTagForInBody): 28 (WebCore::HTMLTreeBuilder::processColgroupEndTagForInColumnGroup): 29 (WebCore::HTMLTreeBuilder::closeTheCell): 30 (WebCore::HTMLTreeBuilder::processStartTagForInTable): 31 (WebCore::HTMLTreeBuilder::processStartTag): 32 (WebCore::HTMLTreeBuilder::processBodyEndTagForInBody): 33 (WebCore::HTMLTreeBuilder::processAnyOtherEndTagForInBody): 34 (WebCore::HTMLTreeBuilder::furthestBlockForFormattingElement): 35 (WebCore::HTMLTreeBuilder::findFosterParentFor): 36 (WebCore::HTMLTreeBuilder::callTheAdoptionAgency): 37 (WebCore::HTMLTreeBuilder::resetInsertionModeAppropriately): 38 (WebCore::HTMLTreeBuilder::processEndTagForInBody): 39 (WebCore::HTMLTreeBuilder::processCaptionEndTagForInCaption): 40 (WebCore::HTMLTreeBuilder::processTrEndTagForInRow): 41 (WebCore::HTMLTreeBuilder::processEndTagForInTable): 42 (WebCore::HTMLTreeBuilder::processEndTag): 43 (WebCore::HTMLTreeBuilder::processComment): 44 (WebCore::HTMLTreeBuilder::processCharacter): 45 (WebCore::HTMLTreeBuilder::processEndOfFile): 46 (WebCore::HTMLTreeBuilder::processDefaultForBeforeHTMLMode): 47 (WebCore::HTMLTreeBuilder::processStartTagForInHead): 48 (WebCore::HTMLConstructionSite::insertDoctype): 49 (WebCore::HTMLConstructionSite::insertComment): 50 (WebCore::HTMLConstructionSite::insertCommentOnDocument): 51 (WebCore::HTMLConstructionSite::insertCommentOnHTMLHtmlElement): 52 (WebCore::HTMLConstructionSite::createElementAndAttachToCurrent): 53 (WebCore::HTMLConstructionSite::insertHTMLHtmlElement): 54 (WebCore::HTMLConstructionSite::insertHTMLHeadElement): 55 (WebCore::HTMLConstructionSite::insertHTMLBodyElement): 56 (WebCore::HTMLConstructionSite::insertElement): 57 (WebCore::HTMLConstructionSite::insertSelfClosingElement): 58 (WebCore::HTMLConstructionSite::insertFormattingElement): 59 (WebCore::HTMLTreeBuilder::processGenericRCDATAStartTag): 60 (WebCore::HTMLTreeBuilder::processGenericRawTextStartTag): 61 (WebCore::HTMLConstructionSite::insertScriptElement): 62 (WebCore::HTMLTreeBuilder::processScriptStartTag): 63 (WebCore::HTMLConstructionSite::insertTextNode): 64 (WebCore::HTMLConstructionSite::createElement): 65 (WebCore::HTMLTreeBuilder::indexOfFirstUnopenFormattingElement): 66 (WebCore::HTMLTreeBuilder::reconstructTheActiveFormattingElements): 67 (WebCore::HTMLTreeBuilder::generateImpliedEndTagsWithExclusion): 68 (WebCore::HTMLTreeBuilder::generateImpliedEndTags): 69 * html/HTMLTreeBuilder.h: 70 (WebCore::HTMLConstructionSite::currentElement): 71 (WebCore::HTMLConstructionSite::openElements): 72 (WebCore::HTMLConstructionSite::activeFormattingElements): 73 (WebCore::HTMLConstructionSite::head): 74 (WebCore::HTMLConstructionSite::form): 75 (WebCore::HTMLConstructionSite::releaseForm): 76 (WebCore::HTMLConstructionSite::setForm): 77 (WebCore::HTMLConstructionSite::fragmentScriptingPermission): 78 (WebCore::HTMLConstructionSite::attach): 79 1 80 2010-07-06 Gustavo Noronha Silva <gustavo.noronha@collabora.co.uk> 2 81 -
trunk/WebCore/html/HTMLFormattingElementList.h
r62537 r62599 103 103 void clearToLastMarker(); 104 104 105 const Entry& operator[](size_t i) const { return m_entries[i]; }106 Entry& operator[](size_t i) { return m_entries[i]; }105 const Entry& at(size_t i) const { return m_entries[i]; } 106 Entry& at(size_t i) { return m_entries[i]; } 107 107 108 108 private: -
trunk/WebCore/html/HTMLTreeBuilder.cpp
r62593 r62599 21 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 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. 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 24 */ 25 25 … … 208 208 : m_framesetOk(true) 209 209 , m_document(document) 210 , m_tree(document, FragmentScriptingAllowed) 210 211 , m_reportErrors(reportErrors) 211 212 , m_isPaused(false) … … 227 228 : m_framesetOk(true) 228 229 , m_document(fragment->document()) 230 , m_tree(fragment->document(), scriptingPermission) 229 231 , m_reportErrors(false) // FIXME: Why not report errors in fragments? 230 232 , m_isPaused(false) … … 238 240 , m_fragmentScriptingPermission(scriptingPermission) 239 241 , m_isParsingFragment(true) 242 { 243 } 244 245 template<typename ChildType> 246 PassRefPtr<ChildType> HTMLConstructionSite::attach(Node* parent, PassRefPtr<ChildType> prpChild) 247 { 248 RefPtr<ChildType> child = prpChild; 249 parent->parserAddChild(child); 250 // It's slightly unfortunate that we need to hold a reference to child 251 // here to call attach(). We should investigate whether we can rely on 252 // |parent| to hold a ref at this point. In the common case (at least 253 // for elements), however, we'll get to use this ref in the stack of 254 // open elements. 255 child->attach(); 256 return child.release(); 257 } 258 259 HTMLConstructionSite::HTMLConstructionSite(Document* document, FragmentScriptingPermission scriptingPermission) 260 : m_document(document) 261 , m_fragmentScriptingPermission(scriptingPermission) 240 262 { 241 263 } … … 418 440 ASSERT(token.type() == HTMLToken::DOCTYPE); 419 441 if (insertionMode() == InitialMode) { 420 insertDoctype(token);442 m_tree.insertDoctype(token); 421 443 return; 422 444 } … … 424 446 } 425 447 426 void HTML TreeBuilder::insertHTMLStartTagBeforeHTML(AtomicHTMLToken& token)448 void HTMLConstructionSite::insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken& token) 427 449 { 428 450 RefPtr<Element> element = HTMLHtmlElement::create(m_document); … … 431 453 } 432 454 433 void HTML TreeBuilder::mergeAttributesFromTokenIntoElement(AtomicHTMLToken& token, Element* element)455 void HTMLConstructionSite::mergeAttributesFromTokenIntoElement(AtomicHTMLToken& token, Element* element) 434 456 { 435 457 if (!token.attributes()) … … 444 466 } 445 467 446 void HTML TreeBuilder::insertHTMLStartTagInBody(AtomicHTMLToken& token)447 { 448 parseError(token);468 void HTMLConstructionSite::insertHTMLHtmlStartTagInBody(AtomicHTMLToken& token) 469 { 470 // FIXME: parse error 449 471 mergeAttributesFromTokenIntoElement(token, m_openElements.htmlElement()); 472 } 473 474 void HTMLConstructionSite::insertHTMLBodyStartTagInBody(AtomicHTMLToken& token) 475 { 476 // FIXME: parse error 477 notImplemented(); // fragment case 478 mergeAttributesFromTokenIntoElement(token, m_openElements.bodyElement()); 450 479 } 451 480 … … 472 501 void HTMLTreeBuilder::processFakePEndTagIfPInScope() 473 502 { 474 if (!m_ openElements.inScope(pTag.localName()))503 if (!m_tree.openElements()->inScope(pTag.localName())) 475 504 return; 476 505 AtomicHTMLToken endP(HTMLToken::EndTag, pTag.localName()); … … 499 528 ASSERT(token.name() == isindexTag); 500 529 parseError(token); 501 if (m_ formElement)530 if (m_tree.form()) 502 531 return; 503 532 notImplemented(); // Acknowledge self-closing flag … … 505 534 Attribute* actionAttribute = token.getAttributeItem(actionAttr); 506 535 if (actionAttribute) { 507 ASSERT( currentElement()->hasTagName(formTag));508 currentElement()->setAttribute(actionAttr, actionAttribute->value());536 ASSERT(m_tree.currentElement()->hasTagName(formTag)); 537 m_tree.currentElement()->setAttribute(actionAttr, actionAttribute->value()); 509 538 } 510 539 processFakeStartTag(hrTag); … … 526 555 ASSERT(token.type() == HTMLToken::StartTag); 527 556 if (token.name() == htmlTag) { 528 insertHTMLStartTagInBody(token);557 m_tree.insertHTMLHtmlStartTagInBody(token); 529 558 return; 530 559 } … … 535 564 } 536 565 if (token.name() == bodyTag) { 537 parseError(token); 538 notImplemented(); // fragment case 539 mergeAttributesFromTokenIntoElement(token, m_openElements.bodyElement()); 566 m_tree.insertHTMLBodyStartTagInBody(token); 540 567 return; 541 568 } … … 546 573 return; 547 574 ExceptionCode ec = 0; 548 m_ openElements.bodyElement()->remove(ec);575 m_tree.openElements()->bodyElement()->remove(ec); 549 576 ASSERT(!ec); 550 m_ openElements.popUntil(m_openElements.bodyElement());551 m_ openElements.popHTMLBodyElement();552 ASSERT(m_ openElements.top() == m_openElements.htmlElement());553 insertElement(token);577 m_tree.openElements()->popUntil(m_tree.openElements()->bodyElement()); 578 m_tree.openElements()->popHTMLBodyElement(); 579 ASSERT(m_tree.openElements()->top() == m_tree.openElements()->htmlElement()); 580 m_tree.insertElement(token); 554 581 m_insertionMode = InFramesetMode; 555 582 return; … … 557 584 if (token.name() == addressTag || token.name() == articleTag || token.name() == asideTag || token.name() == blockquoteTag || token.name() == centerTag || token.name() == "details" || token.name() == dirTag || token.name() == divTag || token.name() == dlTag || token.name() == fieldsetTag || token.name() == "figure" || token.name() == footerTag || token.name() == headerTag || token.name() == hgroupTag || token.name() == menuTag || token.name() == navTag || token.name() == olTag || token.name() == pTag || token.name() == sectionTag || token.name() == ulTag) { 558 585 processFakePEndTagIfPInScope(); 559 insertElement(token);586 m_tree.insertElement(token); 560 587 return; 561 588 } 562 589 if (isNumberedHeaderTag(token.name())) { 563 590 processFakePEndTagIfPInScope(); 564 if (isNumberedHeaderTag( currentElement()->localName())) {565 parseError(token); 566 m_ openElements.pop();567 } 568 insertElement(token);591 if (isNumberedHeaderTag(m_tree.currentElement()->localName())) { 592 parseError(token); 593 m_tree.openElements()->pop(); 594 } 595 m_tree.insertElement(token); 569 596 return; 570 597 } 571 598 if (token.name() == preTag || token.name() == listingTag) { 572 599 processFakePEndTagIfPInScope(); 573 insertElement(token);600 m_tree.insertElement(token); 574 601 m_tokenizer->skipLeadingNewLineForListing(); 575 602 m_framesetOk = false; … … 579 606 notImplemented(); 580 607 processFakePEndTagIfPInScope(); 581 insertElement(token);582 m_ formElement = currentElement();608 m_tree.insertElement(token); 609 m_tree.setForm(m_tree.currentElement()); 583 610 return; 584 611 } … … 586 613 notImplemented(); 587 614 processFakePEndTagIfPInScope(); 588 insertElement(token);615 m_tree.insertElement(token); 589 616 return; 590 617 } … … 592 619 notImplemented(); 593 620 processFakePEndTagIfPInScope(); 594 insertElement(token);621 m_tree.insertElement(token); 595 622 return; 596 623 } 597 624 if (token.name() == plaintextTag) { 598 625 processFakePEndTagIfPInScope(); 599 insertElement(token);626 m_tree.insertElement(token); 600 627 m_tokenizer->setState(HTMLTokenizer::PLAINTEXTState); 601 628 return; … … 603 630 if (token.name() == buttonTag) { 604 631 notImplemented(); 605 reconstructTheActiveFormattingElements();606 insertElement(token);632 m_tree.reconstructTheActiveFormattingElements(); 633 m_tree.insertElement(token); 607 634 m_framesetOk = false; 608 635 return; 609 636 } 610 637 if (token.name() == aTag) { 611 Element* activeATag = m_ activeFormattingElements.closestElementInScopeWithName(aTag.localName());638 Element* activeATag = m_tree.activeFormattingElements()->closestElementInScopeWithName(aTag.localName()); 612 639 if (activeATag) { 613 640 parseError(token); 614 641 processFakeEndTag(aTag); 615 m_ activeFormattingElements.remove(activeATag);616 if (m_ openElements.contains(activeATag))617 m_ openElements.remove(activeATag);618 } 619 reconstructTheActiveFormattingElements();620 insertFormattingElement(token);642 m_tree.activeFormattingElements()->remove(activeATag); 643 if (m_tree.openElements()->contains(activeATag)) 644 m_tree.openElements()->remove(activeATag); 645 } 646 m_tree.reconstructTheActiveFormattingElements(); 647 m_tree.insertFormattingElement(token); 621 648 return; 622 649 } 623 650 if (isNonAnchorFormattingTag(token.name())) { 624 reconstructTheActiveFormattingElements();625 insertFormattingElement(token);651 m_tree.reconstructTheActiveFormattingElements(); 652 m_tree.insertFormattingElement(token); 626 653 return; 627 654 } 628 655 if (token.name() == nobrTag) { 629 reconstructTheActiveFormattingElements();630 notImplemented(); 631 insertFormattingElement(token);656 m_tree.reconstructTheActiveFormattingElements(); 657 notImplemented(); 658 m_tree.insertFormattingElement(token); 632 659 return; 633 660 } 634 661 if (token.name() == appletTag || token.name() == marqueeTag || token.name() == objectTag) { 635 reconstructTheActiveFormattingElements();636 insertElement(token);637 m_ activeFormattingElements.appendMarker();662 m_tree.reconstructTheActiveFormattingElements(); 663 m_tree.insertElement(token); 664 m_tree.activeFormattingElements()->appendMarker(); 638 665 m_framesetOk = false; 639 666 return; … … 641 668 if (token.name() == tableTag) { 642 669 notImplemented(); 643 insertElement(token);670 m_tree.insertElement(token); 644 671 m_framesetOk = false; 645 672 m_insertionMode = InTableMode; … … 653 680 } 654 681 if (token.name() == areaTag || token.name() == basefontTag || token.name() == "bgsound" || token.name() == brTag || token.name() == embedTag || token.name() == imgTag || token.name() == inputTag || token.name() == keygenTag || token.name() == wbrTag) { 655 reconstructTheActiveFormattingElements();656 insertSelfClosingElement(token);682 m_tree.reconstructTheActiveFormattingElements(); 683 m_tree.insertSelfClosingElement(token); 657 684 m_framesetOk = false; 658 685 return; 659 686 } 660 687 if (token.name() == paramTag || token.name() == sourceTag || token.name() == "track") { 661 insertSelfClosingElement(token);688 m_tree.insertSelfClosingElement(token); 662 689 return; 663 690 } 664 691 if (token.name() == hrTag) { 665 692 processFakePEndTagIfPInScope(); 666 insertSelfClosingElement(token);693 m_tree.insertSelfClosingElement(token); 667 694 m_framesetOk = false; 668 695 return; … … 673 700 } 674 701 if (token.name() == textareaTag) { 675 insertElement(token);702 m_tree.insertElement(token); 676 703 m_tokenizer->skipLeadingNewLineForListing(); 677 704 m_tokenizer->setState(HTMLTokenizer::RCDATAState); … … 683 710 if (token.name() == xmpTag) { 684 711 processFakePEndTagIfPInScope(); 685 reconstructTheActiveFormattingElements();712 m_tree.reconstructTheActiveFormattingElements(); 686 713 m_framesetOk = false; 687 insertGenericRawTextElement(token);714 processGenericRawTextStartTag(token); 688 715 return; 689 716 } 690 717 if (token.name() == iframeTag) { 691 718 m_framesetOk = false; 692 insertGenericRawTextElement(token);719 processGenericRawTextStartTag(token); 693 720 return; 694 721 } 695 722 if (token.name() == noembedTag) { 696 insertGenericRawTextElement(token);723 processGenericRawTextStartTag(token); 697 724 return; 698 725 } 699 726 if (token.name() == noscriptTag && isScriptingFlagEnabled(m_document->frame())) { 700 insertGenericRawTextElement(token);727 processGenericRawTextStartTag(token); 701 728 return; 702 729 } 703 730 if (token.name() == selectTag) { 704 reconstructTheActiveFormattingElements();705 insertElement(token);731 m_tree.reconstructTheActiveFormattingElements(); 732 m_tree.insertElement(token); 706 733 m_framesetOk = false; 707 734 if (m_insertionMode == InTableMode || m_insertionMode == InCaptionMode || m_insertionMode == InColumnGroupMode || m_insertionMode == InTableBodyMode || m_insertionMode == InRowMode || m_insertionMode == InCellMode) … … 712 739 } 713 740 if (token.name() == optgroupTag || token.name() == optionTag) { 714 if (m_ openElements.inScope(optionTag.localName())) {741 if (m_tree.openElements()->inScope(optionTag.localName())) { 715 742 AtomicHTMLToken endOption(HTMLToken::EndTag, optionTag.localName()); 716 743 processEndTag(endOption); 717 744 } 718 reconstructTheActiveFormattingElements();719 insertElement(token);745 m_tree.reconstructTheActiveFormattingElements(); 746 m_tree.insertElement(token); 720 747 return; 721 748 } 722 749 if (token.name() == rpTag || token.name() == rtTag) { 723 if (m_ openElements.inScope(rubyTag.localName())) {724 generateImpliedEndTags();725 if (! currentElement()->hasTagName(rubyTag)) {750 if (m_tree.openElements()->inScope(rubyTag.localName())) { 751 m_tree.generateImpliedEndTags(); 752 if (!m_tree.currentElement()->hasTagName(rubyTag)) { 726 753 parseError(token); 727 m_ openElements.popUntil(rubyTag.localName());754 m_tree.openElements()->popUntil(rubyTag.localName()); 728 755 } 729 756 } 730 insertElement(token);757 m_tree.insertElement(token); 731 758 return; 732 759 } … … 743 770 return; 744 771 } 745 reconstructTheActiveFormattingElements();746 insertElement(token);772 m_tree.reconstructTheActiveFormattingElements(); 773 m_tree.insertElement(token); 747 774 } 748 775 749 776 bool HTMLTreeBuilder::processColgroupEndTagForInColumnGroup() 750 777 { 751 if ( currentElement() == m_openElements.htmlElement()) {778 if (m_tree.currentElement() == m_tree.openElements()->htmlElement()) { 752 779 ASSERT(m_isParsingFragment); 753 780 // FIXME: parse error 754 781 return false; 755 782 } 756 m_ openElements.pop();783 m_tree.openElements()->pop(); 757 784 m_insertionMode = InTableMode; 758 785 return true; … … 763 790 { 764 791 ASSERT(insertionMode() == InCellMode); 765 if (m_ openElements.inScope(tdTag)) {766 ASSERT(!m_ openElements.inScope(thTag));792 if (m_tree.openElements()->inScope(tdTag)) { 793 ASSERT(!m_tree.openElements()->inScope(thTag)); 767 794 processFakeEndTag(tdTag); 768 795 return; 769 796 } 770 ASSERT(m_ openElements.inScope(thTag));797 ASSERT(m_tree.openElements()->inScope(thTag)); 771 798 processFakeEndTag(thTag); 772 799 ASSERT(insertionMode() == InRowMode); … … 777 804 ASSERT(token.type() == HTMLToken::StartTag); 778 805 if (token.name() == captionTag) { 779 m_ openElements.popUntilTableScopeMarker();780 m_ activeFormattingElements.appendMarker();781 insertElement(token);806 m_tree.openElements()->popUntilTableScopeMarker(); 807 m_tree.activeFormattingElements()->appendMarker(); 808 m_tree.insertElement(token); 782 809 m_insertionMode = InCaptionMode; 783 810 return; 784 811 } 785 812 if (token.name() == colgroupTag) { 786 m_ openElements.popUntilTableScopeMarker();787 insertElement(token);813 m_tree.openElements()->popUntilTableScopeMarker(); 814 m_tree.insertElement(token); 788 815 m_insertionMode = InColumnGroupMode; 789 816 return; … … 796 823 } 797 824 if (isTableBodyContextTag(token.name())) { 798 m_ openElements.popUntilTableScopeMarker();799 insertElement(token);825 m_tree.openElements()->popUntilTableScopeMarker(); 826 m_tree.insertElement(token); 800 827 m_insertionMode = InTableBodyMode; 801 828 return; … … 821 848 if (token.name() == formTag) { 822 849 parseError(token); 823 if (m_ formElement)824 return; 825 insertSelfClosingElement(token);850 if (m_tree.form()) 851 return; 852 m_tree.insertSelfClosingElement(token); 826 853 return; 827 854 } 828 855 parseError(token); 829 if ( currentElement()->hasTagName(tableTag) || isTableBodyContextTag(currentElement()->localName()) ||currentElement()->hasTagName(trTag))856 if (m_tree.currentElement()->hasTagName(tableTag) || isTableBodyContextTag(m_tree.currentElement()->localName()) || m_tree.currentElement()->hasTagName(trTag)) 830 857 notImplemented(); // "whenever a node would be inserted into the current node, it must instead be foster parented." 831 858 processStartTagForInBody(token); … … 843 870 ASSERT(insertionMode() == BeforeHTMLMode); 844 871 if (token.name() == htmlTag) { 845 insertHTMLStartTagBeforeHTML(token);872 m_tree.insertHTMLHtmlStartTagBeforeHTML(token); 846 873 setInsertionMode(BeforeHeadMode); 847 874 return; … … 852 879 ASSERT(insertionMode() == BeforeHeadMode); 853 880 if (token.name() == htmlTag) { 854 insertHTMLStartTagInBody(token);881 m_tree.insertHTMLHtmlStartTagInBody(token); 855 882 return; 856 883 } 857 884 if (token.name() == headTag) { 858 insertHTMLHeadElement(token);885 m_tree.insertHTMLHeadElement(token); 859 886 setInsertionMode(InHeadMode); 860 887 return; … … 871 898 ASSERT(insertionMode() == AfterHeadMode); 872 899 if (token.name() == htmlTag) { 873 insertHTMLStartTagInBody(token);900 m_tree.insertHTMLHtmlStartTagInBody(token); 874 901 return; 875 902 } 876 903 if (token.name() == bodyTag) { 877 904 m_framesetOk = false; 878 insertHTMLBodyElement(token);905 m_tree.insertHTMLBodyElement(token); 879 906 m_insertionMode = InBodyMode; 880 907 return; 881 908 } 882 909 if (token.name() == framesetTag) { 883 insertElement(token);910 m_tree.insertElement(token); 884 911 setInsertionMode(InFramesetMode); 885 912 return; … … 887 914 if (token.name() == baseTag || token.name() == linkTag || token.name() == metaTag || token.name() == noframesTag || token.name() == scriptTag || token.name() == styleTag || token.name() == titleTag) { 888 915 parseError(token); 889 ASSERT(m_ headElement);890 m_ openElements.pushHTMLHeadElement(m_headElement);916 ASSERT(m_tree.head()); 917 m_tree.openElements()->pushHTMLHeadElement(m_tree.head()); 891 918 processStartTagForInHead(token); 892 m_ openElements.removeHTMLHeadElement(m_headElement.get());919 m_tree.openElements()->removeHTMLHeadElement(m_tree.head()); 893 920 return; 894 921 } … … 923 950 ASSERT(insertionMode() == InColumnGroupMode); 924 951 if (token.name() == htmlTag) { 925 insertHTMLStartTagInBody(token);952 m_tree.insertHTMLHtmlStartTagInBody(token); 926 953 return; 927 954 } 928 955 if (token.name() == colTag) { 929 insertSelfClosingElement(token);956 m_tree.insertSelfClosingElement(token); 930 957 return; 931 958 } … … 939 966 ASSERT(insertionMode() == InTableBodyMode); 940 967 if (token.name() == trTag) { 941 m_ openElements.popUntilTableBodyScopeMarker(); // How is there ever anything to pop?942 insertElement(token);968 m_tree.openElements()->popUntilTableBodyScopeMarker(); // How is there ever anything to pop? 969 m_tree.insertElement(token); 943 970 m_insertionMode = InRowMode; 944 971 return; … … 953 980 if (token.name() == captionTag || token.name() == colTag || token.name() == colgroupTag || isTableBodyContextTag(token.name())) { 954 981 // FIXME: This is slow. 955 if (!m_ openElements.inTableScope(tbodyTag.localName()) && !m_openElements.inTableScope(theadTag.localName()) && !m_openElements.inTableScope(tfootTag.localName())) {982 if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) { 956 983 ASSERT(m_isParsingFragment); 957 984 parseError(token); 958 985 return; 959 986 } 960 m_ openElements.popUntilTableBodyScopeMarker();961 ASSERT(isTableBodyContextTag( currentElement()->localName()));962 processFakeEndTag( currentElement()->tagQName());987 m_tree.openElements()->popUntilTableBodyScopeMarker(); 988 ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName())); 989 processFakeEndTag(m_tree.currentElement()->tagQName()); 963 990 processStartTag(token); 964 991 return; … … 969 996 ASSERT(insertionMode() == InRowMode); 970 997 if (token.name() == thTag || token.name() == tdTag) { 971 m_ openElements.popUntilTableRowScopeMarker();972 insertElement(token);998 m_tree.openElements()->popUntilTableRowScopeMarker(); 999 m_tree.insertElement(token); 973 1000 m_insertionMode = InCellMode; 974 m_ activeFormattingElements.appendMarker();1001 m_tree.activeFormattingElements()->appendMarker(); 975 1002 } 976 1003 if (token.name() == captionTag || token.name() == colTag || token.name() == colgroupTag || isTableBodyContextTag(token.name())) { … … 989 1016 if (token.name() == captionTag || token.name() == colTag || token.name() == colgroupTag || token.name() == thTag || token.name() == tdTag || isTableBodyContextTag(token.name())) { 990 1017 // FIXME: This could be more efficient. 991 if (!m_ openElements.inTableScope(tdTag) || !m_openElements.inTableScope(thTag)) {1018 if (!m_tree.openElements()->inTableScope(tdTag) || !m_tree.openElements()->inTableScope(thTag)) { 992 1019 parseError(token); 993 1020 return; … … 1002 1029 ASSERT(insertionMode() == AfterBodyMode || insertionMode() == AfterAfterBodyMode); 1003 1030 if (token.name() == htmlTag) { 1004 insertHTMLStartTagInBody(token);1031 m_tree.insertHTMLHtmlStartTagInBody(token); 1005 1032 return; 1006 1033 } … … 1011 1038 ASSERT(insertionMode() == InHeadNoscriptMode); 1012 1039 if (token.name() == htmlTag) { 1013 insertHTMLStartTagInBody(token);1040 m_tree.insertHTMLHtmlStartTagInBody(token); 1014 1041 return; 1015 1042 } … … 1029 1056 ASSERT(insertionMode() == InFramesetMode); 1030 1057 if (token.name() == htmlTag) { 1031 insertHTMLStartTagInBody(token);1058 m_tree.insertHTMLHtmlStartTagInBody(token); 1032 1059 return; 1033 1060 } 1034 1061 if (token.name() == framesetTag) { 1035 insertElement(token);1062 m_tree.insertElement(token); 1036 1063 return; 1037 1064 } 1038 1065 if (token.name() == frameTag) { 1039 insertSelfClosingElement(token);1066 m_tree.insertSelfClosingElement(token); 1040 1067 return; 1041 1068 } … … 1050 1077 ASSERT(insertionMode() == AfterFramesetMode || insertionMode() == AfterAfterFramesetMode); 1051 1078 if (token.name() == htmlTag) { 1052 insertHTMLStartTagInBody(token);1079 m_tree.insertHTMLHtmlStartTagInBody(token); 1053 1080 return; 1054 1081 } … … 1072 1099 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); 1073 1100 if (token.name() == htmlTag) { 1074 insertHTMLStartTagInBody(token);1101 m_tree.insertHTMLHtmlStartTagInBody(token); 1075 1102 return; 1076 1103 } 1077 1104 if (token.name() == optionTag) { 1078 if ( currentElement()->hasTagName(optionTag)) {1105 if (m_tree.currentElement()->hasTagName(optionTag)) { 1079 1106 AtomicHTMLToken endOption(HTMLToken::EndTag, optionTag.localName()); 1080 1107 processEndTag(endOption); 1081 1108 } 1082 insertElement(token);1109 m_tree.insertElement(token); 1083 1110 return; 1084 1111 } 1085 1112 if (token.name() == optgroupTag) { 1086 if ( currentElement()->hasTagName(optionTag)) {1113 if (m_tree.currentElement()->hasTagName(optionTag)) { 1087 1114 AtomicHTMLToken endOption(HTMLToken::EndTag, optionTag.localName()); 1088 1115 processEndTag(endOption); 1089 1116 } 1090 if ( currentElement()->hasTagName(optgroupTag)) {1117 if (m_tree.currentElement()->hasTagName(optgroupTag)) { 1091 1118 AtomicHTMLToken endOptgroup(HTMLToken::EndTag, optgroupTag.localName()); 1092 1119 processEndTag(endOptgroup); 1093 1120 } 1094 insertElement(token);1121 m_tree.insertElement(token); 1095 1122 return; 1096 1123 } … … 1127 1154 ASSERT(token.type() == HTMLToken::EndTag); 1128 1155 ASSERT(token.name() == bodyTag); 1129 if (!m_ openElements.inScope(bodyTag.localName())) {1156 if (!m_tree.openElements()->inScope(bodyTag.localName())) { 1130 1157 parseError(token); 1131 1158 return false; … … 1139 1166 { 1140 1167 ASSERT(token.type() == HTMLToken::EndTag); 1141 HTMLElementStack::ElementRecord* record = m_ openElements.topRecord();1168 HTMLElementStack::ElementRecord* record = m_tree.openElements()->topRecord(); 1142 1169 while (1) { 1143 1170 Element* node = record->element(); 1144 1171 if (node->hasLocalName(token.name())) { 1145 generateImpliedEndTags();1146 if (! currentElement()->hasLocalName(token.name())) {1172 m_tree.generateImpliedEndTags(); 1173 if (!m_tree.currentElement()->hasLocalName(token.name())) { 1147 1174 parseError(token); 1148 1175 // FIXME: This is either a bug in the spec, or a bug in our … … 1151 1178 // We might have already popped the node for the token in 1152 1179 // generateImpliedEndTags, just abort. 1153 if (!m_ openElements.contains(node))1180 if (!m_tree.openElements()->contains(node)) 1154 1181 return; 1155 1182 } 1156 m_ openElements.popUntil(node);1157 m_ openElements.pop();1183 m_tree.openElements()->popUntil(node); 1184 m_tree.openElements()->pop(); 1158 1185 return; 1159 1186 } … … 1172 1199 { 1173 1200 HTMLElementStack::ElementRecord* furthestBlock = 0; 1174 HTMLElementStack::ElementRecord* record = m_ openElements.topRecord();1201 HTMLElementStack::ElementRecord* record = m_tree.openElements()->topRecord(); 1175 1202 for (; record; record = record->next()) { 1176 1203 if (record->element() == formattingElement) … … 1188 1215 { 1189 1216 Element* fosterParentElement = 0; 1190 HTMLElementStack::ElementRecord* lastTableElementRecord = m_ openElements.topmost(tableTag.localName());1217 HTMLElementStack::ElementRecord* lastTableElementRecord = m_tree.openElements()->topmost(tableTag.localName()); 1191 1218 if (lastTableElementRecord) { 1192 1219 Element* lastTableElement = lastTableElementRecord->element(); … … 1201 1228 } else { 1202 1229 ASSERT(m_isParsingFragment); 1203 fosterParentElement = m_ openElements.bottom(); // <html> element1230 fosterParentElement = m_tree.openElements()->bottom(); // <html> element 1204 1231 } 1205 1232 … … 1226 1253 while (1) { 1227 1254 // 1. 1228 Element* formattingElement = m_ activeFormattingElements.closestElementInScopeWithName(token.name());1229 if (!formattingElement || !m_ openElements.inScope(formattingElement)) {1255 Element* formattingElement = m_tree.activeFormattingElements()->closestElementInScopeWithName(token.name()); 1256 if (!formattingElement || !m_tree.openElements()->inScope(formattingElement)) { 1230 1257 parseError(token); 1231 1258 notImplemented(); // Check the stack of open elements for a more specific parse error. 1232 1259 return; 1233 1260 } 1234 HTMLElementStack::ElementRecord* formattingElementRecord = m_ openElements.find(formattingElement);1261 HTMLElementStack::ElementRecord* formattingElementRecord = m_tree.openElements()->find(formattingElement); 1235 1262 if (!formattingElementRecord) { 1236 1263 parseError(token); 1237 m_ activeFormattingElements.remove(formattingElement);1238 return; 1239 } 1240 if (formattingElement != currentElement())1264 m_tree.activeFormattingElements()->remove(formattingElement); 1265 return; 1266 } 1267 if (formattingElement != m_tree.currentElement()) 1241 1268 parseError(token); 1242 1269 // 2. … … 1244 1271 // 3. 1245 1272 if (!furthestBlock) { 1246 m_ openElements.popUntil(formattingElement);1247 m_ openElements.pop();1248 m_ activeFormattingElements.remove(formattingElement);1273 m_tree.openElements()->popUntil(formattingElement); 1274 m_tree.openElements()->pop(); 1275 m_tree.activeFormattingElements()->remove(formattingElement); 1249 1276 return; 1250 1277 } … … 1253 1280 Element* commonAncestor = formattingElementRecord->next()->element(); 1254 1281 // 5. 1255 HTMLFormattingElementList::Bookmark bookmark = m_ activeFormattingElements.bookmarkFor(formattingElement);1282 HTMLFormattingElementList::Bookmark bookmark = m_tree.activeFormattingElements()->bookmarkFor(formattingElement); 1256 1283 // 6. 1257 1284 HTMLElementStack::ElementRecord* node = furthestBlock; … … 1264 1291 nextNode = node->next(); // Save node->next() for the next iteration in case node is deleted in 6.2. 1265 1292 // 6.2 1266 if (!m_ activeFormattingElements.contains(node->element())) {1267 m_ openElements.remove(node->element());1293 if (!m_tree.activeFormattingElements()->contains(node->element())) { 1294 m_tree.openElements()->remove(node->element()); 1268 1295 node = 0; 1269 1296 continue; … … 1277 1304 // Is createElement correct? (instead of insertElement) 1278 1305 // Does this code ever leave newElement unattached? 1279 RefPtr<Element> newElement = createElement(fakeToken);1280 HTMLFormattingElementList::Entry* nodeEntry = m_ activeFormattingElements.find(node->element());1306 RefPtr<Element> newElement = m_tree.createElement(fakeToken); 1307 HTMLFormattingElementList::Entry* nodeEntry = m_tree.activeFormattingElements()->find(node->element()); 1281 1308 nodeEntry->replaceElement(newElement.get()); 1282 1309 node->replaceElement(newElement.release()); … … 1308 1335 // FIXME: We're supposed to save the original token in the entry. 1309 1336 AtomicHTMLToken fakeToken(HTMLToken::StartTag, formattingElement->localName()); 1310 RefPtr<Element> newElement = createElement(fakeToken);1337 RefPtr<Element> newElement = m_tree.createElement(fakeToken); 1311 1338 // 9 1312 1339 reparentChildren(furthestBlock->element(), newElement.get()); … … 1314 1341 furthestBlock->element()->parserAddChild(newElement); 1315 1342 // 11 1316 m_ activeFormattingElements.remove(formattingElement);1317 m_ activeFormattingElements.insertAt(newElement.get(), bookmark);1343 m_tree.activeFormattingElements()->remove(formattingElement); 1344 m_tree.activeFormattingElements()->insertAt(newElement.get(), bookmark); 1318 1345 // 12 1319 m_ openElements.remove(formattingElement);1320 m_ openElements.insertAbove(newElement, furthestBlock);1346 m_tree.openElements()->remove(formattingElement); 1347 m_tree.openElements()->insertAbove(newElement, furthestBlock); 1321 1348 } 1322 1349 } … … 1336 1363 bool last = false; 1337 1364 bool foreign = false; 1338 HTMLElementStack::ElementRecord* nodeRecord = m_ openElements.topRecord();1365 HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord(); 1339 1366 while (1) { 1340 1367 Element* node = nodeRecord->element(); 1341 if (node == m_ openElements.bottom()) {1368 if (node == m_tree.openElements()->bottom()) { 1342 1369 ASSERT(m_isParsingFragment); 1343 1370 last = true; … … 1407 1434 } 1408 1435 if (token.name() == addressTag || token.name() == articleTag || token.name() == asideTag || token.name() == blockquoteTag || token.name() == buttonTag || token.name() == centerTag || token.name() == "details" || token.name() == dirTag || token.name() == divTag || token.name() == dlTag || token.name() == fieldsetTag || token.name() == "figure" || token.name() == footerTag || token.name() == headerTag || token.name() == hgroupTag || token.name() == listingTag || token.name() == menuTag || token.name() == navTag || token.name() == olTag || token.name() == preTag || token.name() == sectionTag || token.name() == ulTag) { 1409 if (!m_ openElements.inScope(token.name())) {1410 parseError(token); 1411 return; 1412 } 1413 generateImpliedEndTags();1414 if ( currentElement()->tagQName() != token.name())1415 parseError(token); 1416 m_ openElements.popUntil(token.name());1417 m_ openElements.pop();1436 if (!m_tree.openElements()->inScope(token.name())) { 1437 parseError(token); 1438 return; 1439 } 1440 m_tree.generateImpliedEndTags(); 1441 if (!m_tree.currentElement()->hasLocalName(token.name())) 1442 parseError(token); 1443 m_tree.openElements()->popUntil(token.name()); 1444 m_tree.openElements()->pop(); 1418 1445 } 1419 1446 if (token.name() == formTag) { 1420 RefPtr<Element> node = m_ formElement.release();1421 if (!node || !m_ openElements.inScope(node.get())) {1422 parseError(token); 1423 return; 1424 } 1425 generateImpliedEndTags();1426 if ( currentElement() != node.get())1427 parseError(token); 1428 m_ openElements.remove(node.get());1447 RefPtr<Element> node = m_tree.takeForm(); 1448 if (!node || !m_tree.openElements()->inScope(node.get())) { 1449 parseError(token); 1450 return; 1451 } 1452 m_tree.generateImpliedEndTags(); 1453 if (m_tree.currentElement() != node.get()) 1454 parseError(token); 1455 m_tree.openElements()->remove(node.get()); 1429 1456 } 1430 1457 if (token.name() == pTag) { 1431 if (!m_ openElements.inScope(token.name())) {1458 if (!m_tree.openElements()->inScope(token.name())) { 1432 1459 parseError(token); 1433 1460 processFakeStartTag(pTag); 1434 ASSERT(m_ openElements.inScope(token.name()));1461 ASSERT(m_tree.openElements()->inScope(token.name())); 1435 1462 processEndTag(token); 1436 1463 return; 1437 1464 } 1438 generateImpliedEndTagsWithExclusion(token.name());1439 if (! currentElement()->hasLocalName(token.name()))1440 parseError(token); 1441 m_ openElements.popUntil(token.name());1442 m_ openElements.pop();1465 m_tree.generateImpliedEndTagsWithExclusion(token.name()); 1466 if (!m_tree.currentElement()->hasLocalName(token.name())) 1467 parseError(token); 1468 m_tree.openElements()->popUntil(token.name()); 1469 m_tree.openElements()->pop(); 1443 1470 return; 1444 1471 } 1445 1472 if (token.name() == liTag) { 1446 if (!m_ openElements.inListItemScope(token.name())) {1447 parseError(token); 1448 return; 1449 } 1450 generateImpliedEndTagsWithExclusion(token.name());1451 if (! currentElement()->hasLocalName(token.name()))1452 parseError(token); 1453 m_ openElements.popUntil(token.name());1454 m_ openElements.pop();1473 if (!m_tree.openElements()->inListItemScope(token.name())) { 1474 parseError(token); 1475 return; 1476 } 1477 m_tree.generateImpliedEndTagsWithExclusion(token.name()); 1478 if (!m_tree.currentElement()->hasLocalName(token.name())) 1479 parseError(token); 1480 m_tree.openElements()->popUntil(token.name()); 1481 m_tree.openElements()->pop(); 1455 1482 return; 1456 1483 } 1457 1484 if (token.name() == ddTag || token.name() == dtTag) { 1458 if (!m_ openElements.inScope(token.name())) {1459 parseError(token); 1460 return; 1461 } 1462 generateImpliedEndTagsWithExclusion(token.name());1463 if (! currentElement()->hasLocalName(token.name()))1464 parseError(token); 1465 m_ openElements.popUntil(token.name());1466 m_ openElements.pop();1485 if (!m_tree.openElements()->inScope(token.name())) { 1486 parseError(token); 1487 return; 1488 } 1489 m_tree.generateImpliedEndTagsWithExclusion(token.name()); 1490 if (!m_tree.currentElement()->hasLocalName(token.name())) 1491 parseError(token); 1492 m_tree.openElements()->popUntil(token.name()); 1493 m_tree.openElements()->pop(); 1467 1494 return; 1468 1495 } 1469 1496 if (isNumberedHeaderTag(token.name())) { 1470 if (!m_ openElements.inScope(token.name())) {1471 parseError(token); 1472 return; 1473 } 1474 generateImpliedEndTags();1475 if (! currentElement()->hasLocalName(token.name()))1476 parseError(token); 1477 m_ openElements.popUntil(token.name());1478 m_ openElements.pop();1497 if (!m_tree.openElements()->inScope(token.name())) { 1498 parseError(token); 1499 return; 1500 } 1501 m_tree.generateImpliedEndTags(); 1502 if (!m_tree.currentElement()->hasLocalName(token.name())) 1503 parseError(token); 1504 m_tree.openElements()->popUntil(token.name()); 1505 m_tree.openElements()->pop(); 1479 1506 return; 1480 1507 } … … 1488 1515 } 1489 1516 if (token.name() == appletTag || token.name() == marqueeTag || token.name() == objectTag) { 1490 if (!m_ openElements.inScope(token.name())) {1491 parseError(token); 1492 return; 1493 } 1494 generateImpliedEndTags();1495 if ( currentElement()->tagQName() != token.name())1496 parseError(token); 1497 m_ openElements.popUntil(token.name());1498 m_ openElements.pop();1499 m_ activeFormattingElements.clearToLastMarker();1517 if (!m_tree.openElements()->inScope(token.name())) { 1518 parseError(token); 1519 return; 1520 } 1521 m_tree.generateImpliedEndTags(); 1522 if (!m_tree.currentElement()->hasLocalName(token.name())) 1523 parseError(token); 1524 m_tree.openElements()->popUntil(token.name()); 1525 m_tree.openElements()->pop(); 1526 m_tree.activeFormattingElements()->clearToLastMarker(); 1500 1527 return; 1501 1528 } 1502 1529 if (token.name() == brTag) { 1503 1530 parseError(token); 1504 reconstructTheActiveFormattingElements();1531 m_tree.reconstructTheActiveFormattingElements(); 1505 1532 // Notice that we lose the attributes. 1506 1533 AtomicHTMLToken startBr(HTMLToken::StartTag, token.name()); 1507 insertSelfClosingElement(startBr);1534 m_tree.insertSelfClosingElement(startBr); 1508 1535 m_framesetOk = false; 1509 1536 return; … … 1514 1541 bool HTMLTreeBuilder::processCaptionEndTagForInCaption() 1515 1542 { 1516 if (!m_ openElements.inTableScope(captionTag.localName())) {1543 if (!m_tree.openElements()->inTableScope(captionTag.localName())) { 1517 1544 ASSERT(m_isParsingFragment); 1518 1545 // FIXME: parse error 1519 1546 return false; 1520 1547 } 1521 generateImpliedEndTags();1522 // FIXME: parse error if (! currentElement()->hasTagName(captionTag))1523 m_ openElements.popUntil(captionTag.localName());1524 m_ openElements.pop();1525 m_ activeFormattingElements.clearToLastMarker();1548 m_tree.generateImpliedEndTags(); 1549 // FIXME: parse error if (!m_tree.currentElement()->hasTagName(captionTag)) 1550 m_tree.openElements()->popUntil(captionTag.localName()); 1551 m_tree.openElements()->pop(); 1552 m_tree.activeFormattingElements()->clearToLastMarker(); 1526 1553 m_insertionMode = InTableMode; 1527 1554 return true; … … 1530 1557 bool HTMLTreeBuilder::processTrEndTagForInRow() 1531 1558 { 1532 if (!m_ openElements.inTableScope(trTag.localName())) {1559 if (!m_tree.openElements()->inTableScope(trTag.localName())) { 1533 1560 ASSERT(m_isParsingFragment); 1534 1561 // FIXME: parse error 1535 1562 return false; 1536 1563 } 1537 m_ openElements.popUntilTableRowScopeMarker();1538 ASSERT( currentElement()->hasTagName(trTag));1539 m_ openElements.pop();1564 m_tree.openElements()->popUntilTableRowScopeMarker(); 1565 ASSERT(m_tree.currentElement()->hasTagName(trTag)); 1566 m_tree.openElements()->pop(); 1540 1567 m_insertionMode = InTableBodyMode; 1541 1568 return true; … … 1546 1573 ASSERT(token.type() == HTMLToken::EndTag); 1547 1574 if (token.name() == tableTag) { 1548 if (!m_ openElements.inTableScope(token.name())) {1575 if (!m_tree.openElements()->inTableScope(token.name())) { 1549 1576 ASSERT(m_isParsingFragment); 1550 1577 parseError(token); 1551 1578 return; 1552 1579 } 1553 m_ openElements.popUntil(tableTag.localName());1554 m_ openElements.pop();1580 m_tree.openElements()->popUntil(tableTag.localName()); 1581 m_tree.openElements()->pop(); 1555 1582 resetInsertionModeAppropriately(); 1556 1583 return; … … 1591 1618 ASSERT(insertionMode() == InHeadMode); 1592 1619 if (token.name() == headTag) { 1593 m_ openElements.popHTMLHeadElement();1620 m_tree.openElements()->popHTMLHeadElement(); 1594 1621 setInsertionMode(AfterHeadMode); 1595 1622 return; … … 1670 1697 } 1671 1698 if (isTableBodyContextTag(token.name())) { 1672 if (!m_ openElements.inTableScope(token.name())) {1699 if (!m_tree.openElements()->inTableScope(token.name())) { 1673 1700 parseError(token); 1674 1701 return; … … 1688 1715 ASSERT(insertionMode() == InCellMode); 1689 1716 if (token.name() == thTag || token.name() == tdTag) { 1690 if (!m_ openElements.inTableScope(token.name())) {1717 if (!m_tree.openElements()->inTableScope(token.name())) { 1691 1718 parseError(token); 1692 1719 return; 1693 1720 } 1694 generateImpliedEndTags();1695 if (! currentElement()->hasLocalName(token.name()))1721 m_tree.generateImpliedEndTags(); 1722 if (!m_tree.currentElement()->hasLocalName(token.name())) 1696 1723 parseError(token); 1697 m_ openElements.popUntil(token.name());1698 m_ openElements.pop();1699 m_ activeFormattingElements.clearToLastMarker();1724 m_tree.openElements()->popUntil(token.name()); 1725 m_tree.openElements()->pop(); 1726 m_tree.activeFormattingElements()->clearToLastMarker(); 1700 1727 m_insertionMode = InRowMode; 1701 ASSERT( currentElement()->hasTagName(trTag));1728 ASSERT(m_tree.currentElement()->hasTagName(trTag)); 1702 1729 return; 1703 1730 } … … 1707 1734 } 1708 1735 if (token.name() == tableTag || token.name() == trTag || isTableBodyContextTag(token.name())) { 1709 if (!m_ openElements.inTableScope(token.name())) {1736 if (!m_tree.openElements()->inTableScope(token.name())) { 1710 1737 ASSERT(m_isParsingFragment); 1711 1738 // FIXME: It is unclear what the exact ASSERT should be. … … 1723 1750 ASSERT(insertionMode() == InTableBodyMode); 1724 1751 if (isTableBodyContextTag(token.name())) { 1725 if (!m_ openElements.inTableScope(token.name())) {1752 if (!m_tree.openElements()->inTableScope(token.name())) { 1726 1753 parseError(token); 1727 1754 return; 1728 1755 } 1729 m_ openElements.popUntilTableBodyScopeMarker();1730 m_ openElements.pop();1756 m_tree.openElements()->popUntilTableBodyScopeMarker(); 1757 m_tree.openElements()->pop(); 1731 1758 m_insertionMode = InTableMode; 1732 1759 return; … … 1734 1761 if (token.name() == tableTag) { 1735 1762 // FIXME: This is slow. 1736 if (!m_ openElements.inTableScope(tbodyTag.localName()) && !m_openElements.inTableScope(theadTag.localName()) && !m_openElements.inTableScope(tfootTag.localName())) {1763 if (!m_tree.openElements()->inTableScope(tbodyTag.localName()) && !m_tree.openElements()->inTableScope(theadTag.localName()) && !m_tree.openElements()->inTableScope(tfootTag.localName())) { 1737 1764 ASSERT(m_isParsingFragment); 1738 1765 parseError(token); 1739 1766 return; 1740 1767 } 1741 m_ openElements.popUntilTableBodyScopeMarker();1742 ASSERT(isTableBodyContextTag( currentElement()->localName()));1743 processFakeEndTag( currentElement()->tagQName());1768 m_tree.openElements()->popUntilTableBodyScopeMarker(); 1769 ASSERT(isTableBodyContextTag(m_tree.currentElement()->localName())); 1770 processFakeEndTag(m_tree.currentElement()->tagQName()); 1744 1771 processEndTag(token); 1745 1772 return; … … 1771 1798 ASSERT(insertionMode() == InHeadNoscriptMode); 1772 1799 if (token.name() == noscriptTag) { 1773 ASSERT( currentElement()->tagQName() == noscriptTag);1774 m_ openElements.pop();1775 ASSERT( currentElement()->tagQName() == headTag);1800 ASSERT(m_tree.currentElement()->hasTagName(noscriptTag)); 1801 m_tree.openElements()->pop(); 1802 ASSERT(m_tree.currentElement()->hasTagName(headTag)); 1776 1803 setInsertionMode(InHeadMode); 1777 1804 return; … … 1788 1815 // Pause ourselves so that parsing stops until the script can be processed by the caller. 1789 1816 m_isPaused = true; 1790 ASSERT( currentElement()->tagQName() == scriptTag);1791 m_scriptToProcess = currentElement();1792 m_ openElements.pop();1817 ASSERT(m_tree.currentElement()->hasTagName(scriptTag)); 1818 m_scriptToProcess = m_tree.currentElement(); 1819 m_tree.openElements()->pop(); 1793 1820 m_insertionMode = m_originalInsertionMode; 1794 1821 return; 1795 1822 } 1796 m_ openElements.pop();1823 m_tree.openElements()->pop(); 1797 1824 m_insertionMode = m_originalInsertionMode; 1798 1825 break; … … 1800 1827 ASSERT(insertionMode() == InFramesetMode); 1801 1828 if (token.name() == framesetTag) { 1802 if ( currentElement() == m_openElements.htmlElement()) {1829 if (m_tree.currentElement() == m_tree.openElements()->htmlElement()) { 1803 1830 parseError(token); 1804 1831 return; 1805 1832 } 1806 m_ openElements.pop();1807 if (!m_isParsingFragment && ! currentElement()->hasTagName(framesetTag))1833 m_tree.openElements()->pop(); 1834 if (!m_isParsingFragment && !m_tree.currentElement()->hasTagName(framesetTag)) 1808 1835 m_insertionMode = AfterFramesetMode; 1809 1836 return; … … 1825 1852 if (token.name() == captionTag || token.name() == tableTag || isTableBodyContextTag(token.name()) || token.name() == trTag || token.name() == tdTag || token.name() == thTag) { 1826 1853 parseError(token); 1827 if (m_ openElements.inTableScope(token.name())) {1854 if (m_tree.openElements()->inTableScope(token.name())) { 1828 1855 AtomicHTMLToken endSelect(HTMLToken::EndTag, selectTag.localName()); 1829 1856 processEndTag(endSelect); … … 1836 1863 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); 1837 1864 if (token.name() == optgroupTag) { 1838 if ( currentElement()->hasTagName(optionTag))1865 if (m_tree.currentElement()->hasTagName(optionTag)) 1839 1866 notImplemented(); 1840 if ( currentElement()->hasTagName(optgroupTag)) {1841 m_ openElements.pop();1867 if (m_tree.currentElement()->hasTagName(optgroupTag)) { 1868 m_tree.openElements()->pop(); 1842 1869 return; 1843 1870 } … … 1846 1873 } 1847 1874 if (token.name() == optionTag) { 1848 if ( currentElement()->hasTagName(optionTag)) {1849 m_ openElements.pop();1875 if (m_tree.currentElement()->hasTagName(optionTag)) { 1876 m_tree.openElements()->pop(); 1850 1877 return; 1851 1878 } … … 1855 1882 if (token.name() == selectTag) { 1856 1883 notImplemented(); // fragment case 1857 m_ openElements.popUntil(selectTag.localName());1858 m_ openElements.pop();1884 m_tree.openElements()->popUntil(selectTag.localName()); 1885 m_tree.openElements()->pop(); 1859 1886 resetInsertionModeAppropriately(); 1860 1887 return; … … 1872 1899 ASSERT(token.type() == HTMLToken::Comment); 1873 1900 if (m_insertionMode == InitialMode || m_insertionMode == BeforeHTMLMode || m_insertionMode == AfterAfterBodyMode || m_insertionMode == AfterAfterFramesetMode) { 1874 insertCommentOnDocument(token);1901 m_tree.insertCommentOnDocument(token); 1875 1902 return; 1876 1903 } 1877 1904 if (m_insertionMode == AfterBodyMode) { 1878 insertCommentOnHTMLHtmlElement(token);1879 return; 1880 } 1881 insertComment(token);1905 m_tree.insertCommentOnHTMLHtmlElement(token); 1906 return; 1907 } 1908 m_tree.insertComment(token); 1882 1909 } 1883 1910 … … 1917 1944 ASSERT(insertionMode() == InBodyMode || insertionMode() == InCaptionMode || insertionMode() == InCellMode); 1918 1945 notImplemented(); 1919 insertTextNode(token);1946 m_tree.insertTextNode(token); 1920 1947 break; 1921 1948 case InTableMode: … … 1924 1951 ASSERT(insertionMode() == InTableMode || insertionMode() == InTableBodyMode || insertionMode() == InRowMode); 1925 1952 notImplemented(); // Crazy pending characters. 1926 insertTextNode(token);1953 m_tree.insertTextNode(token); 1927 1954 break; 1928 1955 case InColumnGroupMode: … … 1939 1966 case TextMode: 1940 1967 notImplemented(); 1941 insertTextNode(token);1968 m_tree.insertTextNode(token); 1942 1969 break; 1943 1970 case InHeadNoscriptMode: … … 1955 1982 case InSelectMode: 1956 1983 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode); 1957 insertTextNode(token);1984 m_tree.insertTextNode(token); 1958 1985 break; 1959 1986 case InTableTextMode: … … 2013 2040 case InSelectMode: 2014 2041 ASSERT(insertionMode() == InSelectMode || insertionMode() == InSelectInTableMode || insertionMode() == InTableMode || insertionMode() == InFramesetMode || insertionMode() == InTableBodyMode); 2015 if ( currentElement() != m_openElements.htmlElement())2042 if (m_tree.currentElement() != m_tree.openElements()->htmlElement()) 2016 2043 parseError(token); 2017 2044 break; 2018 2045 case InColumnGroupMode: 2019 if ( currentElement() == m_openElements.htmlElement()) {2046 if (m_tree.currentElement() == m_tree.openElements()->htmlElement()) { 2020 2047 ASSERT(m_isParsingFragment); 2021 2048 return; … … 2047 2074 { 2048 2075 AtomicHTMLToken startHTML(HTMLToken::StartTag, htmlTag.localName()); 2049 insertHTMLStartTagBeforeHTML(startHTML);2076 m_tree.insertHTMLHtmlStartTagBeforeHTML(startHTML); 2050 2077 setInsertionMode(BeforeHeadMode); 2051 2078 } … … 2080 2107 ASSERT(token.type() == HTMLToken::StartTag); 2081 2108 if (token.name() == htmlTag) { 2082 insertHTMLStartTagInBody(token);2109 m_tree.insertHTMLHtmlStartTagInBody(token); 2083 2110 return true; 2084 2111 } 2085 2112 // FIXME: Atomize "command". 2086 2113 if (token.name() == baseTag || token.name() == "command" || token.name() == linkTag || token.name() == metaTag) { 2087 insertSelfClosingElement(token);2114 m_tree.insertSelfClosingElement(token); 2088 2115 // Note: The custom processing for the <meta> tag is done in HTMLMetaElement::process(). 2089 2116 return true; 2090 2117 } 2091 2118 if (token.name() == titleTag) { 2092 insertGenericRCDATAElement(token);2119 processGenericRCDATAStartTag(token); 2093 2120 return true; 2094 2121 } 2095 2122 if (token.name() == noscriptTag) { 2096 2123 if (isScriptingFlagEnabled(m_document->frame())) { 2097 insertGenericRawTextElement(token);2124 processGenericRawTextStartTag(token); 2098 2125 return true; 2099 2126 } 2100 insertElement(token);2127 m_tree.insertElement(token); 2101 2128 setInsertionMode(InHeadNoscriptMode); 2102 2129 return true; 2103 2130 } 2104 2131 if (token.name() == noframesTag || token.name() == styleTag) { 2105 insertGenericRawTextElement(token);2132 processGenericRawTextStartTag(token); 2106 2133 return true; 2107 2134 } 2108 2135 if (token.name() == scriptTag) { 2109 insertScriptElement(token);2136 processScriptStartTag(token); 2110 2137 return true; 2111 2138 } … … 2117 2144 } 2118 2145 2119 void HTML TreeBuilder::insertDoctype(AtomicHTMLToken& token)2146 void HTMLConstructionSite::insertDoctype(AtomicHTMLToken& token) 2120 2147 { 2121 2148 ASSERT(token.type() == HTMLToken::DOCTYPE); … … 2127 2154 } 2128 2155 2129 void HTML TreeBuilder::insertComment(AtomicHTMLToken& token)2156 void HTMLConstructionSite::insertComment(AtomicHTMLToken& token) 2130 2157 { 2131 2158 ASSERT(token.type() == HTMLToken::Comment); … … 2133 2160 } 2134 2161 2135 void HTML TreeBuilder::insertCommentOnDocument(AtomicHTMLToken& token)2162 void HTMLConstructionSite::insertCommentOnDocument(AtomicHTMLToken& token) 2136 2163 { 2137 2164 ASSERT(token.type() == HTMLToken::Comment); … … 2139 2166 } 2140 2167 2141 void HTML TreeBuilder::insertCommentOnHTMLHtmlElement(AtomicHTMLToken& token)2168 void HTMLConstructionSite::insertCommentOnHTMLHtmlElement(AtomicHTMLToken& token) 2142 2169 { 2143 2170 ASSERT(token.type() == HTMLToken::Comment); … … 2145 2172 } 2146 2173 2147 PassRefPtr<Element> HTML TreeBuilder::createElementAndAttachToCurrent(AtomicHTMLToken& token)2174 PassRefPtr<Element> HTMLConstructionSite::createElementAndAttachToCurrent(AtomicHTMLToken& token) 2148 2175 { 2149 2176 ASSERT(token.type() == HTMLToken::StartTag); … … 2151 2178 } 2152 2179 2153 void HTML TreeBuilder::insertHTMLHtmlElement(AtomicHTMLToken& token)2180 void HTMLConstructionSite::insertHTMLHtmlElement(AtomicHTMLToken& token) 2154 2181 { 2155 2182 m_openElements.pushHTMLHtmlElement(createElementAndAttachToCurrent(token)); 2156 2183 } 2157 2184 2158 void HTML TreeBuilder::insertHTMLHeadElement(AtomicHTMLToken& token)2159 { 2160 m_head Element= createElementAndAttachToCurrent(token);2161 m_openElements.pushHTMLHeadElement(m_head Element);2162 } 2163 2164 void HTML TreeBuilder::insertHTMLBodyElement(AtomicHTMLToken& token)2185 void HTMLConstructionSite::insertHTMLHeadElement(AtomicHTMLToken& token) 2186 { 2187 m_head = createElementAndAttachToCurrent(token); 2188 m_openElements.pushHTMLHeadElement(m_head); 2189 } 2190 2191 void HTMLConstructionSite::insertHTMLBodyElement(AtomicHTMLToken& token) 2165 2192 { 2166 2193 m_openElements.pushHTMLBodyElement(createElementAndAttachToCurrent(token)); 2167 2194 } 2168 2195 2169 void HTML TreeBuilder::insertElement(AtomicHTMLToken& token)2196 void HTMLConstructionSite::insertElement(AtomicHTMLToken& token) 2170 2197 { 2171 2198 m_openElements.push(createElementAndAttachToCurrent(token)); 2172 2199 } 2173 2200 2174 void HTML TreeBuilder::insertSelfClosingElement(AtomicHTMLToken& token)2201 void HTMLConstructionSite::insertSelfClosingElement(AtomicHTMLToken& token) 2175 2202 { 2176 2203 ASSERT(token.type() == HTMLToken::StartTag); … … 2180 2207 } 2181 2208 2182 void HTML TreeBuilder::insertFormattingElement(AtomicHTMLToken& token)2209 void HTMLConstructionSite::insertFormattingElement(AtomicHTMLToken& token) 2183 2210 { 2184 2211 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements … … 2189 2216 } 2190 2217 2191 void HTMLTreeBuilder::insertGenericRCDATAElement(AtomicHTMLToken& token) 2192 { 2193 insertElement(token); 2218 void HTMLTreeBuilder::processGenericRCDATAStartTag(AtomicHTMLToken& token) 2219 { 2220 ASSERT(token.type() == HTMLToken::StartTag); 2221 m_tree.insertElement(token); 2194 2222 m_tokenizer->setState(HTMLTokenizer::RCDATAState); 2195 2223 m_originalInsertionMode = m_insertionMode; … … 2197 2225 } 2198 2226 2199 void HTMLTreeBuilder::insertGenericRawTextElement(AtomicHTMLToken& token) 2200 { 2201 insertElement(token); 2227 void HTMLTreeBuilder::processGenericRawTextStartTag(AtomicHTMLToken& token) 2228 { 2229 ASSERT(token.type() == HTMLToken::StartTag); 2230 m_tree.insertElement(token); 2202 2231 m_tokenizer->setState(HTMLTokenizer::RAWTEXTState); 2203 2232 m_originalInsertionMode = m_insertionMode; … … 2205 2234 } 2206 2235 2207 void HTMLTreeBuilder::insertScriptElement(AtomicHTMLToken& token) 2208 { 2209 ASSERT_UNUSED(token, token.type() == HTMLToken::StartTag); 2236 void HTMLConstructionSite::insertScriptElement(AtomicHTMLToken& token) 2237 { 2210 2238 RefPtr<HTMLScriptElement> element = HTMLScriptElement::create(scriptTag, m_document, true); 2211 2239 element->setAttributeMap(token.takeAtributes(), m_fragmentScriptingPermission); 2212 2240 m_openElements.push(attach(currentElement(), element.release())); 2241 } 2242 2243 void HTMLTreeBuilder::processScriptStartTag(AtomicHTMLToken& token) 2244 { 2245 ASSERT(token.type() == HTMLToken::StartTag); 2246 m_tree.insertScriptElement(token); 2213 2247 m_tokenizer->setState(HTMLTokenizer::ScriptDataState); 2214 2248 m_originalInsertionMode = m_insertionMode; … … 2216 2250 } 2217 2251 2218 void HTML TreeBuilder::insertTextNode(AtomicHTMLToken& token)2252 void HTMLConstructionSite::insertTextNode(AtomicHTMLToken& token) 2219 2253 { 2220 2254 if (Node* lastChild = currentElement()->lastChild()) { … … 2230 2264 } 2231 2265 2232 PassRefPtr<Element> HTML TreeBuilder::createElement(AtomicHTMLToken& token)2266 PassRefPtr<Element> HTMLConstructionSite::createElement(AtomicHTMLToken& token) 2233 2267 { 2234 2268 RefPtr<Element> element = HTMLElementFactory::createHTMLElement(QualifiedName(nullAtom, token.name(), xhtmlNamespaceURI), m_document, 0); … … 2237 2271 } 2238 2272 2239 bool HTML TreeBuilder::indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const2273 bool HTMLConstructionSite::indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const 2240 2274 { 2241 2275 if (m_activeFormattingElements.isEmpty()) … … 2244 2278 do { 2245 2279 --index; 2246 const HTMLFormattingElementList::Entry& entry = m_activeFormattingElements [index];2280 const HTMLFormattingElementList::Entry& entry = m_activeFormattingElements.at(index); 2247 2281 if (entry.isMarker() || m_openElements.contains(entry.element())) { 2248 2282 firstUnopenElementIndex = index + 1; … … 2254 2288 } 2255 2289 2256 void HTML TreeBuilder::reconstructTheActiveFormattingElements()2290 void HTMLConstructionSite::reconstructTheActiveFormattingElements() 2257 2291 { 2258 2292 unsigned firstUnopenElementIndex; … … 2263 2297 ASSERT(unopenEntryIndex < m_activeFormattingElements.size()); 2264 2298 for (; unopenEntryIndex < m_activeFormattingElements.size(); ++unopenEntryIndex) { 2265 HTMLFormattingElementList::Entry& unopenedEntry = m_activeFormattingElements [unopenEntryIndex];2299 HTMLFormattingElementList::Entry& unopenedEntry = m_activeFormattingElements.at(unopenEntryIndex); 2266 2300 // FIXME: We're supposed to save the original token in the entry. 2267 2301 AtomicHTMLToken fakeToken(HTMLToken::StartTag, unopenedEntry.element()->localName()); … … 2287 2321 } 2288 2322 2289 void HTML TreeBuilder::generateImpliedEndTagsWithExclusion(const AtomicString& tagName)2323 void HTMLConstructionSite::generateImpliedEndTagsWithExclusion(const AtomicString& tagName) 2290 2324 { 2291 2325 while (hasImpliedEndTag(currentElement()) && !currentElement()->hasLocalName(tagName)) … … 2293 2327 } 2294 2328 2295 void HTML TreeBuilder::generateImpliedEndTags()2329 void HTMLConstructionSite::generateImpliedEndTags() 2296 2330 { 2297 2331 while (hasImpliedEndTag(currentElement())) -
trunk/WebCore/html/HTMLTreeBuilder.h
r62573 r62599 49 49 class LegacyHTMLTreeBuilder; 50 50 class Node; 51 52 class HTMLConstructionSite : public Noncopyable { 53 public: 54 HTMLConstructionSite(Document*, FragmentScriptingPermission); 55 56 void insertDoctype(AtomicHTMLToken&); 57 void insertComment(AtomicHTMLToken&); 58 void insertCommentOnDocument(AtomicHTMLToken&); 59 void insertCommentOnHTMLHtmlElement(AtomicHTMLToken&); 60 void insertElement(AtomicHTMLToken&); 61 void insertSelfClosingElement(AtomicHTMLToken&); 62 void insertFormattingElement(AtomicHTMLToken&); 63 void insertHTMLHtmlElement(AtomicHTMLToken&); 64 void insertHTMLHeadElement(AtomicHTMLToken&); 65 void insertHTMLBodyElement(AtomicHTMLToken&); 66 void insertScriptElement(AtomicHTMLToken&); 67 void insertTextNode(AtomicHTMLToken&); 68 69 void insertHTMLHtmlStartTagBeforeHTML(AtomicHTMLToken&); 70 void insertHTMLHtmlStartTagInBody(AtomicHTMLToken&); 71 void insertHTMLBodyStartTagInBody(AtomicHTMLToken&); 72 73 PassRefPtr<Element> createElement(AtomicHTMLToken&); 74 75 bool indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const; 76 void reconstructTheActiveFormattingElements(); 77 78 void generateImpliedEndTags(); 79 void generateImpliedEndTagsWithExclusion(const AtomicString& tagName); 80 81 Element* currentElement() const { return m_openElements.top(); } 82 HTMLElementStack* openElements() const { return &m_openElements; } 83 HTMLFormattingElementList* activeFormattingElements() const { return &m_activeFormattingElements; } 84 85 Element* head() const { return m_head.get(); } 86 87 Element* form() const { return m_form.get(); } 88 PassRefPtr<Element> takeForm() { return m_form.release(); } 89 90 void setForm(PassRefPtr<Element> form) { m_form = form; } 91 92 private: 93 template<typename ChildType> 94 PassRefPtr<ChildType> attach(Node* parent, PassRefPtr<ChildType> prpChild); 95 96 PassRefPtr<Element> createElementAndAttachToCurrent(AtomicHTMLToken&); 97 void mergeAttributesFromTokenIntoElement(AtomicHTMLToken&, Element*); 98 99 Document* m_document; 100 RefPtr<Element> m_head; 101 RefPtr<Element> m_form; 102 mutable HTMLElementStack m_openElements; 103 mutable HTMLFormattingElementList m_activeFormattingElements; 104 FragmentScriptingPermission m_fragmentScriptingPermission; 105 }; 51 106 52 107 class HTMLTreeBuilder : public Noncopyable { … … 134 189 void processFakePEndTagIfPInScope(); 135 190 191 void processGenericRCDATAStartTag(AtomicHTMLToken&); 192 void processGenericRawTextStartTag(AtomicHTMLToken&); 193 void processScriptStartTag(AtomicHTMLToken&); 194 136 195 // Default processing for the different insertion modes. 137 196 // FIXME: These functions need to be renamed to remove "process" from their names. … … 152 211 void closeTheCell(); 153 212 154 template<typename ChildType>155 PassRefPtr<ChildType> attach(Node* parent, PassRefPtr<ChildType> prpChild)156 {157 RefPtr<ChildType> child = prpChild;158 parent->parserAddChild(child);159 // It's slightly unfortunate that we need to hold a reference to child160 // here to call attach(). We should investigate whether we can rely on161 // |parent| to hold a ref at this point. In the common case (at least162 // for elements), however, we'll get to use this ref in the stack of163 // open elements.164 child->attach();165 return child.release();166 }167 168 void insertDoctype(AtomicHTMLToken&);169 void insertComment(AtomicHTMLToken&);170 void insertCommentOnDocument(AtomicHTMLToken&);171 void insertCommentOnHTMLHtmlElement(AtomicHTMLToken&);172 void insertHTMLHtmlElement(AtomicHTMLToken&);173 void insertHTMLHeadElement(AtomicHTMLToken&);174 void insertHTMLBodyElement(AtomicHTMLToken&);175 void insertElement(AtomicHTMLToken&);176 void insertSelfClosingElement(AtomicHTMLToken&);177 void insertFormattingElement(AtomicHTMLToken&);178 void insertGenericRCDATAElement(AtomicHTMLToken&);179 void insertGenericRawTextElement(AtomicHTMLToken&);180 void insertScriptElement(AtomicHTMLToken&);181 void insertTextNode(AtomicHTMLToken&);182 183 void insertHTMLStartTagBeforeHTML(AtomicHTMLToken&);184 void insertHTMLStartTagInBody(AtomicHTMLToken&);185 186 PassRefPtr<Element> createElement(AtomicHTMLToken&);187 PassRefPtr<Element> createElementAndAttachToCurrent(AtomicHTMLToken&);188 189 void mergeAttributesFromTokenIntoElement(AtomicHTMLToken&, Element*);190 191 bool indexOfFirstUnopenFormattingElement(unsigned& firstUnopenElementIndex) const;192 void reconstructTheActiveFormattingElements();193 194 void generateImpliedEndTags();195 void generateImpliedEndTagsWithExclusion(const AtomicString& tagName);196 197 Element* currentElement() { return m_openElements.top(); }198 199 RefPtr<Element> m_headElement;200 RefPtr<Element> m_formElement;201 HTMLElementStack m_openElements;202 HTMLFormattingElementList m_activeFormattingElements;203 213 bool m_framesetOk; 204 214 … … 217 227 static bool isScriptingFlagEnabled(Frame* frame); 218 228 219 Document* m_document; // This is only used by the m_legacyParser for now. 229 Document* m_document; 230 HTMLConstructionSite m_tree; 231 220 232 bool m_reportErrors; 221 233 bool m_isPaused;
Note: See TracChangeset
for help on using the changeset viewer.