以编程方式调用选项卡捕获引发异常

Programmatically invoke tab capture throws exception

本文关键字:异常 编程 方式 调用 选项      更新时间:2023-09-26

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

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

并在我的扩展中定义了一个函数.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);
}

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

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/*"
  ]

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

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

请帮忙。

这里的问题是Chrome无法跟踪此事件是通过单击启动的事实。因此,它不是"援引"的。

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


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