Title: [112227] trunk/Source/WebKit2
Revision
112227
Author
carlo...@webkit.org
Date
2012-03-27 01:56:45 -0700 (Tue, 27 Mar 2012)

Log Message

[GTK] Add method webkit_web_resource_get_data() to WebKit2 GTK+ API
https://bugs.webkit.org/show_bug.cgi?id=79667

Reviewed by Gustavo Noronha Silva.

* UIProcess/API/gtk/WebKitWebResource.cpp:
(webkitWebResourceCreate): Add isMainResource parameter indication
whether the resource is the main one of the frame.
(resourceDataCallback): C API callback called when resource data
is available.
(webkit_web_resource_get_data): Asynchronously get the raw data of
the resource.
(webkit_web_resource_get_data_finish): Finish asynchronous
operation started by webkit_web_resource_get_data().
* UIProcess/API/gtk/WebKitWebResource.h:
* UIProcess/API/gtk/WebKitWebResourcePrivate.h:
* UIProcess/API/gtk/WebKitWebView.cpp:
(webkitWebViewResourceLoadStarted): Pass isMainResource parameter
to webkitWebResourceCreate().
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
* UIProcess/API/gtk/tests/TestResources.cpp:
(testWebResourceGetData):
(serverCallback):
(beforeAll):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (112226 => 112227)


--- trunk/Source/WebKit2/ChangeLog	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/ChangeLog	2012-03-27 08:56:45 UTC (rev 112227)
@@ -1,5 +1,32 @@
 2012-03-27  Carlos Garcia Campos  <cgar...@igalia.com>
 
+        [GTK] Add method webkit_web_resource_get_data() to WebKit2 GTK+ API
+        https://bugs.webkit.org/show_bug.cgi?id=79667
+
+        Reviewed by Gustavo Noronha Silva.
+
+        * UIProcess/API/gtk/WebKitWebResource.cpp:
+        (webkitWebResourceCreate): Add isMainResource parameter indication
+        whether the resource is the main one of the frame.
+        (resourceDataCallback): C API callback called when resource data
+        is available.
+        (webkit_web_resource_get_data): Asynchronously get the raw data of
+        the resource.
+        (webkit_web_resource_get_data_finish): Finish asynchronous
+        operation started by webkit_web_resource_get_data().
+        * UIProcess/API/gtk/WebKitWebResource.h:
+        * UIProcess/API/gtk/WebKitWebResourcePrivate.h:
+        * UIProcess/API/gtk/WebKitWebView.cpp:
+        (webkitWebViewResourceLoadStarted): Pass isMainResource parameter
+        to webkitWebResourceCreate().
+        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
+        * UIProcess/API/gtk/tests/TestResources.cpp:
+        (testWebResourceGetData):
+        (serverCallback):
+        (beforeAll):
+
+2012-03-27  Carlos Garcia Campos  <cgar...@igalia.com>
+
         [GTK] Add resources API to WebKit2 GTK+
         https://bugs.webkit.org/show_bug.cgi?id=79477
 

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.cpp (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.cpp	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.cpp	2012-03-27 08:56:45 UTC (rev 112227)
@@ -50,6 +50,7 @@
     WKRetainPtr<WKFrameRef> wkFrame;
     CString uri;
     GRefPtr<WebKitURIResponse> response;
+    bool isMainResource;
 };
 
 static guint signals[LAST_SIGNAL] = { 0, };
@@ -204,12 +205,13 @@
     g_object_notify(G_OBJECT(resource), "uri");
 }
 
-WebKitWebResource* webkitWebResourceCreate(WKFrameRef wkFrame, WebKitURIRequest* request)
+WebKitWebResource* webkitWebResourceCreate(WKFrameRef wkFrame, WebKitURIRequest* request, bool isMainResource)
 {
     ASSERT(wkFrame);
     WebKitWebResource* resource = WEBKIT_WEB_RESOURCE(g_object_new(WEBKIT_TYPE_WEB_RESOURCE, NULL));
     resource->priv->wkFrame = wkFrame;
     resource->priv->uri = webkit_uri_request_get_uri(request);
+    resource->priv->isMainResource = isMainResource;
     return resource;
 }
 
