如何在 Chrome 扩展中保留 PNaCl 进程

How to persist PNaCl process within a Chrome Extension

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

扩展程序在可见时按预期工作,但当扩展程序隐藏时,PNaCl 过程是 stopped/unloaded。我需要知道当 Chrome 扩展不再可见时坚持 PNaCl 过程的最佳策略是什么。

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

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

到目前为止 none 他们坚持了 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
    }
}

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

如果您在弹出窗口中创建 PNaCl 对象 window,它应该是一个一旦失去焦点就会被销毁的一次性对象,您将无法持久化它。

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

您 "Ongoing" 将 <embed> 放入后台页面的想法可能是正确的。

尽管缺少文档,我们还是解决了这个问题。

以下是主要问题:

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

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

解决方案: 我们动态添加了 id="listener" 并更改了 common.js file using document.addElement to the generated background page(加载扩展时自动创建)。

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

我们的应用程序要求从 getUserMedia 返回的流持续存在,这样即使扩展程序被隐藏,我们也可以在后台从麦克风、网络摄像头和桌面进行捕获。

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

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

解决方案:getUserMedia 调用移动到其中一个后台脚本并使用它的流 returns 解决了这个问题。