检测浏览器扩展程序是在Chrome还是Firefox上运行的最佳做法?

时间:2017-08-31 15:31:28

标签: javascript google-chrome firefox google-chrome-extension firefox-webextensions

我已经编写了Chrome扩展程序,我正在将其迁移到Firefox和Edge等其他浏览器。但是,与Chrome的API相比,Firefox上的WebExtensions API存在一些差异。

所以我必须检测是否应该使用回调式API(在Chrome中,以及在Edge中)或承诺式API(在Firefox中)。

例如:

if(RUNNING_ON_CHROME)
    chrome.permissions.request({
        permissions: ...,
        origins: ...,
    }, function(result) { // callback-style
        ...
    });
else // running on firefox
    browser.permissions.request({
        permissions: ...,
        origins: ...,
    }).then(function(result) { // promise-style
        ...
    });

我想知道如何执行RUNNING_ON_CHROME测试。我应该检查UserAgent中的相关字符串,还是检查browser!==undefined

PS。 Edge使用browser.* API,但其API是回调样式。

1 个答案:

答案 0 :(得分:4)

截至目前,您可以依靠browserchrome

function getBrowser() {
  if (typeof chrome !== "undefined") {
    if (typeof browser !== "undefined") {
      return "Firefox";
    } else {
      return "Chrome";
    }
  } else {
    return "Edge";
  }
}

一方面,每次要调用API时都要使用它,这将充满了样板;您可以填充其中一个(例如,使用webextension-polyfill在Chrome中获取browser)并仅使用一个。

另一方面,实现中存在实际差异(即使您获得相同的签名),因此您需要使用上述浏览器检测来分离某些逻辑。