Changeset 108082 in webkit
- Timestamp:
- Feb 17, 2012 8:50:13 AM (12 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r108075 r108082 1 2012-02-17 Florin Malita <fmalita@google.com> 2 3 chrome.dll!WebCore::SVGTRefElement::updateReferencedText ReadAV@NULL (e85cb8e140071fa7790cad215b0109dc) 4 https://bugs.webkit.org/show_bug.cgi?id=74858 5 6 Reviewed by Nikolas Zimmermann. 7 8 * svg/custom/tref-remove-target-crash-expected.svg: Added. 9 * svg/custom/tref-remove-target-crash.svg: Added. 10 1 11 2012-02-17 Pavel Feldman <pfeldman@google.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r108081 r108082 1 2012-02-17 Florin Malita <fmalita@google.com> 2 3 chrome.dll!WebCore::SVGTRefElement::updateReferencedText ReadAV@NULL (e85cb8e140071fa7790cad215b0109dc) 4 https://bugs.webkit.org/show_bug.cgi?id=74858 5 6 Reviewed by Nikolas Zimmermann. 7 8 Tests: svg/custom/tref-remove-target-crash-expected.svg 9 svg/custom/tref-remove-target-crash.svg 10 11 Add a DOMNodeRemovedFromDocumentEvent listener to detect when the target element is removed. Upon removal, 12 cleanup all listeners and re-activate the pending resource to attach if the referenced ID is added 13 at a later time programmatically. Also move the DOMSubtreeModifiedEvent listener from the parent to 14 the target element to simplify the implementation and reduce the scope. 15 16 * svg/SVGTRefElement.cpp: 17 (WebCore::TargetListener::create): 18 (WebCore::TargetListener::cast): 19 (WebCore::TargetListener::clear): 20 (WebCore::TargetListener::TargetListener): 21 (WebCore::TargetListener::operator==): 22 (WebCore::TargetListener::handleEvent): 23 (WebCore::SVGTRefElement::detachTarget): 24 (WebCore::SVGTRefElement::buildPendingResource): 25 * svg/SVGTRefElement.h: 26 1 27 2012-02-17 Simon Fraser <simon.fraser@apple.com> 2 28 -
trunk/Source/WebCore/svg/SVGTRefElement.cpp
r107706 r108082 63 63 } 64 64 65 class SubtreeModificationEventListener : public EventListener {65 class TargetListener : public EventListener { 66 66 public: 67 static PassRefPtr< SubtreeModificationEventListener> create(SVGTRefElement* trefElement, String targetId)68 { 69 return adoptRef(new SubtreeModificationEventListener(trefElement, targetId));70 } 71 72 static const SubtreeModificationEventListener* cast(const EventListener* listener)73 { 74 return listener->type() == CPPEventListenerType ? static_cast<const SubtreeModificationEventListener*>(listener) : 0;67 static PassRefPtr<TargetListener> create(SVGTRefElement* trefElement, String targetId) 68 { 69 return adoptRef(new TargetListener(trefElement, targetId)); 70 } 71 72 static const TargetListener* cast(const EventListener* listener) 73 { 74 return listener->type() == CPPEventListenerType ? static_cast<const TargetListener*>(listener) : 0; 75 75 } 76 76 … … 80 80 { 81 81 Element* target = m_trefElement->treeScope()->getElementById(m_targetId); 82 if (target && target->parentNode()) 83 target->parentNode()->removeEventListener(eventNames().DOMSubtreeModifiedEvent, this, false); 82 if (target) { 83 target->removeEventListener(eventNames().DOMSubtreeModifiedEvent, this, false); 84 target->removeEventListener(eventNames().DOMNodeRemovedFromDocumentEvent, this, false); 85 } 84 86 85 87 m_trefElement = 0; … … 88 90 89 91 private: 90 SubtreeModificationEventListener(SVGTRefElement* trefElement, String targetId)92 TargetListener(SVGTRefElement* trefElement, String targetId) 91 93 : EventListener(CPPEventListenerType) 92 94 , m_trefElement(trefElement) … … 101 103 }; 102 104 103 bool SubtreeModificationEventListener::operator==(const EventListener& listener)104 { 105 if (const SubtreeModificationEventListener* subtreeModificationEventListener = SubtreeModificationEventListener::cast(&listener))105 bool TargetListener::operator==(const EventListener& listener) 106 { 107 if (const TargetListener* subtreeModificationEventListener = TargetListener::cast(&listener)) 106 108 return m_trefElement == subtreeModificationEventListener->m_trefElement; 107 109 return false; 108 110 } 109 111 110 void SubtreeModificationEventListener::handleEvent(ScriptExecutionContext*, Event* event)112 void TargetListener::handleEvent(ScriptExecutionContext*, Event* event) 111 113 { 112 114 if (m_trefElement && event->type() == eventNames().DOMSubtreeModifiedEvent && m_trefElement != event->target()) 113 115 m_trefElement->updateReferencedText(); 116 117 if (m_trefElement && event->type() == eventNames().DOMNodeRemovedFromDocumentEvent) 118 m_trefElement->detachTarget(); 114 119 } 115 120 … … 167 172 else 168 173 root->firstChild()->setTextContent(textContent, ASSERT_NO_EXCEPTION); 174 } 175 176 void SVGTRefElement::detachTarget() 177 { 178 // Remove active listeners and clear the text content. 179 clearEventListener(); 180 181 String emptyContent; 182 ExceptionCode ignore = 0; 183 184 ASSERT(hasShadowRoot()); 185 Node* container = shadowRootList()->oldestShadowRoot()->firstChild(); 186 if (container) 187 container->setTextContent(emptyContent, ignore); 188 189 // Mark the referenced ID as pending. 190 String id; 191 SVGURIReference::targetElementFromIRIString(href(), document(), &id); 192 if (!hasPendingResources() && !id.isEmpty()) 193 document()->accessSVGExtensions()->addPendingResource(id, this); 169 194 } 170 195 … … 258 283 return; 259 284 260 m_eventListener = SubtreeModificationEventListener::create(this, id);261 ASSERT(target->parentNode());262 target-> parentNode()->addEventListener(eventNames().DOMSubtreeModifiedEvent, m_eventListener.get(), false);285 m_eventListener = TargetListener::create(this, id); 286 target->addEventListener(eventNames().DOMSubtreeModifiedEvent, m_eventListener.get(), false); 287 target->addEventListener(eventNames().DOMNodeRemovedFromDocumentEvent, m_eventListener.get(), false); 263 288 } 264 289 -
trunk/Source/WebCore/svg/SVGTRefElement.h
r107523 r108082 28 28 namespace WebCore { 29 29 30 class SubtreeModificationEventListener;30 class TargetListener; 31 31 32 32 class SVGTRefElement : public SVGTextPositioningElement, … … 36 36 37 37 private: 38 friend class SubtreeModificationEventListener;38 friend class TargetListener; 39 39 40 40 SVGTRefElement(const QualifiedName&, Document*); … … 58 58 void updateReferencedText(); 59 59 60 void detachTarget(); 61 60 62 virtual void buildPendingResource(); 61 63 … … 64 66 END_DECLARE_ANIMATED_PROPERTIES 65 67 66 RefPtr< SubtreeModificationEventListener> m_eventListener;68 RefPtr<TargetListener> m_eventListener; 67 69 }; 68 70
Note: See TracChangeset
for help on using the changeset viewer.