4

今日、Firefox を 13.0 にアップグレードしました。しかし、私のJavaScriptコードに何か問題があります。

Web ページ A (www.xx.com) と Web ページ B (webim.xx.com) があります。iframeタグを使用して B を A に埋め込みます。

ウェブページ A

最初にドメインを「xx.com」に設定します

<script>document.domain = 'xx.com';</script>

次に、iframe を作成して Web ページ B を読み込みます。

<script>
var iframe = document.createElement('iframe');
document.body.insertBefore(iframe, document.body.firstChild)
iframe.src = 'http://webim.xx.com';
</script>

ウェブページ B でドメインを「xx.com」に設定

<script>document.domain = 'xx.com';</script>

次に、Web ページ B の localStorage にアクセスします。

Web ページ A で、次のコードを実行します。

window.iframe.contentWindow.localStorage.setItem('a', 'a')

次に、エラーが表示されます。

Error: The operation is insecure.

以前のバージョンまたは他のブラウザーでは、コードは正常に実行できます。

理由を知っている人はいますか?

バグですか?

そして..この問題を解決するには?どうも。


ちょうど今、この問題を解決する方法を見つけました。

localStorage に直接アクセスすることはできませんが、独自の Web ページの localStroage を呼び出すことができるiframe の関数を呼び出すことができます。

/// webpage B
<script>
document.domain = 'xx.com';
var ls = { ///< ls is short for localStorage.
    setItem: function(k, v) {
        return localStorage.setItem(k, v);
    },
    getItem: function(k) {
        return localStorage.getItem(k);
    },
    removeItem: function(k) {
        return localStorage.removeItem(k);
    },
    clear: function(){
        return localStorage.clear();
    }
}
</script>

次に、 ls.setItemなどを呼び出して、iframe の localStorage にアクセスします。

/// webpage A
<script>iframe.ls.setItem('a', 'b');</script>

私はこの問題を解決できますが、なぜ firefox 13.0 がこの問題を引き起こすのですか?

4

1 に答える 1

4

古い Firefox の動作にはバグがあり、バグは修正されました。仕様によると、document.domain の設定は localStorage の動作にまったく影響を与えないはずです。そのため、この場合、別のドメインに localStorage を設定しようとしていますが、これは許可されていません。

詳細については、 https: //bugzilla.mozilla.org/show_bug.cgi?id= 495337 および localStorage 仕様を参照してください。

于 2012-06-08T15:08:37.957 に答える