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

时间:2015-03-06 21:53:22

标签: google-chrome-extension google-nativeclient

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

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

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

到目前为止,我一直在尝试:

  • 将后台JavaScript页面设置为PNaCl应用程序的界面,以便它的引用存储在应该保留的后台页面中。
  • 创建Chrome Window以保留PNaCl应用程序,并在隐藏扩展程序时显示捕获的流的实时预览。
  • (正在进行中)将PNaCl容器嵌入后台HTML页面,而不是主HTML页面,它代表扩展UI。

到目前为止,他们都没有坚持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
    }
}

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

2 个答案:

答案 0 :(得分:1)

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

以下是主要问题:

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

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

解决方法:我们动态添加id="listener"并使用document.addElementcommon.js文件更改为生成的background page(在{{3}}时自动创建加载扩展名。)

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

我们的应用程序要求从getUserMedia返回的流仍然存在,以便我们可以在后台捕获麦克风,网络摄像头和桌面,即使隐藏了扩展名。

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

我们发现,当隐藏扩展时,从流中读取会立即停止而不会出现错误。我们通过挖掘我们的代码并监控Chrome任务管理器来发现这一点,看看当隐藏扩展程序时,它的CPU使用率变为0,但它的内存保持不变(就像你现在的情况一样)。 d期待线程死锁或阻塞时。)

解决方案:getUserMedia调用移动到其中一个后台脚本并使用它返回的流来解决此问题。

答案 1 :(得分:0)

如果你在弹出窗口中创建了PNaCl对象,当它失去焦点时,该对象应该是一次性破坏,你将无法继续它。

它没有失去知名度,它只是完全卸载。

你正在进行的&#34;将<embed>放入背景页面的想法可能是正确的。