[GTK] Remove webkit_web_view_get_subresources from WebKit2 GTK+ API
authorcarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Feb 2013 07:48:40 +0000 (07:48 +0000)
committercarlosgc@webkit.org <carlosgc@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 19 Feb 2013 07:48:40 +0000 (07:48 +0000)
https://bugs.webkit.org/show_bug.cgi?id=110125

Reviewed by Anders Carlsson.

This API is currently implemented caching all resources in the
WebView which causes some problems in documents loading resources
indefinitely. This API was used in WebKit1 mainly to implement
webkit_web_view_save(), but we already have such API in
WebKit2.

* UIProcess/API/gtk/WebKitInjectedBundleClient.cpp:
(didReceiveWebViewMessageFromInjectedBundle):
* UIProcess/API/gtk/WebKitWebView.cpp:
(_WebKitWebViewPrivate):
(webkitWebViewLoadChanged):
* UIProcess/API/gtk/WebKitWebView.h:
* UIProcess/API/gtk/WebKitWebViewPrivate.h:
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt:
* UIProcess/API/gtk/tests/TestResources.cpp:
(testWebViewResources):
(testWebResourceGetData):

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

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/API/gtk/WebKitInjectedBundleClient.cpp
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp
Source/WebKit2/UIProcess/API/gtk/WebKitWebView.h
Source/WebKit2/UIProcess/API/gtk/WebKitWebViewPrivate.h
Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp

index 60effb3..6d1bbf1 100644 (file)
@@ -1,3 +1,28 @@
+2013-02-18  Carlos Garcia Campos  <cgarcia@igalia.com>
+
+        [GTK] Remove webkit_web_view_get_subresources from WebKit2 GTK+ API
+        https://bugs.webkit.org/show_bug.cgi?id=110125
+
+        Reviewed by Anders Carlsson.
+
+        This API is currently implemented caching all resources in the
+        WebView which causes some problems in documents loading resources
+        indefinitely. This API was used in WebKit1 mainly to implement
+        webkit_web_view_save(), but we already have such API in
+        WebKit2.
+
+        * UIProcess/API/gtk/WebKitInjectedBundleClient.cpp:
+        (didReceiveWebViewMessageFromInjectedBundle):
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (_WebKitWebViewPrivate):
+        (webkitWebViewLoadChanged):
+        * UIProcess/API/gtk/WebKitWebView.h:
+        * UIProcess/API/gtk/WebKitWebViewPrivate.h:
+        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt:
+        * UIProcess/API/gtk/tests/TestResources.cpp:
+        (testWebViewResources):
+        (testWebResourceGetData):
+
 2013-02-18  Christophe Dumez  <dchris@gmail.com>
 
         [WK2][EFL] Stop using internal C++ API in ewk_error
