页面工作线程 - destroy() 似乎没有删除窗口对象

Page Worker - destroy() does not seems to remove the window object

本文关键字:删除 对象 窗口 工作 线程 destroy      更新时间:2023-09-26

我有一个SDK插件,可以创建一个页面工作者

events.on(eventTarget, "sandbox", (details, content) => {
  var pageWorker = worker.Page({
    contentScriptFile: data.url("sandbox.js"),
    contentURL: data.url("sandbox.html"),
    contentScriptWhen: "end"
  });
  pageWorker.port.emit("detect-version", content, funcs);
  pageWorker.port.on("version-detected", (result) => {
    if (result.version) {
      events.emit(eventTarget, "result-ready", details, results);
    }
  });
  pageWorker.port.on("done", () => {
    pageWorker.destroy();
  });
});

正如您在沙盒事件中看到的那样,加载项和页面工作线程之间有一些来回消息传递

  • 页面工作线程已创建
  • 发送消息:检测版本
  • 侦听检测到的版本
  • 侦听 done 事件,在页面工作线程上调用 destroy()

我希望worker.destroy()删除对象和背景页面等。这似乎没有发生。如果我进行一个小时的浏览器会话,浏览器的内存使用率非常高,如果我在 Firefox 中检查about:memory,我会看到很多sandbox.html窗口条目,我想这表明它们没有被销毁。

有谁知道这是否是 1.14 中的错误?还是我在这里做错了什么?其他选择?我需要有一个可以与附加组件通信的沙盒页面,而页面工作者似乎是目前唯一的选择。

我看到 SDK 存储库中有一个 2013-09-26 提交的错误修复,可能与此 https://github.com/mozilla/addon-sdk/commit/55aeedc69984a2c0df78ddb17cee35a960b1135b

提前感谢您对此的任何帮助t.

这似乎仍然是一个问题,我怀疑是否会有修复方法。我刚刚遇到这个问题,最终通过在脚本末尾加载一个小的静态资源来最大限度地减少副作用:

window.location = "data:text/plain,goodbye";

这样,原始页面上的任何重复后台请求将不再运行。请注意,这将导致页面工作线程脚本重新评估,因此您必须检查脚本顶部的window.location