Changeset 144893 in webkit


Ignore:
Timestamp:
Mar 6, 2013, 12:11:23 AM (12 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add WebKitWebPage::send-request signal to WebKit2 GTK+ API
https://bugs.webkit.org/show_bug.cgi?id=83681

Reviewed by Martin Robinson.

Add WebKitWebPage::send-request signal emitted in willSendRequest
callback to allow web process extensions to modify requests before
they are sent or cancel the resource load.

  • UIProcess/API/gtk/WebKitURIRequest.cpp:

(webkitURIRequestSetProperty): Use webkit_uri_request_set_uri() to
set the new URI.
(webkit_uri_request_class_init): Make URI property construct
instead of construct-only, since it can be updated once
constructed. It should never be NULL, so set default value to
about:blank instad of NULL.
(webkit_uri_request_set_uri): New public method to set the URI of
the WebKitURIRequest.

  • UIProcess/API/gtk/WebKitURIRequest.h: Allow to include this file

from webkit-web-extension.h.

  • UIProcess/API/gtk/WebKitURIResponse.h: Ditto.
  • UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add

webkit_uri_request_set_uri.

  • UIProcess/API/gtk/tests/TestResources.cpp:

(testWebResourceSendRequest):
(serverCallback):
(beforeAll):

  • UIProcess/API/gtk/tests/WebExtensionTest.cpp:

(sendRequestCallback):
(pageCreatedCallback):

  • UIProcess/API/gtk/webkit2marshal.list:
  • WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:

(willSendRequestForFrame): Emit WebKitWebPage::send-request and
return early if the load is cancelled.
(webkit_web_page_class_init): Add WebKitWebPage::send-request signal.

  • WebProcess/InjectedBundle/API/gtk/webkit-web-extension.h:
Location:
releases/WebKitGTK/webkit-2.0/Source/WebKit2
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/ChangeLog

    r144890 r144893  
     12013-03-05  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add WebKitWebPage::send-request signal to WebKit2 GTK+ API
     4        https://bugs.webkit.org/show_bug.cgi?id=83681
     5
     6        Reviewed by Martin Robinson.
     7
     8        Add WebKitWebPage::send-request signal emitted in willSendRequest
     9        callback to allow web process extensions to modify requests before
     10        they are sent or cancel the resource load.
     11
     12        * UIProcess/API/gtk/WebKitURIRequest.cpp:
     13        (webkitURIRequestSetProperty): Use webkit_uri_request_set_uri() to
     14        set the new URI.
     15        (webkit_uri_request_class_init): Make URI property construct
     16        instead of construct-only, since it can be updated once
     17        constructed. It should never be NULL, so set default value to
     18        about:blank instad of NULL.
     19        (webkit_uri_request_set_uri): New public method to set the URI of
     20        the WebKitURIRequest.
     21        * UIProcess/API/gtk/WebKitURIRequest.h: Allow to include this file
     22        from webkit-web-extension.h.
     23        * UIProcess/API/gtk/WebKitURIResponse.h: Ditto.
     24        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add
     25        webkit_uri_request_set_uri.
     26        * UIProcess/API/gtk/tests/TestResources.cpp:
     27        (testWebResourceSendRequest):
     28        (serverCallback):
     29        (beforeAll):
     30        * UIProcess/API/gtk/tests/WebExtensionTest.cpp:
     31        (sendRequestCallback):
     32        (pageCreatedCallback):
     33        * UIProcess/API/gtk/webkit2marshal.list:
     34        * WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp:
     35        (willSendRequestForFrame): Emit WebKitWebPage::send-request and
     36        return early if the load is cancelled.
     37        (webkit_web_page_class_init): Add WebKitWebPage::send-request signal.
     38        * WebProcess/InjectedBundle/API/gtk/webkit-web-extension.h:
     39
    1402013-03-05  Manuel Rego Casasnovas  <rego@igalia.com>
    241
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.cpp

    r137469 r144893  
    7171    switch (propId) {
    7272    case PROP_URI:
    73         request->priv->resourceRequest.setURL(KURL(KURL(), g_value_get_string(value)));
     73        webkit_uri_request_set_uri(request, g_value_get_string(value));
    7474        break;
    7575    default:
     
    9393                                                        _("URI"),
    9494                                                        _("The URI to which the request will be made."),
    95                                                         0,
    96                                                         static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
     95                                                        "about:blank",
     96                                                        static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT)));
    9797}
    9898
     
    126126}
    127127
     128/**
     129 * webkit_uri_request_set_uri:
     130 * @request: a #WebKitURIRequest
     131 * @uri: an URI
     132 *
     133 * Set the URI of @request
     134 */
     135void webkit_uri_request_set_uri(WebKitURIRequest* request, const char* uri)
     136{
     137    g_return_if_fail(WEBKIT_IS_URI_REQUEST(request));
     138    g_return_if_fail(uri);
     139
     140    KURL url(KURL(), uri);
     141    if (url == request->priv->resourceRequest.url())
     142        return;
     143
     144    request->priv->resourceRequest.setURL(url);
     145    g_object_notify(G_OBJECT(request), "uri");
     146}
     147
    128148WebKitURIRequest* webkitURIRequestCreateForResourceRequest(const WebCore::ResourceRequest& resourceRequest)
    129149{
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.h

    r101248 r144893  
    1818 */
    1919
    20 #if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
     20#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION) && !defined(__WEBKIT_WEB_EXTENSION_H_INSIDE__)
    2121#error "Only <webkit2/webkit2.h> can be included directly."
    2222#endif
     
    6262webkit_uri_request_get_uri  (WebKitURIRequest *request);
    6363
     64WEBKIT_API void
     65webkit_uri_request_set_uri  (WebKitURIRequest *request,
     66                             const gchar      *uri);
     67
    6468G_END_DECLS
    6569
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h

    r143341 r144893  
    1818 */
    1919
    20 #if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
     20#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION) && !defined(__WEBKIT_WEB_EXTENSION_H_INSIDE__)
    2121#error "Only <webkit2/webkit2.h> can be included directly."
    2222#endif
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r144890 r144893  
    331331webkit_uri_request_new
    332332webkit_uri_request_get_uri
     333webkit_uri_request_set_uri
    333334
    334335<SUBSECTION Standard>
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp

    r144740 r144893  
    557557    g_assert(resource);
    558558    g_assert_cmpstr(webkit_web_resource_get_uri(resource), ==, simpleStyleCSSURI.data());
     559}
     560
     561class SendRequestTest: public SingleResourceLoadTest {
     562public:
     563    MAKE_GLIB_TEST_FIXTURE(SendRequestTest);
     564
     565    void resourceSentRequest(WebKitWebResource* resource, WebKitURIRequest* request, WebKitURIResponse* redirectResponse)
     566    {
     567        if (resource != m_resource)
     568            return;
     569
     570        g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, m_expectedNewResourceURI.data());
     571        g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, webkit_web_resource_get_uri(resource));
     572
     573        SingleResourceLoadTest::resourceSentRequest(resource, request, redirectResponse);
     574    }
     575
     576    void resourceFailed(WebKitWebResource* resource, GError* error)
     577    {
     578        if (resource != m_resource)
     579            return;
     580
     581        g_assert_cmpstr(webkit_web_resource_get_uri(resource), ==, m_expectedCancelledResourceURI.data());
     582        g_assert_error(error, WEBKIT_NETWORK_ERROR, WEBKIT_NETWORK_ERROR_CANCELLED);
     583
     584        SingleResourceLoadTest::resourceFailed(resource, error);
     585    }
     586
     587    void setExpectedNewResourceURI(const CString& uri)
     588    {
     589        m_expectedNewResourceURI = uri;
     590    }
     591
     592    void setExpectedCancelledResourceURI(const CString& uri)
     593    {
     594        m_expectedCancelledResourceURI = uri;
     595    }
     596
     597    CString m_expectedNewResourceURI;
     598    CString m_expectedCancelledResourceURI;
     599};
     600
     601static void testWebResourceSendRequest(SendRequestTest* test, gconstpointer)
     602{
     603    test->setExpectedNewResourceURI(kServer->getURIForPath("/javascript.js"));
     604    test->loadURI(kServer->getURIForPath("relative-javascript.html").data());
     605    test->waitUntilResourceLoadFinished();
     606    g_assert(test->m_resource);
     607
     608    Vector<SingleResourceLoadTest::LoadEvents>& events = test->m_loadEvents;
     609    g_assert_cmpint(events.size(), ==, 5);
     610    g_assert_cmpint(events[0], ==, SingleResourceLoadTest::Started);
     611    g_assert_cmpint(events[1], ==, SingleResourceLoadTest::SentRequest);
     612    g_assert_cmpint(events[2], ==, SingleResourceLoadTest::ReceivedResponse);
     613    g_assert_cmpint(events[3], ==, SingleResourceLoadTest::ReceivedData);
     614    g_assert_cmpint(events[4], ==, SingleResourceLoadTest::Finished);
     615    events.clear();
     616
     617    // Cancel request.
     618    test->setExpectedCancelledResourceURI(kServer->getURIForPath("/cancel-this.js"));
     619    test->loadURI(kServer->getURIForPath("/resource-to-cancel.html").data());
     620    test->waitUntilResourceLoadFinished();
     621    g_assert(test->m_resource);
     622
     623    g_assert_cmpint(events.size(), ==, 3);
     624    g_assert_cmpint(events[0], ==, SingleResourceLoadTest::Started);
     625    g_assert_cmpint(events[1], ==, SingleResourceLoadTest::Failed);
     626    g_assert_cmpint(events[2], ==, SingleResourceLoadTest::Finished);
     627    events.clear();
    559628}
    560629
     
    612681        soup_message_headers_append(message->response_headers, "Content-Type", "text/javascript");
    613682        soup_message_headers_append(message->response_headers, "Content-Disposition", "filename=JavaScript.js");
     683    } else if (g_str_equal(path, "/relative-javascript.html")) {
     684        static const char* javascriptRelativeHTML = "<html><head><script language='javascript' src='remove-this/javascript.js'></script></head><body></body></html>";
     685        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, javascriptRelativeHTML, strlen(javascriptRelativeHTML));
     686    } else if (g_str_equal(path, "/resource-to-cancel.html")) {
     687        static const char* resourceToCancelHTML = "<html><head><script language='javascript' src='cancel-this.js'></script></head><body></body></html>";
     688        soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, resourceToCancelHTML, strlen(resourceToCancelHTML));
    614689    } else if (g_str_equal(path, "/blank.ico")) {
    615690        GOwnPtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL));
     
    642717    kServer->run(serverCallback);
    643718
     719    webkit_web_context_set_web_extensions_directory(webkit_web_context_get_default(), WEBKIT_TEST_WEB_EXTENSIONS_DIR);
     720
    644721    ResourcesTest::add("WebKitWebView", "resources", testWebViewResources);
    645722    SingleResourceLoadTest::add("WebKitWebResource", "loading", testWebResourceLoading);
     
    650727    ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
    651728    SingleResourceLoadTest::add("WebKitWebView", "history-cache", testWebViewResourcesHistoryCache);
     729    SendRequestTest::add("WebKitWebPage", "send-request", testWebResourceSendRequest);
    652730}
    653731
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp

    r144890 r144893  
    2121
    2222#include <gio/gio.h>
     23#include <string.h>
    2324#include <webkit2/webkit-web-extension.h>
    2425#include <wtf/gobject/GOwnPtr.h>
     
    6364}
    6465
     66static gboolean sendRequestCallback(WebKitWebPage*, WebKitURIRequest* request, WebKitURIResponse*, gpointer)
     67{
     68    const char* requestURI = webkit_uri_request_get_uri(request);
     69    g_assert(requestURI);
     70
     71    if (const char* suffix = g_strrstr(requestURI, "/remove-this/javascript.js")) {
     72        GOwnPtr<char> prefix(g_strndup(requestURI, strlen(requestURI) - strlen(suffix)));
     73        GOwnPtr<char> newURI(g_strdup_printf("%s/javascript.js", prefix.get()));
     74        webkit_uri_request_set_uri(request, newURI.get());
     75    } else if (g_str_has_suffix(requestURI, "/cancel-this.js"))
     76        return TRUE;
     77
     78    return FALSE;
     79}
     80
    6581static void pageCreatedCallback(WebKitWebExtension*, WebKitWebPage* webPage, gpointer userData)
    6682{
    6783    g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), userData);
    6884    g_signal_connect(webPage, "notify::uri", G_CALLBACK(uriChangedCallback), userData);
     85    g_signal_connect(webPage, "send-request", G_CALLBACK(sendRequestCallback), 0);
    6986}
    7087
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list

    r133867 r144893  
    44BOOLEAN:OBJECT,BOXED,OBJECT
    55BOOLEAN:OBJECT,ENUM
     6BOOLEAN:OBJECT,OBJECT
    67BOOLEAN:STRING
    78BOOLEAN:VOID
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp

    r144890 r144893  
    2727#include "WebFrame.h"
    2828#include "WebKitDOMDocumentPrivate.h"
     29#include "WebKitMarshal.h"
    2930#include "WebKitPrivate.h"
     31#include "WebKitURIRequestPrivate.h"
     32#include "WebKitURIResponsePrivate.h"
    3033#include "WebKitWebPagePrivate.h"
    3134#include "WebProcess.h"
     
    4144enum {
    4245    DOCUMENT_LOADED,
     46    SEND_REQUEST,
    4347
    4448    LAST_SIGNAL
     
    118122}
    119123
    120 static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef page, WKBundleFrameRef, uint64_t identifier, WKURLRequestRef request, WKURLResponseRef redirectResponse, const void*)
    121 {
    122     ImmutableDictionary::MapType message;
    123     message.set(String::fromUTF8("Page"), toImpl(page));
    124     message.set(String::fromUTF8("Identifier"), WebUInt64::create(identifier));
    125     message.set(String::fromUTF8("Request"), toImpl(request));
    126     if (!toImpl(redirectResponse)->resourceResponse().isNull())
    127         message.set(String::fromUTF8("RedirectResponse"), toImpl(redirectResponse));
     124static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef page, WKBundleFrameRef, uint64_t identifier, WKURLRequestRef wkRequest, WKURLResponseRef wkRedirectResponse, const void* clientInfo)
     125{
     126    GRefPtr<WebKitURIRequest> request = adoptGRef(webkitURIRequestCreateForResourceRequest(toImpl(wkRequest)->resourceRequest()));
     127    GRefPtr<WebKitURIResponse> redirectResponse = wkRedirectResponse ? adoptGRef(webkitURIResponseCreateForResourceResponse(toImpl(wkRedirectResponse)->resourceResponse())) : 0;
     128
     129    gboolean returnValue;
     130    g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[SEND_REQUEST], 0, request.get(), redirectResponse.get(), &returnValue);
     131    if (returnValue)
     132        return 0;
     133
     134    WebURLRequest* newRequest = WebURLRequest::create(webkitURIRequestGetResourceRequest(request.get())).leakRef();
     135
     136    ImmutableDictionary::MapType message;
     137    message.set(String::fromUTF8("Page"), toImpl(page));
     138    message.set(String::fromUTF8("Identifier"), WebUInt64::create(identifier));
     139    message.set(String::fromUTF8("Request"), newRequest);
     140    if (!toImpl(wkRedirectResponse)->resourceResponse().isNull())
     141        message.set(String::fromUTF8("RedirectResponse"), toImpl(wkRedirectResponse));
    128142    WebProcess::shared().injectedBundle()->postMessage(String::fromUTF8("WebPage.DidSendRequestForResource"), ImmutableDictionary::adopt(message).get());
    129143
    130     WKRetain(request);
    131     return request;
     144    return toAPI(newRequest);
    132145}
    133146
     
    218231        g_cclosure_marshal_VOID__OBJECT,
    219232        G_TYPE_NONE, 0);
     233
     234    /**
     235     * WebKitWebPage::send-request:
     236     * @web_page: the #WebKitWebPage on which the signal is emitted
     237     * @request: a #WebKitURIRequest
     238     * @redirected_response: a #WebKitURIResponse, or %NULL
     239     *
     240     * This signal is emitted when @request is about to be sent to
     241     * the server. This signal can be used to modify the #WebKitURIRequest
     242     * that will be sent to the server. You can also cancel the resource load
     243     * operation by connecting to this signal and returning %TRUE.
     244     *
     245     * In case of a server redirection this signal is
     246     * emitted again with the @request argument containing the new
     247     * request to be sent to the server due to the redirection and the
     248     * @redirected_response parameter containing the response
     249     * received by the server for the initial request.
     250     *
     251     * Returns: %TRUE to stop other handlers from being invoked for the event.
     252     *    %FALSE to continue emission of the event.
     253     */
     254    signals[SEND_REQUEST] = g_signal_new(
     255        "send-request",
     256        G_TYPE_FROM_CLASS(klass),
     257        G_SIGNAL_RUN_LAST,
     258        0,
     259        g_signal_accumulator_true_handled, 0,
     260        webkit_marshal_BOOLEAN__OBJECT_OBJECT,
     261        G_TYPE_BOOLEAN, 2,
     262        WEBKIT_TYPE_URI_REQUEST,
     263        WEBKIT_TYPE_URI_RESPONSE);
    220264}
    221265
  • releases/WebKitGTK/webkit-2.0/Source/WebKit2/WebProcess/InjectedBundle/API/gtk/webkit-web-extension.h

    r139305 r144893  
    2323#define __WEBKIT_WEB_EXTENSION_H_INSIDE__
    2424
     25#include <webkit2/WebKitURIRequest.h>
     26#include <webkit2/WebKitURIResponse.h>
    2527#include <webkit2/WebKitWebExtension.h>
    2628#include <webkit2/WebKitWebPage.h>
Note: See TracChangeset for help on using the changeset viewer.