all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Jaesup Kwak <veshboo@gmail.com>
To: 29565@debbugs.gnu.org
Subject: bug#29565: [PATCH] Support xwidget webkit for macOS X
Date: Wed, 13 Dec 2017 20:27:09 +0900	[thread overview]
Message-ID: <CAADX8xJD0wCC3pv3N57DeJOHFj0riNJDiezVNgUDBWxwhh=GiA@mail.gmail.com> (raw)
In-Reply-To: <CAADX8xLDj_vWMhEHV0PhfucjuWm7OHXe8Cg2mjVnxZGE-z3O+w@mail.gmail.com>


[-- Attachment #1.1: Type: text/plain, Size: 519 bytes --]

These are path files for further development from the last post.

* 0001-Stop-audio-when-xwidget-webkit-killed-Bug-29565.patch

For example, this stop playing audio when you kill the xwidget webkit
buffer while watching a youtube.

* 0002-Functions-when-javascript-not-allowed-Bug-29565.patch

This patch support basic xwidget webkit functions even when javascript is
not allowed due to 'Content-Security-Policy' HTTP Response header.  And
enable web inspector, which is very valuable for javascript related
debugging.

[-- Attachment #1.2: Type: text/html, Size: 672 bytes --]

[-- Attachment #2: 0001-Stop-audio-when-xwidget-webkit-killed-Bug-29565.patch --]
[-- Type: application/octet-stream, Size: 950 bytes --]

From 8c114974e3e9b56694ce3e17070d1e281c5a1310 Mon Sep 17 00:00:00 2001
From: Jaesup Kwak <veshboo@gmail.com>
Date: Sun, 10 Dec 2017 16:24:29 +0900
Subject: [PATCH 1/2] Stop audio when xwidget-webkit killed (Bug#29565)

* src/nsxwidget.m
---
 src/nsxwidget.m | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/src/nsxwidget.m b/src/nsxwidget.m
index 04f1472c96..9a0d939c3d 100644
--- a/src/nsxwidget.m
+++ b/src/nsxwidget.m
@@ -395,6 +395,11 @@ - (BOOL)isFlipped { return YES; }
       [scriptor release];
       if (xw->xv)
         xw->xv->model = Qnil; /* Make sure related view stale.  */
+
+      /* This stops playing audio when a xwidget-webkit buffer is
+         killed.  I could not find other solution.  */
+      nsxwidget_webkit_goto_uri (xw, "about:blank");
+
       [xw->xwWidget removeFromSuperviewWithoutNeedingDisplay];
       [xw->xwWidget release];
       [xw->xwWindow removeFromSuperviewWithoutNeedingDisplay];
-- 
2.15.0


[-- Attachment #3: 0002-Functions-when-javascript-not-allowed-Bug-29565.patch --]
[-- Type: application/octet-stream, Size: 19474 bytes --]

From 8d7750f464c7c5097668875daed1376a1945094e Mon Sep 17 00:00:00 2001
From: Jaesup Kwak <veshboo@gmail.com>
Date: Wed, 13 Dec 2017 15:03:00 +0900
Subject: [PATCH 2/2] Functions when javascript not allowed (Bug#29565)

Support some basic xwidget webkit functions when javascript blocked by
'Content-Security-Policy'.  Replace some javascript calls with webkit
native functions and remove callbacks for the javascripts.

Refactor 'xwidget-webkit-current-url', no side effect of message or
kill-ring.  No more async, directly used in bookmarking, removing URL
text property.  Add new function 'xwidget-webkit-url-message-kill' for
old behavior.

Add new key map 'f' to new function 'xwidget-webkit-forward'.

Uniquely 'rename-buffer' with page title when the page is loaded.

Enable web inspector for ns xwidget webkit.

Change xwScript (ns xwidget webkit keyboard focus related script)
injection time to document start from document end.

* lisp/xwidget.el (xwidget-webkit-uri, xwidget-webkit-title)
(xwidget-webkit-goto-history): New webkit native functions.
(xwidget-webkit-cx2-cb, xwidget-webkit-cx3-cb)
(xwidget-webkit-url-title-cb, xwidget-webkit-current-url-cb): Remove
javascript callbacks.
(xwidget-webkit-callback): Replace javascript with webkit native.  No
URL text property.  Rename buffer unique.
(xwidget-webkit-back, xwidget-webkit-reload): Replace javascript with
webkit native.
(xwidget-webkit-mode-map, xwidget-webkit-forward): New function.
(xwidget-webkit-current-url, xwidget-webkit-current-url-message-kill)
(xwidget-webkit-cx2, xwidget-webkit-cx3)
(xwidget-webkit-bookmark-make-record): Replace javascript with webkit
native.  Refactor 'xwidget-webkit-current-url'.
* src/nsxwidget.h
* src/nsxwidget.m (nsxwidget_webkit_uri, nsxwidget_webkit_title)
(nsxwidget_webkit_goto_history): New webkit native functions.
(XwWebView::urlScriptBlocked, XwWebView::initWithFrame)
(XwWebView::decidePolicyForNavigationResponse, nsxwidget_kill): Add
property mapping URL to whether javascript allowed or not.  Enable web
inspector.  Change user script injection time.
(XwWebView::keyDown): Send keyDown event to emacs when javascript not
allowed or javascript execution error.
(nsxwidget_webkit_execute_script): Do not evaluate javascript when not
allowed.
* src/xwidget.c (Fxwidget_webkit_uri, Fxwiget_webkit_title)
(Fxwidget_webkit_goto_history, syms_of_xwidget): DEFUNs for new webkit
native functions and implementations for USE_GTK and NS_IMPLE_COCOA.
---
 lisp/xwidget.el | 102 ++++++++++++++++++++++----------------------------------
 src/nsxwidget.h |   3 ++
 src/nsxwidget.m |  79 +++++++++++++++++++++++++++++++++++++++++--
 src/xwidget.c   |  54 ++++++++++++++++++++++++++++++
 4 files changed, 172 insertions(+), 66 deletions(-)

diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index 03183c19d5..e5b3fb2ad9 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -39,9 +39,14 @@
 (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))
+;; @callback - Prefer defun to lambda, not to be garbage collected
+;; before its execution in `xwidget-webkit-callback'.
 (declare-function xwidget-webkit-execute-script "xwidget.c"
                   (xwidget script &optional callback))
+(declare-function xwidget-webkit-uri "xwidget.c" (xwidget))
+(declare-function xwidget-webkit-title "xwidget.c" (xwidget))
 (declare-function xwidget-webkit-goto-uri "xwidget.c" (xwidget uri))
+(declare-function xwidget-webkit-goto-history "xwidget.c" (xwidget rel-pos))
 (declare-function xwidget-webkit-zoom "xwidget.c" (xwidget factor))
 (declare-function xwidget-plist "xwidget.c" (xwidget))
 (declare-function set-xwidget-plist "xwidget.c" (xwidget plist))
@@ -97,37 +102,21 @@ xwidget-webkit-browse-url
         (xwidget-webkit-new-session url)
       (xwidget-webkit-goto-url url))))
 
-;; NOTE: @javascript-callback - prefer defun to lambda.
-;; Lambda seems to be more easily garbage collected in flight from
-;; `xwidget-webkit-execute-script' to its execution via event.
-
-;; @javascript-callback
-(defun xwidget-webkit-cx2-cb (url)
-  "New xwidget webkit session and buffer with URL in split window below."
-  (with-selected-window (split-window-below)
-    (xwidget-webkit-new-session url)))
-
-;; @javascript-callback
-(defun xwidget-webkit-cx3-cb (url)
-  "New xwidget webkit session and buffer with URL in split window right."
-  (with-selected-window (split-window-right)
-    (xwidget-webkit-new-session url)))
-
 (defun xwidget-webkit-cx2 ()
-  "Get the URL of current session, then `xwidget-webkit-cx2-cb'."
+  "Get the URL of current session, then browse to the URL \
+in `split-window-below' with a new xwidget webkit session."
   (interactive)
-  (xwidget-webkit-execute-script
-   (xwidget-webkit-current-session)
-   "document.URL"
-   'xwidget-webkit-cx2-cb))
+  (let ((url (xwidget-webkit-current-url)))
+    (with-selected-window (split-window-below)
+      (xwidget-webkit-new-session url))))
 
 (defun xwidget-webkit-cx3 ()
-  "Get the URL of current session, then `xwidget-webkit-cx3-cb'."
+  "Get the URL of current session, then browse to the URL \
+in `split-window-right' with a new xwidget webkit session."
   (interactive)
-  (xwidget-webkit-execute-script
-   (xwidget-webkit-current-session)
-   "document.URL"
-   'xwidget-webkit-cx3-cb))
+  (let ((url (xwidget-webkit-current-url)))
+    (with-selected-window (split-window-right)
+      (xwidget-webkit-new-session url))))
 
 ;;todo.
 ;; - check that the webkit support is compiled in
@@ -136,10 +125,11 @@ xwidget-webkit-mode-map
     (define-key map "g" 'xwidget-webkit-browse-url)
     (define-key map "a" 'xwidget-webkit-adjust-size-dispatch)
     (define-key map "b" 'xwidget-webkit-back)
+    (define-key map "f" 'xwidget-webkit-forward)
     (define-key map "r" 'xwidget-webkit-reload)
     (define-key map "t" (lambda () (interactive) (message "o"))) ;FIXME: ?!?
     (define-key map "\C-m" 'xwidget-webkit-insert-string)
-    (define-key map "w" 'xwidget-webkit-current-url)
+    (define-key map "w" 'xwidget-webkit-current-url-message-kill)
     (define-key map "+" 'xwidget-webkit-zoom-in)
     (define-key map "-" 'xwidget-webkit-zoom-out)
 
@@ -256,25 +246,13 @@ xwidget-webkit-callback
       (xwidget-log
        "error: callback called for xwidget with dead buffer")
     (with-current-buffer (xwidget-buffer xwidget)
-
-      ;; @javascript-callback
-      ;; We do not change selected window due to getting to knowing
-      ;; URL and title.  And also do not adjust webkit size to window
-      ;; here, the window can be the mini-buffer window unwantedly.
-      (defun xwidget-webkit-url-title-cb (url-title)
-        "Put URL as text property and change buffer name using TITLE."
-        (let ((url (car url-title))
-              (title (car (cdr url-title))))
-          (xwidget-log "webkit finished loading: '%s' from '%s'" title url)
-          (setq buffer-read-only nil)
-          (put-text-property 2 3 'URL url)
-          (setq buffer-read-only t)
-          (rename-buffer (format "*xwidget webkit: %s *" title))))
-
       (cond ((eq xwidget-event-type 'load-changed)
-             (xwidget-webkit-execute-script
-              xwidget "[document.URL, document.title]"
-              'xwidget-webkit-url-title-cb))
+;;; We do not change selected window for the finish of loading a page.
+;;; And do not adjust webkit size to window here, the selected window
+;;; can be the mini-buffer window unwantedly.
+             (let ((title (xwidget-webkit-title xwidget)))
+               (xwidget-log "webkit finished loading: %s" title)
+               (rename-buffer (format "*xwidget webkit: %s *" title) t)))
             ((eq xwidget-event-type 'decide-policy)
              (let ((strarg  (nth 3 last-input-event)))
                (if (string-match ".*#\\(.*\\)" strarg)
@@ -313,12 +291,10 @@ xwidget-webkit-bookmark-jump-new-session
 nil, consider further customization with
 `xwidget-webkit-last-session-buffer'.")
 
-;; We avoid using async `xwidget-webkit-current-url', instead use URL
-;; kept in xwidget webkit as property
 (defun xwidget-webkit-bookmark-make-record ()
   "Integrate Emacs bookmarks with the webkit xwidget."
   (nconc (bookmark-make-record-default t t)
-         `((filename . ,(get-text-property 2 'URL))
+         `((filename . ,(xwidget-webkit-current-url))
            (handler  . (lambda (bmk)
                          (browse-url
                           (bookmark-prop-get bmk 'filename)
@@ -656,27 +632,27 @@ xwidget-webkit-goto-url
 (defun xwidget-webkit-back ()
   "Go back in history."
   (interactive)
-  (xwidget-webkit-execute-script (xwidget-webkit-current-session)
-                                 "history.go(-1);"))
+  (xwidget-webkit-goto-history (xwidget-webkit-current-session) -1))
 
-(defun xwidget-webkit-reload ()
-  "Reload current url."
+(defun xwidget-webkit-forward ()
+  "Go forward in history."
   (interactive)
-  (xwidget-webkit-execute-script (xwidget-webkit-current-session)
-                                 "history.go(0);"))
+  (xwidget-webkit-goto-history (xwidget-webkit-current-session) 1))
 
-;; @javascript-callback
-(defun xwidget-webkit-current-url-cb (result)
-  "Callback for `xwidget-webkit-current-url', message and kill the RESULT."
-  (let ((url (kill-new (or result ""))))
-    (message "url: %s" url)))
+(defun xwidget-webkit-reload ()
+  "Reload current URL."
+  (interactive)
+  (xwidget-webkit-goto-history (xwidget-webkit-current-session) 0))
 
 (defun xwidget-webkit-current-url ()
-  "Get the webkit url and place it on the `kill-ring'."
+  "Get the current xwidget webkit URL."
   (interactive)
-  (xwidget-webkit-execute-script
-   (xwidget-webkit-current-session)
-   "document.URL" 'xwidget-webkit-current-url-cb))
+  (xwidget-webkit-uri (xwidget-webkit-current-session)))
+
+(defun xwidget-webkit-current-url-message-kill ()
+  "Message the current xwidget webkit URL and place it on the `kill-ring'."
+  (interactive)
+  (message "url: %s" (kill-new (or (xwidget-webkit-current-url) ""))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun xwidget-webkit-get-selection (proc)
diff --git a/src/nsxwidget.h b/src/nsxwidget.h
index a617a0d527..6af5fe5a4d 100644
--- a/src/nsxwidget.h
+++ b/src/nsxwidget.h
@@ -32,7 +32,10 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 /* Functions for xwidget webkit.  */
 
 bool nsxwidget_is_web_view (struct xwidget *xw);
+Lisp_Object nsxwidget_webkit_uri (struct xwidget *xw);
+Lisp_Object nsxwidget_webkit_title (struct xwidget *xw);
 void nsxwidget_webkit_goto_uri (struct xwidget *xw, const char *uri);
+void nsxwidget_webkit_goto_history (struct xwidget *xw, int rel_pos);
 void nsxwidget_webkit_zoom (struct xwidget *xw, double zoom_change);
 void nsxwidget_webkit_execute_script (struct xwidget *xw, const char *script,
                                       Lisp_Object fun);
diff --git a/src/nsxwidget.m b/src/nsxwidget.m
index 9a0d939c3d..65ca83da73 100644
--- a/src/nsxwidget.m
+++ b/src/nsxwidget.m
@@ -61,6 +61,9 @@ void store_xwidget_js_callback_event (struct xwidget *xw,
 @interface XwWebView : WKWebView
 <WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler>
 @property struct xwidget *xw;
+/* Map url to whether javascript is blocked by
+   'Content-Security-Policy' sandbox without allow-scripts.  */
+@property(retain) NSMutableDictionary *urlScriptBlocked;
 @end
 @implementation XwWebView : WKWebView
 
@@ -72,10 +75,15 @@ - (id)initWithFrame:(CGRect)frame
   WKUserContentController *scriptor = [[WKUserContentController alloc] init];
   configuration.userContentController = scriptor;
 
+  /* Enable inspect element context menu item for debugging.  */
+  [configuration.preferences setValue:@YES
+                               forKey:@"developerExtrasEnabled"];
+
   self = [super initWithFrame:frame configuration:configuration];
   if (self)
     {
       self.xw = xw;
+      self.urlScriptBlocked = [[NSMutableDictionary alloc] init];
       self.navigationDelegate = self;
       self.UIDelegate = self;
       self.customUserAgent =
@@ -86,7 +94,7 @@ - (id)initWithFrame:(CGRect)frame
       [scriptor addUserScript:[[WKUserScript alloc]
                                 initWithSource:xwScript
                                  injectionTime:
-                                  WKUserScriptInjectionTimeAtDocumentEnd
+                                  WKUserScriptInjectionTimeAtDocumentStart
                                 forMainFrameOnly:NO]];
     }
   return self;
@@ -131,6 +139,28 @@ - (void)webView:(WKWebView *)webView
       /* TODO: download using NSURLxxx?  */
     }
   decisionHandler (WKNavigationResponsePolicyAllow);
+
+  self.urlScriptBlocked[navigationResponse.response.URL] =
+    [NSNumber numberWithBool:NO];
+  if ([navigationResponse.response isKindOfClass:[NSHTTPURLResponse class]])
+    {
+      NSDictionary *headers =
+        ((NSHTTPURLResponse *) navigationResponse.response).allHeaderFields;
+      NSString *value = headers[@"Content-Security-Policy"];
+      if (value)
+        {
+          /* TODO: Sloppy parsing of 'Content-Security-Policy' value.  */
+          NSRange sandbox = [value rangeOfString:@"sandbox"];
+          if (sandbox.location != NSNotFound)
+            {
+              NSRange allowScripts = [value rangeOfString:@"allow-scripts"];
+              if (allowScripts.location == NSNotFound
+                  || allowScripts.location < sandbox.location)
+                self.urlScriptBlocked[navigationResponse.response.URL] =
+                  [NSNumber numberWithBool:YES];
+            }
+        }
+    }
 }
 
 /* No additional new webview or emacs window will be created
@@ -178,10 +208,20 @@ - (void)keyDown:(NSEvent *)event
       return;
     }
 
+  /* Emacs handles keyboard events when javascript is blocked.  */
+  if ([self.urlScriptBlocked[self.URL] boolValue])
+    {
+      [self.xw->xv->emacswindow keyDown:event];
+      return;
+    }
+
   [self evaluateJavaScript:@"xwHasFocus()"
          completionHandler:^(id result, NSError *error) {
       if (error)
-        NSLog (@"xwHasFocus: %@", error.localizedDescription);
+        {
+          NSLog (@"xwHasFocus: %@", error);
+          [self.xw->xv->emacswindow keyDown:event];
+        }
       else if (result)
         {
           NSNumber *hasFocus = result; /* __NSCFBoolean */
@@ -242,6 +282,8 @@ - (void)userContentController:(WKUserContentController *)userContentController
 
 /* Xwidget webkit commands.  */
 
+static Lisp_Object build_string_with_nsstr (NSString *nsstr);
+
 bool
 nsxwidget_is_web_view (struct xwidget *xw)
 {
@@ -249,6 +291,20 @@ - (void)userContentController:(WKUserContentController *)userContentController
     [xw->xwWidget isKindOfClass:WKWebView.class];
 }
 
+Lisp_Object
+nsxwidget_webkit_uri (struct xwidget *xw)
+{
+  XwWebView *xwWebView = (XwWebView *) xw->xwWidget;
+  return build_string_with_nsstr (xwWebView.URL.absoluteString);
+}
+
+Lisp_Object
+nsxwidget_webkit_title (struct xwidget *xw)
+{
+  XwWebView *xwWebView = (XwWebView *) xw->xwWidget;
+  return build_string_with_nsstr (xwWebView.title);
+}
+
 /* @Note ATS - Need application transport security in 'Info.plist' or
    remote pages will not loaded.  */
 void
@@ -261,6 +317,17 @@ - (void)userContentController:(WKUserContentController *)userContentController
   [xwWebView loadRequest:urlRequest];
 }
 
+void
+nsxwidget_webkit_goto_history (struct xwidget *xw, int rel_pos)
+{
+  XwWebView *xwWebView = (XwWebView *) xw->xwWidget;
+  switch (rel_pos) {
+  case -1: [xwWebView goBack]; break;
+  case 0: [xwWebView reload]; break;
+  case 1: [xwWebView goForward]; break;
+  }
+}
+
 void
 nsxwidget_webkit_zoom (struct xwidget *xw, double zoom_change)
 {
@@ -340,9 +407,14 @@ - (void)userContentController:(WKUserContentController *)userContentController
 nsxwidget_webkit_execute_script (struct xwidget *xw, const char *script,
                                  Lisp_Object fun)
 {
-  NSString *javascriptString = [NSString stringWithUTF8String:script];
   XwWebView *xwWebView = (XwWebView *) xw->xwWidget;
+  if ([xwWebView.urlScriptBlocked[xwWebView.URL] boolValue])
+    {
+      message ("Javascript is blocked by 'CSP: sandbox'.");
+      return;
+    }
 
+  NSString *javascriptString = [NSString stringWithUTF8String:script];
   [xwWebView evaluateJavaScript:javascriptString
               completionHandler:^(id result, NSError *error) {
       if (error)
@@ -400,6 +472,7 @@ - (BOOL)isFlipped { return YES; }
          killed.  I could not find other solution.  */
       nsxwidget_webkit_goto_uri (xw, "about:blank");
 
+      [((XwWebView *) xw->xwWidget).urlScriptBlocked release];
       [xw->xwWidget removeFromSuperviewWithoutNeedingDisplay];
       [xw->xwWidget release];
       [xw->xwWindow removeFromSuperviewWithoutNeedingDisplay];
diff --git a/src/xwidget.c b/src/xwidget.c
index 17e1e6428a..f333b2287c 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -753,6 +753,36 @@ xwidget_is_web_view (struct xwidget *xw)
       return Qnil;							\
     }
 
+DEFUN ("xwidget-webkit-uri",
+       Fxwidget_webkit_uri, Sxwidget_webkit_uri,
+       1, 1, 0,
+       doc: /* Get the current URL of XWIDGET webkit.  */)
+  (Lisp_Object xwidget)
+{
+  WEBKIT_FN_INIT ();
+#if defined (USE_GTK)
+  WebKitWebView *wkwv = WEBKIT_WEB_VIEW (xw->widget_osr);
+  return build_string (webkit_web_view_get_uri (wkwv));
+#elif defined (NS_IMPL_COCOA)
+  return nsxwidget_webkit_uri (xw);
+#endif
+}
+
+DEFUN ("xwidget-webkit-title",
+       Fxwidget_webkit_title, Sxwidget_webkit_title,
+       1, 1, 0,
+       doc: /* Get the current title of XWIDGET webkit.  */)
+  (Lisp_Object xwidget)
+{
+  WEBKIT_FN_INIT ();
+#if defined (USE_GTK)
+  WebKitWebView *wkwv = WEBKIT_WEB_VIEW (xw->widget_osr);
+  return build_string (webkit_web_view_get_title (wkwv));
+#elif defined (NS_IMPL_COCOA)
+  return nsxwidget_webkit_title (xw);
+#endif
+}
+
 DEFUN ("xwidget-webkit-goto-uri",
        Fxwidget_webkit_goto_uri, Sxwidget_webkit_goto_uri,
        2, 2, 0,
@@ -769,6 +799,27 @@ DEFUN ("xwidget-webkit-goto-uri",
   return Qnil;
 }
 
+DEFUN ("xwidget-webkit-goto-history",
+       Fxwidget_webkit_goto_history, Sxwidget_webkit_goto_history,
+       2, 2, 0,
+       doc: /* Make the XWIDGET webkit load REL-POS (-1, 0, 1) page in browse history.  */)
+  (Lisp_Object xwidget, Lisp_Object rel_pos)
+{
+  WEBKIT_FN_INIT ();
+  CHECK_RANGED_INTEGER (rel_pos, -1, 1); /* -1, 0, 1 */
+#if defined (USE_GTK)
+  WebKitWebView *wkwv = WEBKIT_WEB_VIEW (xw->widget_osr);
+  switch (XFASTINT (rel_pos)) {
+  case -1: webkit_web_view_go_back (wkwv); break;
+  case 0: webkit_web_view_go_reload (wkwv); break;
+  case 1: webkit_web_view_forward (wkwv); break;
+  }
+#elif defined (NS_IMPL_COCOA)
+  nsxwidget_webkit_goto_history (xw, XFASTINT (rel_pos));
+#endif
+  return Qnil;
+}
+
 DEFUN ("xwidget-webkit-zoom",
        Fxwidget_webkit_zoom, Sxwidget_webkit_zoom,
        2, 2, 0,
@@ -1092,7 +1143,10 @@ syms_of_xwidget (void)
   defsubr (&Sxwidget_query_on_exit_flag);
   defsubr (&Sset_xwidget_query_on_exit_flag);
 
+  defsubr (&Sxwidget_webkit_uri);
+  defsubr (&Sxwidget_webkit_title);
   defsubr (&Sxwidget_webkit_goto_uri);
+  defsubr (&Sxwidget_webkit_goto_history);
   defsubr (&Sxwidget_webkit_zoom);
   defsubr (&Sxwidget_webkit_execute_script);
   DEFSYM (Qwebkit, "webkit");
-- 
2.15.0


  parent reply	other threads:[~2017-12-13 11:27 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-04 16:44 bug#29565: [PATCH] Support xwidget webkit for macOS X Jaesup Kwak
2017-12-04 20:59 ` Alan Third
2017-12-05  6:01   ` Jaesup Kwak
2017-12-05  7:55     ` Jaesup Kwak
2017-12-05 20:00       ` Alan Third
2017-12-06  5:59         ` Jaesup Kwak
2017-12-06  6:20           ` Jaesup Kwak
2017-12-13 11:15 ` Jaesup Kwak
2017-12-13 11:27 ` Jaesup Kwak [this message]
2017-12-13 16:13 ` Jaesup Kwak
2017-12-15  2:01 ` Jaesup Kwak
2017-12-15  2:27 ` Jaesup Kwak
2017-12-15 16:06 ` Jaesup Kwak
2017-12-20  2:39 ` bug#29565: [PATCH] Fix compile failure for GTK xwidget (Bug#29565) Jaesup Kwak
2017-12-20  8:25 ` bug#29565: [PATCH] Enable plugins for ns xwidget webkit (Bug#29565) Jaesup Kwak
2017-12-21  4:12 ` bug#29565: [PATCH] Support file download and upload (Bug#29565) Jaesup Kwak
2018-03-30 11:48 ` bug#29565: [PATCH] Support xwidget webkit for macOS X Alan Third
2018-03-30 12:19   ` Jaesup Kwak
2019-09-28 23:52 ` Stefan Kangas
2020-08-10 13:55   ` Lars Ingebrigtsen
2020-08-10 19:06     ` Alan Third
2020-08-11 11:04       ` Lars Ingebrigtsen
2020-08-11 15:22         ` Eli Zaretskii
2020-08-11 16:26           ` Lars Ingebrigtsen
2020-08-11 18:28             ` Eli Zaretskii
2020-08-11 19:26               ` Lars Ingebrigtsen
2020-08-11 19:33                 ` Eli Zaretskii
2020-08-12 10:44                   ` Lars Ingebrigtsen
2020-08-11 19:56             ` Alan Third
2020-08-11 19:58               ` Lars Ingebrigtsen
2020-08-11 20:18                 ` Alan Third
2020-08-11 20:29                   ` Lars Ingebrigtsen
2020-08-11 20:35                     ` Alan Third
2020-08-11 20:50                     ` Lars Ingebrigtsen
2020-08-12  3:46                       ` Unknown
2020-08-12 10:05                         ` Lars Ingebrigtsen
2020-08-12 16:34                           ` Alan Third
2020-08-12  2:26       ` Richard Stallman
2020-08-12  4:13         ` Eli Zaretskii
2020-08-12  4:27           ` Eli Zaretskii
2020-08-13  3:43           ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAADX8xJD0wCC3pv3N57DeJOHFj0riNJDiezVNgUDBWxwhh=GiA@mail.gmail.com' \
    --to=veshboo@gmail.com \
    --cc=29565@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.