1*03f9172cSAndroid Build Coastguard Worker /*
2*03f9172cSAndroid Build Coastguard Worker * Hotspot 2.0 client - Web browser using WebKit
3*03f9172cSAndroid Build Coastguard Worker * Copyright (c) 2013, Qualcomm Atheros, Inc.
4*03f9172cSAndroid Build Coastguard Worker *
5*03f9172cSAndroid Build Coastguard Worker * This software may be distributed under the terms of the BSD license.
6*03f9172cSAndroid Build Coastguard Worker * See README for more details.
7*03f9172cSAndroid Build Coastguard Worker */
8*03f9172cSAndroid Build Coastguard Worker
9*03f9172cSAndroid Build Coastguard Worker #include "includes.h"
10*03f9172cSAndroid Build Coastguard Worker #ifdef USE_WEBKIT2
11*03f9172cSAndroid Build Coastguard Worker #include <webkit2/webkit2.h>
12*03f9172cSAndroid Build Coastguard Worker #else /* USE_WEBKIT2 */
13*03f9172cSAndroid Build Coastguard Worker #include <webkit/webkit.h>
14*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
15*03f9172cSAndroid Build Coastguard Worker
16*03f9172cSAndroid Build Coastguard Worker #include "common.h"
17*03f9172cSAndroid Build Coastguard Worker #include "browser.h"
18*03f9172cSAndroid Build Coastguard Worker
19*03f9172cSAndroid Build Coastguard Worker
20*03f9172cSAndroid Build Coastguard Worker struct browser_context {
21*03f9172cSAndroid Build Coastguard Worker GtkWidget *win;
22*03f9172cSAndroid Build Coastguard Worker WebKitWebView *view;
23*03f9172cSAndroid Build Coastguard Worker int success;
24*03f9172cSAndroid Build Coastguard Worker int progress;
25*03f9172cSAndroid Build Coastguard Worker char *hover_link;
26*03f9172cSAndroid Build Coastguard Worker char *title;
27*03f9172cSAndroid Build Coastguard Worker int gtk_main_started;
28*03f9172cSAndroid Build Coastguard Worker int quit_gtk_main;
29*03f9172cSAndroid Build Coastguard Worker };
30*03f9172cSAndroid Build Coastguard Worker
win_cb_destroy(GtkWidget * win,struct browser_context * ctx)31*03f9172cSAndroid Build Coastguard Worker static void win_cb_destroy(GtkWidget *win, struct browser_context *ctx)
32*03f9172cSAndroid Build Coastguard Worker {
33*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s", __func__);
34*03f9172cSAndroid Build Coastguard Worker if (ctx->gtk_main_started)
35*03f9172cSAndroid Build Coastguard Worker gtk_main_quit();
36*03f9172cSAndroid Build Coastguard Worker }
37*03f9172cSAndroid Build Coastguard Worker
38*03f9172cSAndroid Build Coastguard Worker
browser_update_title(struct browser_context * ctx)39*03f9172cSAndroid Build Coastguard Worker static void browser_update_title(struct browser_context *ctx)
40*03f9172cSAndroid Build Coastguard Worker {
41*03f9172cSAndroid Build Coastguard Worker char buf[100];
42*03f9172cSAndroid Build Coastguard Worker
43*03f9172cSAndroid Build Coastguard Worker if (ctx->hover_link) {
44*03f9172cSAndroid Build Coastguard Worker gtk_window_set_title(GTK_WINDOW(ctx->win), ctx->hover_link);
45*03f9172cSAndroid Build Coastguard Worker return;
46*03f9172cSAndroid Build Coastguard Worker }
47*03f9172cSAndroid Build Coastguard Worker
48*03f9172cSAndroid Build Coastguard Worker if (ctx->progress == 100) {
49*03f9172cSAndroid Build Coastguard Worker gtk_window_set_title(GTK_WINDOW(ctx->win),
50*03f9172cSAndroid Build Coastguard Worker ctx->title ? ctx->title :
51*03f9172cSAndroid Build Coastguard Worker "Hotspot 2.0 client");
52*03f9172cSAndroid Build Coastguard Worker return;
53*03f9172cSAndroid Build Coastguard Worker }
54*03f9172cSAndroid Build Coastguard Worker
55*03f9172cSAndroid Build Coastguard Worker snprintf(buf, sizeof(buf), "[%d%%] %s", ctx->progress,
56*03f9172cSAndroid Build Coastguard Worker ctx->title ? ctx->title : "Hotspot 2.0 client");
57*03f9172cSAndroid Build Coastguard Worker gtk_window_set_title(GTK_WINDOW(ctx->win), buf);
58*03f9172cSAndroid Build Coastguard Worker }
59*03f9172cSAndroid Build Coastguard Worker
60*03f9172cSAndroid Build Coastguard Worker
process_request_starting_uri(struct browser_context * ctx,const char * uri)61*03f9172cSAndroid Build Coastguard Worker static void process_request_starting_uri(struct browser_context *ctx,
62*03f9172cSAndroid Build Coastguard Worker const char *uri)
63*03f9172cSAndroid Build Coastguard Worker {
64*03f9172cSAndroid Build Coastguard Worker int quit = 0;
65*03f9172cSAndroid Build Coastguard Worker
66*03f9172cSAndroid Build Coastguard Worker if (g_str_has_prefix(uri, "osu://")) {
67*03f9172cSAndroid Build Coastguard Worker ctx->success = atoi(uri + 6);
68*03f9172cSAndroid Build Coastguard Worker quit = 1;
69*03f9172cSAndroid Build Coastguard Worker } else if (g_str_has_prefix(uri, "http://localhost:12345")) {
70*03f9172cSAndroid Build Coastguard Worker /*
71*03f9172cSAndroid Build Coastguard Worker * This is used as a special trigger to indicate that the
72*03f9172cSAndroid Build Coastguard Worker * user exchange has been completed.
73*03f9172cSAndroid Build Coastguard Worker */
74*03f9172cSAndroid Build Coastguard Worker ctx->success = 1;
75*03f9172cSAndroid Build Coastguard Worker quit = 1;
76*03f9172cSAndroid Build Coastguard Worker }
77*03f9172cSAndroid Build Coastguard Worker
78*03f9172cSAndroid Build Coastguard Worker if (quit) {
79*03f9172cSAndroid Build Coastguard Worker if (ctx->gtk_main_started) {
80*03f9172cSAndroid Build Coastguard Worker gtk_main_quit();
81*03f9172cSAndroid Build Coastguard Worker ctx->gtk_main_started = 0;
82*03f9172cSAndroid Build Coastguard Worker } else {
83*03f9172cSAndroid Build Coastguard Worker ctx->quit_gtk_main = 1;
84*03f9172cSAndroid Build Coastguard Worker }
85*03f9172cSAndroid Build Coastguard Worker }
86*03f9172cSAndroid Build Coastguard Worker }
87*03f9172cSAndroid Build Coastguard Worker
88*03f9172cSAndroid Build Coastguard Worker
89*03f9172cSAndroid Build Coastguard Worker #ifdef USE_WEBKIT2
90*03f9172cSAndroid Build Coastguard Worker
view_cb_notify_estimated_load_progress(WebKitWebView * view,GParamSpec * pspec,struct browser_context * ctx)91*03f9172cSAndroid Build Coastguard Worker static void view_cb_notify_estimated_load_progress(WebKitWebView *view,
92*03f9172cSAndroid Build Coastguard Worker GParamSpec *pspec,
93*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
94*03f9172cSAndroid Build Coastguard Worker {
95*03f9172cSAndroid Build Coastguard Worker ctx->progress = 100 * webkit_web_view_get_estimated_load_progress(view);
96*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s progress=%d", __func__,
97*03f9172cSAndroid Build Coastguard Worker ctx->progress);
98*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
99*03f9172cSAndroid Build Coastguard Worker }
100*03f9172cSAndroid Build Coastguard Worker
101*03f9172cSAndroid Build Coastguard Worker
view_cb_resource_load_starting(WebKitWebView * view,WebKitWebResource * res,WebKitURIRequest * req,struct browser_context * ctx)102*03f9172cSAndroid Build Coastguard Worker static void view_cb_resource_load_starting(WebKitWebView *view,
103*03f9172cSAndroid Build Coastguard Worker WebKitWebResource *res,
104*03f9172cSAndroid Build Coastguard Worker WebKitURIRequest *req,
105*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
106*03f9172cSAndroid Build Coastguard Worker {
107*03f9172cSAndroid Build Coastguard Worker const gchar *uri = webkit_uri_request_get_uri(req);
108*03f9172cSAndroid Build Coastguard Worker
109*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s uri=%s", __func__, uri);
110*03f9172cSAndroid Build Coastguard Worker process_request_starting_uri(ctx, uri);
111*03f9172cSAndroid Build Coastguard Worker }
112*03f9172cSAndroid Build Coastguard Worker
113*03f9172cSAndroid Build Coastguard Worker
view_cb_decide_policy(WebKitWebView * view,WebKitPolicyDecision * policy,WebKitPolicyDecisionType type,struct browser_context * ctx)114*03f9172cSAndroid Build Coastguard Worker static gboolean view_cb_decide_policy(WebKitWebView *view,
115*03f9172cSAndroid Build Coastguard Worker WebKitPolicyDecision *policy,
116*03f9172cSAndroid Build Coastguard Worker WebKitPolicyDecisionType type,
117*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
118*03f9172cSAndroid Build Coastguard Worker {
119*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s type=%d", __func__, type);
120*03f9172cSAndroid Build Coastguard Worker switch (type) {
121*03f9172cSAndroid Build Coastguard Worker case WEBKIT_POLICY_DECISION_TYPE_RESPONSE: {
122*03f9172cSAndroid Build Coastguard Worker /* This function makes webkit send a download signal for all
123*03f9172cSAndroid Build Coastguard Worker * unknown mime types. */
124*03f9172cSAndroid Build Coastguard Worker WebKitResponsePolicyDecision *response;
125*03f9172cSAndroid Build Coastguard Worker
126*03f9172cSAndroid Build Coastguard Worker response = WEBKIT_RESPONSE_POLICY_DECISION(policy);
127*03f9172cSAndroid Build Coastguard Worker if (!webkit_response_policy_decision_is_mime_type_supported(
128*03f9172cSAndroid Build Coastguard Worker response)) {
129*03f9172cSAndroid Build Coastguard Worker webkit_policy_decision_download(policy);
130*03f9172cSAndroid Build Coastguard Worker return TRUE;
131*03f9172cSAndroid Build Coastguard Worker }
132*03f9172cSAndroid Build Coastguard Worker break;
133*03f9172cSAndroid Build Coastguard Worker }
134*03f9172cSAndroid Build Coastguard Worker case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION: {
135*03f9172cSAndroid Build Coastguard Worker WebKitNavigationPolicyDecision *d;
136*03f9172cSAndroid Build Coastguard Worker WebKitNavigationAction *a;
137*03f9172cSAndroid Build Coastguard Worker WebKitURIRequest *req;
138*03f9172cSAndroid Build Coastguard Worker const gchar *uri;
139*03f9172cSAndroid Build Coastguard Worker
140*03f9172cSAndroid Build Coastguard Worker d = WEBKIT_NAVIGATION_POLICY_DECISION(policy);
141*03f9172cSAndroid Build Coastguard Worker a = webkit_navigation_policy_decision_get_navigation_action(d);
142*03f9172cSAndroid Build Coastguard Worker req = webkit_navigation_action_get_request(a);
143*03f9172cSAndroid Build Coastguard Worker uri = webkit_uri_request_get_uri(req);
144*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s navigation action: uri=%s",
145*03f9172cSAndroid Build Coastguard Worker __func__, uri);
146*03f9172cSAndroid Build Coastguard Worker process_request_starting_uri(ctx, uri);
147*03f9172cSAndroid Build Coastguard Worker break;
148*03f9172cSAndroid Build Coastguard Worker }
149*03f9172cSAndroid Build Coastguard Worker default:
150*03f9172cSAndroid Build Coastguard Worker break;
151*03f9172cSAndroid Build Coastguard Worker }
152*03f9172cSAndroid Build Coastguard Worker
153*03f9172cSAndroid Build Coastguard Worker return FALSE;
154*03f9172cSAndroid Build Coastguard Worker }
155*03f9172cSAndroid Build Coastguard Worker
156*03f9172cSAndroid Build Coastguard Worker
view_cb_mouse_target_changed(WebKitWebView * view,WebKitHitTestResult * h,guint modifiers,struct browser_context * ctx)157*03f9172cSAndroid Build Coastguard Worker static void view_cb_mouse_target_changed(WebKitWebView *view,
158*03f9172cSAndroid Build Coastguard Worker WebKitHitTestResult *h,
159*03f9172cSAndroid Build Coastguard Worker guint modifiers,
160*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
161*03f9172cSAndroid Build Coastguard Worker {
162*03f9172cSAndroid Build Coastguard Worker WebKitHitTestResultContext hc = webkit_hit_test_result_get_context(h);
163*03f9172cSAndroid Build Coastguard Worker const char *uri = NULL;
164*03f9172cSAndroid Build Coastguard Worker
165*03f9172cSAndroid Build Coastguard Worker if (hc & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK)
166*03f9172cSAndroid Build Coastguard Worker uri = webkit_hit_test_result_get_link_uri(h);
167*03f9172cSAndroid Build Coastguard Worker else if (hc & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)
168*03f9172cSAndroid Build Coastguard Worker uri = webkit_hit_test_result_get_image_uri(h);
169*03f9172cSAndroid Build Coastguard Worker else if (hc & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA)
170*03f9172cSAndroid Build Coastguard Worker uri = webkit_hit_test_result_get_media_uri(h);
171*03f9172cSAndroid Build Coastguard Worker
172*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s uri=%s", __func__, uri ? uri : "N/A");
173*03f9172cSAndroid Build Coastguard Worker os_free(ctx->hover_link);
174*03f9172cSAndroid Build Coastguard Worker if (uri)
175*03f9172cSAndroid Build Coastguard Worker ctx->hover_link = os_strdup(uri);
176*03f9172cSAndroid Build Coastguard Worker else
177*03f9172cSAndroid Build Coastguard Worker ctx->hover_link = NULL;
178*03f9172cSAndroid Build Coastguard Worker
179*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
180*03f9172cSAndroid Build Coastguard Worker }
181*03f9172cSAndroid Build Coastguard Worker
182*03f9172cSAndroid Build Coastguard Worker
view_cb_notify_title(WebKitWebView * view,GParamSpec * ps,struct browser_context * ctx)183*03f9172cSAndroid Build Coastguard Worker static void view_cb_notify_title(WebKitWebView *view, GParamSpec *ps,
184*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
185*03f9172cSAndroid Build Coastguard Worker {
186*03f9172cSAndroid Build Coastguard Worker const char *title;
187*03f9172cSAndroid Build Coastguard Worker
188*03f9172cSAndroid Build Coastguard Worker title = webkit_web_view_get_title(ctx->view);
189*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s title=%s", __func__, title);
190*03f9172cSAndroid Build Coastguard Worker os_free(ctx->title);
191*03f9172cSAndroid Build Coastguard Worker ctx->title = os_strdup(title);
192*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
193*03f9172cSAndroid Build Coastguard Worker }
194*03f9172cSAndroid Build Coastguard Worker
195*03f9172cSAndroid Build Coastguard Worker #else /* USE_WEBKIT2 */
196*03f9172cSAndroid Build Coastguard Worker
view_cb_notify_progress(WebKitWebView * view,GParamSpec * pspec,struct browser_context * ctx)197*03f9172cSAndroid Build Coastguard Worker static void view_cb_notify_progress(WebKitWebView *view, GParamSpec *pspec,
198*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
199*03f9172cSAndroid Build Coastguard Worker {
200*03f9172cSAndroid Build Coastguard Worker ctx->progress = 100 * webkit_web_view_get_progress(view);
201*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s progress=%d", __func__,
202*03f9172cSAndroid Build Coastguard Worker ctx->progress);
203*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
204*03f9172cSAndroid Build Coastguard Worker }
205*03f9172cSAndroid Build Coastguard Worker
206*03f9172cSAndroid Build Coastguard Worker
view_cb_notify_load_status(WebKitWebView * view,GParamSpec * pspec,struct browser_context * ctx)207*03f9172cSAndroid Build Coastguard Worker static void view_cb_notify_load_status(WebKitWebView *view, GParamSpec *pspec,
208*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
209*03f9172cSAndroid Build Coastguard Worker {
210*03f9172cSAndroid Build Coastguard Worker int status = webkit_web_view_get_load_status(view);
211*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s load-status=%d uri=%s",
212*03f9172cSAndroid Build Coastguard Worker __func__, status, webkit_web_view_get_uri(view));
213*03f9172cSAndroid Build Coastguard Worker if (ctx->quit_gtk_main) {
214*03f9172cSAndroid Build Coastguard Worker gtk_main_quit();
215*03f9172cSAndroid Build Coastguard Worker ctx->gtk_main_started = 0;
216*03f9172cSAndroid Build Coastguard Worker }
217*03f9172cSAndroid Build Coastguard Worker }
218*03f9172cSAndroid Build Coastguard Worker
219*03f9172cSAndroid Build Coastguard Worker
view_cb_resource_request_starting(WebKitWebView * view,WebKitWebFrame * frame,WebKitWebResource * res,WebKitNetworkRequest * req,WebKitNetworkResponse * resp,struct browser_context * ctx)220*03f9172cSAndroid Build Coastguard Worker static void view_cb_resource_request_starting(WebKitWebView *view,
221*03f9172cSAndroid Build Coastguard Worker WebKitWebFrame *frame,
222*03f9172cSAndroid Build Coastguard Worker WebKitWebResource *res,
223*03f9172cSAndroid Build Coastguard Worker WebKitNetworkRequest *req,
224*03f9172cSAndroid Build Coastguard Worker WebKitNetworkResponse *resp,
225*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
226*03f9172cSAndroid Build Coastguard Worker {
227*03f9172cSAndroid Build Coastguard Worker const gchar *uri = webkit_network_request_get_uri(req);
228*03f9172cSAndroid Build Coastguard Worker
229*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s uri=%s", __func__, uri);
230*03f9172cSAndroid Build Coastguard Worker if (g_str_has_suffix(uri, "/favicon.ico"))
231*03f9172cSAndroid Build Coastguard Worker webkit_network_request_set_uri(req, "about:blank");
232*03f9172cSAndroid Build Coastguard Worker
233*03f9172cSAndroid Build Coastguard Worker process_request_starting_uri(ctx, uri);
234*03f9172cSAndroid Build Coastguard Worker }
235*03f9172cSAndroid Build Coastguard Worker
236*03f9172cSAndroid Build Coastguard Worker
view_cb_mime_type_policy_decision(WebKitWebView * view,WebKitWebFrame * frame,WebKitNetworkRequest * req,gchar * mime,WebKitWebPolicyDecision * policy,struct browser_context * ctx)237*03f9172cSAndroid Build Coastguard Worker static gboolean view_cb_mime_type_policy_decision(
238*03f9172cSAndroid Build Coastguard Worker WebKitWebView *view, WebKitWebFrame *frame, WebKitNetworkRequest *req,
239*03f9172cSAndroid Build Coastguard Worker gchar *mime, WebKitWebPolicyDecision *policy,
240*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
241*03f9172cSAndroid Build Coastguard Worker {
242*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s mime=%s", __func__, mime);
243*03f9172cSAndroid Build Coastguard Worker
244*03f9172cSAndroid Build Coastguard Worker if (!webkit_web_view_can_show_mime_type(view, mime)) {
245*03f9172cSAndroid Build Coastguard Worker webkit_web_policy_decision_download(policy);
246*03f9172cSAndroid Build Coastguard Worker return TRUE;
247*03f9172cSAndroid Build Coastguard Worker }
248*03f9172cSAndroid Build Coastguard Worker
249*03f9172cSAndroid Build Coastguard Worker return FALSE;
250*03f9172cSAndroid Build Coastguard Worker }
251*03f9172cSAndroid Build Coastguard Worker
252*03f9172cSAndroid Build Coastguard Worker
view_cb_download_requested(WebKitWebView * view,WebKitDownload * dl,struct browser_context * ctx)253*03f9172cSAndroid Build Coastguard Worker static gboolean view_cb_download_requested(WebKitWebView *view,
254*03f9172cSAndroid Build Coastguard Worker WebKitDownload *dl,
255*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
256*03f9172cSAndroid Build Coastguard Worker {
257*03f9172cSAndroid Build Coastguard Worker const gchar *uri;
258*03f9172cSAndroid Build Coastguard Worker uri = webkit_download_get_uri(dl);
259*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s uri=%s", __func__, uri);
260*03f9172cSAndroid Build Coastguard Worker return FALSE;
261*03f9172cSAndroid Build Coastguard Worker }
262*03f9172cSAndroid Build Coastguard Worker
263*03f9172cSAndroid Build Coastguard Worker
view_cb_hovering_over_link(WebKitWebView * view,gchar * title,gchar * uri,struct browser_context * ctx)264*03f9172cSAndroid Build Coastguard Worker static void view_cb_hovering_over_link(WebKitWebView *view, gchar *title,
265*03f9172cSAndroid Build Coastguard Worker gchar *uri, struct browser_context *ctx)
266*03f9172cSAndroid Build Coastguard Worker {
267*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s title=%s uri=%s", __func__, title,
268*03f9172cSAndroid Build Coastguard Worker uri);
269*03f9172cSAndroid Build Coastguard Worker os_free(ctx->hover_link);
270*03f9172cSAndroid Build Coastguard Worker if (uri)
271*03f9172cSAndroid Build Coastguard Worker ctx->hover_link = os_strdup(uri);
272*03f9172cSAndroid Build Coastguard Worker else
273*03f9172cSAndroid Build Coastguard Worker ctx->hover_link = NULL;
274*03f9172cSAndroid Build Coastguard Worker
275*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
276*03f9172cSAndroid Build Coastguard Worker }
277*03f9172cSAndroid Build Coastguard Worker
278*03f9172cSAndroid Build Coastguard Worker
view_cb_title_changed(WebKitWebView * view,WebKitWebFrame * frame,const char * title,struct browser_context * ctx)279*03f9172cSAndroid Build Coastguard Worker static void view_cb_title_changed(WebKitWebView *view, WebKitWebFrame *frame,
280*03f9172cSAndroid Build Coastguard Worker const char *title,
281*03f9172cSAndroid Build Coastguard Worker struct browser_context *ctx)
282*03f9172cSAndroid Build Coastguard Worker {
283*03f9172cSAndroid Build Coastguard Worker wpa_printf(MSG_DEBUG, "BROWSER:%s title=%s", __func__, title);
284*03f9172cSAndroid Build Coastguard Worker os_free(ctx->title);
285*03f9172cSAndroid Build Coastguard Worker ctx->title = os_strdup(title);
286*03f9172cSAndroid Build Coastguard Worker browser_update_title(ctx);
287*03f9172cSAndroid Build Coastguard Worker }
288*03f9172cSAndroid Build Coastguard Worker
289*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
290*03f9172cSAndroid Build Coastguard Worker
291*03f9172cSAndroid Build Coastguard Worker
hs20_web_browser(const char * url,int ignore_tls)292*03f9172cSAndroid Build Coastguard Worker int hs20_web_browser(const char *url, int ignore_tls)
293*03f9172cSAndroid Build Coastguard Worker {
294*03f9172cSAndroid Build Coastguard Worker GtkWidget *scroll;
295*03f9172cSAndroid Build Coastguard Worker WebKitWebView *view;
296*03f9172cSAndroid Build Coastguard Worker #ifdef USE_WEBKIT2
297*03f9172cSAndroid Build Coastguard Worker WebKitSettings *settings;
298*03f9172cSAndroid Build Coastguard Worker #else /* USE_WEBKIT2 */
299*03f9172cSAndroid Build Coastguard Worker WebKitWebSettings *settings;
300*03f9172cSAndroid Build Coastguard Worker SoupSession *s;
301*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
302*03f9172cSAndroid Build Coastguard Worker struct browser_context ctx;
303*03f9172cSAndroid Build Coastguard Worker
304*03f9172cSAndroid Build Coastguard Worker memset(&ctx, 0, sizeof(ctx));
305*03f9172cSAndroid Build Coastguard Worker if (!gtk_init_check(NULL, NULL))
306*03f9172cSAndroid Build Coastguard Worker return -1;
307*03f9172cSAndroid Build Coastguard Worker
308*03f9172cSAndroid Build Coastguard Worker #ifndef USE_WEBKIT2
309*03f9172cSAndroid Build Coastguard Worker s = webkit_get_default_session();
310*03f9172cSAndroid Build Coastguard Worker g_object_set(G_OBJECT(s), "ssl-ca-file",
311*03f9172cSAndroid Build Coastguard Worker "/etc/ssl/certs/ca-certificates.crt", NULL);
312*03f9172cSAndroid Build Coastguard Worker if (ignore_tls)
313*03f9172cSAndroid Build Coastguard Worker g_object_set(G_OBJECT(s), "ssl-strict", FALSE, NULL);
314*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
315*03f9172cSAndroid Build Coastguard Worker
316*03f9172cSAndroid Build Coastguard Worker ctx.win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
317*03f9172cSAndroid Build Coastguard Worker gtk_window_set_role(GTK_WINDOW(ctx.win), "Hotspot 2.0 client");
318*03f9172cSAndroid Build Coastguard Worker gtk_window_set_default_size(GTK_WINDOW(ctx.win), 800, 600);
319*03f9172cSAndroid Build Coastguard Worker
320*03f9172cSAndroid Build Coastguard Worker scroll = gtk_scrolled_window_new(NULL, NULL);
321*03f9172cSAndroid Build Coastguard Worker gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll),
322*03f9172cSAndroid Build Coastguard Worker GTK_POLICY_NEVER, GTK_POLICY_NEVER);
323*03f9172cSAndroid Build Coastguard Worker
324*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(ctx.win), "destroy",
325*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(win_cb_destroy), &ctx);
326*03f9172cSAndroid Build Coastguard Worker
327*03f9172cSAndroid Build Coastguard Worker view = WEBKIT_WEB_VIEW(webkit_web_view_new());
328*03f9172cSAndroid Build Coastguard Worker ctx.view = view;
329*03f9172cSAndroid Build Coastguard Worker #ifdef USE_WEBKIT2
330*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "notify::estimated-load-progress",
331*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_notify_estimated_load_progress),
332*03f9172cSAndroid Build Coastguard Worker &ctx);
333*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "resource-load-started",
334*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_resource_load_starting), &ctx);
335*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "decide-policy",
336*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_decide_policy), &ctx);
337*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "mouse-target-changed",
338*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_mouse_target_changed), &ctx);
339*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "notify::title",
340*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_notify_title), &ctx);
341*03f9172cSAndroid Build Coastguard Worker #else /* USE_WEBKIT2 */
342*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "notify::load-status",
343*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_notify_load_status), &ctx);
344*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "notify::progress",
345*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_notify_progress), &ctx);
346*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "resource-request-starting",
347*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_resource_request_starting), &ctx);
348*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "mime-type-policy-decision-requested",
349*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_mime_type_policy_decision), &ctx);
350*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "download-requested",
351*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_download_requested), &ctx);
352*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "hovering-over-link",
353*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_hovering_over_link), &ctx);
354*03f9172cSAndroid Build Coastguard Worker g_signal_connect(G_OBJECT(view), "title-changed",
355*03f9172cSAndroid Build Coastguard Worker G_CALLBACK(view_cb_title_changed), &ctx);
356*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
357*03f9172cSAndroid Build Coastguard Worker
358*03f9172cSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(view));
359*03f9172cSAndroid Build Coastguard Worker gtk_container_add(GTK_CONTAINER(ctx.win), GTK_WIDGET(scroll));
360*03f9172cSAndroid Build Coastguard Worker
361*03f9172cSAndroid Build Coastguard Worker gtk_widget_grab_focus(GTK_WIDGET(view));
362*03f9172cSAndroid Build Coastguard Worker gtk_widget_show_all(ctx.win);
363*03f9172cSAndroid Build Coastguard Worker
364*03f9172cSAndroid Build Coastguard Worker settings = webkit_web_view_get_settings(view);
365*03f9172cSAndroid Build Coastguard Worker g_object_set(G_OBJECT(settings), "user-agent",
366*03f9172cSAndroid Build Coastguard Worker "Mozilla/5.0 (X11; U; Unix; en-US) "
367*03f9172cSAndroid Build Coastguard Worker "AppleWebKit/537.15 (KHTML, like Gecko) "
368*03f9172cSAndroid Build Coastguard Worker "hs20-client/1.0", NULL);
369*03f9172cSAndroid Build Coastguard Worker g_object_set(G_OBJECT(settings), "auto-load-images", TRUE, NULL);
370*03f9172cSAndroid Build Coastguard Worker
371*03f9172cSAndroid Build Coastguard Worker #ifdef USE_WEBKIT2
372*03f9172cSAndroid Build Coastguard Worker if (ignore_tls) {
373*03f9172cSAndroid Build Coastguard Worker #if WEBKIT_CHECK_VERSION(2, 32, 0)
374*03f9172cSAndroid Build Coastguard Worker WebKitWebContext *wkctx;
375*03f9172cSAndroid Build Coastguard Worker WebKitWebsiteDataManager *wkmgr;
376*03f9172cSAndroid Build Coastguard Worker
377*03f9172cSAndroid Build Coastguard Worker wkctx = webkit_web_context_get_default();
378*03f9172cSAndroid Build Coastguard Worker wkmgr = webkit_web_context_get_website_data_manager(wkctx);
379*03f9172cSAndroid Build Coastguard Worker webkit_website_data_manager_set_tls_errors_policy(
380*03f9172cSAndroid Build Coastguard Worker wkmgr, WEBKIT_TLS_ERRORS_POLICY_IGNORE);
381*03f9172cSAndroid Build Coastguard Worker #else
382*03f9172cSAndroid Build Coastguard Worker WebKitWebContext *wkctx;
383*03f9172cSAndroid Build Coastguard Worker
384*03f9172cSAndroid Build Coastguard Worker wkctx = webkit_web_context_get_default();
385*03f9172cSAndroid Build Coastguard Worker webkit_web_context_set_tls_errors_policy(
386*03f9172cSAndroid Build Coastguard Worker wkctx, WEBKIT_TLS_ERRORS_POLICY_IGNORE);
387*03f9172cSAndroid Build Coastguard Worker #endif
388*03f9172cSAndroid Build Coastguard Worker }
389*03f9172cSAndroid Build Coastguard Worker #endif /* USE_WEBKIT2 */
390*03f9172cSAndroid Build Coastguard Worker
391*03f9172cSAndroid Build Coastguard Worker webkit_web_view_load_uri(view, url);
392*03f9172cSAndroid Build Coastguard Worker
393*03f9172cSAndroid Build Coastguard Worker ctx.gtk_main_started = 1;
394*03f9172cSAndroid Build Coastguard Worker gtk_main();
395*03f9172cSAndroid Build Coastguard Worker gtk_widget_destroy(ctx.win);
396*03f9172cSAndroid Build Coastguard Worker while (gtk_events_pending())
397*03f9172cSAndroid Build Coastguard Worker gtk_main_iteration();
398*03f9172cSAndroid Build Coastguard Worker
399*03f9172cSAndroid Build Coastguard Worker free(ctx.hover_link);
400*03f9172cSAndroid Build Coastguard Worker free(ctx.title);
401*03f9172cSAndroid Build Coastguard Worker return ctx.success;
402*03f9172cSAndroid Build Coastguard Worker }
403