影響あり クロスオリジンの Worker 読み込みが例外の代わりに error イベントを発生させるようになり、サンドボックス化された iframe 内の Worker が禁止されます

公開日: | カテゴリー: DOM, プライバシー & セキュリティ

概要

HTML5 標準準拠の一環として、Firefox 45 で Web Worker スクリプトを内部的に読み込む方法が変更されました。ここで知っておくべき後方互換性問題が 2 件あります。

従来、Worker コンストラクターでクロスオリジンの Worker スクリプトを読み込もうとした場合、Firefox は即座に SecurityError を投げていました。Firefox 45 以降では、最新の仕様に従い、新しい Worker インスタンスが作成された後に非同期で一般的な error イベントが発生します。両方の場合に対処するには、以下のように try-catch 宣言と Worker の onerror ハンドラーを併用しなければなりません。

try {
  var worker = new Worker(url);
  worker.addEventListener('error', function (event) {
    // Error: Failed to load script (nsresult = 0x805303f4)
    // イベントの浮上を防ぐ
    event.preventDefault();
    // 新しいブラウザー向けにクロスオリジン読み込みエラーを処理
    ...
  });
} catch (ex) {
  // SecurityError
  // 古いブラウザー向けにクロスオリジン読み込みエラーを処理
  ...
}

現在のところ Mozilla の PDF.js ライブラリが CDN などのクロスオリジン環境で動作していません。これは、Worker に onerror ハンドラーが欠けており、フォールバック関数が呼び出されないためです。

更新: PDF.js バージョン 1.4.187 で問題が修正されました。pdf.js レポジトリ で新バージョンが公開されるまでは、最新のプレビルド版を pdfjs-dist レポジトリ からダウンロードできます。自分でビルドすることも可能です。

Firefox 45 では、sandbox 属性付き <iframe> 内で Worker の読み込みが誤って許容されているというブラウザー実装上のバグも修正されました。サンドボックス化された iframe 内のドキュメントは何にも一致しない独自のオリジンを持つ一方で、Worker スクリプトは 同一オリジン になければならないため、今後そうしたコードは上記のようにエラーとなります。この問題の回避策は sandbox の値に allow-same-origin を追加することですが、保護機能が緩和されてしまうことから推奨されません。

参考資料