致 Firefox 3 开发者 - Mozilla

致 Firefox 3 开发者
===============

如果你是一个 Web 开发人员，并且希望了解 Firefox 3 中所有的新特性，这里是一个很好的起点。这篇文章提供了一个覆盖所有 Firefox 3 新特性的列表。虽然他并不是能够包括所有微小的改动，但他能够帮助你学习到最主要的更新。

### Firefox 3 中新的开发人员特性

#### 对网站和程序开发者

更新 WEB 应用以适应 Firefox 3

提供了你用于更新 WEB 应用以受益于 Firefox 3 新特性所需的信息。

上线与离线事件

Firefox 3 支持 WHATWG 的上线与离线事件，基于这一特性，程序可以检测当前是否有可用的互联网联接以及何时上线或下线。

跨域的 XMLHttpRequest 请求

Firefox 3 支持W3C Access Control工作草案，使你有能够使用XMLHttpRequests检索和操作其他站点的数据；使你能够创造令人印象深刻的以浏览器为基础的交互式应用（mashups）。

交错格式样表

Firefox 3 支持 CSS 层叠式样式表 API.

基于 web 的协议处理

你现在可以使用 `navigator.registerProtocolHandler()` 方法注册 web 应用

在画布（canvas）中“绘”出文字

你可以使用 Firefox 3 支持的非标准 API 在 canvas 上绘制文字。

支持画布变换

Firefox 现在的 canvas 支持 `transform()` 和 `setTransform()` 方法。

使用微格式

Firefox 现在有一组微格式的 API。

拖放事件

Firefox 3 支持新的拖放事件，当拖放开始和结束时，该事件将会被发送至源节点。

HTML 的焦点管理

新的 HTML 5 支持 activeElement 和 hasFocus 属性

离线浏览

在 Firefox 中，WEB 程序现在可以在离线时使用之前被缓存的资源。

在 Firefox 3 中 CSS 的改进

Firefox 3 在支持 CSS 的功能上进行了一些完善。

在 Firefox 3 中 DOM 的改进

Firefox 3 在 Firefox3 DOM 执行方面提供了一些新的功能，包括支持一些扩展的浏览器的 DOM。

JavaScript 1.8 的支持

Firefox 3 提供了 JavaScript 1.8 标准的支持。

EXSLT 支持

Firefox 3 提供了对 EXSLT（ XSLT的扩展）一个基本子集个支持。

Firefox 3 中 SVG 的改进

Firefox 3 对 SVG 的支持有了长足的改进：支持二十余个新透镜、一些新元素、一些新属性以及一些其他改进。

对 PNG 动画的支持

Firefox 3 提供了对色彩艳丽的 PNG (APNG) 图像格式的支持。

`<a ping>`

`现在可以使用 <a ping>` 功能 ping 一个 URL ,并且此功能默认启用。

#### 对 XUL 和扩展插件的开发者

提供了你需要做的事情的向导，更新你的 Firefox 3 扩展。

更新扩展以兼容 Firefox 3

FUEL 使扩展开发者完成更有成效，更精悍的 XPCOM 规范代码并获得一些 "模式" JavaScript 思想。

Firefox 3 在 XUL 上的改进

Firefox 3 的提供了一些新的 XUL 元素，包括新的缩放法，日期和时间获取，以及旋转按钮。

Firefox 3 的模板

Firefox 3 的模板已显着改善。关键的改进是，允许使用自定义查询处理器，除数据源之外还可以使用 RDF。

嵌入的 XBL 绑定

现在，你可以使用 data: 网络协议直接嵌入 XBL 绑定，而不是在单独的 XML 文件中使用他们。

本地化扩展描述

这可让本地化的详细信息在附加组件被下载时或被禁用即时生效。

可靠更新

In order to provide a more secure add-on upgrade path for users, add-ons are now required to provide a secure method for obtaining updates before they can be installed. Add-ons hosted at AMO automatically provide this. Any add-ons installed that do not provide a secure update method when the user upgrades to Firefox 3 will be automatically disabled. Firefox will however continue to check for updates to the extension over the insecure path and attempt to install any update offered (installation will fail if the update also fails to provide a secure update method).

Idle service

Firefox 3 offers the new `nsIIdleService` interface, which lets extensions determine how long it's been since the user last pressed a key or moved their mouse.

全屏缩放

Firefox 3 improves the user experience by offering full page zoom in addition to text-only zoom.

Interfacing with the XPCOM cycle collector

XPCOM code can now take advantage of the cycle collector, which helps ensure that unused memory gets released instead of leaking.

The Thread Manager

Firefox 3 provides the new `nsIThreadManager` interface, along with new interfaces for threads and thread events, which provides a convenient way to create and manage threads in your code.

JavaScript 模块

Firefox 3 now offers a new shared code module mechanism that lets you easily create modules in JavaScript that can be loaded by extensions and applications for use, much like shared libraries.

Places

The history and bookmarks APIs have been completely replaced by the new Places API.

Making the transition to Places

An article about how to update an existing extension to use the Places API.

Firefox 3 中下载管理器的改进

The Firefox 3 Download Manager features new and improved APIs, including support for multiple progress listeners.

Using nsILoginManager

密码管理已经被新的登录管理所代替。

Using content preferences

Firefox 3 includes a new service for getting and setting arbitrary site-specific preferences that extensions as well as core code can use to keep track of their users' preferences for individual sites.

Notable bugs fixed in Firefox 3

文章中所提供的相关 Bug 信息，已经在 Firefox 3 中进行了修改。

Firefox 3 的界面改动

Notes and information of use to people who want to create themes for Firefox 3.

### 最终用户将能体验到的新特性

#### 用户体验

* **更轻松的密码管理。** 当你成功登陆之后在浏览器顶端会出现一个信息栏，提示你是否保存此口令。
* **附件组件安装更简便。** 你可以更容易的通过第三方下载附件组件并安装它。
* **新的下载管理器。** 新的下载管理器使你更容易的定位下载文件。
* **断点下载。** 现在可以在重启浏览器或重新获得网络连接时继续尚未完成的下载任务。
* **全屏缩放。** 今后，你可以使用菜单或快捷键，可以缩放整个网页的内容——这个比例取决除了文字排版，还取决于更合适的图片排版。
* **标签滚动和快捷菜单。** 通过新的标签滚动和标签快捷菜单可以更容易的定位标签。
* **保存你当前的浏览内容。** 当你退出 Firefox 3 时，Firefox 3 会提示你是否保存当前标签。
* **优化的标签打开方式。** 在标签中打开一个书签文件夹时，会创建一个新标签二不是覆盖现有的。
* **轻松更改搜索引挚工具框的大小和位置。** 你可以简单的通过一个拖动鼠标改变搜索引擎工具栏和地址栏的分布。
* **改进了文本选择。** 使用 Crtl (Macintosh 的 Command) 键选择多块文本。双击可以选中个词（中文为一句）三击选中一段。
* **查找工具。** 查找工具以当前选中内容为默认查找内容。
* **扩展管理。** 用户可以在附件组件管理器中单独显示插件。
* **与 Windows Vista 的整合**。火狐菜单用一个 Vista 本地主题显示。
* **与 Mac OS X 的整合**。Firefox 现在使用 Mac OS X 拼写检查器并使用 Growl 来通知下载完成或有可用更新。
* **星按钮。** 地址栏上的“星”按钮使你通过一个点击添加一个新书签。一次双击保存并编辑你的新书签。
* **标签。** 可以为你的书签指定关键词，并按主题排序。
* **地址栏和自动地址补全。** 在地址栏键入页面标题或标签可以快速找到你在书签中的或是历史页面。图标、书签、标签可以帮助你判断结果的来源。
* **智能书签菜单。** Firefox 的智能书签会按照最新，访问频率来排序书签。
* **书签和历史管理器。** 书签和历史管理统一起来，让你可以通过多视图、按照频率组织的智能分组方便的同时检索书签及历史。
* **基于 Web 的协议处理。** 网络应用，比如你最喜欢的电子邮件提供商可以代替本地邮件应用来处理 `mailto:` 链接。对于其他也提供相似的支持。 (注意网络应用需要向火狐注册)
* **易于使用的下载。** 一个新的引用界面提供高级选项来配置对不同文件类型及协议策略的处理方案。
* **改进的浏览器外观。** 新的图形及字体处理方案使网页在你的屏幕上显示的更漂亮。包括清晰的文字渲染、连体字、复杂文字的更好支持。另外 Mac 及 Linux (Gnome) 用户会发现 Firefox 感觉起来更像他们本地的应用或平台一样。
* **支持颜色设置。** 通过设置 在 `about:config` 的 `gfx.color_management.enabled` 优先级，你可以要求 Firefox 的按照新的配置文件中对图像的颜色进行调整，以符合你电脑的显示器。
* \*\*支持离线浏览。\*\*即使你没有 Internet 连接，Web 应用程序仍可使用。

#### 安全和隐私

* **一键网站信息。** 想知道更多关于你所访问网站的信息？点击该网站的图标，在地址栏中看看是谁拥有它。信息更易理解。
* \*\*恶意软件防护。\*\*如果你访问了一个已知的安装病毒，间谍软件，木马，或其他危险软件（也称为恶意软件）的网站 Firefox 3 会警告你。你可以点这里看看警告是怎样的。
* **伪造网站保护加强。** 现在，当你访问的网站被怀疑是伪造时，会出现一个特殊的网页。点击这里看看是什么样子。
* **更容易理解的 SSL 错误**。遇到无效的 SSL 证书时会包含清楚的错误描述，使其更易于理解是哪里发生了问题。
* **过期附件组件防护。** 现在 Firefox 3 的自动检查插件和插件版本并禁用过时的，不安全的版本。
* **安全附件更新**。附件更新安全性提高了，不允许使用不安全的更新机制。
* **防病毒一体化。** Firefox 3 在下载文件的同时通知的反病毒软件。
* **Windows Vista 的家长控制功能的支持。** Firefox 3 的支持 Vista 的全系统家长控制，禁用文件下载。

#### 性能

* \*\*可靠性。\*\*Firefox 3 使用安全的数据库格式保存书签，历史记录，cookies，及偏好。这意味着，即使系统崩溃，你的数据也免受损失。
* **速度。** Firefox 3 有了较大的性能提升，完全取代了部分软件：包括图形屏幕处理，以及页面布局工作的处理等。
* **更少的内存占用。** Firefox 3 的内存使用比以往任何时候都有效，有超过 300 个内存“泄漏”漏洞得以修复，以及可帮助自动查找和处置泄漏内存的新功能被添加进来。
### 参见

* 对 Firefox 3 的扩展进行更新
* 对 Firefox 3 的 Web 应用进行更新
* Firefox 2 for developers
* Firefox 1.5 for developers


Firefox 24 for developers - Mozilla

Firefox 24 for developers
=========================

Web 开发者需要注意的变化
--------------

### Developer Tools

### HTML

### JavaScript

* 箭头函数不再默认处于严格模式，除非显式使用 `"use strict"`。（Firefox bug 852762）
### DOM

### MathML

参见
--

* Firefox 24 Aurora Notes
* Firefox 24 网站兼容性
### 更早版本

* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Firefox 32 for developers - Mozilla

Firefox 32 for developers
=========================

普通 Web 开发者应该注意的变化
-----------------

### 开发者工具

Highlights:

* Web Audio Editor
* Code completion and inline documentation in Scratchpad
* User agent styles in the Inspector's Rules view
* Element picker button has moved
* Node dimensions added to the Inspector's infobar
* Full page screenshot button added
* HiDPI images added to the tools
* Nodes that have `display:none` are shown differently in the Inspector

All devtools bugs fixed between Firefox 31 and Firefox 32.

### CSS

* 默认开启 `mix-blend-mode` (Firefox bug 952643)。
* 在正式版本中默认开启 `position:sticky` (之前只在 Nightly 和 Aurora 版本中才会开启) (Firefox bug 916315)。
* implement box-decoration-break: Left/right part of a box-shadow should only be drawn on the first/last continuation of an inline box (Firefox bug 613659).
* 允许 `flex-grow` / `flex-shrink` 在 0 和非 0 值之间作 transition , like 'flex-grow: 0.6'(Firefox bug 996945).
### HTML

* Experimentally implemented, behind a pref, `<img>` `srcset` property, To activate it set `dom.image.srcset.enable` to `true` (Firefox bug 870021).
* **id** and **class** are now true global attributes and also apply to XML elements, in a namespace or not (Firefox bug 741295).
### JavaScript

* The following new ECMAScript 2015 built-in methods got implemented:
* `Array.from()` (Firefox bug 904723),
* `Array.prototype.copyWithin()` (Firefox bug 934423),
* `Number.isSafeInteger()` (Firefox bug 1003764).
### Interfaces/APIs/DOM

* 实现了 `navigator.languages` (en-US) 属性和 languagechange (en-US) 事件。 (Firefox bug 889335)。
* The `Navigator.vibrate()` method behavior has been adapted to the latest specification: too long vibrations are now truncated (Firefox bug 1014581).
* `KeyboardEvent.getModifierState` (en-US)() 和 `MouseEvent.getModifierState` (en-US)() 支持了 "Accel" 虚拟修饰符 (Firefox bug 1009388)。
* 实现了 `KeyboardEvent.code` 属性，不过目前在正式版本中还是禁用状态 (Firefox bug 865649)。
* Scoped selectors for `Document.querySelector()` and `Document.querySelectorAll()`, for example `querySelector(":scope > li")`have been implemented (Firefox bug 528456).
* The experimental implementation of the `Document.timeline` interface, related to the Web Animation API, has been added (Firefox bug 998246). It is controlled by `layout.web-animations.api.enabled` preference, enabled only on Nightly and Aurora for the moment.
* The Data Store API has been made available to Web Workers (Firefox bug 949325). It still is only activated for certified applications.
* The ServiceWorker (en-US) `InstallPhaseEvent` and `InstallEvent` interfaces have been implemented (Firefox bug 967264).
* The MSISDN Verification API, only activated for privileged apps, has been added (Firefox bug 988469).
* The Gamepad API is now supported on Firefox for Android (Firefox bug 852935).
* To match the spec and the evolution of the CSS syntax, minor changes have been done to `CSS.escape()`. The identifier now can begins with `'--'` and the second dash must not be escaped. Also vendor identifier are no more escaped. (Firefox bug 1008719)
* To complete our Hit Regions implementation, `MouseEvent.region` has been implemented (Firefox bug 979692).
* The `CanvasRenderingContext2D.drawFocusIfNeeded()` method is now enabled by default (Firefox bug 1004579).
* The `Navigator.doNotTrack` properties now returns `'1'` or `'0'`, reflecting the HTTP value, instead of `'yes'` or `'no'` (Firefox bug 887703).
* XMLHttpRequest.responseURL was implemented (Firefox bug 998076).
### MathML

* 实现了 menclose 标记 `phasorangle`。
### SVG

*No change.*

### WebRTC

