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>
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)
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;
- SVGTRefElement* m_trefElement;
+ SVGTRefElement& m_trefElement;
RefPtr<Element> m_target;
};
-SVGTRefTargetEventListener::SVGTRefTargetEventListener(SVGTRefElement* trefElement)
+SVGTRefTargetEventListener::SVGTRefTargetEventListener(SVGTRefElement& trefElement)
: EventListener(SVGTRefTargetEventListenerType)
, m_trefElement(trefElement)
, m_target(0)
{
- ASSERT(m_trefElement);
}
void SVGTRefTargetEventListener::attach(PassRefPtr<Element> target)
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;
}
{
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)
- m_trefElement->detachTarget();
+ m_trefElement.detachTarget();
}
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();