[WK2][EFL] Fix code wrapping WKPageGroupRef
authormikhail.pozdnyakov@intel.com <mikhail.pozdnyakov@intel.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Mar 2013 17:01:51 +0000 (17:01 +0000)
committermikhail.pozdnyakov@intel.com <mikhail.pozdnyakov@intel.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 18 Mar 2013 17:01:51 +0000 (17:01 +0000)
https://bugs.webkit.org/show_bug.cgi?id=112364

Reviewed by Alexey Proskuryakov.

The patch fixes following problems in EWK2 WKPageGroupRef wrapping
code: firstly it makes sure that there is only one EwkPageGroup
instance per WKPageGroup instance, secondly it allows web page to
to use the default page group (which is implicitly created inside
web context).

* UIProcess/API/C/efl/WKView.cpp:
(createWKView):

    Now may pass '0' page group as a WebView creation argument so
    that the default page group is used.

* UIProcess/API/efl/EwkView.cpp:
(EwkView::EwkView):
(EwkView::createEvasObject):
* UIProcess/API/efl/EwkView.h:
(EwkView):

    Web view should be created before page group, so they are rearranged
    inside class declaration.

* UIProcess/API/efl/ewk_page_group.cpp:
(pageGroupMap):

    A map to track corresponding EwkPageGroup and WKPageGroup
    instances.

(EwkPageGroup::findOrCreateWrapper):

    Returns the same EwkPageGroup instance for the same WKPageGroup
    instance.

(EwkPageGroup::create):
(EwkPageGroup::EwkPageGroup):

    Now there is only one constructor accepting WKPageGroupRef.

(EwkPageGroup::~EwkPageGroup):
* UIProcess/API/efl/ewk_page_group_private.h:
(EwkPageGroup):
* UIProcess/efl/WebInspectorProxyEfl.cpp:
(WebKit::WebInspectorProxy::platformCreateInspectorPage):

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

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/C/efl/WKView.cpp
Source/WebKit2/UIProcess/API/efl/EwkView.cpp
Source/WebKit2/UIProcess/API/efl/EwkView.h
Source/WebKit2/UIProcess/API/efl/ewk_page_group.cpp
Source/WebKit2/UIProcess/API/efl/ewk_page_group_private.h
Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp

index 24d21c0..5630ffe 100644 (file)
@@ -1,3 +1,53 @@
+2013-03-18  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
+
+        [WK2][EFL] Fix code wrapping WKPageGroupRef
+        https://bugs.webkit.org/show_bug.cgi?id=112364
+
+        Reviewed by Alexey Proskuryakov.
+
+        The patch fixes following problems in EWK2 WKPageGroupRef wrapping
+        code: firstly it makes sure that there is only one EwkPageGroup
+        instance per WKPageGroup instance, secondly it allows web page to
+        to use the default page group (which is implicitly created inside
+        web context).
+
+        * UIProcess/API/C/efl/WKView.cpp:
+        (createWKView):
+
+            Now may pass '0' page group as a WebView creation argument so
+            that the default page group is used.
+
+        * UIProcess/API/efl/EwkView.cpp:
+        (EwkView::EwkView):
+        (EwkView::createEvasObject):
+        * UIProcess/API/efl/EwkView.h:
+        (EwkView):
+
+            Web view should be created before page group, so they are rearranged
+            inside class declaration.
+
+        * UIProcess/API/efl/ewk_page_group.cpp:
+        (pageGroupMap):
+
+            A map to track corresponding EwkPageGroup and WKPageGroup
+            instances.
+
+        (EwkPageGroup::findOrCreateWrapper):
+
+            Returns the same EwkPageGroup instance for the same WKPageGroup
+            instance.
+
+        (EwkPageGroup::create):
+        (EwkPageGroup::EwkPageGroup):
+
+            Now there is only one constructor accepting WKPageGroupRef.
+
+        (EwkPageGroup::~EwkPageGroup):
+        * UIProcess/API/efl/ewk_page_group_private.h:
+        (EwkPageGroup):
+        * UIProcess/efl/WebInspectorProxyEfl.cpp:
+        (WebKit::WebInspectorProxy::platformCreateInspectorPage):
+
 2013-03-17  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GTK] Invalid charset encoding using when substituting a misspelled word in WebKit2
