You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firefox扩展搜索关键词拦截失效(基于Proxy实现)求助

解决Firefox扩展搜索关键词拦截不生效的问题

你的代码存在几个关键逻辑错误,导致拦截功能未触发,以下是问题分析和修正方案:

问题点梳理

  1. 逻辑运算符误用:使用了位运算&而非逻辑与&&,导致条件判断不符合预期
  2. 变量未初始化:found变量默认是undefined,参与运算时会引发逻辑异常
  3. 遍历效率低下:用map()遍历关键词时不会提前终止,且语义不匹配
  4. 边界情况未处理:未考虑requestInfo.documentUrl为null的场景(比如直接访问搜索结果页的情况)

修正后的完整代码

// Initialize the list of blocked hosts
let blockedHosts = ["www.duckduckgo.com", "www.google.com"];
let blockedTerms = ["games", "minecraft", "legos"];

// Set the default list on installation.
browser.runtime.onInstalled.addListener(details => {
  browser.storage.local.set({
    blockedHosts: blockedHosts
  });
});

// Get the stored list
browser.storage.local.get(data => {
  if (data.blockedHosts) {
    blockedHosts = data.blockedHosts;
  }
});

// Listen for changes in the blocked list
browser.storage.onChanged.addListener(changeData => {
  blockedHosts = changeData.blockedHosts.newValue;
});

// Listen for a request to open a webpage
browser.proxy.onRequest.addListener(handleProxyRequest, {urls: ["<all_urls>"]});

function handleProxyRequest(requestInfo) {
  // 处理documentUrl为空的边界情况
  if (!requestInfo.documentUrl) {
    return {type: "direct"};
  }
  
  let urlToCheck = new URL(requestInfo.documentUrl);
  let searchString = urlToCheck.search;
  const url = new URL(requestInfo.url);
  // 初始化匹配状态为false
  let found = false;

  // 用some方法高效判断关键词匹配,找到即终止遍历
  found = blockedTerms.some(term => searchString.includes(term));

  // 使用逻辑与&&确保双条件同时满足
  if (blockedHosts.includes(url.hostname) && found) {
    return {type: "https", host: "127.0.0.1", port: 65535};
  }

  return {type: "direct"};
}

// Log any errors from the proxy script
browser.proxy.onError.addListener(error => {
  console.error(`Proxy error: ${error.message}`);
});

关键修改说明

  • 替换逻辑运算符:将&改为&&,确保只有当主机在拦截列表且搜索关键词匹配时,才触发代理拦截
  • 初始化状态变量:给found设置初始值false,避免undefined导致的逻辑判断错误
  • 优化匹配逻辑:用Array.some()替代map(),找到第一个匹配关键词后立即停止遍历,提升效率;同时用includes()替代search(),语义更清晰(无需正则匹配的场景下更合适)
  • 增加边界处理:判断requestInfo.documentUrl是否为空,避免非搜索场景下的URL解析报错

测试建议

可以在handleProxyRequest函数中添加日志输出,验证判断逻辑是否正常:

console.log(`当前主机: ${url.hostname}, 是否在拦截列表: ${blockedHosts.includes(url.hostname)}`);
console.log(`搜索参数: ${searchString}, 是否匹配关键词: ${found}`);

打开浏览器开发者工具的后台脚本面板,即可查看实时日志,确认拦截逻辑是否触发。

内容的提问来源于stack exchange,提问作者foo_bar_zing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:54:41