* New constraints for WebRTC's `getUserMedia()`, `width`, `height`, and `framerate`, have been added, to limit stream dimensions and frame rate (Firefox bug 907352):
```

{
  mandatory: {
    width: { min: 640 },
    height: { min: 480 }
  },
  optional: [
    { width: 650 },
    { width: { min: 650 }},
    { frameRate: 60 },
    { width: { max: 800 }},
  ]
}
```

* WebRTC methods which previously used callback functions as input parameters are now also available using JavaScript promises.
### Audio/Video

*No change.*

Security
--------

* Privileged code now gets Xray vision for JavaScript `Object` and `Array` instances (en-US).
附加组件 和 Mozilla 开发者应该注意的变化
-------------------------

Xray vision is now applied to JavaScript objects that are not themselves DOM objects: Xrays for JavaScript objects (en-US).

A `getDataDirectory()` method has been added to `Addon` instances. This method returns the preferred location, within the current profile, for add-ons to store data.

### Add-on SDK

#### Highlights

* Added `exclude` option to `PageMod`.
* Added `anonymous` option to `Request`.
* Add-on Debugger now includes a Console and a Scratchpad.

#### Details

GitHub commits made between Firefox 31 and Firefox 32. This will not include any uplifts made after this release entered Aurora.

Bugs fixed between Firefox 31 and Firefox 32. This will not include any uplifts made after this release entered Aurora.

### XPCOM

* The `nsIUDPSocket` interface now provides multicast support through the addition of the new `nsIUDPSocket.multicastLoopback`, `nsIUDPSocket.multicastInterface`, and `nsIUDPSocket.multicastInterfaceAddr` attributes, as well as the `nsIUDPSocket.joinMulticast()` and `nsIUDPSocket.leaveMulticast()` methods.
参见
--

* Site Compatibility for Firefox 32
### Older versions

* Firefox 31 for developers
* Firefox 30 for developers (en-US)
* Firefox 29 for developers (en-US)
* Firefox 28 for developers (en-US)
* Firefox 27 for developers
* Firefox 26 for developers
* Firefox 25 for developers
* Firefox 24 for developers
* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Firefox 65 for developers - Mozilla

Firefox 65 for developers
=========================

本文提供了有关 Firefox 65 中将影响开发者的更改信息。Firefox 65 是当前的 Nightly 版本, 将于 2019 年 1 月 29 日发布。

为网页开发者带来的改变
-----------

### 开发者工具

#### 移除

### HTML

事件现在可以在禁用状态下的 HTML 元素上进行分发，如设置了 `disabled` 属性的 `<button>`, `<fieldset>`, `<input>`, `<select>`，和 `<textarea>` (Firefox bug 329509)。

#### 移除

### CSS

* 已去除 `image-rendering` 属性的 `crisp-edges` 值的前缀 (Firefox bug 1496617) 。
* `scrollbar-color` 的 `auto` 值现在现在被解析为 `auto`，而不是两种颜色 (Firefox bug 1501418)。

#### 移除

* `layout.css.shape-outside.enabled` 设置已被移除；`shape-outside`, `shape-margin`，和 `shape-image-threshold` 不再支持关闭 (Firefox bug 1504387)。
* Firefox 用户`user-select`的几个仅限的属性已被删除：`-moz-all`, `tri-state`, `element`, `elements`, 和 `toggle`. Firefox 仅限 `-moz-text` 属性仍在内部使用，故只是在 Web 内容中禁用 参见 Firefox bug 1492958.
### SVG

*无变化。*

#### 移除

### JavaScript

#### 移除

### APIs

*无变化。*

#### 新的 APIs

#### DOM

* `Performance.toJSON()` has been exposed to Web Workers (Firefox bug 1504958).
* `XMLHttpRequest` requests will now throw a `NetworkError` if the requested content type is a `Blob`, and the request method is not `GET` (Firefox bug 1502599).

#### DOM events

* Going forward, only one `Window.open()` call is allowed per event (Firefox bug 675574).

#### Service workers

* The `Response.redirect()` method now correctly throws a `TypeError` if a non-valid URL is specified as the first parameter (Firefox bug 1503276).
* The `ServiceWorkerContainer.register()` and `WorkerGlobalScope.importScripts()` (when used by a service worker) methods will now accept any files with a valid JavaScript MIME type (Firefox bug 1354577).

#### Media, Web Audio, 和 WebRTC

* 增加了对 WebP Google 压缩图像文件的支持 (bug 1294490) 。

#### Canvas 和 WebGL

#### 移除

* Mutation events (en-US) 在 shadow trees 上已经被禁用 (Firefox bug 1489858).
* The non-standard `MediaStream` property `currentTime` has been removed (Firefox bug 1502927).
* The obsolete `BasicCardRequest.supportedTypes` property is no longer supported by the Payment Request API; instead of requiring the web app or site to figure out what type of card is being used, it's now the server's job to deal with it (Firefox bug 1504032).
### 安全

*无变化。*

#### 移除

### 插件

*无变化。*

#### 移除

### 其他

*无变化。*

#### 移除

为附加组件开发者带来的改变
-------------

### API 变化

#### 移除

### Manifest 变化

#### 移除

更早期的版本
------

* Firefox 65 for developers
* Firefox 64 for developers (en-US)
* Firefox 63 for developers (en-US)
* Firefox 62 for developers (en-US)
* Firefox 61 for developers (en-US)
* Firefox 60 for developers (en-US)
* Firefox 59 for developers
* Firefox 58 for developers (en-US)
* Firefox 57 for developers (en-US)
* Firefox 56 for developers (en-US)
* Firefox 55 for developers (en-US)
* Firefox 54 for developers (en-US)
* Firefox 53 for developers (en-US)
* Firefox 52 for developers (en-US)
* Firefox 51 for developers (en-US)
* Firefox 50 for developers (en-US)
* Firefox 49 for developers (en-US)
* Firefox 48 for developers (en-US)
* Firefox 47 for developers (en-US)
* Firefox 46 for developers (en-US)
* Firefox 45 for developers (en-US)
* Firefox 44 for developers (en-US)
* Firefox 43 for developers (en-US)
* Firefox 42 for developers (en-US)
* Firefox 41 for developers
* Firefox 40 for developers (en-US)
* Firefox 39 for developers (en-US)
* Firefox 38 for developers (en-US)
* Firefox 37 for developers (en-US)
* Firefox 36 for developers (en-US)
* Firefox 35 for developers (en-US)


Firefox 22 for developers - Mozilla

Firefox 22 for developers
=========================

Web 开发者需要注意的变化
--------------

### HTML

* 实现了 HTML5 中的`<data>`元素 (Firefox bug 839371).
* The HTML5 `<time>` element has been implemented (Firefox bug 629801).
* The `range` state of the `<input>` element (`<input type="range">`) has been implemented, behind the preference `dom.experimental_forms_range`, only enabled by default on Nightly and Aurora channel (Firefox bug 841948).
* The support for the `<template>` element, part of the Web component specification has been implemented (Firefox bug 818976).
### JavaScript

* Asm.js optimizations are enabled, making it possible to compile C/C++ applications to a subset of JavaScript for better performance.
* 实现了 ES6 中的箭头函数(Firefox bug 846406).
* The new Object.is function has been added (Firefox bug 839979).
* `arguments` in generator expressions is now inherited from enclosing lexical scope (Firefox bug 848051).
* The ES2015 Proxy `preventExtensions` trap have been implemented (Firefox bug 789897).
### DOM

* 不再支持 `XMLHttpRequest` 中的 `multipart` 属性和 `multipart/x-mixed-replace` 响应。这是一个 Gecko 独有的特性，从来没被标准化过。你可以使用Server-Sent Events, Web Sockets (en-US)或者在 progress 事件中查看 `responseText` 属性的变化来实现同样的效果。
* 实现了Web Notifications (Firefox bug 782211).
* `FormData`对象的`append`方法现在开始接受第三个参数`filename`(Firefox bug 690659).
* 移除了`Node.isSupported`方法 (Firefox bug 801562).
* `Node.setUserData` and `Node.getUserData` has been removed for web content and are deprecated for chrome content (Firefox bug 842372).
* The `Element.attributes` property has been moved there from `Node` as required by the spec (Firefox bug 844134).
* 实现了 Mac OS X 中的`Ambient Light Events`后端。
* Elements in the HTML namespace with local names `<bgsound>`, `<multicol>`, and `<image>` no longer implement the `HTMLSpanElement` interface. `<bgsound>` implements `HTMLUnknownElement` and `<image>` implements `HTMLElement`.
* The `NodeIterator.detach` (en-US) method has been changed to do nothing (Firefox bug 823549).
* The `BlobEvent` (en-US) interface has been implemented (Firefox bug 834165).
* The properties `HTMLMediaElement.crossorigin` and `HTMLInputElement.inputmode` has been removed to match the spec in `HTMLMediaElement.crossOrigin` and `HTMLInputElement.inputMode`, respectively (Firefox bug 847370 and Firefox bug 850346).
* WebRTC: the Media Stream API and Peer Connection API are now supported by default.
* Web Components: the `Document.register` method has been implemented (Firefox bug 783129).
* The `ProgressEvent.initProgressEvent()` (en-US) constructor method has been removed. Uses the standard constructor, `ProgressEvent()` to construc and initialize `ProgressEvent` (Firefox bug 843489).
* Manipulated data associated with a `cut`, `copy`, or `paste` event can now be accessed via the `ClipboardEvent.clipboardData` property (Firefox bug 407983).
* The `HTMLTimeElement` (en-US) interface has been implemented (Firefox bug 629801).
* When a `Worker` constructor is passed an invalid URL, it now throws `DOMException` of type `SECURITY_ERR` (Firefox bug 587251).
### CSS

* Support for CSS Flexbox layout (en-US) has been enabled by default (Firefox bug 841876).
* Following a spec change, the initial value for `min-width` and `min-height` has been changed back to `0`, even on flex items (Firefox bug 848539).
* Support for CSS Conditionals (`@supports` and `CSS.supports`) has been enabled by default (Firefox bug 855455).
* Support for `background-clip` and `background-origin` properties in the `background` shorthand has been implemented (Firefox bug 570896).
附加组件和 Mozilla 开发者需要注意的变化
------------------------

* 移除了下面这些方法中的`properties`参数：`nsITreeView.getCellProperties()`, `nsITreeView.getColumnProperties()` and `nsITreeView.getRowProperties()` methods of `nsITreeView`. These methods should now return a string of space-separated property names. (Firefox bug 407956)
* The `inIDOMUtils.getCSSPropertyNames()` method has been implemented and will return all supported CSS property names.
* See here for more changes.
### Firefox Developer Tools

* Font inspector shows which fonts on your computer are applied to the page.
* Visual paint feedback mode shows when and where a page is repainted.
* The dev tools may now be docked to the right side, not just the bottom of the browser.
* Some panes within the dev tools have switched from XUL to HTML. For example, the css rule viewer is now chrome://browser/content/devtools/cssruleview.xhtml, not `cssruleview.xul`. Instead of adding an overlay directly to extend features of these panes, you may add an overlay and script to the outer xul document, to add load listeners and change these html documents.
* The stack trace is now shown as a breadcrumb near the top, and the script listing is now at the left panel of the debugger.
参见
--

* Firefox 22 Aurora Release Notes
* Site Compatibility for Firefox 22
* Add-on Compatibility for Firefox 22
### Older versions

* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Firefox 26 for developers - Mozilla

Firefox 26 for developers
=========================

Web 开发者需要注意的变化
--------------

### CSS

* `text-decoration-line` 属性仍然带有前缀，不过现在它把 `'blink'` 也看看成了它的合法属性值，虽然并不会真正的让内容产生闪烁效果 (Firefox bug 812995).
* 非标准的 `-moz-text-blink` 属性已被删除 (Firefox bug 812995).
* 实现了 CSS Image Values Level 4 中的 `image-orientation` 属性，比起 Level 3, Level 4 增加了对 `from-image` 关键字和 EXIF 的支持。
* 支持了 `position:sticky`，需要开启 `layout.css.sticky.enabled` 选项（Firefox bug 886646）。
### HTML

*No change.*

### JavaScript

* 实现了 ES6 中的 `Math`: `Math.fround()` 方法 (Firefox bug 900125).
### Interfaces/APIs/DOM

* `DOMImplementation.createDocument` 方法的第三个参数 `doctype` 成为可选参数（Firefox bug 909859）。
* 实现了新的 `element.classList` 规范，可以同时添加或删除多个类名，比如 `element.classList.add("x", "y", "z")`（Firefox bug 814014）。
* 实现了 `URL()` 构造函数 (Firefox bug 887364).
* The properties `URLUtils.origin`, `URLUtils.password`, and `URLUtils.username` are now available to all interfaces implementing `URLUtils`: `URL`, `Location`, `HTMLAnchorElement` (en-US), and `HTMLAreaElement` (Firefox bug 887364).
* The `URL` interface is now accessible from Web Workers (Firefox bug 887364).
* IndexedDB can now be used as a "optimistic" storage area so it doesn't require any prompts and data is stored in a pool with LRU eviction policy, in short temporary storage (Firefox bug 785884).
* Path of the persistent storage has been changed from <profile>/indexedDB to <profile>/storage/persistent (on b2g from /data/local/indexedDB to /data/local/storage/persistent).
### MathML

* Inconsistent renderings of `<mmultiscripts> (en-US)`, `<msub>`, `<msup>` and `<msubsup>` have been unified and the error handling of these elements has been improved (Firefox bug 827713).
### SVG

*No change.*

参见
--

* Firefox 26 网站兼容性
### 更早版本

* Firefox 25 for developers
* Firefox 24 for developers
* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Firefox 59 for developers - Mozilla

Firefox 59 for developers
=========================

本文提供了有关 Firefox 59 中会影响开发人员的更改的信息。Firefox 59 已于 2018 年 3 月 13 日发布。

Web 开发者应该注意的变化
--------------

### 开发工具

* 网络监视器 响应标签现在显示一个 已渲染网页的预览 — 如果响应是一个 HTML 的话 (Firefox bug 1353319).
* 存储探查器显示的 Cookie 信息 (见 Cookies) 现在包括一列 *“同站”* 显示每个 cookie 的同站状态 (Firefox bug 1298370)。
* 标尺 工具 现在包含了一个 readout 来显示当前视角的维度 (Firefox bug 1402633)。
* 在响应式设计模式, 你现在可以使用光标键设置屏幕尺寸 (Firefox bug 1421663)。详见 Setting screen size 。
* The *Raw headers* display in the Network Monitor *Headers* tab now includes the response's status code (Firefox bug 1419401).
### HTML

* 实现了`<textarea>` 元素的 `autocomplete` 属性。这使得你可以启用或禁用元素的表单自动填写。
### CSS

*无变化。*

### SVG

*无变化。*

### JavaScript

*无变化。*

### APIs

#### 新增 API

* 在 nightly 中默认启用 Custom element v1（Firefox bug 1406825）。

#### DOM

*无变化。*

#### DOM 事件

