CTTE: SVGTRefTargetEventListener is always owned by SVGTRefElement.
authorakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 8 Feb 2014 08:50:00 +0000 (08:50 +0000)
committerakling@apple.com <akling@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 8 Feb 2014 08:50:00 +0000 (08:50 +0000)
<https://webkit.org/b/128432>

Tighten up the relationship between SVGTRefElement and its internal
event listener helper by storing the listener in a Ref, and making
the listeners backpointer to the element be a reference.

Reviewed by Anders Carlsson.

* svg/SVGTRefElement.cpp:
(WebCore::SVGTRefTargetEventListener::create):
(WebCore::SVGTRefTargetEventListener::SVGTRefTargetEventListener):
(WebCore::SVGTRefTargetEventListener::operator==):
(WebCore::SVGTRefTargetEventListener::handleEvent):
(WebCore::SVGTRefElement::SVGTRefElement):
* svg/SVGTRefElement.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@163705 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/svg/SVGTRefElement.cpp
Source/WebCore/svg/SVGTRefElement.h

index ebdea68765e55a7192fcf32d1e41a123f224420c..86c735d3720a7fb7b5ed9e28c991f13dad6dc3fd 100644 (file)
@@ -1,5 +1,24 @@
 2014-02-08  Andreas Kling  <akling@apple.com>
 
 2014-02-08  Andreas Kling  <akling@apple.com>
 
+        CTTE: SVGTRefTargetEventListener is always owned by SVGTRefElement.
+        <https://webkit.org/b/128432>
+
+        Tighten up the relationship between SVGTRefElement and its internal
+        event listener helper by storing the listener in a Ref, and making
+        the listeners backpointer to the element be a reference.
+
+        Reviewed by Anders Carlsson.
+
+        * svg/SVGTRefElement.cpp:
+        (WebCore::SVGTRefTargetEventListener::create):
+        (WebCore::SVGTRefTargetEventListener::SVGTRefTargetEventListener):
+        (WebCore::SVGTRefTargetEventListener::operator==):
+        (WebCore::SVGTRefTargetEventListener::handleEvent):
+        (WebCore::SVGTRefElement::SVGTRefElement):
+        * svg/SVGTRefElement.h:
+
+2014-02-07  Andreas Kling  <akling@apple.com>
+
         Devirtualize RenderBlockFlowRareData.
         <https://webkit.org/b/128427>
 
         Devirtualize RenderBlockFlowRareData.
         <https://webkit.org/b/128427>
 
