【问题标题】:Programmatically invoke tab capture throws exception以编程方式调用选项卡捕获引发异常
【发布时间】:2015-01-22 10:03:07
【问题描述】:

我在 chrome 扩展的内容脚本中定义了一个监听器:

document.addEventListener("startRecording", function(data) {
    chrome.runtime.sendMessage({'action' : 'captureCurrentTab'});
});

并在我的 extension.js 中定义了一个函数:

chrome.runtime.onMessage.addListener(

function(request, sender, sendResponse) {
       if (request.action == "captureCurrentTab"){

        captureCurrentTab();
     }
 });

function captureCurrentTab() {

    chrome.tabs.getSelected(null, function(tab) {
        chrome.tabCapture.capture(MediaStreamConstraint, handleCapture);
    });
}

var MediaStreamConstraint = {
            //audio: true,
            video: true,
            videoConstraints: {
                mandatory: {
                    chromeMediaSource: 'tab',
                    minWidth: 1920,
                    maxWidth: 1920,
                    minHeight: 1080,
                    maxHeight: 1080
                }
            }
        };

function handleCapture(stream) {

    console.log('content captured');
    console.log("Adding Stream: ", stream);

}

但是当我像这样从我的网络应用程序发送消息开始录制时:

var event = document.createEvent('Event');
            event.initEvent('startRecording');
            document.dispatchEvent(event);

然后扩展抛出异常:

1) 响应 tabCapture.capture 时出错:MediaStream 是强制性的。 2) 运行 tabCapture.capture 时未检查 runtime.lastError:当前页面未调用扩展(参见 activeTab 权限)。无法捕获 Chrome 页面。

这是我提供的权限:

"permissions": [
    "tabCapture",
    "tabs",
    "activeTab",
    "http://*/*",
    "https://*/*" ,
    "http://localhost:1615/*"
  ]

但是当我点击我的扩展按钮并重复相同的过程(发送消息进行录制)时,一切正常。我不知道为什么我每次都必须单击扩展按钮才能开始捕获屏幕。 如何自动启动?

我还为我的扩展程序定义了快捷键。当我在发送消息进行录制之前按下它们时,一切正常。但是当我从我的应用程序触发/模拟它们时,又会出现同样的异常。

请帮忙。

【问题讨论】:

  • 是什么导致了文档中的startRecording 事件?如果它不是一个明确的用户手势,那么它就不会被视为“调用”并且会失败。
  • 我的应用程序中有一个按钮。我的按钮单击事件上有此代码: var event = document.createEvent('Event'); event.initEvent('startRecording'); document.dispatchEvent(event);
  • 你是新来的;提示:您可以并且应该使用其他信息编辑您的问题。

标签: javascript google-chrome-extension


【解决方案1】:

这里的问题是 Chrome 忘记了这个事件是通过点击启动的。因此它不会被“调用”。

您应该在您的内容脚本代码/上下文中绑定一个click 事件侦听器,然后直接从那里发送消息。我认为 Chrome 接受用户调用就足够了。


或者,绕过内容脚本直接向扩展发送消息可能会起作用。这可以通过"externally_connectable" method (docs) 实现。

【讨论】:

  • 这不起作用 :( 直接从我的应用程序访问我的内部方法时发生相同的异常。
  • 你是指我提到的第一种还是第二种方法?
  • 奇怪。您可以通过尝试第一种方法(在内容脚本中单击侦听器)用代码更新您的问题吗?
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 2015-10-31
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多