* 实现了 `EventTarget.EventTarget()` 构造函数 (Firefox bug 1379688).

#### 多媒体 和 WebRTC

*无变化。*

#### Canvas 和 WebGL

*无变化。*

### HTTP

*无变化。*

### 安全

* 顶部导航 URI `data://` 已经被屏蔽了 Firefox bug 1401895.
* 修改了 `X-Frame-Options` 报头的 `SAMEORIGIN` 指令，现在它不仅会检查顶级 IFrame 是否来自同一来源 , 也会检查它的祖先。 (Firefox bug 725490).
### 插件

*无变化。*

### 其他

*无变化。*

Web 平台的删减
---------

### HTML

*无变化。*

### CSS

*无变化。*

### APIs

* 不标准的方法 `Event.getPreventDefault()` 已经被移除了。请使用 `Event.defaultPrevented` 来决定在`Event`中是否要调用`preventDefault()` 。
* 专用属性 `Navigator.mozNotification` 和 `DesktopNotification` 接口已被移除 , 推荐使用标准的 Notifications API (Firefox bug 952453).
* 专用方法 `window.external.addSearchEngine()`已被移除 (Firefox bug 862147)。欲了解更多细节，参见 `Window.sidebar` (en-US) 。
### SVG

*无变化。*

Mozilla 和附加组件开发者应该注意的变化
-----------------------

### WebExtensions

*无变化。*

参见
--

* Firefox 59 的站点兼容性
历史版本
----

* Firefox 58 for developers (en-US)
* Firefox 57 for developers (en-US)
* Firefox 56 for developers (en-US)
* Firefox 55 for developers (en-US)
* Firefox 54 for developers (en-US)
* Firefox 53 for developers (en-US)
* Firefox 52 for developers (en-US)
* Firefox 51 for developers (en-US)
* Firefox 50 for developers (en-US)
* Firefox 49 for developers (en-US)
* Firefox 48 for developers (en-US)
* Firefox 47 for developers (en-US)
* Firefox 46 for developers (en-US)
* Firefox 45 for developers (en-US)
* Firefox 44 for developers (en-US)
* Firefox 43 for developers (en-US)
* Firefox 42 for developers (en-US)
* Firefox 41 for developers
* Firefox 40 for developers (en-US)
* Firefox 39 for developers (en-US)
* Firefox 38 for developers (en-US)
* Firefox 37 for developers (en-US)
* Firefox 36 for developers (en-US)
* Firefox 35 for developers (en-US)
* Firefox 34 for developers (en-US)
* Firefox 33 for developers
* Firefox 32 for developers
* Firefox 31 for developers
* Firefox 30 for developers (en-US)
* Firefox 29 for developers (en-US)
* Firefox 28 for developers (en-US)


Firefox 41 for developers - Mozilla

Firefox 41 for developers
=========================

To test the latest developer features of Firefox, install Firefox Developer Edition Firefox 41 was released on September 22, 2015. This article lists key changes that are useful not only for web developers, but also Firefox and Gecko developers as well as add-on developers.Changes for Web developers
--------------------------

### 开发工具

Highlights:

* Take a screenshot of a DOM node
* Copy as HAR/save as HAR
* "Add Rule" button in the Rules view
* View source in a tab (en-US) (Disabled by default)
* More options to copy CSS rules
* Copy image as data: URI in the Rules view
* Added command to GCLI to display CSP info

All devtools bugs fixed between Firefox 40 and Firefox 41: note that many of these bugs, especially those relating to the performance tools, were uplifted to Firefox 40.

### CSS

* Support for laying out vertical scripts has been activated by default (Firefox bug 1138384). That means that the following CSS properties are now available:
    + Choosing the direction of writing: `writing-mode`.
    + Controlling orientation of characters: `text-orientation`.
    + Direction-independent equivalents of `width` and `height`: `block-size` and `inline-size`.
    + Direction-independent equivalents of `min-width` and `min-height`: `min-block-size` and `min-inline-size`.
    + Direction-independent equivalents of `max-width` and `max-height`: `max-block-size` (en-US) and `max-block-size` (en-US).
    + Direction-independent equivalents of `margin-top`, `margin-right`, `margin-bottom` and `margin-left`: `margin-block-start`, `margin-block-end`, `margin-inline-start` and `margin-inline-end`.
    + Direction-independent equivalents of `padding-top`, `padding-right`, `padding-bottom` and `padding-left`: `padding-block-start`, `padding-block-end`, `padding-inline-start` and `padding-inline-end`.
    + Direction-independent equivalents of `border-top`, `border-right`, `border-bottom` and `border-left` and their longhands for width, style and color: `border-block-start`, `border-block-start-width`, `border-block-start-style`, `border-block-start-color`, `border-block-end`, `border-block-end-width`, `border-block-end-style`, `border-block-end-color`, `border-inline-start`, `border-inline-start-width`, `border-inline-start-style`, `border-inline-start-color`, `border-inline-end`, `border-inline-end-width`, `border-inline-end-style` and `border-inline-end-color`.
    + Direction-independent equivalents of `top`, `right`, `bottom` and `left`: `offset-block-start` (en-US), `offset-block-end` (en-US), `offset-inline-start` (en-US) and `offset-inline-end` (en-US).
* Support the `transform-origin` property in SVG and implement the `transform-box` property (Firefox bug 923193).
### HTML

* `<a>` 没有 `href` 属性，并且不再被分类为交互内容。点击 `<label>` 将会激活标签内容 (Firefox bug 1167816).
* SVG 图标现在支持站点图标 (偏爱图标和快捷方式图标)(Firefox bug 366324).
* The `crossorigin` attribute is now supported for <link rel='preconnect'> (Firefox bug 1174152).
* The picture element does not react to resize/viewport changes (Firefox bug 1135812).
### JavaScript

* `Date.prototype` (en-US)现在是一个普通对象，不再是一个 `Date` 实例 (Firefox bug 861219).
* `Date.prototype.toString` 现在是一般方法 (Firefox bug 861219).
* `Symbol.species`被增加到 (Firefox bug 1131043).
* `Map[@@species]` 和`Set[@@species]` 获取已经被增加 (Firefox bug 1131043).
* 非标准 let expression 支持已经被废弃 (Firefox bug 1023609).
* Destructured parameters with default value assignment 现在已经被支持 (Firefox bug 1018628).
* Per ES2015, 方法定义 需要尖括号。从现在开始语法没有尖括号将会失败 (Firefox bug 1150855).
* 方法定义 (除了生成方法) 已经不再可构造 (Firefox bug 1059908 和Firefox bug 1166950).
* As part of ES2015 specification compliance, parenthesized destructuring patterns, like `([a, b]) = [1, 2]` or `({a, b}) = { a: 1, b: 2 }`, are now considered invalid and will throw a `SyntaxError`. See Jeff Walden's blog post for more details.
* The `new.target` syntax has been added (Firefox bug 1141865).
### Interfaces/APIs/DOM

* 剪切、复制和粘贴命令处理已经被重新编码，并且现在允许 JS 编程实现网页内容复制和剪切。
    + 使用 `'paste'`名利作为参数，`Document.queryCommandSupported()`现在会返回 false 如果不充分的权限被执行 (Firefox bug 1161721).
    + 使用`'cut'` 或 `'copy'` 命令作为参数，`Document.queryCommandSupported()` 现在返回`true` 如果调用的上下文中包括用户发起的或特权代码 (Firefox bug 1162952).
    + 使用 `'cut'` 或`'copy'` 命令作为参数，`Document.execCommand()` 将会执行，但是仅仅在用户发起的或特权代码的上下文下 (Firefox bug 1012662).

#### Events

* 非标准的`CloseEvent.initCloseEvent()` (en-US) 方法和创建 `CloseEvent` 使用 `Event.createEvent('CloseEvent')` (en-US) 方法已经被移除。相反可以使用标准的构造器`CloseEvent()` (en-US) . (Firefox bug 1161950).
* On Desktop, `PointerEvent` is now activated by default in Nightly; it is not activated in Developer Edition, Beta or Release and won't be for at least some versions (Firefox bug 1166347).
* The unprefixed version of `MouseEvent.movementX` and `MouseEvent.movementY` have been added; the prefixed versions are deprecated and will be removed at some point in the future (Firefox bug 1164981).

#### Web Crypto

* `SubtleCrypto.importKey()` 和`SubtleCrypto.exportKey()` 现在支持 `ECDH` keys (Firefox bug 1050175).

#### Canvas API

* `HTMLCanvasElement.captureStream()` and `CanvasCaptureMediaStream` have been added and allow to stream the display of a `<canvas>` in real-time (Firefox bug 1032848).
* `MediaStream.id` now returns the unique id of a stream (Firefox bug 1089798).
* The initial value of `CanvasRenderingContext2D.filter` is now correctly set to `none` (Firefox bug 1163124).

#### Service Workers

* Improvement to our experimental Service Worker (en-US) implementation:
    + `ServiceWorkerGlobalScope.skipWaiting()` has been implemented (Firefox bug 1131352).
    + `Clients.claim()` has been added (Firefox bug 1130684).
    + The other functional events of Service Workers have been made to inherit from `ExtendableEvent`, giving them access to the `waitUntil()` method (Firefox bug 1160527).
* The `CacheStorage` and `Cache` interfaces are now supported (Firefox bug 1110144).

#### WebGL

* The `failIfMajorPerformanceCaveat` WebGL context attribute has been added and can be set when creating a WebGL context with `HTMLCanvasElement.getContext()` to indicate if a context creation should fail if the system performance is low (Firefox bug 1164970).

#### WebRTC

* Firefox no longer offers a default STUN server to be used if none are specified when constructing a new `RTCPeerConnection`. You'll need to provide one in order to successfully establish a WebRTC connection.

#### Miscellaneous

* On OS X and Windows, `Navigator.onLine` (en-US) now changes regarding network connectivity (it always returned `true`, , unless "Work offline" mode was selected) before (Firefox bug 654579).
* `MessagePort` and `MessageChannel` now available in Web workers, and are enabled by default in all contexts (Firefox bug 952139) and (Firefox bug 911972).
* The User Timing API is now available in Web workers (Firefox bug 1155761).
* The Notifications API is now available in Web workers (Firefox bug 916893).
* `DOMRequest` and `DOMCursor` are now available in Web workers (Firefox bug 1167650).
* The CSS Font Loading API (en-US) has been completely implemented and is now enabled by default (Firefox bug 1149381).
* Shared workers can no longer be shared between private (i.e. browsing in a private window) and non-private documents (see Firefox bug 1177621).
* The `URLUtilsSearchParams.searchParams` property is now read-only (Firefox bug 1174731).
* The `URLUtils.hash` property no longer decodes URL fragment (Firefox bug 1093611).
### MathML

#### 新的默认、支持字体处理

数学公式需要特殊的字体。到目前为止，这些字体被硬编码在用户默认样式 `mathml.css` (使用`<math>` 标志设置字体组) 和偏好选项`font.mathfont-family` (为拉伸和大操作数设置支持字体). Firefox 41 引入一个能够自动设置<math>标志和相应偏好选项的内置`x-math` 语言 (例如`font.name.serif.x-math`). 用户默认样式现在将<math>标志字体设置为 serif 并且`font.mathfont-family` 被替换为 `font.name.serif.x-math`. 所有平台现在基本使用相同列表的支持字体， "Latin Modern Math" 是首选。在标准的 per-language 字体偏好菜单中，默认支持字体能够被设置。更多细节，请参照Firefox bug 947654 和 Firefox bug 1160456.

### SVG

* 站点图片 (偏爱图标，快捷方式图标) 现在支持 SVG(Firefox bug 366324)
### 音频/视频

* The `media.autoplay.enabled` preference now also apply to untrusted `HTMLMediaElement.play()` invocations too, that is calls from non-users activated scripts (Firefox bug 659285).
Networking
----------

* The `X-Content-Duration` header is no longer supported (Firefox bug 1160695).
* Draft versions of the HTTP/2 protocol are no more supported (Firefox bug 1132357).
Security
--------

* The CSP (en-US) 1.1 `manifest-src` directive (en-US) 已经被支持 (Firefox bug 1089255).
* Previous versions of Firefox incorrectly expected the Content Security Policy (en-US) referrer (en-US)directive's value `origin-when-cross-origin` to be spelled `origin-when-crossorigin`. This has been corrected to include the missing dash character.
Changes for add-on and Mozilla developers
-----------------------------------------

### XUL

*没有变化。*

### JavaScript code modules

*没有变化。*

### XPCOM

*没有变化。*

### 其他

* A new, internal, and chrome-context-only API to render the root widget of a window into a `<canvas>` has been added: `CanvasRenderingContext2D.drawWidgetAsOnScreen()`. This API uses the operating system to snapshot the widget on-screen. For more details see Firefox bug 1167477.
See also
--------

* Site Compatibility for Firefox 41
之前版本
----

* Firefox 40 for developers (en-US)
* Firefox 39 for developers (en-US)
* Firefox 38 for developers (en-US)
* Firefox 37 for developers (en-US)
* Firefox 36 for developers (en-US)
* Firefox 35 for developers (en-US)
* Firefox 34 for developers (en-US)
* Firefox 33 for developers
* Firefox 32 for developers
* Firefox 31 for developers
* Firefox 30 for developers (en-US)
* Firefox 29 for developers (en-US)
* Firefox 28 for developers (en-US)
* Firefox 27 for developers
* Firefox 26 for developers
* Firefox 25 for developers
* Firefox 24 for developers
* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)


Firefox 27 for developers - Mozilla

Firefox 27 for developers
=========================

Web 开发者需要注意的变化
--------------

### 开发者工具

* 可以在调试器中监控到 DOM 事件。
* 查看器可以直接编辑元素的 html 源码，不再需要安装额外的扩展。
* 可以在查看器中直接预览背景图片和颜色值。
* 可以输出 reflow 日志。

更多详情，请看这篇文章.

### CSS

* `CSS `cursor` 属性值中 -moz-grab` 和 `-moz-grabbing` 关键字脱前缀，成为 `grab` 和 `grabbing` (Firefox bug 880672).
### HTML

* 桌面浏览器上实现了`<input type = "color">`
### JavaScript

EcmaScript 6 (Harmony) 实现了：

* 展开运算符支持在函数调用时的实参左边位置使用 (Firefox bug 762363).
* 实现了多个数学函数 `Math.hypot()` (Firefox bug 896264).
### Interfaces/APIs/DOM

*No change.*

### MathML

*No change.*

### SVG

*No change.*

附加组件和 Mozilla 开发者需要注意的变化
------------------------

* 移除了 `downloads-indicator`, 你应该使用 `downloads-button` 元素来代替。
* Firefox 不再使用 `chrome://browser/skin/downloads/indicator.css` 样式。
参见
--

* Site Compatibility for Firefox 27
### 更早版本

* Firefox 26 for developers
* Firefox 25 for developers
* Firefox 24 for developers
* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Firefox 78 的开发者说明 - Mozilla

Firefox 78 的开发者说明
=================

