【问题标题】:Can the synchronous file system api be used in a chrome extension同步文件系统api可以在chrome扩展中使用吗
【发布时间】:2013-06-09 17:43:17
【问题描述】:

我正在谷歌扩展中创建页面操作弹出窗口。当弹出窗口关闭时,我需要将内容写回文件。为此,我附上了window.unload 事件。在卸载处理程序中,我试图写入文件。但是由于我使用的是异步api,所以在为getFile函数设置successHandler之后,页面立即关闭并且successHandler没有被执行。我可以在这里使用同步文件api吗?我读到同步 api 只能与 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 没有提供任何事件来检测弹出窗口何时关闭。提供的唯一事件是单击事件,如果页面操作有弹出窗口,则不会触发该事件。如何检测弹出窗口何时关闭?

【问题讨论】:

  • 我无法从 Chrome 的扩展 API 页面找到您所指的 API:code.google.com/chrome/extensions/api_index.html。 AFAIK,Chrome 扩展程序无法直接访问文件系统。唯一与文件相关的 API 是 chrome.fileBrowserHandler,它仅适用于 Chrome 操作系统。
  • 请忽略我之前的评论。看起来您使用的是 HTML5 的文件系统 API,而不是用于 Chrome 扩展的 API。
  • 是的,我正在使用 html5 文件系统 API。对不起,我没有特别提到它

标签: html google-chrome google-chrome-extension html5-filesystem


【解决方案1】:

要找出答案,请创建一个测试用例。以下代码在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

因此,同步 FileSystem API不支持在 Chrome 扩展的范围内。

不要在弹窗中做虚拟I/O,而是使用chrome.extension.getBackground()或chrome.runtime.sendMessage将数据传到后台,让后台处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 2019-06-28
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2023-02-02
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多