Changeset 126355 in webkit
- Timestamp:
- Aug 22, 2012 2:55:10 PM (12 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r126351 r126355 1 2012-08-22 Kwang Yul Seo <skyul@company100.net> 2 3 HTMLTreeBuilder::furthestBlockForFormattingElement should belong to HTMLElementStack 4 https://bugs.webkit.org/show_bug.cgi?id=93857 5 6 Reviewed by Eric Seidel. 7 8 HTMLTreeBuilder::furthestBlockForFormattingElement should belong to 9 HTMLElementStack because it traverses the element stack and finds the 10 furthest block for the given formatting element. 11 12 Currently, it belongs to HTMLTreeBuilder just because 13 isSpecialNode(const HTMLStackItem*) function used by 14 furthestBlockForFormattingElement is internal to HTMLTreeBuilder. 15 16 Moved isSpecialNode to HTMLStackItem and changed 17 furthestBlockForFormattingElement to be a method of HTMLElementStack. 18 19 No behavior change. Just a refactoring. 20 21 * html/parser/HTMLElementStack.cpp: 22 (WebCore): 23 (WebCore::HTMLElementStack::popUntilNumberedHeaderElementPopped): 24 (WebCore::HTMLElementStack::hasNumberedHeaderElementInScope): 25 (WebCore::HTMLElementStack::furthestBlockForFormattingElement): 26 * html/parser/HTMLElementStack.h: 27 (HTMLElementStack): 28 * html/parser/HTMLStackItem.h: 29 (WebCore::HTMLStackItem::isInHTMLNamespace): 30 (HTMLStackItem): 31 (WebCore::HTMLStackItem::isNumberedHeaderElement): 32 (WebCore::HTMLStackItem::isTableBodyContextElement): 33 (WebCore::HTMLStackItem::isSpecialNode): 34 * html/parser/HTMLTreeBuilder.cpp: 35 (WebCore::HTMLTreeBuilder::constructTreeFromAtomicToken): 36 (WebCore::HTMLTreeBuilder::processCloseWhenNestedTag): 37 (WebCore::HTMLTreeBuilder::processStartTagForInBody): 38 (WebCore::HTMLTreeBuilder::processAnyOtherEndTagForInBody): 39 (WebCore::HTMLTreeBuilder::callTheAdoptionAgency): 40 (WebCore::HTMLTreeBuilder::shouldProcessTokenInForeignContent): 41 (WebCore::HTMLTreeBuilder::processTokenInForeignContent): 42 * html/parser/HTMLTreeBuilder.h: 43 1 44 2012-08-22 Alexandre Elias <aelias@google.com> 2 45 -
trunk/Source/WebCore/html/parser/HTMLElementStack.cpp
r124379 r126355 39 39 using namespace HTMLNames; 40 40 41 static inline bool isNumberedHeaderElement(HTMLStackItem* item)42 {43 return item->hasTagName(h1Tag)44 || item->hasTagName(h2Tag)45 || item->hasTagName(h3Tag)46 || item->hasTagName(h4Tag)47 || item->hasTagName(h5Tag)48 || item->hasTagName(h6Tag);49 }50 51 41 static inline bool isRootNode(HTMLStackItem* item) 52 42 { … … 109 99 return HTMLElementStack::isMathMLTextIntegrationPoint(item) 110 100 || HTMLElementStack::isHTMLIntegrationPoint(item) 111 || i sInHTMLNamespace(item);101 || item->isInHTMLNamespace(); 112 102 } 113 103 … … 232 222 void HTMLElementStack::popUntilNumberedHeaderElementPopped() 233 223 { 234 while (! isNumberedHeaderElement(topStackItem()))224 while (!topStackItem()->isNumberedHeaderElement()) 235 225 pop(); 236 226 pop(); … … 461 451 for (ElementRecord* record = m_top.get(); record; record = record->next()) { 462 452 HTMLStackItem* item = record->stackItem().get(); 463 if (i sNumberedHeaderElement(item))453 if (item->isNumberedHeaderElement()) 464 454 return true; 465 455 if (isScopeMarker(item)) … … 599 589 } 600 590 591 HTMLElementStack::ElementRecord* HTMLElementStack::furthestBlockForFormattingElement(Element* formattingElement) const 592 { 593 ElementRecord* furthestBlock = 0; 594 for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) { 595 if (pos->element() == formattingElement) 596 return furthestBlock; 597 if (pos->stackItem()->isSpecialNode()) 598 furthestBlock = pos; 599 } 600 ASSERT_NOT_REACHED(); 601 return 0; 602 } 603 601 604 #ifndef NDEBUG 602 605 -
trunk/Source/WebCore/html/parser/HTMLElementStack.h
r124277 r126355 102 102 ElementRecord* topRecord() const; 103 103 ElementRecord* find(Element*) const; 104 ElementRecord* furthestBlockForFormattingElement(Element*) const; 104 105 ElementRecord* topmost(const AtomicString& tagName) const; 105 106 … … 181 182 }; 182 183 183 inline bool isInHTMLNamespace(const HTMLStackItem* item)184 {185 // A DocumentFragment takes the place of the document element when parsing186 // fragments and should be considered in the HTML namespace.187 return item->namespaceURI() == HTMLNames::xhtmlNamespaceURI188 || item->isDocumentFragmentNode(); // FIXME: Does this also apply to ShadowRoot?189 }190 191 192 184 } // namespace WebCore 193 185 -
trunk/Source/WebCore/html/parser/HTMLStackItem.h
r124537 r126355 30 30 #include "HTMLNames.h" 31 31 #include "HTMLToken.h" 32 #include "MathMLNames.h" 33 #include "SVGNames.h" 32 34 33 35 #include <wtf/RefCounted.h> … … 78 80 || hasTagName(HTMLNames::theadTag) 79 81 || hasTagName(HTMLNames::trTag); 82 } 83 84 bool isInHTMLNamespace() const 85 { 86 // A DocumentFragment takes the place of the document element when parsing 87 // fragments and should be considered in the HTML namespace. 88 return namespaceURI() == HTMLNames::xhtmlNamespaceURI 89 || isDocumentFragmentNode(); // FIXME: Does this also apply to ShadowRoot? 90 } 91 92 bool isNumberedHeaderElement() const 93 { 94 return hasTagName(HTMLNames::h1Tag) 95 || hasTagName(HTMLNames::h2Tag) 96 || hasTagName(HTMLNames::h3Tag) 97 || hasTagName(HTMLNames::h4Tag) 98 || hasTagName(HTMLNames::h5Tag) 99 || hasTagName(HTMLNames::h6Tag); 100 } 101 102 bool isTableBodyContextElement() const 103 { 104 return hasTagName(HTMLNames::tbodyTag) 105 || hasTagName(HTMLNames::tfootTag) 106 || hasTagName(HTMLNames::theadTag); 107 } 108 109 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#special 110 bool isSpecialNode() const 111 { 112 if (hasTagName(MathMLNames::miTag) 113 || hasTagName(MathMLNames::moTag) 114 || hasTagName(MathMLNames::mnTag) 115 || hasTagName(MathMLNames::msTag) 116 || hasTagName(MathMLNames::mtextTag) 117 || hasTagName(MathMLNames::annotation_xmlTag) 118 || hasTagName(SVGNames::foreignObjectTag) 119 || hasTagName(SVGNames::descTag) 120 || hasTagName(SVGNames::titleTag)) 121 return true; 122 if (isDocumentFragmentNode()) 123 return true; 124 if (!isInHTMLNamespace()) 125 return false; 126 const AtomicString& tagName = localName(); 127 return tagName == HTMLNames::addressTag 128 || tagName == HTMLNames::appletTag 129 || tagName == HTMLNames::areaTag 130 || tagName == HTMLNames::articleTag 131 || tagName == HTMLNames::asideTag 132 || tagName == HTMLNames::baseTag 133 || tagName == HTMLNames::basefontTag 134 || tagName == HTMLNames::bgsoundTag 135 || tagName == HTMLNames::blockquoteTag 136 || tagName == HTMLNames::bodyTag 137 || tagName == HTMLNames::brTag 138 || tagName == HTMLNames::buttonTag 139 || tagName == HTMLNames::captionTag 140 || tagName == HTMLNames::centerTag 141 || tagName == HTMLNames::colTag 142 || tagName == HTMLNames::colgroupTag 143 || tagName == HTMLNames::commandTag 144 || tagName == HTMLNames::ddTag 145 || tagName == HTMLNames::detailsTag 146 || tagName == HTMLNames::dirTag 147 || tagName == HTMLNames::divTag 148 || tagName == HTMLNames::dlTag 149 || tagName == HTMLNames::dtTag 150 || tagName == HTMLNames::embedTag 151 || tagName == HTMLNames::fieldsetTag 152 || tagName == HTMLNames::figcaptionTag 153 || tagName == HTMLNames::figureTag 154 || tagName == HTMLNames::footerTag 155 || tagName == HTMLNames::formTag 156 || tagName == HTMLNames::frameTag 157 || tagName == HTMLNames::framesetTag 158 || isNumberedHeaderElement() 159 || tagName == HTMLNames::headTag 160 || tagName == HTMLNames::headerTag 161 || tagName == HTMLNames::hgroupTag 162 || tagName == HTMLNames::hrTag 163 || tagName == HTMLNames::htmlTag 164 || tagName == HTMLNames::iframeTag 165 || tagName == HTMLNames::imgTag 166 || tagName == HTMLNames::inputTag 167 || tagName == HTMLNames::isindexTag 168 || tagName == HTMLNames::liTag 169 || tagName == HTMLNames::linkTag 170 || tagName == HTMLNames::listingTag 171 || tagName == HTMLNames::marqueeTag 172 || tagName == HTMLNames::menuTag 173 || tagName == HTMLNames::metaTag 174 || tagName == HTMLNames::navTag 175 || tagName == HTMLNames::noembedTag 176 || tagName == HTMLNames::noframesTag 177 || tagName == HTMLNames::noscriptTag 178 || tagName == HTMLNames::objectTag 179 || tagName == HTMLNames::olTag 180 || tagName == HTMLNames::pTag 181 || tagName == HTMLNames::paramTag 182 || tagName == HTMLNames::plaintextTag 183 || tagName == HTMLNames::preTag 184 || tagName == HTMLNames::scriptTag 185 || tagName == HTMLNames::sectionTag 186 || tagName == HTMLNames::selectTag 187 || tagName == HTMLNames::styleTag 188 || tagName == HTMLNames::summaryTag 189 || tagName == HTMLNames::tableTag 190 || isTableBodyContextElement() 191 || tagName == HTMLNames::tdTag 192 || tagName == HTMLNames::textareaTag 193 || tagName == HTMLNames::thTag 194 || tagName == HTMLNames::titleTag 195 || tagName == HTMLNames::trTag 196 || tagName == HTMLNames::ulTag 197 || tagName == HTMLNames::wbrTag 198 || tagName == HTMLNames::xmpTag; 80 199 } 81 200 -
trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp
r125846 r126355 111 111 } 112 112 113 // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#special114 static bool isSpecialNode(const HTMLStackItem* item)115 {116 if (item->hasTagName(MathMLNames::miTag)117 || item->hasTagName(MathMLNames::moTag)118 || item->hasTagName(MathMLNames::mnTag)119 || item->hasTagName(MathMLNames::msTag)120 || item->hasTagName(MathMLNames::mtextTag)121 || item->hasTagName(MathMLNames::annotation_xmlTag)122 || item->hasTagName(SVGNames::foreignObjectTag)123 || item->hasTagName(SVGNames::descTag)124 || item->hasTagName(SVGNames::titleTag))125 return true;126 if (item->isDocumentFragmentNode())127 return true;128 if (!isInHTMLNamespace(item))129 return false;130 const AtomicString& tagName = item->localName();131 return tagName == addressTag132 || tagName == appletTag133 || tagName == areaTag134 || tagName == articleTag135 || tagName == asideTag136 || tagName == baseTag137 || tagName == basefontTag138 || tagName == bgsoundTag139 || tagName == blockquoteTag140 || tagName == bodyTag141 || tagName == brTag142 || tagName == buttonTag143 || tagName == captionTag144 || tagName == centerTag145 || tagName == colTag146 || tagName == colgroupTag147 || tagName == commandTag148 || tagName == ddTag149 || tagName == detailsTag150 || tagName == dirTag151 || tagName == divTag152 || tagName == dlTag153 || tagName == dtTag154 || tagName == embedTag155 || tagName == fieldsetTag156 || tagName == figcaptionTag157 || tagName == figureTag158 || tagName == footerTag159 || tagName == formTag160 || tagName == frameTag161 || tagName == framesetTag162 || isNumberedHeaderTag(tagName)163 || tagName == headTag164 || tagName == headerTag165 || tagName == hgroupTag166 || tagName == hrTag167 || tagName == htmlTag168 || tagName == iframeTag169 || tagName == imgTag170 || tagName == inputTag171 || tagName == isindexTag172 || tagName == liTag173 || tagName == linkTag174 || tagName == listingTag175 || tagName == marqueeTag176 || tagName == menuTag177 || tagName == metaTag178 || tagName == navTag179 || tagName == noembedTag180 || tagName == noframesTag181 || tagName == noscriptTag182 || tagName == objectTag183 || tagName == olTag184 || tagName == pTag185 || tagName == paramTag186 || tagName == plaintextTag187 || tagName == preTag188 || tagName == scriptTag189 || tagName == sectionTag190 || tagName == selectTag191 || tagName == styleTag192 || tagName == summaryTag193 || tagName == tableTag194 || isTableBodyContextTag(tagName)195 || tagName == tdTag196 || tagName == textareaTag197 || tagName == thTag198 || tagName == titleTag199 || tagName == trTag200 || tagName == ulTag201 || tagName == wbrTag202 || tagName == xmpTag;203 }204 205 113 static bool isNonAnchorNonNobrFormattingTag(const AtomicString& tagName) 206 114 { … … 482 390 483 391 bool inForeignContent = !m_tree.isEmpty() 484 && ! isInHTMLNamespace(m_tree.currentStackItem())392 && !m_tree.currentStackItem()->isInHTMLNamespace() 485 393 && !HTMLElementStack::isHTMLIntegrationPoint(m_tree.currentStackItem()) 486 394 && !HTMLElementStack::isMathMLTextIntegrationPoint(m_tree.currentStackItem()); … … 641 549 break; 642 550 } 643 if (i sSpecialNode(item.get()) && !item->hasTagName(addressTag) && !item->hasTagName(divTag) && !item->hasTagName(pTag))551 if (item->isSpecialNode() && !item->hasTagName(addressTag) && !item->hasTagName(divTag) && !item->hasTagName(pTag)) 644 552 break; 645 553 nodeRecord = nodeRecord->next(); … … 817 725 if (isNumberedHeaderTag(token->name())) { 818 726 processFakePEndTagIfPInButtonScope(); 819 if ( isNumberedHeaderTag(m_tree.currentStackItem()->localName())) {727 if (m_tree.currentStackItem()->isNumberedHeaderElement()) { 820 728 parseError(token); 821 729 m_tree.openElements()->pop(); … … 1495 1403 return; 1496 1404 } 1497 if (i sSpecialNode(item.get())) {1405 if (item->isSpecialNode()) { 1498 1406 parseError(token); 1499 1407 return; … … 1501 1409 record = record->next(); 1502 1410 } 1503 }1504 1505 // FIXME: This probably belongs on HTMLElementStack.1506 HTMLElementStack::ElementRecord* HTMLTreeBuilder::furthestBlockForFormattingElement(Element* formattingElement)1507 {1508 HTMLElementStack::ElementRecord* furthestBlock = 0;1509 HTMLElementStack::ElementRecord* record = m_tree.openElements()->topRecord();1510 for (; record; record = record->next()) {1511 if (record->element() == formattingElement)1512 return furthestBlock;1513 if (isSpecialNode(record->stackItem().get()))1514 furthestBlock = record;1515 }1516 ASSERT_NOT_REACHED();1517 return 0;1518 1411 } 1519 1412 … … 1545 1438 parseError(token); 1546 1439 // 2. 1547 HTMLElementStack::ElementRecord* furthestBlock = furthestBlockForFormattingElement(formattingElement);1440 HTMLElementStack::ElementRecord* furthestBlock = m_tree.openElements()->furthestBlockForFormattingElement(formattingElement); 1548 1441 // 3. 1549 1442 if (!furthestBlock) { … … 2657 2550 return false; 2658 2551 HTMLStackItem* item = m_tree.currentStackItem(); 2659 if (i sInHTMLNamespace(item))2552 if (item->isInHTMLNamespace()) 2660 2553 return false; 2661 2554 if (HTMLElementStack::isMathMLTextIntegrationPoint(item)) { … … 2757 2650 return; 2758 2651 } 2759 if (! isInHTMLNamespace(m_tree.currentStackItem())) {2652 if (!m_tree.currentStackItem()->isInHTMLNamespace()) { 2760 2653 // FIXME: This code just wants an Element* iterator, instead of an ElementRecord* 2761 2654 HTMLElementStack::ElementRecord* nodeRecord = m_tree.openElements()->topRecord(); … … 2769 2662 nodeRecord = nodeRecord->next(); 2770 2663 2771 if ( isInHTMLNamespace(nodeRecord->stackItem().get()))2664 if (nodeRecord->stackItem()->isInHTMLNamespace()) 2772 2665 break; 2773 2666 } -
trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h
r123577 r126355 175 175 Vector<Attribute> attributesForIsindexInput(AtomicHTMLToken*); 176 176 177 HTMLElementStack::ElementRecord* furthestBlockForFormattingElement(Element*);178 177 void callTheAdoptionAgency(AtomicHTMLToken*); 179 178
Note: See TracChangeset
for help on using the changeset viewer.