| « [userChrome.js] 軽量マウスジェスチャで利用可能なスクリプト集 | xul:scale » |
[userChrome.js] 軽量マウスジェスチャ(モーダルダイアログに関する不具合修正)
これまでは、例えば「alert(“OK”);」のようなモーダルダイアログ(閉じないと親のウィンドウの操作ができないタイプのダイアログ)の表示をジェスチャに割り当てると、ダイアログを閉じたあとにコンテキストメニューが出てしまうバグがあった。やむを得ず、「setTimeout(function(){ alert(“OK”); }, 0);」のように時間差で処理を実行させるという策を講じていたが、さきほどコンテキストメニューが出てしまう原因を調べてみた。
すると、モーダルダイアログを表示することで一見親ウィンドウの処理が一時停止しているかのように見えるが、なぜかダイアログ上でマウスを動かすとmousemoveイベントが発生し、 mouseup→contextmenu というイベント発生の順序が崩れて mouseup→mousemove→contextmenu になり、結果的に不具合が生じることがわかった。
そこで、以下のように微修正。スクリプト全体はこちらにあります。
変更前:
...
// [3] ジェスチャ終了~アクション実行
if (this._state == 1) {
this._state = this._directionChain ? 2 : 3;
// ジェスチャが認識されれば、この時点でthis._stateは2になる。
// _stopGestureメソッドが_performActionメソッドを呼び出し、
// 下記_stopGestureから呼ばれる_performActionメソッドの中でモーダルダイアログを表示すると…
this._stopGesture(event);
// ダイアログ上をマウスが通過した際に余計なmousemoveイベントが発生し、
// ここを通過するときにはthis._stateは0になってしまう。
}
...
変更後:
...
// [3] ジェスチャ終了~アクション実行
if (this._state == 1) {
var state = this._directionChain ? 2 : 3;
this._stopGesture(event);
this._state = state;
}
...
この修正に伴い、
// プライバシー情報の消去
setTimeout(function(){ document.getElementById("Tools:Sanitize").doCommand(); }, 0);
// オプション
setTimeout(function(){ openPreferences(); }, 0);
はそれぞれ以下のようにしてもOKになります。
// プライバシー情報の消去
document.getElementById("Tools:Sanitize").doCommand();
// オプション
openPreferences();
Gomitaさま、Any Gesture Sequenceパッチ版でも今回の修正を取り入れてみました(^^ゞ
時間差処理無しでcontextmenu が出てこない事を確認しました♪
いつもありがとうございますm(_ _)m