Changeset 62195 in webkit


Ignore:
Timestamp:
Jun 30, 2010 12:50:36 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-06-30 Eric Seidel <eric@webkit.org>

Reviewed by Adam Barth.

Split HTMLElementStack out into its own file
https://bugs.webkit.org/show_bug.cgi?id=41399

No functional change, thus no tests.

  • Android.mk:
  • CMakeLists.txt:
  • GNUmakefile.am:
  • WebCore.gypi:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • html/HTMLElementStack.cpp: Added. (WebCore::HTMLElementStack::ElementRecord::ElementRecord): (WebCore::HTMLElementStack::ElementRecord::element): (WebCore::HTMLElementStack::ElementRecord::next): (WebCore::HTMLElementStack::ElementRecord::releaseNext): (WebCore::HTMLElementStack::ElementRecord::setNext): (WebCore::HTMLElementStack::HTMLElementStack): (WebCore::HTMLElementStack::~HTMLElementStack): (WebCore::HTMLElementStack::popHTMLHeadElement): (WebCore::HTMLElementStack::pop): (WebCore::HTMLElementStack::pushHTMLHtmlElement): (WebCore::HTMLElementStack::pushHTMLHeadElement): (WebCore::HTMLElementStack::pushHTMLBodyElement): (WebCore::HTMLElementStack::push): (WebCore::HTMLElementStack::top): (WebCore::HTMLElementStack::removeHTMLHeadElement): (WebCore::HTMLElementStack::remove): (WebCore::HTMLElementStack::contains): (WebCore::HTMLElementStack::inScope): (WebCore::HTMLElementStack::htmlElement): (WebCore::HTMLElementStack::headElement): (WebCore::HTMLElementStack::bodyElement): (WebCore::HTMLElementStack::pushCommon): (WebCore::HTMLElementStack::popCommon): (WebCore::HTMLElementStack::removeNonFirstCommon):
  • html/HTMLElementStack.h: Added.
  • html/HTMLTreeBuilder.h:
