javascript window.closeに苦悩
エンジニアの先輩に「飲みに行きましょう」ってメールしたら
先輩:「飲みは無理だけどブログネタ持ってきたよ!」
って(笑)
で、何かと思ったらjavascriptのwindow.close()がfirefox3で動かないのだそうで
先輩:「なんとかならない?」
って事で調査してみた
そもそもfirefoxのポリシー?として
「スクリプトによって開いたウインドウ以外はスクリプトで閉じれない」のだそうで
もともとwindow.close()はwindow.open()で呼び出されたウィンドウでしか動作しませんよと
で、「何とかならんかなー」って思った偉い人がハックしたのがこれ
window.opener = window;
var w = window.open(location.href, "_self");
w.close();
これが何をしているのかというと
「このwindowを開いた人はこのwindowですよ」
って事でスクリプトで開いたことになってたみたいなのね
で、どうやらこれはfirefoxのセキュリティーホールだったらしく
firefox3系で修正されましたとさ
・・・・
さてどうしたものかと
いろいろ調べましたが・・・
無理!!!
windowオブジェクト見ててwindow.closedってプロパティー見つけたから
この辺書き換えたらいけるんじゃね?とか思ったけど
window.closed=true;
とかってやると
setting a property that has only a getter
って怒られちゃうし・・・
一応こんなの書いてみたけどfirefoxは動く気配なし
winClose() {
window.opener = window;
var win = window.open(location.href.replace(/#+?.*$/, "") + "#", "_self");
win.destroy = function () {
this.close() || window.close();
};
win.destroy();
}
・
・
・
<a href="javascript:winClose();">winClose</a>
IE7、Opera9.5、Safari4(winxp)は動作確認できたんだけどね。
window.openのところで#をつけてるのは
これつけたら別ウィンドウから開かれたって認識してくれるんじゃないかなって思って
でも無理でした。
firefoxのコード追ってどうやったらハックできるか考えても
次期バージョン出たときにセキュリティーホールってことで修正されちゃうんだろうな。
先輩ごめんなさい。
僕にはMozillaを攻略することは出来ませんでした。
しばらく旅に出ます。
以下参考にさせていただいたサイト