同步文件系统 API 是否可以在 chrome 扩展中使用



我正在谷歌扩展中创建页面操作弹出窗口。当弹出窗口关闭时,我需要将内容写回文件。为此,我附上了window.unload事件。在卸载处理程序中,我正在尝试写入文件。但是由于我使用的是异步 api,因此在为 getFile 函数设置 successHandler 后,页面立即关闭,并且 successHandler 不会执行。我可以在这里使用同步文件 API 吗?我读到同步 apis 只能与 Web worker 一起使用。它可以在扩展中使用吗?或者有没有其他方法来处理这种情况。我正在将我的代码粘贴到此处的文件

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 不提供任何事件来检测弹出窗口何时关闭。提供的唯一事件是点击事件,如果页面操作有弹出窗口,则不会触发该事件。我该怎么做才能检测弹出窗口何时关闭?

要找出答案,请创建一个测试用例。以下代码在后台页面的控制台中进行了测试。

 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

因此,Chrome 扩展程序范围内不支持同步文件系统 API。

不要在弹出窗口中执行虚拟 I/O,而是使用 chrome.extension.getBackground()chrome.runtime.sendMessage 将数据传递到后台,并让后台处理它。

最新更新