我的 google-chrome 扩展是不是有一个 chrome.* API 来找出它在哪些页面上被禁止编写脚本?

Posted

技术标签:

【中文标题】我的 google-chrome 扩展是不是有一个 chrome.* API 来找出它在哪些页面上被禁止编写脚本?【英文标题】:Is there a chrome.* API for my google-chrome extension to find out on which pages it is barred from scripting?我的 google-chrome 扩展是否有一个 chrome.* API 来找出它在哪些页面上被禁止编写脚本? 【发布时间】:2012-11-06 02:22:35 【问题描述】:

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

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

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

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

我发现了一篇很棒的帖子 here,但它没有编程 API,因此提出了这个问题。

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

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

提前感谢您的回复。

【问题讨论】:

【参考方案1】:

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

【讨论】:

嗨,马修,感谢您阅读、理解和回答我的问题。是的,你的方法应该有效。我当前的代码采用了这种技术——即,如果页面没有响应,那么内容脚本不存在(或出现问题)。即使在一般情况下,即使另一部分失败,让一部分代码继续工作也是一件好事。但是,如果有一种编程方式来过滤问题页面(例如所有 chrome:// URL),那么我将能够向最终用户提供更好的工具提示/消息,解释为什么 UI 缺少​​某些功能.再次感谢。 您究竟想如何更新 UI?我不明白为什么 ping 页面不是完成您想要的“编程方式”。 对不起,我应该说“API”而不是“编程方式”。我希望的是一个 chrome.* API,我可以使用 URl(或 tab-id)作为参数调用它,它会告诉我页面是否允许内容脚本运行。在这种情况下,我什至不会发出“ping”,而是在 UI 上显示一条消息,说明该页面的权限受到限制。我看了又看,但没有找到合适的 chrome.* API。我想没有。 我已将标题编辑为“chrome.* API”而不是“编程方式”。 是的,在这种情况下,答案是“否”。 :-)【参考方案2】:

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

chrome.tabs.executeScript(tabId, code: "", function() 
  if(chrome.runtime.lastError) 
    // Something went wrong, perhaps no rights
   else 
    // Scripting allowed
  
);

【讨论】:

以上是关于我的 google-chrome 扩展是不是有一个 chrome.* API 来找出它在哪些页面上被禁止编写脚本?的主要内容,如果未能解决你的问题,请参考以下文章

从脚本安装 Google Chrome 扩展

我的linux系统是Centos6.0的,昨天安装里一个goole浏览器,安装的是rpm。可是无法运行。下面是错误信息

google-chrome 中的 XMLHttpRequest 未报告进度事件

使用 google-chrome cli 选项打开多个 PWA

使用学说扩展基类,我的基类是不是有 1:n 关联

google-chrome 无法移动到新的命名空间