使用 chrome.tabs 与 browser.tabs 以获得浏览器兼容性

Using chrome.tabs vs browser.tabs for browser compatibility

我正在将我的 Chrome 扩展移植到 Firefox。

根据 MDN,有一个 browser.tabs API 应该被 chrome 支持。

但是 browser 不是 Chrome 稳定版中的对象。 同时 chrome.tabs 在 Firefox 中工作得很好。

阅读 MDN 文档时将 browser 替换为 chrome 是否安全? 文档写 browser 的原因是什么?是否有计划中的变化?

注意: 在过去的几天里,许多 MDN JavaScript API 页面已从使用 chrome.* 更改为使用browser.* 并描述 browser.* 接口提供的承诺。这些更改使页面根本没有提及使用 API 作为 chrome.*。这些更改是由项目中的同一个人进行的,我曾与之讨论过从 browser.*chrome.* 的更改。我还不知道发生了什么。我已经给他发了邮件询问这些变化的原因。截至 2016 年 11 月 2 日的这次编辑,现在期待他的回应还为时过早。


我没有参与 API 的工作。但是,我已经并且将对 API 文档进行一些更改,特别是关于 WebExtensions chrome.*browser.*(所有页面都更改为显示 chrome.* 作为2016-09-22)。我参与其中是因为我还发现大多数 WebExtensions API 页面显示 browser.* 令人困惑。我想知道 chrome.*browser.* 之间有什么区别。一旦我发现了,我想让其他人不那么困惑。

WebExtensions browser.* API returns a promise:

当您调用 API 时,browser.* 对象实现了 the API that returns a promise if you omit providing a callback function 的一个版本。目的是 chrome.*browser.* 的实际功能相同。如果您向 browser.* API 提供回调函数,它的功能与 chrome.* API.

相同

Is it safe to replace browser with chrome when reading the MDN docs?

是的,除非文档专门讨论承诺。两者之间的唯一区别是,如果在调用 API.

时未提供回调函数,browser.* 方法将 return 一个承诺

What is the reason for the docs to write browser?

我不确定为什么最初编写这些文档时 browser.* 如此突出。我假设这是在生成页面时做出的配置选择,或者 chrome.*browser.* 之间的区别的细节在实施 WebExtensions API 的早期某个时候发生了变化.

Is there a technical reason why chrome.* without a callback can't return a promise?

到目前为止我想出的唯一原因是使用 chrome.* 到 return promises 将无法在执行参数检查时检查是否存在强制回调函数API。使用 browser.* 命名空间,API 可以假设调用者正在使用 returned 承诺。因此,使用 browser.* 可以 return 编辑 promise 而不是在调用 API 时未提供强制回调函数时生成错误。然而,这个原因是我的猜测。

更改文档:

我同意让 API 文档主要在语法部分和每个 API 页面的其他地方显示 browser.* 是令人困惑的(例如在示例中)。在过去的 3 周里,我一直在与主要负责 WebExtensions 文档的人讨论在整个 API 文档中更改此内容。他同意应该改变它。

有计划进行更改。文档将至少分两个阶段进行更改。首先是浏览所有 WebExtensions API 页面并将语法部分更改为 chrome.*。语法部分末尾的注释会说 "API is also available as browser.* in a version that returns a promise." 此外,整个页面中 browser.* 的所有用法都将更改为 chrome.* 除了那些特别显示 API 被用作 return 承诺。

目前的期望是页面看起来很像 alarms.clear() 现在的样子。我更改了该页面以显示我建议的更改内容,包括 WebExtensions 文档负责人的建议。 alarms.clear() 语法部分目前看起来像:

最初(3 周前,2016-08-25),我将 API 页面从 alarms.clear() through browserAction.enable() 更改为主要更改,将内容从 browser.* 移动到chrome.* 当我在 MDN 上进行更改的权限由于其自动垃圾邮件过滤而被禁用时。这导致了对更改将采用的格式的讨论。我暂停了更改,希望一旦选择了语法框的中间格式,就可以一次性完成初始更改。由于现实生活,双方的讨论时间比我预期的要长。

看起来关于将要使用的确切格式的讨论将扩大到包括 dev-mdc mailing list due to the "correct" format for Syntax boxes not being clear in the Mozilla documentation for how to write an API method page

不过,我相信我可以继续进行更改,显示 chrome.* 而不是 browser.*。这样做可能会导致必须再次编辑页面以使格式成为最终确定为官方格式的格式。在最终确定语法块格式之前将 browser.* 更改为 chrome.* 可能会导致更多的整体工作,但会在讨论格式更改的最终版本时减少混淆。虽然我必须逐页进行这些更改(有一个 API 用于进行批量更改,但我没有访问权限),但我已经实现了一个脚本来进行大部分所需的更改。因此,这些初始的应该不会花太长时间。

更新:
我已经更改了所有 WebExtensions JavaScript API 页面以显示 chrome.* 而不是 browser.*。您可能需要在每个页面上按 Ctrl-F5 才能看到更改。

进一步更改,更清楚地提供有关 browser.* 的文档:
在对语法块格式进行全面更改后,希望在以后进行其他更改,以每 API 页为基础提供更多使用 [=10] 之间差异的示例=] 和 browser.*。这几乎肯定是一个长期项目。