用 js 控制 manifest.json 的 chrome_url_overrides
我的Chrome扩展重构进度已经60%了,目前又遇到了新问题。
这个问题的缘由得慢慢说来。
我的扩展由于需要用自定义的页面替换新标签页。在我的早期版本的实现是这样的:
1 | chrome.tabs.onCreated.addListener(function(tab){ |
也就是新建标签页的时候,用我自己的页面 URL 替换掉 Chrome 默认页面。
后来,Chrome 在某个版本后,新建标签页后,地址栏是空的,也就是 tab.url
是没有值,这就导致我之前的代码就失效了。
查看文档,发现正确的方法是在 manifest.json
中增加 chrome_url_overrides
这个选项,具体可以查看这里。
这就引入了新的问题。
我的扩展里原来是有一个开关的,这个开关可以控制新标签页是否显示我的自定义页面,也就是上面代码里的那个 Mini.get_status() == 'off'
。
现在用了 manifest.json
直接替换掉了默认页,而 manifest.json
是无法在扩展里修改的,同时 Chrome 没有提供相关的 API,那么如何实现这个开关就很尴尬了。
这个 BUG 我一直放着没有处理。
这次重构进行到了自定义页面重构后,这个问题就必须要解决了。
最终的解决方案是,监听页面更新,如果 URL 符合 chrome://newtab/
,那么就替换成访问 chrome-search://local-ntp/local-ntp.html
,代码如下:
1 | chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { |
之所以用 chrome.tabs.onUpdated
,有两个原因:一个是因为 onCreated
拿不到 URL,一个是在当前标签页,如果点击主页按钮的时候,也会进入 chrome://newtab/
。