xref: /aosp_15_r20/external/wpa_supplicant_8/src/utils/browser.c (revision 03f9172ca588f91df233974f4258bab95191f931)
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