emacs-diffs
[Top][All Lists]
Advanced

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

master c25321e: Add utility functions and new xwidget commands


From: Lars Ingebrigtsen
Subject: master c25321e: Add utility functions and new xwidget commands
Date: Wed, 12 Aug 2020 06:40:02 -0400 (EDT)

branch: master
commit c25321e44707253381c2ab92033e8d57ff00c746
Author: Sungbin Jo <pcr910303@icloud.com>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    Add utility functions and new xwidget commands
    
    Co-authored-by: Jaesup Kwak <veshboo@gmail.com>
    
    * lisp/xwidget.el (xwidget-webkit-callback): Add case for
    'response-callback' event.
    (xwidget-webkit-download-dir): New variable.
    (xwidget-webkit-save-as-file): New function.
    * src/nsxwidget.m (XwWebView::decidePolicyForNavigationResponse):
    Store download event.
    * src/xwidget.c src/xwidget.h (store_xwidget_download_callback_event):
    New function.
---
 etc/NEWS        |  3 +++
 lisp/xwidget.el | 32 ++++++++++++++++++++++++++++++++
 src/nsxwidget.m | 12 ++++++++++++
 src/xwidget.c   | 20 ++++++++++++++++++++
 src/xwidget.h   |  5 +++++
 5 files changed, 72 insertions(+)

diff --git a/etc/NEWS b/etc/NEWS
index cfe180f..b25e43b 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -986,6 +986,9 @@ If Emacs was built with xwidget support, you can access the 
embedded
 webkit browser with 'M-x xwidget-webkit-browse-url'.  Viewing two
 instances of xwidget webkit is not supported.
 
+*** Downloading files from xwidget-webkit is now supported.
+The new variable 'xwidget-webkit-download-dir' says where to download to.
+
 *** New functions for xwidget-webkit mode
 'xwidget-webkit-clone-and-split-below',
 'xwidget-webkit-clone-and-split-right'.
diff --git a/lisp/xwidget.el b/lisp/xwidget.el
index e38bd1b..0743208 100644
--- a/lisp/xwidget.el
+++ b/lisp/xwidget.el
@@ -288,6 +288,12 @@ XWIDGET instance, XWIDGET-EVENT-TYPE depends on the 
originating xwidget."
                    (xwidget-webkit-show-id-or-named-element
                     xwidget
                     (match-string 1 strarg)))))
+            ;; TODO: Response handling other than download.
+            ((eq xwidget-event-type 'download-callback)
+             (let ((url  (nth 3 last-input-event))
+                   (mime-type (nth 4 last-input-event))
+                   (file-name (nth 5 last-input-event)))
+               (xwidget-webkit-save-as-file url mime-type file-name)))
             ((eq xwidget-event-type 'javascript-callback)
              (let ((proc (nth 3 last-input-event))
                    (arg  (nth 4 last-input-event)))
@@ -308,6 +314,32 @@ If non-nil, plugins are enabled.  Otherwise, disabled."))
   ;; Keep track of [vh]scroll when switching buffers
   (image-mode-setup-winprops))
 
+;;; Download, save as file.
+
+(defcustom xwidget-webkit-download-dir "~/Downloads/"
+  "Directory where download file saved."
+  :version "27.1"
+  :type 'file)
+
+(defun xwidget-webkit-save-as-file (url mime-type file-name)
+  "For XWIDGET webkit, save URL of MIME-TYPE to location specified by user.
+FILE-NAME combined with `xwidget-webkit-download-dir' is the default file name
+of the prompt when reading.  When the file name the user specified is a
+directory, URL is saved at the specified directory as FILE-NAME."
+  (let ((save-name (read-file-name
+                    (format "Save URL `%s' of type `%s' in file/directory: "
+                            url mime-type)
+                    xwidget-webkit-download-dir
+                    (when file-name
+                      (expand-file-name
+                       file-name
+                       xwidget-webkit-download-dir)))))
+    (if (file-directory-p save-name)
+        (setq save-name
+              (expand-file-name (file-name-nondirectory file-name) save-name)))
+    (setq xwidget-webkit-download-dir (file-name-directory save-name))
+    (url-copy-file url save-name t)))
+
 ;;; Bookmarks integration
 
 (defcustom xwidget-webkit-bookmark-jump-new-session nil
diff --git a/src/nsxwidget.m b/src/nsxwidget.m
index 8643ba2..2277cc9 100644
--- a/src/nsxwidget.m
+++ b/src/nsxwidget.m
@@ -121,6 +121,18 @@ decisionHandler:(void 
(^)(WKNavigationActionPolicy))decisionHandler
 decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse
 decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
 {
+  if (!navigationResponse.canShowMIMEType)
+    {
+      NSString *url = navigationResponse.response.URL.absoluteString;
+      NSString *mimetype = navigationResponse.response.MIMEType;
+      NSString *filename = navigationResponse.response.suggestedFilename;
+      decisionHandler (WKNavigationResponsePolicyCancel);
+      store_xwidget_download_callback_event (self.xw,
+                                             url.UTF8String,
+                                             mimetype.UTF8String,
+                                             filename.UTF8String);
+      return;
+    }
   decisionHandler (WKNavigationResponsePolicyAllow);
 
   self.urlScriptBlocked[navigationResponse.response.URL] =
diff --git a/src/xwidget.c b/src/xwidget.c
index d5c229c..c61f5be 100644
--- a/src/xwidget.c
+++ b/src/xwidget.c
@@ -259,6 +259,26 @@ store_xwidget_event_string (struct xwidget *xw, const char 
*eventname,
 }
 
 void
+store_xwidget_download_callback_event (struct xwidget *xw,
+                                       const char *url,
+                                       const char *mimetype,
+                                       const char *filename)
+{
+  struct input_event event;
+  Lisp_Object xwl;
+  XSETXWIDGET (xwl, xw);
+  EVENT_INIT (event);
+  event.kind = XWIDGET_EVENT;
+  event.frame_or_window = Qnil;
+  event.arg = list5 (intern ("download-callback"),
+                     xwl,
+                     build_string (url),
+                     build_string (mimetype),
+                     build_string (filename));
+  kbd_buffer_store_event (&event);
+}
+
+void
 store_xwidget_js_callback_event (struct xwidget *xw,
                                  Lisp_Object proc,
                                  Lisp_Object argument)
diff --git a/src/xwidget.h b/src/xwidget.h
index 29f1153..40ad8ae 100644
--- a/src/xwidget.h
+++ b/src/xwidget.h
@@ -154,6 +154,11 @@ void store_xwidget_event_string (struct xwidget *xw,
                                  const char *eventname,
                                  const char *eventstr);
 
+void store_xwidget_download_callback_event (struct xwidget *xw,
+                                            const char *url,
+                                            const char *mimetype,
+                                            const char *filename);
+
 void store_xwidget_js_callback_event (struct xwidget *xw,
                                       Lisp_Object proc,
                                       Lisp_Object argument);



reply via email to

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