bug-gnu-emacs
[Top][All Lists]
Advanced

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

bug#28907: 26.0.90; [eww] some problems in input/textarea


From: Katsumi Yamaoka
Subject: bug#28907: 26.0.90; [eww] some problems in input/textarea
Date: Fri, 20 Oct 2017 17:39:29 +0900
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.0.90 (i686-pc-cygwin)

Hi,

There are some problems with an input form and a textarea as
follows:

・Can't enter text at the beginnig of input/textarea if there is
  a link just above the form.
・Can't enter space at (1- eol).
・Can't kill a line.
・Can't undo.
・Can't retrieve the response for the submit in a certain site.
・Padding width gets incorrect if there is a wide character.
・A major mode command like `g' doesn't work at the right outside
  of textarea.

I tested and tried to improve them in mainly:
<https://www.excite.co.jp/world/english/>    [1]
A patch is below.  Some of them would have to be improved further,
though.

Thanks.

[1] This is an English-Japanese translation service; you can
find the textarea slot for entering an original English text at
the line 191 in an eww buffer.  Please note that the translation
is not so accurate. ;-)

P.S. I will be absent from the net till Thursday, sorry.

In GNU Emacs 26.0.90 (build 1, i686-pc-cygwin, GTK+ Version 3.18.9)
 of 2017-10-20 built on localhost
Windowing system distributor 'The Cygwin/X Project', version 11.0.11900000

* lisp/net/eww.el (eww, eww-reload): Disable undo.
(eww-render): Enable undo when a user enters things in input/textarea.
(eww-tag-a): Make keymap prop non-sticky.
(eww-kill-line): New command.
(eww-textarea-map): Use it.
(eww-process-text-input): Enable a user to enter space at (1- eol);
don't break the form when killing a line at the beginning of the form.
(eww-tag-textarea): Treat textarea's text as its value if it is null;
work the padding correctly when there is a wide character;
make keymap prop non-sticky.

--- eww.el~     2017-09-14 22:06:50.000000000 +0000
+++ eww.el      2017-10-20 08:36:56.427163000 +0000
@@ -256,6 +256,7 @@
    (if (eq major-mode 'eww-mode)
        (current-buffer)
      (get-buffer-create "*eww*")))
+  (buffer-disable-undo)
   (eww-setup-buffer)
   ;; Check whether the domain only uses "Highly Restricted" Unicode
   ;; IDNA characters.  If not, transform to punycode to indicate that
@@ -397,7 +398,10 @@
            (setq eww-history-position 0)
            (and last-coding-system-used
                 (set-buffer-file-coding-system last-coding-system-used))
-           (run-hooks 'eww-after-render-hook)))
+           (run-hooks 'eww-after-render-hook)
+           (add-hook 'before-change-functions
+                     (lambda (&rest _args) (buffer-enable-undo))
+                     nil t)))
       (kill-buffer data-buffer))))
 
 (defun eww-parse-headers ()
@@ -546,7 +550,8 @@
   (eww-handle-link dom)
   (let ((start (point)))
     (shr-tag-a dom)
-    (put-text-property start (point) 'keymap eww-link-keymap)))
+    (add-text-properties start (point) (list 'keymap eww-link-keymap
+                                            'rear-nonsticky t))))
 
 (defun eww-update-header-line-format ()
   (setq header-line-format
@@ -916,6 +921,7 @@
 a prefix argument), don't reload the page from the network, but
 just re-display the HTML already fetched."
   (interactive "P")
+  (buffer-disable-undo)
   (let ((url (plist-get eww-data :url)))
     (if local
        (if (null (plist-get eww-data :dom))
@@ -966,6 +972,7 @@
     (define-key map [(control c) (control c)] 'eww-submit)
     (define-key map [?\t] 'shr-next-link)
     (define-key map [?\M-\t] 'shr-previous-link)
+    (define-key map "\C-k" 'eww-kill-line)
     map))
 
 (defvar eww-select-map
@@ -990,6 +997,13 @@
     (when (> (point) start)
       (forward-char 1))))
 
+;; FIXME: make it usable for `eww-text-map'.
+(defun eww-kill-line (&optional _arg)
+  "Kill the rest of the current line."
+  (interactive "P")
+  (let ((inhibit-read-only t))
+    (kill-region (point) (line-end-position))))
+
 (defun eww-beginning-of-field ()
   (cond
    ((bobp)
@@ -1134,6 +1148,8 @@
                 (1- (line-end-position))
               (eww-end-of-field)))
            (while (and (> length 0)
+                       ;; Don't delete space a user enters at (1- eol).
+                       (< end (point))
                        (eql (char-after (1- (point))) ? ))
              (delete-region (1- (point)) (point))
              (cl-decf length))))
@@ -1141,10 +1157,11 @@
          ;; Add padding.
          (save-excursion
            (goto-char end)
-           (goto-char
-            (if (equal type "textarea")
-                (1- (line-end-position))
-              (1+ (eww-end-of-field))))
+           (if (equal type "textarea")
+               ;; Don't move point if the line is empty.
+               (unless (and (bolp) (eolp))
+                 (goto-char (1- (line-end-position))))
+             (goto-char (1+ (eww-end-of-field))))
            (let ((start (point)))
               (insert (make-string (abs length) ? ))
              (set-text-properties start (point) properties))
@@ -1166,13 +1183,14 @@
                'display (make-string (length value) ?*)))))))))
 
 (defun eww-tag-textarea (dom)
-  (let ((start (point))
-       (value (or (dom-attr dom 'value) ""))
+  (let ((value (or (dom-attr dom 'value) (dom-text dom)))
        (lines (string-to-number (or (dom-attr dom 'rows) "10")))
        (width (string-to-number (or (dom-attr dom 'cols) "10")))
-       end)
+       start end)
     (shr-ensure-newline)
-    (insert value)
+    (setq start (point))
+    (let ((fill-column width))
+      (fill-region start (progn (insert value) (point))))
     (shr-ensure-newline)
     (when (< (count-lines start (point)) lines)
       (dotimes (_ (- lines (count-lines start (point))))
@@ -1181,14 +1199,16 @@
     (goto-char start)
     (while (< (point) end)
       (end-of-line)
-      (let ((pad (- width (- (point) (line-beginning-position)))))
+      (let ((pad (- width (current-column)))) ;; There may be a wide character.
        (when (> pad 0)
          (insert (make-string pad ? ))))
       (add-face-text-property (line-beginning-position)
                              (point) 'eww-form-textarea)
-      (put-text-property (line-beginning-position) (point) 'inhibit-read-only 
t)
-      (put-text-property (line-beginning-position) (point)
-                        'local-map eww-textarea-map)
+      (add-text-properties (line-beginning-position) (point)
+                          `(inhibit-read-only t
+                            local-map ,eww-textarea-map
+                            ;; Enable the major mode keymap on newlines.
+                            rear-nonsticky t))
       (forward-line 1))
     (put-text-property start (point) 'eww-form
                       (list :eww-form eww-form

reply via email to

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