index 02f0de1b34b689918cb9ce028d94fd7bef0fe814..06f9a6f5a84efbb7e1d4bdb84ab79777dbf7cca0 100644 (file)
@@ -56,9 +56,9 @@ PassRefPtr<SVGTRefElement> SVGTRefElement::create(const QualifiedName& tagName,
 
 class SVGTRefTargetEventListener : public EventListener {
 public:
 
 class SVGTRefTargetEventListener : public EventListener {
 public:
-    static PassRefPtr<SVGTRefTargetEventListener> create(SVGTRefElement* trefElement)
+    static PassRef<SVGTRefTargetEventListener> create(SVGTRefElement& trefElement)
     {
     {
-        return adoptRef(new SVGTRefTargetEventListener(trefElement));
+        return adoptRef(*new SVGTRefTargetEventListener(trefElement));
     }
 
     static const SVGTRefTargetEventListener* cast(const EventListener* listener)
     }
 
     static const SVGTRefTargetEventListener* cast(const EventListener* listener)
@@ -72,21 +72,20 @@ public:
     bool isAttached() const { return m_target.get(); }
 
 private:
     bool isAttached() const { return m_target.get(); }
 
 private:
-    SVGTRefTargetEventListener(SVGTRefElement* trefElement);
+    explicit SVGTRefTargetEventListener(SVGTRefElement& trefElement);
 
     virtual void handleEvent(ScriptExecutionContext*, Event*) override;
     virtual bool operator==(const EventListener&) override;
 
 
     virtual void handleEvent(ScriptExecutionContext*, Event*) override;
     virtual bool operator==(const EventListener&) override;
 
-    SVGTRefElement* m_trefElement;
+    SVGTRefElement& m_trefElement;
     RefPtr<Element> m_target;
 };
 
     RefPtr<Element> m_target;
 };
 
-SVGTRefTargetEventListener::SVGTRefTargetEventListener(SVGTRefElement* trefElement)
+SVGTRefTargetEventListener::SVGTRefTargetEventListener(SVGTRefElement& trefElement)
     : EventListener(SVGTRefTargetEventListenerType)
     , m_trefElement(trefElement)
     , m_target(0)
 {
     : EventListener(SVGTRefTargetEventListenerType)
     , m_trefElement(trefElement)
     , m_target(0)
 {
-    ASSERT(m_trefElement);
 }
 
 void SVGTRefTargetEventListener::attach(PassRefPtr<Element> target)
 }
 
 void SVGTRefTargetEventListener::attach(PassRefPtr<Element> target)
@@ -113,7 +112,7 @@ void SVGTRefTargetEventListener::detach()
 bool SVGTRefTargetEventListener::operator==(const EventListener& listener)
 {
     if (const SVGTRefTargetEventListener* targetListener = SVGTRefTargetEventListener::cast(&listener))
 bool SVGTRefTargetEventListener::operator==(const EventListener& listener)
 {
     if (const SVGTRefTargetEventListener* targetListener = SVGTRefTargetEventListener::cast(&listener))
-        return m_trefElement == targetListener->m_trefElement;
+        return &m_trefElement == &targetListener->m_trefElement;
     return false;
 }
 
     return false;
 }
 
@@ -121,15 +120,15 @@ void SVGTRefTargetEventListener::handleEvent(ScriptExecutionContext*, Event* eve
 {
     ASSERT(isAttached());
 
 {
     ASSERT(isAttached());
 
-    if (event->type() == eventNames().DOMSubtreeModifiedEvent && m_trefElement != event->target())
-        m_trefElement->updateReferencedText(m_target.get());
+    if (event->type() == eventNames().DOMSubtreeModifiedEvent && &m_trefElement != event->target())
+        m_trefElement.updateReferencedText(m_target.get());
     else if (event->type() == eventNames().DOMNodeRemovedFromDocumentEvent)
     else if (event->type() == eventNames().DOMNodeRemovedFromDocumentEvent)
-        m_trefElement->detachTarget();
+        m_trefElement.detachTarget();
 }
 
 inline SVGTRefElement::SVGTRefElement(const QualifiedName& tagName, Document& document)
     : SVGTextPositioningElement(tagName, document)
 }
 
 inline SVGTRefElement::SVGTRefElement(const QualifiedName& tagName, Document& document)
     : SVGTextPositioningElement(tagName, document)
-    , m_targetListener(SVGTRefTargetEventListener::create(this))
+    , m_targetListener(SVGTRefTargetEventListener::create(*this))
 {
     ASSERT(hasTagName(SVGNames::trefTag));
     registerAnimatedPropertiesForSVGTRefElement();
 {
     ASSERT(hasTagName(SVGNames::trefTag));
     registerAnimatedPropertiesForSVGTRefElement();
index 880900f824eddc58632e4ef6ee042ee4618ac555..36eea86b7049f0bb65aa424c6880c446cdaa7e31 100644 (file)
@@ -60,7 +60,7 @@ private:
         DECLARE_ANIMATED_STRING(Href, href)
     END_DECLARE_ANIMATED_PROPERTIES
 
         DECLARE_ANIMATED_STRING(Href, href)
     END_DECLARE_ANIMATED_PROPERTIES
 
-    RefPtr<SVGTRefTargetEventListener> m_targetListener;
+    Ref<SVGTRefTargetEventListener> m_targetListener;
 };
 
 } // namespace WebCore
 };
 
 } // namespace WebCore