本文提供了有关 Firefox 78 中影响开发者的变更信息。Firefox 78 于 2020 年 6 月 30 日发布。

参见 Mozilla hacks 上的 Firefox 78 中的新增功能：DevTools 的改进，新的正则表达式引擎以及大量的 Web 平台更新。

为 Web 开发者带来的变化
--------------

### 开发者工具

#### 调试器

* 现在，你可以从 about:debugging 面板更改远程设备访问的 URL。（Firefox bug 1617237）
* 现在，调试器中的 **禁用 JavaScript** 菜单项仅影响当前标签页，并且在关闭“开发者工具”后会重置。（Firefox bug 1640318）
* 如果在作用域面板中启用**映射**，日志点可以将源代码映射代码中的变量名映射回其原始名称。（Firefox bug 1536857）

#### 网络监视器

* 在网络监视器中，现在可以通过拖动表格中任意位置的列边框来调整请求列表的列宽。（Firefox bug 1618409）
* 对网络监控器中的请求详情面板的用户体验进行了一些改进。（Firefox bug 1631302、Firefox bug 1631295）
* 如果请求被阻止，请求列表 现在会显示原因，如附加组件、CSP、CORS 或增强型跟踪保护。（Firefox bug 1555057、Firefox bug 1445637、Firefox bug 1556451）

#### 其他工具

* 无障碍环境检查器已发布测试版。你可以用它来检查网站上的各种辅助功能问题。（Firefox bug 1602075）
* 未捕获的 Promise 错误现在会在控制台中提供所有详细信息，包括名称和堆栈。（Firefox bug 1636590）
### CSS

* 现在，`:is()` 和 `:where()` 伪类已默认启用（Firefox bug 1632646）。
* 现支持不带前缀的 `:read-only` 和 `:read-write` 伪类（Firefox bug 312971）。
    + 此外，`:read-write` 样式不再应用于禁用的 `<input>` 和 `<textarea>` 元素，之前的行为违反了 HTML 规范（Firefox bug 888884）。
### JavaScript

* 现支持 `Intl.ListFormat` API（Firefox bug 1589095）。
* 扩展了 `Intl.NumberFormat()` (en-US) 构造函数，以支持 Intl.NumberFormat Unified API 提案中指定的新选项（Firefox bug 1633836）。其中包括：
    + 科学计数法支持 (en-US)
    + 单位 (en-US)、货币 (en-US)和符号显示 (en-US)格式化
* `RegExp` 引擎已更新，现在支持 ECMAScript 2018 中引入的所有新特性：
    + 后行断言（Firefox bug 1225665）
    + `RegExp.prototype.dotAll`（Firefox bug 1361856）
    + Unicode 属性转义（Firefox bug 1361876）
    + 具名捕获组（Firefox bug 1362154）
* 由于 2020 年中期的 WebIDL 规范变更，我们为所有 DOM 原型对象添加了 `Symbol.toStringTag` 属性（Firefox bug 1277799）。
* 改进了 `WeakMap` 对象的垃圾回收。`WeakMap` 现在会以增量方式进行标记（Firefox bug 1167452）。
### API

#### DOM

* 已实现 `Element.replaceChildren` 方法（Firefox bug 1626015）。

#### Service worker

* 延长支持版（ESR）：Firefox 78 是首个支持 Service worker（以及 Push API）的 ESR 版本。早期的 ESR 版本不提供支持（Firefox bug 1547023）。
### WebAssembly

* 现支持 Wasm Multi-value，这意味着 WebAssembly 函数现在可以返回多个值，指令序列可以消耗和产生多个堆栈值（Firefox bug 1628321）。
* WebAssembly 现在支持从 JavaScript 使用 `BigInt` 导入和导出 64 位整数函数参数（i64）（Firefox bug 1608770）。
### TLS 1.0 和 1.1 已被移除

* 所有浏览器都不再支持传输层安全（TLS）协议的 1.0 和 1.1 版本。阅读 TLS 1.0 和 1.1 删除更新以获取先前的公告，以及如果受到影响应采取的措施（Firefox bug 1643229）。
为附加组件开发者带来的变化
-------------

* `browsingData.removeCache` (en-US) 和 `browsingData.removePluginData` (en-US) 现支持按主机名删除。（Firefox bug 1636784）
* 使用 `proxy.onRequest` (en-US) 时，现在可以正确应用基于选项卡 ID 或窗口 ID 限制的过滤器。这对于希望仅在一个窗口中提供代理功能的加载项很有用。
* 现在，从“所有选项卡”下拉菜单中单击上下文菜单 (en-US)即可传递适当的选项卡对象。过去，活动选项卡被错误地传递了。
* 当使用带有另存为选项的 `downloads.download` 时，可以记住最近使用的目录。尽管此信息对开发人员用处不大，但对用户而言却非常方便。
更早期的版本
------

* Firefox 77 for developers (en-US)
* Firefox 76 for developers (en-US)
* Firefox 75 for developers (en-US)
* Firefox 74 for developers (en-US)
* Firefox 73 for developers (en-US)
* Firefox 72 for developers (en-US)
* Firefox 71 for developers (en-US)
* Firefox 70 for developers (en-US)
* Firefox 69 for developers (en-US)
* Firefox 68 for developers (en-US)
* Firefox 67 for developers (en-US)
* Firefox 66 for developers (en-US)
* Firefox 65 for developers
* Firefox 64 for developers (en-US)
* Firefox 63 for developers (en-US)
* Firefox 62 for developers (en-US)
* Firefox 61 for developers (en-US)
* Firefox 60 for developers (en-US)
* Firefox 59 for developers
* Firefox 58 for developers (en-US)
* Firefox 57 for developers (en-US)
* Firefox 56 for developers (en-US)
* Firefox 55 for developers (en-US)
* Firefox 54 for developers (en-US)
* Firefox 53 for developers (en-US)
* Firefox 52 for developers (en-US)
* Firefox 51 for developers (en-US)
* Firefox 50 for developers (en-US)
* Firefox 49 for developers (en-US)
* Firefox 48 for developers (en-US)
* Firefox 47 for developers (en-US)


Firefox 33 for developers - Mozilla

Firefox 33 for developers
=========================

普通 Web 开发者应该注意的变化
-----------------

### Developer Tools

*No change.*

### CSS

* 实现了 @counter-style 规则（Firefox bug 966166）。
* **-moz-ethiopic-numeric** 去除前缀（Firefox bug 985825）。
* 支持了**disclosure-open/disclosure-closed** 计数器样式（Firefox bug 982355）。
### HTML

*No change.*

### JavaScript

* 移除了非标准的 `Number.toInteger()` 方法（Firefox bug 1022396）。
### Interfaces/APIs/DOM

*No change.*

### MathML

*No change.*

### SVG

*No change.*

### Audio/Video

*No change.*

Security
--------

*No change.*

附加组件 和 Mozilla 开发者应该注意的变化
-------------------------

*No change.*

参见
--

* Site Compatibility for Firefox 33
### 更早版本

* Firefox 32 for developers
* Firefox 31 for developers
* Firefox 30 for developers (en-US)
* Firefox 29 for developers (en-US)
* Firefox 28 for developers (en-US)
* Firefox 27 for developers
* Firefox 26 for developers
* Firefox 25 for developers
* Firefox 24 for developers
* Firefox 23 for developers (en-US)
* Firefox 22 for developers
* Firefox 21 for developers
* Firefox 20 for developers
* Firefox 19 for developers
* Firefox 18 for developers
* Firefox 17 for developers (en-US)
* Firefox 16 for developers (en-US)
* Firefox 15 for developers (en-US)
* Firefox 14 for developers
* Firefox 13 for developers (en-US)
* Firefox 12 for developers (en-US)
* Firefox 11 for developers (en-US)
* Firefox 10 for developers (en-US)
* Firefox 9 for developers (en-US)
* Firefox 8 for developers (en-US)
* Firefox 7 for developers (en-US)
* Firefox 6 for developers (en-US)
* Firefox 5 for developers (en-US)
* Firefox 4 for developers (en-US)
* Firefox 3.6 for developers (en-US)
* Firefox 3.5 for developers (en-US)
* Firefox 3 for developers
* Firefox 2 for developers (en-US)
* Firefox 1.5 for developers (en-US)


Using Firefox 1.5 caching - Mozilla

Using Firefox 1.5 caching
=========================

介绍
--

Firefox 1.5 (en-US) 对整个 web 页面的一个浏览器会话进行了内存缓存，包括他们对 JavaScript 状态。在访问过的页面间后退和前进不需要页面加载同时保存 JavaScript 状态。这个特性，被称为 bfcache（“后退前进缓存”），使得页面导航（切换）非常快。这个状态缓存被保存直到用户关闭浏览器。

有时候，Firefox 不缓存页面。下面是一些页面不被缓存的常见的编程的原因：

* 页面使用 `unload` 或者 `beforeunload` 处理程序;
* 页面设置 "cache-control: no-store".
* 页面是 HTTPS 同时页面至少有一个以下设置：
    + "Cache-Control: no-cache"
    + "Pragma: no-cache"
    + 使用 "Expires: 0" 或者 "Expires" 设置相对于“Date”header 值的过去日期值 (除非指定 "Cache-Control: max-age=");
* 当用户导航跳离页面时页面还没有完全加载或者因为其他原因有等待（pending）的网络请求 (例如 `XMLHttpRequest`));
* 页面运行 IndexedDB 事件;
* 顶级页面包含 frames (例如 `<iframe>`) 因为这里列出的任何原因 而没有被缓存；
* 页面是在 frame 内而且用户在这个框架中加载一个新页面（在这种情况下，当用户离开这个页面，最后加载入 frames 的内容会被缓存）。

这个新的缓存特性改变了页面的加载行为，web 作者也许希望：

* 知晓被导航到的页面（当它从用户缓存中被加载）
* 在用户离开页面时定义页面行为 (同时还支持页面缓存)

两个新的浏览器事件使得用户可以做到这 2 个要求。

新的浏览器事件
-------

如果你使用新的事件，你的页面在其他浏览器依然会正确显示 (我们已经测试了早期版本的 Firefox, Internet Explorer, Opera, 和 Safari)，而且在 Firefox 1.5 加载时将会使用新的缓存功能。

注意：直至 10-2009 开发版本的 Safari 添加了这些新的事件的支持 (见 the webkit bug).

标准的页面行为是：

1. 用户导航至一个页面
2. 当页面加载，行内 scripts 执行。
3. 一旦页面加载完毕， `onload` 事件执行。

有些页面包含第四步。如果一个页面使用 `unload` 或者 `beforeunload` 处理程序，当从页面导航离开时事件被执行。如果提供了一个`unload` 处理程序，页面将不会被缓存。

当一个用户导航至一个被缓存的页面，行内 scripts 和`onload` 处理程序将不会执行 (步骤 2 和 3), 因为在大多数情况下，这些 scripts 的影响（执行效果）已经被保存。

如果你想在每次用户导航到页面时都执行页面包含的 scripts 或者其他在页面加载期间执行的行为，或者你想知道什么时候用户导航至一个被缓存的页面，使用新的`pageshow` 事件。

如果你拥有当用户导航离页面是执行的行为，但是你想利用这个新的缓存功能，因此不想使用 unload 处理程序，使用新的 `pagehide` 事件

### pageshow 事件

这个事件和 `load` 事件一样的工作（效果）, 除了它每次页面加载是都执行 that it fires every time the page is loaded (然而 `load` 事件在 Firefox 1.5 中当页面从缓存中加载时不执行). 页面第一次加载时， `pageshow` 事件在 `load` 事件执行后执行。 `pageshow` 事件使用一个命名为`persisted` 的 boolean 属性，在初始加载时默认设置为 `false`。如果它不是初始加载，被设置为`true`（换句话说，但页面被缓存时它被设置为 true）.

在 `pageshow` 事件执行时，设置每次页面加载时你想要运行的任何的 JavaScript。

如果你将 JavaScript 函数作为 pageshow 事件的一部分调用，你可以通过调用`pageshow` 事件作为`load`事件的一部分确保在不同于 Firefox 1.5 的浏览器在页面加载时调用这些函数，如在本文后面所示的示例。

### pagehide 事件

如果你想定义当用户导航离页面时的行为，但是你不想使用 `unload` (这将导致页面不被缓存)，你可以使用新的 `pagehide` 事件。像 `pageshow` ， `pagehide` 事件使用一个命名为`persisted` 的属性。这个属性在页面未被浏览器缓存时设置为 `false` ，如果页面被浏览器缓存则设置为 `true` 。如果这个属性被设置为 `false`，如果有设置`unload` 处理程序的话，`unload` 事件在`pagehide` 事件执行后马上执行。

当页面初次加载，Firefox 1.5 试图按事件会发生相同的顺序模拟 load 事件。Frames 被作为顶级文档一样对待。如果页面包含 frames, 则当缓存当页面被加载：

* 每个 frame 的`pageshow` 事件在主文档的 `pageshow` 事件之前执行。
* 当用户导航离被缓存的页面，每个 frame 的`pagehide` 事件在主文档的 `pagehide` 事件之前执行。
* 发生在一个 frame 的导航，只有在受影响的 frame 触发事件。
示例代码
----

以下的示例演示了一个页面同时使用 `load` 和 `pageshow` 事件。这个示例页面行为如下：

* 在除了 Firefox 1.5 的浏览器，以下在每次页面加载都发生：`load` 事件触发`onLoad` 函数，该函数调用 `onPageShow` 函数 (如同一个附加功能).
* 在 Firefox 1.5，页面第一次加载时 `load` 事件和其他浏览器上运行一样。除了， `pageshow` 事件的执行和 `persisted` 设置为 `false`，没有额外的行动发生。
* 在 Firefox 1.5, 当页面从缓存中被加载，只有 `pageshow` 事件执行。随着 `persisted` 被设置为 `true`，只有 `onPageShow` 方法中的 JavaScript 行为被触发。

在这个例子中：

* 每次页面加载，页面计算并显示当前日期和时间。这个计算包括秒和毫秒，所以你可以很容易地测试功能。
* 第一次加载页面，光标放置在表单的 Name 字段。在 Firefox 1.5, 当用户导航回该页面，光标依然在页面导航离开时的位置。在其他浏览器，光标移回到 Name 字段。

