如何在chrome启动时激发chrome.webRequest.onBeforeRequest.addListener(

How to get chrome.webRequest.onBeforeRequest.addListener() to fire at Chrome startup?

本文关键字:chrome onBeforeRequest webRequest addListener 启动      更新时间:2023-09-26

我正在为Chrome开发一个利用本地消息主机的扩展。我的background.js立即注册一个监听器来处理所有onBeforeRequest事件(即所有请求),并将它们传递给本机助手应用程序。当Chrome启动后访问页面时,这一切都很好,但当我点击启动Chrome的URL时,我的侦听器不会启动。

以下是我的背景.js:顶部的监听器的基本结构

chrome.webRequest.onBeforeRequest.addListener(function (details) {
    alert('forwarding request!');
    chrome.runtime.sendNativeMessage('<extension name>', { url: details.url });
}, { urls: ['http://*', 'https://*'] }, ['blocking']);

显然,有一些条件可以决定是否通过请求并在Chrome中阻止它,但它们在这里并不相关。即使没有sendNativeMessage位,我也无法为单击以启动Chrome实例的URL生成警报。

有什么聪明的方法可以在启动时的第一个请求通过之前注册这个侦听器吗?

您可以尝试给予扩展background权限:

使Chrome启动得早,关闭得晚,这样应用程序和扩展程序的使用寿命就更长了。

当任何安装的托管应用程序、打包应用程序或扩展程序具有";背景";权限,用户一登录计算机,Chrome就会(无形地)运行——在用户启动Chrome之前。";背景";权限还使Chrome继续运行(即使在其最后一个窗口关闭后),直到用户明确退出Chrome。

这样,Chrome进程和扩展将在您单击任何URL之前加载。用户仍然可以通过显式终止Chrome进程来规避这一点。

顺便说一句,请记住,如果您想阻止请求,来自onBeforeRequest侦听器的响应需要同步,因此您不能基于来自本机消息传递主机的响应来决定阻止。

解决问题的一种方法是使用chrome.declarativeWebRequest API以声明方式注册webRequest侦听器。这种API的缺点是,它目前仅在beta和dev频道上对Chrome用户可用,并且不如webRequest API灵活(规则是声明性的,因此您不能对DWR API不支持的请求处理做出运行时决定)。

解决此问题的另一种方法是使用chrome.tabs.query查找在启动扩展之前已打开的选项卡。