2

アドオン 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 を利用可能にして使用可能にする方法はありますか?

4

1 に答える 1

1

FileReaderSync 実際には、が定義されている場合、2 回否定したため、ワーカーは「ERROR」を送信します。に変更!!FileReaderSyncする!FileReaderSyncと、正しく動作します。

コメントアウトしたコードで問題を見つけようとしたと思います。問題は、reader.readAsText('/tmp/hello.txt')機能しないことです-このメソッドは blob (またはfile ) を想定しています。ワーカー自体はファイルを構築できませんが、拡張機能でファイルを作成し、メッセージとともにワーカーに送信できます。

worker.postMessage(new File("/tmp/hello.txt"));

: アドオン SDK がFileコンストラクターを定義しているかどうかはわかりません。おそらく、コンストラクターと同じトリックを使用する必要がありますWorker

その後、ワーカーはこのファイルからデータを読み取ることができます。

onmessage = function(event)
{
    var reader = new FileReaderSync();
    postMessage("File contents: " + reader.readAsText(event.data));
}
于 2012-08-16T07:06:44.190 に答える