index dcd3e2c..699015a 100644 (file)
@@ -32,7 +32,8 @@ using namespace WebKit;
 static inline WKViewRef createWKView(Evas* canvas, WKContextRef contextRef, WKPageGroupRef pageGroupRef, EwkView::ViewBehavior behavior)
 {
     RefPtr<EwkContext> context = contextRef ? EwkContext::findOrCreateWrapper(contextRef) : EwkContext::defaultContext();
-    RefPtr<EwkPageGroup> pageGroup = EwkPageGroup::create(pageGroupRef);
+    RefPtr<EwkPageGroup> pageGroup = pageGroupRef ? EwkPageGroup::findOrCreateWrapper(pageGroupRef) : 0;
+
     Evas_Object* evasObject = EwkView::createEvasObject(canvas, context, pageGroup, behavior);
     if (!evasObject)
         return 0;
index 17dcb64..81eb115 100644 (file)
@@ -240,9 +240,9 @@ static inline WKPageToEvasObjectMap& wkPageToEvasObjectMap()
 EwkView::EwkView(Evas_Object* evasObject, PassRefPtr<EwkContext> context, PassRefPtr<EwkPageGroup> pageGroup, ViewBehavior behavior)
     : m_evasObject(evasObject)
     , m_context(context)
-    , m_pageGroup(pageGroup)
-    , m_pendingSurfaceResize(false)
-    , m_webView(adoptRef(new WebView(toImpl(m_context->wkContext()), toImpl(m_pageGroup->wkPageGroup()), this)))
+    , m_webView(adoptRef(new WebView(toImpl(m_context->wkContext()), pageGroup ? toImpl(pageGroup->wkPageGroup()) : 0, this)))
+    , m_pageGroup(EwkPageGroup::findOrCreateWrapper(WKPageGetPageGroup(wkPage())))
+    , m_pendingSurfaceResize(false)    
     , m_pageLoadClient(PageLoadClientEfl::create(this))
     , m_pagePolicyClient(PagePolicyClientEfl::create(this))
     , m_pageUIClient(PageUIClientEfl::create(this))
@@ -337,7 +337,7 @@ Evas_Object* EwkView::createEvasObject(Evas* canvas, Evas_Smart* smart, PassRefP
 
     ASSERT(!smartData->priv);
 
-    smartData->priv = new EwkView(evasObject, context, (pageGroup ? pageGroup : EwkPageGroup::create()), behavior);
+    smartData->priv = new EwkView(evasObject, context, pageGroup, behavior);
 
     return evasObject;
 }
index af79f58..6626197 100644 (file)
@@ -254,6 +254,7 @@ private:
     // Note, initialization order matters.
     Evas_Object* m_evasObject;
     RefPtr<EwkContext> m_context;
+    RefPtr<WebKit::WebView> m_webView;
     RefPtr<EwkPageGroup> m_pageGroup;
     OwnPtr<Evas_GL> m_evasGL;
     OwnPtr<WebKit::EvasGLContext> m_evasGLContext;
@@ -261,7 +262,6 @@ private:
     WebCore::IntSize m_deviceSize;
     WebCore::TransformationMatrix m_userViewportTransform;
     bool m_pendingSurfaceResize;
-    RefPtr<WebKit::WebView> m_webView;
     OwnPtr<WebKit::PageLoadClientEfl> m_pageLoadClient;
     OwnPtr<WebKit::PagePolicyClientEfl> m_pagePolicyClient;
     OwnPtr<WebKit::PageUIClientEfl> m_pageUIClient;
index ba238e4..84cd567 100644 (file)
@@ -37,19 +37,46 @@ using namespace WebKit;
 
 const char EwkPageGroup::defaultIdentifier[] = "defaultPageGroupIdentifier";
 
+typedef HashMap<WKPageGroupRef, EwkPageGroup*> PageGroupMap;
+
+static inline PageGroupMap& pageGroupMap()
+{
+    DEFINE_STATIC_LOCAL(PageGroupMap, map, ());
+    return map;
+}
+
 static WKTypeRef convertFromCharToWKString(void* data)
 {
     return WKStringCreateWithUTF8CString(static_cast<char*>(data));
 }
 
+PassRefPtr<EwkPageGroup> EwkPageGroup::findOrCreateWrapper(WKPageGroupRef pageGroupRef)
+{
+    if (pageGroupMap().contains(pageGroupRef))
+        return pageGroupMap().get(pageGroupRef);
+
+    return adoptRef(new EwkPageGroup(pageGroupRef));
+}
+
+PassRefPtr<EwkPageGroup> EwkPageGroup::create(const String& identifier)
+{
+    WKRetainPtr<WKStringRef> identifierRef = adoptWK(toCopiedAPI(identifier.isEmpty() ? defaultIdentifier : identifier));
+    WKRetainPtr<WKPageGroupRef> pageGroupRef = adoptWK(WKPageGroupCreateWithIdentifier(identifierRef.get()));
+
+    return adoptRef(new EwkPageGroup(pageGroupRef.get()));
+}
+
 EwkPageGroup::EwkPageGroup(WKPageGroupRef pageGroupRef)
     : m_pageGroupRef(pageGroupRef)
 {
+    PageGroupMap::AddResult result = pageGroupMap().add(pageGroupRef, this);
+    ASSERT_UNUSED(result, result.isNewEntry);
 }
 
-EwkPageGroup::EwkPageGroup(const String& identifier)
+EwkPageGroup::~EwkPageGroup()
 {
-    m_pageGroupRef = adoptWK(WKPageGroupCreateWithIdentifier(adoptWK(toCopiedAPI(identifier)).get()));
+    ASSERT(pageGroupMap().get(m_pageGroupRef.get()) == this);
+    pageGroupMap().remove(m_pageGroupRef.get());
 }
 
 void EwkPageGroup::addUserStyleSheet(const String& source, const String& baseURL, Eina_List* whiteList, Eina_List* blackList, bool mainFrameOnly)
index 1e2e2b6..3f92201 100644 (file)
@@ -40,18 +40,10 @@ class EwkPageGroup : public EwkObject {
 public:
     EWK_OBJECT_DECLARE(EwkPageGroup)
 
-    static PassRefPtr<EwkPageGroup> create(WKPageGroupRef pageGroupRef)
-    {
-        if (!pageGroupRef)
-            return adoptRef(new EwkPageGroup(defaultIdentifier));
+    static PassRefPtr<EwkPageGroup> findOrCreateWrapper(WKPageGroupRef pageGroupRef);
+    static PassRefPtr<EwkPageGroup> create(const String& identifier = String());
 
-        return adoptRef(new EwkPageGroup(pageGroupRef));
-    }
-
-    static PassRefPtr<EwkPageGroup> create(const String& identifier = String())
-    {
-        return adoptRef(new EwkPageGroup(identifier.isEmpty() ? defaultIdentifier : identifier));
-    }
+    ~EwkPageGroup();
 
     WKPageGroupRef wkPageGroup() const { return m_pageGroupRef.get(); }
 
@@ -59,8 +51,7 @@ public:
     void removeAllUserStyleSheets();
 
 private:
-    explicit EwkPageGroup(WKPageGroupRef pageGroupRef);
-    explicit EwkPageGroup(const String& identifier);
+    explicit EwkPageGroup(WKPageGroupRef pageGroupRef);    
 
     static const char defaultIdentifier[];
 
index 240cbb3..6d12dfa 100644 (file)
@@ -101,7 +101,7 @@ WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
 
     // FIXME: Refactor to use WKViewRef.
     WKContextRef contextRef = toAPI(page()->process()->context());
-    m_inspectorView = EwkView::createEvasObject(ecore_evas_get(m_inspectorWindow), EwkContext::findOrCreateWrapper(contextRef), EwkPageGroup::create(toAPI(inspectorPageGroup())), EwkView::LegacyBehavior);
+    m_inspectorView = EwkView::createEvasObject(ecore_evas_get(m_inspectorWindow), EwkContext::findOrCreateWrapper(contextRef), EwkPageGroup::findOrCreateWrapper(toAPI(inspectorPageGroup())), EwkView::LegacyBehavior);
     if (!m_inspectorView)
         return 0;