Commit 46922981 authored by mrobinson@webkit.org's avatar mrobinson@webkit.org

[GTK] [WK2] Add WebKitResponsePolicyDecision

https://bugs.webkit.org/show_bug.cgi?id=76789

Reviewed by Philippe Normand.

Add a WebKitResponsePolicyDecision GObject, use it for response
policy decisions and add a test.

* GNUmakefile.am: Added new source files to the list.
* UIProcess/API/gtk/WebKitPolicyClient.cpp:
(decidePolicyForResponseCallback): Added this callback which creates the request
and fires the signal.
(attachPolicyClientToPage): Added new callback to the C API policy client.
* UIProcess/API/gtk/WebKitResponsePolicyDecision.cpp: Added.
* UIProcess/API/gtk/WebKitResponsePolicyDecision.h: Added.
* UIProcess/API/gtk/WebKitResponsePolicyDecisionPrivate.h: Added.
* UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Added new docs.
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto.
* UIProcess/API/gtk/tests/TestWebKitPolicyClient.cpp:
(testResponsePolicy): Added this test for response policy decisions.
(serverCallback): Added a SoupServer to test policy response policy decisions.
(beforeAll): Ditto.
(afterAll): Ditto.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@107043 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 91b20770
2012-02-07 Martin Robinson <mrobinson@igalia.com>
[GTK] [WK2] Add WebKitResponsePolicyDecision
https://bugs.webkit.org/show_bug.cgi?id=76789
Reviewed by Philippe Normand.
Add a WebKitResponsePolicyDecision GObject, use it for response
policy decisions and add a test.
* GNUmakefile.am: Added new source files to the list.
* UIProcess/API/gtk/WebKitPolicyClient.cpp:
(decidePolicyForResponseCallback): Added this callback which creates the request
and fires the signal.
(attachPolicyClientToPage): Added new callback to the C API policy client.
* UIProcess/API/gtk/WebKitResponsePolicyDecision.cpp: Added.
* UIProcess/API/gtk/WebKitResponsePolicyDecision.h: Added.
* UIProcess/API/gtk/WebKitResponsePolicyDecisionPrivate.h: Added.
* UIProcess/API/gtk/docs/webkit2gtk-docs.sgml: Added new docs.
* UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Ditto.
* UIProcess/API/gtk/tests/TestWebKitPolicyClient.cpp:
(testResponsePolicy): Added this test for response policy decisions.
(serverCallback): Added a SoupServer to test policy response policy decisions.
(beforeAll): Ditto.
(afterAll): Ditto.
2012-02-07 Timothy Hatcher <timothy@apple.com>
Avoid making a window for the Web Inspector when it is docked.
......@@ -90,6 +90,7 @@ libwebkit2gtkinclude_HEADERS = \
$(WebKit2)/UIProcess/API/gtk/WebKitError.h \
$(WebKit2)/UIProcess/API/gtk/WebKitNavigationPolicyDecision.h \
$(WebKit2)/UIProcess/API/gtk/WebKitPolicyDecision.h \
$(WebKit2)/UIProcess/API/gtk/WebKitResponsePolicyDecision.h \
$(WebKit2)/UIProcess/API/gtk/WebKitSettings.h \
$(WebKit2)/UIProcess/API/gtk/WebKitURIRequest.h \
$(WebKit2)/UIProcess/API/gtk/WebKitURIResponse.h \
......@@ -549,6 +550,9 @@ libwebkit2gtk_@WEBKITGTK_API_MAJOR_VERSION@_@WEBKITGTK_API_MINOR_VERSION@_la_SOU
Source/WebKit2/UIProcess/API/gtk/WebKitPolicyClient.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitPolicyClient.h \
Source/WebKit2/UIProcess/API/gtk/WebKitPrivate.h \
Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecision.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecision.h \
Source/WebKit2/UIProcess/API/gtk/WebKitResponsePolicyDecisionPrivate.h \
Source/WebKit2/UIProcess/API/gtk/WebKitSettings.cpp \
Source/WebKit2/UIProcess/API/gtk/WebKitSettings.h \
Source/WebKit2/UIProcess/API/gtk/WebKitSettingsPrivate.h \
......
......@@ -23,6 +23,7 @@
#include "WebKitNavigationPolicyDecisionPrivate.h"
#include "WebKitPolicyDecision.h"
#include "WebKitPrivate.h"
#include "WebKitResponsePolicyDecisionPrivate.h"
#include "WebKitWebViewBasePrivate.h"
#include "WebKitWebViewPrivate.h"
#include <wtf/gobject/GRefPtr.h>
......@@ -57,6 +58,15 @@ static void decidePolicyForNewWindowActionCallback(WKPageRef page, WKFrameRef fr
WEBKIT_POLICY_DECISION(decision.get()));
}
static void decidePolicyForResponseCallback(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
{
GRefPtr<WebKitResponsePolicyDecision> decision =
adoptGRef(webkitResponsePolicyDecisionCreate(request, response, listener));
webkitWebViewMakePolicyDecision(WEBKIT_WEB_VIEW(clientInfo),
WEBKIT_POLICY_DECISION_TYPE_RESPONSE,
WEBKIT_POLICY_DECISION(decision.get()));
}
void attachPolicyClientToPage(WebKitWebView* webView)
{
WKPagePolicyClient policyClient = {
......@@ -64,7 +74,7 @@ void attachPolicyClientToPage(WebKitWebView* webView)
webView, // clientInfo
decidePolicyForNavigationActionCallback,
decidePolicyForNewWindowActionCallback,
0, // decidePolicyForResponseCallback,
decidePolicyForResponseCallback,
0, // unableToImplementPolicy
};
WKPageSetPagePolicyClient(toAPI(webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(webView))), &policyClient);
......
/*
* Copyright (C) 2012 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "WebKitResponsePolicyDecision.h"
#include "WebKitPolicyDecisionPrivate.h"
#include "WebKitPrivate.h"
#include "WebKitURIRequestPrivate.h"
#include "WebKitURIResponsePrivate.h"
#include "WebURLRequest.h"
#include "WebURLResponse.h"
#include <glib/gi18n-lib.h>
#include <wtf/gobject/GRefPtr.h>
#include <wtf/text/CString.h>
using namespace WebKit;
/**
* SECTION: WebKitResponsePolicyDecision
* @Short_description: A policy decision for resource responses
* @Title: WebKitResponsePolicyDecision
* @See_also: #WebKitPolicyDecision, #WebKitWebView
*
* WebKitResponsePolicyDecision represents a policy decision for a
* resource response, whether from the network or the local system.
* A very common usecase for these types of decision is deciding
* whether or not to download a particular resource or to load it
* normally.
*/
G_DEFINE_TYPE(WebKitResponsePolicyDecision, webkit_response_policy_decision, WEBKIT_TYPE_POLICY_DECISION)
struct _WebKitResponsePolicyDecisionPrivate {
GRefPtr<WebKitURIRequest> request;
GRefPtr<WebKitURIResponse> response;
};
enum {
PROP_0,
PROP_REQUEST,
PROP_RESPONSE,
};
static void webkit_response_policy_decision_init(WebKitResponsePolicyDecision* decision)
{
decision->priv = G_TYPE_INSTANCE_GET_PRIVATE(decision, WEBKIT_TYPE_RESPONSE_POLICY_DECISION, WebKitResponsePolicyDecisionPrivate);
new (decision->priv) WebKitResponsePolicyDecisionPrivate();
}
static void webkitResponsePolicyDecisionFinalize(GObject* object)
{
WEBKIT_RESPONSE_POLICY_DECISION(object)->priv->~WebKitResponsePolicyDecisionPrivate();
G_OBJECT_CLASS(webkit_response_policy_decision_parent_class)->finalize(object);
}
static void webkitResponsePolicyDecisionGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
WebKitResponsePolicyDecision* decision = WEBKIT_RESPONSE_POLICY_DECISION(object);
switch (propId) {
case PROP_REQUEST:
g_value_set_object(value, webkit_response_policy_decision_get_request(decision));
break;
case PROP_RESPONSE:
g_value_set_object(value, webkit_response_policy_decision_get_response(decision));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
break;
}
}
static void webkit_response_policy_decision_class_init(WebKitResponsePolicyDecisionClass* decisionClass)
{
GObjectClass* objectClass = G_OBJECT_CLASS(decisionClass);
objectClass->finalize = webkitResponsePolicyDecisionFinalize;
objectClass->get_property = webkitResponsePolicyDecisionGetProperty;
g_type_class_add_private(decisionClass, sizeof(WebKitResponsePolicyDecisionPrivate));
/**
* WebKitResponsePolicyDecision:request:
*
* This property contains the #WebKitURIRequest associated with this
* policy decision.
*/
g_object_class_install_property(objectClass,
PROP_REQUEST,
g_param_spec_object("request",
_("Response URI request"),
_("The URI request that is associated with this policy decision"),
WEBKIT_TYPE_URI_REQUEST,
WEBKIT_PARAM_READABLE));
/**
* WebKitResponsePolicyDecision:response:
*
* This property contains the #WebKitURIResponse associated with this
* policy decision.
*/
g_object_class_install_property(objectClass,
PROP_REQUEST,
g_param_spec_object("response",
_("URI response"),
_("The URI response that is associated with this policy decision"),
WEBKIT_TYPE_URI_REQUEST,
WEBKIT_PARAM_READABLE));
}
/**
* webkit_response_policy_decision_get_request:
* @decision: a #WebKitResponsePolicyDecision
*
* Gets the value of the #WebKitResponsePolicyDecision:request property.
*
* Returns: (transfer none): The URI request that is associated with this policy decision.
*/
WebKitURIRequest* webkit_response_policy_decision_get_request(WebKitResponsePolicyDecision* decision)
{
g_return_val_if_fail(WEBKIT_IS_RESPONSE_POLICY_DECISION(decision), 0);
return decision->priv->request.get();
}
/**
* webkit_response_policy_decision_get_response:
* @decision: a #WebKitResponsePolicyDecision
*
* Gets the value of the #WebKitResponsePolicyDecision:response property.
*
* Returns: (transfer none): The URI response that is associated with this policy decision.
*/
WebKitURIResponse* webkit_response_policy_decision_get_response(WebKitResponsePolicyDecision* decision)
{
g_return_val_if_fail(WEBKIT_IS_RESPONSE_POLICY_DECISION(decision), 0);
return decision->priv->response.get();
}
WebKitResponsePolicyDecision* webkitResponsePolicyDecisionCreate(WKURLRequestRef request, WKURLResponseRef response, WKFramePolicyListenerRef listener)
{
WebKitResponsePolicyDecision* decision = WEBKIT_RESPONSE_POLICY_DECISION(g_object_new(WEBKIT_TYPE_RESPONSE_POLICY_DECISION, NULL));
decision->priv->request = adoptGRef(webkitURIRequestCreateForResourceRequest(toImpl(request)->resourceRequest()));
decision->priv->response = adoptGRef(webkitURIResponseCreateForResourceResponse(toImpl(response)->resourceResponse()));
webkitPolicyDecisionSetListener(WEBKIT_POLICY_DECISION(decision), listener);
return decision;
}
/*
* Copyright (C) 2012 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#if !defined(__WEBKIT2_H_INSIDE__) && !defined(WEBKIT2_COMPILATION)
#error "Only <webkit2/webkit2.h> can be included directly."
#endif
#ifndef WebKitResponsePolicyDecision_h
#define WebKitResponsePolicyDecision_h
#include <glib-object.h>
#include <webkit2/WebKitDefines.h>
#include <webkit2/WebKitPolicyDecision.h>
#include <webkit2/WebKitURIResponse.h>
#include <webkit2/WebKitURIRequest.h>
G_BEGIN_DECLS
#define WEBKIT_TYPE_RESPONSE_POLICY_DECISION (webkit_response_policy_decision_get_type())
#define WEBKIT_RESPONSE_POLICY_DECISION(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), WEBKIT_TYPE_RESPONSE_POLICY_DECISION, WebKitResponsePolicyDecision))
#define WEBKIT_RESPONSE_POLICY_DECISION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), WEBKIT_TYPE_RESPONSE_POLICY_DECISION, WebKitResponsePolicyDecisionClass))
#define WEBKIT_IS_RESPONSE_POLICY_DECISION(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), WEBKIT_TYPE_RESPONSE_POLICY_DECISION))
#define WEBKIT_IS_RESPONSE_POLICY_DECISION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), WEBKIT_TYPE_RESPONSE_POLICY_DECISION))
#define WEBKIT_RESPONSE_POLICY_DECISION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), WEBKIT_TYPE_RESPONSE_POLICY_DECISION, WebKitResponsePolicyDecisionClass))
typedef struct _WebKitResponsePolicyDecision WebKitResponsePolicyDecision;
typedef struct _WebKitResponsePolicyDecisionClass WebKitResponsePolicyDecisionClass;
typedef struct _WebKitResponsePolicyDecisionPrivate WebKitResponsePolicyDecisionPrivate;
struct _WebKitResponsePolicyDecision {
WebKitPolicyDecision parent;
/*< private >*/
WebKitResponsePolicyDecisionPrivate *priv;
};
struct _WebKitResponsePolicyDecisionClass {
WebKitPolicyDecisionClass parent_class;
};
WEBKIT_API GType
webkit_response_policy_decision_get_type (void);
WEBKIT_API WebKitURIRequest *
webkit_response_policy_decision_get_request (WebKitResponsePolicyDecision *decision);
WEBKIT_API WebKitURIResponse *
webkit_response_policy_decision_get_response (WebKitResponsePolicyDecision *decision);
G_END_DECLS
#endif
/*
* Copyright (C) 2012 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef WebKitResponsePolicyDecisionPrivate_h
#define WebKitResponsePolicyDecisionPrivate_h
#include "WebKitPrivate.h"
#include "WebKitResponsePolicyDecision.h"
WebKitResponsePolicyDecision* webkitResponsePolicyDecisionCreate(WKURLRequestRef, WKURLResponseRef, WKFramePolicyListenerRef);
#endif // WebKitResponsePolicyDecisionPrivate_h
......@@ -23,6 +23,7 @@
<xi:include href="xml/WebKitDownload.xml"/>
<xi:include href="xml/WebKitPolicyDecision.xml"/>
<xi:include href="xml/WebKitNavigationPolicyDecision.xml"/>
<xi:include href="xml/WebKitResponsePolicyDecision.xml"/>
<xi:include href="xml/WebKitError.xml"/>
</chapter>
......
......@@ -367,6 +367,26 @@ WebKitNavigationPolicyDecisionPrivate
webkit_navigation_policy_decision_get_type
</SECTION>
<SECTION>
<FILE>WebKitResponsePolicyDecision</FILE>
WebKitResponsePolicyDecision
webkit_response_policy_decision_get_request
webkit_response_policy_decision_get_response
<SUBSECTION Standard>
WebKitResponsePolicyDecisionClass
WEBKIT_TYPE_RESPONSE_POLICY_DECISION
WEBKIT_RESPONSE_POLICY_DECISION
WEBKIT_IS_RESPONSE_POLICY_DECISION
WEBKIT_RESPONSE_POLICY_DECISION_CLASS
WEBKIT_IS_RESPONSE_POLICY_DECISION_CLASS
WEBKIT_RESPONSE_POLICY_DECISION_GET_CLASS
<SUBSECTION Private>
WebKitResponsePolicyDecisionPrivate
webkit_response_policy_decision_get_type
</SECTION>
<SECTION>
<FILE>WebKitError</FILE>
WEBKIT_NETWORK_ERROR
......
......@@ -20,9 +20,12 @@
#include "config.h"
#include "LoadTrackingTest.h"
#include "WebKitTestServer.h"
#include <wtf/gobject/GRefPtr.h>
#include <wtf/text/CString.h>
static WebKitTestServer* kServer;
class PolicyClientTest: public LoadTrackingTest {
public:
MAKE_GLIB_TEST_FIXTURE(PolicyClientTest);
......@@ -142,6 +145,37 @@ static void testNavigationPolicy(PolicyClientTest* test, gconstpointer)
g_assert_cmpint(test->m_loadEvents.size(), ==, 0);
}
static void testResponsePolicy(PolicyClientTest* test, gconstpointer)
{
test->m_policyDecisionTypeFilter = WEBKIT_POLICY_DECISION_TYPE_RESPONSE;
test->m_policyDecisionResponse = PolicyClientTest::Use;
test->loadURI(kServer->getURIForPath("/").data());
test->waitUntilLoadFinished();
g_assert_cmpint(test->m_loadEvents.size(), ==, 3);
g_assert_cmpint(test->m_loadEvents[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(test->m_loadEvents[1], ==, LoadTrackingTest::LoadCommitted);
g_assert_cmpint(test->m_loadEvents[2], ==, LoadTrackingTest::LoadFinished);
test->m_respondToPolicyDecisionAsynchronously = true;
test->loadURI(kServer->getURIForPath("/").data());
test->waitUntilLoadFinished();
g_assert_cmpint(test->m_loadEvents.size(), ==, 3);
g_assert_cmpint(test->m_loadEvents[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(test->m_loadEvents[1], ==, LoadTrackingTest::LoadCommitted);
g_assert_cmpint(test->m_loadEvents[2], ==, LoadTrackingTest::LoadFinished);
test->m_respondToPolicyDecisionAsynchronously = false;
test->m_policyDecisionResponse = PolicyClientTest::Ignore;
test->loadURI(kServer->getURIForPath("/").data());
test->waitUntilLoadFinished();
g_assert_cmpint(test->m_loadEvents.size(), ==, 3);
g_assert_cmpint(test->m_loadEvents[0], ==, LoadTrackingTest::ProvisionalLoadStarted);
g_assert_cmpint(test->m_loadEvents[1], ==, LoadTrackingTest::ProvisionalLoadFailed);
g_assert_cmpint(test->m_loadEvents[2], ==, LoadTrackingTest::LoadFinished);
}
struct CreateCallbackData {
bool triedToOpenWindow;
GMainLoop* mainLoop;
......@@ -191,12 +225,31 @@ static void testNewWindowPolicy(PolicyClientTest* test, gconstpointer)
g_assert(!data.triedToOpenWindow);
}
static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
{
if (message->method != SOUP_METHOD_GET) {
soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
return;
}
soup_message_set_status(message, SOUP_STATUS_OK);
static const char* responseString = "<html><body>Testing!</body></html>";
soup_message_body_append(message->response_body, SOUP_MEMORY_STATIC, responseString, strlen(responseString));
soup_message_body_complete(message->response_body);
}
void beforeAll()
{
kServer = new WebKitTestServer();
kServer->run(serverCallback);
PolicyClientTest::add("WebKitPolicyClient", "navigation-policy", testNavigationPolicy);
PolicyClientTest::add("WebKitPolicyClient", "response-policy", testResponsePolicy);
PolicyClientTest::add("WebKitPolicyClient", "new-window-policy", testNewWindowPolicy);
}
void afterAll()
{
delete kServer;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment