Changeset 46510 in webkit


Ignore:
Timestamp:
Jul 28, 2009 5:49:58 PM (15 years ago)
Author:
Nikolas Zimmermann
Message:

2009-07-28 Nikolas Zimmermann <nikolas.zimmermann@torchmobile.com>

Reviewed by Adam Treat.

[WML] WML*Element classes mostly implement insertedIntoDocument(), not removedFromDocument()
https://bugs.webkit.org/show_bug.cgi?id=27786

WML*Element classes mostly implement insertedIntoDocument(), not removedFromDocument().
The only case where this is relevant in WML is error handling. The parsed WML
tree fragment is inserted in an XHTML compound error document. This requires
removedFromDocument() to be correctly implemented otherwhise we run into
trouble (visible when using run-webkit-tests fast/wml --random).

  • wml/WMLAnchorElement.cpp: (WebCore::WMLAnchorElement::registerTask): (WebCore::WMLAnchorElement::deregisterTask):
  • wml/WMLAnchorElement.h:
  • wml/WMLDoElement.cpp: (WebCore::WMLDoElement::removedFromDocument): (WebCore::WMLDoElement::registerTask): (WebCore::WMLDoElement::deregisterTask):
  • wml/WMLDoElement.h:
  • wml/WMLEventHandlingElement.cpp: (WebCore::WMLEventHandlingElement::registerDoElement): (WebCore::WMLEventHandlingElement::deregisterDoElement):
  • wml/WMLEventHandlingElement.h:
  • wml/WMLFieldSetElement.cpp: (WebCore::WMLFieldSetElement::removedFromDocument):
  • wml/WMLGoElement.cpp: (WebCore::WMLGoElement::registerPostfieldElement): (WebCore::WMLGoElement::deregisterPostfieldElement):
  • wml/WMLGoElement.h:
  • wml/WMLIntrinsicEventHandler.cpp: (WebCore::WMLIntrinsicEventHandler::deregisterIntrinsicEvent):
  • wml/WMLIntrinsicEventHandler.h:
  • wml/WMLOnEventElement.cpp: (WebCore::eventHandlingParent): (WebCore::WMLOnEventElement::registerTask): (WebCore::WMLOnEventElement::deregisterTask):
  • wml/WMLOnEventElement.h:
  • wml/WMLPostfieldElement.cpp: (WebCore::WMLPostfieldElement::removedFromDocument):
  • wml/WMLPostfieldElement.h:
  • wml/WMLSetvarElement.cpp: (WebCore::WMLSetvarElement::removedFromDocument):
  • wml/WMLSetvarElement.h:
  • wml/WMLTaskElement.cpp: (WebCore::WMLTaskElement::removedFromDocument): (WebCore::WMLTaskElement::registerVariableSetter): (WebCore::WMLTaskElement::deregisterVariableSetter): (WebCore::WMLTaskElement::storeVariableState):
  • wml/WMLTaskElement.h:
  • wml/WMLTimerElement.cpp: (WebCore::WMLTimerElement::removedFromDocument):
  • wml/WMLTimerElement.h:
