Title: [129922] trunk/Source/WebKit2
Revision
129922
Author
[email protected]
Date
2012-09-28 11:04:17 -0700 (Fri, 28 Sep 2012)

Log Message

[EFL][WK2] {Vibration,Battery,NetworkInfo}Provider should contain WKContextRef instead of proxy.
https://bugs.webkit.org/show_bug.cgi?id=97839

Patch by Byungwoo Lee <[email protected]> on 2012-09-28
Reviewed by Kenneth Rohde Christiansen.

VibrationProvider has WKRetainPtr<WKVibrationRef> m_wkVibrationRef
which has reference for object WebVibrationProxy.
The WebVibrationProxy instance is a member of WebContext who has it
as RefPtr<WebVibrationProxy>.

A member of one class is shared with another class, but there is no
relation between the two classes.

This can become a problem when WebContext is deleted before the
VibrationProvider, WebVibrationProxy will be alive without WebContext,
because VibrationProvider also has the reference for WebVibrationProxy.

This is a problem because WebVibrationProxy should be a member of
WebContext.

To prevent this, I changed the VibrationProvider to have
WKRetainPtr<WKContextRef> instead of WKRetainPtr<WKVibrationRef>.
Same for BatteryProvider and NetworkInfoProvider.

* UIProcess/API/efl/BatteryProvider.cpp:
(BatteryProvider::create):
(BatteryProvider::BatteryProvider):
(BatteryProvider::didChangeBatteryStatus):
* UIProcess/API/efl/BatteryProvider.h:
(BatteryProvider):
* UIProcess/API/efl/NetworkInfoProvider.cpp:
(NetworkInfoProvider::create):
(NetworkInfoProvider::NetworkInfoProvider):
* UIProcess/API/efl/NetworkInfoProvider.h:
(NetworkInfoProvider):
* UIProcess/API/efl/VibrationProvider.cpp:
(VibrationProvider::create):
(VibrationProvider::VibrationProvider):
* UIProcess/API/efl/VibrationProvider.h:
(VibrationProvider):
* UIProcess/API/efl/ewk_context.cpp:
(_Ewk_Context::_Ewk_Context):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (129921 => 129922)


--- trunk/Source/WebKit2/ChangeLog	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/ChangeLog	2012-09-28 18:04:17 UTC (rev 129922)
@@ -1,3 +1,48 @@
+2012-09-28  Byungwoo Lee  <[email protected]>
+
+        [EFL][WK2] {Vibration,Battery,NetworkInfo}Provider should contain WKContextRef instead of proxy.
+        https://bugs.webkit.org/show_bug.cgi?id=97839
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        VibrationProvider has WKRetainPtr<WKVibrationRef> m_wkVibrationRef
+        which has reference for object WebVibrationProxy.
+        The WebVibrationProxy instance is a member of WebContext who has it
+        as RefPtr<WebVibrationProxy>.
+
+        A member of one class is shared with another class, but there is no
+        relation between the two classes.
+
+        This can become a problem when WebContext is deleted before the
+        VibrationProvider, WebVibrationProxy will be alive without WebContext,
+        because VibrationProvider also has the reference for WebVibrationProxy.
+
+        This is a problem because WebVibrationProxy should be a member of
+        WebContext.
+
+        To prevent this, I changed the VibrationProvider to have
+        WKRetainPtr<WKContextRef> instead of WKRetainPtr<WKVibrationRef>.
+        Same for BatteryProvider and NetworkInfoProvider.
+
+        * UIProcess/API/efl/BatteryProvider.cpp:
+        (BatteryProvider::create):
+        (BatteryProvider::BatteryProvider):
+        (BatteryProvider::didChangeBatteryStatus):
+        * UIProcess/API/efl/BatteryProvider.h:
+        (BatteryProvider):
+        * UIProcess/API/efl/NetworkInfoProvider.cpp:
+        (NetworkInfoProvider::create):
+        (NetworkInfoProvider::NetworkInfoProvider):
+        * UIProcess/API/efl/NetworkInfoProvider.h:
+        (NetworkInfoProvider):
+        * UIProcess/API/efl/VibrationProvider.cpp:
+        (VibrationProvider::create):
+        (VibrationProvider::VibrationProvider):
+        * UIProcess/API/efl/VibrationProvider.h:
+        (VibrationProvider):
+        * UIProcess/API/efl/ewk_context.cpp:
+        (_Ewk_Context::_Ewk_Context):
+
 2012-09-28  Mario Sanchez Prada  <[email protected]>
 
         [WK2][GTK] Implement new Favicons API