```html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Order query Firefox 1.5 Example</title>
    <style type="text/css">
 body,
 p {
 font-family: Verdana, sans-serif;
 font-size: 12px;
 }
 </style>
    <script type="text/javascript">
 function onLoad() {
 loadOnlyFirst();
 onPageShow();
 }

 function onPageShow() {
 //calculate current time
 var currentTime = new Date();
 var year = currentTime.getFullYear();
 var month = currentTime.getMonth() + 1;
 var day = currentTime.getDate();
 var hour = currentTime.getHours();
 var min = currentTime.getMinutes();
 var sec = currentTime.getSeconds();
 var mil = currentTime.getMilliseconds();
 var displayTime =
 month +
 "/" +
 day +
 "/" +
 year +
 " " +
 hour +
 ":" +
 min +
 ":" +
 sec +
 ":" +
 mil;
 document.getElementById("timefield").value = displayTime;
 }

 function loadOnlyFirst() {
 document.zipForm.name.focus();
 }
 </script>
  </head>
  <body onload="onLoad();" onpageshow="if (event.persisted) onPageShow();">
    <h2>Order query</h2>

    <form
 name="zipForm"
 action="http://www.example.com/formresult.html"
 method="get">
      <label for="timefield">Date and time:</label>
      <input type="text" id="timefield" /><br />
      <label for="name">Name:</label>
      <input type="text" id="name" /><br />
      <label for="address">Email address:</label>
      <input type="text" id="address" /><br />
      <label for="order">Order number:</label>
      <input type="text" id="order" /><br />
      <input type="submit" name="submit" value="Submit Query" />
    </form>
  </body>
</html>
```

与此相反，如果以上页面不监听 `pageshow` 事件，所有的计算作为 `load` 事件的一部分（取而代之的是如下面的示例代码片段所示的编码），Firefox 1.5 中，当用户导航离页面时，光标位置及 date/time 会被缓存。当用户返回回该页面，缓存的 date/time 将会显示。

```html
<script>
function onLoad() {
 loadOnlyFirst();

//calculate current time
 var currentTime= new Date();
 var year = currentTime.getFullYear();
 var month = currentTime.getMonth()+1;
 var day = currentTime.getDate();
 var hour=currentTime.getHours();
 var min=currentTime.getMinutes();
 var sec=currentTime.getSeconds();
 var mil=currentTime.getMilliseconds();
 var displayTime = (month + "/" + day + "/" + year + " " +
 hour + ":" + min + ":" + sec + ":" + mil);
 document.getElementById("timefield").value=displayTime;
}

function loadOnlyFirst() {
 document.zipForm.name.focus();
}
</script>
</head>

<body onload="onLoad();">
```

开发 Firefox 扩展
-------------

Firefox 1.5 extensions (en-US) 需要允许缓存功能。如果你在开发一个兼容 1.5 及以前版本的 Firefox 扩展，确保它监听事件触发 `load` 可被缓存，监听的 `pageshow` 事件触发不应该被缓存。

例如，Firefox 的 Google 工具栏为了兼容 1.5 和更早的版本，应该为 autolink 监听 `load` 事件函数，为 PageRank 监听 `pageshow` 事件函数。


为 Firefox 3 升级扩展 - Mozilla

为 Firefox 3 升级扩展
================

英文原文取自于 http://developer.mozilla.org/en/docs/Extensions 这篇文章将对于那些想把他们的扩展在 Firefox 3 中正常运行的开发者提供一些有用的信息。

在进入主题之前，首先要提示一下：如果你的扩展所需要的唯一改变只是安装文件中的`maxVersion`信息，并且你的扩展所在的主机是addons.mozilla.org，事实上你不需要上传你的新的版本的扩展！只需要在 AMO 中使用开发者控制面板调整`maxVersion`。通过这种方式你可以避免你的扩展被再次审核。

### 第一步：升级安装文件

第一步，当然，对于大多数的扩展也仅需要这一步——更新安装文件`install.rdf`，声明扩展兼容 Firefox 3。

找到声明兼容的最大版本号的那一行（对于 Firefox2，如下）：

```xml
<em:maxVersion>2.0.*</em:maxVersion>
```

对于 Firefox 3，如下：

```xml
<em:maxVersion>3.0.*</em:maxVersion>
```

然后重新安装扩展。

注意，在 Firefox3 的本版号中没有额外的“.0”，所以请使用“3.0.\*”，而非“3.0.0.\*”。

**备注：** Note that at this point more changes in Firefox 3 are expected. These changes may break some extensions, so you shouldn't release an extension with `3.0.*` `maxVersion` to the users until the Firefox 3 release candidate is out. During the Firefox 3 Beta period, you should use `3.0b5` as your `maxVersion`.

There have been (and will continue to be) a number of API changes that will likely break some extensions. We're still working on compiling a complete list of these changes.

**备注：** If your extension still uses an `Install.js` script instead of an install manifest, you need to make the transition to an install manifest now. Firefox 3 no longer supports `install.js` scripts in XPI files.

#### Add localizations to the install manifest

Firefox 3 supports new properties in the install manifest to specify localized descriptions. The old methods still work however the new allow Firefox to pick up the localizations even when the add-on is disabled and pending install. See Localizing extension descriptions for more details.

### Step 2: 确保提供安全的更新

If you are hosting addons yourself and not on a secure add-on hosting provider like addons.mozilla.org then you must provide a secure method of updating your add-on. This will either involve hosting your updates on an SSL website, or using cryptographic keys to sign the update information. Read Securing Updates for more information.

### Step 3: Deal with changed APIs

Several APIs have been changed in significant ways. The most significant of these, which will likely affect a large number of extensions, are:

#### DOM

 将外部文档的节点插入当前文档之前，你必须使用 `document.importNode()` 从外部文档导入源节点，或者使用 `document.adoptNode()`导入源节点，
 想要了解更多的 `Node.ownerDocument` 问题，请参考 W3C DOM FAQ.

 即使你不执行导入动作，就执行插入外部文档中的节点.Firefox 目前也不会报错 (如果严格按标准执行，很多已有的网站都无法正常运行).
 我们鼓励开发者严格按标准修改自己已有的不符合上述标准的代码。

#### Bookmarks & History

If your extension accesses bookmark or history data in any way, it will need substantial work to be compatible with Firefox 3. The old APIs for accessing this information have been replaced by the new Places architecture. See the Places migration guide for details on updating your existing extension to use the Places API.

#### Download Manager

The Download Manager API has changed slightly due to the transition from an RDF data store to using the Storage API. This should be a pretty easy transition to make. In addition, the API for monitoring download progress has changed to support multiple download manager listeners. See `nsIDownloadManager`, `nsIDownloadProgressListener`, and Monitoring downloads for more information.

#### Password Manager

If your extension accesses user login information using the Password Manager, it will need to be updated to use the new Login Manager API.

* The article Using nsILoginManager includes examples, including a demonstration of how to write your extension to work with both the Password Manager and the Login Manager, so it will work with both Firefox 3 and earlier versions.
* `nsILoginInfo`
* `nsILoginManager`

You can also override the built-in password manager storage if you want to provide your own password storage implementation in your extensions. See Creating a Login Manager storage module for details.

#### Popups (Menus, Context Menus, Tooltips and Panels)

The XUL Popup system was heavily modified in Firefox 3. The Popup system includes main menus, context menus and popup panels. A guide to using Popups has been created, detailing how the system works. One thing to note is that `popup.showPopup` has been deprecated in favor of new `popup.openPopup` and `popup.openPopupAtScreen`.

#### Autocomplete

The `nsIAutoCompleteController` interface's `handleEnter()` method has been changed to accept an argument that indicates whether the text was selected from the autocomplete popup or by the user pressing enter after typing text.

#### DOMParser

* When a `DOMParser` is instantiated, it inherits the calling code's principal and the `documentURI` and `baseURI` of the window the constructor came from.
* If the caller has UniversalXPConnect privileges, it can pass parameters to `new DOMParser()`. If fewer than three parameters are passed, the remaining parameters will default to `null`.
    + The first parameter is the principal to use; this overrides the default principal normally inherited.
    + The second parameter is the `documentURI` to use.
    + The third parameter is the `baseURI` to use.
* If you initialize a `DOMParser` using a contract, such as by calling `createInstance()`, and you don't call the `DOMParser`'s `init()` method, attempting to initiate a parsing operation will automatically create and initialize the `DOMParser` with a null principal and `null` pointers for `documentURI` and `baseURI`.

#### Removed interfaces

The following interfaces were removed from Gecko 1.9, which drives Firefox 3. If your extension makes use of any of these, you'll need to update your code:

* `nsIDOMPaintListener`
* `nsIDOMScrollListener`
* `nsIDOMMutationListener`
* `nsIDOMPageTransitionListener`
* `nsICloseAllWindows` (see bug 386200)
### Step 4: Check for relevant chrome changes

There has been a minor change to the chrome that may require changes in your code. A new `vbox` has been added, called "browser-bottombox", which encloses the find bar and status bar at the bottom of the browser window. Although this doesn't affect the appearance of the display, it may affect your extension if it overlays chrome relative to these elements.

For example, if you previously overlaid some chrome before the status bar, like this:

```xml
<window id="main-window">
  <something insertbefore="status-bar" />
</window>
```

You should now overlay it like this:

```xml
<vbox id="browser-bottombox">
  <something insertbefore="status-bar" />
</vbox>
```

Or use the following technique to make your overlay work on both Firefox 2 and Firefox 3:

```xml
<window id="main-window">
  <vbox id="browser-bottombox" insertbefore="status-bar">
    <something insertbefore="status-bar" />
  </vbox>
</window>
```

**备注：** This change is effective for Firefox 3 beta 4 and the pre-beta 4 nightlies.

### 其他方面的修改

*Add simple changes you had to make while updating your extension to work with Firefox 3 here.*

* `chrome://browser/base/utilityOverlay.js` is no longer supported for security reasons. If you were previously using this, you should switch to `chrome://browser/content/utilityOverlay.js`.
* `nsIAboutModule` implementations are now required to support the `getURIFlags` method. See nsIAboutModule.idl for documentation. This affects extensions that provide new `about:` URIs. (bug 337746)
* The `tabbrowser` element is no longer part of "toolkit" (bug 339964). This means this element is no longer available to XUL applications and extensions. It continues to be used in the main Firefox window (browser.xul).
* Changes to nsISupports proxies and possibly to threading-related interfaces need to be documented.
* If you use XML processing instructions, such as `<?xml-stylesheet ?>` in your XUL files, be aware of the changes made in bug 319654:
    1. XML PIs are now added to a XUL document's DOM. This means `document.firstChild` is no longer guaranteed to be the root element. If you need to get the root document in your script, use `document.documentElement` instead.
    2. `<?xml-stylesheet ?>` and `<?xul-overlay ?>` processing instructions now have no effect outside the document prolog.
* `window.addEventListener("load", myFunc, true)` is not fired when loading web content (browser page loads). This is due to bug 296639 which changes the way inner and outer windows communicate. The simple fix here is to use `gBrowser.addEventListener("load", myFunc, true)` as described here and works in Firefox 2 as well.
* `content.window.getSelection()` gives an object (which can be converted to a string by `toString()`), unlike the now deprecated `content.document.getSelection()` which returns a string
* `event.preventBubble()` was deprecated in Firefox 2 and has been removed in Firefox 3. Use `event.stopPropagation()`, which works in Firefox 2 as well.
* Timers that are initiated using `setTimeout()` are now blocked by modal windows due to the fix made for bug 52209. You may use `nsITimer` instead.
* If your extension needs to allow an untrusted source (e.g., a web site) to access the extension's chrome, then you must use the new `contentaccessible` flag.


Gecko 1.9 Changes affecting websites - Mozilla

Gecko 1.9 Changes affecting websites
====================================

此页设法提供在 Gecko 1.8 和 Gecko 1.9 之间的变动概要，这些变动可能会影响某些网站的行为或网页渲染。

参见 Firefox 3 开发者参考

事件
--

### 捕获 load 事件监听

在 Gecko 1.8 中，不能在图片上设置 load 事件监听。在 Gecko 1.9 中，已在 Firefox bug 234455 中修复。但是在某些网站中，由于捕获 load 事件的事件监听器不正确而导致问题。参见 Firefox bug 335251 中的讨论。要修复这个问题，出错的页面不再需要设置事件监听器。

例如，如下：

```js
window.addEventListener("load", yourFunction, true);
```

应该更改为：

```js
window.addEventListener("load", yourFunction, false);
```

事件捕获如何工作的解释，参见 DOM Level 2 事件捕获

### preventBubble 已被移出

### 少许旧的事件 API 不再被支持

DOM
---

### WRONG\_DOCUMENT\_ERR

范围
--

### intersectsNode 已被移出

### compareNode 已被移出

HTML
----

### <object> 中的许多 bug 已经修复


联系我们 - Mozilla

联系我们
====

你可以从以下链接获得帮助，时刻关注关于附加组件的最新消息，并且给予我们反馈。

### 附加组件论坛

到附加组件交流论坛讨论附加组件的任何方面并获得帮助。

### 邮件列表

**dev-addons 邮件列表**已于 2020 年 12 月 1 日弃用。你可以查看 dev-addons 的存档找到过去关于 WebExtensions API 和 addons.mozilla.org 的讨论。

### 在线聊天

Matrix 是一个开放的轻量级协议，用于去中心化的实时通信。有关如何加入 Mozilla Matrix 频道的信息，请参阅 Mozilla Wiki 上的 Matrix 页面。

* Add-ons（扩展、主题和 WebExtensions API 的支持）
* AMO（有关 addons.mozilla.org 的讨论）
### 报告问题

#### 安全漏洞

如果你发现了一个附加组件的安全漏洞，即使该附加组件未托管在 Mozilla 站点上，也请通知我们。我们将与开发人员一起解决此问题。请向 Bugzilla 提交或向 amo-admins@mozilla.com 发送邮件以秘密地报告安全漏洞。

#### addons.mozilla.org (AMO) 的问题

如果你发现网站有问题，我们很乐意修复它。请提交错误报告，并尽可能详细地说明。


浏览器扩展 - Mozilla

浏览器扩展
=====

扩展或者说是附加组件，拥有可以修改、增强浏览器的能力。用于 Firefox 的扩展，使用跨浏览器的 WebExtensions API 技术来构建。

用于构建 Firefox 扩展的技术在很大程度上与被基于 Chromium 内核的浏览器（例如谷歌 Chrome 浏览器，微软 Edge 浏览器，Opera 浏览器，Vivaldi 浏览器）所支持的扩展 API 所兼容。在大多数情况下，为基于 Chromium 内核浏览器而写的插件只需要少许修改就可以在 Firefox 中运行。

核心资源
----

指南

无论你是刚开始学习还是在寻找更加高级的建议，你可以从我们大量的教程和指南中学习扩展是如何工作的以及如何使用 WebExtensions API。

参考资料

获取全面的关于方法，属性，类型，事件等 WebExtensions APIs 的细节部分以及关于 manifest 键列表的全部细节。

Firefox 工作流

了解如何为 Firefox 构建、发布扩展：在扩展工作坊了解开发者工具，发布和移植的基本原理。

**备注：** 如果你有任何的想法、问题或者是需要帮助，可以在社区论坛和在 Matrix 上的附加组件房间联系到我们。

开始
--

 在构建你的第一个扩展之前，先去了解下扩展都可以做些什么。学习扩展剖析章节，对扩展开发、发布工作流和 Firefox 风格 (en-US)有一个大致的了解。在扩展示例中
 你会有一个全面的选择来进行更深入的探索，这些示例你都是可以正常运行在 Firefox 中的。

概念
--

