emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: fine grained control of webkit browsing


From: Ricardo Wurmus
Subject: Re: fine grained control of webkit browsing
Date: Tue, 19 Jun 2018 18:19:07 +0200
User-agent: mu4e 1.0; emacs 26.1

Perry E. Metzger <address@hidden> writes:

> 2) Say one wants to do things like viewing something with javascript
> off and without loading remote elements (say because one wants to
> safely view some HTML email). What does one need to do to get this
> to work?

The widget is not fully integrated into Emacs.  The extent to which one
can conveniently communicate with the widget is by sending a string
containing a JavaScript program to the widget and have it return a
value.  Everything else requires exposing Webkit API features to Elisp.

Attached is an old patch that I never submitted that allows one to set
webkit settings via Elisp.  Unfortunately, disabling JavaScript for the
widget also disables JavaScript evaluation of strings that are sent from
Emacs – we use JavaScript for telling the widget to scroll, for example.
(See “xwidget-webkit-scroll-bottom” or “xwidget-webkit-show-element”.)

commit b1d2a1ad4a489838027e2f897f65190509a3c34f
Author: Ricardo Wurmus <address@hidden>
Date:   Sat Oct 29 19:08:54 2016 +0200

    webkit set settings

diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index a4214f054a..11dfc061f2 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -39,6 +39,8 @@
 (declare-function xwidget-buffer "xwidget.c" (xwidget))
 (declare-function xwidget-size-request "xwidget.c" (xwidget))
 (declare-function xwidget-resize "xwidget.c" (xwidget new-width new-height))
+(declare-function xwidget-webkit-set-settings "xwidget.c"
+                  (xwidget settings))
 (declare-function xwidget-webkit-execute-script "xwidget.c"
                   (xwidget script &optional callback))
 (declare-function xwidget-webkit-goto-uri "xwidget.c" (xwidget uri))
diff --git a/src/xwidget.c b/src/xwidget.c
index 4fa906a9f0..fd0ca3edf1 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -751,6 +751,84 @@ argument procedure FUN.*/)
   return Qnil;
 }
 
+DEFUN ("xwidget-webkit-set-settings",
+       Fxwidget_webkit_set_settings, Sxwidget_webkit_set_settings,
+       2, 2, 0,
+       doc: /* Set the settings of the Webkit XWIDGET view to the
+values specified in ALIST.*/)
+  (Lisp_Object xwidget, Lisp_Object alist)
+{
+  WEBKIT_FN_INIT ();
+  CHECK_LIST (alist);
+
+  WebKitSettings *settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW 
(xw->widget_osr));
+
+  for (int i = 0; CONSP (alist); alist = XCDR (alist))
+    {
+      Lisp_Object elt, key, val;
+
+      elt = XCAR (alist);
+      key = Fcar (elt);
+      CHECK_SYMBOL (key);
+      val = Fcdr (elt);
+
+      // TODO: use a macro instead?
+      if (EQ (key, Qwebkit_allow_file_access_from_file_urls))
+        webkit_settings_set_allow_file_access_from_file_urls (settings, !NILP 
(val));
+      else if (EQ (key, Qwebkit_allow_modal_dialogs))
+        webkit_settings_set_allow_modal_dialogs (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_allow_file_access_from_file_urls))
+        webkit_settings_set_allow_file_access_from_file_urls (settings, !NILP 
(val));
+      else if (EQ (key, Qwebkit_allow_modal_dialogs))
+        webkit_settings_set_allow_modal_dialogs (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_allow_universal_access_from_file_urls))
+        webkit_settings_set_allow_universal_access_from_file_urls (settings, 
!NILP (val));
+      else if (EQ (key, Qwebkit_auto_load_images))
+        webkit_settings_set_auto_load_images (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_draw_compositing_indicators))
+        webkit_settings_set_draw_compositing_indicators (settings, !NILP 
(val));
+      else if (EQ (key, Qwebkit_enable_accelerated_2d_canvas))
+        webkit_settings_set_enable_accelerated_2d_canvas (settings, !NILP 
(val));
+      else if (EQ (key, Qwebkit_enable_caret_browsing))
+        webkit_settings_set_enable_caret_browsing (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_developer_extras))
+        webkit_settings_set_enable_developer_extras (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_dns_prefetching))
+        webkit_settings_set_enable_dns_prefetching (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_frame_flattening))
+        webkit_settings_set_enable_frame_flattening (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_javascript))
+        webkit_settings_set_enable_javascript (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_private_browsing))
+        webkit_settings_set_enable_private_browsing (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_webaudio))
+        webkit_settings_set_enable_webaudio (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_webgl))
+        webkit_settings_set_enable_webgl (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_enable_write_console_messages_to_stdout))
+        webkit_settings_set_enable_write_console_messages_to_stdout (settings, 
!NILP (val));
+      else if (EQ (key, Qwebkit_enable_xss_auditor))
+        webkit_settings_set_enable_xss_auditor (settings, !NILP (val));
+      else if (EQ (key, Qwebkit_javascript_can_access_clipboard))
+        webkit_settings_set_javascript_can_access_clipboard (settings, !NILP 
(val));
+      else if (EQ (key, Qwebkit_javascript_can_open_windows_automatically))
+        webkit_settings_set_javascript_can_open_windows_automatically 
(settings, !NILP (val));
+      else if (EQ (key, Qwebkit_load_icons_ignoring_image_load_setting))
+        webkit_settings_set_load_icons_ignoring_image_load_setting (settings, 
!NILP (val));
+      else if (EQ (key, Qwebkit_media_playback_requires_user_gesture))
+        webkit_settings_set_media_playback_requires_user_gesture (settings, 
!NILP (val));
+      else if (EQ (key, Qwebkit_zoom_text_only))
+        webkit_settings_set_zoom_text_only (settings, !NILP (val));
+      else
+        signal_error ("Invalid webkit setting", key);
+      i++;
+    }
+
+  webkit_web_view_set_settings (WEBKIT_WEB_VIEW (xw->widget_osr), settings);
+  return Qnil;
+}
+
+
 DEFUN ("xwidget-resize", Fxwidget_resize, Sxwidget_resize, 3, 3, 0,
        doc: /* Resize XWIDGET.  NEW_WIDTH, NEW_HEIGHT define the new size.  */ 
)
   (Lisp_Object xwidget, Lisp_Object new_width, Lisp_Object new_height)
