diff options
| author | Ricardo Wurmus | 2016-10-25 23:00:35 -0700 |
|---|---|---|
| committer | Paul Eggert | 2016-10-25 23:07:13 -0700 |
| commit | d781662873f228b110a128f7a2b6583a4d5e0a3a (patch) | |
| tree | 4c35b387e57e4780c2276a6fe7b69a0ff36fc243 /src | |
| parent | 1ea669d6f0269784b3e69238fd2813f55340d53a (diff) | |
| download | emacs-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.c | 186 |
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 | ||
| 35 | static struct xwidget * | 32 | static struct xwidget * |
| 36 | allocate_xwidget (void) | 33 | allocate_xwidget (void) |
| @@ -50,34 +47,16 @@ allocate_xwidget_view (void) | |||
| 50 | 47 | ||
| 51 | static struct xwidget_view *xwidget_view_lookup (struct xwidget *, | 48 | static struct xwidget_view *xwidget_view_lookup (struct xwidget *, |
| 52 | struct window *); | 49 | struct window *); |
| 53 | static void webkit_document_load_finished_cb (WebKitWebView *, WebKitWebFrame *, | 50 | static void webkit_view_load_changed_cb (WebKitWebView *, |
| 54 | gpointer); | 51 | WebKitLoadEvent, |
| 55 | static gboolean webkit_download_cb (WebKitWebView *, WebKitDownload *, gpointer); | 52 | gpointer); |
| 53 | static gboolean webkit_download_cb (WebKitWebContext *, WebKitDownload *, gpointer); | ||
| 56 | 54 | ||
| 57 | static gboolean | 55 | static gboolean |
| 58 | webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *, | 56 | webkit_decide_policy_cb (WebKitWebView *, |
| 59 | WebKitWebFrame *, | 57 | WebKitPolicyDecision *, |
| 60 | WebKitNetworkRequest *, | 58 | WebKitPolicyDecisionType, |
| 61 | gchar *, | 59 | gpointer); |
| 62 | WebKitWebPolicyDecision *, | ||
| 63 | gpointer); | ||
| 64 | |||
| 65 | static gboolean | ||
| 66 | webkit_new_window_policy_decision_requested_cb (WebKitWebView *, | ||
| 67 | WebKitWebFrame *, | ||
| 68 | WebKitNetworkRequest *, | ||
| 69 | WebKitWebNavigationAction *, | ||
| 70 | WebKitWebPolicyDecision *, | ||
| 71 | gpointer); | ||
| 72 | |||
| 73 | static gboolean | ||
| 74 | webkit_navigation_policy_decision_requested_cb (WebKitWebView *, | ||
| 75 | WebKitWebFrame *, | ||
| 76 | WebKitNetworkRequest *, | ||
| 77 | WebKitWebNavigationAction *, | ||
| 78 | WebKitWebPolicyDecision *, | ||
| 79 | gpointer); | ||
| 80 | |||
| 81 | 60 | ||
| 82 | 61 | ||
| 83 | DEFUN ("make-xwidget", | 62 | DEFUN ("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. */ | ||
| 288 | void | 254 | void |
| 289 | webkit_document_load_finished_cb (WebKitWebView *webkitwebview, | 255 | webkit_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 | ||
| 299 | gboolean | 272 | gboolean |
| 300 | webkit_download_cb (WebKitWebView *webkitwebview, | 273 | webkit_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 | ||
| 311 | static gboolean | 287 | static gboolean |
| 312 | webkit_mime_type_policy_typedecision_requested_cb (WebKitWebView *webView, | 288 | webkit_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 | ||
| 331 | static gboolean | ||
| 332 | webkit_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 | |||
| 348 | static gboolean | ||
| 349 | webkit_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. */ |
| 364 | static gboolean | 333 | static 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 | ||