Modified: trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.cpp (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.cpp	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.cpp	2012-09-28 18:04:17 UTC (rev 129922)
@@ -31,6 +31,7 @@
 #include "WKAPICast.h"
 #include "WKBatteryManager.h"
 #include "WKBatteryStatus.h"
+#include "WKContext.h"
 
 using namespace WebCore;
 using namespace WebKit;
@@ -53,18 +54,25 @@
 BatteryProvider::~BatteryProvider()
 {
     m_provider.stopUpdating();
-    WKBatteryManagerSetProvider(m_wkBatteryManager.get(), 0);
+
+    WKBatteryManagerRef wkBatteryManager = WKContextGetBatteryManager(m_wkContext.get());
+    ASSERT(wkBatteryManager);
+
+    WKBatteryManagerSetProvider(wkBatteryManager, 0);
 }
 
-PassRefPtr<BatteryProvider> BatteryProvider::create(WKBatteryManagerRef wkBatteryManager)
+PassRefPtr<BatteryProvider> BatteryProvider::create(WKContextRef wkContext)
 {
-    return adoptRef(new BatteryProvider(wkBatteryManager));
+    return adoptRef(new BatteryProvider(wkContext));
 }
 
-BatteryProvider::BatteryProvider(WKBatteryManagerRef wkBatteryManager)
-    : m_wkBatteryManager(wkBatteryManager)
+BatteryProvider::BatteryProvider(WKContextRef wkContext)
+    : m_wkContext(wkContext)
     , m_provider(this)
 {
+    ASSERT(m_wkContext);
+
+    WKBatteryManagerRef wkBatteryManager = WKContextGetBatteryManager(m_wkContext.get());
     ASSERT(wkBatteryManager);
 
     WKBatteryProvider wkBatteryProvider = {
@@ -73,7 +81,7 @@
         startUpdatingCallback,
         stopUpdatingCallback
     };
-    WKBatteryManagerSetProvider(m_wkBatteryManager.get(), &wkBatteryProvider);
+    WKBatteryManagerSetProvider(wkBatteryManager, &wkBatteryProvider);
 }
 
 void BatteryProvider::startUpdating()
@@ -88,8 +96,11 @@
 
 void BatteryProvider::didChangeBatteryStatus(const AtomicString& eventType, PassRefPtr<BatteryStatus> status)
 {
+    WKBatteryManagerRef wkBatteryManager = WKContextGetBatteryManager(m_wkContext.get());
+    ASSERT(wkBatteryManager);
+
     WKRetainPtr<WKBatteryStatusRef> wkBatteryStatus(AdoptWK, WKBatteryStatusCreate(status->charging(), status->chargingTime(), status->dischargingTime(), status->level()));
-    WKBatteryManagerProviderDidChangeBatteryStatus(m_wkBatteryManager.get(), toAPI(eventType.impl()), wkBatteryStatus.get());
+    WKBatteryManagerProviderDidChangeBatteryStatus(wkBatteryManager, toAPI(eventType.impl()), wkBatteryStatus.get());
 }
 
 #endif // ENABLE(BATTERY_STATUS)

Modified: trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.h (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.h	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/BatteryProvider.h	2012-09-28 18:04:17 UTC (rev 129922)
@@ -38,18 +38,18 @@
 class BatteryProvider : public RefCounted<BatteryProvider>, public WebCore::BatteryProviderEflClient {
 public:
     virtual ~BatteryProvider();
-    static PassRefPtr<BatteryProvider> create(WKBatteryManagerRef);
+    static PassRefPtr<BatteryProvider> create(WKContextRef);
 
     void startUpdating();
     void stopUpdating();
 
 private:
-    BatteryProvider(WKBatteryManagerRef);
+    BatteryProvider(WKContextRef);
 
     // BatteryProviderEflClient interface.
     virtual void didChangeBatteryStatus(const AtomicString& eventType, PassRefPtr<WebCore::BatteryStatus>);
 
-    WKRetainPtr<WKBatteryManagerRef> m_wkBatteryManager;
+    WKRetainPtr<WKContextRef> m_wkContext;
     WebCore::BatteryProviderEfl m_provider;
 };
 

Modified: trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.cpp (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.cpp	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.cpp	2012-09-28 18:04:17 UTC (rev 129922)
@@ -28,6 +28,7 @@
 
 #if ENABLE(NETWORK_INFO)
 
+#include "WKContext.h"
 #include "WKNetworkInfoManager.h"
 #include <NotImplemented.h>
 
@@ -56,16 +57,19 @@
     return toNetworkInfoProvider(clientInfo)->metered();
 }
 
-PassRefPtr<NetworkInfoProvider> NetworkInfoProvider::create(WKNetworkInfoManagerRef wkManager)
+PassRefPtr<NetworkInfoProvider> NetworkInfoProvider::create(WKContextRef wkContext)
 {
-    return adoptRef(new NetworkInfoProvider(wkManager));
+    return adoptRef(new NetworkInfoProvider(wkContext));
 }
 
-NetworkInfoProvider::NetworkInfoProvider(WKNetworkInfoManagerRef wkManager)
-    : m_wkNetworkInfoManager(wkManager)
+NetworkInfoProvider::NetworkInfoProvider(WKContextRef wkContext)
+    : m_wkContext(wkContext)
 {
-    ASSERT(wkManager);
+    ASSERT(wkContext);
 
+    WKNetworkInfoManagerRef wkNetworkInfoManager = WKContextGetNetworkInfoManager(m_wkContext.get());
+    ASSERT(wkNetworkInfoManager);
+
     WKNetworkInfoProvider wkNetworkInfoProvider = {
         kWKNetworkInfoProviderCurrentVersion,
         this, // clientInfo
@@ -74,12 +78,15 @@
         getBandwidthCallback,
         isMeteredCallback
     };
-    WKNetworkInfoManagerSetProvider(m_wkNetworkInfoManager.get(), &wkNetworkInfoProvider);
+    WKNetworkInfoManagerSetProvider(wkNetworkInfoManager, &wkNetworkInfoProvider);
 }
 
 NetworkInfoProvider::~NetworkInfoProvider()
 {
-    WKNetworkInfoManagerSetProvider(m_wkNetworkInfoManager.get(), 0);
+    WKNetworkInfoManagerRef wkNetworkInfoManager = WKContextGetNetworkInfoManager(m_wkContext.get());
+    ASSERT(wkNetworkInfoManager);
+
+    WKNetworkInfoManagerSetProvider(wkNetworkInfoManager, 0);
 }
 
 double NetworkInfoProvider::bandwidth() const

Modified: trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.h (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.h	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/NetworkInfoProvider.h	2012-09-28 18:04:17 UTC (rev 129922)
@@ -37,7 +37,7 @@
 class NetworkInfoProvider : public RefCounted<NetworkInfoProvider>, public WebCore::NetworkInfoClient {
 public:
     virtual ~NetworkInfoProvider();
-    static PassRefPtr<NetworkInfoProvider> create(WKNetworkInfoManagerRef);
+    static PassRefPtr<NetworkInfoProvider> create(WKContextRef);
 
     // NetworkInfoClient interface.
     virtual double bandwidth() const;
@@ -47,9 +47,9 @@
     virtual void stopUpdating();
 
 private:
-    NetworkInfoProvider(WKNetworkInfoManagerRef);
+    NetworkInfoProvider(WKContextRef);
 
-    WKRetainPtr<WKNetworkInfoManagerRef> m_wkNetworkInfoManager;
+    WKRetainPtr<WKContextRef> m_wkContext;
     WebCore::NetworkInfoProviderEfl m_provider;
 };
 

Modified: trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.cpp (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.cpp	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.cpp	2012-09-28 18:04:17 UTC (rev 129922)
@@ -29,6 +29,7 @@
 #if ENABLE(VIBRATION)
 
 #include "WKAPICast.h"
+#include "WKContext.h"
 #include "WKVibration.h"
 #include <Evas.h>
 
@@ -65,28 +66,34 @@
     toVibrationProvider(clientInfo)->cancelVibration();
 }
 
-PassRefPtr<VibrationProvider> VibrationProvider::create(WKVibrationRef wkVibrationRef)
+PassRefPtr<VibrationProvider> VibrationProvider::create(WKContextRef wkContext)
 {
-    return adoptRef(new VibrationProvider(wkVibrationRef));
+    return adoptRef(new VibrationProvider(wkContext));
 }
 
-VibrationProvider::VibrationProvider(WKVibrationRef wkVibrationRef)
-    : m_wkVibrationRef(wkVibrationRef)
+VibrationProvider::VibrationProvider(WKContextRef wkContext)
+    : m_wkContext(wkContext)
 {
-    ASSERT(wkVibrationRef);
+    ASSERT(m_wkContext.get());
 
+    WKVibrationRef wkVibration = WKContextGetVibration(m_wkContext.get());
+    ASSERT(wkVibration);
+
     WKVibrationProvider wkVibrationProvider = {
         kWKVibrationProviderCurrentVersion,
         this, // clientInfo
         vibrateCallback,
         cancelVibrationCallback
     };
-    WKVibrationSetProvider(m_wkVibrationRef.get(), &wkVibrationProvider);
+    WKVibrationSetProvider(wkVibration, &wkVibrationProvider);
 }
 
 VibrationProvider::~VibrationProvider()
 {
-    WKVibrationSetProvider(m_wkVibrationRef.get(), 0);
+    WKVibrationRef wkVibration = WKContextGetVibration(m_wkContext.get());
+    ASSERT(wkVibration);
+
+    WKVibrationSetProvider(wkVibration, 0);
 }
 
 void VibrationProvider::vibrate(uint64_t vibrationTime)

Modified: trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.h (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.h	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/VibrationProvider.h	2012-09-28 18:04:17 UTC (rev 129922)
@@ -37,7 +37,7 @@
 
 class VibrationProvider : public RefCounted<VibrationProvider> {
 public:
-    static PassRefPtr<VibrationProvider> create(WKVibrationRef);
+    static PassRefPtr<VibrationProvider> create(WKContextRef);
     virtual ~VibrationProvider();
 
     void vibrate(uint64_t vibrationTime);
@@ -45,9 +45,9 @@
     void setVibrationClientCallbacks(Ewk_Vibration_Client_Vibrate_Cb, Ewk_Vibration_Client_Vibration_Cancel_Cb, void*);
 
 private:
-    explicit VibrationProvider(WKVibrationRef);
+    explicit VibrationProvider(WKContextRef);
 
-    WKRetainPtr<WKVibrationRef> m_wkVibrationRef;
+    WKRetainPtr<WKContextRef> m_wkContext;
     OwnPtr<Ewk_Vibration_Client> m_vibrationClient;
 };
 

Modified: trunk/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp (129921 => 129922)


--- trunk/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp	2012-09-28 17:55:44 UTC (rev 129921)
+++ trunk/Source/WebKit2/UIProcess/API/efl/ewk_context.cpp	2012-09-28 18:04:17 UTC (rev 129922)
@@ -86,18 +86,15 @@
         , requestManager(WKContextGetSoupRequestManager(contextRef.get()))
     {
 #if ENABLE(BATTERY_STATUS)
-        WKBatteryManagerRef wkBatteryManager = WKContextGetBatteryManager(contextRef.get());
-        batteryProvider = BatteryProvider::create(wkBatteryManager);
+        batteryProvider = BatteryProvider::create(context.get());
 #endif
 
 #if ENABLE(NETWORK_INFO)
-        WKNetworkInfoManagerRef wkNetworkInfoManagerRef = WKContextGetNetworkInfoManager(contextRef.get());
-        networkInfoProvider = NetworkInfoProvider::create(wkNetworkInfoManagerRef);
+        networkInfoProvider = NetworkInfoProvider::create(context.get());
 #endif
 
 #if ENABLE(VIBRATION)
-        WKVibrationRef wkVibrationRef = WKContextGetVibration(contextRef.get());
-        vibrationProvider = VibrationProvider::create(wkVibrationRef);
+        vibrationProvider = VibrationProvider::create(context.get());
 #endif
 
 #if ENABLE(MEMORY_SAMPLER)
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to