Backボタンと別ウィンドウの問題

MyFacesでブラウザのBackボタンを使うと、その後の第一アクションが動作しない。
たとえば、Page1.jspからPage2.jspにリンクで遷移してからBackボタンでPage1.jspに戻ると、再びリンクからPage2.jspにリンクで遷移しようとしてもPage1.jspが再表示されるだけである。このときもう一度Page2.jspにリンクで遷移した場合は成功する。
これは、Page2.jspにリンクで遷移した段階(のrestoreView)でPage1.jspコンポーネントツリーが削除されてしまっているからである。
これはBackボタンだけでなく別ウィンドウを表示するときも同様である。


これを回避するため、JSF-RIではviewId("/Page1.jsp"とか)をFIFOのキューに格納し、キューの中身が設定数を超えたときにはじめてセッションから当該viewIdのコンポーネントツリーを削除するようにしている。


……が、そのキューから遷移前のページが消える段階でやっぱりMyFacesと同じ現象が発生する。
結局、その設定数以上のBackボタンを許可しないということなので考えてみれば当然であるのだが、問題は別ウィンドウの場合である。
Backボタンの場合、(かなり横暴だが)「そんなにBackボタンを押すやつはフォローしないよ」と言うこともできる。
ただ、別ウィンドウの場合はシステムの都合で多用する場合が有り得る。


S2JSFではこの問題に対応するために「セッションにあるコンポーネントツリーは消さない」というスタンスを取っているようだが、画面の種類が多くてユーザの作業時間が長いようなアプリケーションではメモリの浪費という点で不安である。


で、思ったのが、「BackボタンはJSF-RI形式でサポートし、設定数を超えたBackはフォローしない」というのに加えて、「削除対象のviewIdが遷移前のviewIdと同じだったら削除しない」という方法。
少しいじってみた感じではうまく動作しそう。


JSF-RI方式だと削除対象のviewIdと同じものがキューに残っていたとしても直近のコンポーネントツリーを削除してしまうため、キューの中に同じものが残っていた場合は削除しないような処理も追加。
あと、JSF-RI方式だと条件によってはキューが設定数を超えたまま存在することがあるのをどうにかしたいなぁ。


ここに書いた内容を昨日の日記で挙げたMyFacesへの報告(MYFACES-164)に追加したいけれど、英語で正しく伝えられる自信がない。
どうしたもんだろねぇ。