chrome.runtime.sendMessage在重新加载Chrome扩展程序后从内容脚本抛出异常

c00000fd

我将注入的内容脚本中的消息发送Chrome扩展程序中的后台脚本,如下所示:

chrome.runtime.sendMessage({action: "myResult"});

在我重新加载扩展程序之前,此方法可以正常工作(通过对我的扩展程序转到“设置”->“扩展程序”->“重新加载(Ctrl + R)”)。

反过来,当我的后台脚本启动时,它反复要求chrome.tabs.executeScript所有打开的选项卡以编程方式重新注入我的内容脚本如我在此问题中所示)

但是这样做之后,如果我sendMessage内容脚本中调用第一,则会抛出此异常:

错误:连接到扩展名my_extension_id时出错

知道为什么会这样吗?

罗伯·W

重新加载扩展运行时时,在以下任何情况下都会发生

  • 你打过电话了chrome.runtime.reload()
  • 您已点击位于的Reload extension chrome://extensions/
  • 扩展程序已更新。

然后内容脚本中最扩展的API方法将停止工作(包括chrome.runtime.sendMessage导致问题中的错误的方法)。有两种方法可以解决此问题。

选项1:退回到仅基于内容脚本的功能

如果您的扩展程序可以在没有背景页面的情况下正常运行,那么这可能是可以接受的解决方案。例如,如果您的内容脚本除了修改DOM和/或执行跨域请求之外没有执行其他操作。

我在其中一个扩展程序中使用以下代码段,以在从内容脚本调用任何Chrome扩展程序API之前检测运行时是否仍然有效。

// It turns out that getManifest() returns undefined when the runtime has been
// reload through chrome.runtime.reload() or after an update.
function isValidChromeRuntime() {
    // It turns out that chrome.runtime.getManifest() returns undefined when the
    // runtime has been reloaded.
    // Note: If this detection method ever fails, try to send a message using
    // chrome.runtime.sendMessage. It will throw an error upon failure.
    return chrome.runtime && !!chrome.runtime.getManifest();
}

// E.g.
if (isValidChromeRuntime()) {
    chrome.runtime.sendMessage( ... );
} else {
    // Fall back to contentscript-only behavior
}

选项2:在插入内容脚本时卸载先前的内容脚本

当与后台页面的连接对于内容脚本很重要时,则必须实现适当的卸载例程,并设置一些事件以在通过插入内容脚本时卸载先前的内容脚本chrome.tabs.executeScript

// Content script
function main() {
    // Set up content script
}

function destructor() {
    // Destruction is needed only once
    document.removeEventListener(destructionEvent, destructor);
    // Tear down content script: Unbind events, clear timers, restore DOM, etc.
}

var destructionEvent = 'destructmyextension_' + chrome.runtime.id;
// Unload previous content script if needed
document.dispatchEvent(new CustomEvent(destructionEvent));
document.addEventListener(destructionEvent, destructor);
main();

请注意,任何知道事件名称的页面都可能触发内容脚本的破坏。这是不可避免的,因为在扩展程序运行时被销毁之后,没有适当的方法可以与扩展程序安全地通信了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Chrome扩展程序runtime.sendmessage等待响应

chrome.runtime.sendMessage在Chrome扩展程序中不起作用

chrome.runtime.reload阻止扩展

尝试重新加载我的扩展运行时时“chrome.runtime.reload 不是函数”

chrome 扩展 - 我如何等待 chrome.runtime 功能?

Google Chrome扩展程序:页面重新加载后如何立即注入脚本?

刷新页面后才加载Chrome扩展程序内容脚本

Chrome扩展程序-在URL更新上加载内容脚本

Chrome扩展程序:注入后如何删除内容脚本CSS?

Chrome 扩展程序通过 chrome.runtime.onMessage 传递当前标签 url

如何在Chrome扩展程序中使用Require.JS时启动chrome.runtime.on

chrome.runtime.onInstalled未定义

Chrome扩展程序:SendMessage问题

Chrome扩展程序:无法获取背景以将sendMessage发送到内容脚本

如何自动重新加载chrome扩展程序?

Chrome扩展程序:加载所有其他页面脚本后运行扩展程序的脚本

内容脚本之间的通信| Chrome 扩展程序

Chrome扩展程序-脚本加载事件?

chrome.runtime.onMessage.addListener在内容脚本中未定义

为什么在内容脚本中未定义chrome.runtime?

在内容脚本加载到Chrome扩展程序之前,如何避免出现样式错误的内容?

Chrome扩展页面重新加载

Chrome 扩展:我希望在网页完全加载后注入内容脚本

Chrome扩展程序在加载错误时重新加载页面

Chrome扩展程序-等待页面重新加载以继续执行脚本

getElementsByClassName在chrome扩展内容脚本中的行为异常

Chrome消息传递:chrome.runtime.sendMessage在最新版本上不起作用49

在Chrome扩展程序中将远程脚本作为内容脚本

多个chrome.runtime.onMessage-Listeners-断开端口错误