From 0bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5 Mon Sep 17 00:00:00 2001 From: Ben Murdoch Date: Tue, 11 Aug 2009 17:01:47 +0100 Subject: Merge in WebKit r47029. --- WebCore/wml/WMLTaskElement.cpp | 46 ++++++++++++++++++++++++++++++++---------- 1 file changed, 35 insertions(+), 11 deletions(-) (limited to 'WebCore/wml/WMLTaskElement.cpp') diff --git a/WebCore/wml/WMLTaskElement.cpp b/WebCore/wml/WMLTaskElement.cpp index 1add1da..d49a03e 100644 --- a/WebCore/wml/WMLTaskElement.cpp +++ b/WebCore/wml/WMLTaskElement.cpp @@ -48,8 +48,6 @@ void WMLTaskElement::insertedIntoDocument() WMLElement::insertedIntoDocument(); Node* parent = parentNode(); - ASSERT(parent); - if (!parent || !parent->isWMLElement()) return; @@ -61,10 +59,32 @@ void WMLTaskElement::insertedIntoDocument() static_cast(parent)->registerTask(this); } +void WMLTaskElement::removedFromDocument() +{ + Node* parent = parentNode(); + if (parent && parent->isWMLElement()) { + if (parent->hasTagName(anchorTag)) + static_cast(parent)->deregisterTask(this); + else if (parent->hasTagName(doTag)) + static_cast(parent)->deregisterTask(this); + else if (parent->hasTagName(oneventTag)) + static_cast(parent)->deregisterTask(this); + } + + WMLElement::removedFromDocument(); +} + void WMLTaskElement::registerVariableSetter(WMLSetvarElement* element) { - ASSERT(element); - m_variableSetterElements.add(element); + ASSERT(m_variableSetterElements.find(element) == WTF::notFound); + m_variableSetterElements.append(element); +} + +void WMLTaskElement::deregisterVariableSetter(WMLSetvarElement* element) +{ + size_t position = m_variableSetterElements.find(element); + ASSERT(position != WTF::notFound); + m_variableSetterElements.remove(position); } void WMLTaskElement::storeVariableState(WMLPageState* pageState) @@ -73,19 +93,23 @@ void WMLTaskElement::storeVariableState(WMLPageState* pageState) return; WMLVariableMap variables; - HashSet::iterator it = m_variableSetterElements.begin(); - HashSet::iterator end = m_variableSetterElements.end(); + Vector::iterator it = m_variableSetterElements.begin(); + Vector::iterator end = m_variableSetterElements.end(); for (; it != end; ++it) { WMLSetvarElement* setterElement = (*it); - if (setterElement->name().isEmpty()) + + String name = setterElement->name(); + if (name.isEmpty()) continue; - variables.set(setterElement->name(), setterElement->value()); - } + String value = setterElement->value(); + variables.set(name, value); - if (variables.isEmpty()) - return; + // The next setvar element may depend on this variable value. It's safe to store the current + // name value pair in the page state, as the whole page state is replaced soon by this new map + pageState->storeVariable(name, value); + } pageState->storeVariables(variables); } -- cgit v1.1