我正在谷歌扩展中创建页面操作弹出窗口。当弹出窗口关闭时,我需要将内容写回文件。为此,我附上了window.unload
事件。在卸载处理程序中,我正在尝试写入该文件。但是因为我正在使用异步api,所以在为getFile
函数设置successHandler之后立即关闭页面并且不会执行successHandler。我可以在这里使用同步文件api吗?我读到同步apis只能用于webworkers。可以用于扩展吗?还是有其他方法来处理这种情况。我正在粘贴我的代码来写这里的文件
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不会提供任何事件来检测弹出窗口何时关闭。提供的唯一事件是单击事件,如果页面操作有弹出窗口,则不会触发该事件。如何检测弹出窗口何时关闭?
答案 0 :(得分:1)
要找到答案,请创建一个测试用例。以下代码在a background page's console中进行了测试。
webkitRequestFileSystem(TEMPORARY, 1024); // TypeError: Not enough arguments
以下测试用例using a Web worker,正常:
// 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
因此,Chrome扩展程序范围内的同步FileSystem API 不受支持。
不要在弹出窗口中执行虚拟I / O,而是使用chrome.extension.getBackground()
或chrome.runtime.sendMessage
将数据传递到后台,然后让后台处理它。