隐身模式实现

此页面提供了 Firefox 中隐身模式工作原理的高级概述,主要帮助理解如何测试此功能。

实现

manifest.json 中的 incognito 值支持 spanningnot_allowed。另一个值 split 可能在将来得到支持。默认值为 spanning,但是,默认情况下不允许访问私密窗口。用户必须在 about:addons 中为每个扩展启用支持。

在内部,这作为名为 internal:privateBrowsingAllowed 的隐藏扩展权限来处理。禁用或卸载扩展时,此权限将重置。可以通过几种方式访问此权限

  • extension.privateBrowsingAllowed

  • context.privateBrowsingAllowed(参见 BaseContext)

  • WebExtensionPolicy.privateBrowsingAllowed

  • WebExtensionPolicy.canAccessWindow(DOMWindow)

测试

测试的目的是确保来自私密浏览会话的数据在未经许可的情况下无法被扩展访问。

在 Firefox 67 中,此功能最初将被禁用,但目的是在 67 中启用此功能。控制此功能的 pref 为 extensions.allowPrivateBrowsingByDefault。当此 pref 为 true 时,所有扩展都可访问私密浏览,并且清单值 not_allowed 将产生错误。要为测试启用 incognito.not_allowed,必须将 pref 切换为 false。

测试 EventManager 事件

这通常最容易通过使用具有权限的扩展运行测试来处理,在调用 ExtensionTestUtils.loadExtension 时使用 incognitoOverride: spanning。然后,您可以使用第二个没有权限的扩展来尝试捕获通常会传递的任何事件。

如果事件可以在没有扩展产生的调用的情况下发生,您还可以使用 BrowserTestUtils 打开私密窗口,并使用无权限扩展对其运行测试。

head.js 中有两个实用函数,getIncognitoWindow 和 startIncognitoMonitorExtension,它们对于一些基本测试很有用。

示例:browser_ext_windows_events.js

测试 API 调用

这很容易使用没有权限的扩展来完成。如果您需要窗口或标签页的 ID,请使用 getIncognitoWindow。在大多数情况下,当无法访问窗口时,API 调用应该抛出异常。在某些情况下,API 调用明确不抛出异常。

示例:browser_ext_windows_incognito.js

窗口与标签页的私密性

Android 目前不支持私密窗口。当标签页可用时,测试应优先选择标签页而不是窗口。

  • PrivateBrowsingUtils.isBrowserPrivate(tab.linkedBrowser)

  • PrivateBrowsingUtils.isContentWindowPrivate(window)

当 WebExtensionPolicy 方便使用时,您可以直接检查窗口访问权限

  • policy.canAccessWindow(window)