Handle hidden form elements
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 10 Jun 2013 21:07:24 +0000 (23:07 +0200)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Mon, 10 Jun 2013 21:07:24 +0000 (23:07 +0200)
(eww-submit): Handle hidden elements.

* 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.

lisp/ChangeLog
lisp/eww.el
lisp/shr.el

index e6f4180..e90dfc9 100644 (file)
@@ -1,8 +1,13 @@
 2013-06-10  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+       * 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.
+
        * eww.el (eww-submit): Make form submission work.
        (eww-tag-input): Implement submit buttons.
        (eww-click-radio): Implement radio and checkboxes.
+       (eww-submit): Handle hidden elements.
 
        * shr.el (shr-descend): Allow other packages to override (or provide)
        rendering of elements.
index 5e893be..4fbe89c 100644 (file)
                  :checkbox-value (cdr (assq :value cont))
                  :eww-form eww-form
                  (cdr (assq :checked cont))))
+          ((equal type "hidden")
+           (list 'hidden
+                 :name (cdr (assq :name cont))
+                 :value (cdr (assq :value cont))))
           (t
            (list
             'editable-field
             :action 'eww-submit
             :name (cdr (assq :name cont))
             :eww-form eww-form)))))
-    (apply 'widget-create widget)
+    (if (eq (car widget) 'hidden)
+       (when shr-final-table-render
+         (nconc eww-form (list widget)))
+      (apply 'widget-create widget))
     (put-text-property start (point) 'eww-widget widget)))
 
 (defun eww-click-radio (widget &rest ignore)
        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) 'button)
+                      (getf (overlay-properties overlay) 'eww-hidden))))
        (when (eq (getf (cdr field) :eww-form) form)
          (let ((name (getf (cdr field) :name)))
            (when name
                (when (widget-value field)
                  (push (cons name (getf (cdr field) :checkbox-value))
                        values)))
+              ((eq (car field) 'eww-hidden)
+               (push (cons name (getf (cdr field) :value))
+                     values))
               (t
                (push (cons name (widget-value field))
                      values))))))))
-    (debug values)
+    (dolist (elem form)
+      (when (and (consp elem)
+                (eq (car elem) 'hidden))
+       (push (cons (getf (cdr elem) :name)
+                   (getf (cdr elem) :value))
+             values)))
     (let ((shr-base eww-current-url))
       (if (and (stringp (getf form :method))
               (equal (downcase (getf form :method)) "post"))
 
 (defun eww-fix-widget-keymap ()
   (dolist (overlay (overlays-in (point-min) (point-max)))
-    (when (or (getf (overlay-properties overlay) 'field)
-             (getf (overlay-properties overlay) 'button))
+    (when (getf (overlay-properties overlay) 'button)
       (overlay-put overlay 'local-map widget-keymap))))
 
 (provide 'eww)
index bf9f5a4..7a63675 100644 (file)
@@ -115,6 +115,7 @@ cid: URL as the argument.")
 (defvar shr-base nil)
 (defvar shr-ignore-cache nil)
 (defvar shr-external-rendering-functions nil)
+(defvar shr-final-table-render nil)
 
 (defvar shr-map
   (let ((map (make-sparse-keymap)))
@@ -1177,7 +1178,8 @@ ones, in case fg and bg are nil."
             (frame-width))
       (setq truncate-lines t))
     ;; Then render the table again with these new "hard" widths.
-    (shr-insert-table (shr-make-table cont sketch-widths t) sketch-widths))
+    (let ((shr-final-table-render t))
+      (shr-insert-table (shr-make-table cont sketch-widths t) sketch-widths)))
   ;; Finally, insert all the images after the table.  The Emacs buffer
   ;; model isn't strong enough to allow us to put the images actually
   ;; into the tables.