如何通过自定义协议远程触发Chrome扩展打开指定URL?
问题分析与解决方案
你遇到的问题是因为没有在扩展中注册自定义协议处理程序,Chrome无法识别addonname://属于你的扩展,所以会默认当作搜索词处理。以下是具体的修复步骤:
1. 修改manifest.json,添加协议注册与后台脚本配置
在原配置中补充protocol_handlers(注册自定义协议)和background(后台服务脚本)字段,同时精简不必要的权限:
{ "name": "Action API Demo", "version": "1.0", "manifest_version": 3, "action": { "default_title": "Default Title" }, "permissions": [ "windows", "tabs" ], "background": { "service_worker": "background.js" }, "protocol_handlers": [ { "protocol": "addonname", "name": "Addon Protocol Handler", "url": "handler.html?url=%s" } ] }
protocol_handlers:告诉Chromeaddonname://协议由当前扩展处理,%s会被替换为完整的协议URL(比如addonname://somemessage)。background:注册后台服务脚本,用于处理窗口创建逻辑。
2. 创建后台脚本background.js
用于接收指令并创建新窗口:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.type === 'openWindow') { chrome.windows.create({url: "https://www.google.com", type: "normal"}); } });
3. 创建协议处理页面handler.html
当用户输入addonname://协议时,Chrome会打开这个页面,页面内的脚本触发后台逻辑:
<!DOCTYPE html> <html> <body> <script> // 触发后台脚本打开窗口 chrome.runtime.sendMessage({type: 'openWindow'}, () => { // 完成后自动关闭处理页面 window.close(); }); </script> </body> </html>
为什么原方案不生效?
- 原代码用
chrome.runtime.onMessageExternal监听外部消息,但自定义协议的触发不会发送这类消息,必须通过protocol_handlers注册后,浏览器才会将协议请求导向你的扩展。 - Content Script是注入到网页中的脚本,无法直接响应浏览器级别的协议触发事件,这类逻辑需要后台脚本或专门的处理页面来完成。
内容的提问来源于stack exchange,提问作者Itzik.B
相关产品推荐
相关产品推荐

