From e5fbd6f5bdb949a5cd61b81462e18c070cf01452 Mon Sep 17 00:00:00 2001 From: Jim Porter Date: Sun, 20 Jul 2025 13:11:32 -0700 Subject: [PATCH] Disable track-changes while reloading pages in EWW This makes sure 'eww--track-changes' doesn't interfere with the initial rendering process. Previously, this caused problems like consuming the rest of the page when reloading the document. * lisp/net/eww.el (eww--change-tracker-id): New variable. (eww-display-document): Temporarily unregister our change tracker. * test/lisp/net/eww-tests.el (eww-test/tag/textarea/reload): New test. (cherry picked from commit dc38f05757520f3cae61ae1b3c204728d8b1d6c7) --- lisp/net/eww.el | 15 +++++++++++---- test/lisp/net/eww-tests.el | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/lisp/net/eww.el b/lisp/net/eww.el index accd7eec5c3..aa70163c63c 100644 --- a/lisp/net/eww.el +++ b/lisp/net/eww.el @@ -354,6 +354,7 @@ by default." If zero, EWW is at the newest page, which isn't yet present in `eww-history'.") (defvar eww-prompt-history nil) +(defvar-local eww--change-tracker-id nil) (defvar eww-local-regex "localhost" "When this regex is found in the URL, it's not a keyword but an address.") @@ -805,6 +806,11 @@ This replaces the region with the preprocessed HTML." (link . eww-tag-link) (meta . eww-tag-meta) (a . eww-tag-a))))) + ;; Unregister any existing change tracker while we render the + ;; document. + (when eww--change-tracker-id + (track-changes-unregister eww--change-tracker-id) + (setq eww--change-tracker-id nil)) (erase-buffer) (with-delayed-message (2 "Rendering HTML...") (shr-insert-document document)) @@ -824,10 +830,11 @@ This replaces the region with the preprocessed HTML." (while (and (not (eobp)) (get-text-property (point) 'eww-form)) (forward-line 1))))) - ;; We used to enable this in `eww-mode', but it cause tracking - ;; of changes while we insert the document, whereas we only care about - ;; changes performed afterwards. - (track-changes-register #'eww--track-changes :nobefore t) + ;; We used to enable this in `eww-mode', but it cause tracking of + ;; changes while we insert the document, whereas we only care + ;; about changes performed afterwards. + (setq eww--change-tracker-id (track-changes-register + #'eww--track-changes :nobefore t)) (eww-size-text-inputs)))) (defun eww-display-html (charset url &optional document point buffer) diff --git a/test/lisp/net/eww-tests.el b/test/lisp/net/eww-tests.el index fc1d9bf9184..61a371bc339 100644 --- a/test/lisp/net/eww-tests.el +++ b/test/lisp/net/eww-tests.el @@ -106,6 +106,30 @@ temporary EWW buffer for our tests." (should (eq (get-text-property (point) 'face) 'eww-form-textarea))))) +(ert-deftest eww-test/tag/textarea/reload () + "Ensure that reloading a document with a " + "
this is the end
" + "")))) + (eww "example.invalid") + ;; Make sure that text after the