次のような状況があります。
Iframe は、1 つのドメイン (A) 内のページによって埋め込まれ、制御されます。
ドメイン A のコードを変更するアクセス権はありません。
Iframe のコンテンツは、別のドメインから配信されます (B)。
Iframe 内のすべてのセッション変数を処理するために、sessionstorage を使用しています。
Iframe にリアルタイムの更新を配信するための Comet スタイルのプッシュが行われています。これを機能させるには、各 Iframe を一意に識別できるようにする必要があります。
そのために、一意の ID を sessionStorage 変数に格納しますが、もちろんそこに問題があります。
ドメイン A が「window.open」を使用して子ウィンドウを開くまでは問題なく、最終的に次のシナリオになります。
+----------+ +----------+
| A | | A |
| +------+ | | +------+ |
| | B (1)| | window.open -> | | B (2)| |
| +------+ | | +------+ |
+----------+ +----------+
B(2) がロードされると、セッションストレージは次のように処理されます。
IE 8,9,10: sessionstorage[B1] is copied to sessionstorgage[B2]
Firefox: sessionstorgage[B2] is uninitialized (this is OK)
Chrome: sessionstorage[B1] is copied to sessionstorgage[B2]
Safari: sessionstorage[B1] is copied to sessionstorgage[B2]
Opera: sessionstorage[B1] is shared (ie the same) as sessionstorgage[B2]
(a change in one will appear in the other - is this a bug?)
そのため...ほとんどのブラウザで一意のIDが複製されます(またはOperaの場合は共有されます)
Operaでは、セッションストレージを共有しているように見えるため、おそらく解決策はありません。
Firefox では、まったく新しいウィンドウのように振る舞うだけなので、問題はありません。
SafariとChrome では、次のことができます。
if (window.opener)
{
if (window.opener.frames.THE_IFRAME.sessionstorage.THE_UNIQUE_ID ==
sessionstorage.THE_UNIQUE_ID)
... get a new unique ID ...
}
IEでは、window.opener.frames.THE_IFRAME にアクセスできません。これは、クロスドメインの制限により、window.opener 内の何にもアクセスできないためです。
これを IE で機能させる方法 (Opera のサポートなしで生活できます)、または一般的なより良い解決策についての提案をいただければ幸いです。