官方文档的地址: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
字段的,需要和普通页面区分处理)
get
的api,比如chrome.bookmarks.get
和chrome.tabs.get
,当没有指定ID的数据时会直接抛出错误,而不是返回udefined
或null
。WINDOW_ID_CURRENT
和WINDOW_ID_NONE
都是常量,只能用于query
api的查询,文档里说WINDOW_ID_CURRENT
表示当前窗口的windowId
值,我一开始还以为这个是环境变量,在不同窗口下会是对应值,结果是固定值。实际上获取当前窗口ID还是得通过chrome.windows.getCurrent()
返回的窗口对象。