Chrome浏览器插件开发踩坑记录

葱油花卷 2024-05-03

先说巨坑的

使用网站图标

官方文档的地址:Chrome Extensions 方法指南

官方提供的方法很简单理解,就是生成一个指向网站图标的url,使用这个url就可以正常显示对应网站的图标了,然而,就这么简单吗?

当然没有。

我使用的框架是react,一开始的处理大概是下面的代码 (没有贴出一些和问题无关的代码,比如tab.url是可能没有的逻辑处理

const favicon = useMemo(() => {
  const url = new URL(chrome.runtime.getURL('/_favicon/'));

  url.searchParams.set('pageUrl', tab.url);
  url.searchParams.set('size', '32');

  return url.toString();
}, [tab.url]);

然后就发现有些时候图标会显示为默认的图标,就是一个网站还未加载出的时候显示的那个图标。经过分析之后我的得出结论,因为组件渲染时标签页不一定加载完毕,此时显示图标必然是默认图标,于是我根据标签页的加载状态做了处理。

然后问题就解决了。

才怪。

一开始测试确实没问题了,但后续的使用过程中还是发现有的图标显示的默认图标,经过对标签页更新事件的数据分析,有问题的无一例外都是标签页加载状态设置为完成之后才更新favicon,于是我再次针对这个情况做出相应处理,问题才解决。(还有需要注意的地方,内置页面例如chrome://settings这种是一定没有favicon字段的,需要和普通页面区分处理

其它问题

  1. 所有get的api,比如chrome.bookmarks.getchrome.tabs.get,当没有指定ID的数据时会直接抛出错误,而不是返回udefinednull
  2. WINDOW_ID_CURRENTWINDOW_ID_NONE都是常量,只能用于queryapi的查询,文档里说WINDOW_ID_CURRENT表示当前窗口的windowId值,我一开始还以为这个是环境变量,在不同窗口下会是对应值,结果是固定值。实际上获取当前窗口ID还是得通过chrome.windows.getCurrent()返回的窗口对象。