Title: [99555] trunk/Source/WebCore
Revision
99555
Author
[email protected]
Date
2011-11-08 05:22:03 -0800 (Tue, 08 Nov 2011)

Log Message

CSSCanvasValue: Remove inheritance from CanvasObserver.
<http://webkit.org/b/71796>

Reviewed by Antti Koivisto.

To completely devirtualize all the CSSValues, we need to remove
CSSCanvasValue's inheritance from CanvasObserver, as that is forcing
a vptr into the class.

Use the same approach as CSSImportRule and make a simple proxying
CanvasObserver subclass and put that as a member variable of the value.

* css/CSSCanvasValue.cpp:
(WebCore::CSSCanvasValue::~CSSCanvasValue):
(WebCore::CSSCanvasValue::element):
* css/CSSCanvasValue.h:
(WebCore::CSSCanvasValue::CSSCanvasValue):
(WebCore::CSSCanvasValue::CanvasObserverProxy::CanvasObserverProxy):
(WebCore::CSSCanvasValue::CanvasObserverProxy::~CanvasObserverProxy):
(WebCore::CSSCanvasValue::CanvasObserverProxy::canvasChanged):
(WebCore::CSSCanvasValue::CanvasObserverProxy::canvasResized):
(WebCore::CSSCanvasValue::CanvasObserverProxy::canvasDestroyed):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (99554 => 99555)


--- trunk/Source/WebCore/ChangeLog	2011-11-08 13:06:11 UTC (rev 99554)
+++ trunk/Source/WebCore/ChangeLog	2011-11-08 13:22:03 UTC (rev 99555)
@@ -1,3 +1,28 @@
+2011-11-08  Andreas Kling  <[email protected]>
+
+        CSSCanvasValue: Remove inheritance from CanvasObserver.
+        <http://webkit.org/b/71796>
+
+        Reviewed by Antti Koivisto.
+
+        To completely devirtualize all the CSSValues, we need to remove
+        CSSCanvasValue's inheritance from CanvasObserver, as that is forcing
+        a vptr into the class.
+
+        Use the same approach as CSSImportRule and make a simple proxying
+        CanvasObserver subclass and put that as a member variable of the value.
+
+        * css/CSSCanvasValue.cpp:
+        (WebCore::CSSCanvasValue::~CSSCanvasValue):
+        (WebCore::CSSCanvasValue::element):
+        * css/CSSCanvasValue.h:
+        (WebCore::CSSCanvasValue::CSSCanvasValue):
+        (WebCore::CSSCanvasValue::CanvasObserverProxy::CanvasObserverProxy):
+        (WebCore::CSSCanvasValue::CanvasObserverProxy::~CanvasObserverProxy):
+        (WebCore::CSSCanvasValue::CanvasObserverProxy::canvasChanged):
+        (WebCore::CSSCanvasValue::CanvasObserverProxy::canvasResized):
+        (WebCore::CSSCanvasValue::CanvasObserverProxy::canvasDestroyed):
+
 2011-11-08  Yury Semikhatsky  <[email protected]>
 
         Web Inspector: display notification in the front-end when inspected worker terminates

Modified: trunk/Source/WebCore/css/CSSCanvasValue.cpp (99554 => 99555)


--- trunk/Source/WebCore/css/CSSCanvasValue.cpp	2011-11-08 13:06:11 UTC (rev 99554)
+++ trunk/Source/WebCore/css/CSSCanvasValue.cpp	2011-11-08 13:22:03 UTC (rev 99555)
@@ -34,7 +34,7 @@
 CSSCanvasValue::~CSSCanvasValue()
 {
     if (m_element)
-        m_element->removeObserver(this);
+        m_element->removeObserver(&m_canvasObserver);
 }
 
 String CSSCanvasValue::cssText() const
@@ -78,7 +78,7 @@
         m_element = document->getCSSCanvasElement(m_name);
         if (!m_element)
             return 0;
-        m_element->addObserver(this);
+        m_element->addObserver(&m_canvasObserver);
     }
     return m_element;
 }

Modified: trunk/Source/WebCore/css/CSSCanvasValue.h (99554 => 99555)


--- trunk/Source/WebCore/css/CSSCanvasValue.h	2011-11-08 13:06:11 UTC (rev 99554)
+++ trunk/Source/WebCore/css/CSSCanvasValue.h	2011-11-08 13:22:03 UTC (rev 99555)
@@ -33,7 +33,7 @@
 
 class Document;
 
-class CSSCanvasValue : public CSSImageGeneratorValue, private CanvasObserver {
+class CSSCanvasValue : public CSSImageGeneratorValue {
 public:
     static PassRefPtr<CSSCanvasValue> create() { return adoptRef(new CSSCanvasValue); }
     virtual ~CSSCanvasValue();
@@ -49,16 +49,41 @@
 private:
     CSSCanvasValue()
         : CSSImageGeneratorValue(CanvasClass)
+        , m_canvasObserver(this)
         , m_element(0)
     {
     }
 
-    virtual void canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect);
-    virtual void canvasResized(HTMLCanvasElement*);
-    virtual void canvasDestroyed(HTMLCanvasElement*);
+    // NOTE: We put the CanvasObserver in a member instead of inheriting from it
+    // to avoid adding a vptr to CSSCanvasValue.
+    class CanvasObserverProxy : public CanvasObserver {
+    public:
+        CanvasObserverProxy(CSSCanvasValue* ownerValue) : m_ownerValue(ownerValue) { }
+        virtual ~CanvasObserverProxy() { }
+        virtual void canvasChanged(HTMLCanvasElement* canvas, const FloatRect& changedRect)
+        {
+            m_ownerValue->canvasChanged(canvas, changedRect);
+        }
+        virtual void canvasResized(HTMLCanvasElement* canvas)
+        {
+            m_ownerValue->canvasResized(canvas);
+        }
+        virtual void canvasDestroyed(HTMLCanvasElement* canvas)
+        {
+            m_ownerValue->canvasDestroyed(canvas);
+        }
+    private:
+        CSSCanvasValue* m_ownerValue;
+    };
 
+    void canvasChanged(HTMLCanvasElement*, const FloatRect& changedRect);
+    void canvasResized(HTMLCanvasElement*);
+    void canvasDestroyed(HTMLCanvasElement*);
+
     HTMLCanvasElement* element(Document*);
 
+    CanvasObserverProxy m_canvasObserver;
+
     // The name of the canvas.
     String m_name;
     // The document supplies the element and owns it.
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to