WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Make WebKitNetworkRequest a proper GObject
Make-WebKitNetworkRequest-a-proper-GObject.patch (text/plain), 17.49 KB, created by
Gustavo Noronha (kov)
on 2009-06-01 05:42:31 PDT
(
hide
)
Description:
Make WebKitNetworkRequest a proper GObject
Filename:
MIME Type:
Creator:
Gustavo Noronha (kov)
Created:
2009-06-01 05:42:31 PDT
Size:
17.49 KB
patch
obsolete
>77e4779b545abd53075916a292c44419b9d33eca >diff --git a/ChangeLog b/ChangeLog >index 1946d56..57c6e01 100644 >--- a/ChangeLog >+++ b/ChangeLog >@@ -1,3 +1,11 @@ >+2009-05-31 Gustavo Noronha Silva <gns@gnome.org> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add unit tests for our WebKitNetworkRequest object. >+ >+ * GNUmakefile.am: >+ > 2009-05-29 Gustavo Noronha Silva <gns@gnome.org> > > Reviewed by Jan Alonzo. >diff --git a/GNUmakefile.am b/GNUmakefile.am >index c87ee49..eaf8863 100644 >--- a/GNUmakefile.am >+++ b/GNUmakefile.am >@@ -524,6 +524,7 @@ webkit_tests_ldflags = \ > -no-fast-install > > TEST_PROGS += Programs/unittests/testhttpbackend \ >+ Programs/unittests/testnetworkrequest \ > Programs/unittests/testwebframe \ > Programs/unittests/testwebbackforwardlist \ > Programs/unittests/testwebhistoryitem \ >@@ -536,6 +537,11 @@ Programs_unittests_testhttpbackend_CFLAGS = $(webkit_tests_cflags) > Programs_unittests_testhttpbackend_LDADD = $(webkit_tests_ldadd) > Programs_unittests_testhttpbackend_LDFLAGS = $(webkit_tests_ldflags) > >+Programs_unittests_testnetworkrequest_SOURCES = WebKit/gtk/tests/testnetworkrequest.c >+Programs_unittests_testnetworkrequest_CFLAGS = $(webkit_tests_cflags) >+Programs_unittests_testnetworkrequest_LDADD = $(webkit_tests_ldadd) >+Programs_unittests_testnetworkrequest_LDFLAGS = $(webkit_tests_ldflags) >+ > Programs_unittests_testwebframe_SOURCES = WebKit/gtk/tests/testwebframe.c > Programs_unittests_testwebframe_CFLAGS = $(webkit_tests_cflags) > Programs_unittests_testwebframe_LDADD = $(webkit_tests_ldadd) >diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog >index db134c0..44af341 100644 >--- a/WebKit/gtk/ChangeLog >+++ b/WebKit/gtk/ChangeLog >@@ -1,3 +1,27 @@ >+2009-05-31 Gustavo Noronha Silva <gns@gnome.org> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Make WebKitNetworkRequest a proper GObject, making URI and >+ SoupMessage properties. Also adding unit tests for creation and >+ destruction. >+ >+ * tests/testnetworkrequest.c: Added. >+ (test_network_request_create_destroy): >+ (test_network_request_properties): >+ (main): >+ * webkit/webkitnetworkrequest.cpp: >+ (webkit_network_request_get_property): >+ (webkit_network_request_set_property): >+ (webkit_network_request_class_init): >+ (webkit_network_request_init): >+ (webkit_network_request_constructor): >+ (webkit_network_request_new_with_core_request): >+ (webkit_network_request_new): >+ (webkit_network_request_set_uri): >+ (webkit_network_request_get_uri): >+ * webkit/webkitnetworkrequest.h: >+ > 2009-05-29 Xan Lopez <xlopez@igalia.com> > > Reviewed by Gustavo Noronha. >diff --git a/WebKit/gtk/tests/testnetworkrequest.c b/WebKit/gtk/tests/testnetworkrequest.c >new file mode 100644 >index 0000000..16096cd >--- /dev/null >+++ b/WebKit/gtk/tests/testnetworkrequest.c >@@ -0,0 +1,131 @@ >+/* >+ * Copyright (C) 2009 Gustavo Noronha Silva >+ * >+ * 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 <errno.h> >+#include <unistd.h> >+#include <glib.h> >+#include <glib/gstdio.h> >+#include <gtk/gtk.h> >+#include <stdlib.h> >+#include <webkit/webkit.h> >+ >+#if GLIB_CHECK_VERSION(2, 16, 0) && GTK_CHECK_VERSION(2, 14, 0) >+ >+static void test_network_request_create_destroy() >+{ >+ WebKitNetworkRequest* request; >+ SoupMessage* message; >+ >+ /* Test creation with URI */ >+ request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", "http://debian.org/", NULL)); >+ g_assert(WEBKIT_IS_NETWORK_REQUEST(request)); >+ message = webkit_network_request_get_message(request); >+ g_assert_cmpint(G_OBJECT(message)->ref_count, ==, 1); >+ g_object_unref(request); >+ >+ /* Test creation with SoupMessage */ >+ message = soup_message_new("GET", "http://debian.org/"); >+ request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "message", message, NULL)); >+ g_assert(WEBKIT_IS_NETWORK_REQUEST(request)); >+ g_assert_cmpint(G_OBJECT(message)->ref_count, ==, 2); >+ g_object_unref(request); >+ g_assert_cmpint(G_OBJECT(message)->ref_count, ==, 1); >+ g_object_unref(message); >+ >+ /* Test creation with both URI and SoupMessage; should fail */ >+ if (g_test_trap_fork(0, G_TEST_TRAP_SILENCE_STDOUT|G_TEST_TRAP_SILENCE_STDERR)) { >+ message = soup_message_new("GET", "http://debian.org/"); >+ request = g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", "http://debian.org/", "message", message, NULL); >+ exit(0); >+ } >+ >+ g_test_trap_assert_failed(); >+ g_test_trap_assert_stderr("*WebKitNetworkMessage needs to be initialized with one (and only one) of a URI or a SoupMessage.*"); >+ >+ /* Test creation with no URI or SoupMessage; should fail */ >+ if (g_test_trap_fork(0, G_TEST_TRAP_SILENCE_STDOUT|G_TEST_TRAP_SILENCE_STDERR)) { >+ request = g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL); >+ exit(0); >+ } >+ >+ g_test_trap_assert_failed(); >+ g_test_trap_assert_stderr("*WebKitNetworkMessage needs to be initialized with one (and only one) of a URI or a SoupMessage.*"); >+ >+ /* Test creation with bad URI; should fail */ >+ if (g_test_trap_fork(0, G_TEST_TRAP_SILENCE_STDOUT|G_TEST_TRAP_SILENCE_STDERR)) { >+ request = g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", "woohoo", NULL); >+ exit(0); >+ } >+ >+ g_test_trap_assert_failed(); >+ g_test_trap_assert_stderr("*Tried to initialize a WebKitNetworkRequest with an invalid URI: woohoo*"); >+} >+ >+static void test_network_request_properties() >+{ >+ WebKitNetworkRequest* request; >+ SoupMessage* message; >+ gchar* soupURI; >+ >+ /* Test URI is set correctly when creating with URI */ >+ request = webkit_network_request_new("http://debian.org/"); >+ g_assert(WEBKIT_IS_NETWORK_REQUEST(request)); >+ message = webkit_network_request_get_message(request); >+ >+ soupURI = soup_uri_to_string(soup_message_get_uri(message), FALSE); >+ g_assert_cmpstr(soupURI, ==, "http://debian.org/"); >+ g_free(soupURI); >+ >+ g_assert_cmpstr(webkit_network_request_get_uri(request), ==, "http://debian.org/"); >+ g_object_unref(request); >+ >+ /* Test URI is set correctly when creating with Message */ >+ message = soup_message_new("GET", "http://debian.org/"); >+ request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "message", message, NULL)); >+ g_assert(WEBKIT_IS_NETWORK_REQUEST(request)); >+ g_object_unref(message); >+ >+ message = webkit_network_request_get_message(request); >+ soupURI = soup_uri_to_string(soup_message_get_uri(message), FALSE); >+ g_assert_cmpstr(soupURI, ==, "http://debian.org/"); >+ g_free(soupURI); >+ >+ g_assert_cmpstr(webkit_network_request_get_uri(request), ==, "http://debian.org/"); >+ g_object_unref(request); >+} >+ >+int main(int argc, char** argv) >+{ >+ g_thread_init(NULL); >+ gtk_test_init(&argc, &argv, NULL); >+ >+ g_test_bug_base("https://bugs.webkit.org/"); >+ g_test_add_func("/webkit/networkrequest/createdestroy", test_network_request_create_destroy); >+ g_test_add_func("/webkit/networkrequest/properties", test_network_request_properties); >+ return g_test_run (); >+} >+ >+#else >+int main(int argc, char** argv) >+{ >+ g_critical("You will need at least glib-2.16.0 and gtk-2.14.0 to run the unit tests. Doing nothing now."); >+ return 0; >+} >+ >+#endif >diff --git a/WebKit/gtk/webkit/webkitnetworkrequest.cpp b/WebKit/gtk/webkit/webkitnetworkrequest.cpp >index feef3ec..f97ca41 100644 >--- a/WebKit/gtk/webkit/webkitnetworkrequest.cpp >+++ b/WebKit/gtk/webkit/webkitnetworkrequest.cpp >@@ -22,6 +22,7 @@ > #include "webkitnetworkrequest.h" > > #include "CString.h" >+#include <glib/gi18n-lib.h> > #include "ResourceRequest.h" > #include "webkitprivate.h" > >@@ -41,12 +42,22 @@ > G_DEFINE_TYPE(WebKitNetworkRequest, webkit_network_request, G_TYPE_OBJECT); > > struct _WebKitNetworkRequestPrivate { >+ gboolean isConstructed; > gchar* uri; > SoupMessage* message; > }; > > #define WEBKIT_NETWORK_REQUEST_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_NETWORK_REQUEST, WebKitNetworkRequestPrivate)) > >+static GObject* webkit_network_request_constructor(GType gtype, guint n_properties, GObjectConstructParam *properties); >+ >+enum { >+ PROP_0, >+ >+ PROP_URI, >+ PROP_MESSAGE, >+}; >+ > static void webkit_network_request_finalize(GObject* object) > { > WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); >@@ -62,9 +73,80 @@ static void webkit_network_request_finalize(GObject* object) > G_OBJECT_CLASS(webkit_network_request_parent_class)->finalize(object); > } > >+static void webkit_network_request_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec *pspec) >+{ >+ WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); >+ >+ switch(prop_id) { >+ case PROP_URI: >+ g_value_set_string(value, webkit_network_request_get_uri(request)); >+ break; >+ case PROP_MESSAGE: >+ g_value_set_object(value, webkit_network_request_get_message(request)); >+ break; >+ default: >+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); >+ } >+} >+ >+static void webkit_network_request_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec *pspec) >+{ >+ WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(object); >+ WebKitNetworkRequestPrivate* priv = request->priv; >+ >+ switch(prop_id) { >+ case PROP_URI: >+ if (priv->isConstructed) { >+ webkit_network_request_set_uri(request, g_value_get_string(value)); >+ break; >+ } >+ if (g_value_get_string(value)) >+ priv->uri = g_value_dup_string(value); >+ break; >+ case PROP_MESSAGE: >+ priv->message = SOUP_MESSAGE(g_value_dup_object(value)); >+ break; >+ default: >+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); >+ } >+} >+ > static void webkit_network_request_class_init(WebKitNetworkRequestClass* requestClass) > { >- G_OBJECT_CLASS(requestClass)->finalize = webkit_network_request_finalize; >+ GObjectClass* objectClass = G_OBJECT_CLASS(requestClass); >+ >+ objectClass->constructor = webkit_network_request_constructor; >+ objectClass->finalize = webkit_network_request_finalize; >+ objectClass->get_property = webkit_network_request_get_property; >+ objectClass->set_property = webkit_network_request_set_property; >+ >+ /** >+ * WebKitNetworkRequest:uri: >+ * >+ * The URI to which the request will be made. >+ * >+ * Since: 1.1.9 >+ */ >+ g_object_class_install_property(objectClass, PROP_URI, >+ g_param_spec_string("uri", >+ _("URI"), >+ _("The URI to which the request will be made."), >+ NULL, >+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT))); >+ >+ /** >+ * WebKitNetworkRequest:message: >+ * >+ * The #SoupMessage that backs the request. >+ * >+ * Since: 1.1.9 >+ */ >+ g_object_class_install_property(objectClass, PROP_MESSAGE, >+ g_param_spec_object("message", >+ _("Message"), >+ _("The SoupMessage that backs the request."), >+ SOUP_TYPE_MESSAGE, >+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY))); > > g_type_class_add_private(requestClass, sizeof(WebKitNetworkRequestPrivate)); > } >@@ -73,20 +155,47 @@ static void webkit_network_request_init(WebKitNetworkRequest* request) > { > WebKitNetworkRequestPrivate* priv = WEBKIT_NETWORK_REQUEST_GET_PRIVATE(request); > request->priv = priv; >+ priv->isConstructed = FALSE; >+} >+ >+static GObject* webkit_network_request_constructor(GType gtype, guint n_properties, GObjectConstructParam *properties) >+{ >+ GObject* object = G_OBJECT_CLASS(webkit_network_request_parent_class)->constructor(gtype, n_properties, properties); >+ WebKitNetworkRequestPrivate* priv = WEBKIT_NETWORK_REQUEST(object)->priv; >+ >+ priv->isConstructed = TRUE; >+ >+ if ((priv->uri && priv->message) || (!priv->uri && !priv->message)) { >+ if (priv->uri) >+ g_free(priv->uri); >+ >+ if (priv->message) >+ g_object_unref(priv->message); >+ >+ g_critical("WebKitNetworkMessage needs to be initialized with one (and only one) of a URI or a SoupMessage."); >+ g_object_unref(object); >+ return NULL; >+ } >+ >+ if (priv->message) >+ return object; >+ >+ priv->message = soup_message_new("GET", priv->uri); >+ if (!priv->message) { >+ g_critical("Tried to initialize a WebKitNetworkRequest with an invalid URI: %s", priv->uri); >+ g_free(priv->uri); >+ return NULL; >+ } >+ >+ return object; > } > > // for internal use only > WebKitNetworkRequest* webkit_network_request_new_with_core_request(const WebCore::ResourceRequest& resourceRequest) > { >- WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL)); >- WebKitNetworkRequestPrivate* priv = request->priv; >- > SoupMessage* soupMessage = resourceRequest.soupMessage(); >- if (soupMessage) >- priv->message = SOUP_MESSAGE(g_object_ref(soupMessage)); >- priv->uri = g_strdup(resourceRequest.url().string().utf8().data()); > >- return request; >+ return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "message", soupMessage, NULL)); > } > > /** >@@ -102,16 +211,7 @@ WebKitNetworkRequest* webkit_network_request_new(const gchar* uri) > { > g_return_val_if_fail(uri, NULL); > >- WebKitNetworkRequest* request = WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, NULL)); >- WebKitNetworkRequestPrivate* priv = request->priv; >- >- priv->message = soup_message_new("GET", uri); >- if (!priv->message) >- return NULL; >- >- priv->uri = g_strdup(uri); >- >- return request; >+ return WEBKIT_NETWORK_REQUEST(g_object_new(WEBKIT_TYPE_NETWORK_REQUEST, "uri", uri, NULL)); > } > > /** >@@ -120,6 +220,7 @@ WebKitNetworkRequest* webkit_network_request_new(const gchar* uri) > * @uri: an URI > * > * Sets the URI held and used by the given request. >+ * > */ > void webkit_network_request_set_uri(WebKitNetworkRequest* request, const gchar* uri) > { >@@ -128,8 +229,17 @@ void webkit_network_request_set_uri(WebKitNetworkRequest* request, const gchar* > > WebKitNetworkRequestPrivate* priv = request->priv; > >- g_free(priv->uri); >- priv->uri = g_strdup(uri); >+ SoupURI* soupURI = soup_uri_new(uri); >+ if (!soupURI) { >+ g_critical("Tried to set an invalid URI to a WebKitNetworkRequest object: %s", uri); >+ return; >+ } >+ >+ if (priv->uri) >+ g_free(priv->uri); >+ >+ soup_message_set_uri(priv->message, soupURI); >+ soup_uri_free(soupURI); > } > > /** >@@ -145,18 +255,26 @@ G_CONST_RETURN gchar* webkit_network_request_get_uri(WebKitNetworkRequest* reque > g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); > > WebKitNetworkRequestPrivate* priv = request->priv; >+ >+ if (priv->uri) >+ return priv->uri; >+ >+ SoupURI* soupURI = soup_message_get_uri(priv->message); >+ priv->uri = soup_uri_to_string(soupURI, FALSE); > return priv->uri; > } > >-// NOT YET API; For internal use only, for now >-// webkit_network_request_get_soup_message: >-// @request: a #WebKitNetworkRequest >-// >-// Obtains the #SoupMessage held and used by the given request. Notice >-// that modification of the SoupMessage of a request by signal >-// handlers is only supported where explicitly documented. >-// >-// Returns: the #SoupMessage >+/** webkit_network_request_get_soup_message: >+ * @request: a #WebKitNetworkRequest >+ * >+ * Obtains the #SoupMessage held and used by the given request. Notice >+ * that modification of the SoupMessage of a request by signal >+ * handlers is only supported (as in, will only affect what is >+ * actually sent to the server) where explicitly documented. >+ * >+ * Returns: the #SoupMessage >+ * Since: 1.1.9 >+ */ > SoupMessage* webkit_network_request_get_message(WebKitNetworkRequest* request) > { > g_return_val_if_fail(WEBKIT_IS_NETWORK_REQUEST(request), NULL); >diff --git a/WebKit/gtk/webkit/webkitnetworkrequest.h b/WebKit/gtk/webkit/webkitnetworkrequest.h >index 01ab8bb..78e04a1 100644 >--- a/WebKit/gtk/webkit/webkitnetworkrequest.h >+++ b/WebKit/gtk/webkit/webkitnetworkrequest.h >@@ -21,6 +21,7 @@ > #define WEBKIT_NETWORK_REQUEST_H > > #include <glib-object.h> >+#include <libsoup/soup.h> > > #include <webkit/webkitdefines.h> > >@@ -65,6 +66,9 @@ webkit_network_request_set_uri (WebKitNetworkRequest *request, > WEBKIT_API G_CONST_RETURN gchar * > webkit_network_request_get_uri (WebKitNetworkRequest *request); > >+WEBKIT_API SoupMessage * >+webkit_network_request_get_message(WebKitNetworkRequest* request); >+ > G_END_DECLS > > #endif
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 26106
:
30831
|
30832
|
30833
|
30933