从 JavaScript API 概览开始，到内容脚本,模式匹配,使用文件 (en-US),国际化,内容安全策略以及更加高阶的主题，例如原生通信,使用开发者工具 API,原生应用清单获取详尽的信息来加深对扩展的概念理解。

用户界面
----

利用这些示例代码来了解你可以在扩展中使用的所有用户界面组件。

如何做
---

你将会找到大量的教程来开始，根据你经常使用的范例，例如使用 Tabs API,在工具栏上增加一个按钮儿到更加高阶的主题，例如拦截 HTTP 请求，语境认同 (en-US)，

Firefox 工作流
-----------

当你已经准备好创建你的 Firefox 扩展或者是移植你的 Chrome 扩展时，前往扩展工作坊。它包含了以下细节：

* Firefox 工作流，例如在开发时临时安装扩展、调试、获取对的权限，等等。
* web-ext 开发者工具。
* 移植谷歌 Chrome 浏览器扩展，桌面程序与安卓的差异，等等。
* 预览发布，推广你的扩展，扩展生命周期的最佳实践。
参考资料
----

### JavaScript APIs

获取全面的关于方法，属性，类型，事件等 JavaScript APIs 的细节部分。在那儿你也可以获取到每个 API 与主流浏览器的兼容性的详尽细节。大多数的参考资料页面都包含使用这些 API 的代码示例和扩展示例的链接。

### Manifest 键列表

你可以从这里获取键列表详尽的细节，包括它们所有的属性和设置。以及关于每个键与主流浏览器的兼容性的详尽细节。


修改 web 页面 - Mozilla

修改 web 页面
=========

浏览器附加组件 ( add-on ) 常被用于修改网页。例如更改页面的样式，隐藏特定的 DOM 节点或把 DOM 节点注入到页面中。

使用 WebExtensions 有两种方式：

* 声明方式：定义一个网址格式，用来匹配特定的网址，然后加载脚本到对应的网页中。
* 编程方式：使用 JavaScript 接口，将脚本加载到一个指定标签页所承载的页面中

无论使用上面何种方式，它们都被称为内容脚本，与其他脚本的区别：

* 只能使用一部分的 webextension API。
* 能读取加载了内容脚本的网页。
* 通过使用消息 API 与其他的 webextension 通信。

在本文中，我们将看下加载脚本的两种方式。

修改匹配 URL 的页面
------------

首先，创建一个名为“modify-page”的文件夹，并在目录下创建“manifest.json”文件，内容如下：

```json
{
  "manifest\_version": 2,
  "name": "modify-page",
  "version": "1.0",

  "content\_scripts": [
    {
      "matches": ["https://developer.mozilla.org/\*"],
      "js": ["page-eater.js"]
    }
  ]
}
```

