• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 Jan Michael Alonzo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19 
20 #include <glib.h>
21 #include <gtk/gtk.h>
22 #include <webkit/webkit.h>
23 
24 #if GTK_CHECK_VERSION(2, 14, 0)
25 
26 static const gshort defaultTimeout = 10;
27 guint waitTimer;
28 gboolean shouldWait;
29 
30 typedef struct {
31     WebKitWebView* webView;
32     WebKitWebFrame* mainFrame;
33 } WebDataSourceFixture;
34 
test_webkit_web_data_source_get_initial_request()35 static void test_webkit_web_data_source_get_initial_request()
36 {
37     WebKitWebView* view;
38     WebKitWebFrame* frame;
39     WebKitWebDataSource* dataSource;
40     WebKitNetworkRequest* initialRequest;
41 
42     view = WEBKIT_WEB_VIEW(webkit_web_view_new());
43     g_object_ref_sink(view);
44     frame = webkit_web_view_get_main_frame(view);
45 
46     WebKitNetworkRequest* request = webkit_network_request_new("http://www.google.com");
47     webkit_web_frame_load_request(frame, request);
48     g_object_unref(request);
49 
50     dataSource = webkit_web_frame_get_provisional_data_source(frame);
51     g_assert(dataSource);
52     initialRequest = webkit_web_data_source_get_initial_request(dataSource);
53     g_assert_cmpstr(webkit_network_request_get_uri(initialRequest), ==, "http://www.google.com/");
54 
55     g_object_unref(view);
56 }
57 
notify_load_status_unreachable_cb(WebKitWebView * view,GParamSpec * pspec,GMainLoop * loop)58 static void notify_load_status_unreachable_cb(WebKitWebView* view, GParamSpec* pspec, GMainLoop* loop)
59 {
60     WebKitLoadStatus status = webkit_web_view_get_load_status (view);
61     WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
62 
63     g_assert(status != WEBKIT_LOAD_FINISHED);
64 
65     if (status != WEBKIT_LOAD_FAILED)
66         return;
67 
68     WebKitWebDataSource* datasource = webkit_web_frame_get_data_source(frame);
69 
70     g_assert_cmpstr("http://this.host.does.not.exist/doireallyexist.html", ==,
71                     webkit_web_data_source_get_unreachable_uri(datasource));
72 
73     g_main_loop_quit(loop);
74 }
75 
notify_load_status_cb(WebKitWebView * view,GParamSpec * pspec,GMainLoop * loop)76 static void notify_load_status_cb(WebKitWebView* view, GParamSpec* pspec, GMainLoop* loop)
77 {
78     WebKitLoadStatus status = webkit_web_view_get_load_status (view);
79     WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
80     WebKitWebDataSource* dataSource = webkit_web_frame_get_data_source(frame);
81 
82     if (status == WEBKIT_LOAD_COMMITTED) {
83         g_assert(webkit_web_data_source_is_loading(dataSource));
84         return;
85     }
86     else if (status != WEBKIT_LOAD_FINISHED)
87         return;
88 
89     /* Test get_request */
90     g_test_message("Testing webkit_web_data_source_get_request");
91     WebKitNetworkRequest* request = webkit_web_data_source_get_request(dataSource);
92     g_assert_cmpstr(webkit_network_request_get_uri(request), ==, "http://www.webkit.org/");
93 
94     /* Test get_main_resource */
95     g_test_message("Testing webkit_web_data_source_get_main_resource");
96     WebKitWebResource* resource = webkit_web_data_source_get_main_resource(dataSource);
97     g_assert_cmpstr("text/html", ==, webkit_web_resource_get_mime_type(resource));
98     g_assert_cmpstr("http://www.webkit.org/", ==, webkit_web_resource_get_uri(resource));
99 
100     /* Test get_data. We just test if data has certain size for the mean time */
101     g_test_message("Testing webkit_web_data_source_get_data has certain size");
102     GString* data = webkit_web_data_source_get_data(dataSource);
103     g_assert(data->len > 100);
104 
105     /* FIXME: Add test for get_encoding */
106 
107     g_main_loop_quit(loop);
108 }
109 
wait_timer_fired(GMainLoop * loop)110 static gboolean wait_timer_fired(GMainLoop* loop)
111 {
112     waitTimer = 0;
113     g_main_loop_quit(loop);
114 
115     return FALSE;
116 }
117 
test_webkit_web_data_source()118 static void test_webkit_web_data_source()
119 {
120     WebKitWebView* view;
121     GMainLoop* loop;
122 
123     view = WEBKIT_WEB_VIEW(webkit_web_view_new());
124     g_object_ref_sink(view);
125     loop = g_main_loop_new(NULL, TRUE);
126     g_signal_connect(view, "notify::load-status", G_CALLBACK(notify_load_status_cb), loop);
127     webkit_web_view_load_uri(view, "http://www.webkit.org");
128 
129     waitTimer = g_timeout_add_seconds(defaultTimeout, (GSourceFunc)wait_timer_fired, loop);
130 
131     g_main_loop_run(loop);
132 
133     if (waitTimer)
134         g_source_remove(waitTimer);
135 
136     waitTimer = 0;
137 
138     g_main_loop_unref(loop);
139     g_object_unref(view);
140 }
141 
notify_load_status_lifetime_cb(WebKitWebView * view,GParamSpec * pspec,GMainLoop * loop)142 static void notify_load_status_lifetime_cb(WebKitWebView* view, GParamSpec* pspec, GMainLoop* loop)
143 {
144     WebKitLoadStatus status = webkit_web_view_get_load_status (view);
145     WebKitWebFrame* frame = webkit_web_view_get_main_frame(view);
146     WebKitWebDataSource* dataSource = webkit_web_frame_get_data_source(frame);
147 
148     if (status == WEBKIT_LOAD_COMMITTED) {
149         g_assert(webkit_web_data_source_is_loading(dataSource));
150         return;
151     } else if (status != WEBKIT_LOAD_FINISHED)
152         return;
153 
154     g_main_loop_quit(loop);
155 }
156 
test_webkit_web_data_source_lifetime()157 static void test_webkit_web_data_source_lifetime()
158 {
159     WebKitWebView* view;
160     GMainLoop* loop;
161 
162     view = WEBKIT_WEB_VIEW(webkit_web_view_new());
163     g_object_ref_sink(view);
164     loop = g_main_loop_new(NULL, TRUE);
165     g_signal_connect(view, "notify::load-status", G_CALLBACK(notify_load_status_lifetime_cb), loop);
166     webkit_web_view_load_uri(view, "http://www.webkit.org");
167 
168     waitTimer = g_timeout_add_seconds(defaultTimeout, (GSourceFunc)wait_timer_fired, loop);
169 
170     g_main_loop_run(loop);
171 
172     WebKitWebDataSource* dataSource = webkit_web_frame_get_data_source(webkit_web_view_get_main_frame(view));
173     GList* subResources = webkit_web_data_source_get_subresources(dataSource);
174     gint numberOfResources = g_list_length(subResources);
175     g_list_free(subResources);
176 
177     g_assert_cmpint(webkit_web_view_get_load_status(view), ==, WEBKIT_LOAD_FINISHED);
178 
179     webkit_web_view_load_uri(view, "http://gnome.org");
180 
181     g_assert_cmpint(webkit_web_view_get_load_status(view), ==, WEBKIT_LOAD_PROVISIONAL);
182 
183     webkit_web_view_stop_loading(view);
184 
185     g_assert_cmpint(webkit_web_view_get_load_status(view), ==, WEBKIT_LOAD_FAILED);
186 
187     subResources = webkit_web_data_source_get_subresources(dataSource);
188     g_assert_cmpint(numberOfResources, ==, g_list_length(subResources));
189     g_list_free(subResources);
190 
191     if (waitTimer)
192         g_source_remove(waitTimer);
193 
194     waitTimer = 0;
195 
196     g_main_loop_unref(loop);
197     g_object_unref(view);
198 }
199 
test_webkit_web_data_source_unreachable_uri()200 static void test_webkit_web_data_source_unreachable_uri()
201 {
202     /* FIXME: this test fails currently. */
203     return;
204 
205     WebKitWebView* view;
206     GMainLoop* loop;
207 
208     view = WEBKIT_WEB_VIEW(webkit_web_view_new());
209     g_object_ref_sink(view);
210     loop = g_main_loop_new(NULL, TRUE);
211     g_signal_connect(view, "notify::load-status", G_CALLBACK(notify_load_status_unreachable_cb), loop);
212     webkit_web_view_load_uri(view, "http://this.host.does.not.exist/doireallyexist.html");
213 
214     waitTimer = g_timeout_add_seconds(defaultTimeout, (GSourceFunc)wait_timer_fired, loop);
215 
216     g_main_loop_run(loop);
217 
218     if (waitTimer)
219         g_source_remove(waitTimer);
220 
221     waitTimer = 0;
222 
223     g_main_loop_unref(loop);
224     g_object_unref(view);
225 }
226 
main(int argc,char ** argv)227 int main(int argc, char** argv)
228 {
229     g_thread_init(NULL);
230     gtk_test_init(&argc, &argv, NULL);
231 
232     g_test_bug_base("https://bugs.webkit.org/");
233     g_test_bug("24758");
234     g_test_add_func("/webkit/webdatasource/get_initial_request",
235                     test_webkit_web_data_source_get_initial_request);
236     g_test_add_func("/webkit/webdatasource/api",
237                     test_webkit_web_data_source);
238     g_test_add_func("/webkit/webdatasource/unreachable_uri",
239                     test_webkit_web_data_source_unreachable_uri);
240     g_test_add_func("/webkit/webdatasource/lifetime",
241                     test_webkit_web_data_source_lifetime);
242 
243     return g_test_run ();
244 }
245 
246 #else
main(int argc,char ** argv)247 int main(int argc, char** argv)
248 {
249     g_critical("You will need gtk-2.14.0 to run the unit tests. Doing nothing now.");
250     return 0;
251 }
252 
253 #endif
254