Location:
trunk/WebCore
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r46509 r46510  
     12009-07-28  Nikolas Zimmermann  <nikolas.zimmermann@torchmobile.com>
     2
     3        Reviewed by Adam Treat.
     4
     5        [WML] WML*Element classes mostly implement insertedIntoDocument(), not removedFromDocument()
     6        https://bugs.webkit.org/show_bug.cgi?id=27786
     7
     8        WML*Element classes mostly implement insertedIntoDocument(), not removedFromDocument().
     9        The only case where this is relevant in WML is error handling. The parsed WML
     10        tree fragment is inserted in an XHTML compound error document. This requires
     11        removedFromDocument() to be correctly implemented otherwhise we run into
     12        trouble (visible when using run-webkit-tests fast/wml --random).
     13
     14        * wml/WMLAnchorElement.cpp:
     15        (WebCore::WMLAnchorElement::registerTask):
     16        (WebCore::WMLAnchorElement::deregisterTask):
     17        * wml/WMLAnchorElement.h:
     18        * wml/WMLDoElement.cpp:
     19        (WebCore::WMLDoElement::removedFromDocument):
     20        (WebCore::WMLDoElement::registerTask):
     21        (WebCore::WMLDoElement::deregisterTask):
     22        * wml/WMLDoElement.h:
     23        * wml/WMLEventHandlingElement.cpp:
     24        (WebCore::WMLEventHandlingElement::registerDoElement):
     25        (WebCore::WMLEventHandlingElement::deregisterDoElement):
     26        * wml/WMLEventHandlingElement.h:
     27        * wml/WMLFieldSetElement.cpp:
     28        (WebCore::WMLFieldSetElement::removedFromDocument):
     29        * wml/WMLGoElement.cpp:
     30        (WebCore::WMLGoElement::registerPostfieldElement):
     31        (WebCore::WMLGoElement::deregisterPostfieldElement):
     32        * wml/WMLGoElement.h:
     33        * wml/WMLIntrinsicEventHandler.cpp:
     34        (WebCore::WMLIntrinsicEventHandler::deregisterIntrinsicEvent):
     35        * wml/WMLIntrinsicEventHandler.h:
     36        * wml/WMLOnEventElement.cpp:
     37        (WebCore::eventHandlingParent):
     38        (WebCore::WMLOnEventElement::registerTask):
     39        (WebCore::WMLOnEventElement::deregisterTask):
     40        * wml/WMLOnEventElement.h:
     41        * wml/WMLPostfieldElement.cpp:
     42        (WebCore::WMLPostfieldElement::removedFromDocument):
     43        * wml/WMLPostfieldElement.h:
     44        * wml/WMLSetvarElement.cpp:
     45        (WebCore::WMLSetvarElement::removedFromDocument):
     46        * wml/WMLSetvarElement.h:
     47        * wml/WMLTaskElement.cpp:
     48        (WebCore::WMLTaskElement::removedFromDocument):
     49        (WebCore::WMLTaskElement::registerVariableSetter):
     50        (WebCore::WMLTaskElement::deregisterVariableSetter):
     51        (WebCore::WMLTaskElement::storeVariableState):
     52        * wml/WMLTaskElement.h:
     53        * wml/WMLTimerElement.cpp:
     54        (WebCore::WMLTimerElement::removedFromDocument):
     55        * wml/WMLTimerElement.h:
     56
    1572009-07-28  David Levin  <levin@chromium.org>
    258
  • trunk/WebCore/wml/WMLAnchorElement.cpp

    r45083 r46510  
    6464}
    6565
     66void WMLAnchorElement::registerTask(WMLTaskElement* task)
     67{
     68    ASSERT(!m_task);
     69    m_task = task;
     70}
     71
     72void WMLAnchorElement::deregisterTask(WMLTaskElement* task)
     73{
     74    ASSERT(m_task == task);
     75    m_task = 0;
     76}
     77
    6678}
    6779
  • trunk/WebCore/wml/WMLAnchorElement.h

    r39432 r46510  
    3838private:
    3939    friend class WMLTaskElement;
    40     void registerTask(WMLTaskElement* task) { m_task = task; }
     40    void registerTask(WMLTaskElement*);
     41    void deregisterTask(WMLTaskElement*);
    4142
    4243    WMLTaskElement* m_task;
  • trunk/WebCore/wml/WMLDoElement.cpp

    r46394 r46510  
    123123}
    124124
     125void WMLDoElement::removedFromDocument()
     126{
     127    Node* parent = parentNode();
     128    ASSERT(parent);
     129
     130    if (parent  && parent->isWMLElement()) {
     131        if (WMLEventHandlingElement* eventHandlingElement = toWMLEventHandlingElement(static_cast<WMLElement*>(parent)))
     132            eventHandlingElement->deregisterDoElement(this);
     133    }
     134
     135    WMLElement::removedFromDocument();
     136}
     137
    125138void WMLDoElement::attach()
    126139{
     
    155168}
    156169
     170void WMLDoElement::registerTask(WMLTaskElement* task)
     171{
     172    ASSERT(!m_task);
     173    m_task = task;
     174}
     175
     176void WMLDoElement::deregisterTask(WMLTaskElement* task)
     177{
     178    ASSERT(m_task == task);
     179    m_task = 0;
     180}
     181
    157182String WMLDoElement::label() const
    158183{
  • trunk/WebCore/wml/WMLDoElement.h

    r46394 r46510  
    3636    virtual void parseMappedAttribute(MappedAttribute*);
    3737    virtual void insertedIntoDocument();
     38    virtual void removedFromDocument();
    3839
    3940    virtual void attach();
     
    4142    virtual void recalcStyle(StyleChange);
    4243
    43     void registerTask(WMLTaskElement* task) { m_task = task; }
     44    void registerTask(WMLTaskElement*);
     45    void deregisterTask(WMLTaskElement*);
    4446
    4547    bool isActive() const { return m_isActive; }
  • trunk/WebCore/wml/WMLEventHandlingElement.cpp

    r40204 r46510  
    6262    }
    6363
     64    ASSERT(m_doElements.find(doElement) == WTF::notFound);
    6465    m_doElements.append(doElement);
    6566    doElement->setActive(true);
     67}
     68
     69void WMLEventHandlingElement::deregisterDoElement(WMLDoElement* doElement)
     70{
     71    doElement->setActive(false);
     72
     73    size_t position = m_doElements.find(doElement);
     74    if (position == WTF::notFound)
     75        return;
     76
     77    m_doElements.remove(position);
    6678}
    6779
  • trunk/WebCore/wml/WMLEventHandlingElement.h

    r40204 r46510  
    4343    Vector<WMLDoElement*>& doElements() { return m_doElements; }
    4444    void registerDoElement(WMLDoElement*, Document*);
     45    void deregisterDoElement(WMLDoElement*);
    4546
    4647private:
  • trunk/WebCore/wml/WMLFieldSetElement.cpp

    r45084 r46510  
    6767void WMLFieldSetElement::removedFromDocument()
    6868{
     69    m_insertedLegendElement.clear();
    6970    WMLElement::removedFromDocument();
    70     m_insertedLegendElement.clear();
    7171}
    7272
  • trunk/WebCore/wml/WMLGoElement.cpp

    r46418 r46510  
    5151void WMLGoElement::registerPostfieldElement(WMLPostfieldElement* postfield)
    5252{
     53    ASSERT(m_postfieldElements.find(postfield) == WTF::notFound);
    5354    m_postfieldElements.append(postfield);
     55}
     56 
     57void WMLGoElement::deregisterPostfieldElement(WMLPostfieldElement* postfield)
     58{
     59    size_t position = m_postfieldElements.find(postfield);
     60    ASSERT(position != WTF::notFound);
     61    m_postfieldElements.remove(position);
    5462}
    5563
  • trunk/WebCore/wml/WMLGoElement.h

    r39432 r46510  
    3737
    3838    void registerPostfieldElement(WMLPostfieldElement*);
     39    void deregisterPostfieldElement(WMLPostfieldElement*);
    3940
    4041    virtual void parseMappedAttribute(MappedAttribute*);
  • trunk/WebCore/wml/WMLIntrinsicEventHandler.cpp

    r39432 r46510  
    3939}
    4040
     41void WMLIntrinsicEventHandler::deregisterIntrinsicEvent(WMLIntrinsicEventType type)
     42{
     43    if (m_events.contains(type))
     44        m_events.remove(type);
     45}
     46
    4147void WMLIntrinsicEventHandler::triggerIntrinsicEvent(WMLIntrinsicEventType type) const
    4248{
  • trunk/WebCore/wml/WMLIntrinsicEventHandler.h

    r39432 r46510  
    4545
    4646    bool registerIntrinsicEvent(WMLIntrinsicEventType, PassRefPtr<WMLIntrinsicEvent>);
     47    void deregisterIntrinsicEvent(WMLIntrinsicEventType);
    4748    void triggerIntrinsicEvent(WMLIntrinsicEventType) const;
    4849    bool hasIntrinsicEvent(WMLIntrinsicEventType) const;
  • trunk/WebCore/wml/WMLOnEventElement.cpp

    r43310 r46510  
    6161}
    6262
     63static inline WMLEventHandlingElement* eventHandlingParent(Node* parent)
     64{
     65    ASSERT(parent);
     66    if (!parent || !parent->isWMLElement())
     67        return 0;
     68
     69    return toWMLEventHandlingElement(static_cast<WMLElement*>(parent));
     70}
     71
    6372void WMLOnEventElement::registerTask(WMLTaskElement* task)
    6473{
     
    6776
    6877    // Register intrinsic event to the event handler of the owner of onevent element
    69     Node* parent = parentNode();
    70     ASSERT(parent);
    71 
    72     if (!parent || !parent->isWMLElement())
    73         return;
    74 
    75     WMLEventHandlingElement* eventHandlingElement = toWMLEventHandlingElement(static_cast<WMLElement*>(parent));
     78    WMLEventHandlingElement* eventHandlingElement = eventHandlingParent(parentNode());
    7679    if (!eventHandlingElement)
    7780        return;
     
    8487}
    8588
     89void WMLOnEventElement::deregisterTask(WMLTaskElement*)
     90{
     91    WMLEventHandlingElement* eventHandlingElement = eventHandlingParent(parentNode());
     92    if (!eventHandlingElement)
     93        return;
     94
     95    eventHandlingElement->eventHandler()->deregisterIntrinsicEvent(m_type);
     96}
     97
    8698}
    8799
  • trunk/WebCore/wml/WMLOnEventElement.h

    r39432 r46510  
    3737
    3838    void registerTask(WMLTaskElement*);
     39    void deregisterTask(WMLTaskElement*);
    3940
    4041private:
  • trunk/WebCore/wml/WMLPostfieldElement.cpp

    r45747 r46510  
    5353}
    5454
     55void WMLPostfieldElement::removedFromDocument()
     56{
     57    Node* parent = parentNode();
     58    ASSERT(parent);
     59
     60    if (parent->hasTagName(goTag))
     61        static_cast<WMLGoElement*>(parent)->deregisterPostfieldElement(this);
     62
     63    WMLElement::removedFromDocument();
     64}
     65
    5566String WMLPostfieldElement::name() const
    5667{
  • trunk/WebCore/wml/WMLPostfieldElement.h

    r45084 r46510  
    3232
    3333    virtual void insertedIntoDocument();
     34    virtual void removedFromDocument();
    3435
    3536    String name() const;
  • trunk/WebCore/wml/WMLSetvarElement.cpp

    r45747 r46510  
    6666}
    6767
     68void WMLSetvarElement::removedFromDocument()
     69{
     70    Node* parent = parentNode();
     71    ASSERT(parent);
     72
     73    if (parent && parent->isWMLElement()) {
     74        if (static_cast<WMLElement*>(parent)->isWMLTaskElement())
     75            static_cast<WMLTaskElement*>(parent)->deregisterVariableSetter(this);
     76    }
     77
     78    WMLElement::removedFromDocument();
     79}
     80
    6881String WMLSetvarElement::name() const
    6982{
  • trunk/WebCore/wml/WMLSetvarElement.h

    r45084 r46510  
    3434    virtual void parseMappedAttribute(MappedAttribute*);
    3535    virtual void insertedIntoDocument();
     36    virtual void removedFromDocument();
    3637
    3738    String name() const;
  • trunk/WebCore/wml/WMLTaskElement.cpp

    r46487 r46510  
    6262}
    6363
     64void WMLTaskElement::removedFromDocument()
     65{
     66    Node* parent = parentNode();
     67    ASSERT(parent);
     68
     69    if (parent && parent->isWMLElement()) {
     70        if (parent->hasTagName(anchorTag))
     71            static_cast<WMLAnchorElement*>(parent)->deregisterTask(this);
     72        else if (parent->hasTagName(doTag))
     73            static_cast<WMLDoElement*>(parent)->deregisterTask(this);
     74        else if (parent->hasTagName(oneventTag))
     75            static_cast<WMLOnEventElement*>(parent)->deregisterTask(this);
     76    }
     77
     78    WMLElement::removedFromDocument();
     79}
     80
    6481void WMLTaskElement::registerVariableSetter(WMLSetvarElement* element)
    6582{
    66     ASSERT(element);
    67     m_variableSetterElements.add(element);
     83    ASSERT(m_variableSetterElements.find(element) == WTF::notFound);
     84    m_variableSetterElements.append(element);
     85}
     86
     87void WMLTaskElement::deregisterVariableSetter(WMLSetvarElement* element)
     88{
     89    size_t position = m_variableSetterElements.find(element);
     90    ASSERT(position != WTF::notFound);
     91    m_variableSetterElements.remove(position);
    6892}
    6993
     
    7498
    7599    WMLVariableMap variables;
    76     HashSet<WMLSetvarElement*>::iterator it = m_variableSetterElements.begin();
    77     HashSet<WMLSetvarElement*>::iterator end = m_variableSetterElements.end();
     100    Vector<WMLSetvarElement*>::iterator it = m_variableSetterElements.begin();
     101    Vector<WMLSetvarElement*>::iterator end = m_variableSetterElements.end();
    78102
    79103    for (; it != end; ++it) {
  • trunk/WebCore/wml/WMLTaskElement.h

    r39432 r46510  
    2525#include "WMLElement.h"
    2626
    27 #include <wtf/HashSet.h>
     27#include <wtf/Vector.h>
    2828
    2929namespace WebCore {
     
    4040
    4141    virtual void insertedIntoDocument();
     42    virtual void removedFromDocument();
    4243    virtual void executeTask(Event*) = 0;
    4344
    4445    void registerVariableSetter(WMLSetvarElement*);
     46    void deregisterVariableSetter(WMLSetvarElement*);
    4547
    4648protected:
     
    4850
    4951private:
    50     HashSet<WMLSetvarElement*> m_variableSetterElements;
     52    Vector<WMLSetvarElement*> m_variableSetterElements;
    5153};
    5254
  • trunk/WebCore/wml/WMLTimerElement.cpp

    r45084 r46510  
    6969        m_card->setIntrinsicEventTimer(this);
    7070    }
     71}
     72
     73void WMLTimerElement::removedFromDocument()
     74{
     75    Node* parent = parentNode();
     76    ASSERT(parent);
     77
     78    if (parent && parent->isWMLElement()) {
     79        if (parent->hasTagName(cardTag)) {
     80            m_card->setIntrinsicEventTimer(0);
     81            m_card = 0;
     82        }
     83    }
     84
     85    WMLElement::removedFromDocument();
    7186}
    7287
  • trunk/WebCore/wml/WMLTimerElement.h

    r45084 r46510  
    3636    virtual void parseMappedAttribute(MappedAttribute*);
    3737    virtual void insertedIntoDocument();
     38    virtual void removedFromDocument();
    3839
    3940    void timerFired(Timer<WMLTimerElement>*);
Note: See TracChangeset for help on using the changeset viewer.