"content\_scripts"指出符合 URL 格式的页面地址，然后让浏览器加载脚本 (“page-eater.js“) 到匹配的 URL 页面 (https://developer.mozilla.org/ )。

**备注：** 由于 `content_scripts` 的 `"js"` 属性是一个数组，因此可以使用它将多个脚本注入匹配的页面。如果这样做，页面将按照数组中列出的顺序加载多个脚本。

**备注：** `content_scripts` 键还具有一个 `"css"` 属性，可以使用它来注入 CSS 样式表。

在 "modify-page" 文件夹下创建“page-eater.js”文件，内容如下：

```js
document.body.textContent = "";

var header = document.createElement("h1");
header.textContent = "This page has been eaten";
document.body.appendChild(header);
```

现在安装这个WebExtension, 然后浏览 https://developer.mozilla.org/：

**备注：** 请注意，虽然此视频显示在 addons.mozilla.org 工作的 content scripts，但目前该网站已禁止 content scripts。

通过程序修改页面
--------

如何修改程序使其在用户要求时才吞页面。现在修改上面的例子，在点击右键菜单项时才注入内容脚本。

修改 "manifest.json" 内容如下：

```json
{
  "manifest\_version": 2,
  "name": "modify-page",
  "version": "1.0",

  "permissions": ["activeTab", "contextMenus"],

  "background": {
    "scripts": ["background.js"]
  }
}
```

这里我们要移除"`content_scripts`"键值，并添加两个键：

* `permissions`:要向页面中注入脚本，就需要拥有修改页面对应的权限。`activeTab`可以临时获得修改当前活动标签所加载的页面的权限。另外还通过 contextmenus 来获取添加右键菜单项的权限。
* `background`: 加载名为 "background.js" 的 "background script" （长期有效的后台脚本），在该脚本中，我们将设置注入右键菜单的内容脚本。

在 "modify-page" 文件夹下创建名为 "background.js"的新文件，内容如下：

```js
browser.contextMenus.create({
  id: "eat-page",
  title: "Eat this page",
});

browser.contextMenus.onClicked.addListener(function (info, tab) {
  if (info.menuItemId == "eat-page") {
    browser.tabs.executeScript({
      file: "page-eater.js",
    });
  }
});
```

在该脚本中我们创建了一个右键菜单项，给了它一个具体的 id 和标题 (将在菜单中显示的文本)。然后又设置了一个事件侦听器，当用户点击菜单项时，检查该菜单项是否就是我们的吞页菜单项。如果是，就通过`tabs.executeScript()` (en-US) 接口，把"page-eater.js" 注入到活动标签页中。这个接口用标签 ID 做为参数：如果省略标签 ID 参数，就默认把脚本注入当前活动标签。

现在，附加组件看起来像这样：
```

modify-page/
    background.js
    manifest.json
    page-eater.js
```

重新加载WebExtension, 打开页面 (这次可以是任何一个页面) 激活右键菜单，然后选择 "Eat this page"：

**备注：** 请注意，虽然此视频显示在 addons.mozilla.org 工作的 content scripts，但目前该网站已禁止 content scripts。

消息
--

内容脚本和后台脚本不能直接相互访问，但可以通过发送消息进行通信。当一端设置一个消息侦听器时，另一个端就可以发送消息了。下面的表格总结了通信时的 api 接口：

|  | 在内容脚本中 | 在后台脚本中 |
| --- | --- | --- |
| 发送消息 | `browser.runtime.sendMessage()` | `browser.tabs.sendMessage()` |
| 接收消息 | `browser.runtime.onMessage` | `browser.runtime.onMessage` |

修改上面的示例，使得可以通过后台脚本来发送消息。

首先，修改 "background.js" 如下：

```js
browser.contextMenus.create({
  id: "eat-page",
  title: "Eat this page",
});

function messageTab(tabs) {
  browser.tabs.sendMessage(tabs[0].id, {
    replacement: "Message from the add-on!",
  });
}

browser.contextMenus.onClicked.addListener(function (info, tab) {
  if (info.menuItemId == "eat-page") {
    browser.tabs.executeScript({
      file: "page-eater.js",
    });

    var querying = browser.tabs.query({
      active: true,
      currentWindow: true,
    });
    querying.then(messageTab);
  }
});
```

注入 "page-eater.js"后，通过使用 `tabs.query()` 获取当前活动标签页，然后使用`tabs.sendMessage()` (en-US) 将消息发送到该标签页中的内容脚本。该消息的内容 `{replacement: "Message from the add-on!"}`。

接下来，修改 "page-eater.js" 如下：

```js
function eatPage(request, sender, sendResponse) {
  document.body.textContent = "";

  var header = document.createElement("h1");
  header.textContent = request.replacement;
  document.body.appendChild(header);
}

browser.runtime.onMessage.addListener(eatPage);
```

现在，不再立即执行吞页，内容脚本将先通过使用 `runtime.onMessage` (en-US)来监听消息。当监听到消息时，内容脚本才开始运作，除了来自`request.replacement`的替换文本不一样以外，其他的脚本运作本质上与之前的相同。

如果我们想将消息从内容脚本发送到后台页面，除了在内容脚本中使用 `runtime.sendMessage()` ，其他与上面的过程相反。

**备注：** 这些例子注入的都是 JavaScript; 想注入 CSS 可以使用 `tabs.insertCSS()` 函数。

了解更多
----

* Content scripts 指南
* `content_scripts` manifest key
* `permissions` manifest key
* `tabs.executeScript()` (en-US)
* `tabs.insertCSS()`
* `tabs.sendMessage()` (en-US)
* `runtime.sendMessage()`
* `runtime.onMessage` (en-US)
* 使用`content_scripts`的例子：
    + borderify
    + notify-link-clicks-i18n
    + page-to-extension-messaging
* 使用`tabs.executeScript()`的例子：
    + beastify
    + context-menu-copy-link-with-types


manifest.json 的浏览器兼容性 - Mozilla

manifest.json 的浏览器兼容性
=====================

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* JavaScript API 的浏览器支持


JavaScript API 的浏览器支持 - Mozilla

JavaScript API 的浏览器支持
=====================

action
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

alarms
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

bookmarks
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

browserAction
-------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

browserSettings
---------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

browsingData
------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

captivePortal
-------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

clipboard
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

commands
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

contentScripts
--------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

contextualIdentities
--------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

cookies
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

declarativeNetRequest
---------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

devtools
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

dns
---

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

dom
---

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

downloads
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

events
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

extension
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

extensionTypes
--------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

find
----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

history
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

i18n
----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

identity
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

idle
----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

management
----------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

menus
-----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

notifications
-------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

omnibox
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

pageAction
----------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

permissions
-----------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

pkcs11
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

privacy
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

proxy
-----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

runtime
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

scripting
---------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

search
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

sessions
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

sidebarAction
-------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

storage
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

tabs
----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

theme
-----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

topSites
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

types
-----

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

userScripts
-----------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

webNavigation
-------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

webRequest
----------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

windows
-------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

**备注：** Microsoft Edge 的兼容性数据由 Microsoft 公司提供，依照知识共享署名 3.0 美国协议授权。

参见
--

* manifest.json 的浏览器兼容性


manifest.json - Mozilla

manifest.json
=============

**备注：** 本文描述的是适用于 web 扩展技术的 manifest.json。若你正在寻找适用于 PWA 的 manifest.json 的有关信息，请参考这篇文章：Web App 清单。

`manifest.json` 是每个使用 WebExtension API 的扩展必须包含的唯一文件。

通过使用 `manifest.json`，你可以指定扩展的基本元数据，例如名称和版本，还可以指定扩展各个方面的功能（例如后台脚本、内容脚本和某些浏览器行为）。

它是一个允许使用“`//`”撰写单行注释的、特殊的 JSON 文件。

manifest.json 键列表
-----------------

这些是 `manifest.json` 键；除非另有说明，否则这些键在 Manifest V2 及以上版本中可用：

* action (en-US)（Manifest V3 及以上）
* author
* background
* browser\_action（仅 Manifest V2）
* browser\_specific\_settings
* chrome\_settings\_overrides (en-US)
* chrome\_url\_overrides (en-US)
* commands (en-US)
* content\_scripts
* content\_security\_policy (en-US)
* declarative\_net\_request (en-US)
* default\_locale
* description
* developer
* devtools\_page (en-US)
* dictionaries (en-US)
* externally\_connectable (en-US)
* homepage\_url
* host\_permissions (en-US)（Manifest V3 及以上）
* icons (en-US)
* incognito (en-US)
* manifest\_version
* name
* offline\_enabled (en-US)
* omnibox (en-US)
* optional\_permissions (en-US)
* options\_page (en-US)
* options\_ui (en-US)
* page\_action (en-US)（仅 Chrome 中的 Manifest V2）
* permissions
* protocol\_handlers (en-US)
* short\_name
* sidebar\_action (en-US)
* storage (en-US)
* theme (en-US)
* theme\_experiment (en-US)
* user\_scripts (en-US)（仅 Manifest V2）
* version
* version\_name (en-US)
* web\_accessible\_resources
### 关于 manifest.json 键的注意事项

* `"manifest_version"`、`"version"` 和 `"name"` 是唯一的强制必填键。
* 如果“`\_locales`”目录存在，`"default_locale"` 也必须相应存在，否则不应存在。
* Google Chrome 不支持 `"browser_specific_settings"`。
### 在运行时访问 manifest.json 键

你可以在拓展的 JavaScript 代码中通过 `runtime.getManifest()` 函数访问拓展的清单数据：

```js
browser.runtime.getManifest().version;
```

示例
--

下面的代码块显示了一些常用清单键的基本语法。

**备注：** 本示例并非用于直接复制粘贴。根据你要开发的扩展选择相应的键。

有关完整的扩展示例，请参阅扩展示例。

```json
{
  "browser\_specific\_settings": {
    "gecko": {
      "id": "addon@example.com",
      "strict\_min\_version": "42.0"
    }
  },

  "background": {
    "scripts": ["jquery.js", "my-background.js"]
  },

  "browser\_action": {
    "default\_icon": {
      "19": "button/geo-19.png",
      "38": "button/geo-38.png"
    },
    "default\_title": "Whereami?",
    "default\_popup": "popup/geo.html"
  },

  "commands": {
    "toggle-feature": {
      "suggested\_key": {
        "default": "Ctrl+Shift+Y",
        "linux": "Ctrl+Shift+U"
      },
      "description": "Send a 'toggle-feature' event"
    }
  },

  "content\_security\_policy": "script-src 'self' https://example.com; object-src 'self'",

  "content\_scripts": [
    {
      "exclude\_matches": ["\*://developer.mozilla.org/\*"],
      "matches": ["\*://\*.mozilla.org/\*"],
      "js": ["borderify.js"]
    }
  ],

  "default\_locale": "en",

  "description": "…",

  "icons": {
    "48": "icon.png",
    "96": "icon@2x.png"
  },

  "manifest\_version": 2,

  "name": "…",

  "page\_action": {
    "default\_icon": {
      "19": "button/geo-19.png",
      "38": "button/geo-38.png"
    },
    "default\_title": "Whereami?",
    "default\_popup": "popup/geo.html"
  },

  "permissions": ["webNavigation"],

  "version": "0.1",

  "user\_scripts": {
    "api\_script": "apiscript.js"
  },

  "web\_accessible\_resources": ["images/my-image.png"]
}
```

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

有关所有清单键及其子键的完整概览，请参阅完整的 `manifest.json` 浏览器兼容性表。

参见
--

`permissions` (en-US) JavaScript API


实现一个设置页面 - Mozilla

实现一个设置页面
========

设置页面可以让用户查看，修改扩展的一些设置。

对于 WebExtensions，设置通常使用 `storage` API 保存。实现一个设置页面通常包含以下三步：

* 制作一个 HTML 文件用以显示并修改设置
* 写一个包含于该 HTML 文件的脚本，其可以使设置页面存储与存储设备中并在用户修改后更新他。
* 在 manifest.json 文件 `options_ui` (en-US) 关键字中 设置 HTML 文件的路径。通过这种方式，该 HTML 将会被显示浏览器管理器里该插件名字和描述的旁边。

**备注：** 你也可以使用 `runtime.openOptionsPage()` 打开该页面。

简单的 WebExtension
----------------

首先，我们写一个向用户访问的所有页面添加一个蓝色边框的扩展。

创建一个新的文件夹命名为“setting”，然后创建文件“manifest.json”它包含以下内容：

```json
{
  "manifest\_version": 2,
  "name": "Settings example",
  "version": "1.0",

  "content\_scripts": [
    {
      "matches": ["<all\_urls>"],
      "js": ["borderify.js"]
    }
  ]
}
```

该扩展指示浏览器在用户访问的网站上加载一个名为"borderify.js“的 Content Script。

接下来，在"setting"目录下创建"borderify.js"，然后给予他以下内容：

```js
document.body.style.border = "10px solid blue";
```

这只是向网页加入了一一个蓝色边框

现在 安装该扩展 并测试它——打开任意一个网页：

添加设置页面
------

现在让我们创建一个设置页面来允许用户设置边框的颜色。

首先更新 "manifest.json" 使他拥有如下内容：

```json
{
  "manifest\_version": 2,
  "name": "Settings example",
  "version": "1.0",

  "content\_scripts": [
    {
      "matches": ["<all\_urls>"],
      "js": ["borderify.js"]
    }
  ],

  "options\_ui": {
    "page": "options.html"
  },

  "permissions": ["storage"]
}
```

我们加入了两个 manifest 关键字：

* `options_ui` (en-US): 设置了一个 HTML 来作为设置页面。
* `permissions`: 我们使用 `storage` API 来保存设置，所以我们需要请求权限来使用该 API。

接下来，因为我们承诺提供"options.html"，让我们来创建他，在"setting"目录创建一个该文件并具有以下内容：

```html
<!doctype html>

<html>
  <head>
    <meta charset="utf-8" />
  </head>

  <body>
    <form>
      <label>Border color<input type="text" id="color" /></label>
      <button type="submit">Save</button>
    </form>

    <script src="options.js"></script>
  </body>
</html>
```

这里定义了一个带有标记文字`<input>`的 `<form>` 和一个 提交 `<button>`. 也包含了一个名为"options.js"的脚本。

仍然在"settting"目录下创建 "options.js"，并给予他以下内容：

```js
function saveOptions(e) {
  e.preventDefault();
  browser.storage.local.set({
    color: document.querySelector("#color").value,
  });
}

function restoreOptions() {
  function setCurrentChoice(result) {
    document.querySelector("#color").value = result.color || "blue";
  }

  function onError(error) {
    console.log(`Error: ${error}`);
  }

  var getting = browser.storage.local.get("color");
  getting.then(setCurrentChoice, onError);
}

document.addEventListener("DOMContentLoaded", restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);
```

它做了两件事：

* 当网页被加载它使用`storage.local.get()` (en-US) 从存贮设备中获取了名为"color”的值。如果该值未被设置其为默认值 blue。
* 当用户点击提交按钮，使用`storage.local.set()` (en-US) 存贮颜色值。

最后，更新"borderify.js" 来读取边框颜色：

**警告：** 因为 browser.storage.local.get() (en-US) 在火狐 52 版本之前的一个漏洞 ,以下代码没法起作用。为了使它生效，`onGot()` 中的 `item.color` 必须改为 `item[0].color`。

```js
function onError(error) {
  console.log(`Error: ${error}`);
}

function onGot(item) {
  var color = "blue";
  if (item.color) {
    color = item.color;
  }
  document.body.style.border = "10px solid " + color;
}

var getting = browser.storage.local.get("color");
getting.then(onGot, onError);
```

最后，完整的扩展看起来是这样：
```

settings/
    borderify.js
    manifest.json
    options.html
    options.js
```

现在：

* 重新载入扩展
* 加载一个网页
* 打开设置页面并修改边框颜色
* 重载网页查看变化。

在火狐中你可以通过访问"about:addons"点击扩展旁边的"Preferences"按钮访问设置页面。

进一步了解
-----

* `options_ui` (en-US) 关键字文档
* `storage` API 文档
* 使用`runtime.openOptionsPage()` 直接打开你的设置页面
* 另一个设置页面例子：
    + favourite-colour


API - Mozilla

API
===

WebExtension JavaScript API 可以在附加组件的后台脚本和附加组件定义的任何浏览器动作或页面动作中使用。这里的部分 API 也可以通过附加组件的内容脚本访问（见内容脚本指南列表）。

要使用更强大的 API，你需要在你的 manifest.json 中申请权限。

你可以使用 `browser` 命名空间访问这些 API。

```js
function logTabs(tabs) {
  console.log(tabs);
}

browser.tabs.query({ currentWindow: true }, logTabs);
```

许多 API 为异步，返回一个 `Promise`：

```js
function logCookie(c) {
  console.log(c);
}

function logError(e) {
  console.error(e);
}

var setCookie = browser.cookies.set({ url: "https://developer.mozilla.org/" });
setCookie.then(logCookie, logError);
```

请注意，这不同于 Google Chrome 的扩展系统，它使用 `chrome` 而非 `browser` 名字空间，并且对异步函数使用回调而不是 promises。为辅助移植，Firefox 实现的 WebExtensions 支持 `chrome` 和回调以及 `browser` 和 promises。Mozilla 也写了一个 polyfill 使使用 `browser` 和 promises 的代码能不经修改的在 Chrome 中使用：https://github.com/mozilla/webextension-polyfill。

微软 Edge 使用 `browser` 名字空间，但尚不支持基于 promise 的异步 API。目前在 Edge 中，异步 API 必须使用回调。

并非所有浏览器都支持这里的所有 API：详情见浏览器对 JavaScript API 的支持。

alarms在未来一个特定的时间运行的计划任务代码。这很像`setTimeout()` (en-US)和`setInterval()` (en-US)，不过这些函数仅可以按需使用而不能在后台页面工作。

bookmarks此WebExtensions `bookmarks` API 允许一个附加组件和浏览器的书签系统交互和操作。你可以用它给页面加书签，获取已有的书签，以及编辑，移除和管理书签。

browserAction添加按钮到浏览器的工具栏。

clipboardWebExtention 的 `clipboard` API 增加了一个将图像复制到剪贴板的函数。目前，这个 API 仅支持复制图像，但我们期望它未来支持复制文本和 HTML（译者注：原文如此，可能是指被支持复制富内容之后的标准剪贴板 API 取代）。

contentScripts使用此 API 以注册内容脚本。“注册内容脚本”意味着浏览器会将给定的内容脚本插入到每个与给定的 URL 模式相匹配的页面中。

contextMenus在浏览器菜单中添加条目。此 API 基于 Chrome 的“contextMenus”API 构建，该 API 可让 Chrome 扩展程序将项目添加到浏览器的上下文菜单中。 `browser.menus` API 为 Chrome 的 API 添加了一些功能，特别是可以将项目添加到浏览器的“工具”菜单以及上下文菜单中。在 Firefox 55 之前，这个 API 最初也被命名为`contextMenus`，并且这个名字被保留为别名，所以你可以使用`contextMenus`编写在 Firefox 和其他浏览器中工作的代码。你需要拥有“menus”（或别名" contextMenus "）权限来使用此 API。

cookies使用 WebExtensions 获取或设置 cookies, 并且在修改时能够获得通知。

downloads启用与浏览器的下载管理器交互的扩展。你可以使用这个 API 模块来下载文件、取消、暂停、恢复下载和在文件管理器中显示下载的文件。

find在网页中查找文本，并突出显示匹配项。

history使用 `history` API 与浏览器历史记录进行交互。

i18n国际化扩展的函数。你可以使用这些 api 从与扩展打包在一起的本地化文件中获取本地化字符串，查找浏览器的当前语言，并查找其 Accept-Language header头的值。

idle找出用户系统何时处于空闲，锁定或活动状态。

proxy使用 proxy API 来代理 web 请求。你可以使用 **``proxy.onRequest``** 事件监听器来拦截 web 请求，并且返回一个可以描述是否代理并且怎样代理它们的对象。

runtime该模块提供关于附加组件以及运行环境的信息。

storage使浏览器扩展能够储存及获取数据，以及监听储存的数据的变化。

tabs与浏览器标签系统进行交互。

webRequest为发出的 HTTP 请求在不同阶段添加事件监听器。事件监听器可以接收到请求的详细信息，也可以修改或取消请求。

windows与浏览器窗口互动。你可以使用此 API 获取有关已打开窗口的信息，以及打开、修改和关闭窗口。你也可以监听窗口的打开、关闭和其激活事件。


Safely inserting external content into a page - Mozilla

Safely inserting external content into a page
=============================================

很多时候你需要从外部资源引入内容到你的插件。但是，源可能被嵌入了恶意的源代码，这些恶意的源代码可能由源的开发者或者恶意的第三方所编写。

以 RSS 读取器为例子。你不知道你的插件将会打开什么 RSS 源也无法控制那些 RSS 源的内容。所以，可能用户可能订阅到一个 RSS 源里面包含了带有恶意脚本的标题。可能就是简单的 JavaScript 代码标签<script></script>。如果你在提取标题的时候，当作一般文本添加到一个页面的 DOM，用户可能加载未知的脚本。因此，需要注意避免直接把一般文本加载为 HTML。

你还需要记住扩展有授权的上下文，例如后台的脚本 backgroup scrips 以及内容脚本 content scripts。最坏的情况里，一个内嵌的洁白你可能运行在一个或多种上下文中，导致一些提取操作。这种情况会导致用户的浏览器暴露在远程攻击下，被注入代码访问用户的重要数据，例如密码、浏览器历史或者浏览器行为等。

这篇文章说明如何安全的对待远端数据并添加到 DOM。

处理任意字符串
-------

当处理字符串时，有很多推荐的策略来安全添加他们到页面：标准的 DOM 节点创建方法或 jQuery。

### DOM 节点创建方法/函数

一个轻量级的方法来插入字符串到页面是使用原生的 DOM 操纵方法/函数：`document.createElement`、`Element.setAttribute`，以及`Node.textContent`。安全的方法是分别创建节点并使用 textContent 属性赋值：

```js
var data = JSON.parse(responseText);
var div = document.createElement("div");
div.className = data.className;
div.textContent = "Your favorite color is now " + data.color;
addonElement.appendChild(div);
```

这种方法安全原因是使用`.textContent` 时会自动消除 `data.color`.中的任何远程 HTML 代码。

但是要注意，使用原生方法不能保证绝对安全，例如下面的代码：

```js
var data = JSON.parse(responseText);
addonElement.innerHTML =
  "<div class='" +
  data.className +
  "'>" +
  "Your favorite color is now " +
  data.color +
  "</div>";
```

在其中，Here, the contents of `data.className` 或 `data.color` 的内容可能包含 HTML 代码使得标签提早关闭，并插入更多的 HTML 内容，之后关闭另一个标签。

jQuery

当使用 jQuery 的方法如 `attr()` 和 `text()` ，会清洗添加到 DOM 的内容。所以，上面“favorite color”例子采用 jQuery 实现会形如：

```js
var node = $("</div>");
node.addClass(data.className);
node.text("Your favorite color is now " + data.color);
```

处理 HTML 内容
----------

当你知道处理外部源的内容是 HTML 的时候，添加到页面之前净化 HTML 是很关键的。净化 HTML 的最好办法是使用 HTML 净化的库或者一个带有 HTML 净化特性的模板引擎。在这一节，我们来看一些合适的工具以及使用方法。

### HTML 净化

An HTML sanitization library strips anything that could lead to script execution from HTML, so you can safely inject complete sets of HTML nodes from a remote source into your DOM. DOMPurify,是一个 HTML 净化的库，可以脱离任意会导致脚本执行的元素，以便安全注入远端源到 HTML 节点，这个库被很多不同的安全专家评估过，是很适合这种任务扩展的库。

DOMPurify 有一个简约版用于生产环境，purify.min.js. 你可以使用这个版本来适配你的扩展，例如你可以这样添加：

```json
"content\_scripts": [
  {
    "matches" : ["<all\_urls>"],
    "js": ["purify.min.js", "myinjectionscript.js"]
  }
]
```

之后，在 myinjectionscript.js 中你可以读取外部 HTML 并净化，之后添加到页面的 DOM 中：

```js
var elem = document.createElement("div");
var cleanHTML = DOMPurify.sanitize(externalHTML);
elem.innerHTML = cleanHTML;
```

你可以使用任何方法添加净化后的 HTML 到 DOM，例如 jQuery’s `.html()` 方法。注意这种情况需要使用 Remember though that the `SAFE_FOR_JQUERY` 标记：

```js
var elem = $("<div/>");
var cleanHTML = DOMPurify.sanitize(externalHTML, { SAFE\_FOR\_JQUERY: true });
elem.html(cleanHTML);
```

### 模板引擎

另一个常见的模式是对一个页面创建本地 HTML 模板并通过远端的值来填空。这种方法被广泛应用，应该注意去避免构造函数的使用，可能会导致执行代码的注入。当模板引擎使用构造函数插入 HTML 到文档的时候会发生这种情况，如果用来注入原始 HTML 的变量是远端代码，这就属于上面介绍中的安全风险。

例如，当使用mustache templates 你必须使用两个花括号`{{variable}}`,来去掉任何 HTML。使用三个花括号`{{{variable}}}` 必须避免注入原始 HTML 字符串到模板。

Handlebars 工作原理也是类似，`{{variable}}` 。同时，如果创造了 Handlebars helper 使用 `Handlebars.SafeString` 使用`Handlebars.escapeExpression()` 来消除任何传给 helper 的动态参数。`Handlebars.SafeString` 的结果被认为是安全的，当插入到双 handlebars 的时候就不会做消除动作。

在其他模板系统中也有类似的构造函数，需要有同样的考虑。

其他参考
----

关于这个主题更多的信息，可以查看下面的文章

* XSS (Cross Site Scripting) Prevention Cheat Sheet


Chrome 不兼容情况 - Mozilla

Chrome 不兼容情况
============

WebExtension API 的目标是提供对所有主要浏览器的兼容性，因此扩展程序只需最小的改动即可在任何浏览器上运行。

不过，Chrome 浏览器（以及基于 Chromium 的浏览器）、Firefox 浏览器和 Safari 浏览器之间存在很大差异。特别是：

* 不同浏览器对 WebExtension API 的支持各不相同。详情请参阅浏览器对 JavaScript API 的支持。
* 不同浏览器对 `manifest.json` 键的支持有所不同。请参阅 `manifest.json` 页面上的“浏览器兼容性”部分了解更多详情。
* 扩展 API 命名空间：
    + **在 Firefox 和 Safari 中**：扩展 API 在 `browser` 命名空间下访问。为了与 Chrome 浏览器兼容，还支持 `chrome` 命名空间。
    + **在 Chrome 浏览器中**：扩展 API 在 `chrome` 命名空间下访问。（参见 Chrome bug 798169）
* 异步 API：
    + **在 Firefox 和 Safari 中**：异步 API 使用 Promise 实现。
    + **在 Chrome 浏览器中**：在 Manifest V2 中，异步 API 使用回调实现。在 Manifest V3 中，大多数适当的方法都支持 promise。（参见 Chrome bug 328932）Manifest V3 支持回调，以实现向后兼容。

本页其余部分将详细介绍这些不兼容性和其他不兼容性。

JavaScript API
--------------

### chrome.\* 和 browser.\* 命名空间

* **在 Firefox 和 Safari 中**：API 使用 `browser` 命名空间访问。

```js
browser.browserAction.setIcon({ path: "path/to/icon.png" });
```

* **在 Chrome 中**：API 使用 `chrome` 命名空间访问。

```js
chrome.browserAction.setIcon({ path: "path/to/icon.png" });
```

### 回调与 Promise

* **在 Firefox 和 Safari（所有版本）以及 Chrome 浏览器（从 Manifest 版本 3 开始）中**：异步 API 使用 promise 返回值。

```js
function logCookie(c) {
  console.log(c);
}

function logError(e) {
  console.error(e);
}

let setCookie = browser.cookies.set({
  url: "https://developer.mozilla.org/",
});
setCookie.then(logCookie, logError);
```

* **在 Chrome 中**：在 Manifest V2 中，异步 API 使用回调来返回值，并使用 `runtime.lastError` (en-US) 来返回错误。在 Manifest V3 中，为实现向后兼容，支持回调，并在大多数适当的方法中支持 promise。

```js
function logCookie(c) {
  if (chrome.runtime.lastError) {
    console.error(chrome.runtime.lastError);
  } else {
    console.log(c);
  }
}

chrome.cookies.set({ url: "https://developer.mozilla.org/" }, logCookie);
```

### Firefox 支持 chrome 和 browser 命名空间

作为一种移植辅助工具，WebExtensions 的 Firefox 实现支持使用回调的 `chrome` 和使用 Promise 的 `browser`。这意味着许多 Chrome 扩展无需更改即可在 Firefox 中运行。

**备注：** `browser` 命名空间由 Firefox 和 Safari 支持。在 Chrome bug 798169 解决之前，Chrome 浏览器不提供 `browser` 命名空间。

如果你在编写 WebExtension 时确实要用到 `browser` 和 promise，我们也开发了 polyfill 来保证扩展可以在 Chrome 里运行：https://github.com/mozilla/webextension-polyfill。

### 部分支持的 API

页面 JavaScript API 的浏览器支持情况 包含了介绍受 Firefox 任意程度支持的 API 的兼容性表格。若对 API 的支持存在须要注意的事项，并标有星号“\*”，且在 API 的参考页面会介绍注意事项。

这些表格由在 GitHub 上以 JSON 文件存储的兼容性数据生成。

本节其余部分将介绍在构建跨浏览器扩展时可能需要考虑的主要兼容性问题。此外，请记得查看浏览器兼容性表，因为其中可能包含更多兼容性信息。

#### Notifications API

对于 `type "basic"` 的 `notifications.create()`：

* **在 Firefox 中**：`iconUrl` 为可选项。
* **在 Chrome 中**：`iconUrl` 为必需项。

当用户点击通知时：

* **在 Firefox 中**：通知会立即清除。
* **在 Chrome 中**：情况并非如此（通知并不会立即清除）。

如果连续多次调用 `notifications.create()`：

* **在 Firefox 中**：通知可能不会显示。在 `notifications.create()` 回调函数中等待后续调用不足以防止出现这种情况。

#### Proxy API

Firefox 和 Chrome 浏览器都包含代理 API。不过，这两个 API 的设计并不兼容。

* **在 Firefox 中**：使用 proxy.settings (en-US) 属性或 proxy.onRequest (en-US) 属性设置代理，以动态提供 ProxyInfo (en-US)。
 有关 API 的更多信息，请参阅 proxy。
* **在 Chrome 中**：代理设置在 `proxy.ProxyConfig` 对象中定义。根据 Chrome 浏览器的代理设置，该设置可能包含 `proxy.ProxyRules` 或 `proxy.PacScript`。代理设置使用 proxy.settings 属性。
 有关 API 的更多信息，请参阅 chrome.proxy。

#### Tabs API

使用 `tabs.executeScript()` 或 `tabs.insertCSS()` 时：

* **在 Firefox 中**：传递的相对 URL 将相对于当前页面 URL 解析。
* **在 Chrome 中**：相对网址是相对于扩展的基本网址解析的。

若要跨浏览器运行，可将路径指定为绝对 URL，从扩展根目录开始，如下所示：
```

/path/to/script.js
```

调用 `tabs.remove()` 时：

* **在 Firefox 中**：`tabs.remove()` promise 在 `beforeunload` 事件后兑现。
* **在 Chrome 中**：回调不等待 `beforeunload`。

#### WebRequest API

* **在 Firefox 中**：
    + 只有当原始 URL 使用了 `http:` 或 `https:` 协议时，请求才能被重定向。
    + `activeTab` 权限不允许拦截当前标签页中的网络请求。（参见 bug 1617479）
    + 系统请求（如扩展升级或搜索栏建议）不会触发事件。
        - **从 Firefox 57 开始**：Firefox 对需要拦截 `webRequest.onAuthRequired` (en-US) 代理授权的扩展例外处理。请参阅 `webRequest.onAuthRequired` (en-US) 的文档。
    + 如果扩展希望将公共（如 HTTPS）URL 重定向到扩展页面 (en-US)，扩展的 `manifest.json` 文件必须包含 `web_accessible_resources` 键，其中包含扩展页面的 URL。

    **备注：** 任何网站都可以链接或重定向到该 URL，扩展应将任何输入（例如 POST 数据）视为来自不可信任的来源，就像普通网页一样。
    + 某些 `browser.webRequest.*` API 允许异步返回解析为 `webRequest.BlockingResponse` 的 Promise。
* **在 Chrome 中**：只有在提供 `'asyncBlocking'` 选项的情况下，`webRequest.onAuthRequired` 才（通过回调而非 Promise）支持异步的 `webRequest.BlockingResponse`。

#### Windows API

* **在 Firefox 中**：`windows` API 的 `onFocusChanged` 对于指定的焦点变化将触发多次。
### 不支持的 API

#### DeclarativeContent API

* **在 Firefox 中**：Chrome 浏览器的 declarativeContent API 未被实现。此外，Firefox 将不支持 `declarativeContent.RequestContentScript` API（该 API 很少使用，在 Chrome 浏览器的稳定版本中也不可用）。
### 其他不兼容情况

#### CSS 中的 URL

* **在 Firefox 中**：被注入的 CSS 文件中的 URL 会相对于*该 CSS 文件*进行解析。
* **在 Chrome 中**：被注入的 CSS 文件中的 URL 会相对于*被注入的页面*进行解析。

#### 持后台页面中对话框的支持情况

* **在 Firefox 中**：`alert()`、`confirm()` 和 `prompt()` 在后台页面中不受支持。

#### web\_accessible\_resources

* **在 Firefox 中**：资源会被分配一个随机的 UUID (en-US)，在 Firefox 的每个实例中都会改变：`moz-extension://«random-UUID»/«path»`。这种随机性可能会阻止你做一些事情，比如将扩展的 URL 添加到另一个域的 CSP 策略中。
* **在 Chrome 中**：当资源被列在 `web_accessible_resources` 中时，它的访问方式为 `chrome-extension://«your-extension-id»/«path»`。扩展 ID 对于扩展来说是固定的。

#### Manifest“key”属性

* **在 Firefox 中**：由于 Firefox 对 `web_accessible_resources` 使用随机 UUID，因此不支持此属性。Firefox 扩展可通过 `browser_specific_settings.gecko.id` 清单键（请参阅 browser\_specific\_settings.gecko 来固定其扩展 ID）。
* **在 Chrome 中**：在使用未打包的扩展时，清单可能包含一个 `"key"` 属性，以便在不同机器上固定扩展 ID。这主要在使用 `web_accessible_resources` 时有用。

#### 内容脚本 HTTP(S) 请求

* **在 Firefox 中**：内容脚本发出 HTTP(S) 请求时，必须提供绝对 URL。
* **在 Chrome 中**：当内容脚本向相对 URL（如 `/api`）发出请求（例如，使用 `fetch()`）时，该请求将被发送到 `https://example.com/api`。

#### 内容脚本环境

* **在 Firefox 中**：内容脚本环境的全局作用域并不严格等于 `window`（Firefox bug 1208775）。更具体地说，全局作用域（`globalThis`）照例由标准 JavaScript 功能组成，另外还有作为全局作用域原型的 `window`。大多数 DOM API 都通过 `window` 从页面继承，通过 Xray vision (en-US) 来屏蔽内容脚本对网页的修改。内容脚本可能会遇到来自其全局作用域的 JavaScript 对象或来自网页的 Xray 封装版本。
* **在 Chrome 中**：全局作用域为 `window`，可用的 DOM API 一般独立于网页（除了共享底层 DOM 外）。内容脚本无法直接访问网页中的 JavaScript 对象。

#### 通过内容脚本在网页中执行代码

* **在 Firefox 中**：`eval` 在内容脚本的上下文中运行代码，而 `window.eval` 在页面的上下文中运行代码。请参阅在内容脚本中使用 `eval`。
* **在 Chrome 中**：`eval` 和 `window.eval` 总是在内容脚本的上下文而非页面的上下文中运行代码。

#### 在内容脚本之间共享变量

* **在 Firefox 中**：无法通过在一个脚本中将变量赋值给 `this.{variableName}` 并尝试在另一个脚本中使用 `window.{variableName}` 访问它们来在内容脚本之间共享变量。这是 Firefox 沙盒环境造成的限制。该限制可能会被移除；请参阅 Firefox bug 1208775。

#### 导航时内容脚本的生命周期

* **在 Firefox 中**：内容脚本在用户离开网页后仍会注入网页。但是，window 对象属性会被销毁。例如，如果内容脚本设置了 `window.prop1 = "prop"`，而用户导航离开并返回页面时，`window.prop1` 是未定义的。此问题在 Firefox bug 1525400 中被跟踪。
 要模仿 Chrome 浏览器的行为，请监听 pageshow 和 pagehide 事件。然后模拟注入或销毁内容脚本。
* **在 Chrome 中**：当用户离开网页时，内容脚本会被销毁。如果用户点击返回按钮通过历史记录返回页面，则内容脚本会被注入网页。

#### “逐标签”缩放行为

* **在 Firefox 中**：缩放级别会在页面加载和标签页导航时持续存在。
* **在 Chrome 中**：缩放更改会在导航时重置；在标签页中导航时，页面始终以其各自的缩放系数加载。

请参阅 `tabs.ZoomSettingsScope` (en-US) 。

manifest.json 键
---------------

`manifest.json` 主页面包含一个表格，说明浏览器对 `manifest.json` 键的支持情况。如果对某个键的支持存在注意事项，则会在表中用星号"\*"表示。选择星号会展开表格，显示解释注意事项的说明。

这些表格是根据 GitHub 中的 JSON 文件中存储的兼容性数据生成的。

原生通信
----

### 基于连接的信息传递参数

**在 Linux 和 Mac 上**：Chrome 浏览器会向本地应用程序传递一个参数，即启动它的扩展的来源，其形式为 `chrome-extension://"extensionID/"`（需要使用斜线）。这样，应用程序就能识别扩展。

**在 Windows 上**：Chrome 浏览器会传递两个参数：

1. 扩展的源
2. 启动应用程序的 Chrome 浏览器本地窗口的句柄
### allowed\_extensions

* **在 Firefox 中**：清单键名为 `allowed_extensions`。
* **在 Chrome 中**：清单键名为 `allowed_origins`。
### 应用清单位置

* **在 Chrome 中**：应用程序清单预计会放在不同的位置。请参阅 Chrome 文档中的本地消息主机位置。
### 应用持久化

* **在 Firefox 中**：本机消息传输连接关闭时，如果子进程没有脱离，Firefox 会将其杀死。在 Windows 系统中，浏览器会将本机应用程序的进程放入作业对象并杀死该作业。假设本地应用程序启动了其他进程，并希望这些进程在本地应用程序被杀死后继续打开。在这种情况下，本地应用程序必须使用 `CreateProcess` 而不是 `ShellExecute` 来启动其他进程，并使用 `CREATE_BREAKAWAY_FROM_JOB` 标志。
数据克隆算法
------

某些扩展 API 允许扩展从扩展的一部分向另一部分发送数据，例如 `runtime.sendMessage()`、`tabs.sendMessage()` (en-US)、`runtime.onMessage` (en-US)、`runtime.port` (en-US) 的 `postMessage()` 方法和 `tabs.executeScript()` (en-US)。

* **在 Firefox 中**：使用结构化克隆算法。
* **在 Chrome 中**：使用 JSON 序列化算法。将来可能会切换到结构化克隆（issue 248548）。

结构化克隆算法比 JSON 序列化算法支持更多类型。一个明显的例外是具有 `toJSON` 方法的（DOM）对象。DOM 对象默认情况下不可克隆，也不可进行 JSON 序列化，但使用 `toJSON()` 方法，这些对象可以进行 JSON 序列化（但仍不能使用结构化克隆算法进行克隆）。不可结构化克隆的 JSON 序列化对象示例包括 `URL` 和 `PerformanceEntry` 的实例。

依赖于 JSON 序列化算法中的 `toJSON()` 方法的扩展可使用 `JSON.stringify()` 后接 `JSON.parse()` 来确保可以交换消息，因为解析后的 JSON 值在结构上始终是可克隆的。


用户操作 - Mozilla

用户操作
====

一些 WebExtension API 执行的功能通常是由于用户操作而执行的。例如：

* 带有弹出窗口的浏览器操作会在用户单击时显示弹出窗口，但还有一个 `browserAction.openPopup` (en-US) API 允许扩展程序以编程方式打开弹出窗口。
* 如果扩展程序添加了侧边栏，用户通常通过浏览器内置的用户界面的某些部分（例如“视图/侧边栏”菜单）打开它。但还有一个 `sidebarAction.open` (en-US) API 允许扩展程序以编程方式打开其侧边栏。

为了遵循“没有意外”的原则，这类 API 只能从用户操作的处理器内部调用。用户操作包括以下内容：

* 点击扩展程序的浏览器操作或页面操作。
* 选择扩展定义的上下文菜单项。
* 激活扩展定义的键盘快捷键（仅从 Firefox 63 开始，被视为用户操作）。
* 点击与扩展程序捆绑在一起的页面中的按钮。

例如：

```js
function handleClick() {
  browser.sidebarAction.open();
}

browser.browserAction.onClicked.addListener(handleClick);
```

注意，普通网页中的用户操作不被视为用于此目的的用户操作。例如，如果用户单击普通网页中的按钮，并且内容脚本已为该按钮添加点击的处理器，并且在该处理器中向扩展的后台页面发送消息，那么后台页面的消息处理器不被视为正在处理用户操作。

此外，如果用户输入的处理器等待 promise，那么它作为用户输入处理器的状态将会丢失。例如：

```js
async function handleClick() {
  let result = await someAsyncFunction();

  // 这将失败，因为处理器丢失了其“用户操作处理器”状态
  browser.sidebarAction.open();
}

browser.browserAction.onClicked.addListener(handleClick);
```