Google chrome extension 在扩展中使用captureVisibleTab后,对内容脚本的回调中断

Google chrome extension 在扩展中使用captureVisibleTab后,对内容脚本的回调中断,google-chrome-extension,content-script,Google Chrome Extension,Content Script,我有一个很奇怪的问题。我有一个网页截图的扩展。我创建了它作为参考。它工作得很完美,整个世界都很快乐 扩展与内容脚本来回通信,并使用不推荐使用的API进行通信。为了防止扩展使用过时的代码,我进行了以下替换: chrome.tabs.sendRequest(...) -> chrome.tabs.sendMessage(...) chrome.extension.onRequest(...) -> chrome.runtime.onMessage(...) chrome.extensio

我有一个很奇怪的问题。我有一个网页截图的扩展。我创建了它作为参考。它工作得很完美,整个世界都很快乐

扩展与内容脚本来回通信,并使用不推荐使用的API进行通信。为了防止扩展使用过时的代码,我进行了以下替换:

chrome.tabs.sendRequest(...) -> chrome.tabs.sendMessage(...)
chrome.extension.onRequest(...) -> chrome.runtime.onMessage(...)
chrome.extension.sendRequest(...) -> chrome.runtime.sendMessage(...)
这样做会破坏扩展,它不再工作。如果我使用不推荐使用的代码,那么一切都会恢复正常

我做了一些跟踪,发现扩展在以下代码处中断:

内容脚本

chrome.runtime.sendMessage(sender.id, data, function(captured) {
   window.clearTimeout(cleanUpTimeout);
   console.log("came back from extension...");
   if (captured) {
      // Move on to capture next arrangement.
      processArrangements(); //function defined elsewhere
   } else {
      // If there's an error in popup.js, the response value can be
      // undefined, so cleanup
      cleanUp(); // function defined elsewhere
   }
});
扩展

chrome.runtime.onMessage.addListener(function(message, sender, cb){
   appendLog("received message from content script. callback is " + cb);
   if (message.msg === 'capturePage') {      
      capturePage(message, sender, cb);
   } else {
      console.error('Unknown message received from content script: ' + message.msg);
   }
});

function capturePage(data, sender, cb) { 

   ... // some code omitted for clarity

   chrome.tabs.captureVisibleTab(
      null, {format: 'png', quality: 100}, function(dataURI) {
        if (dataURI) {
            var image = new Image();
            image.onload = function() {
                screenshot.ctx.drawImage(image, data.x, data.y);
                //appendLog("calling callback function. callback is: " + cb);
                cb(true); // **callback isn't called on content script**
            };
            image.src = dataURI;
        }
    });
}
为了清晰起见,我省略了一些代码,缺少的代码与此无关。让我解释一下你在上面看到了什么:

  • 在扩展上,capturePage函数内执行cb(true)行。我可以确认,因为我可以看到“调用回调函数”就在它前面。但是,内容脚本上的回调代码不会运行。同样,我可以确认这一点,因为我没有看到“从分机返回”消息

  • 奇怪的是:如果我在调用chrome.tabs.captureVisibleTab()之前调用cb(true),那么内容脚本上的回调代码会正常执行。这意味着chrome.tabs.captureVisibleTab()以某种方式干扰了内容脚本上cb(true)的执行调用captureVisibleTab()时,可能某个端口已关闭。-我不确定。事实上,cb(true)在调用captureVisibleTab()后不会在内容脚本上执行,但如果我之前调用它,它会执行

  • 在扩展上,我尝试将回调函数cb存储在capturePage()之外的变量中,然后调用另一个函数,该函数将调用cb。。。但这也不行

  • 我在扩展中添加了“”权限,我想这可能会改变一些事情,但不会。这不会改变任何事情

  • 同样,如果我替换了不推荐使用的API所在的4行代码,那么我的扩展工作正常。因此,问题是sendMessage()和captureVisibleTab()的组合。没有语法错误,我不会遗漏任何内容。如果省略对captureVisibleTab()的调用,cb调用将在内容脚本上正常执行。到底是什么

  • 这有多奇怪?我不想把那些不推荐使用的API调用留在那里。但是,还有什么可能阻止回调代码在内容脚本上执行呢?我开始认为调用captureVisibleTab()时端口已关闭/替换,但我不是很确定,我正在进一步调查

    我遇到过,但我不确定这是否与我的问题有关。我在stackoverflow上也找不到类似的东西,因此我提出了这个问题。有人能解释一下吗


    谢谢

    是的。。您只需要一行代码。等一下,我去拿一个链接。请不要删除这个问题,重要的是要有一个记录,当从老阿皮亚人迁移时,这个记录会被打破,这很尴尬:(我完全错过了文档中关于保持频道开放的那一行。对不起,伙计们。@Xan谢谢你们指出那个人。我可以删除它,尽管正如你们所说,在迁移代码时,这种副作用并不明显。