1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-15 10:30:25 -08:00

Refactor browse-url handler selection into separate function.

* lisp/net/browse-url.el (browse-url-select-handler): New function.
(browse-url): Use it.
* lisp/dnd.el (dnd-handle-one-url): Use it.
This commit is contained in:
Tassilo Horn 2020-05-07 09:53:54 +02:00
parent 281b9e42a4
commit 3b5f728bff
2 changed files with 36 additions and 40 deletions

View file

@ -92,7 +92,6 @@ If no match is found here, `browse-url-handlers' and
If no match is found, just call `dnd-insert-text'. WINDOW is
where the drop happened, ACTION is the action for the drop, URL
is what has been dropped. Returns ACTION."
(require 'browse-url)
(let (ret)
(or
(catch 'done
@ -102,19 +101,11 @@ is what has been dropped. Returns ACTION."
(throw 'done t)))
nil)
(catch 'done
(defvar browse-url-handlers) ;; Not autoloaded.
(dolist (bf (append
;; The alist choice of browse-url-browser-function
;; is deprecated since 28.1, so the (unless ...)
;; can be removed at some point in time.
(unless (functionp browse-url-browser-function)
browse-url-browser-function)
browse-url-handlers
browse-url-default-handlers))
(when (string-match (car bf) url)
(setq ret 'private)
(funcall (cdr bf) url action)
(throw 'done t)))
(let ((browser (browse-url-select-handler url)))
(when browser
(setq ret 'private)
(funcall browser url action)
(throw 'done t)))
nil)
(progn
(dnd-insert-text window action url)

View file

@ -635,6 +635,32 @@ match, the URL is opened using the value of
:value-type (function :tag "Handler"))
:version "28.1")
;;;###autoload
(defun browse-url-select-handler (url)
"Return a handler suitable for browsing URL.
This searches `browse-url-handlers', and
`browse-url-default-handlers' for a matching handler. Return nil
if no handler is found.
Currently, it also consults `browse-url-browser-function' first
if it is set to an alist, although this usage is deprecated since
Emacs 28.1 and will be removed in a future release."
(catch 'custom-url-handler
(dolist (regex-handler
(append
;; The alist choice of browse-url-browser-function
;; is deprecated since 28.1, so the (unless ...)
;; can be removed at some point in time.
(when (and (consp browse-url-browser-function)
(not (functionp browse-url-browser-function)))
(warn "Having `browse-url-browser-function' set to an
alist is deprecated. Use `browse-url-handlers' instead.")
browse-url-browser-function)
browse-url-handlers
browse-url-default-handlers))
(when (string-match-p (car regex-handler) url)
(throw 'custom-url-handler (cdr regex-handler))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; URL encoding
@ -828,14 +854,8 @@ If ARGS are omitted, the default is to pass
(not (string-match "\\`[a-z]+:" url)))
(setq url (expand-file-name url)))
(let ((process-environment (copy-sequence process-environment))
(function
(catch 'custom-url-handler
(dolist (regex-handler (append browse-url-handlers
browse-url-default-handlers))
(when (string-match-p (car regex-handler) url)
(throw 'custom-url-handler (cdr regex-handler))))
;; No special handler found.
browse-url-browser-function))
(function (or (browse-url-select-handler url)
browse-url-browser-function))
;; Ensure that `default-directory' exists and is readable (bug#6077).
(default-directory (or (unhandled-file-name-directory default-directory)
(expand-file-name "~/"))))
@ -844,24 +864,9 @@ If ARGS are omitted, the default is to pass
;; which may not even exist any more.
(if (stringp (frame-parameter nil 'display))
(setenv "DISPLAY" (frame-parameter nil 'display)))
(if (and (consp function)
(not (functionp function)))
;; The `function' can be an alist; look down it for first
;; match and apply the function (which might be a lambda).
;; However, this usage is deprecated as of Emacs 28.1.
(progn
(warn "Having `browse-url-browser-function' set to an
alist is deprecated. Use `browse-url-handlers' instead.")
(catch 'done
(dolist (bf function)
(when (string-match (car bf) url)
(apply (cdr bf) url args)
(throw 'done t)))
(error "No browse-url-browser-function matching URL %s"
url)))
;; Unbound symbols go down this leg, since void-function from
;; apply is clearer than wrong-type-argument from dolist.
(apply function url args))))
(if (functionp nil)
(apply function url args)
(error "No suitable browser for URL %s" url))))
;;;###autoload
(defun browse-url-at-point (&optional arg)