Location:
trunk/WebCore
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/Android.mk

    r62092 r62195  
    265265        html/HTMLDocument.cpp \
    266266        html/HTMLElementsAllInOne.cpp \
     267        html/HTMLElementStack.cpp \
    267268        html/HTMLFormCollection.cpp \
    268269        html/HTMLImageLoader.cpp \
  • trunk/WebCore/CMakeLists.txt

    r62092 r62195  
    942942    html/HTMLDocument.cpp
    943943    html/HTMLElement.cpp
     944    html/HTMLElementStack.cpp
    944945    html/HTMLEmbedElement.cpp
    945946    html/HTMLFieldSetElement.cpp
  • trunk/WebCore/ChangeLog

    r62194 r62195  
     12010-06-30  Eric Seidel  <eric@webkit.org>
     2
     3        Reviewed by Adam Barth.
     4
     5        Split HTMLElementStack out into its own file
     6        https://bugs.webkit.org/show_bug.cgi?id=41399
     7
     8        No functional change, thus no tests.
     9
     10        * Android.mk:
     11        * CMakeLists.txt:
     12        * GNUmakefile.am:
     13        * WebCore.gypi:
     14        * WebCore.pro:
     15        * WebCore.vcproj/WebCore.vcproj:
     16        * WebCore.xcodeproj/project.pbxproj:
     17        * html/HTMLElementStack.cpp: Added.
     18        (WebCore::HTMLElementStack::ElementRecord::ElementRecord):
     19        (WebCore::HTMLElementStack::ElementRecord::element):
     20        (WebCore::HTMLElementStack::ElementRecord::next):
     21        (WebCore::HTMLElementStack::ElementRecord::releaseNext):
     22        (WebCore::HTMLElementStack::ElementRecord::setNext):
     23        (WebCore::HTMLElementStack::HTMLElementStack):
     24        (WebCore::HTMLElementStack::~HTMLElementStack):
     25        (WebCore::HTMLElementStack::popHTMLHeadElement):
     26        (WebCore::HTMLElementStack::pop):
     27        (WebCore::HTMLElementStack::pushHTMLHtmlElement):
     28        (WebCore::HTMLElementStack::pushHTMLHeadElement):
     29        (WebCore::HTMLElementStack::pushHTMLBodyElement):
     30        (WebCore::HTMLElementStack::push):
     31        (WebCore::HTMLElementStack::top):
     32        (WebCore::HTMLElementStack::removeHTMLHeadElement):
     33        (WebCore::HTMLElementStack::remove):
     34        (WebCore::HTMLElementStack::contains):
     35        (WebCore::HTMLElementStack::inScope):
     36        (WebCore::HTMLElementStack::htmlElement):
     37        (WebCore::HTMLElementStack::headElement):
     38        (WebCore::HTMLElementStack::bodyElement):
     39        (WebCore::HTMLElementStack::pushCommon):
     40        (WebCore::HTMLElementStack::popCommon):
     41        (WebCore::HTMLElementStack::removeNonFirstCommon):
     42        * html/HTMLElementStack.h: Added.
     43        * html/HTMLTreeBuilder.h:
     44
    1452010-06-30  Kenneth Russell  <kbr@google.com>
    246
  • trunk/WebCore/GNUmakefile.am

    r62125 r62195  
    11581158        WebCore/html/HTMLElement.cpp \
    11591159        WebCore/html/HTMLElement.h \
     1160        WebCore/html/HTMLElementStack.cpp \
     1161        WebCore/html/HTMLElementStack.h \
    11601162        WebCore/html/HTMLEmbedElement.cpp \
    11611163        WebCore/html/HTMLEmbedElement.h \
  • trunk/WebCore/WebCore.gypi

    r62187 r62195  
    15431543            'html/HTMLElement.cpp',
    15441544            'html/HTMLElement.h',
     1545            'html/HTMLElementStack.cpp',
     1546            'html/HTMLElementStack.h',
    15451547            'html/HTMLEmbedElement.cpp',
    15461548            'html/HTMLEmbedElement.h',
  • trunk/WebCore/WebCore.pro

    r62120 r62195  
    655655    html/HTMLDocument.cpp \
    656656    html/HTMLElement.cpp \
     657    html/HTMLElementStack.cpp \
    657658    html/HTMLEmbedElement.cpp \
    658659    html/HTMLFieldSetElement.cpp \
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r62104 r62195  
    3702637026                        </File>
    3702737027                        <File
     37028                                RelativePath="..\html\HTMLElementStack.cpp"
     37029                                >
     37030                        </File>
     37031                        <File
     37032                                RelativePath="..\html\HTMLElementStack.h"
     37033                                >
     37034                        </File>
     37035                        <File
    3702837036                                RelativePath="..\html\HTMLElementsAllInOne.cpp"
    3702937037                                >
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r62104 r62195  
    30723072                A89CCC520F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A89CCC500F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.cpp */; };
    30733073                A89CCC530F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = A89CCC510F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.h */; };
     3074                A8A563B411DB3D10003AC2F0 /* HTMLElementStack.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A563B211DB3D10003AC2F0 /* HTMLElementStack.h */; };
     3075                A8A563B511DB3D10003AC2F0 /* HTMLElementStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8A563B311DB3D10003AC2F0 /* HTMLElementStack.cpp */; };
    30743076                A8A909AC0CBCD6B50029B807 /* RenderSVGTransformableContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A909AA0CBCD6B50029B807 /* RenderSVGTransformableContainer.h */; };
    30753077                A8A909AD0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8A909AB0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp */; };
     
    85828584                A89CCC500F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReplaceNodeWithSpanCommand.cpp; sourceTree = "<group>"; };
    85838585                A89CCC510F44E98100B5DA10 /* ReplaceNodeWithSpanCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReplaceNodeWithSpanCommand.h; sourceTree = "<group>"; };
     8586                A8A563B211DB3D10003AC2F0 /* HTMLElementStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTMLElementStack.h; sourceTree = "<group>"; };
     8587                A8A563B311DB3D10003AC2F0 /* HTMLElementStack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLElementStack.cpp; sourceTree = "<group>"; };
    85848588                A8A909AA0CBCD6B50029B807 /* RenderSVGTransformableContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGTransformableContainer.h; sourceTree = "<group>"; };
    85858589                A8A909AB0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGTransformableContainer.cpp; sourceTree = "<group>"; };
     
    1384313847                                E44613B40CD6344E00FADA75 /* VoidCallback.h */,
    1384413848                                E44613A00CD6331000FADA75 /* VoidCallback.idl */,
     13849                                A8A563B211DB3D10003AC2F0 /* HTMLElementStack.h */,
     13850                                A8A563B311DB3D10003AC2F0 /* HTMLElementStack.cpp */,
    1384513851                        );
    1384613852                        path = html;
     
    1962919635                                97DD4D870FDF4D6E00ECF9A4 /* XSSAuditor.h in Headers */,
    1963019636                                CE172E011136E8CE0062A533 /* ZoomMode.h in Headers */,
     19637                                A8A563B411DB3D10003AC2F0 /* HTMLElementStack.h in Headers */,
    1963119638                        );
    1963219639                        runOnlyForDeploymentPostprocessing = 0;
     
    2195921966                                E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */,
    2196021967                                97DD4D860FDF4D6E00ECF9A4 /* XSSAuditor.cpp in Sources */,
     21968                                A8A563B511DB3D10003AC2F0 /* HTMLElementStack.cpp in Sources */,
    2196121969                        );
    2196221970                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/WebCore/html/HTMLTreeBuilder.h

    r62166 r62195  
    2929#include "Element.h"
    3030#include "FragmentScriptingPermission.h"
    31 #include "HTMLNames.h"
     31#include "HTMLElementStack.h"
    3232#include "HTMLTokenizer.h"
    3333#include <wtf/Noncopyable.h>
     
    102102    };
    103103
    104     class ElementRecord : public Noncopyable {
    105     public:
    106         ElementRecord(PassRefPtr<Element> element, PassOwnPtr<ElementRecord> next)
    107             : m_element(element)
    108             , m_next(next)
    109         {
    110         }
    111 
    112         Element* element() const { return m_element.get(); }
    113         ElementRecord* next() const { return m_next.get(); }
    114         PassOwnPtr<ElementRecord> releaseNext() { return m_next.release(); }
    115         void setNext(PassOwnPtr<ElementRecord> next) { m_next = next; }
    116 
    117     private:
    118         RefPtr<Element> m_element;
    119         OwnPtr<ElementRecord> m_next;
    120     };
    121 
    122     class ElementStack : public Noncopyable {
    123     public:
    124         ElementStack()
    125             : m_htmlElement(0)
    126             , m_headElement(0)
    127             , m_bodyElement(0)
    128         {
    129         }
    130 
    131         void popHTMLHeadElement()
    132         {
    133             ASSERT(top() == m_headElement);
    134             m_headElement = 0;
    135             popCommon();
    136         }
    137 
    138         void pop()
    139         {
    140             ASSERT(!top()->hasTagName(HTMLNames::headTag));
    141             popCommon();
    142         }
    143 
    144         void pushHTMLHtmlElement(PassRefPtr<Element> element)
    145         {
    146             ASSERT(element->hasTagName(HTMLNames::htmlTag));
    147             ASSERT(!m_htmlElement);
    148             m_htmlElement = element.get();
    149             pushCommon(element);
    150         }
    151 
    152         void pushHTMLHeadElement(PassRefPtr<Element> element)
    153         {
    154             ASSERT(element->hasTagName(HTMLNames::headTag));
    155             ASSERT(!m_headElement);
    156             m_headElement = element.get();
    157             pushCommon(element);
    158         }
    159 
    160         void pushHTMLBodyElement(PassRefPtr<Element> element)
    161         {
    162             ASSERT(element->hasTagName(HTMLNames::bodyTag));
    163             ASSERT(!m_bodyElement);
    164             m_bodyElement = element.get();
    165             pushCommon(element);
    166         }
    167 
    168         void push(PassRefPtr<Element> element)
    169         {
    170             ASSERT(!element->hasTagName(HTMLNames::htmlTag));
    171             ASSERT(!element->hasTagName(HTMLNames::headTag));
    172             ASSERT(!element->hasTagName(HTMLNames::bodyTag));
    173             ASSERT(m_htmlElement);
    174             pushCommon(element);
    175         }
    176 
    177         Element* top() const
    178         {
    179             return m_top->element();
    180         }
    181 
    182         void removeHTMLHeadElement(Element* element)
    183         {
    184             ASSERT(m_headElement == element);
    185             if (m_top->element() == element) {
    186                 popHTMLHeadElement();
    187                 return;
    188             }
    189             m_headElement = 0;
    190             removeNonFirstCommon(element);
    191         }
    192 
    193         void remove(Element* element)
    194         {
    195             ASSERT(!element->hasTagName(HTMLNames::headTag));
    196             if (m_top->element() == element) {
    197                 pop();
    198                 return;
    199             }
    200             removeNonFirstCommon(element);
    201         }
    202 
    203         bool contains(Element* element) const
    204         {
    205             for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) {
    206                 if (pos->element() == element)
    207                     return true;
    208             }
    209             return false;
    210         }
    211 
    212         bool inScope(const AtomicString& name) const
    213         {
    214             // FIXME: This algorithm is wrong.
    215             for (ElementRecord* pos = m_top.get(); pos; pos = pos->next()) {
    216                 if (pos->element()->tagQName() == name)
    217                     return true;
    218             }
    219             return false;
    220         }
    221 
    222         bool inScope(Element* element) const
    223         {
    224             // FIXME: This algorithm is wrong.
    225             return contains(element);
    226         }
    227 
    228         Element* htmlElement()
    229         {
    230             ASSERT(m_htmlElement);
    231             return m_htmlElement;
    232         }
    233 
    234         Element* headElement()
    235         {
    236             ASSERT(m_headElement);
    237             return m_headElement;
    238         }
    239 
    240         Element* bodyElement()
    241         {
    242             ASSERT(m_bodyElement);
    243             return m_bodyElement;
    244         }
    245 
    246     private:
    247         void pushCommon(PassRefPtr<Element> element)
    248         {
    249             m_top.set(new ElementRecord(element, m_top.release()));
    250             top()->beginParsingChildren();
    251         }
    252 
    253         void popCommon()
    254         {
    255             ASSERT(!top()->hasTagName(HTMLNames::htmlTag));
    256             ASSERT(!top()->hasTagName(HTMLNames::bodyTag));
    257             top()->finishParsingChildren();
    258             m_top = m_top->releaseNext();
    259         }
    260 
    261         void removeNonFirstCommon(Element* element)
    262         {
    263             ASSERT(!element->hasTagName(HTMLNames::htmlTag));
    264             ASSERT(!element->hasTagName(HTMLNames::bodyTag));
    265             ElementRecord* pos = m_top.get();
    266             ASSERT(pos->element() != element);
    267             while (pos->next()) {
    268                 if (pos->next()->element() == element) {
    269                     // FIXME: Is it OK to call finishParsingChildren()
    270                     // when the children aren't actually finished?
    271                     element->finishParsingChildren();
    272                     pos->setNext(pos->next()->releaseNext());
    273                     return;
    274                 }
    275             }
    276             ASSERT_NOT_REACHED();
    277         }
    278 
    279         OwnPtr<ElementRecord> m_top;
    280 
    281         // We remember <html>, <head> and <body> as they are pushed.  Their
    282         // ElementRecords keep them alive.  <html> and <body> are never popped.
    283         // FIXME: We don't currently require type-specific information about
    284         // these elements so we haven't yet bothered to plumb the types all the
    285         // way down through createElement, etc.
    286         Element* m_htmlElement;
    287         Element* m_headElement;
    288         Element* m_bodyElement;
    289     };
    290 
    291104    void passTokenToLegacyParser(HTMLToken&);
    292105
     
    356169    RefPtr<Element> m_headElement;
    357170    RefPtr<Element> m_formElement;
    358     ElementStack m_openElements;
     171    HTMLElementStack m_openElements;
    359172
    360173    class FormattingElementEntry {
Note: See TracChangeset for help on using the changeset viewer.