Firefox Webextensions:在浏览器启动时运行代码

时间:2017-10-08 11:46:13

标签: firefox firefox-webextensions

使用WebExtensions api,如何在浏览器启动时运行一些代码?我需要能够区分浏览器重启事件和正常启动事件。

在WebExtensions之前,可以通过检查此post中提到的loadReason来完成。参考:MDN docs

一种方法是监听windows.onCreated事件,然后检查它是否是创建的第一个窗口(MDN docs)。但是,我没有看到使用此方法区分浏览器重启事件的方法。

编辑:

我的用例:打开浏览器时我需要打开几个标签。但是,当我因任何原因重新启动浏览器时,我不希望打开标签页(例如:安装更新)。

编辑1:

检查是否存在已打开相同网址的标签将无法始终正常工作,因为某些网址会重定向到另一个网页(例如登录页面),这会导致网址不匹配,并且标签会再次打开。< / p>

2 个答案:

答案 0 :(得分:1)

我不确定“正常启动事件”是什么意思,浏览器启动之外的扩展启动只会发生在第一次安装,手动解除/启用或扩展更新等相对不常见的事件上。

但无论如何,runtime.onStartup事件就是你想要的: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/runtime/onStartup

答案 1 :(得分:1)

您最好的选择可能是跟踪您在background.js中打开的标签的网址和标签。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/onCreated

let tabUrls = [];
function handleCreated(tab) {
  tabUrls[tab.id] = tab.url;
}

browser.tabs.onCreated.addListener(handleCreated);

然后,您必须订阅onUpdated事件以跟踪您打开的标签的先前网址。 https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/onUpdated

function handleUpdated(tabId, changeInfo, tabInfo) {
  if (changeInfo.url && tabUrls[tabId] != null) {
    tabUrls[tabId] = changeInfo.url;
  }
}

browser.tabs.onUpdated.addListener(handleUpdated);

然后您必须订阅https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/onRemoved以删除您已关闭的标签页。

function handleRemoved(tabId, removeInfo) {
  tabUrls[tabId] = null;
}

browser.tabs.onRemoved.addListener(handleRemoved);

要在浏览器(重新)启动时保持这些更改,您需要在创建,更新或删除选项卡时使用tab.rorage.local保存tabUrls变量(没有tabIds):

function updateStorage(){
  browser.storage.local.set("urlValues", Object.values(tabUrls)); // Store URLs without tab ids. They will probably not be the same after a restart or quit, you can only assume the urls are correct
}

后续步骤:

  • 在初始化background.js时从本地存储中读取(只需调用background.js中的函数,您可以调用该函数init或类似的东西),检查当前任何URL是否与那些存储的URL匹配或开始网址。如果未找到匹配项,则应打开该URL。
  • 在打开所有必需选项卡后一秒钟或更短时间内删除onUpdated侦听器,以防止用户导航影响您的逻辑

您可以使用webRequest https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest查看您请求的网页是否为重定向(statusCode = 302或301 - 请参阅https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webRequest/onHeadersReceived