aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRicardo Wurmus2016-10-25 23:00:35 -0700
committerPaul Eggert2016-10-25 23:07:13 -0700
commitd781662873f228b110a128f7a2b6583a4d5e0a3a (patch)
tree4c35b387e57e4780c2276a6fe7b69a0ff36fc243 /src
parent1ea669d6f0269784b3e69238fd2813f55340d53a (diff)
downloademacs-d781662873f228b110a128f7a2b6583a4d5e0a3a.tar.gz
emacs-d781662873f228b110a128f7a2b6583a4d5e0a3a.zip
xwidget: Use WebKit2 API
* configure.ac: Check for webkit2gtk-4.0. * src/xwidget.c: Adjust to use WebKit2 API. * lisp/xwidget.el (xwidget-webkit-callback): Adjust matches for `xwidget-event-type'.
Diffstat (limited to 'src')
-rw-r--r--src/xwidget.c186
1 files changed, 80 insertions, 106 deletions
diff --git a/src/xwidget.c b/src/xwidget.c
index f5f4da0d369..78349a819a9 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -27,10 +27,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
27#include "keyboard.h" 27#include "keyboard.h"
28#include "gtkutil.h" 28#include "gtkutil.h"
29 29
30#include <webkit/webkitwebview.h> 30#include <webkit2/webkit2.h>
31#include <webkit/webkitwebnavigationaction.h>
32#include <webkit/webkitdownload.h>
33#include <webkit/webkitwebpolicydecision.h>
34 31
35static struct xwidget * 32static struct xwidget *
36allocate_xwidget (void) 33allocate_xwidget (void)
@@ -50,34 +47,16 @@ allocate_xwidget_view (void)
50 47
51static struct xwidget_view *xwidget_view_lookup (struct xwidget *, 48static struct xwidget_view *xwidget_view_lookup (struct xwidget *,
52 struct window *); 49 struct window *);
53static void webkit_document_load_finished_cb (WebKitWebView *, WebKitWebFrame *, 50static void webkit_view_load_changed_cb (WebKitWebView *,
54 gpointer); 51 WebKitLoadEvent,
55static gboolean webkit_download_cb (WebKitWebView *, WebKitDownload *, gpointer); 52 gpointer);
53static gboolean webkit_download_cb (WebKitWebContext *, WebKitDownload *, gpointer);
56 54
57static gboolean 55static gboolean
58webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *, 56webkit_decide_policy_cb (WebKitWebView *,
59 WebKitWebFrame *, 57 WebKitPolicyDecision *,
60 WebKitNetworkRequest *, 58 WebKitPolicyDecisionType,
61 gchar *, 59 gpointer);
62 WebKitWebPolicyDecision *,
63 gpointer);
64
65static gboolean
66webkit_new_window_policy_decision_requested_cb (WebKitWebView *,
67 WebKitWebFrame *,
68 WebKitNetworkRequest *,
69 WebKitWebNavigationAction *,
70 WebKitWebPolicyDecision *,
71 gpointer);
72
73static gboolean
74webkit_navigation_policy_decision_requested_cb (WebKitWebView *,
75 WebKitWebFrame *,
76 WebKitNetworkRequest *,
77 WebKitWebNavigationAction *,
78 WebKitWebPolicyDecision *,
79 gpointer);
80
81 60
82 61
83DEFUN ("make-xwidget", 62DEFUN ("make-xwidget",
@@ -168,29 +147,17 @@ Returns the newly constructed xwidget, or nil if construction fails. */)
168 if (EQ (xw->type, Qwebkit)) 147 if (EQ (xw->type, Qwebkit))
169 { 148 {
170 g_signal_connect (G_OBJECT (xw->widget_osr), 149 g_signal_connect (G_OBJECT (xw->widget_osr),
171 "document-load-finished", 150 "load-changed",
172 G_CALLBACK (webkit_document_load_finished_cb), xw); 151 G_CALLBACK (webkit_view_load_changed_cb), xw);
173 152
174 g_signal_connect (G_OBJECT (xw->widget_osr), 153 g_signal_connect (G_OBJECT (webkit_web_context_get_default ()),
175 "download-requested", 154 "download-started",
176 G_CALLBACK (webkit_download_cb), xw); 155 G_CALLBACK (webkit_download_cb), xw);
177 156
178 g_signal_connect (G_OBJECT (xw->widget_osr), 157 g_signal_connect (G_OBJECT (xw->widget_osr),
179 "mime-type-policy-decision-requested", 158 "decide-policy",
180 G_CALLBACK
181 (webkit_mime_type_policy_typedecision_requested_cb),
182 xw);
183
184 g_signal_connect (G_OBJECT (xw->widget_osr),
185 "new-window-policy-decision-requested",
186 G_CALLBACK
187 (webkit_new_window_policy_decision_requested_cb),
188 xw);
189
190 g_signal_connect (G_OBJECT (xw->widget_osr),
191 "navigation-policy-decision-requested",
192 G_CALLBACK 159 G_CALLBACK
193 (webkit_navigation_policy_decision_requested_cb), 160 (webkit_decide_policy_cb),
194 xw); 161 xw);
195 } 162 }
196 163
@@ -284,81 +251,83 @@ store_xwidget_event_string (struct xwidget *xw, const char *eventname,
284 kbd_buffer_store_event (&event); 251 kbd_buffer_store_event (&event);
285} 252}
286 253
287/* TODO deprecated, use load-status. */
288void 254void
289webkit_document_load_finished_cb (WebKitWebView *webkitwebview, 255webkit_view_load_changed_cb (WebKitWebView *webkitwebview,
290 WebKitWebFrame *arg1, 256 WebKitLoadEvent load_event,
291 gpointer data) 257 gpointer data)
292{ 258{
293 struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview), 259 switch (load_event) {
294 XG_XWIDGET); 260 case WEBKIT_LOAD_FINISHED:
295 261 {
296 store_xwidget_event_string (xw, "document-load-finished", ""); 262 struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview),
263 XG_XWIDGET);
264 store_xwidget_event_string (xw, "load-changed", "");
265 break;
266 }
267 default:
268 break;
269 }
297} 270}
298 271
299gboolean 272gboolean
300webkit_download_cb (WebKitWebView *webkitwebview, 273webkit_download_cb (WebKitWebContext *webkitwebcontext,
301 WebKitDownload *arg1, 274 WebKitDownload *arg1,
302 gpointer data) 275 gpointer data)
303{ 276{
304 struct xwidget *xw = g_object_get_data (G_OBJECT (webkitwebview), 277 WebKitWebView *view = webkit_download_get_web_view(arg1);
278 WebKitURIRequest *request = webkit_download_get_request(arg1);
279 struct xwidget *xw = g_object_get_data (G_OBJECT (view),
305 XG_XWIDGET); 280 XG_XWIDGET);
306 store_xwidget_event_string (xw, "download-requested", 281
307 webkit_download_get_uri (arg1)); 282 store_xwidget_event_string (xw, "download-started",
283 webkit_uri_request_get_uri(request));
308 return FALSE; 284 return FALSE;
309} 285}
310 286
311static gboolean 287static gboolean
312webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *webView, 288webkit_decide_policy_cb (WebKitWebView *webView,
313 WebKitWebFrame *frame, 289 WebKitPolicyDecision *decision,
314 WebKitNetworkRequest *request, 290 WebKitPolicyDecisionType type,
315 gchar *mimetype, 291 gpointer user_data)
316 WebKitWebPolicyDecision *policy_decision,
317 gpointer user_data)
318{ 292{
319 /* This function makes webkit send a download signal for all unknown 293 switch (type) {
320 mime types. TODO: Defer the decision to Lisp, so that it's 294 case WEBKIT_POLICY_DECISION_TYPE_RESPONSE:
321 possible to make Emacs handle mime text for instance. */ 295 /* This function makes webkit send a download signal for all unknown
322 if (!webkit_web_view_can_show_mime_type (webView, mimetype)) 296 mime types. TODO: Defer the decision to Lisp, so that it's
297 possible to make Emacs handle mime text for instance. */
323 { 298 {
324 webkit_web_policy_decision_download (policy_decision); 299 WebKitResponsePolicyDecision *response =
325 return TRUE; 300 WEBKIT_RESPONSE_POLICY_DECISION (decision);
301 if (!webkit_response_policy_decision_is_mime_type_supported (response))
302 {
303 webkit_policy_decision_download (decision);
304 return TRUE;
305 }
306 else
307 return FALSE;
308 break;
326 } 309 }
327 else 310 case WEBKIT_POLICY_DECISION_TYPE_NEW_WINDOW_ACTION:
311 case WEBKIT_POLICY_DECISION_TYPE_NAVIGATION_ACTION:
312 {
313 WebKitNavigationPolicyDecision *navigation_decision =
314 WEBKIT_NAVIGATION_POLICY_DECISION (decision);
315 WebKitNavigationAction *navigation_action =
316 webkit_navigation_policy_decision_get_navigation_action (navigation_decision);
317 WebKitURIRequest *request =
318 webkit_navigation_action_get_request (navigation_action);
319
320 struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET);
321 store_xwidget_event_string (xw, "decide-policy",
322 webkit_uri_request_get_uri (request));
323 return FALSE;
324 break;
325 }
326 default:
328 return FALSE; 327 return FALSE;
328 }
329} 329}
330 330
331static gboolean
332webkit_new_window_policy_decision_requested_cb (WebKitWebView *webView,
333 WebKitWebFrame *frame,
334 WebKitNetworkRequest *request,
335 WebKitWebNavigationAction *navigation_action,
336 WebKitWebPolicyDecision *policy_decision,
337 gpointer user_data)
338{
339 struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET);
340 webkit_web_navigation_action_get_original_uri (navigation_action);
341
342 store_xwidget_event_string (xw, "new-window-policy-decision-requested",
343 webkit_web_navigation_action_get_original_uri
344 (navigation_action));
345 return FALSE;
346}
347
348static gboolean
349webkit_navigation_policy_decision_requested_cb (WebKitWebView *webView,
350 WebKitWebFrame *frame,
351 WebKitNetworkRequest *request,
352 WebKitWebNavigationAction *navigation_action,
353 WebKitWebPolicyDecision *policy_decision,
354 gpointer user_data)
355{
356 struct xwidget *xw = g_object_get_data (G_OBJECT (webView), XG_XWIDGET);
357 store_xwidget_event_string (xw, "navigation-policy-decision-requested",
358 webkit_web_navigation_action_get_original_uri
359 (navigation_action));
360 return FALSE;
361}
362 331
363/* For gtk3 offscreen rendered widgets. */ 332/* For gtk3 offscreen rendered widgets. */
364static gboolean 333static gboolean
@@ -599,8 +568,13 @@ DEFUN ("xwidget-webkit-execute-script",
599{ 568{
600 WEBKIT_FN_INIT (); 569 WEBKIT_FN_INIT ();
601 CHECK_STRING (script); 570 CHECK_STRING (script);
602 webkit_web_view_execute_script (WEBKIT_WEB_VIEW (xw->widget_osr), 571 // TODO: provide callback function to do something with the return
603 SSDATA (script)); 572 // value! This allows us to get rid of the title hack.
573 webkit_web_view_run_javascript (WEBKIT_WEB_VIEW (xw->widget_osr),
574 SSDATA (script),
575 NULL, /*cancellable*/
576 NULL, /*callback*/
577 NULL /*user data*/);
604 return Qnil; 578 return Qnil;
605} 579}
606 580