From 499abe197e6d245228be853731314e19148bb658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Mon=C3=ADa?= Date: Mon, 23 Sep 2024 11:40:18 -0400 Subject: [PATCH] Add option eww-use-doctype-fallback, code to detect if a page has a valid doctype tag, and use it as alternative to a content-type header --- lisp/net/eww.el | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lisp/net/eww.el b/lisp/net/eww.el index a651d9d5020..59a146c8392 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -170,6 +170,14 @@ the first item is the program, and the rest are the arguments." :type '(choice (const :tag "Never" nil) regexp)) +(defcustom eww-use-doctype-fallback t + "Accept a DOCTYPE tag as evidence that page content is HTML. +This is used only when the page does not have a valid Content-Type +header." + :version "30.1" + :group 'eww + :type 'boolean) + (defcustom eww-browse-url-new-window-is-tab 'tab-bar "Whether to open up new windows in a tab or a new buffer. If t, then open the URL in a new tab rather than a new buffer if @@ -630,6 +638,18 @@ Currently this means either text/html or application/xhtml+xml." (member content-type '("text/html" "application/xhtml+xml"))) +(defun eww--doctype-html-p (data-buffer) + "Return non-nil if DATA-BUFFER contains a doctype declaration." + ;; https://html.spec.whatwg.org/multipage/syntax.html#the-doctype + (let ((case-fold-search t) + (target + "\\|system +\\(\\\"\\|'\\)+about:legacy-compat\\)")) + (with-current-buffer data-buffer + (goto-char (point-min)) + ;; match basic and also legacy variants as + ;; specified in link above + (re-search-forward target nil t)))) + (defun eww--rename-buffer () "Rename the current EWW buffer. The renaming scheme is performed in accordance with @@ -695,7 +715,9 @@ The renaming scheme is performed in accordance with url)) (goto-char (point-min)) (eww-display-html (or encode charset) url nil point buffer)) - ((eww-html-p (car content-type)) + ((or (eww-html-p (car content-type)) + (and eww-use-doctype-fallback + (eww--doctype-html-p data-buffer))) (eww-display-html (or encode charset) url nil point buffer)) ((equal (car content-type) "application/pdf") (eww-display-pdf)) @@ -717,7 +739,7 @@ The renaming scheme is performed in accordance with (setq buffer-undo-list nil))) (kill-buffer data-buffer))) (unless (buffer-live-p buffer) - (kill-buffer data-buffer)))) + (kill-buffer data-buffer))) (defun eww-parse-headers () (let ((headers nil)) -- 2.45.2.windows.1