4

我正在开发一个谷歌浏览器扩展,它有一个内容脚本、一个背景页面、一个设置页面和一个弹出页面。我学到了虽然内容脚本加载到 Chrome Web Store 上的艰难方法,但永远不会调用 onMessage 侦听器。

我可以在执行时始终中断chrome.extension.onMessage.addListener,但永远不会调用侦听器。因此,当我chrome.tabs.sendMessage从后台或弹出页面执行时,该responseCallback函数永远不会被调用 - 即内部的逻辑responseCallback永远不会执行。Chrome 甚至不会将其视为错误场景 - 它接受请求,但此后保持沉默。

如果它将此视为错误情况(如尝试向chrome://页面发送消息),那么responseCallback将使用未定义的响应参数调用 - 这将导致我的错误处理代码执行......但没有这样的运气。

我可以在我的代码中添加特殊行为http(s)://chrome.google.com/webstore/*,但希望有一种更正式的方式来查找被禁止执行的页面。将不胜感激那里的任何指示。

我在这里找到了一篇很棒的帖子,但它没有编程 API,因此提出了这个问题。

我已经知道 Chrome 网上商店和chrome://URL 是特殊情况。但是,根据我的调查,chrome://URL 上的行为与 Chrome 网上应用店不同。在chrome://URL 上,我的内容脚本似乎根本没有加载,并且sendMessage' 的responseCallback函数被一个空/未定义的响应对象调用。这是 API 发出错误信号的官方方式,对我来说效果很好。

我的问题是能够以编程方式检测 Chrome 网上应用店所遇到的错误,而无需对 URL 进行硬编码(URL 可能会随着时间而变化)。

提前感谢您的回复。

4

2 回答 2

2

chrome.webNavigation.onCompleted在后台脚本中添加监听器怎么样?加载新页面时,向选项卡发送特殊的“ping”消息,并用于chrome.extension.onMessage接收和响应内容脚本中的 ping。如果内容脚本没有响应,那么您就知道它没有在该页面上运行。

于 2012-11-06T12:03:32.603 回答
0

您可以尝试运行chrome.tabs.executeScript以查看是否允许在该域中编写脚本。

chrome.tabs.executeScript(tabId, {code: ""}, function() {
  if(chrome.runtime.lastError) {
    // Something went wrong, perhaps no rights
  } else {
    // Scripting allowed
  }
});
于 2016-04-29T12:10:09.777 回答