アドオン SDK を使用して、Firefox アドオンで Web ワーカー (コンテンツ/ワーカーではない) を取得することができました。ここで Wladimir のアドバイスに従って、Worker クラスを機能させました: Concurrency with Firefox add-on script and content script
これで、コード内でワーカーを起動し、メッセージを送受信してワーカーと対話できるようになりました。
これは私の main.js ファイルです:
// spawn our log reader worker
var worker = new Worker(data.url('log-reader.js'));
// send and respond to some dummy messages
worker.postMessage('halo');
worker.onmessage = function(event) {
console.log('received msg from worker: ' + event.data);
};
これは私の log-reader.js ファイルです:
// this function gets called when main.js sends a msg to this worker
// using the postMessage call
onmessage = function(event) {
var info = event.data;
// reply back
postMessage('hey addon, i got your message: ' + info);
if (!!FileReaderSync) {
postMessage('ERROR: FileReaderSync is not supported');
} else {
postMessage('FileReaderSync is supported');
}
// var reader = new FileReaderSync();
// postMessage('File contents: ' + reader.readAsText('/tmp/hello.txt'));
};
私の問題は、FileReaderSync クラスが log-reader.js ファイル内で定義されていないことです。その結果、エラー メッセージが返されます。FileReaderSync が実際に使用されている最後の行のコメントを外すと、アドオンにメッセージが返されなくなります。
ダミーの jsm ファイルを作成して main.js にインポートすることで、Worker で使用したのと同じトリックを使用してみましたが、FileReaderSync は main.js でのみ使用でき、log-reader.js では使用できません。
// In dummy.jsm
var EXPORTED_SYMBOLS=["Worker"];
var EXPORTED_SYMBOLS=["FileReaderSync"];
// In main.js
var { Worker, FileReaderSync } = Cu.import(data.url('workers.jsm'));
Cu.unload(data.url("workers.jsm"));
ここのドキュメントは、FileReaderSync クラスが Firefox の Web Worker で利用できる必要があることを示しているように見えるので、解決策が必要だと思います。
このインターフェイスは、潜在的にブロックする可能性のある同期 I/O を有効にするため、ワーカーでのみ使用できます。
では、Web Worker コードで FileReaderSync を利用可能にして使用可能にする方法はありますか?