0

Google 拡張機能でページ アクション ポップアップを作成しています。ポップアップが閉じられたときに、コンテンツをファイルに書き戻す必要があります。このために、window.unloadイベントを添付しました。アンロード ハンドラで、ファイルに書き込もうとしています。しかし、非同期APIを使用しているため、関数にsuccessHandlerを設定した直後にgetFileページが閉じられ、successHandlerが実行されません。ここで同期ファイル API を使用できますか? 同期 API は Webworker でのみ使用できると読みました。拡張機能で使用できますか? または、この状況に対処する他の方法があります。ここにファイルへの書き込み用のコードを貼り付けています

fileSystem.root.getFile(fileName, {create : true, exclusive : true}, function (fileEntry) {
                file.createWriter(function() {
                    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder;
                    var bb = new BlobBuilder(); 
                    bb.append(JSON.stringify(credentialsObj));
                    fileWriter.write(bb.getBlob('text/plain'));                         
                }, errorHandler);
            }, errorHandler);

最初に投稿された質問への変更

上記のコードをコンテンツ スクリプトに移動しました。ページアクションが閉じたときにコンテンツスクリプトと通信しようとしています。このために、関数を に添付しましたwindow.onunload。ページ アクション ポップアップをデバッガ モードで開き、 を実行しlocation.reload(true)ました。次に、window.unloadリスナーが呼び出され、プログラム コントロールがコンテンツ スクリプトに到達し、コードが実行されます。しかし、実際に拡張機能をデプロイすると、ユーザーがポップアップ内以外の場所をクリックすると、ポップアップが閉じられます。この場合、アンロード ハンドラは呼び出されません。Google は、ポップアップが閉じたときに検出するイベントを提供していません。提供される唯一のイベントは、ページ アクションにポップアップがある場合はトリガーされないクリック イベントです。ポップアップが閉じられたことを検出するにはどうすればよいですか?

4

1 に答える 1

1

確認するには、テスト ケースを作成します。次のコードは、バックグラウンド ページのコンソールでテストされました。

 webkitRequestFileSystem(TEMPORARY, 1024);     // TypeError: Not enough arguments

次のテスト ケースは、Web ワーカーを使用して正常に動作します

// Create a worker for testing purposes
var blob = new Blob([
    'onmessage=function(e){postMessage(eval(e.data))}'
], {
    type: 'application/javascript'
});
var worker = new Worker((window.webkitURL || URL).createObjectURL(blob);
worker.onmessage = function(e) {console.log(e.data)};

// Test:
worker.postMessage('webkitRequestFileSystem(TEMPORARY, 1024)'); // No error
// For comparison, check whether we receive an error when something goes wrong:
worker.postMessage('webkitRequestFileSystem(0)');     // E: Not enough arguments

そのため、同期 FileSystem API はChrome 拡張機能の範囲内ではサポートされていません。

ポップアップで仮想 I/O を実行する代わりに、chrome.extension.getBackground()またはchrome.runtime.sendMessageを使用してデータをバックグラウンドに渡し、バックグラウンドで処理させます。

于 2012-05-08T13:40:52.560 に答える