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()