@@ -299,3 +301,63 @@
     return resource->priv->response.get();
 }
 
+static void resourceDataCallback(WKDataRef data, WKErrorRef, void* context)
+{
+    GRefPtr<GSimpleAsyncResult> result = adoptGRef(G_SIMPLE_ASYNC_RESULT(context));
+    g_simple_async_result_set_op_res_gpointer(result.get(), const_cast<OpaqueWKData*>(data), 0);
+    g_simple_async_result_complete(result.get());
+}
+
+/**
+ * webkit_web_resource_get_data:
+ * @resource: a #WebKitWebResource
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously get the raw data for @resource.
+ *
+ * When the operation is finished, @callback will be called. You can then call
+ * webkit_web_resource_get_data_finish() to get the result of the operation.
+ */
+void webkit_web_resource_get_data(WebKitWebResource* resource, GAsyncReadyCallback callback, gpointer userData)
+{
+    g_return_if_fail(WEBKIT_IS_WEB_RESOURCE(resource));
+
+    GSimpleAsyncResult* result = g_simple_async_result_new(G_OBJECT(resource), callback, userData,
+                                                           reinterpret_cast<gpointer>(webkit_web_resource_get_data));
+    if (resource->priv->isMainResource)
+        WKFrameGetMainResourceData(resource->priv->wkFrame.get(), resourceDataCallback, result);
+    else {
+        WKRetainPtr<WKURLRef> url(AdoptWK, WKURLCreateWithUTF8CString(resource->priv->uri.data()));
+        WKFrameGetResourceData(resource->priv->wkFrame.get(), url.get(), resourceDataCallback, result);
+    }
+}
+
+/**
+ * webkit_web_resource_get_data_finish:
+ * @resource: a #WebKitWebResource
+ * @result: a #GAsyncResult
+ * @length: (out): return location for the length of the resource data
+ * @error: return location for error or %NULL to ignore
+ *
+ * Finish an asynchronous operation started with webkit_web_resource_get_data().
+ *
+ * Returns: (transfer full): a string with the data of @resource, or %NULL in case
+ *    of error. if @length is not %NULL, the size of the data will be assigned to it.
+ */
+guchar* webkit_web_resource_get_data_finish(WebKitWebResource* resource, GAsyncResult* result, gsize* length, GError** error)
+{
+    g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(resource), 0);
+    g_return_val_if_fail(G_IS_ASYNC_RESULT(result), 0);
+
+    GSimpleAsyncResult* simple = G_SIMPLE_ASYNC_RESULT(result);
+    g_warn_if_fail(g_simple_async_result_get_source_tag(simple) == webkit_web_resource_get_data);
+
+    if (g_simple_async_result_propagate_error(simple, error))
+        return 0;
+
+    WKDataRef wkData = static_cast<WKDataRef>(g_simple_async_result_get_op_res_gpointer(simple));
+    if (length)
+        *length = WKDataGetSize(wkData);
+    return static_cast<guchar*>(g_memdup(WKDataGetBytes(wkData), WKDataGetSize(wkData)));
+}

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.h (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.h	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.h	2012-03-27 08:56:45 UTC (rev 112227)
@@ -25,6 +25,7 @@
 #define WebKitWebResource_h
 
 #include <glib-object.h>
+#include <gio/gio.h>
 #include <webkit2/WebKitDefines.h>
 #include <webkit2/WebKitURIResponse.h>
 
@@ -60,6 +61,17 @@
 WEBKIT_API WebKitURIResponse *
 webkit_web_resource_get_response    (WebKitWebResource  *resource);
 
+WEBKIT_API void
+webkit_web_resource_get_data        (WebKitWebResource  *resource,
+                                     GAsyncReadyCallback callback,
+                                     gpointer            user_data);
+
+WEBKIT_API guchar *
+webkit_web_resource_get_data_finish (WebKitWebResource  *resource,
+                                     GAsyncResult       *result,
+                                     gsize              *length,
+                                     GError            **error);
+
 G_END_DECLS
 
 #endif

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResourcePrivate.h (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResourcePrivate.h	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResourcePrivate.h	2012-03-27 08:56:45 UTC (rev 112227)
@@ -23,7 +23,7 @@
 #include "WebKitPrivate.h"
 #include "WebKitWebResource.h"
 
-WebKitWebResource* webkitWebResourceCreate(WKFrameRef, WebKitURIRequest*);
+WebKitWebResource* webkitWebResourceCreate(WKFrameRef, WebKitURIRequest*, bool isMainResource);
 void webkitWebResourceSentRequest(WebKitWebResource*, WebKitURIRequest*, WebKitURIResponse*);
 void webkitWebResourceSetResponse(WebKitWebResource*, WebKitURIResponse*);
 void webkitWebResourceNotifyProgress(WebKitWebResource*, guint64 bytesReceived);

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp	2012-03-27 08:56:45 UTC (rev 112227)
@@ -870,7 +870,7 @@
 void webkitWebViewResourceLoadStarted(WebKitWebView* webView, WKFrameRef wkFrame, uint64_t resourceIdentifier, WebKitURIRequest* request, bool isMainResource)
 {
     // FIXME: ignore resources when replacing content.
-    WebKitWebResource* resource = webkitWebResourceCreate(wkFrame, request);
+    WebKitWebResource* resource = webkitWebResourceCreate(wkFrame, request, isMainResource);
     WebKitWebViewPrivate* priv = webView->priv;
     if (WKFrameIsMainFrame(wkFrame) && isMainResource)
         priv->mainResource = resource;

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt	2012-03-27 08:56:45 UTC (rev 112227)
@@ -480,6 +480,8 @@
 WebKitWebResource
 webkit_web_resource_get_uri
 webkit_web_resource_get_response
+webkit_web_resource_get_data
+webkit_web_resource_get_data_finish
 
 <SUBSECTION Standard>
 WebKitWebResourceClass

Modified: trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp (112226 => 112227)


--- trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp	2012-03-27 08:56:42 UTC (rev 112226)
+++ trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp	2012-03-27 08:56:45 UTC (rev 112227)
@@ -25,6 +25,23 @@
 
 static WebKitTestServer* kServer;
 
+static const char* kIndexHtml =
+    "<html><head>"
+    " <link rel='stylesheet' href='' type='text/css'>"
+    " <script language='_javascript_' src=''></script>"
+    "</head><body>WebKitGTK+ resources test</body></html>";
+
+static const char* kStyleCSS =
+    "body {"
+    "    margin: 0px;"
+    "    padding: 0px;"
+    "    font-family: sans-serif;"
+    "    background: url(/blank.ico) 0 0 no-repeat;"
+    "    color: black;"
+    "}";
+
+static const char* kJavascript = "function foo () { var a = 1; }";
+
 class ResourcesTest: public WebViewTest {
 public:
     MAKE_GLIB_TEST_FIXTURE(ResourcesTest);
@@ -75,6 +92,7 @@
         : WebViewTest()
         , m_resourcesLoaded(0)
         , m_resourcesToLoad(0)
+        , m_resourceDataSize(0)
     {
         g_signal_connect(m_webView, "resource-load-started", G_CALLBACK(resourceLoadStartedCallback), this);
     }
@@ -114,8 +132,46 @@
         g_main_loop_run(m_mainLoop);
     }
 
+    static void resourceGetDataCallback(GObject* object, GAsyncResult* result, gpointer userData)
+    {
+        size_t dataSize;
+        GOwnPtr<GError> error;
+        unsigned char* data = "" result, &dataSize, &error.outPtr());
+        g_assert(!error.get());
+        g_assert(data);
+        g_assert_cmpint(dataSize, >, 0);
+
+        ResourcesTest* test = static_cast<ResourcesTest*>(userData);
+        test->m_resourceData.set(reinterpret_cast<char*>(data));
+        test->m_resourceDataSize = dataSize;
+        g_main_loop_quit(test->m_mainLoop);
+    }
+
+    void checkResourceData(WebKitWebResource* resource)
+    {
+        m_resourceDataSize = 0;
+        webkit_web_resource_get_data(resource, resourceGetDataCallback, this);
+        g_main_loop_run(m_mainLoop);
+
+        const char* uri = webkit_web_resource_get_uri(resource);
+        if (uri == kServer->getURIForPath("/")) {
+            g_assert_cmpint(m_resourceDataSize, ==, strlen(kIndexHtml));
+            g_assert(!strncmp(m_resourceData.get(), kIndexHtml, m_resourceDataSize));
+        } else if (uri == kServer->getURIForPath("/style.css")) {
+            g_assert_cmpint(m_resourceDataSize, ==, strlen(kStyleCSS));
+            g_assert(!strncmp(m_resourceData.get(), kStyleCSS, m_resourceDataSize));
+        } else if (uri == kServer->getURIForPath("/_javascript_.js")) {
+            g_assert_cmpint(m_resourceDataSize, ==, strlen(kJavascript));
+            g_assert(!strncmp(m_resourceData.get(), kJavascript, m_resourceDataSize));
+        } else
+            g_assert_not_reached();
+        m_resourceData.clear();
+    }
+
     size_t m_resourcesLoaded;
     size_t m_resourcesToLoad;
+    GOwnPtr<char> m_resourceData;
+    size_t m_resourceDataSize;
 };
 
 static void testWebViewResources(ResourcesTest* test, gconstpointer)
@@ -409,6 +465,22 @@
     test->waitUntilResourceLoadFinsihed();
 }
 
