在Extension中使用captureVisibleTab后回调到内容脚本中断

时间:2014-10-17 21:23:04

标签: google-chrome-extension content-script

我有一个非常奇怪的问题。我有一个扩展,截取网页的截图。我使用this extension作为参考创建了它。它运作完美,世界也很幸福。

扩展程序与内容脚本来回通信,它使用不推荐使用的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
   }
});

EXTENSION

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;
        }
    });
}

为了清楚起见,我省略了一些代码,遗漏的代码无关紧要。让我解释一下你在那里看到的内容:

  1. 在扩展上,在capturePage函数内,行cb(true)执行。我可以确认它确实是因为我能够看到它之前的“调用回调函数”。但是,内容脚本上的回调代码不会运行。我再次证实这一点,因为我没有看到“从扩展回来”的消息。

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

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

  4. 我在扩展程序中添加了“”权限,这可能会改变一些事情,但不会。这没有任何改变。

  5. 同样,如果我替换弃用的API所在的4行代码,我的扩展程序将按预期工作。因此,问题是sendMessage()和captureVisibleTab()的组合。没有语法错误,我不会遗漏任何东西。如果省略对captureVisibleTab()的调用,则cb调用将在内容脚本上正常执行。究竟是什么???

  6. 有多奇怪?我不想在那里留下那些弃用的API调用。但话又说回来,什么可能阻止回调代码在内容脚本上执行?当我们调用captureVisibleTab()时,我开始认为端口已关闭/替换,但我不确定并且我正在进一步调查它。

    我遇到this online,但我不确定这是否与我的问题有关。我也在stackoverflow上找不到类似的东西,因此我创建了这个问题。任何人都可以对此有所了解吗?

    由于

0 个答案:

没有答案