Changeset 112227 in webkit


Ignore:
Timestamp:
Mar 27, 2012 1:56:45 AM (12 years ago)
Author:
Carlos Garcia Campos
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):

Location:
trunk/Source/WebKit2
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r112221 r112227  
     12012-03-27  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add method webkit_web_resource_get_data() to WebKit2 GTK+ API
     4        https://bugs.webkit.org/show_bug.cgi?id=79667
     5
     6        Reviewed by Gustavo Noronha Silva.
     7
     8        * UIProcess/API/gtk/WebKitWebResource.cpp:
     9        (webkitWebResourceCreate): Add isMainResource parameter indication
     10        whether the resource is the main one of the frame.
     11        (resourceDataCallback): C API callback called when resource data
     12        is available.
     13        (webkit_web_resource_get_data): Asynchronously get the raw data of
     14        the resource.
     15        (webkit_web_resource_get_data_finish): Finish asynchronous
     16        operation started by webkit_web_resource_get_data().
     17        * UIProcess/API/gtk/WebKitWebResource.h:
     18        * UIProcess/API/gtk/WebKitWebResourcePrivate.h:
     19        * UIProcess/API/gtk/WebKitWebView.cpp:
     20        (webkitWebViewResourceLoadStarted): Pass isMainResource parameter
     21        to webkitWebResourceCreate().
     22        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbols.
     23        * UIProcess/API/gtk/tests/TestResources.cpp:
     24        (testWebResourceGetData):
     25        (serverCallback):
     26        (beforeAll):
     27
    1282012-03-27  Carlos Garcia Campos  <cgarcia@igalia.com>
    229
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.cpp

    r112221 r112227  
    5151    CString uri;
    5252    GRefPtr<WebKitURIResponse> response;
     53    bool isMainResource;
    5354};
    5455
     
    205206}
    206207
    207 WebKitWebResource* webkitWebResourceCreate(WKFrameRef wkFrame, WebKitURIRequest* request)
     208WebKitWebResource* webkitWebResourceCreate(WKFrameRef wkFrame, WebKitURIRequest* request, bool isMainResource)
    208209{
    209210    ASSERT(wkFrame);
     
    211212    resource->priv->wkFrame = wkFrame;
    212213    resource->priv->uri = webkit_uri_request_get_uri(request);
     214    resource->priv->isMainResource = isMainResource;
    213215    return resource;
    214216}
     
    300302}
    301303
     304static void resourceDataCallback(WKDataRef data, WKErrorRef, void* context)
     305{
     306    GRefPtr<GSimpleAsyncResult> result = adoptGRef(G_SIMPLE_ASYNC_RESULT(context));
     307    g_simple_async_result_set_op_res_gpointer(result.get(), const_cast<OpaqueWKData*>(data), 0);
     308    g_simple_async_result_complete(result.get());
     309}
     310
     311/**
     312 * webkit_web_resource_get_data:
     313 * @resource: a #WebKitWebResource
     314 * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
     315 * @user_data: (closure): the data to pass to callback function
     316 *
     317 * Asynchronously get the raw data for @resource.
     318 *
     319 * When the operation is finished, @callback will be called. You can then call
     320 * webkit_web_resource_get_data_finish() to get the result of the operation.
     321 */
     322void webkit_web_resource_get_data(WebKitWebResource* resource, GAsyncReadyCallback callback, gpointer userData)
     323{
     324    g_return_if_fail(WEBKIT_IS_WEB_RESOURCE(resource));
     325
     326    GSimpleAsyncResult* result = g_simple_async_result_new(G_OBJECT(resource), callback, userData,
     327                                                           reinterpret_cast<gpointer>(webkit_web_resource_get_data));
     328    if (resource->priv->isMainResource)
     329        WKFrameGetMainResourceData(resource->priv->wkFrame.get(), resourceDataCallback, result);
     330    else {
     331        WKRetainPtr<WKURLRef> url(AdoptWK, WKURLCreateWithUTF8CString(resource->priv->uri.data()));
     332        WKFrameGetResourceData(resource->priv->wkFrame.get(), url.get(), resourceDataCallback, result);
     333    }
     334}
     335
     336/**
     337 * webkit_web_resource_get_data_finish:
     338 * @resource: a #WebKitWebResource
     339 * @result: a #GAsyncResult
     340 * @length: (out): return location for the length of the resource data
     341 * @error: return location for error or %NULL to ignore
     342 *
     343 * Finish an asynchronous operation started with webkit_web_resource_get_data().
     344 *
     345 * Returns: (transfer full): a string with the data of @resource, or %NULL in case
     346 *    of error. if @length is not %NULL, the size of the data will be assigned to it.
     347 */
     348guchar* webkit_web_resource_get_data_finish(WebKitWebResource* resource, GAsyncResult* result, gsize* length, GError** error)
     349{
     350    g_return_val_if_fail(WEBKIT_IS_WEB_RESOURCE(resource), 0);
     351    g_return_val_if_fail(G_IS_ASYNC_RESULT(result), 0);
     352
     353    GSimpleAsyncResult* simple = G_SIMPLE_ASYNC_RESULT(result);
     354    g_warn_if_fail(g_simple_async_result_get_source_tag(simple) == webkit_web_resource_get_data);
     355
     356    if (g_simple_async_result_propagate_error(simple, error))
     357        return 0;
     358
     359    WKDataRef wkData = static_cast<WKDataRef>(g_simple_async_result_get_op_res_gpointer(simple));
     360    if (length)
     361        *length = WKDataGetSize(wkData);
     362    return static_cast<guchar*>(g_memdup(WKDataGetBytes(wkData), WKDataGetSize(wkData)));
     363}
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResource.h

    r112221 r112227  
    2626
    2727#include <glib-object.h>
     28#include <gio/gio.h>
    2829#include <webkit2/WebKitDefines.h>
    2930#include <webkit2/WebKitURIResponse.h>
     
    6162webkit_web_resource_get_response    (WebKitWebResource  *resource);
    6263
     64WEBKIT_API void
     65webkit_web_resource_get_data        (WebKitWebResource  *resource,
     66                                     GAsyncReadyCallback callback,
     67                                     gpointer            user_data);
     68
     69WEBKIT_API guchar *
     70webkit_web_resource_get_data_finish (WebKitWebResource  *resource,
     71                                     GAsyncResult       *result,
     72                                     gsize              *length,
     73                                     GError            **error);
     74
    6375G_END_DECLS
    6476
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebResourcePrivate.h

    r112221 r112227  
    2424#include "WebKitWebResource.h"
    2525
    26 WebKitWebResource* webkitWebResourceCreate(WKFrameRef, WebKitURIRequest*);
     26WebKitWebResource* webkitWebResourceCreate(WKFrameRef, WebKitURIRequest*, bool isMainResource);
    2727void webkitWebResourceSentRequest(WebKitWebResource*, WebKitURIRequest*, WebKitURIResponse*);
    2828void webkitWebResourceSetResponse(WebKitWebResource*, WebKitURIResponse*);
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r112221 r112227  
    871871{
    872872    // FIXME: ignore resources when replacing content.
    873     WebKitWebResource* resource = webkitWebResourceCreate(wkFrame, request);
     873    WebKitWebResource* resource = webkitWebResourceCreate(wkFrame, request, isMainResource);
    874874    WebKitWebViewPrivate* priv = webView->priv;
    875875    if (WKFrameIsMainFrame(wkFrame) && isMainResource)
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r112221 r112227  
    481481webkit_web_resource_get_uri
    482482webkit_web_resource_get_response
     483webkit_web_resource_get_data
     484webkit_web_resource_get_data_finish
    483485
    484486<SUBSECTION Standard>
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp

    r112221 r112227  
    2626static WebKitTestServer* kServer;
    2727
     28static const char* kIndexHtml =
     29    "<html><head>"
     30    " <link rel='stylesheet' href='/style.css' type='text/css'>"
     31    " <script language='javascript' src='/javascript.js'></script>"
     32    "</head><body>WebKitGTK+ resources test</body></html>";
     33
     34static const char* kStyleCSS =
     35    "body {"
     36    "    margin: 0px;"
     37    "    padding: 0px;"
     38    "    font-family: sans-serif;"
     39    "    background: url(/blank.ico) 0 0 no-repeat;"
     40    "    color: black;"
     41    "}";
     42
     43static const char* kJavascript = "function foo () { var a = 1; }";
     44
    2845class ResourcesTest: public WebViewTest {
    2946public:
     
    7693        , m_resourcesLoaded(0)
    7794        , m_resourcesToLoad(0)
     95        , m_resourceDataSize(0)
    7896    {
    7997        g_signal_connect(m_webView, "resource-load-started", G_CALLBACK(resourceLoadStartedCallback), this);
     
    115133    }
    116134
     135    static void resourceGetDataCallback(GObject* object, GAsyncResult* result, gpointer userData)
     136    {
     137        size_t dataSize;
     138        GOwnPtr<GError> error;
     139        unsigned char* data = webkit_web_resource_get_data_finish(WEBKIT_WEB_RESOURCE(object), result, &dataSize, &error.outPtr());
     140        g_assert(!error.get());
     141        g_assert(data);
     142        g_assert_cmpint(dataSize, >, 0);
     143
     144        ResourcesTest* test = static_cast<ResourcesTest*>(userData);
     145        test->m_resourceData.set(reinterpret_cast<char*>(data));
     146        test->m_resourceDataSize = dataSize;
     147        g_main_loop_quit(test->m_mainLoop);
     148    }
     149
     150    void checkResourceData(WebKitWebResource* resource)
     151    {
     152        m_resourceDataSize = 0;
     153        webkit_web_resource_get_data(resource, resourceGetDataCallback, this);
     154        g_main_loop_run(m_mainLoop);
     155
     156        const char* uri = webkit_web_resource_get_uri(resource);
     157        if (uri == kServer->getURIForPath("/")) {
     158            g_assert_cmpint(m_resourceDataSize, ==, strlen(kIndexHtml));
     159            g_assert(!strncmp(m_resourceData.get(), kIndexHtml, m_resourceDataSize));
     160        } else if (uri == kServer->getURIForPath("/style.css")) {
     161            g_assert_cmpint(m_resourceDataSize, ==, strlen(kStyleCSS));
     162            g_assert(!strncmp(m_resourceData.get(), kStyleCSS, m_resourceDataSize));
     163        } else if (uri == kServer->getURIForPath("/javascript.js")) {
     164            g_assert_cmpint(m_resourceDataSize, ==, strlen(kJavascript));
     165            g_assert(!strncmp(m_resourceData.get(), kJavascript, m_resourceDataSize));
     166        } else
     167            g_assert_not_reached();
     168        m_resourceData.clear();
     169    }
     170
    117171    size_t m_resourcesLoaded;
    118172    size_t m_resourcesToLoad;
     173    GOwnPtr<char> m_resourceData;
     174    size_t m_resourceDataSize;
    119175};
    120176
     
    410466}
    411467
     468static void testWebResourceGetData(ResourcesTest* test, gconstpointer)
     469{
     470    test->loadURI(kServer->getURIForPath("/").data());
     471    // FIXME: this should be 4 instead of 3, but we don't get the css image resource
     472    // due to bug https://bugs.webkit.org/show_bug.cgi?id=78510.
     473    test->waitUntilResourcesLoaded(3);
     474
     475    WebKitWebResource* resource = webkit_web_view_get_main_resource(test->m_webView);
     476    g_assert(resource);
     477    test->checkResourceData(resource);
     478
     479    GOwnPtr<GList> subresources(webkit_web_view_get_subresources(test->m_webView));
     480    for (GList* item = subresources.get(); item; item = g_list_next(item))
     481        test->checkResourceData(WEBKIT_WEB_RESOURCE(item->data));
     482}
     483
    412484static void addCacheHTTPHeadersToResponse(SoupMessage* message)
    413485{
     
    440512
    441513    if (g_str_equal(path, "/")) {
    442         static const char* indexHtml =
    443             "<html><head>"
    444             " <link rel='stylesheet' href='/style.css' type='text/css'>"
    445             " <script language='javascript' src='/javascript.js'></script>"
    446             "</head><body>WebKitGTK+ resources test</body></html>";
    447         soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, indexHtml, strlen(indexHtml));
     514        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kIndexHtml, strlen(kIndexHtml));
    448515    } else if (g_str_equal(path, "/javascript.html")) {
    449516        static const char* javascriptHtml = "<html><head><script language='javascript' src='/javascript.js'></script></head><body></body></html>";
     
    459526        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, invalidCSSHtml, strlen(invalidCSSHtml));
    460527    } else if (g_str_equal(path, "/style.css")) {
    461         static const char* css =
    462             "body {"
    463             "    margin: 0px;"
    464             "    padding: 0px;"
    465             "    font-family: sans-serif;"
    466             "    background: url(/blank.ico) 0 0 no-repeat;"
    467             "    color: black;"
    468             "}";
    469         soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, css, strlen(css));
     528        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kStyleCSS, strlen(kStyleCSS));
    470529        addCacheHTTPHeadersToResponse(message);
    471530    } else if (g_str_equal(path, "/javascript.js")) {
    472         static const char* javascript = "function foo () { var a = 1; }";
    473         soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, javascript, strlen(javascript));
     531        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kJavascript, strlen(kJavascript));
    474532    } else if (g_str_equal(path, "/blank.ico")) {
    475533        GOwnPtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL));
     
    503561    SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse);
    504562    ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
     563    ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
    505564}
    506565
Note: See TracChangeset for help on using the changeset viewer.