@@ -999,8 +1077,32 @@ syms_of_xwidget (void)
   defsubr (&Sxwidget_webkit_get_uri);
   defsubr (&Sxwidget_webkit_zoom);
   defsubr (&Sxwidget_webkit_execute_script);
+  defsubr (&Sxwidget_webkit_set_settings);
   DEFSYM (Qwebkit, "webkit");
 
+  /* Symbols used for Webkit view settings */
+  DEFSYM (Qwebkit_allow_file_access_from_file_urls, 
"webkit-allow-file-access-from-file-urls");
+  DEFSYM (Qwebkit_allow_modal_dialogs, "webkit-allow-modal-dialogs");
+  DEFSYM (Qwebkit_allow_universal_access_from_file_urls, 
"webkit-allow-universal-access-from-file-urls");
+  DEFSYM (Qwebkit_auto_load_images, "webkit-auto-load-images");
+  DEFSYM (Qwebkit_draw_compositing_indicators, 
"webkit-draw-compositing-indicators");
+  DEFSYM (Qwebkit_enable_accelerated_2d_canvas, 
"webkit-enable-accelerated-2d-canvas");
+  DEFSYM (Qwebkit_enable_caret_browsing, "webkit-enable-caret-browsing");
+  DEFSYM (Qwebkit_enable_developer_extras, "webkit-enable-developer-extras");
+  DEFSYM (Qwebkit_enable_dns_prefetching, "webkit-enable-dns-prefetching");
+  DEFSYM (Qwebkit_enable_frame_flattening, "webkit-enable-frame-flattening");
+  DEFSYM (Qwebkit_enable_javascript, "webkit-enable-javascript");
+  DEFSYM (Qwebkit_enable_private_browsing, "webkit-enable-private-browsing");
+  DEFSYM (Qwebkit_enable_webaudio, "webkit-enable-webaudio");
+  DEFSYM (Qwebkit_enable_webgl, "webkit-enable-webgl");
+  DEFSYM (Qwebkit_enable_write_console_messages_to_stdout, 
"webkit-enable-write-console-messages-to-stdout");
+  DEFSYM (Qwebkit_enable_xss_auditor, "webkit-enable-xss-auditor");
+  DEFSYM (Qwebkit_javascript_can_access_clipboard, 
"webkit-javascript-can-access-clipboard");
+  DEFSYM (Qwebkit_javascript_can_open_windows_automatically, 
"webkit-javascript-can-open-windows-automatically");
+  DEFSYM (Qwebkit_load_icons_ignoring_image_load_setting, 
"webkit-load-icons-ignoring-image-load-setting");
+  DEFSYM (Qwebkit_media_playback_requires_user_gesture, 
"webkit-media-playback-requires-user-gesture");
+  DEFSYM (Qwebkit_zoom_text_only, "webkit-zoom-text-only");
+
   defsubr (&Sxwidget_size_request);
   defsubr (&Sdelete_xwidget_view);
 
--
Ricardo

reply via email to

[Prev in Thread] Current Thread [Next in Thread]