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

Re: form submitでのnew-session表示



>> On Fri, 24 Nov 2006 22:56:04 +0900
>> tsuyoshi_cho@xxxxxxxxx (Tsuyoshi CHO) said as follows:

>1. w3m-form-submitにoptional引数でnew-sessionを付ける
> ->NG、w3m-view-this-url内で (eval act) として召喚されるので、渡せない
> # 論議に上っているad-hocなパターンで解決できますが、さすがにどうかと
>   思ったので。

どうして,この解決法を NG と思われたのでしょうか?

コードとデータが区別されない,というのは lisp の面白い性質なので,これ
を使うのはごくごく自然な発想だと思ったのですが.以下のように,変更箇所
も最小で済むようですし.

(eval act) や (eval submit) する場所では常に,new-session という変数が
束縛されていないといけないのが,危険という判断でしょうか? でもまあ,そ
ういう箇所は,今のところ2箇所だけなので….

何か見落としているような気はするんですけど.

-- 
土屋 雅稔 ( TSUCHIYA Masatoshi )
--- w3m.el	8 Dec 2006 07:52:03 -0000	1.1232
+++ w3m.el	9 Dec 2006 01:48:36 -0000
@@ -5972,9 +5972,9 @@
   (mouse-set-point event)
   (w3m-view-this-url nil t))
 
-(defun w3m-submit-form ()
+(defun w3m-submit-form (&optional new-session)
   "Submit the form at point."
-  (interactive)
+  (interactive "P")
   (let ((submit (w3m-submit)))
     (if (and submit
 	     w3m-current-url
--- w3m-form.el	14 May 2006 12:42:47 -0000	1.155
+++ w3m-form.el	9 Dec 2006 01:48:47 -0000
@@ -557,7 +557,8 @@
 		     ,(format "fid=%s/type=%s/name=%s/id=%d" fid type name id)
 		     w3m-action (w3m-form-input-textarea ,form ,hseq)
 		     w3m-submit (w3m-form-submit ,form ,id ,name
-						 (w3m-form-get ,form ,id))
+						 (w3m-form-get ,form ,id)
+						 new-session)
 		     w3m-form-hseq ,hseq
 		     w3m-anchor-sequence ,abs-hseq
 		     w3m-form-id ,id
@@ -697,9 +698,11 @@
 		 start end
 		 `(w3m-form-field-id
 		   ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
-		   w3m-action (w3m-form-submit ,form ,id ,name ,value)
+		   w3m-action (w3m-form-submit ,form ,id ,name ,value
+					       new-session)
 		   w3m-submit (w3m-form-submit ,form ,id ,name
-					       (w3m-form-get ,form ,id))
+					       (w3m-form-get ,form ,id)
+					       new-session)
 		   w3m-anchor-sequence ,abs-hseq))))
 	     ((string= type "reset")
 	      (w3m-form-make-button
@@ -733,7 +736,8 @@
 		 ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
 		 w3m-action (w3m-form-input-textarea ,form ,hseq)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
-					     (w3m-form-get ,form ,id))
+					     (w3m-form-get ,form ,id)
+					     new-session)
 		 w3m-textarea-rows ,rows
 		 w3m-form-hseq ,hseq
 		 w3m-anchor-sequence ,abs-hseq
@@ -755,7 +759,8 @@
 		   ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
 		   w3m-action (w3m-form-input-select ,form ,id ,name)
 		   w3m-submit (w3m-form-submit ,form ,id ,name
-					       (w3m-form-get ,form ,id))
+					       (w3m-form-get ,form ,id)
+					       new-session)
 		   w3m-anchor-sequence ,abs-hseq))))
 	     ((string= type "password")
 	      (w3m-add-face-property start end 'w3m-form-face)
@@ -765,7 +770,8 @@
 		 ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
 		 w3m-action (w3m-form-input-password ,form ,id ,name)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
-					     (w3m-form-get ,form ,id))
+					     (w3m-form-get ,form ,id)
+					     new-session)
 		 w3m-anchor-sequence ,abs-hseq)))
 	     ((string= type "checkbox")
 	      (let ((cvalue (w3m-form-get form id)))
@@ -780,7 +786,8 @@
 		 ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
 		 w3m-action (w3m-form-input-checkbox ,form ,id ,name ,value)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
-					     (w3m-form-get ,form ,id))
+					     (w3m-form-get ,form ,id)
+					     new-session)
 		 w3m-anchor-sequence ,abs-hseq)))
 	     ((string= type "radio")
 	      ;; Radio button input, one name has one value
@@ -794,7 +801,8 @@
 		 w3m-action (w3m-form-input-radio ,form ,id ,name ,value)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
 					     (w3m-form-get-by-name
-					      ,form ,name))
+					      ,form ,name)
+					     new-session)
 		 w3m-anchor-sequence ,abs-hseq)))
 	     ((string= type "file")
 	      (w3m-add-face-property start end 'w3m-form-face)
@@ -804,7 +812,8 @@
 		 ,(format "fid=%d/type=%s/name=%s/id=%d" fid type name id)
 		 w3m-action (w3m-form-input-file ,form ,id ,name ,value)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
-					     (w3m-form-get ,form ,id))
+					     (w3m-form-get ,form ,id)
+					     new-session)
 		 w3m-anchor-sequence ,abs-hseq)))
 	     (t
 	      (w3m-form-put form
@@ -819,7 +828,8 @@
 		 w3m-action (w3m-form-input ,form ,id ,name ,type
 					    ,width ,maxlength ,value)
 		 w3m-submit (w3m-form-submit ,form ,id ,name
-					     (w3m-form-get ,form ,id))
+					     (w3m-form-get ,form ,id)
+					     new-session)
 		 w3m-anchor-sequence ,abs-hseq)))))))))
     ;; Process <internal> tag.
     (when (search-forward "<internal>" nil t)
@@ -1710,7 +1720,7 @@
 	  (setq files (cons file files))))
       files)))
 
-(defun w3m-form-submit (form &optional id name value)
+(defun w3m-form-submit (form &optional id name value new-session)
   (if (w3m-anchor (point))
       ;; cf SA17565
       (w3m-goto-url (w3m-anchor (point)))
@@ -1735,12 +1745,17 @@
 		 ;; we use the `post' method according to the proposal
 		 ;; of RFC2070.
 		 (eq 'multipart/form-data (w3m-form-enctype form)))
-	     (w3m-goto-url url 'reload nil
-			   (w3m-form-make-form-data form)
-			   w3m-current-url))
+	     (funcall (if new-session
+			  'w3m-goto-url-new-session
+			'w3m-goto-url)
+		      url 'reload nil
+		      (w3m-form-make-form-data form)
+		      w3m-current-url))
 	    ((eq 'get (w3m-form-method form))
-	     (w3m-goto-url
-	      (concat url "?" (w3m-form-make-form-data form))))
+	     (funcall (if new-session
+			  'w3m-goto-url-new-session
+			'w3m-goto-url)
+		      (concat url "?" (w3m-form-make-form-data form))))
 	    (t
 	     (w3m-message "This form's method has not been supported: %s"
 			  (let (print-level print-length)