【问题标题】:The best practice to detect whether a browser extension is running on Chrome or Firefox? [duplicate]检测浏览器扩展是否在 Chrome 或 Firefox 上运行的最佳实践? [复制]
【发布时间】:2018-02-09 15:08:38
【问题描述】:

我编写了一个 Chrome 扩展程序,并将其迁移到其他浏览器,如 Firefox 和 Edge。但是,Firefox 上的 WebExtensions API 与 Chrome 的 API 有一些不同。

所以我必须检测我应该使用回调风格的 API(在 Chrome 中,以及在 Edge 中)还是 Promise 风格的 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 是回调样式的。

【问题讨论】:

  • 最佳实践可以因人而异。
  • 你能做类似browser = browser || chrome的事情吗?
  • @freginold 不,因为它们有不同的签名。不过,Mozilla 维护了一个 polyfill。
  • @freginold 他们的 API 有一些不同。就像我的问题中的代码一样,Chrome 使用回调,而 Firefox 使用 Promise。 Mozilla 确实有一个 polyfill for it,但它对于我的扩展来说太重了。
  • @xmcp 定义“太重量级”。毕竟,您不是通过网络加载脚本,因此大小影响较小..

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


【解决方案1】:

截至目前,您可以依赖browserchrome

(自从切换到基于 Chromium 的引擎后,不再用于检测 Edge)

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

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

另一方面,在实现上存在真正的差异(即使你得到相同的签名),所以你需要上面的浏览器检测来分离一些逻辑。

【讨论】:

  • 您可能想提一下,Firefox 原生支持使用 chrome.* 命名空间和回调。因此,Chrome 和 Firefox 之间最简单的代码兼容性就是在两者中都使用 chrome.*。如果真的想要使用Promises,你只需要使用browser.* polyfill。
  • @Makyen Edge 在问题中被明确提及。
  • 但是,在 Edge 中他们仍然使用回调。因此,您通常可以在 Edge 中使用别名 chrome = browser。但是,我没有在 Edge 中进行过广泛的测试,因为我所做的测试(年初)表明扩展支持对于合理的开发来说太不稳定了(也就是说,它在后面很痛苦,而且我没有令人信服的商业理由)。
  • 这个答案不再有效,因为 Edge 现在共享 Chrome API:blogs.windows.com/windowsexperience/2018/12/06/…
猜你喜欢
  • 2013-07-19
  • 1970-01-01
  • 2018-03-31
  • 2011-11-05
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
相关资源
最近更新 更多