Source/WebKit2/ChangeLog

 12013-02-28 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 NOBODY (OOPS!).
 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-02-21 Carlos Garcia Campos <cgarcia@igalia.com>
241
342 Unreviewed. Fix make distcheck.

Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.cpp

@@static void webkitURIRequestSetProperty(GObject* object, guint propId, const GVa
7070
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:
7676 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);

@@static void webkit_uri_request_class_init(WebKitURIRequestClass* requestClass)
9292 g_param_spec_string("uri",
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
9999/**

@@const gchar* webkit_uri_request_get_uri(WebKitURIRequest* request)
125125 return request->priv->uri.data();
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{
130150 WebKitURIRequest* uriRequest = WEBKIT_URI_REQUEST(g_object_new(WEBKIT_TYPE_URI_REQUEST, NULL));

Source/WebKit2/UIProcess/API/gtk/WebKitURIRequest.h

1717 * Boston, MA 02110-1301, USA.
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
2323

@@webkit_uri_request_new (const gchar *uri);
6161WEBKIT_API const gchar *
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
6670#endif

Source/WebKit2/UIProcess/API/gtk/WebKitURIResponse.h

1717 * Boston, MA 02110-1301, USA.
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
2323

Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

@@webkit_settings_get_type
330330WebKitURIRequest
331331webkit_uri_request_new
332332webkit_uri_request_get_uri
 333webkit_uri_request_set_uri
333334
334335<SUBSECTION Standard>
335336WebKitURIRequestClass

Source/WebKit2/UIProcess/API/gtk/tests/TestResources.cpp

@@static void testWebViewResourcesHistoryCache(SingleResourceLoadTest* test, gcons
560560 g_assert_cmpstr(webkit_web_resource_get_uri(resource), ==, simpleStyleCSSURI.data());
561561}
562562
 563class SendRequestTest: public SingleResourceLoadTest {
 564public:
 565 MAKE_GLIB_TEST_FIXTURE(SendRequestTest);
 566
 567 void resourceSentRequest(WebKitWebResource* resource, WebKitURIRequest* request, WebKitURIResponse* redirectResponse)
 568 {
 569 if (resource != m_resource)
 570 return;
 571
 572 g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, m_expectedNewResourceURI.data());
 573 g_assert_cmpstr(webkit_uri_request_get_uri(request), ==, webkit_web_resource_get_uri(resource));
 574
 575 SingleResourceLoadTest::resourceSentRequest(resource, request, redirectResponse);
 576 }
 577
 578 void resourceFailed(WebKitWebResource* resource, GError* error)
 579 {
 580 if (resource != m_resource)
 581 return;
 582
 583 g_assert_cmpstr(webkit_web_resource_get_uri(resource), ==, m_expectedCancelledResourceURI.data());
 584 g_assert_error(error, WEBKIT_NETWORK_ERROR, WEBKIT_NETWORK_ERROR_CANCELLED);
 585
 586 SingleResourceLoadTest::resourceFailed(resource, error);
 587 }
 588
 589 void setExpectedNewResourceURI(const CString& uri)
 590 {
 591 m_expectedNewResourceURI = uri;
 592 }
 593
 594 void setExpectedCancelledResourceURI(const CString& uri)
 595 {
 596 m_expectedCancelledResourceURI = uri;
 597 }
 598
 599 CString m_expectedNewResourceURI;
 600 CString m_expectedCancelledResourceURI;
 601};
 602
 603static void testWebResourceSendRequest(SendRequestTest* test, gconstpointer)
 604{
 605 test->setExpectedNewResourceURI(kServer->getURIForPath("/javascript.js"));
 606 test->loadURI(kServer->getURIForPath("relative-javascript.html").data());
 607 test->waitUntilResourceLoadFinished();
 608 g_assert(test->m_resource);
 609
 610 Vector<SingleResourceLoadTest::LoadEvents>& events = test->m_loadEvents;
 611 g_assert_cmpint(events.size(), ==, 5);
 612 g_assert_cmpint(events[0], ==, SingleResourceLoadTest::Started);
 613 g_assert_cmpint(events[1], ==, SingleResourceLoadTest::SentRequest);
 614 g_assert_cmpint(events[2], ==, SingleResourceLoadTest::ReceivedResponse);
 615 g_assert_cmpint(events[3], ==, SingleResourceLoadTest::ReceivedData);
 616 g_assert_cmpint(events[4], ==, SingleResourceLoadTest::Finished);
 617 events.clear();
 618
 619 // Cancel request.
 620 test->setExpectedCancelledResourceURI(kServer->getURIForPath("/cancel-this.js"));
 621 test->loadURI(kServer->getURIForPath("/resource-to-cancel.html").data());
 622 test->waitUntilResourceLoadFinished();
 623 g_assert(test->m_resource);
 624
 625 events = test->m_loadEvents;
 626 g_assert_cmpint(events.size(), ==, 3);
 627 g_assert_cmpint(events[0], ==, SingleResourceLoadTest::Started);
 628 g_assert_cmpint(events[1], ==, SingleResourceLoadTest::Failed);
 629 g_assert_cmpint(events[2], ==, SingleResourceLoadTest::Finished);
 630 events.clear();
 631}
 632
563633static void addCacheHTTPHeadersToResponse(SoupMessage* message)
564634{
565635 // The actual date doesn't really matter.

@@static void serverCallback(SoupServer* server, SoupMessage* message, const char*
613683 soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, kJavascript, strlen(kJavascript));
614684 soup_message_headers_append(message->response_headers, "Content-Type", "text/javascript");
615685 soup_message_headers_append(message->response_headers, "Content-Disposition", "filename=JavaScript.js");
 686 } else if (g_str_equal(path, "/relative-javascript.html")) {
 687 static const char* javascriptRelativeHTML = "<html><head><script language='javascript' src='remove-this/javascript.js'></script></head><body></body></html>";
 688 soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, javascriptRelativeHTML, strlen(javascriptRelativeHTML));
 689 } else if (g_str_equal(path, "/resource-to-cancel.html")) {
 690 static const char* resourceToCancelHTML = "<html><head><script language='javascript' src='cancel-this.js'></script></head><body></body></html>";
 691 soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, resourceToCancelHTML, strlen(resourceToCancelHTML));
616692 } else if (g_str_equal(path, "/blank.ico")) {
617693 GOwnPtr<char> filePath(g_build_filename(Test::getWebKit1TestResoucesDir().data(), path, NULL));
618694 char* contents;

@@void beforeAll()
643719 kServer = new WebKitTestServer();
644720 kServer->run(serverCallback);
645721
 722 webkit_web_context_set_web_extensions_directory(webkit_web_context_get_default(), WEBKIT_TEST_WEB_EXTENSIONS_DIR);
 723
646724 ResourcesTest::add("WebKitWebView", "resources", testWebViewResources);
647725 SingleResourceLoadTest::add("WebKitWebResource", "loading", testWebResourceLoading);
648726 SingleResourceLoadTest::add("WebKitWebResource", "response", testWebResourceResponse);

@@void beforeAll()
651729 ResourceURITrackingTest::add("WebKitWebResource", "active-uri", testWebResourceActiveURI);
652730 ResourcesTest::add("WebKitWebResource", "get-data", testWebResourceGetData);
653731 SingleResourceLoadTest::add("WebKitWebView", "history-cache", testWebViewResourcesHistoryCache);
 732 SendRequestTest::add("WebKitWebPage", "send-request", testWebResourceSendRequest);
654733}
655734
656735void afterAll()

Source/WebKit2/UIProcess/API/gtk/tests/WebExtensionTest.cpp

2020#include "config.h"
2121
2222#include <gio/gio.h>
 23#include <string.h>
2324#include <webkit2/webkit-web-extension.h>
2425#include <wtf/gobject/GOwnPtr.h>
2526

@@static void documentLoadedCallback(WebKitWebPage*, gpointer userData)
4647 g_assert(ok);
4748}
4849
 50static gboolean sendRequestCallback(WebKitWebPage*, WebKitURIRequest* request, WebKitURIResponse*, gpointer)
 51{
 52 const char* requestURI = webkit_uri_request_get_uri(request);
 53 g_assert(requestURI);
 54
 55 if (const char* suffix = g_strrstr(requestURI, "/remove-this/javascript.js")) {
 56 GOwnPtr<char> prefix(g_strndup(requestURI, strlen(requestURI) - strlen(suffix)));
 57 GOwnPtr<char> newURI(g_strdup_printf("%s/javascript.js", prefix.get()));
 58 webkit_uri_request_set_uri(request, newURI.get());
 59 } else if (g_str_has_suffix(requestURI, "/cancel-this.js"))
 60 return TRUE;
 61
 62 return FALSE;
 63}
 64
4965static void pageCreatedCallback(WebKitWebExtension*, WebKitWebPage* webPage, gpointer userData)
5066{
5167 g_signal_connect(webPage, "document-loaded", G_CALLBACK(documentLoadedCallback), userData);
 68 g_signal_connect(webPage, "send-request", G_CALLBACK(sendRequestCallback), 0);
5269}
5370
5471static void methodCallCallback(GDBusConnection* connection, const char* sender, const char* objectPath, const char* interfaceName, const char* methodName, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer userData)

Source/WebKit2/UIProcess/API/gtk/webkit2marshal.list

@@BOOLEAN:ENUM,STRING,POINTER
33BOOLEAN:OBJECT
44BOOLEAN:OBJECT,BOXED,OBJECT
55BOOLEAN:OBJECT,ENUM
 6BOOLEAN:OBJECT,OBJECT
67BOOLEAN:STRING
78BOOLEAN:VOID
89OBJECT:VOID

Source/WebKit2/WebProcess/InjectedBundle/API/gtk/WebKitWebPage.cpp

2525#include "WKBundleAPICast.h"
2626#include "WebFrame.h"
2727#include "WebKitDOMDocumentPrivate.h"
 28#include "WebKitMarshal.h"
2829#include "WebKitPrivate.h"
 30#include "WebKitURIRequestPrivate.h"
 31#include "WebKitURIResponsePrivate.h"
2932#include "WebKitWebPagePrivate.h"
3033#include "WebProcess.h"
3134#include <WebCore/Frame.h>

@@using namespace WebCore;
3538
3639enum {
3740 DOCUMENT_LOADED,
 41 SEND_REQUEST,
3842
3943 LAST_SIGNAL
4044};

@@static void didInitiateLoadForResource(WKBundlePageRef page, WKBundleFrameRef fr
6266 WebProcess::shared().injectedBundle()->postMessage(String::fromUTF8("WebPage.DidInitiateLoadForResource"), ImmutableDictionary::adopt(message).get());
6367}
6468
65 static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef page, WKBundleFrameRef, uint64_t identifier, WKURLRequestRef request, WKURLResponseRef redirectResponse, const void*)
 69static WKURLRequestRef willSendRequestForFrame(WKBundlePageRef page, WKBundleFrameRef, uint64_t identifier, WKURLRequestRef wkRequest, WKURLResponseRef wkRedirectResponse, const void* clientInfo)
6670{
 71 GRefPtr<WebKitURIRequest> request = adoptGRef(webkitURIRequestCreateForResourceRequest(toImpl(wkRequest)->resourceRequest()));
 72 GRefPtr<WebKitURIResponse> redirectResponse = wkRedirectResponse ? adoptGRef(webkitURIResponseCreateForResourceResponse(toImpl(wkRedirectResponse)->resourceResponse())) : 0;
 73
 74 gboolean returnValue;
 75 g_signal_emit(WEBKIT_WEB_PAGE(clientInfo), signals[SEND_REQUEST], 0, request.get(), redirectResponse.get(), &returnValue);
 76 if (returnValue)
 77 return 0;
 78
 79 WebURLRequest* newRequest = WebURLRequest::create(webkitURIRequestGetResourceRequest(request.get())).leakRef();
 80
6781 ImmutableDictionary::MapType message;
6882 message.set(String::fromUTF8("Page"), toImpl(page));
6983 message.set(String::fromUTF8("Identifier"), WebUInt64::create(identifier));
70  message.set(String::fromUTF8("Request"), toImpl(request));
71  if (!toImpl(redirectResponse)->resourceResponse().isNull())
72  message.set(String::fromUTF8("RedirectResponse"), toImpl(redirectResponse));
 84 message.set(String::fromUTF8("Request"), newRequest);
 85 if (!toImpl(wkRedirectResponse)->resourceResponse().isNull())
 86 message.set(String::fromUTF8("RedirectResponse"), toImpl(wkRedirectResponse));
7387 WebProcess::shared().injectedBundle()->postMessage(String::fromUTF8("WebPage.DidSendRequestForResource"), ImmutableDictionary::adopt(message).get());
7488
75  WKRetain(request);
76  return request;
 89 return toAPI(newRequest);
7790}
7891
7992static void didReceiveResponseForResource(WKBundlePageRef page, WKBundleFrameRef, uint64_t identifier, WKURLResponseRef response, const void*)

@@static void webkit_web_page_class_init(WebKitWebPageClass* klass)
130143 0, 0, 0,
131144 g_cclosure_marshal_VOID__OBJECT,
132145 G_TYPE_NONE, 0);
 146
 147 /**
 148 * WebKitWebPage::send-request:
 149 * @web_page: the #WebKitWebPage on which the signal is emitted
 150 * @request: a #WebKitURIRequest
 151 * @redirected_response: a #WebKitURIResponse, or %NULL
 152 *
 153 * This signal is emitted when @request is about to be sent to
 154 * the server. This signal can be used to modify the #WebKitURIRequest
 155 * that will be sent to the server. You can also cancel the resource load
 156 * operation by connecting to this signal and returning %TRUE.
 157 *
 158 * In case of a server redirection this signal is
 159 * emitted again with the @request argument containing the new
 160 * request to be sent to the server due to the redirection and the
 161 * @redirected_response parameter containing the response
 162 * received by the server for the initial request.
 163 *
 164 * Returns: %TRUE to stop other handlers from being invoked for the event.
 165 * %FALSE to continue emission of the event.
 166 */
 167 signals[SEND_REQUEST] = g_signal_new(
 168 "send-request",
 169 G_TYPE_FROM_CLASS(klass),
 170 G_SIGNAL_RUN_LAST,
 171 0,
 172 g_signal_accumulator_true_handled, 0,
 173 webkit_marshal_BOOLEAN__OBJECT_OBJECT,
 174 G_TYPE_BOOLEAN, 2,
 175 WEBKIT_TYPE_URI_REQUEST,
 176 WEBKIT_TYPE_URI_RESPONSE);
133177}
134178
135179WebKitWebPage* webkitWebPageCreate(WebPage* webPage)

Source/WebKit2/WebProcess/InjectedBundle/API/gtk/webkit-web-extension.h

2222
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>
2729