* eww.el (eww-submit): Get submit button logic right.
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 10 Jun 2013 21:36:05 +0000 (23:36 +0200)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 10 Jun 2013 21:36:05 +0000 (23:36 +0200)
lisp/ChangeLog
lisp/eww.el

index e90dfc9..3f0250e 100644 (file)
@@ -1,5 +1,7 @@
 2013-06-10  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+       * eww.el (eww-submit): Get submit button logic right.
+
        * shr.el (shr-final-table-render): New variable to signal when we're
        doing the final table rendering so that we can collect more data at
        that point.
index 4fbe89c..1a07224 100644 (file)
     (put-text-property start (point) 'eww-widget widget)))
 
 (defun eww-click-radio (widget &rest ignore)
-  (let ((form (getf (cdr widget) :eww-form))
-       (name (getf (cdr widget) :name)))
+  (let ((form (plist-get (cdr widget) :eww-form))
+       (name (plist-get (cdr widget) :name)))
     (if (widget-value widget)
        ;; Switch all the other radio buttons off.
        (dolist (overlay (overlays-in (point-min) (point-max)))
-         (let ((field (getf (overlay-properties overlay) 'button)))
-           (when (and (eq (getf (cdr field) :eww-form) form)
-                      (equal name (getf (cdr field) :name)))
+         (let ((field (plist-get (overlay-properties overlay) 'button)))
+           (when (and (eq (plist-get (cdr field) :eww-form) form)
+                      (equal name (plist-get (cdr field) :name)))
              (unless (eq field widget)
                (widget-value-set field nil)))))
       (widget-value-set widget t))
     (eww-fix-widget-keymap)))
 
 (defun eww-submit (widget &rest ignore)
-  (let ((form (getf (cdr widget) :eww-form))
+  (let ((form (plist-get (cdr widget) :eww-form))
+       (first-button t)
        values)
-    (dolist (overlay (overlays-in (point-min) (point-max)))
-      (let ((field (or (getf (overlay-properties overlay) 'field)
-                      (getf (overlay-properties overlay) 'button)
-                      (getf (overlay-properties overlay) 'eww-hidden))))
-       (when (eq (getf (cdr field) :eww-form) form)
-         (let ((name (getf (cdr field) :name)))
+    (dolist (overlay (sort (overlays-in (point-min) (point-max))
+                          (lambda (o1 o2)
+                            (< (overlay-start o1) (overlay-start o2)))))
+      (let ((field (or (plist-get (overlay-properties overlay) 'field)
+                      (plist-get (overlay-properties overlay) 'button)
+                      (plist-get (overlay-properties overlay) 'eww-hidden))))
+       (when (eq (plist-get (cdr field) :eww-form) form)
+         (let ((name (plist-get (cdr field) :name)))
            (when name
              (cond
               ((eq (car field) 'checkbox)
                (when (widget-value field)
-                 (push (cons name (getf (cdr field) :checkbox-value))
+                 (push (cons name (plist-get (cdr field) :checkbox-value))
                        values)))
               ((eq (car field) 'eww-hidden)
-               (push (cons name (getf (cdr field) :value))
+               (push (cons name (plist-get (cdr field) :value))
                      values))
+              ((eq (car field) 'push-button)
+               ;; We want the values from buttons if we hit a button,
+               ;; or we're submitting something and this is the first
+               ;; button displayed.
+               (when (or (and (eq (car widget) 'push-button)
+                              (eq widget field))
+                         (and (not (eq (car widget) 'push-button))
+                              (eq (car field) 'push-button)
+                              first-button))
+                 (setq first-button nil)
+                 (push (cons name (widget-value field))
+                       values)))
               (t
                (push (cons name (widget-value field))
                      values))))))))
     (dolist (elem form)
       (when (and (consp elem)
                 (eq (car elem) 'hidden))
-       (push (cons (getf (cdr elem) :name)
-                   (getf (cdr elem) :value))
+       (push (cons (plist-get (cdr elem) :name)
+                   (plist-get (cdr elem) :value))
              values)))
     (let ((shr-base eww-current-url))
-      (if (and (stringp (getf form :method))
-              (equal (downcase (getf form :method)) "post"))
+      (if (and (stringp (plist-get form :method))
+              (equal (downcase (plist-get form :method)) "post"))
          (let ((url-request-method "POST")
                (url-request-data (mm-url-encode-www-form-urlencoded values)))
-           (eww-browse-url (shr-expand-url (getf form :action))))
+           (eww-browse-url (shr-expand-url (plist-get form :action))))
        (eww-browse-url
         (shr-expand-url
          (concat
-          (getf form :action)
+          (cdr (assq :action form))
           "?"
           (mm-url-encode-www-form-urlencoded values))))))))
 
     (while (setq start (next-single-property-change start 'eww-widget))
       (setq widget (get-text-property start 'eww-widget))
       (goto-char start)
-      (delete-region start (next-single-property-change start 'eww-widget))
+      (let ((end (next-single-property-change start 'eww-widget)))
+       (dolist (overlay (overlays-in start end))
+         (when (plist-get (overlay-properties overlay) 'button)
+           (delete-overlay overlay)))
+       (delete-region start end))
       (apply 'widget-create widget))
     (widget-setup)
     (eww-fix-widget-keymap)))
 
 (defun eww-fix-widget-keymap ()
   (dolist (overlay (overlays-in (point-min) (point-max)))
-    (when (getf (overlay-properties overlay) 'button)
+    (when (plist-get (overlay-properties overlay) 'button)
       (overlay-put overlay 'local-map widget-keymap))))
 
 (provide 'eww)