用 js 控制 manifest.json 的 chrome_url_overrides

in #cn4 years ago (edited)

我的Chrome扩展重构进度已经60%了,目前又遇到了新问题。

这个问题的缘由得慢慢说来。

我的扩展由于需要用自定义的页面替换新标签页。在我的早期版本的实现是这样的:

chrome.tabs.onCreated.addListener(function(tab){
  if(Mini.get_status()=='off'&&(tab.url=="chrome://newtab/"||tab.url=="chrome://newtab")){
    chrome.tabs.update(tab.id, {url:chrome.runtime.getURL('show.html')});
  }
});

也就是新建标签页的时候,用我自己的页面 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,代码如下:

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  if (tab.url === 'chrome://newtab/') {
    if (store.getters.config.mini === false) {
      chrome.tabs.update(tabId, { url: 'chrome-search://local-ntp/local-ntp.html' });
    }
  }
});

之所以用 chrome.tabs.onUpdated,有两个原因:一个是因为 onCreated 拿不到 URL,一个是在当前标签页,如果点击主页按钮的时候,也会进入 chrome://newtab/


ET碎碎念,每周一,晚六点一刻更新,欢迎订阅


欢迎使用 SteemEditor 来编写文章,获取 @steemeditor.bot 的点赞!


感谢你的阅读,我是中文区见证人之一,欢迎通过 SteemConnect 来给我投票,或者打开 https://steemitwallet.com/~witnesses 页面,输入 ety001 进行投票。

2.gif

中文区的见证人目前有:
支持一下他们(按字母顺序),一人可以有30票


Thank you for reading. I'm a witness. I would really appreciate your witness vote! You can vote by SteemConnect. Or open https://steemitwallet.com/~witnesses page, input ety001 to vote.

2.gif

Sort:  

Thanks for your 200.64SP to team-cn ! Your post has earned 10% team-cn upvotes!