+static void testWebResourceGetData(ResourcesTest* test, gconstpointer)
+{
+    test->loadURI(kServer->getURIForPath("/").data());
+    // FIXME: this should be 4 instead of 3, but we don't get the css image resource
+    // due to bug https://bugs.webkit.org/show_bug.cgi?id=78510.
+    test->waitUntilResourcesLoaded(3);
+
+    WebKitWebResource* resource = webkit_web_view_get_main_resource(test->m_webView);
+    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))
+        test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
+}
+
 static void addCacheHTTPHeadersToResponse(SoupMessage* message)
 {
     // The actual date doesn't really matter.
@@ -439,12 +511,7 @@
     }
 
     if (g_str_equal(path, "/")) {
-        static const char* indexHtml =
-            "<html><head>"
-            " <link rel='stylesheet' href='' type='text/css'>"
-            " <script language='_javascript_' src=''></script>"
-            "</head><body>WebKitGTK+ resources test</body></html>";
-        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, indexHtml, strlen(indexHtml));
+        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kIndexHtml, strlen(kIndexHtml));
     } else if (g_str_equal(path, "/_javascript_.html")) {
         static const char* _javascript_Html = "<html><head><script language='_javascript_' src=''></script></head><body></body></html>";
         soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, _javascript_Html, strlen(_javascript_Html));
@@ -458,19 +525,10 @@
         static const char* invalidCSSHtml = "<html><head><link rel='stylesheet' href='' type='text/css'></head><body></html>";
         soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, invalidCSSHtml, strlen(invalidCSSHtml));
     } else if (g_str_equal(path, "/style.css")) {
-        static const char* css =
-            "body {"
-            "    margin: 0px;"
-            "    padding: 0px;"
-            "    font-family: sans-serif;"
-            "    background: url(/blank.ico) 0 0 no-repeat;"
-            "    color: black;"
-            "}";
-        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, css, strlen(css));
+        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kStyleCSS, strlen(kStyleCSS));
         addCacheHTTPHeadersToResponse(message);
     } else if (g_str_equal(path, "/_javascript_.js")) {
-        static const char* _javascript_ = "function foo () { var a = 1; }";
-        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, _javascript_, strlen(_javascript_));
+        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kJavascript, strlen(kJavascript));
     } else if (g_str_equal(path, "/blank.ico")) {
         GOwnPtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL));
         char* contents;
@@ -502,6 +560,7 @@
     SingleResourceLoadTest::add("WebKitWebResource", "loading", testWebResourceLoading);
     SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse);
     ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
+    ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
 }
 
 void afterAll()
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to