【问题标题】:How to persist PNaCl process within a Chrome Extension如何在 Chrome 扩展程序中保留 PNaCl 进程
【发布时间】:2015-03-06 21:53:22
【问题描述】:

我和我的团队创建了一个 Chrome 扩展程序,它捆绑了一个 PNaCl 应用程序来处理多媒体编码和复用,它改编自 Pepper SDK(版本 39)示例和在线 SDK 教程。应用程序的目的是从用户的桌面、选项卡和网络摄像头捕获内容,以创建多媒体文件。

扩展程序在可见时按预期工作,但在隐藏扩展程序时 PNaCl 进程停止/卸载。我需要知道当 Chrome 扩展程序不再可见时保持 PNaCl 进程的最佳策略是什么。

PNaCl 应用程序嵌入在我的主 UI 代码中(在我的例子中,它设置为 index.html)。该扩展包含Background Pages,它在隐藏时继续处理请求,因此我相信 manifest.json 权限和进程按预期工作。此外,也不例外。

到目前为止,我已经尝试过:

  • 将后台 JavaScript 页面设置为 PNaCl 应用程序的接口,使其引用存储在后台页面中,该页面应保持不变。
  • 创建一个Chrome Window 以保持 PNaCl 应用程序并在隐藏扩展程序时呈现捕获的流的实时预览。
  • (进行中)将 PNaCl 容器嵌入一个背景 HTML 页面,而不是代表扩展 UI 的主 HTML 页面。

到目前为止,他们都没有坚持 PNaCl 过程。

我的 manifest.json 的相关部分:

{
    "manifest_version": 2,
    "minimum_chrome_version": "39.0.0.0",

    "offline_enabled": true,

    "permissions":[
        "desktopCapture",
        "tabCapture",
        "tabs",
        "unlimitedStorage"
    ],

    "browser_action":{
        "default_popup": "index.html"
    },

    "background":{
        "scripts": ["helpers.js", "background.js", "capture_state.js"],
        "persistent": true
    }
}

如果我能够在收到回复之前解决问题,我会回复解决方案。

【问题讨论】:

    标签: google-chrome-extension google-nativeclient


    【解决方案1】:

    尽管缺乏文档,我们已经解决了这个问题。

    以下是主要问题:

    问题 #1 - 前端扩展代码中的侦听器 ID。

    我们在前端扩展代码中包含id="listener"(在隐藏扩展时会卸载),并且手动指定 background.html 页面不允许我们使用后台 JavaScript 文件(我们的要求应用程序)。

    解决方案:我们动态添加了id="listener",并将使用document.addElementcommon.js 文件更改为生成的background page(在加载扩展程序时自动创建)。

    问题 #2 - 在前端扩展代码中调用 getUserMedia 方法。

    我们的应用程序要求从 getUserMedia 返回的流保持不变,以便我们可以在后台从麦克风、网络摄像头和桌面捕获,即使扩展程序被隐藏。

    由于我们在前端扩展代码中请求了这些(以创建实时预览),因此我们认为我们可以简单地将它们传递到生成的背景页面中,并且它们会持续存在。

    我们发现,当扩展被隐藏时,从流中读取会立即停止而不会出错。我们通过挖掘我们的代码并监控 Chrome 任务管理器来发现这一点,当扩展程序被隐藏时,它的 CPU 使用率变为 0,但它的内存保持升高(很像线程死锁或阻塞时所期望的现象) .

    解决方案:getUserMedia 调用移至后台脚本之一并使用它返回的流解决此问题。

    【讨论】:

      【解决方案2】:

      如果您在弹出窗口中创建 PNaCl 对象,该对象应该在失去焦点时被一次性销毁,您将无法持久保存它。

      它并没有失去可见性,它只是完全卸载了。

      您将<embed> 放入背景页面的“持续”想法可能是正确的。

      【讨论】:

      • 是的,我知道它不是隐藏的,而是完全卸载的;我说隐藏 b/c 这是用户操作。
      • 经过深思熟虑后,首选的用户体验是使用 simple 或 id="listener" advanced NaCl 集成,因为我希望每个扩展窗口都能被关闭(并因此被卸载)并且捕获会话仍在运行(a la MediaCore Extension)。
      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多