index f501a76..6d788ba 100644 (file)
@@ -71,11 +71,12 @@ static void didReceiveWebViewMessageFromInjectedBundle(WebKitWebView* webView, c
         webkitWebResourceNotifyProgress(resource.get(), contentLength->value());
     } else if (g_str_equal(messageName, "DidFinishLoadForResource")) {
         WebUInt64* resourceIdentifier = static_cast<WebUInt64*>(message.get(String::fromUTF8("Identifier")));
-        GRefPtr<WebKitWebResource> resource = webkitWebViewResourceLoadFinished(webView, resourceIdentifier->value());
+        GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(webView, resourceIdentifier->value());
         if (!resource)
             return;
 
         webkitWebResourceFinished(resource.get());
+        webkitWebViewRemoveLoadingWebResource(webView, resourceIdentifier->value());
     } else if (g_str_equal(messageName, "DidFailLoadForResource")) {
         WebUInt64* resourceIdentifier = static_cast<WebUInt64*>(message.get(String::fromUTF8("Identifier")));
         GRefPtr<WebKitWebResource> resource = webkitWebViewGetLoadingWebResource(webView, resourceIdentifier->value());
index e7a7501..90523d1 100644 (file)
@@ -130,7 +130,6 @@ enum {
 };
 
 typedef HashMap<uint64_t, GRefPtr<WebKitWebResource> > LoadingResourcesMap;
-typedef HashMap<String, GRefPtr<WebKitWebResource> > ResourcesMap;
 
 struct _WebKitWebViewPrivate {
     ~_WebKitWebViewPrivate()
@@ -169,7 +168,6 @@ struct _WebKitWebViewPrivate {
 
     GRefPtr<WebKitWebResource> mainResource;
     LoadingResourcesMap loadingResourcesMap;
-    ResourcesMap subresourcesMap;
 
     GRefPtr<WebKitWebInspector> inspector;
 
@@ -1363,7 +1361,6 @@ void webkitWebViewLoadChanged(WebKitWebView* webView, WebKitLoadEvent loadEvent)
         GOwnPtr<char> faviconURI(webkit_favicon_database_get_favicon_uri(database, priv->activeURI.data()));
         webkitWebViewUpdateFaviconURI(webView, faviconURI.get());
 
-        priv->subresourcesMap.clear();
         if (!priv->mainResource) {
             // When a page is loaded from the history cache, the main resource load callbacks
             // are called when the main frame load is finished. We want to make sure there's a
@@ -1572,16 +1569,6 @@ void webkitWebViewRemoveLoadingWebResource(WebKitWebView* webView, uint64_t reso
     priv->loadingResourcesMap.remove(resourceIdentifier);
 }
 
-WebKitWebResource* webkitWebViewResourceLoadFinished(WebKitWebView* webView, uint64_t resourceIdentifier)
-{
-    WebKitWebViewPrivate* priv = webView->priv;
-    WebKitWebResource* resource = webkitWebViewGetLoadingWebResource(webView, resourceIdentifier);
-    if (resource != priv->mainResource)
-        priv->subresourcesMap.set(String::fromUTF8(webkit_web_resource_get_uri(resource)), resource);
-    webkitWebViewRemoveLoadingWebResource(webView, resourceIdentifier);
-    return resource;
-}
-
 bool webkitWebViewEnterFullScreen(WebKitWebView* webView)
 {
     gboolean returnValue;
@@ -2640,7 +2627,6 @@ WebKitJavascriptResult* webkit_web_view_run_javascript_from_gresource_finish(Web
  * @web_view: a #WebKitWebView
  *
  * Return the main resource of @web_view.
- * See also webkit_web_view_get_subresources():
  *
  * Returns: (transfer none): the main #WebKitWebResource of the view
  *    or %NULL if nothing has been loaded.
@@ -2653,28 +2639,6 @@ WebKitWebResource* webkit_web_view_get_main_resource(WebKitWebView* webView)
 }
 
 /**
- * webkit_web_view_get_subresources:
- * @web_view: a #WebKitWebView
- *
- * Return the list of subresources of @web_view.
- * See also webkit_web_view_get_main_resource().
- *
- * Returns: (element-type WebKitWebResource) (transfer container): a list of #WebKitWebResource.
- */
-GList* webkit_web_view_get_subresources(WebKitWebView* webView)
-{
-    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);
-
-    GList* subresources = 0;
-    WebKitWebViewPrivate* priv = webView->priv;
-    ResourcesMap::const_iterator end = priv->subresourcesMap.end();
-    for (ResourcesMap::const_iterator it = priv->subresourcesMap.begin(); it != end; ++it)
-        subresources = g_list_prepend(subresources, it->value.get());
-
-    return g_list_reverse(subresources);
-}
-
-/**
  * webkit_web_view_get_inspector:
  * @web_view: a #WebKitWebView
  *
index b679d9d..a2992d1 100644 (file)
@@ -371,9 +371,6 @@ webkit_web_view_run_javascript_from_gresource_finish (WebKitWebView
 WEBKIT_API WebKitWebResource *
 webkit_web_view_get_main_resource                    (WebKitWebView             *web_view);
 
-WEBKIT_API GList *
-webkit_web_view_get_subresources                     (WebKitWebView             *web_view);
-
 WEBKIT_API WebKitWebInspector *
 webkit_web_view_get_inspector                        (WebKitWebView             *web_view);
 
index e9fa3ca..6d0cdf2 100644 (file)
@@ -51,7 +51,6 @@ void webkitWebViewResourceLoadStarted(WebKitWebView*, WebKit::WebFrameProxy*, ui
 void webkitWebViewRunFileChooserRequest(WebKitWebView*, WebKitFileChooserRequest*);
 WebKitWebResource* webkitWebViewGetLoadingWebResource(WebKitWebView*, uint64_t resourceIdentifier);
 void webkitWebViewRemoveLoadingWebResource(WebKitWebView*, uint64_t resourceIdentifier);
-WebKitWebResource* webkitWebViewResourceLoadFinished(WebKitWebView*, uint64_t resourceIdentifier);
 bool webkitWebViewEnterFullScreen(WebKitWebView*);
 bool webkitWebViewLeaveFullScreen(WebKitWebView*);
 void webkitWebViewPopulateContextMenu(WebKitWebView*, WebKit::ImmutableArray* proposedMenu, WebKit::WebHitTestResult*);
index 38baba7..87a8bb7 100644 (file)
@@ -150,7 +150,6 @@ webkit_script_dialog_confirm_set_confirmed
 webkit_script_dialog_prompt_get_default_text
 webkit_script_dialog_prompt_set_text
 webkit_web_view_get_main_resource
-webkit_web_view_get_subresources
 
 <SUBSECTION Standard>
 WebKitWebViewClass
index 20b90b0..c0643bf 100644 (file)
@@ -93,15 +93,27 @@ public:
         g_signal_connect(resource, "failed", G_CALLBACK(resourceFailedCallback), test);
     }
 
+    void clearSubresources()
+    {
+        g_list_free_full(m_subresources, reinterpret_cast<GDestroyNotify>(g_object_unref));
+        m_subresources = 0;
+    }
+
     ResourcesTest()
         : WebViewTest()
         , m_resourcesLoaded(0)
         , m_resourcesToLoad(0)
         , m_resourceDataSize(0)
+        , m_subresources(0)
     {
         g_signal_connect(m_webView, "resource-load-started", G_CALLBACK(resourceLoadStartedCallback), this);
     }
 
+    ~ResourcesTest()
+    {
+        clearSubresources();
+    }
+
     virtual void resourceLoadStarted(WebKitWebResource* resource, WebKitURIRequest* request)
     {
     }
@@ -121,6 +133,8 @@ public:
     virtual void resourceFinished(WebKitWebResource* resource)
     {
         g_signal_handlers_disconnect_matched(resource, G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
+        if (webkit_web_view_get_main_resource(m_webView) != resource)
+            m_subresources = g_list_prepend(m_subresources, g_object_ref(resource));
         if (++m_resourcesLoaded == m_resourcesToLoad)
             g_main_loop_quit(m_mainLoop);
     }
@@ -134,9 +148,15 @@ public:
     {
         m_resourcesLoaded = 0;
         m_resourcesToLoad = resourcesCount;
+        clearSubresources();
         g_main_loop_run(m_mainLoop);
     }
 
+    GList* subresources()
+    {
+        return m_subresources;
+    }
+
     static void resourceGetDataCallback(GObject* object, GAsyncResult* result, gpointer userData)
     {
         size_t dataSize;
@@ -177,13 +197,14 @@ public:
     size_t m_resourcesToLoad;
     GOwnPtr<char> m_resourceData;
     size_t m_resourceDataSize;
+    GList* m_subresources;
 };
 
 static void testWebViewResources(ResourcesTest* test, gconstpointer)
 {
     // Nothing loaded yet, there shoulnd't be resources.
     g_assert(!webkit_web_view_get_main_resource(test->m_webView));
-    g_assert(!webkit_web_view_get_subresources(test->m_webView));
+    g_assert(!test->subresources());
 
     // Load simple page without subresources.
     test->loadHtml("<html><body>Testing WebKitGTK+</body></html>", 0);
@@ -191,7 +212,7 @@ static void testWebViewResources(ResourcesTest* test, gconstpointer)
     WebKitWebResource* resource = webkit_web_view_get_main_resource(test->m_webView);
     g_assert(resource);
     g_assert_cmpstr(webkit_web_view_get_uri(test->m_webView), ==, webkit_web_resource_get_uri(resource));
-    g_assert(!webkit_web_view_get_subresources(test->m_webView));
+    g_assert(!test->subresources());
 
     // Load simple page with subresources.
     test->loadURI(kServer->getURIForPath("/").data());
@@ -200,9 +221,9 @@ static void testWebViewResources(ResourcesTest* test, gconstpointer)
     resource = webkit_web_view_get_main_resource(test->m_webView);
     g_assert(resource);
     g_assert_cmpstr(webkit_web_view_get_uri(test->m_webView), ==, webkit_web_resource_get_uri(resource));
-    GOwnPtr<GList> subresources(webkit_web_view_get_subresources(test->m_webView));
+    GList* subresources = test->subresources();
     g_assert(subresources);
-    g_assert_cmpint(g_list_length(subresources.get()), ==, 3);
+    g_assert_cmpint(g_list_length(subresources), ==, 3);
 
 #if 0
     // Load the same URI again.
@@ -505,8 +526,8 @@ static void testWebResourceGetData(ResourcesTest* test, gconstpointer)
     g_assert(resource);
     test->checkResourceData(resource);
 
-    GOwnPtr<GList> subresources(webkit_web_view_get_subresources(test->m_webView));
-    for (GList* item = subresources.get(); item; item = g_list_next(item))
+    GList* subresources = test->subresources();
+    for (GList* item = subresources; item; item = g_list_next(item))
         test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
 }