merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Wed, 10 Jan 2018 01:32:52 +0200
changeset 450166 e4de69553e3faf8136eb9bb7f2f741e1b7e6f866
parent 450136 79ac3603854977f2ebd1a246f7a58915e0a479f1 (current diff)
parent 450165 dc271c111e3352f23b424f0a041432dac027ee78 (diff)
child 450167 ecb9935ce22318354a8edd4393533c4d01a60f10
child 450236 1e5cf8562780d15878fb234abe9625c03cbf4a5b
child 450264 9812c5d6f760aa9aafeee791692f9a056335053a
push id8527
push userCallek@gmail.com
push dateThu, 11 Jan 2018 21:05:50 +0000
treeherdermozilla-beta@95342d212a7a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone59.0a1
first release with
nightly linux32
e4de69553e3f / 59.0a1 / 20180109234707 / files
nightly linux64
e4de69553e3f / 59.0a1 / 20180109234707 / files
nightly mac
e4de69553e3f / 59.0a1 / 20180109234707 / files
nightly win32
e4de69553e3f / 59.0a1 / 20180109234707 / files
nightly win64
e4de69553e3f / 59.0a1 / 20180109234707 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central. r=merge a=merge
modules/libpref/init/all.js
testing/web-platform/meta/bluetooth/idl-Bluetooth.html.ini
testing/web-platform/meta/cookie-store/cookieStore_delete_arguments.tentative.html.ini
testing/web-platform/meta/cookie-store/cookieStore_getAll_arguments.tentative.html.ini
testing/web-platform/meta/cookie-store/cookieStore_get_arguments.tentative.html.ini
testing/web-platform/meta/cookie-store/cookieStore_has_arguments.tentative.html.ini
testing/web-platform/meta/cookie-store/cookieStore_set_arguments.tentative.html.ini
testing/web-platform/meta/cookie-store/document_getAll_set.tentative.html.ini
testing/web-platform/meta/cookie-store/document_get_delete.tentative.html.ini
testing/web-platform/meta/cookie-store/document_get_set.tentative.html.ini
testing/web-platform/meta/cookie-store/document_has.tentative.html.ini
testing/web-platform/meta/cookies/secure/set-from-ws.https.sub.html.ini
testing/web-platform/meta/css/CSS2/backgrounds/background-color-030.xht.ini
testing/web-platform/meta/css/CSS2/backgrounds/background-color-174.xht.ini
testing/web-platform/meta/css/CSS2/backgrounds/background-image-002.xht.ini
testing/web-platform/meta/css/CSS2/colors/color-083.xht.ini
testing/web-platform/meta/css/CSS2/colors/color-084.xht.ini
testing/web-platform/meta/css/css-backgrounds/border-radius-011.xht.ini
testing/web-platform/meta/css/css-color/currentcolor-001.html.ini
testing/web-platform/meta/css/css-color/currentcolor-002.html.ini
testing/web-platform/meta/css/css-fonts/font-variant-01.html.ini
testing/web-platform/meta/css/css-fonts/font-variant-02.html.ini
testing/web-platform/meta/css/css-fonts/font-variant-03.html.ini
testing/web-platform/meta/css/css-fonts/font-variant-04.html.ini
testing/web-platform/meta/css/css-grid/alignment/grid-gutters-002.html.ini
testing/web-platform/meta/css/css-grid/alignment/grid-gutters-004.html.ini
testing/web-platform/meta/css/css-grid/alignment/grid-gutters-006.html.ini
testing/web-platform/meta/css/css-grid/alignment/grid-gutters-008.html.ini
testing/web-platform/meta/css/css-masking/clip/clip-negative-values-004.html.ini
testing/web-platform/meta/css/css-masking/clip/clip-rect-auto-001.html.ini
testing/web-platform/meta/css/css-masking/clip/clip-rect-comma-002.html.ini
testing/web-platform/meta/css/css-multicol/multicol-count-computed-001.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-count-computed-002.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-count-large-001.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-count-large-002.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-fill-auto.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-inherit-004.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-rule-fraction-003.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-span-all-child-001.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-span-all-margin-nested-003.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-width-ems-001.xht.ini
testing/web-platform/meta/css/css-multicol/multicol-zero-height-001.xht.ini
testing/web-platform/meta/css/css-shapes/shape-outside/values/shape-image-threshold-003.html.ini
testing/web-platform/meta/css/css-style-attr/style-attr-urls-003.xht.ini
testing/web-platform/meta/encoding/big5-encoder.html.ini
testing/web-platform/meta/encoding/gbk-encoder.html.ini
testing/web-platform/meta/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange.html.ini
testing/web-platform/meta/html/semantics/forms/the-progress-element/progress.html.ini
testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html.ini
testing/web-platform/meta/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html.ini
testing/web-platform/meta/wake-lock/wakelock-object-is-independent.https.html.ini
testing/web-platform/meta/webdriver/tests/contexts/resizing_and_positioning.py.ini
testing/web-platform/meta/webdriver/tests/execute_async_script/user_prompts.py.ini
testing/web-platform/meta/webdriver/tests/execute_script/user_prompts.py.ini
testing/web-platform/meta/webdriver/tests/navigation/current_url.py.ini
testing/web-platform/meta/webdriver/tests/sessions/get_timeouts.py.ini
testing/web-platform/meta/webdriver/tests/sessions/status.py.ini
testing/web-platform/meta/webrtc/RTCPeerConnection-getTransceivers.html.ini
testing/web-platform/meta/webrtc/RTCPeerConnection-onnegotiationneeded.html.ini
testing/web-platform/meta/webrtc/RTCPeerConnection-ontrack.https.html.ini
testing/web-platform/meta/webrtc/RTCRtpSender-getStats.html.ini
testing/web-platform/meta/webrtc/RTCRtpSender-replaceTrack.html.ini
testing/web-platform/meta/webrtc/RTCRtpSender-setParameters.html.ini
testing/web-platform/meta/webrtc/RTCTrackEvent-constructor.html.ini
testing/web-platform/meta/webrtc/no-media-call.html.ini
testing/web-platform/meta/websockets/binary/001.html.ini
testing/web-platform/meta/websockets/binary/002.html.ini
testing/web-platform/meta/websockets/binary/004.html.ini
testing/web-platform/meta/websockets/binary/005.html.ini
testing/web-platform/meta/websockets/closing-handshake/002.html.ini
testing/web-platform/meta/websockets/closing-handshake/003.html.ini
testing/web-platform/meta/websockets/closing-handshake/004.html.ini
testing/web-platform/meta/websockets/constructor/006.html.ini
testing/web-platform/meta/websockets/constructor/009.html.ini
testing/web-platform/meta/websockets/constructor/013.html.ini
testing/web-platform/meta/websockets/constructor/016.html.ini
testing/web-platform/meta/websockets/constructor/018.html.ini
testing/web-platform/meta/websockets/constructor/019.html.ini
testing/web-platform/meta/websockets/constructor/020.html.ini
testing/web-platform/meta/websockets/constructor/022.html.ini
testing/web-platform/meta/websockets/cookies/001.html.ini
testing/web-platform/meta/websockets/cookies/002.html.ini
testing/web-platform/meta/websockets/cookies/003.html.ini
testing/web-platform/meta/websockets/cookies/004.html.ini
testing/web-platform/meta/websockets/cookies/005.html.ini
testing/web-platform/meta/websockets/cookies/007.html.ini
testing/web-platform/meta/websockets/extended-payload-length.html.ini
testing/web-platform/meta/websockets/interfaces/CloseEvent/clean-close.html.ini
testing/web-platform/meta/websockets/keeping-connection-open/001.html.ini
testing/web-platform/meta/websockets/opening-handshake/002.html.ini
testing/web-platform/meta/websockets/opening-handshake/003.html.ini
testing/web-platform/meta/websockets/opening-handshake/005.html.ini
testing/web-platform/tests/bluetooth/idl-Bluetooth.html
testing/web-platform/tests/cookie-store/cookieStore_delete_arguments.tentative.html
testing/web-platform/tests/cookie-store/cookieStore_getAll_arguments.tentative.html
testing/web-platform/tests/cookie-store/cookieStore_get_arguments.tentative.html
testing/web-platform/tests/cookie-store/cookieStore_has_arguments.tentative.html
testing/web-platform/tests/cookie-store/cookieStore_set_arguments.tentative.html
testing/web-platform/tests/cookie-store/document_getAll_set.tentative.html
testing/web-platform/tests/cookie-store/document_get_delete.tentative.html
testing/web-platform/tests/cookie-store/document_get_set.tentative.html
testing/web-platform/tests/cookie-store/document_has.tentative.html
testing/web-platform/tests/cookies/path/echo-cookie.html
testing/web-platform/tests/cookies/secure/set-from-ws.https.sub.html
testing/web-platform/tests/css/css-display/display-contents-replaced-001-ref.html
testing/web-platform/tests/css/css-display/display-contents-replaced-001.html
testing/web-platform/tests/css/css-multicol/multicol-br-inside-avoidcolumn-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-count-computed-001.xht
testing/web-platform/tests/css/css-multicol/multicol-count-computed-002.xht
testing/web-platform/tests/css/css-multicol/multicol-count-computed-2-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-count-computed-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-count-large-001.xht
testing/web-platform/tests/css/css-multicol/multicol-count-large-002.xht
testing/web-platform/tests/css/css-multicol/multicol-count-large-2-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-count-large-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-fill-auto-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-fill-auto.xht
testing/web-platform/tests/css/css-multicol/multicol-fill-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-inherit-004.xht
testing/web-platform/tests/css/css-multicol/multicol-inherit-4-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-groove-001-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-groove-001.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-inset-001.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-outset-001.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-ridge-001-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-rule-style-ridge-001.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-child-001-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-child-001.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-child-002-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-child-002.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-nested-003.xht
testing/web-platform/tests/css/css-multicol/multicol-span-all-margin-nested-3-ref.xht
testing/web-platform/tests/css/css-multicol/multicol-width-ems-001.xht
testing/web-platform/tests/css/css-multicol/multicol-width-ems-ref.xht
testing/web-platform/tests/css/css-style-attr/reference/ref-green-on-green2.xht
testing/web-platform/tests/css/css-values/iframe/vh-support-transform-origin-iframe.html
testing/web-platform/tests/css/css-values/iframe/vh-support-transform-translate-iframe.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-classic.html
testing/web-platform/tests/html/semantics/scripting-1/the-script-element/module/dynamic-import/string-compilation-base-url-module.html
testing/web-platform/tests/quirks-mode/OWNERS
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/a-ref.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/match/a-ref.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/match/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/match/support/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/match/support/tools/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/match/tools/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/not-match/a-ref.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/not-match/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/not-match/support/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/not-match/tools/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/selectors/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/support/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/support/tools/a.html
testing/web-platform/tests/tools/lint/tests/dummy/css-unique/tools/a.html
testing/web-platform/tests/tools/py/.hgignore
testing/web-platform/tests/tools/py/.hgtags
testing/web-platform/tests/tools/py/AUTHORS
testing/web-platform/tests/tools/py/CHANGELOG
testing/web-platform/tests/tools/py/LICENSE
testing/web-platform/tests/tools/py/MANIFEST.in
testing/web-platform/tests/tools/py/README.txt
testing/web-platform/tests/tools/py/bench/localpath.py
testing/web-platform/tests/tools/py/conftest.py
testing/web-platform/tests/tools/py/doc/Makefile
testing/web-platform/tests/tools/py/doc/_templates/layout.html
testing/web-platform/tests/tools/py/doc/announce/release-0.9.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-0.9.2.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.0.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.0.1.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.0.2.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.1.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.1.1.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.2.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.2.1.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.3.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.3.1.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.3.2.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.3.3.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.3.4.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.4.0.txt
testing/web-platform/tests/tools/py/doc/announce/release-1.4.1.txt
testing/web-platform/tests/tools/py/doc/announce/releases.txt
testing/web-platform/tests/tools/py/doc/changelog.txt
testing/web-platform/tests/tools/py/doc/code.txt
testing/web-platform/tests/tools/py/doc/conf.py
testing/web-platform/tests/tools/py/doc/download.html
testing/web-platform/tests/tools/py/doc/example/genhtml.py
testing/web-platform/tests/tools/py/doc/example/genhtmlcss.py
testing/web-platform/tests/tools/py/doc/example/genxml.py
testing/web-platform/tests/tools/py/doc/faq.txt
testing/web-platform/tests/tools/py/doc/img/pylib.png
testing/web-platform/tests/tools/py/doc/index.txt
testing/web-platform/tests/tools/py/doc/install.txt
testing/web-platform/tests/tools/py/doc/io.txt
testing/web-platform/tests/tools/py/doc/links.inc
testing/web-platform/tests/tools/py/doc/log.txt
testing/web-platform/tests/tools/py/doc/misc.txt
testing/web-platform/tests/tools/py/doc/path.txt
testing/web-platform/tests/tools/py/doc/style.css
testing/web-platform/tests/tools/py/doc/xml.txt
testing/web-platform/tests/tools/py/py/__init__.py
testing/web-platform/tests/tools/py/py/__metainfo.py
testing/web-platform/tests/tools/py/py/_apipkg.py
testing/web-platform/tests/tools/py/py/_builtin.py
testing/web-platform/tests/tools/py/py/_code/__init__.py
testing/web-platform/tests/tools/py/py/_code/_assertionnew.py
testing/web-platform/tests/tools/py/py/_code/_assertionold.py
testing/web-platform/tests/tools/py/py/_code/_py2traceback.py
testing/web-platform/tests/tools/py/py/_code/assertion.py
testing/web-platform/tests/tools/py/py/_code/code.py
testing/web-platform/tests/tools/py/py/_code/source.py
testing/web-platform/tests/tools/py/py/_error.py
testing/web-platform/tests/tools/py/py/_iniconfig.py
testing/web-platform/tests/tools/py/py/_io/__init__.py
testing/web-platform/tests/tools/py/py/_io/capture.py
testing/web-platform/tests/tools/py/py/_io/saferepr.py
testing/web-platform/tests/tools/py/py/_io/terminalwriter.py
testing/web-platform/tests/tools/py/py/_log/__init__.py
testing/web-platform/tests/tools/py/py/_log/log.py
testing/web-platform/tests/tools/py/py/_log/warning.py
testing/web-platform/tests/tools/py/py/_path/__init__.py
testing/web-platform/tests/tools/py/py/_path/cacheutil.py
testing/web-platform/tests/tools/py/py/_path/common.py
testing/web-platform/tests/tools/py/py/_path/local.py
testing/web-platform/tests/tools/py/py/_path/svnurl.py
testing/web-platform/tests/tools/py/py/_path/svnwc.py
testing/web-platform/tests/tools/py/py/_process/__init__.py
testing/web-platform/tests/tools/py/py/_process/cmdexec.py
testing/web-platform/tests/tools/py/py/_process/forkedfunc.py
testing/web-platform/tests/tools/py/py/_process/killproc.py
testing/web-platform/tests/tools/py/py/_std.py
testing/web-platform/tests/tools/py/py/_xmlgen.py
testing/web-platform/tests/tools/py/py/test.py
testing/web-platform/tests/tools/py/setup.cfg
testing/web-platform/tests/tools/py/setup.py
testing/web-platform/tests/tools/py/testing/code/test_assertion.py
testing/web-platform/tests/tools/py/testing/code/test_code.py
testing/web-platform/tests/tools/py/testing/code/test_excinfo.py
testing/web-platform/tests/tools/py/testing/code/test_source.py
testing/web-platform/tests/tools/py/testing/conftest.py
testing/web-platform/tests/tools/py/testing/io_/__init__.py
testing/web-platform/tests/tools/py/testing/io_/test_capture.py
testing/web-platform/tests/tools/py/testing/io_/test_saferepr.py
testing/web-platform/tests/tools/py/testing/io_/test_terminalwriter.py
testing/web-platform/tests/tools/py/testing/log/__init__.py
testing/web-platform/tests/tools/py/testing/log/test_log.py
testing/web-platform/tests/tools/py/testing/log/test_warning.py
testing/web-platform/tests/tools/py/testing/path/common.py
testing/web-platform/tests/tools/py/testing/path/conftest.py
testing/web-platform/tests/tools/py/testing/path/repotest.dump
testing/web-platform/tests/tools/py/testing/path/svntestbase.py
testing/web-platform/tests/tools/py/testing/path/test_cacheutil.py
testing/web-platform/tests/tools/py/testing/path/test_local.py
testing/web-platform/tests/tools/py/testing/path/test_svnauth.py
testing/web-platform/tests/tools/py/testing/path/test_svnurl.py
testing/web-platform/tests/tools/py/testing/path/test_svnwc.py
testing/web-platform/tests/tools/py/testing/process/__init__.py
testing/web-platform/tests/tools/py/testing/process/test_cmdexec.py
testing/web-platform/tests/tools/py/testing/process/test_forkedfunc.py
testing/web-platform/tests/tools/py/testing/process/test_killproc.py
testing/web-platform/tests/tools/py/testing/root/__init__.py
testing/web-platform/tests/tools/py/testing/root/test_builtin.py
testing/web-platform/tests/tools/py/testing/root/test_error.py
testing/web-platform/tests/tools/py/testing/root/test_py_imports.py
testing/web-platform/tests/tools/py/testing/root/test_std.py
testing/web-platform/tests/tools/py/testing/root/test_xmlgen.py
testing/web-platform/tests/tools/py/testing/test_iniconfig.py
testing/web-platform/tests/tools/py/tox.ini
testing/web-platform/tests/tools/pytest/.coveragerc
testing/web-platform/tests/tools/pytest/.gitattributes
testing/web-platform/tests/tools/pytest/.github/ISSUE_TEMPLATE.md
testing/web-platform/tests/tools/pytest/.github/PULL_REQUEST_TEMPLATE.md
testing/web-platform/tests/tools/pytest/.gitignore
testing/web-platform/tests/tools/pytest/.travis.yml
testing/web-platform/tests/tools/pytest/AUTHORS
testing/web-platform/tests/tools/pytest/CHANGELOG.rst
testing/web-platform/tests/tools/pytest/CONTRIBUTING.rst
testing/web-platform/tests/tools/pytest/HOWTORELEASE.rst
testing/web-platform/tests/tools/pytest/ISSUES.txt
testing/web-platform/tests/tools/pytest/LICENSE
testing/web-platform/tests/tools/pytest/MANIFEST.in
testing/web-platform/tests/tools/pytest/README.rst
testing/web-platform/tests/tools/pytest/_pytest/__init__.py
testing/web-platform/tests/tools/pytest/_pytest/_argcomplete.py
testing/web-platform/tests/tools/pytest/_pytest/_code/__init__.py
testing/web-platform/tests/tools/pytest/_pytest/_code/_py2traceback.py
testing/web-platform/tests/tools/pytest/_pytest/_code/code.py
testing/web-platform/tests/tools/pytest/_pytest/_code/source.py
testing/web-platform/tests/tools/pytest/_pytest/_pluggy.py
testing/web-platform/tests/tools/pytest/_pytest/assertion/__init__.py
testing/web-platform/tests/tools/pytest/_pytest/assertion/reinterpret.py
testing/web-platform/tests/tools/pytest/_pytest/assertion/rewrite.py
testing/web-platform/tests/tools/pytest/_pytest/assertion/util.py
testing/web-platform/tests/tools/pytest/_pytest/cacheprovider.py
testing/web-platform/tests/tools/pytest/_pytest/capture.py
testing/web-platform/tests/tools/pytest/_pytest/config.py
testing/web-platform/tests/tools/pytest/_pytest/doctest.py
testing/web-platform/tests/tools/pytest/_pytest/genscript.py
testing/web-platform/tests/tools/pytest/_pytest/helpconfig.py
testing/web-platform/tests/tools/pytest/_pytest/hookspec.py
testing/web-platform/tests/tools/pytest/_pytest/impl
testing/web-platform/tests/tools/pytest/_pytest/junitxml.py
testing/web-platform/tests/tools/pytest/_pytest/main.py
testing/web-platform/tests/tools/pytest/_pytest/mark.py
testing/web-platform/tests/tools/pytest/_pytest/monkeypatch.py
testing/web-platform/tests/tools/pytest/_pytest/nose.py
testing/web-platform/tests/tools/pytest/_pytest/pastebin.py
testing/web-platform/tests/tools/pytest/_pytest/pdb.py
testing/web-platform/tests/tools/pytest/_pytest/pytester.py
testing/web-platform/tests/tools/pytest/_pytest/python.py
testing/web-platform/tests/tools/pytest/_pytest/recwarn.py
testing/web-platform/tests/tools/pytest/_pytest/resultlog.py
testing/web-platform/tests/tools/pytest/_pytest/runner.py
testing/web-platform/tests/tools/pytest/_pytest/skipping.py
testing/web-platform/tests/tools/pytest/_pytest/standalonetemplate.py
testing/web-platform/tests/tools/pytest/_pytest/terminal.py
testing/web-platform/tests/tools/pytest/_pytest/tmpdir.py
testing/web-platform/tests/tools/pytest/_pytest/unittest.py
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/README.md
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/__init__.py
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/DESCRIPTION.rst
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/METADATA
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/RECORD
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/WHEEL
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/metadata.json
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/pbr.json
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy-0.3.1.dist-info/top_level.txt
testing/web-platform/tests/tools/pytest/_pytest/vendored_packages/pluggy.py
testing/web-platform/tests/tools/pytest/appveyor.yml
testing/web-platform/tests/tools/pytest/bench/bench.py
testing/web-platform/tests/tools/pytest/bench/bench_argcomplete.py
testing/web-platform/tests/tools/pytest/bench/empty.py
testing/web-platform/tests/tools/pytest/bench/manyparam.py
testing/web-platform/tests/tools/pytest/bench/skip.py
testing/web-platform/tests/tools/pytest/doc/en/Makefile
testing/web-platform/tests/tools/pytest/doc/en/_getdoctarget.py
testing/web-platform/tests/tools/pytest/doc/en/_templates/globaltoc.html
testing/web-platform/tests/tools/pytest/doc/en/_templates/layout.html
testing/web-platform/tests/tools/pytest/doc/en/_templates/links.html
testing/web-platform/tests/tools/pytest/doc/en/_templates/sidebarintro.html
testing/web-platform/tests/tools/pytest/doc/en/_themes/.gitignore
testing/web-platform/tests/tools/pytest/doc/en/_themes/LICENSE
testing/web-platform/tests/tools/pytest/doc/en/_themes/README
testing/web-platform/tests/tools/pytest/doc/en/_themes/flask/layout.html
testing/web-platform/tests/tools/pytest/doc/en/_themes/flask/relations.html
testing/web-platform/tests/tools/pytest/doc/en/_themes/flask/static/flasky.css_t
testing/web-platform/tests/tools/pytest/doc/en/_themes/flask/theme.conf
testing/web-platform/tests/tools/pytest/doc/en/_themes/flask_theme_support.py
testing/web-platform/tests/tools/pytest/doc/en/adopt.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/index.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.0.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.0.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.0.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.0.3.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.1.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.1.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.1.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.1.3.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.2.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.2.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.2.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.2.4.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.3.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.4.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.3.5.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.4.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.4.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.4.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.5.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.5.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.5.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.6.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.6.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.6.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.6.3.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.7.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.7.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.7.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.2.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.3.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.4.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.5.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.6.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.8.7.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.9.0.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/release-2.9.1.rst
testing/web-platform/tests/tools/pytest/doc/en/announce/sprint2016.rst
testing/web-platform/tests/tools/pytest/doc/en/assert.rst
testing/web-platform/tests/tools/pytest/doc/en/bash-completion.rst
testing/web-platform/tests/tools/pytest/doc/en/builtin.rst
testing/web-platform/tests/tools/pytest/doc/en/cache.rst
testing/web-platform/tests/tools/pytest/doc/en/capture.rst
testing/web-platform/tests/tools/pytest/doc/en/changelog.rst
testing/web-platform/tests/tools/pytest/doc/en/check_sphinx.py
testing/web-platform/tests/tools/pytest/doc/en/conf.py
testing/web-platform/tests/tools/pytest/doc/en/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/contact.rst
testing/web-platform/tests/tools/pytest/doc/en/contents.rst
testing/web-platform/tests/tools/pytest/doc/en/contributing.rst
testing/web-platform/tests/tools/pytest/doc/en/customize.rst
testing/web-platform/tests/tools/pytest/doc/en/doctest.rst
testing/web-platform/tests/tools/pytest/doc/en/example/assertion/failure_demo.py
testing/web-platform/tests/tools/pytest/doc/en/example/assertion/global_testmodule_config/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/example/assertion/global_testmodule_config/test_hello.py
testing/web-platform/tests/tools/pytest/doc/en/example/assertion/test_failures.py
testing/web-platform/tests/tools/pytest/doc/en/example/assertion/test_setup_flow_example.py
testing/web-platform/tests/tools/pytest/doc/en/example/attic.rst
testing/web-platform/tests/tools/pytest/doc/en/example/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/example/costlysetup/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/example/costlysetup/sub1/__init__.py
testing/web-platform/tests/tools/pytest/doc/en/example/costlysetup/sub1/test_quick.py
testing/web-platform/tests/tools/pytest/doc/en/example/costlysetup/sub2/__init__.py
testing/web-platform/tests/tools/pytest/doc/en/example/costlysetup/sub2/test_two.py
testing/web-platform/tests/tools/pytest/doc/en/example/index.rst
testing/web-platform/tests/tools/pytest/doc/en/example/layout1/setup.cfg
testing/web-platform/tests/tools/pytest/doc/en/example/markers.rst
testing/web-platform/tests/tools/pytest/doc/en/example/multipython.py
testing/web-platform/tests/tools/pytest/doc/en/example/nonpython.rst
testing/web-platform/tests/tools/pytest/doc/en/example/nonpython/__init__.py
testing/web-platform/tests/tools/pytest/doc/en/example/nonpython/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/example/nonpython/test_simple.yml
testing/web-platform/tests/tools/pytest/doc/en/example/parametrize.rst
testing/web-platform/tests/tools/pytest/doc/en/example/py2py3/conftest.py
testing/web-platform/tests/tools/pytest/doc/en/example/py2py3/test_py2.py
testing/web-platform/tests/tools/pytest/doc/en/example/py2py3/test_py3.py
testing/web-platform/tests/tools/pytest/doc/en/example/pythoncollection.py
testing/web-platform/tests/tools/pytest/doc/en/example/pythoncollection.rst
testing/web-platform/tests/tools/pytest/doc/en/example/reportingdemo.rst
testing/web-platform/tests/tools/pytest/doc/en/example/simple.rst
testing/web-platform/tests/tools/pytest/doc/en/example/special.rst
testing/web-platform/tests/tools/pytest/doc/en/example/xfail_demo.py
testing/web-platform/tests/tools/pytest/doc/en/faq.rst
testing/web-platform/tests/tools/pytest/doc/en/feedback.rst
testing/web-platform/tests/tools/pytest/doc/en/fixture.rst
testing/web-platform/tests/tools/pytest/doc/en/funcarg_compare.rst
testing/web-platform/tests/tools/pytest/doc/en/funcargs.rst
testing/web-platform/tests/tools/pytest/doc/en/genapi.py
testing/web-platform/tests/tools/pytest/doc/en/getting-started.rst
testing/web-platform/tests/tools/pytest/doc/en/goodpractices.rst
testing/web-platform/tests/tools/pytest/doc/en/img/cramer2.png
testing/web-platform/tests/tools/pytest/doc/en/img/freiburg2.jpg
testing/web-platform/tests/tools/pytest/doc/en/img/gaynor3.png
testing/web-platform/tests/tools/pytest/doc/en/img/keleshev.png
testing/web-platform/tests/tools/pytest/doc/en/img/pullrequest.png
testing/web-platform/tests/tools/pytest/doc/en/img/pylib.png
testing/web-platform/tests/tools/pytest/doc/en/img/pytest1.png
testing/web-platform/tests/tools/pytest/doc/en/img/pytest1favi.ico
testing/web-platform/tests/tools/pytest/doc/en/img/theuni.png
testing/web-platform/tests/tools/pytest/doc/en/index.rst
testing/web-platform/tests/tools/pytest/doc/en/license.rst
testing/web-platform/tests/tools/pytest/doc/en/links.inc
testing/web-platform/tests/tools/pytest/doc/en/mark.rst
testing/web-platform/tests/tools/pytest/doc/en/monkeypatch.rst
testing/web-platform/tests/tools/pytest/doc/en/naming20.rst
testing/web-platform/tests/tools/pytest/doc/en/nose.rst
testing/web-platform/tests/tools/pytest/doc/en/overview.rst
testing/web-platform/tests/tools/pytest/doc/en/parametrize.rst
testing/web-platform/tests/tools/pytest/doc/en/plugins.rst
testing/web-platform/tests/tools/pytest/doc/en/projects.rst
testing/web-platform/tests/tools/pytest/doc/en/pytest.ini
testing/web-platform/tests/tools/pytest/doc/en/recwarn.rst
testing/web-platform/tests/tools/pytest/doc/en/setup.rst
testing/web-platform/tests/tools/pytest/doc/en/skipping.rst
testing/web-platform/tests/tools/pytest/doc/en/status.rst
testing/web-platform/tests/tools/pytest/doc/en/talks.rst
testing/web-platform/tests/tools/pytest/doc/en/test/attic.rst
testing/web-platform/tests/tools/pytest/doc/en/test/config.html
testing/web-platform/tests/tools/pytest/doc/en/test/dist.html
testing/web-platform/tests/tools/pytest/doc/en/test/extend.html
testing/web-platform/tests/tools/pytest/doc/en/test/index.rst
testing/web-platform/tests/tools/pytest/doc/en/test/mission.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/cov.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/coverage.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/django.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/figleaf.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/genscript.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/helpconfig.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/index.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/links.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/nose.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/oejskit.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/terminal.rst
testing/web-platform/tests/tools/pytest/doc/en/test/plugin/xdist.rst
testing/web-platform/tests/tools/pytest/doc/en/test/test.html
testing/web-platform/tests/tools/pytest/doc/en/tmpdir.rst
testing/web-platform/tests/tools/pytest/doc/en/unittest.rst
testing/web-platform/tests/tools/pytest/doc/en/usage.rst
testing/web-platform/tests/tools/pytest/doc/en/writing_plugins.rst
testing/web-platform/tests/tools/pytest/doc/en/xdist.rst
testing/web-platform/tests/tools/pytest/doc/en/xunit_setup.rst
testing/web-platform/tests/tools/pytest/doc/en/yieldfixture.rst
testing/web-platform/tests/tools/pytest/extra/get_issues.py
testing/web-platform/tests/tools/pytest/extra/setup-py.test/setup.py
testing/web-platform/tests/tools/pytest/plugin-test.sh
testing/web-platform/tests/tools/pytest/pytest.py
testing/web-platform/tests/tools/pytest/requirements-docs.txt
testing/web-platform/tests/tools/pytest/runtox.py
testing/web-platform/tests/tools/pytest/setup.cfg
testing/web-platform/tests/tools/pytest/setup.py
testing/web-platform/tests/tools/pytest/testing/acceptance_test.py
testing/web-platform/tests/tools/pytest/testing/code/test_code.py
testing/web-platform/tests/tools/pytest/testing/code/test_excinfo.py
testing/web-platform/tests/tools/pytest/testing/code/test_source.py
testing/web-platform/tests/tools/pytest/testing/cx_freeze/install_cx_freeze.py
testing/web-platform/tests/tools/pytest/testing/cx_freeze/runtests_script.py
testing/web-platform/tests/tools/pytest/testing/cx_freeze/runtests_setup.py
testing/web-platform/tests/tools/pytest/testing/cx_freeze/tests/test_doctest.txt
testing/web-platform/tests/tools/pytest/testing/cx_freeze/tests/test_trivial.py
testing/web-platform/tests/tools/pytest/testing/cx_freeze/tox_run.py
testing/web-platform/tests/tools/pytest/testing/python/collect.py
testing/web-platform/tests/tools/pytest/testing/python/fixture.py
testing/web-platform/tests/tools/pytest/testing/python/integration.py
testing/web-platform/tests/tools/pytest/testing/python/metafunc.py
testing/web-platform/tests/tools/pytest/testing/python/raises.py
testing/web-platform/tests/tools/pytest/testing/test_argcomplete.py
testing/web-platform/tests/tools/pytest/testing/test_assertinterpret.py
testing/web-platform/tests/tools/pytest/testing/test_assertion.py
testing/web-platform/tests/tools/pytest/testing/test_assertrewrite.py
testing/web-platform/tests/tools/pytest/testing/test_cache.py
testing/web-platform/tests/tools/pytest/testing/test_capture.py
testing/web-platform/tests/tools/pytest/testing/test_collection.py
testing/web-platform/tests/tools/pytest/testing/test_config.py
testing/web-platform/tests/tools/pytest/testing/test_conftest.py
testing/web-platform/tests/tools/pytest/testing/test_doctest.py
testing/web-platform/tests/tools/pytest/testing/test_genscript.py
testing/web-platform/tests/tools/pytest/testing/test_helpconfig.py
testing/web-platform/tests/tools/pytest/testing/test_junitxml.py
testing/web-platform/tests/tools/pytest/testing/test_mark.py
testing/web-platform/tests/tools/pytest/testing/test_monkeypatch.py
testing/web-platform/tests/tools/pytest/testing/test_nose.py
testing/web-platform/tests/tools/pytest/testing/test_parseopt.py
testing/web-platform/tests/tools/pytest/testing/test_pastebin.py
testing/web-platform/tests/tools/pytest/testing/test_pdb.py
testing/web-platform/tests/tools/pytest/testing/test_pluginmanager.py
testing/web-platform/tests/tools/pytest/testing/test_pytester.py
testing/web-platform/tests/tools/pytest/testing/test_recwarn.py
testing/web-platform/tests/tools/pytest/testing/test_resultlog.py
testing/web-platform/tests/tools/pytest/testing/test_runner.py
testing/web-platform/tests/tools/pytest/testing/test_runner_xunit.py
testing/web-platform/tests/tools/pytest/testing/test_session.py
testing/web-platform/tests/tools/pytest/testing/test_skipping.py
testing/web-platform/tests/tools/pytest/testing/test_terminal.py
testing/web-platform/tests/tools/pytest/testing/test_tmpdir.py
testing/web-platform/tests/tools/pytest/testing/test_unittest.py
testing/web-platform/tests/tools/pytest/tox.ini
testing/web-platform/tests/tools/wptrunner/OWNERS
testing/web-platform/tests/wake-lock/wakelock-object-is-independent.https.html
testing/web-platform/tests/webrtc/RTCRtpSender-getStats.html
testing/web-platform/tests/worklets/resources/import-empty-worklet-script.js
testing/web-platform/tests/worklets/resources/referrer.py
--- a/dom/base/RangeBoundary.h
+++ b/dom/base/RangeBoundary.h
@@ -282,18 +282,24 @@ public:
   AsRaw() const
   {
     return RangeBoundaryBase<nsINode*, nsIContent*>(*this);
   }
 
   template<typename A, typename B>
   RangeBoundaryBase& operator=(const RangeBoundaryBase<A,B>& aOther)
   {
-    mParent = aOther.mParent;
-    mRef = aOther.mRef;
+    // mParent and mRef can be strong pointers, so better to try to avoid any
+    // extra AddRef/Release calls.
+    if (mParent != aOther.mParent) {
+      mParent = aOther.mParent;
+    }
+    if (mRef != aOther.mRef) {
+      mRef = aOther.mRef;
+    }
     mOffset = aOther.mOffset;
     return *this;
   }
 
   template<typename A, typename B>
   bool operator==(const RangeBoundaryBase<A, B>& aOther) const
   {
     return mParent == aOther.mParent &&
--- a/dom/base/nsTextFragment.cpp
+++ b/dom/base/nsTextFragment.cpp
@@ -197,16 +197,45 @@ FirstNon8Bit(const char16_t *str, const 
 
   return FirstNon8BitUnvectorized(str, end);
 }
 
 bool
 nsTextFragment::SetTo(const char16_t* aBuffer, int32_t aLength,
                       bool aUpdateBidi, bool aForce2b)
 {
+  if (aForce2b && mState.mIs2b && !m2b->IsReadonly()) {
+    uint32_t storageSize = m2b->StorageSize();
+    uint32_t neededSize = aLength * sizeof(char16_t);
+    if (!neededSize) {
+      if (storageSize < AutoStringDefaultStorageSize) {
+        // If we're storing small enough nsStringBuffer, let's preserve it.
+
+        static_cast<char16_t*>(m2b->Data())[0] = char16_t(0);
+        mState.mLength = 0;
+        mState.mIsBidi = false;
+        return true;
+      }
+    } else if ((neededSize < storageSize) &&
+               ((storageSize / 2) <
+                (neededSize + AutoStringDefaultStorageSize))) {
+      // Don't try to reuse the existing nsStringBuffer, if it would have
+      // lots of unused space.
+
+      memcpy(m2b->Data(), aBuffer, neededSize);
+      static_cast<char16_t*>(m2b->Data())[aLength] = char16_t(0);
+      mState.mLength = aLength;
+      mState.mIsBidi = false;
+      if (aUpdateBidi) {
+        UpdateBidiFlag(aBuffer, aLength);
+      }
+      return true;
+    }
+  }
+
   ReleaseText();
 
   if (aLength == 0) {
     return true;
   }
 
   char16_t firstChar = *aBuffer;
   if (!aForce2b && aLength == 1 && firstChar < 256) {
--- a/editor/libeditor/EditorBase.cpp
+++ b/editor/libeditor/EditorBase.cpp
@@ -5348,44 +5348,44 @@ EditorBase::IsModifiableNode(nsIDOMNode*
 }
 
 bool
 EditorBase::IsModifiableNode(nsINode* aNode)
 {
   return true;
 }
 
-already_AddRefed<nsIContent>
+nsIContent*
 EditorBase::GetFocusedContent()
 {
-  nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
+  nsIDOMEventTarget* piTarget = GetDOMEventTarget();
   if (!piTarget) {
     return nullptr;
   }
 
   nsFocusManager* fm = nsFocusManager::GetFocusManager();
   NS_ENSURE_TRUE(fm, nullptr);
 
   nsIContent* content = fm->GetFocusedContent();
   MOZ_ASSERT((content == piTarget) == SameCOMIdentity(content, piTarget));
 
-  return (content == piTarget) ?
-    piTarget.forget().downcast<nsIContent>() : nullptr;
+  return (content == piTarget) ? content : nullptr;
 }
 
 already_AddRefed<nsIContent>
 EditorBase::GetFocusedContentForIME()
 {
-  return GetFocusedContent();
+  nsCOMPtr<nsIContent> content = GetFocusedContent();
+  return content.forget();
 }
 
 bool
 EditorBase::IsActiveInDOMWindow()
 {
-  nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
+  nsIDOMEventTarget* piTarget = GetDOMEventTarget();
   if (!piTarget) {
     return false;
   }
 
   nsFocusManager* fm = nsFocusManager::GetFocusManager();
   NS_ENSURE_TRUE(fm, false);
 
   nsCOMPtr<nsIDocument> document = GetDocument();
@@ -5407,17 +5407,17 @@ EditorBase::IsAcceptableInputEvent(Widge
   // If the event is trusted, the event should always cause input.
   if (NS_WARN_IF(!aGUIEvent)) {
     return false;
   }
 
   // If this is dispatched by using cordinates but this editor doesn't have
   // focus, we shouldn't handle it.
   if (aGUIEvent->IsUsingCoordinates()) {
-    nsCOMPtr<nsIContent> focusedContent = GetFocusedContent();
+    nsIContent* focusedContent = GetFocusedContent();
     if (!focusedContent) {
       return false;
     }
   }
 
   // If a composition event isn't dispatched via widget, we need to ignore them
   // since they cannot be managed by TextComposition. E.g., the event was
   // created by chrome JS.
--- a/editor/libeditor/EditorBase.h
+++ b/editor/libeditor/EditorBase.h
@@ -1159,17 +1159,17 @@ public:
                                   Selection* aSelection,
                                   nsINode* previousSelectedNode,
                                   uint32_t previousSelectedOffset,
                                   nsINode* aStartContainer,
                                   uint32_t aStartOffset,
                                   nsINode* aEndContainer,
                                   uint32_t aEndOffset);
 
-  virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() = 0;
+  virtual dom::EventTarget* GetDOMEventTarget() = 0;
 
   /**
    * Fast non-refcounting editor root element accessor
    */
   Element* GetRoot() const { return mRootElement; }
 
   /**
    * Likewise, but gets the editor's root instead, which is different for HTML
@@ -1339,17 +1339,17 @@ public:
   /**
    * Get the input event target. This might return null.
    */
   virtual already_AddRefed<nsIContent> GetInputEventTargetContent() = 0;
 
   /**
    * Get the focused content, if we're focused.  Returns null otherwise.
    */
-  virtual already_AddRefed<nsIContent> GetFocusedContent();
+  virtual nsIContent* GetFocusedContent();
 
   /**
    * Get the focused content for the argument of some IMEStateManager's
    * methods.
    */
   virtual already_AddRefed<nsIContent> GetFocusedContentForIME();
 
   /**
--- a/editor/libeditor/EditorEventListener.cpp
+++ b/editor/libeditor/EditorEventListener.cpp
@@ -139,17 +139,17 @@ EditorEventListener::Connect(EditorBase*
   return rv;
 }
 
 nsresult
 EditorEventListener::InstallToEditor()
 {
   NS_PRECONDITION(mEditorBase, "The caller must set mEditorBase");
 
-  nsCOMPtr<EventTarget> piTarget = mEditorBase->GetDOMEventTarget();
+  EventTarget* piTarget = mEditorBase->GetDOMEventTarget();
   NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE);
 
   // register the event listeners with the listener manager
   EventListenerManager* elmP = piTarget->GetOrCreateListenerManager();
   NS_ENSURE_STATE(elmP);
 
 #ifdef HANDLE_NATIVE_TEXT_DIRECTION_SWITCH
   elmP->AddEventListenerByType(this,
@@ -1088,17 +1088,17 @@ EditorEventListener::Focus(InternalFocus
   // Spell check a textarea the first time that it is focused.
   SpellCheckIfNeeded();
   if (!editorBase) {
     // In e10s, this can cause us to flush notifications, which can destroy
     // the node we're about to focus.
     return NS_OK;
   }
 
-  nsCOMPtr<nsIDOMEventTarget> target = aFocusEvent->GetDOMEventTarget();
+  nsIDOMEventTarget* target = aFocusEvent->GetDOMEventTarget();
   nsCOMPtr<nsINode> node = do_QueryInterface(target);
   NS_ENSURE_TRUE(node, NS_ERROR_UNEXPECTED);
 
   // If the target is a document node but it's not editable, we should ignore
   // it because actual focused element's event is going to come.
   if (node->IsNodeOfType(nsINode::eDOCUMENT) &&
       !node->HasFlag(NODE_IS_EDITABLE)) {
     return NS_OK;
@@ -1216,17 +1216,17 @@ EditorEventListener::ShouldHandleNativeK
   // Only return true if the target of the event is a desendant of the active
   // editing host in order to match the similar decision made in
   // nsXBLWindowKeyHandler.
   // Note that IsAcceptableInputEvent doesn't check for the active editing
   // host for keyboard events, otherwise this check would have been
   // unnecessary.  IsAcceptableInputEvent currently makes a similar check for
   // mouse events.
 
-  nsCOMPtr<nsIDOMEventTarget> target = aKeyboardEvent->GetDOMEventTarget();
+  nsIDOMEventTarget* target = aKeyboardEvent->GetDOMEventTarget();
   nsCOMPtr<nsIContent> targetContent = do_QueryInterface(target);
   if (!targetContent) {
     return false;
   }
 
   RefPtr<EditorBase> editorBase(mEditorBase);
   HTMLEditor* htmlEditor = editorBase->AsHTMLEditor();
   if (!htmlEditor) {
--- a/editor/libeditor/HTMLAbsPositionEditor.cpp
+++ b/editor/libeditor/HTMLAbsPositionEditor.cpp
@@ -402,17 +402,17 @@ nsresult
 HTMLEditor::GrabberClicked()
 {
   // add a mouse move listener to the editor
   nsresult rv = NS_OK;
   if (!mMouseMotionListenerP) {
     mMouseMotionListenerP = new ResizerMouseMotionListener(*this);
     if (!mMouseMotionListenerP) {return NS_ERROR_NULL_POINTER;}
 
-    nsCOMPtr<nsIDOMEventTarget> piTarget = GetDOMEventTarget();
+    nsIDOMEventTarget* piTarget = GetDOMEventTarget();
     NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE);
 
     rv = piTarget->AddEventListener(NS_LITERAL_STRING("mousemove"),
                                      mMouseMotionListenerP,
                                      false, false);
     NS_ASSERTION(NS_SUCCEEDED(rv),
                  "failed to register mouse motion listener");
   }
--- a/editor/libeditor/HTMLEditor.cpp
+++ b/editor/libeditor/HTMLEditor.cpp
@@ -4528,54 +4528,53 @@ HTMLEditor::GetReturnInParagraphCreatesN
 
 nsresult
 HTMLEditor::GetReturnInParagraphCreatesNewParagraph(bool* aCreatesNewParagraph)
 {
   *aCreatesNewParagraph = mCRInParagraphCreatesParagraph;
   return NS_OK;
 }
 
-already_AddRefed<nsIContent>
+nsIContent*
 HTMLEditor::GetFocusedContent()
 {
   nsFocusManager* fm = nsFocusManager::GetFocusManager();
   NS_ENSURE_TRUE(fm, nullptr);
 
   nsCOMPtr<nsIContent> focusedContent = fm->GetFocusedContent();
 
   nsCOMPtr<nsIDocument> document = GetDocument();
   if (NS_WARN_IF(!document)) {
     return nullptr;
   }
   bool inDesignMode = document->HasFlag(NODE_IS_EDITABLE);
   if (!focusedContent) {
     // in designMode, nobody gets focus in most cases.
     if (inDesignMode && OurWindowHasFocus()) {
-      nsCOMPtr<nsIContent> rootContent = document->GetRootElement();
-      return rootContent.forget();
+      return document->GetRootElement();
     }
     return nullptr;
   }
 
   if (inDesignMode) {
     return OurWindowHasFocus() &&
       nsContentUtils::ContentIsDescendantOf(focusedContent, document) ?
-        focusedContent.forget() : nullptr;
+        focusedContent.get() : nullptr;
   }
 
   // We're HTML editor for contenteditable
 
   // If the focused content isn't editable, or it has independent selection,
   // we don't have focus.
   if (!focusedContent->HasFlag(NODE_IS_EDITABLE) ||
       focusedContent->HasIndependentSelection()) {
     return nullptr;
   }
   // If our window is focused, we're focused.
-  return OurWindowHasFocus() ? focusedContent.forget() : nullptr;
+  return OurWindowHasFocus() ? focusedContent.get() : nullptr;
 }
 
 already_AddRefed<nsIContent>
 HTMLEditor::GetFocusedContentForIME()
 {
   nsCOMPtr<nsIContent> focusedContent = GetFocusedContent();
   if (!focusedContent) {
     return nullptr;
@@ -4651,25 +4650,25 @@ HTMLEditor::GetActiveEditingHost()
   // we're not active.
   if (!content->HasFlag(NODE_IS_EDITABLE) ||
       content->HasIndependentSelection()) {
     return nullptr;
   }
   return content->GetEditingHost();
 }
 
-already_AddRefed<EventTarget>
+EventTarget*
 HTMLEditor::GetDOMEventTarget()
 {
   // Don't use getDocument here, because we have no way of knowing
   // whether Init() was ever called.  So we need to get the document
   // ourselves, if it exists.
   MOZ_ASSERT(IsInitialized(), "The HTMLEditor has not been initialized yet");
   nsCOMPtr<mozilla::dom::EventTarget> target = GetDocument();
-  return target.forget();
+  return target;
 }
 
 bool
 HTMLEditor::ShouldReplaceRootElement()
 {
   if (!mRootElement) {
     // If we don't know what is our root element, we should find our root.
     return true;
--- a/editor/libeditor/HTMLEditor.h
+++ b/editor/libeditor/HTMLEditor.h
@@ -104,20 +104,20 @@ public:
 
   // nsIEditor overrides
   NS_IMETHOD GetPreferredIMEState(widget::IMEState* aState) override;
 
   // TextEditor overrides
   NS_IMETHOD BeginningOfDocument() override;
   virtual nsresult HandleKeyPressEvent(
                      WidgetKeyboardEvent* aKeyboardEvent) override;
-  virtual already_AddRefed<nsIContent> GetFocusedContent() override;
+  virtual nsIContent* GetFocusedContent() override;
   virtual already_AddRefed<nsIContent> GetFocusedContentForIME() override;
   virtual bool IsActiveInDOMWindow() override;
-  virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
+  virtual dom::EventTarget* GetDOMEventTarget() override;
   virtual Element* GetEditorRoot() override;
   virtual already_AddRefed<nsIContent> FindSelectionRoot(
                                          nsINode *aNode) override;
   virtual bool IsAcceptableInputEvent(WidgetGUIEvent* aGUIEvent) override;
   virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override;
   using EditorBase::IsEditable;
   virtual nsresult RemoveAttributeOrEquivalent(
                      Element* aElement,
--- a/editor/libeditor/HTMLEditorObjectResizer.cpp
+++ b/editor/libeditor/HTMLEditorObjectResizer.cpp
@@ -532,17 +532,17 @@ HTMLEditor::StartResizing(nsIDOMElement*
   // add a mouse move listener to the editor
   nsresult result = NS_OK;
   if (!mMouseMotionListenerP) {
     mMouseMotionListenerP = new ResizerMouseMotionListener(*this);
     if (!mMouseMotionListenerP) {
       return NS_ERROR_OUT_OF_MEMORY;
     }
 
-    nsCOMPtr<nsIDOMEventTarget> target = GetDOMEventTarget();
+    nsIDOMEventTarget* target = GetDOMEventTarget();
     NS_ENSURE_TRUE(target, NS_ERROR_FAILURE);
 
     result = target->AddEventListener(NS_LITERAL_STRING("mousemove"),
                                       mMouseMotionListenerP, true);
     NS_ASSERTION(NS_SUCCEEDED(result),
                  "failed to register mouse motion listener");
   }
   return result;
--- a/editor/libeditor/TextEditor.cpp
+++ b/editor/libeditor/TextEditor.cpp
@@ -1707,21 +1707,20 @@ TextEditor::SelectEntireDocument(Selecti
     nsINode* parentNode = GetNodeLocation(childNode, &parentOffset);
 
     return aSelection->Extend(parentNode, parentOffset);
   }
 
   return NS_OK;
 }
 
-already_AddRefed<EventTarget>
+EventTarget*
 TextEditor::GetDOMEventTarget()
 {
-  nsCOMPtr<EventTarget> copy = mEventTarget;
-  return copy.forget();
+  return mEventTarget;
 }
 
 
 nsresult
 TextEditor::SetAttributeOrEquivalent(Element* aElement,
                                      nsAtom* aAttribute,
                                      const nsAString& aValue,
                                      bool aSuppressTransaction)
--- a/editor/libeditor/TextEditor.h
+++ b/editor/libeditor/TextEditor.h
@@ -124,17 +124,17 @@ public:
   /**
    * Make the given selection span the entire document.
    */
   virtual nsresult SelectEntireDocument(Selection* aSelection) override;
 
   virtual nsresult HandleKeyPressEvent(
                      WidgetKeyboardEvent* aKeyboardEvent) override;
 
-  virtual already_AddRefed<dom::EventTarget> GetDOMEventTarget() override;
+  virtual dom::EventTarget* GetDOMEventTarget() override;
 
   virtual nsresult BeginIMEComposition(WidgetCompositionEvent* aEvent) override;
   virtual nsresult UpdateIMEComposition(
                      WidgetCompositionEvent* aCompositionChangeEvet) override;
 
   virtual already_AddRefed<nsIContent> GetInputEventTargetContent() override;
 
   // Utility Routines, not part of public API
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -1550,24 +1550,25 @@ public:
   static already_AddRefed<ScaledFont>
     CreateScaledFontForNativeFont(const NativeFont &aNativeFont,
                                   const RefPtr<UnscaledFont>& aUnscaledFont,
                                   Float aSize);
 
 #ifdef MOZ_WIDGET_GTK
   static already_AddRefed<ScaledFont>
     CreateScaledFontForFontconfigFont(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
-                                      const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize);
+                                      const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
+                                      bool aNeedsOblique = false);
 #endif
 
 #ifdef XP_DARWIN
   static already_AddRefed<ScaledFont>
     CreateScaledFontForMacFont(CGFontRef aCGFont, const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
                                const Color& aFontSmoothingBackgroundColor, bool aUseFontSmoothing = true,
-                               bool aApplySyntheticBold = false);
+                               bool aApplySyntheticBold = false, bool aNeedsOblique = false);
 #endif
 
   /**
    * This creates a NativeFontResource from TrueType data.
    *
    * @param aData Pointer to the data
    * @param aSize Size of the TrueType data
    * @param aBackendType Type of the reference DrawTarget the font should be created for.
@@ -1723,16 +1724,17 @@ public:
 
   static already_AddRefed<ScaledFont>
     CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
                                   const gfxFontStyle* aStyle,
                                   const RefPtr<UnscaledFont>& aUnscaledFont,
                                   Float aSize,
                                   bool aUseEmbeddedBitmap,
                                   bool aForceGDIMode,
+                                  bool aNeedsOblique,
                                   IDWriteRenderingParams *aParams,
                                   Float aGamma,
                                   Float aContrast);
 
   static void UpdateSystemTextQuality();
 
 private:
   static StaticRefPtr<ID2D1Device> mD2D1Device;
--- a/gfx/2d/Factory.cpp
+++ b/gfx/2d/Factory.cpp
@@ -648,35 +648,37 @@ Factory::CreateScaledFontWithCairo(const
 #else
   return nullptr;
 #endif
 }
 
 #ifdef MOZ_WIDGET_GTK
 already_AddRefed<ScaledFont>
 Factory::CreateScaledFontForFontconfigFont(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
-                                           const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize)
+                                           const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
+                                           bool aNeedsOblique)
 {
-  return MakeAndAddRef<ScaledFontFontconfig>(aScaledFont, aPattern, aUnscaledFont, aSize);
+  return MakeAndAddRef<ScaledFontFontconfig>(aScaledFont, aPattern, aUnscaledFont, aSize, aNeedsOblique);
 }
 #endif
 
 #ifdef XP_DARWIN
 already_AddRefed<ScaledFont>
 Factory::CreateScaledFontForMacFont(CGFontRef aCGFont,
                                     const RefPtr<UnscaledFont>& aUnscaledFont,
                                     Float aSize,
                                     const Color& aFontSmoothingBackgroundColor,
                                     bool aUseFontSmoothing,
-                                    bool aApplySyntheticBold)
+                                    bool aApplySyntheticBold,
+                                    bool aNeedsOblique)
 {
   return MakeAndAddRef<ScaledFontMac>(
     aCGFont, aUnscaledFont, aSize, false,
     aFontSmoothingBackgroundColor, aUseFontSmoothing,
-    aApplySyntheticBold);
+    aApplySyntheticBold, aNeedsOblique);
 }
 #endif
 
 already_AddRefed<DrawTarget>
 Factory::CreateDualDrawTarget(DrawTarget *targetA, DrawTarget *targetB)
 {
   MOZ_ASSERT(targetA && targetB);
 
@@ -945,22 +947,23 @@ Factory::D2DCleanup()
 
 already_AddRefed<ScaledFont>
 Factory::CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
                                        const gfxFontStyle* aStyle,
                                        const RefPtr<UnscaledFont>& aUnscaledFont,
                                        float aSize,
                                        bool aUseEmbeddedBitmap,
                                        bool aForceGDIMode,
+                                       bool aNeedsOblique,
                                        IDWriteRenderingParams* aParams,
                                        Float aGamma,
                                        Float aContrast)
 {
   return MakeAndAddRef<ScaledFontDWrite>(aFontFace, aUnscaledFont, aSize,
-                                         aUseEmbeddedBitmap, aForceGDIMode,
+                                         aUseEmbeddedBitmap, aForceGDIMode, aNeedsOblique,
                                          aParams, aGamma, aContrast,
                                          aStyle);
 }
 
 #endif // XP_WIN
 
 #ifdef USE_SKIA_GPU
 already_AddRefed<DrawTarget>
--- a/gfx/2d/ScaledFontDWrite.cpp
+++ b/gfx/2d/ScaledFontDWrite.cpp
@@ -105,24 +105,26 @@ DWriteFontStretchFromStretch(int16_t aSt
     }
 }
 
 ScaledFontDWrite::ScaledFontDWrite(IDWriteFontFace *aFontFace,
                                    const RefPtr<UnscaledFont>& aUnscaledFont,
                                    Float aSize,
                                    bool aUseEmbeddedBitmap,
                                    bool aForceGDIMode,
+                                   bool aNeedsOblique,
                                    IDWriteRenderingParams* aParams,
                                    Float aGamma,
                                    Float aContrast,
                                    const gfxFontStyle* aStyle)
     : ScaledFontBase(aUnscaledFont, aSize)
     , mFontFace(aFontFace)
     , mUseEmbeddedBitmap(aUseEmbeddedBitmap)
     , mForceGDIMode(aForceGDIMode)
+    , mNeedsOblique(aNeedsOblique)
     , mParams(aParams)
     , mGamma(aGamma)
     , mContrast(aContrast)
 {
   if (aStyle) {
     mStyle = SkFontStyle(aStyle->weight,
                          DWriteFontStretchFromStretch(aStyle->stretch),
                          aStyle->style == NS_FONT_STYLE_NORMAL ?
@@ -399,16 +401,19 @@ ScaledFontDWrite::GetWRFontInstanceOptio
     options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
   }
   if (UseEmbeddedBitmaps()) {
     options.flags |= wr::FontInstanceFlags::EMBEDDED_BITMAPS;
   }
   if (ForceGDIMode()) {
     options.flags |= wr::FontInstanceFlags::FORCE_GDI;
   }
+  if (mNeedsOblique) {
+    options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
+  }
   options.bg_color = wr::ToColorU(Color());
   *aOutOptions = Some(options);
   return true;
 }
 
 already_AddRefed<ScaledFont>
 UnscaledFontDWrite::CreateScaledFont(Float aGlyphSize,
                                      const uint8_t* aInstanceData,
@@ -422,16 +427,17 @@ UnscaledFontDWrite::CreateScaledFont(Flo
   }
 
   const ScaledFontDWrite::InstanceData *instanceData =
     reinterpret_cast<const ScaledFontDWrite::InstanceData*>(aInstanceData);
   RefPtr<ScaledFontBase> scaledFont =
     new ScaledFontDWrite(mFontFace, this, aGlyphSize,
                          instanceData->mUseEmbeddedBitmap,
                          instanceData->mForceGDIMode,
+                         false,
                          nullptr,
                          instanceData->mGamma,
                          instanceData->mContrast);
 
   if (mNeedsCairo && !scaledFont->PopulateCairoScaledFont()) {
     gfxWarning() << "Unable to create cairo scaled font DWrite font.";
     return nullptr;
   }
--- a/gfx/2d/ScaledFontDWrite.h
+++ b/gfx/2d/ScaledFontDWrite.h
@@ -25,25 +25,27 @@ public:
   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFontDWrite, override)
   ScaledFontDWrite(IDWriteFontFace *aFont,
                    const RefPtr<UnscaledFont>& aUnscaledFont,
                    Float aSize)
     : ScaledFontBase(aUnscaledFont, aSize)
     , mFontFace(aFont)
     , mUseEmbeddedBitmap(false)
     , mForceGDIMode(false)
+    , mNeedsOblique(false)
     , mGamma(2.2f)
     , mContrast(1.0f)
   {}
 
   ScaledFontDWrite(IDWriteFontFace *aFontFace,
                    const RefPtr<UnscaledFont>& aUnscaledFont,
                    Float aSize,
                    bool aUseEmbeddedBitmap,
                    bool aForceGDIMode,
+                   bool aNeedsOblique,
                    IDWriteRenderingParams *aParams,
                    Float aGamma,
                    Float aContrast,
                    const gfxFontStyle* aStyle = nullptr);
 
   FontType GetType() const override { return FontType::DWRITE; }
 
   already_AddRefed<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget) override;
@@ -69,16 +71,17 @@ public:
 #ifdef USE_SKIA
   SkTypeface* GetSkTypeface() override;
   SkFontStyle mStyle;
 #endif
 
   RefPtr<IDWriteFontFace> mFontFace;
   bool mUseEmbeddedBitmap;
   bool mForceGDIMode;
+  bool mNeedsOblique;
   // DrawTargetD2D1 requires the IDWriteRenderingParams,
   // but we also separately need to store the gamma and contrast
   // since Skia needs to be able to access these without having
   // to use the full set of DWrite parameters (which would be
   // required to recreate an IDWriteRenderingParams) in a
   // DrawTargetRecording playback.
   RefPtr<IDWriteRenderingParams> mParams;
   Float mGamma;
--- a/gfx/2d/ScaledFontFontconfig.cpp
+++ b/gfx/2d/ScaledFontFontconfig.cpp
@@ -20,19 +20,21 @@ namespace gfx {
 
 // On Linux and Android our "platform" font is a cairo_scaled_font_t and we use
 // an SkFontHost implementation that allows Skia to render using this.
 // This is mainly because FT_Face is not good for sharing between libraries, which
 // is a requirement when we consider runtime switchable backends and so on
 ScaledFontFontconfig::ScaledFontFontconfig(cairo_scaled_font_t* aScaledFont,
                                            FcPattern* aPattern,
                                            const RefPtr<UnscaledFont>& aUnscaledFont,
-                                           Float aSize)
-  : ScaledFontBase(aUnscaledFont, aSize),
-    mPattern(aPattern)
+                                           Float aSize,
+                                           bool aNeedsOblique)
+  : ScaledFontBase(aUnscaledFont, aSize)
+  , mPattern(aPattern)
+  , mNeedsOblique(aNeedsOblique)
 {
   SetCairoScaledFont(aScaledFont);
   FcPatternReference(aPattern);
 }
 
 ScaledFontFontconfig::~ScaledFontFontconfig()
 {
   FcPatternDestroy(mPattern);
@@ -243,16 +245,20 @@ ScaledFontFontconfig::GetWRFontInstanceO
   options.subpx_dir = wr::SubpixelDirection::Horizontal;
   options.flags = 0;
   options.bg_color = wr::ToColorU(Color());
 
   wr::FontInstancePlatformOptions platformOptions;
   platformOptions.lcd_filter = wr::FontLCDFilter::Legacy;
   platformOptions.hinting = wr::FontHinting::Normal;
 
+  if (mNeedsOblique) {
+    options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
+  }
+
   FcBool autohint;
   if (FcPatternGetBool(mPattern, FC_AUTOHINT, 0, &autohint) == FcResultMatch && autohint) {
     options.flags |= wr::FontInstanceFlags::FORCE_AUTOHINT;
   }
   FcBool embolden;
   if (FcPatternGetBool(mPattern, FC_EMBOLDEN, 0, &embolden) == FcResultMatch && embolden) {
     options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
   }
--- a/gfx/2d/ScaledFontFontconfig.h
+++ b/gfx/2d/ScaledFontFontconfig.h
@@ -17,17 +17,18 @@ namespace gfx {
 class NativeFontResourceFontconfig;
 class UnscaledFontFontconfig;
 
 class ScaledFontFontconfig : public ScaledFontBase
 {
 public:
   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFontFontconfig, override)
   ScaledFontFontconfig(cairo_scaled_font_t* aScaledFont, FcPattern* aPattern,
-                       const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize);
+                       const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
+                       bool aNeedsOblique = false);
   ~ScaledFontFontconfig();
 
   FontType GetType() const override { return FontType::FONTCONFIG; }
 
 #ifdef USE_SKIA
   SkTypeface* GetSkTypeface() override;
 #endif
 
@@ -70,14 +71,15 @@ private:
 
   static already_AddRefed<ScaledFont>
     CreateFromInstanceData(const InstanceData& aInstanceData,
                            UnscaledFontFontconfig* aUnscaledFont,
                            Float aSize,
                            NativeFontResource* aNativeFontResource = nullptr);
 
   FcPattern* mPattern;
+  bool mNeedsOblique;
 };
 
 }
 }
 
 #endif /* MOZILLA_GFX_SCALEDFONTFONTCONFIG_H_ */
--- a/gfx/2d/ScaledFontMac.cpp
+++ b/gfx/2d/ScaledFontMac.cpp
@@ -106,22 +106,24 @@ CreateCTFontFromCGFontWithVariations(CGF
 }
 
 ScaledFontMac::ScaledFontMac(CGFontRef aFont,
                              const RefPtr<UnscaledFont>& aUnscaledFont,
                              Float aSize,
                              bool aOwnsFont,
                              const Color &aFontSmoothingBackgroundColor,
                              bool aUseFontSmoothing,
-                             bool aApplySyntheticBold)
+                             bool aApplySyntheticBold,
+                             bool aNeedsOblique)
   : ScaledFontBase(aUnscaledFont, aSize)
   , mFont(aFont)
   , mFontSmoothingBackgroundColor(aFontSmoothingBackgroundColor)
   , mUseFontSmoothing(aUseFontSmoothing)
   , mApplySyntheticBold(aApplySyntheticBold)
+  , mNeedsOblique(aNeedsOblique)
 {
   if (!sSymbolLookupDone) {
     CTFontDrawGlyphsPtr =
       (CTFontDrawGlyphsFuncT*)dlsym(RTLD_DEFAULT, "CTFontDrawGlyphs");
     sSymbolLookupDone = true;
   }
 
   if (!aOwnsFont) {
@@ -413,16 +415,19 @@ ScaledFontMac::GetWRFontInstanceOptions(
   options.subpx_dir = wr::SubpixelDirection::Horizontal;
   options.flags = 0;
   if (mUseFontSmoothing) {
     options.flags |= wr::FontInstanceFlags::FONT_SMOOTHING;
   }
   if (mApplySyntheticBold) {
     options.flags |= wr::FontInstanceFlags::SYNTHETIC_BOLD;
   }
+  if (mNeedsOblique) {
+    options.flags |= wr::FontInstanceFlags::SYNTHETIC_ITALICS;
+  }
   options.bg_color = wr::ToColorU(mFontSmoothingBackgroundColor);
   *aOutOptions = Some(options);
   return true;
 }
 
 static CFDictionaryRef
 CreateVariationDictionaryOrNull(CGFontRef aCGFont, uint32_t aVariationCount,
                                 const FontVariation* aVariations)
--- a/gfx/2d/ScaledFontMac.h
+++ b/gfx/2d/ScaledFontMac.h
@@ -23,17 +23,19 @@ namespace gfx {
 
 class ScaledFontMac : public ScaledFontBase
 {
 public:
   MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFontMac, override)
   ScaledFontMac(CGFontRef aFont, const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
                 bool aOwnsFont = false,
                 const Color &aFontSmoothingBackgroundColor = Color(),
-                bool aUseFontSmoothing = true, bool aApplySyntheticBold = false);
+                bool aUseFontSmoothing = true,
+                bool aApplySyntheticBold = false,
+                bool aNeedsOblique = false);
   ~ScaledFontMac();
 
   FontType GetType() const override { return FontType::MAC; }
 #ifdef USE_SKIA
   SkTypeface* GetSkTypeface() override;
 #endif
   already_AddRefed<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget) override;
 
@@ -53,16 +55,17 @@ public:
 
 private:
   friend class DrawTargetSkia;
   CGFontRef mFont;
   CTFontRef mCTFont; // only created if CTFontDrawGlyphs is available, otherwise null
   Color mFontSmoothingBackgroundColor;
   bool mUseFontSmoothing;
   bool mApplySyntheticBold;
+  bool mNeedsOblique;
 
   typedef void (CTFontDrawGlyphsFuncT)(CTFontRef,
                                        const CGGlyph[], const CGPoint[],
                                        size_t, CGContextRef);
 
   static bool sSymbolLookupDone;
 
 public:
--- a/gfx/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
+++ b/gfx/angle/src/libANGLE/renderer/d3d/d3d11/Renderer11.cpp
@@ -550,20 +550,24 @@ Renderer11::Renderer11(egl::Display *dis
         mCreateDebugDevice = ShouldUseDebugLayers(attributes);
     }
     else if (display->getPlatform() == EGL_PLATFORM_DEVICE_EXT)
     {
         mEGLDevice = GetImplAs<DeviceD3D>(display->getDevice());
         ASSERT(mEGLDevice != nullptr);
         mCreatedWithDeviceEXT = true;
 
+        const auto &attributes = mDisplay->getAttributeMap();
+        const EGLenum presentPath = static_cast<EGLenum>(attributes.get(
+            EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE, EGL_EXPERIMENTAL_PRESENT_PATH_COPY_ANGLE));
+        mPresentPathFastEnabled = (presentPath == EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE);
+
         // Also set EGL_PLATFORM_ANGLE_ANGLE variables, in case they're used elsewhere in ANGLE
         // mAvailableFeatureLevels defaults to empty
         mRequestedDriverType    = D3D_DRIVER_TYPE_UNKNOWN;
-        mPresentPathFastEnabled = false;
     }
 
 // The D3D11 renderer must choose the D3D9 debug annotator because the D3D11 interface
 // method ID3DUserDefinedAnnotation::GetStatus on desktop builds doesn't work with the Graphics
 // Diagnostics tools in Visual Studio 2013.
 // The D3D9 annotator works properly for both D3D11 and D3D9.
 // Incorrect status reporting can cause ANGLE to log unnecessary debug events.
 #ifdef ANGLE_ENABLE_D3D9
--- a/gfx/gl/GLLibraryEGL.cpp
+++ b/gfx/gl/GLLibraryEGL.cpp
@@ -15,17 +15,20 @@
 #include "mozilla/ScopeExit.h"
 #include "mozilla/Unused.h"
 #include "mozilla/webrender/RenderThread.h"
 #include "nsDirectoryServiceDefs.h"
 #include "nsDirectoryServiceUtils.h"
 #include "nsIGfxInfo.h"
 #include "nsPrintfCString.h"
 #ifdef XP_WIN
+#include "mozilla/gfx/DeviceManagerDx.h"
 #include "nsWindowsHelpers.h"
+
+#include <d3d11.h>
 #endif
 #include "OGLShaderProgram.h"
 #include "prenv.h"
 #include "prsystem.h"
 #include "GLContext.h"
 #include "GLContextProvider.h"
 #include "gfxPrefs.h"
 #include "ScopedGLHelpers.h"
@@ -144,40 +147,53 @@ GetAndInitWARPDisplay(GLLibraryEGL& egl,
         return EGL_NO_DISPLAY;
 
     return display;
 }
 
 static EGLDisplay
 GetAndInitDisplayForWebRender(GLLibraryEGL& egl, void* displayType)
 {
-    const EGLint attrib_list[] = {  LOCAL_EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
-                                    LOCAL_EGL_PLATFORM_ANGLE_DEVICE_TYPE_HARDWARE_ANGLE,
-                                    LOCAL_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
-                                    LOCAL_EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
-                                    LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE,
+#ifdef XP_WIN
+    const EGLint attrib_list[] = {  LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_ANGLE,
                                     LOCAL_EGL_EXPERIMENTAL_PRESENT_PATH_FAST_ANGLE,
                                     LOCAL_EGL_NONE };
-    EGLDisplay display = egl.fGetPlatformDisplayEXT(LOCAL_EGL_PLATFORM_ANGLE_ANGLE,
-                                                    displayType,
-                                                    attrib_list);
+    RefPtr<ID3D11Device> d3d11Device = gfx::DeviceManagerDx::Get()->GetCompositorDevice();
+    if (!d3d11Device) {
+        gfxCriticalNote << "Failed to get compositor device for EGLDisplay";
+        return EGL_NO_DISPLAY;
+    }
+    EGLDeviceEXT eglDevice = egl.fCreateDeviceANGLE(LOCAL_EGL_D3D11_DEVICE_ANGLE, reinterpret_cast<void *>(d3d11Device.get()), nullptr);
+    if (!eglDevice) {
+        gfxCriticalNote << "Failed to get EGLDeviceEXT of D3D11Device";
+        return EGL_NO_DISPLAY;
+    }
+    // Create an EGLDisplay using the EGLDevice
+    EGLDisplay display = egl.fGetPlatformDisplayEXT(LOCAL_EGL_PLATFORM_DEVICE_EXT, eglDevice, attrib_list);
+    if (!display) {
+        gfxCriticalNote << "Failed to get EGLDisplay of D3D11Device";
+        return EGL_NO_DISPLAY;
+    }
 
     if (display == EGL_NO_DISPLAY) {
         const EGLint err = egl.fGetError();
         if (err != LOCAL_EGL_SUCCESS) {
             gfxCriticalError() << "Unexpected GL error: " << gfx::hexa(err);
             MOZ_CRASH("GFX: Unexpected GL error.");
         }
         return EGL_NO_DISPLAY;
     }
 
-    if (!egl.fInitialize(display, nullptr, nullptr))
+    if (!egl.fInitialize(display, nullptr, nullptr)) {
         return EGL_NO_DISPLAY;
-
+    }
     return display;
+#else
+    return EGL_NO_DISPLAY;
+#endif
 }
 
 static bool
 IsAccelAngleSupported(const nsCOMPtr<nsIGfxInfo>& gfxInfo,
                       nsACString* const out_failureId)
 {
     if (wr::RenderThread::IsInRenderThread()) {
         // We can only enter here with WebRender, so assert that this is a
@@ -487,16 +503,26 @@ GLLibraryEGL::EnsureInitialized(bool for
         const GLLibraryLoader::SymLoadStruct angleSymbols[] = {
             SYMBOL(GetPlatformDisplayEXT),
             END_OF_SYMBOLS
         };
         if (!fnLoadSymbols(angleSymbols)) {
             gfxCriticalError() << "Failed to load ANGLE symbols!";
             return false;
         }
+        MOZ_ASSERT(IsExtensionSupported(ANGLE_platform_angle_d3d));
+        const GLLibraryLoader::SymLoadStruct createDeviceSymbols[] = {
+            SYMBOL(CreateDeviceANGLE),
+            SYMBOL(ReleaseDeviceANGLE),
+            END_OF_SYMBOLS
+        };
+        if (!fnLoadSymbols(createDeviceSymbols)) {
+            NS_ERROR("EGL supports ANGLE_device_creation without exposing its functions!");
+            MarkExtensionUnsupported(ANGLE_device_creation);
+        }
     }
 
     if (IsExtensionSupported(ANGLE_platform_angle_d3d)) {
         nsCString accelAngleFailureId;
         bool accelAngleSupport = IsAccelAngleSupported(gfxInfo, &accelAngleFailureId);
         bool shouldTryAccel = forceAccel || accelAngleSupport;
         bool shouldTryWARP = !forceAccel; // Only if ANGLE not supported or fails
 
@@ -678,28 +704,16 @@ GLLibraryEGL::EnsureInitialized(bool for
             END_OF_SYMBOLS
         };
         if (!fnLoadSymbols(nvStreamSymbols)) {
             NS_ERROR("EGL supports ANGLE_stream_producer_d3d_texture_nv12 without exposing its functions!");
             MarkExtensionUnsupported(ANGLE_stream_producer_d3d_texture_nv12);
         }
     }
 
-    if (IsExtensionSupported(ANGLE_device_creation)) {
-        const GLLibraryLoader::SymLoadStruct createDeviceSymbols[] = {
-            SYMBOL(CreateDeviceANGLE),
-            SYMBOL(ReleaseDeviceANGLE),
-            END_OF_SYMBOLS
-        };
-        if (!fnLoadSymbols(createDeviceSymbols)) {
-            NS_ERROR("EGL supports ANGLE_device_creation without exposing its functions!");
-            MarkExtensionUnsupported(ANGLE_device_creation);
-        }
-    }
-
     mInitialized = true;
     reporter.SetSuccessful();
     return true;
 }
 
 #undef SYMBOL
 #undef END_OF_SYMBOLS
 
--- a/gfx/thebes/gfxDWriteFonts.cpp
+++ b/gfx/thebes/gfxDWriteFonts.cpp
@@ -72,29 +72,20 @@ gfxDWriteFont::gfxDWriteFont(const RefPt
                              gfxFontEntry *aFontEntry,
                              const gfxFontStyle *aFontStyle,
                              bool aNeedsBold,
                              AntialiasOption anAAOption)
     : gfxFont(aUnscaledFont, aFontEntry, aFontStyle, anAAOption)
     , mCairoFontFace(nullptr)
     , mMetrics(nullptr)
     , mSpaceGlyph(0)
-    , mNeedsOblique(false)
     , mNeedsBold(aNeedsBold)
     , mUseSubpixelPositions(false)
     , mAllowManualShowGlyphs(true)
 {
-    if ((GetStyle()->style != NS_FONT_STYLE_NORMAL) &&
-        aFontEntry->IsUpright() &&
-        GetStyle()->allowSyntheticStyle) {
-            // For this we always use the font_matrix for uniformity. Not the
-            // DWrite simulation.
-            mNeedsOblique = true;
-    }
-
     mFontFace = aUnscaledFont->GetFontFace();
 
     // If the IDWriteFontFace1 interface is available, we can use that for
     // faster glyph width retrieval.
     mFontFace->QueryInterface(__uuidof(IDWriteFontFace1),
                               (void**)getter_AddRefs(mFontFace1));
 
     ComputeMetrics(anAAOption);
@@ -690,16 +681,17 @@ gfxDWriteFont::GetScaledFont(mozilla::gf
 
         const gfxFontStyle* fontStyle = GetStyle();
         mAzureScaledFont =
             Factory::CreateScaledFontForDWriteFont(mFontFace, fontStyle,
                                                    GetUnscaledFont(),
                                                    GetAdjustedSize(),
                                                    useEmbeddedBitmap,
                                                    forceGDI,
+                                                   IsSyntheticOblique(),
                                                    params,
                                                    params->GetGamma(),
                                                    params->GetEnhancedContrast());
         if (!mAzureScaledFont) {
             return nullptr;
         }
     }
 
--- a/gfx/thebes/gfxDWriteFonts.h
+++ b/gfx/thebes/gfxDWriteFonts.h
@@ -96,17 +96,16 @@ protected:
 
     Metrics *mMetrics;
 
     // cache of glyph widths in 16.16 fixed-point pixels
     mozilla::UniquePtr<nsDataHashtable<nsUint32HashKey,int32_t>> mGlyphWidths;
 
     uint32_t mSpaceGlyph;
 
-    bool mNeedsOblique;
     bool mNeedsBold;
     bool mUseSubpixelPositions;
     bool mAllowManualShowGlyphs;
 
     static bool sUseClearType;
 };
 
 #endif
--- a/gfx/thebes/gfxFcPlatformFontList.cpp
+++ b/gfx/thebes/gfxFcPlatformFontList.cpp
@@ -1303,17 +1303,18 @@ gfxFontconfigFont::~gfxFontconfigFont()
 already_AddRefed<ScaledFont>
 gfxFontconfigFont::GetScaledFont(mozilla::gfx::DrawTarget *aTarget)
 {
     if (!mAzureScaledFont) {
         mAzureScaledFont =
             Factory::CreateScaledFontForFontconfigFont(GetCairoScaledFont(),
                                                        GetPattern(),
                                                        GetUnscaledFont(),
-                                                       GetAdjustedSize());
+                                                       GetAdjustedSize(),
+                                                       IsSyntheticOblique());
     }
 
     RefPtr<ScaledFont> scaledFont(mAzureScaledFont);
     return scaledFont.forget();
 }
 
 gfxFcPlatformFontList::gfxFcPlatformFontList()
     : mLocalNames(64)
--- a/gfx/thebes/gfxFont.cpp
+++ b/gfx/thebes/gfxFont.cpp
@@ -1911,22 +1911,24 @@ void
 gfxFont::DrawOneGlyph(uint32_t aGlyphID, const gfx::Point& aPt,
                       GlyphBufferAzure& aBuffer, bool *aEmittedGlyphs) const
 {
     const TextRunDrawParams& runParams(aBuffer.mRunParams);
 
     gfx::Point devPt(ToDeviceUnits(aPt.x, runParams.devPerApp),
                      ToDeviceUnits(aPt.y, runParams.devPerApp));
 
-    gfxContextMatrixAutoSaveRestore matrixRestore;
-
     if (FC == FontComplexityT::ComplexFont) {
         const FontDrawParams& fontParams(aBuffer.mFontParams);
 
-        if (fontParams.needsOblique && fontParams.isVerticalFont) {
+        auto* textDrawer = runParams.context->GetTextDrawer();
+
+        gfxContextMatrixAutoSaveRestore matrixRestore;
+
+        if (fontParams.needsOblique && fontParams.isVerticalFont && !textDrawer) {
             // We have to flush each glyph individually when doing
             // synthetic-oblique for vertical-upright text, because
             // the skew transform needs to be applied to a separate
             // origin for each glyph, not once for the whole run.
             aBuffer.Flush();
             matrixRestore.SetContext(runParams.context);
             gfx::Matrix mat =
                 runParams.context->CurrentMatrix().
@@ -1953,51 +1955,51 @@ gfxFont::DrawOneGlyph(uint32_t aGlyphID,
         if (fontParams.haveColorGlyphs &&
             RenderColorGlyph(runParams.dt, runParams.context,
                              fontParams.scaledFont,
                              fontParams.drawOptions,
                              devPt,
                              aGlyphID)) {
             return;
         }
-    }
-
-    aBuffer.OutputGlyph(aGlyphID, devPt);
-
-    if (FC == FontComplexityT::ComplexFont) {
-        const FontDrawParams& fontParams(aBuffer.mFontParams);
+
+        aBuffer.OutputGlyph(aGlyphID, devPt);
+
         // Synthetic bolding (if required) by multi-striking.
         for (int32_t i = 0; i < fontParams.extraStrikes; ++i) {
             if (fontParams.isVerticalFont) {
                 devPt.y += fontParams.synBoldOnePixelOffset;
             } else {
                 devPt.x += fontParams.synBoldOnePixelOffset;
             }
             aBuffer.OutputGlyph(aGlyphID, devPt);
         }
 
-        if (fontParams.needsOblique && fontParams.isVerticalFont) {
+        if (fontParams.needsOblique && fontParams.isVerticalFont && !textDrawer) {
             aBuffer.Flush();
         }
+    } else {
+        aBuffer.OutputGlyph(aGlyphID, devPt);
     }
 
     *aEmittedGlyphs = true;
 }
 
 bool
 gfxFont::DrawMissingGlyph(const TextRunDrawParams&            aRunParams,
                           const FontDrawParams&               aFontParams,
                           const gfxShapedText::DetailedGlyph* aDetails,
                           const gfx::Point&                   aPt)
 {
     // Default-ignorable chars will have zero advance width;
     // we don't have to draw the hexbox for them.
     float advance = aDetails->mAdvance;
     if (aRunParams.drawMode != DrawMode::GLYPH_PATH && advance > 0) {
-        if (auto* textDrawer = aRunParams.context->GetTextDrawer()) {
+        auto* textDrawer = aRunParams.context->GetTextDrawer();
+        if (textDrawer) {
             textDrawer->FoundUnsupportedFeature();
             return false;
         }
 
         Point pt(Float(ToDeviceUnits(aPt.x, aRunParams.devPerApp)),
                  Float(ToDeviceUnits(aPt.y, aRunParams.devPerApp)));
         Float advanceDevUnits =
             Float(ToDeviceUnits(advance, aRunParams.devPerApp));
@@ -2007,17 +2009,17 @@ gfxFont::DrawMissingGlyph(const TextRunD
                  height, advanceDevUnits) :
             Rect(pt.x, pt.y - height,
                  advanceDevUnits, height);
 
         // If there's a fake-italic skew in effect as part
         // of the drawTarget's transform, we need to undo
         // this before drawing the hexbox. (Bug 983985)
         gfxContextMatrixAutoSaveRestore matrixRestore;
-        if (aFontParams.needsOblique && !aFontParams.isVerticalFont) {
+        if (aFontParams.needsOblique && !aFontParams.isVerticalFont && !textDrawer) {
             matrixRestore.SetContext(aRunParams.context);
             gfx::Matrix mat =
                 aRunParams.context->CurrentMatrix().
                 PreTranslate(pt).
                 PreMultiply(gfx::Matrix(1, 0, OBLIQUE_SKEW_FACTOR, 1, 0, 0)).
                 PreTranslate(-pt);
             aRunParams.context->SetMatrix(mat);
         }
@@ -2091,22 +2093,20 @@ gfxFont::Draw(const gfxTextRun *aTextRun
 
     fontParams.scaledFont = GetScaledFont(aRunParams.dt);
     if (!fontParams.scaledFont) {
         return;
     }
 
     auto* textDrawer = aRunParams.context->GetTextDrawer();
 
-    fontParams.needsOblique = mFontEntry->IsUpright() &&
-                              mStyle.style != NS_FONT_STYLE_NORMAL &&
-                              mStyle.allowSyntheticStyle;
+    fontParams.needsOblique = IsSyntheticOblique();
     fontParams.haveSVGGlyphs = GetFontEntry()->TryGetSVGData(this);
 
-    if ((fontParams.needsOblique || fontParams.haveSVGGlyphs) && textDrawer) {
+    if (fontParams.haveSVGGlyphs && textDrawer) {
         textDrawer->FoundUnsupportedFeature();
         return;
     }
 
     fontParams.haveColorGlyphs = GetFontEntry()->TryGetColorGlyphs();
     fontParams.contextPaint = aRunParams.runContextPaint;
     fontParams.isVerticalFont =
         aOrientation == gfx::ShapedTextFlags::TEXT_ORIENT_VERTICAL_UPRIGHT;
@@ -2151,17 +2151,17 @@ gfxFont::Draw(const gfxTextRun *aTextRun
         if (aTextRun->UseCenterBaseline()) {
             gfxPoint baseAdj(0, (metrics.emAscent - metrics.emDescent) / 2);
             mat.PreTranslate(baseAdj);
         }
 
         aRunParams.context->SetMatrixDouble(mat);
     }
 
-    if (fontParams.needsOblique && !fontParams.isVerticalFont) {
+    if (fontParams.needsOblique && !fontParams.isVerticalFont && !textDrawer) {
         // Adjust matrix for synthetic-oblique, except if we're doing vertical-
         // upright text, in which case this will be handled for each glyph
         // individually in DrawOneGlyph.
         if (!matrixRestore.HasMatrix()) {
             matrixRestore.SetContext(aRunParams.context);
         }
         gfx::Point p(aPt->x * aRunParams.devPerApp,
                      aPt->y * aRunParams.devPerApp);
--- a/gfx/thebes/gfxFont.h
+++ b/gfx/thebes/gfxFont.h
@@ -1789,16 +1789,22 @@ public:
 
     // This is called by the default Draw() implementation above.
     virtual bool SetupCairoFont(DrawTarget* aDrawTarget) = 0;
 
     virtual bool AllowSubpixelAA() { return true; }
 
     bool IsSyntheticBold() { return mApplySyntheticBold; }
 
+    bool IsSyntheticOblique() {
+        return mFontEntry->IsUpright() &&
+               mStyle.style != NS_FONT_STYLE_NORMAL &&
+               mStyle.allowSyntheticStyle;
+    }
+
     // Amount by which synthetic bold "fattens" the glyphs:
     // For size S up to a threshold size T, we use (0.25 + 3S / 4T),
     // so that the result ranges from 0.25 to 1.0; thereafter,
     // simply use (S / T).
     gfxFloat GetSyntheticBoldOffset() {
         gfxFloat size = GetAdjustedSize();
         const gfxFloat threshold = 48.0;
         return size < threshold ? (0.25 + 0.75 * size / threshold) :
--- a/gfx/thebes/gfxMacFont.cpp
+++ b/gfx/thebes/gfxMacFont.cpp
@@ -504,17 +504,18 @@ gfxMacFont::GetScaledFont(DrawTarget *aT
 {
     if (!mAzureScaledFont) {
         mAzureScaledFont =
             Factory::CreateScaledFontForMacFont(GetCGFontRef(),
                                                 GetUnscaledFont(),
                                                 GetAdjustedSize(),
                                                 Color::FromABGR(mFontSmoothingBackgroundColor),
                                                 !mStyle.useGrayscaleAntialiasing,
-                                                IsSyntheticBold());
+                                                IsSyntheticBold(),
+                                                IsSyntheticOblique());
         if (!mAzureScaledFont) {
             return nullptr;
         }
 
         mAzureScaledFont->SetCairoScaledFont(mScaledFont);
     }
 
     RefPtr<ScaledFont> scaledFont(mAzureScaledFont);
--- a/ipc/ipdl/ipdl/cxx/ast.py
+++ b/ipc/ipdl/ipdl/cxx/ast.py
@@ -466,20 +466,22 @@ class FriendClassDecl(Node):
     def __init__(self, friend):
         Node.__init__(self)
         self.friend = friend
 
 class MethodDecl(Node):
     def __init__(self, name, params=[ ], ret=Type('void'),
                  virtual=0, const=0, pure=0, static=0, warn_unused=0,
                  inline=0, force_inline=0, never_inline=0,
-                 typeop=None,
+                 typeop=None, override=0,
                  T=None):
         assert not (virtual and static)
         assert not pure or virtual      # pure => virtual
+        assert not override or virtual  # override => virtual
+        assert not (override and pure)
         assert not (static and typeop)
         assert not (name and typeop)
         assert name is None or isinstance(name, str)
         assert not isinstance(ret, list)
         for decl in params:  assert not isinstance(decl, str)
         assert not isinstance(T, int)
         assert not (inline and never_inline)
         assert not (force_inline and never_inline)
@@ -489,16 +491,17 @@ class MethodDecl(Node):
 
         Node.__init__(self)
         self.name = name
         self.params = params            # [ Param ]
         self.ret = ret                  # Type or None
         self.virtual = virtual          # bool
         self.const = const              # bool
         self.pure = pure                # bool
+        self.override = override        # bool
         self.static = static            # bool
         self.warn_unused = warn_unused  # bool
         self.force_inline = (force_inline or T) # bool
         self.inline = inline            # bool
         self.never_inline = never_inline # bool
         self.typeop = typeop            # Type or None
         self.T = T                      # Type or None
         self.only_for_definition = False
@@ -506,16 +509,17 @@ class MethodDecl(Node):
     def __deepcopy__(self, memo):
         return MethodDecl(
             self.name,
             params=copy.deepcopy(self.params, memo),
             ret=copy.deepcopy(self.ret, memo),
             virtual=self.virtual,
             const=self.const,
             pure=self.pure,
+            override=self.override,
             static=self.static,
             warn_unused=self.warn_unused,
             inline=self.inline,
             force_inline=self.force_inline,
             never_inline=self.never_inline,
             typeop=copy.deepcopy(self.typeop, memo),
             T=copy.deepcopy(self.T, memo))
 
@@ -550,17 +554,17 @@ class ConstructorDecl(MethodDecl):
                                self.explicit)
 
 class ConstructorDefn(MethodDefn):
     def __init__(self, decl, memberinits=[ ]):
         MethodDefn.__init__(self, decl)
         self.memberinits = memberinits
 
 class DestructorDecl(MethodDecl):
-    def __init__(self, name, virtual=0, force_inline=0, inline=0):
+    def __init__(self, name, virtual=0, override=0, force_inline=0, inline=0):
         MethodDecl.__init__(self, name, params=[ ], ret=None,
                             virtual=virtual,
                             force_inline=force_inline, inline=inline)
 
     def __deepcopy__(self, memo):
         return DestructorDecl(self.name,
                               virtual=self.virtual,
                               force_inline=self.force_inline,
--- a/ipc/ipdl/ipdl/cxx/cgen.py
+++ b/ipc/ipdl/ipdl/cxx/cgen.py
@@ -187,33 +187,36 @@ class CxxCodeGen(CodePrinter, Visitor):
         inh.type.accept(self)
 
     def visitFriendClassDecl(self, fcd):
         self.printdentln('friend class '+ fcd.friend +';')
 
 
     def visitMethodDecl(self, md):
         assert not (md.static and md.virtual)
+        assert not (md.override and md.pure)
+        assert not md.pure or md.virtual        # pure => virtual
+        assert not md.override or md.virtual    # override => virtual
 
         if md.T:
             self.write('template<')
             self.write('typename ')
             md.T.accept(self)
             self.println('>')
             self.printdent()
 
         if md.warn_unused:
             self.write('MOZ_MUST_USE ')
         if md.inline:
             self.write('inline ')
         if md.never_inline:
             self.write('MOZ_NEVER_INLINE ')
         if md.static:
             self.write('static ')
-        if md.virtual:
+        if md.virtual and not md.override:
             self.write('virtual ')
         if md.ret:
             if md.only_for_definition:
                 self.write('auto ')
             else:
                 md.ret.accept(self)
                 self.println()
                 self.printdent()
@@ -227,16 +230,19 @@ class CxxCodeGen(CodePrinter, Visitor):
         self.writeDeclList(md.params)
         self.write(')')
 
         if md.const:
             self.write(' const')
         if md.ret and md.only_for_definition:
             self.write(' -> ')
             md.ret.accept(self)
+
+        if md.override:
+            self.write(' override')
         if md.pure:
             self.write(' = 0')
 
 
     def visitMethodDefn(self, md):
         if md.decl.pure:
             return
 
--- a/ipc/ipdl/ipdl/lower.py
+++ b/ipc/ipdl/ipdl/lower.py
@@ -2782,33 +2782,33 @@ class _GenerateProtocolActorCode(ipdl.as
         ])
 
         if ptype.isToplevel():
             # void ProcessingError(code); default to no-op
             processingerror = MethodDefn(
                 MethodDecl(p.processingErrorVar().name,
                            params=[ Param(_Result.Type(), 'aCode'),
                                     Param(Type('char', const=1, ptr=1), 'aReason') ],
-                           virtual=1))
+                           virtual=1, override=1))
 
             # bool ShouldContinueFromReplyTimeout(); default to |true|
             shouldcontinue = MethodDefn(
                 MethodDecl(p.shouldContinueFromTimeoutVar().name,
-                           ret=Type.BOOL, virtual=1))
+                           ret=Type.BOOL, virtual=1, override=1))
             shouldcontinue.addstmt(StmtReturn.TRUE)
 
             # void Entered*()/Exited*(); default to no-op
             entered = MethodDefn(
-                MethodDecl(p.enteredCxxStackVar().name, virtual=1))
+                MethodDecl(p.enteredCxxStackVar().name, virtual=1, override=1))
             exited = MethodDefn(
-                MethodDecl(p.exitedCxxStackVar().name, virtual=1))
+                MethodDecl(p.exitedCxxStackVar().name, virtual=1, override=1))
             enteredcall = MethodDefn(
-                MethodDecl(p.enteredCallVar().name, virtual=1))
+                MethodDecl(p.enteredCallVar().name, virtual=1, override=1))
             exitedcall = MethodDefn(
-                MethodDecl(p.exitedCallVar().name, virtual=1))
+                MethodDecl(p.exitedCallVar().name, virtual=1, override=1))
 
             self.cls.addstmts([ processingerror,
                                 shouldcontinue,
                                 entered, exited,
                                 enteredcall, exitedcall,
                                 Whitespace.NL ])
 
         self.cls.addstmts((
@@ -2943,17 +2943,17 @@ class _GenerateProtocolActorCode(ipdl.as
             self.cls.addstmts(self.implementManagerIface())
 
         def makeHandlerMethod(name, switch, hasReply, dispatches=0):
             params = [ Decl(Type('Message', const=1, ref=1), msgvar.name) ]
             if hasReply:
                 params.append(Decl(Type('Message', ref=1, ptr=1),
                                    replyvar.name))
 
-            method = MethodDefn(MethodDecl(name, virtual=True,
+            method = MethodDefn(MethodDecl(name, virtual=1, override=1,
                                            params=params, ret=_Result.Type()))
 
             if not switch:
               crash = StmtExpr(ExprCall(ExprVar('MOZ_ASSERT_UNREACHABLE'),
                                args=[ExprLiteral.String('message protocol not supported')]))
               method.addstmts([crash, StmtReturn(_Result.NotKnown)])
               return method
 
@@ -3023,34 +3023,34 @@ class _GenerateProtocolActorCode(ipdl.as
 
         destroysubtreevar = ExprVar('DestroySubtree')
         deallocsubtreevar = ExprVar('DeallocSubtree')
         deallocshmemvar = ExprVar('DeallocShmems')
         deallocselfvar = ExprVar('Dealloc' + _actorName(ptype.name(), self.side))
 
         # int32_t GetProtocolTypeId() { return PFoo; }
         gettypetag = MethodDefn(
-            MethodDecl('GetProtocolTypeId', ret=_actorTypeTagType()))
+            MethodDecl('GetProtocolTypeId', ret=_actorTypeTagType(), virtual=1, override=1))
         gettypetag.addstmt(StmtReturn(_protocolId(ptype)))
         self.cls.addstmts([ gettypetag, Whitespace.NL ])
 
         if ptype.isToplevel():
             # OnChannelClose()
-            onclose = MethodDefn(MethodDecl('OnChannelClose'))
+            onclose = MethodDefn(MethodDecl('OnChannelClose', virtual=1, override=1))
             onclose.addstmts([
                 StmtExpr(ExprCall(destroysubtreevar,
                                   args=[ _DestroyReason.NormalShutdown ])),
                 StmtExpr(ExprCall(deallocsubtreevar)),
                 StmtExpr(ExprCall(deallocshmemvar)),
                 StmtExpr(ExprCall(deallocselfvar))
             ])
             self.cls.addstmts([ onclose, Whitespace.NL ])
 
             # OnChannelError()
-            onerror = MethodDefn(MethodDecl('OnChannelError'))
+            onerror = MethodDefn(MethodDecl('OnChannelError', virtual=1, override=1))
             onerror.addstmts([
                 StmtExpr(ExprCall(destroysubtreevar,
                                   args=[ _DestroyReason.AbnormalShutdown ])),
                 StmtExpr(ExprCall(deallocsubtreevar)),
                 StmtExpr(ExprCall(deallocshmemvar)),
                 StmtExpr(ExprCall(deallocselfvar))
             ])
             self.cls.addstmts([ onerror, Whitespace.NL ])
@@ -3074,17 +3074,17 @@ class _GenerateProtocolActorCode(ipdl.as
 
         ## private methods
         self.cls.addstmt(Label.PRIVATE)
 
         ## ProtocolName()
         actorname = _actorName(p.name, self.side)
         protocolname = MethodDefn(MethodDecl(
             'ProtocolName', params=[],
-            const=1, virtual=1, ret=Type('char', const=1, ptr=1)))
+            const=1, virtual=1, override=1, ret=Type('char', const=1, ptr=1)))
         protocolname.addstmts([
             StmtReturn(ExprLiteral.String(actorname))
         ])
         self.cls.addstmts([ protocolname, Whitespace.NL ])
 
         ## DestroySubtree(bool normal)
         whyvar = ExprVar('why')
         subtreewhyvar = ExprVar('subtreewhy')
@@ -3237,23 +3237,23 @@ class _GenerateProtocolActorCode(ipdl.as
         ithkid = ExprIndex(kidsvar, ivar)
 
         methods = []
 
         if p.decl.type.isToplevel():
             getchannel = MethodDefn(MethodDecl(
                 p.getChannelMethod().name,
                 ret=Type('MessageChannel', ptr=1),
-                virtual=1))
+                virtual=1, override=1))
             getchannel.addstmt(StmtReturn(ExprAddrOf(p.channelVar())))
 
             getchannelconst = MethodDefn(MethodDecl(
                 p.getChannelMethod().name,
                 ret=Type('MessageChannel', ptr=1, const=1),
-                virtual=1, const=1))
+                virtual=1, override=1, const=1))
             getchannelconst.addstmt(StmtReturn(ExprAddrOf(p.channelVar())))
 
             methods += [ getchannel,
                          getchannelconst ]
 
         if p.decl.type.isToplevel():
             tmpvar = ExprVar('tmp')
 
@@ -3291,17 +3291,17 @@ class _GenerateProtocolActorCode(ipdl.as
 
         # all protocols share the "same" RemoveManagee() implementation
         pvar = ExprVar('aProtocolId')
         listenervar = ExprVar('aListener')
         removemanagee = MethodDefn(MethodDecl(
             p.removeManageeMethod().name,
             params=[ Decl(_protocolIdType(), pvar.name),
                      Decl(protocolbase, listenervar.name) ],
-            virtual=1))
+            virtual=1, override=1))
 
         if not len(p.managesStmts):
             removemanagee.addstmts([ _fatalError('unreached'), StmtReturn() ])
         else:
             switchontype = StmtSwitch(pvar)
             for managee in p.managesStmts:
                 case = StmtBlock()
                 actorvar = ExprVar('actor')
@@ -4888,16 +4888,17 @@ methodDefns."""
             defns.addstmts([ defn, Whitespace.NL ])
 
     return cls, defns
 
 def _splitMethodDefn(md, clsname):
     saveddecl = deepcopy(md.decl)
     md.decl.name = (clsname +'::'+ md.decl.name)
     md.decl.virtual = 0
+    md.decl.override = 0
     md.decl.static = 0
     md.decl.warn_unused = 0
     md.decl.never_inline = 0
     md.decl.only_for_definition = True
     for param in md.decl.params:
         if isinstance(param, Param):
             param.default = None
     return saveddecl, md
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -549,16 +549,29 @@ WasmThreadsSupported(JSContext* cx, unsi
 #else
     bool isSupported = false;
 #endif
     args.rval().setBoolean(isSupported);
     return true;
 }
 
 static bool
+WasmSignExtensionSupported(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
+    bool isSupported = true;
+#else
+    bool isSupported = false;
+#endif
+    args.rval().setBoolean(isSupported);
+    return true;
+}
+
+static bool
 WasmCompileMode(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
 
     // We default to ion if nothing is enabled, as does the Wasm compiler.
     JSString* result;
     if (!wasm::HasSupport(cx))
         result = JS_NewStringCopyZ(cx, "disabled");
@@ -2522,17 +2535,17 @@ testingFunc_inIon(JSContext* cx, unsigne
         // was taken, in which case we actually have jit frames on the stack.
         args.rval().setBoolean(false);
         return true;
     }
 
     ScriptFrameIter iter(cx);
     if (!iter.done() && iter.isIon()) {
         // Reset the counter of the IonScript's script.
-        jit::JSJitFrameIter jitIter(cx);
+        jit::JSJitFrameIter jitIter(cx->activation()->asJit());
         ++jitIter;
         jitIter.script()->resetWarmUpResetCounter();
     } else {
         // Check if we missed multiple attempts at compiling the innermost script.
         JSScript* script = cx->currentScript();
         if (script && script->getWarmUpResetCount() >= 20) {
             JSString* error = JS_NewStringCopyZ(cx, "Compilation is being repeatedly prevented. Giving up.");
             if (!error)
@@ -5256,16 +5269,21 @@ gc::ZealModeHelpText),
 "  Returns a boolean indicating whether WebAssembly debugging is supported on the current device;\n"
 "  returns false also if WebAssembly is not supported"),
 
     JS_FN_HELP("wasmThreadsSupported", WasmThreadsSupported, 0, 0,
 "wasmThreadsSupported()",
 "  Returns a boolean indicating whether the WebAssembly threads proposal is\n"
 "  supported on the current device."),
 
+    JS_FN_HELP("wasmSignExtensionSupported", WasmSignExtensionSupported, 0, 0,
+"wasmSignExtensionSupported()",
+"  Returns a boolean indicating whether the WebAssembly sign extension opcodes are\n"
+"  supported on the current device."),
+
     JS_FN_HELP("wasmCompileMode", WasmCompileMode, 0, 0,
 "wasmCompileMode()",
 "  Returns a string indicating the available compile policy: 'baseline', 'ion',\n"
 "  'baseline-or-ion', or 'disabled' (if wasm is not available at all)."),
 
     JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0,
 "wasmTextToBinary(str)",
 "  Translates the given text wasm module into its binary encoding."),
--- a/js/src/jit-test/tests/wasm/atomic.js
+++ b/js/src/jit-test/tests/wasm/atomic.js
@@ -565,8 +565,21 @@ assertErrorMessage(() => wasmEvalText(`(
 
 // Minimum run-time alignment for WAKE is 4
 for (let addr of [1,2,3,5,6,7]) {
     assertErrorMessage(() => wasmEvalText(`(module (memory 1 1 shared)
 					    (func (export "f") (param i32) (result i32)
 					     (atomic.wake (get_local 0) (i32.const 1))))`).exports.f(addr),
 		       RuntimeError, unaligned);
 }
+
+// Ensure alias analysis works even if atomic and non-atomic accesses are
+// mixed.
+assertErrorMessage(() => wasmEvalText(`(module
+  (memory 0 1 shared)
+  (func (export "main")
+    i32.const 1
+    i32.const 2816
+    i32.atomic.rmw16_u.xchg align=2
+    i32.load16_s offset=83 align=1
+    drop
+  )
+)`).exports.main(), RuntimeError, unaligned);
--- a/js/src/jit-test/tests/wasm/conversion.js
+++ b/js/src/jit-test/tests/wasm/conversion.js
@@ -233,17 +233,17 @@ testTrap('i64', 'trunc_u', 'f32', 184467
 testTrap('i64', 'trunc_u', 'f32', -1);
 testTrap('i64', 'trunc_u', 'f32', "nan");
 testTrap('i64', 'trunc_u', 'f32', "infinity");
 testTrap('i64', 'trunc_u', 'f32', "-infinity");
 
 testConversion('i64', 'reinterpret', 'f64', 40.09999999999968, "0x40440ccccccccca0");
 testConversion('f64', 'reinterpret', 'i64', "0x40440ccccccccca0", 40.09999999999968);
 
-if (wasmThreadsSupported()) {
+if (wasmSignExtensionSupported()) {
     testSignExtension('i32', 'extend8_s', 'i32', 0x7F, 0x7F);
     testSignExtension('i32', 'extend8_s', 'i32', 0x80, -0x80);
     testSignExtension('i32', 'extend16_s', 'i32', 0x7FFF, 0x7FFF);
     testSignExtension('i32', 'extend16_s', 'i32', 0x8000, -0x8000);
     testSignExtension('i64', 'extend8_s', 'i64', 0x7F, 0x7F);
     testSignExtension('i64', 'extend8_s', 'i64', 0x80, -0x80);
     testSignExtension('i64', 'extend16_s', 'i64', 0x7FFF, 0x7FFF);
     testSignExtension('i64', 'extend16_s', 'i64', 0x8000, -0x8000);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/regress/debug-exception-in-fast-import.js
@@ -0,0 +1,20 @@
+g = newGlobal();
+g.parent = this;
+g.eval("(" + function() {
+    Debugger(parent).onExceptionUnwind = function(frame) {}
+} + ")()")
+
+o = {};
+
+let { exports } = wasmEvalText(`
+  (module (import $imp "" "inc") (func) (func $start (call $imp)) (start $start) (export "" $start))
+`, {
+    "": {
+        inc: function() { o = o.p; }
+    }
+});
+
+// after instanciation, the start function has been executed and o is undefined.
+// This second call will throw in the imported function:
+
+assertErrorMessage(exports[""], TypeError, /undefined/);
--- a/js/src/jit/AliasAnalysisShared.cpp
+++ b/js/src/jit/AliasAnalysisShared.cpp
@@ -139,16 +139,17 @@ GetObject(const MDefinition* ins)
       case MDefinition::Opcode::AtomicTypedArrayElementBinop:
       case MDefinition::Opcode::AsmJSLoadHeap:
       case MDefinition::Opcode::AsmJSStoreHeap:
       case MDefinition::Opcode::WasmLoadTls:
       case MDefinition::Opcode::WasmLoad:
       case MDefinition::Opcode::WasmStore:
       case MDefinition::Opcode::WasmCompareExchangeHeap:
       case MDefinition::Opcode::WasmAtomicBinopHeap:
+      case MDefinition::Opcode::WasmAtomicExchangeHeap:
       case MDefinition::Opcode::WasmLoadGlobalVar:
       case MDefinition::Opcode::WasmStoreGlobalVar:
       case MDefinition::Opcode::ArrayJoin:
         return nullptr;
       default:
 #ifdef DEBUG
         // Crash when the default aliasSet is overriden, but when not added in the list above.
         if (!ins->getAliasSet().isStore() || ins->getAliasSet().flags() != AliasSet::Flag::Any)
--- a/js/src/jit/BaselineBailouts.cpp
+++ b/js/src/jit/BaselineBailouts.cpp
@@ -1895,17 +1895,17 @@ jit::FinishBailoutToBaseline(BaselineBai
     }
 
     // Create arguments objects for bailed out frames, to maintain the invariant
     // that script->needsArgsObj() implies frame->hasArgsObj().
     RootedScript innerScript(cx, nullptr);
     RootedScript outerScript(cx, nullptr);
 
     MOZ_ASSERT(cx->currentlyRunningInJit());
-    JSJitFrameIter iter(cx);
+    JSJitFrameIter iter(cx->activation()->asJit());
     uint8_t* outerFp = nullptr;
 
     // Iter currently points at the exit frame.  Get the previous frame
     // (which must be a baseline frame), and set it as the last profiling
     // frame.
     if (cx->runtime()->jitRuntime()->isProfilerInstrumentationEnabled(cx->runtime()))
         cx->jitActivation->setLastProfilingFrame(iter.prevFp());
 
@@ -1957,17 +1957,17 @@ jit::FinishBailoutToBaseline(BaselineBai
     MOZ_ASSERT(outerFp);
 
     // If we rematerialized Ion frames due to debug mode toggling, copy their
     // values into the baseline frame. We need to do this even when debug mode
     // is off, as we should respect the mutations made while debug mode was
     // on.
     JitActivation* act = cx->activation()->asJit();
     if (act->hasRematerializedFrame(outerFp)) {
-        JSJitFrameIter iter(cx);
+        JSJitFrameIter iter(cx->activation()->asJit());
         size_t inlineDepth = numFrames;
         bool ok = true;
         while (inlineDepth > 0) {
             if (iter.isBaselineJS()) {
                 // We must attempt to copy all rematerialized frames over,
                 // even if earlier ones failed, to invoke the proper frame
                 // cleanup in the Debugger.
                 ok = CopyFromRematerializedFrame(cx, act, outerFp, --inlineDepth,
--- a/js/src/jit/BaselineDebugModeOSR.cpp
+++ b/js/src/jit/BaselineDebugModeOSR.cpp
@@ -1181,14 +1181,14 @@ JitRuntime::generateBaselineDebugModeOSR
     writePerfSpewerJitCodeProfile(code, "BaselineDebugModeOSRHandler");
 #endif
 
     return code;
 }
 
 /* static */ void
 DebugModeOSRVolatileJitFrameIter::forwardLiveIterators(const CooperatingContext& cx,
-                                                         uint8_t* oldAddr, uint8_t* newAddr)
+                                                       uint8_t* oldAddr, uint8_t* newAddr)
 {
     DebugModeOSRVolatileJitFrameIter* iter;
     for (iter = cx.context()->liveVolatileJitFrameIter_; iter; iter = iter->prev)
         iter->asJSJit().exchangeReturnAddressIfMatch(oldAddr, newAddr);
 }
--- a/js/src/jit/BaselineDebugModeOSR.h
+++ b/js/src/jit/BaselineDebugModeOSR.h
@@ -88,17 +88,17 @@ class DebugModeOSRVolatileStub
 
 class DebugModeOSRVolatileJitFrameIter : public JitFrameIter
 {
     DebugModeOSRVolatileJitFrameIter** stack;
     DebugModeOSRVolatileJitFrameIter* prev;
 
   public:
     explicit DebugModeOSRVolatileJitFrameIter(JSContext* cx)
-      : JitFrameIter(cx->activation()->asJit())
+      : JitFrameIter(cx->activation()->asJit(), /* mustUnwindActivation */ true)
     {
         stack = &cx->liveVolatileJitFrameIter_.ref();
         prev = *stack;
         *stack = this;
     }
 
     ~DebugModeOSRVolatileJitFrameIter() {
         MOZ_ASSERT(*stack == this);
--- a/js/src/jit/BaselineFrame.cpp
+++ b/js/src/jit/BaselineFrame.cpp
@@ -137,17 +137,17 @@ BaselineFrame::initForOsr(InterpreterFra
 
         // For debuggee frames, update any Debugger.Frame objects for the
         // InterpreterFrame to point to the BaselineFrame.
 
         // The caller pushed a fake return address. ScriptFrameIter, used by the
         // debugger, wants a valid return address, but it's okay to just pick one.
         // In debug mode there's always at least 1 ICEntry (since there are always
         // debug prologue/epilogue calls).
-        JSJitFrameIter frame(cx);
+        JSJitFrameIter frame(cx->activation()->asJit());
         MOZ_ASSERT(frame.returnAddress() == nullptr);
         BaselineScript* baseline = fp->script()->baselineScript();
         frame.current()->setReturnAddress(baseline->returnAddressForIC(baseline->icEntry(0)));
 
         if (!Debugger::handleBaselineOsr(cx, fp, this))
             return false;
 
         setIsDebuggee();
--- a/js/src/jit/IonCacheIRCompiler.cpp
+++ b/js/src/jit/IonCacheIRCompiler.cpp
@@ -322,17 +322,17 @@ CacheRegisterAllocator::restoreIonLiveRe
 
     availableRegs_.set() = GeneralRegisterSet();
     availableRegsAfterSpill_.set() = GeneralRegisterSet::All();
 }
 
 static void*
 GetReturnAddressToIonCode(JSContext* cx)
 {
-    JSJitFrameIter frame(cx);
+    JSJitFrameIter frame(cx->activation()->asJit());
     MOZ_ASSERT(frame.type() == JitFrame_Exit,
                "An exit frame is expected as update functions are called with a VMFunction.");
 
     void* returnAddr = frame.returnAddress();
 #ifdef DEBUG
     ++frame;
     MOZ_ASSERT(frame.isIonJS());
 #endif
--- a/js/src/jit/JSJitFrameIter.cpp
+++ b/js/src/jit/JSJitFrameIter.cpp
@@ -26,21 +26,16 @@ JSJitFrameIter::JSJitFrameIter(const Jit
         current_ = activation_->bailoutData()->fp();
         frameSize_ = activation_->bailoutData()->topFrameSize();
         type_ = JitFrame_Bailout;
     } else {
         MOZ_ASSERT(!TlsContext.get()->inUnsafeCallWithABI);
     }
 }
 
-JSJitFrameIter::JSJitFrameIter(JSContext* cx)
-  : JSJitFrameIter(cx->activation()->asJit())
-{
-}
-
 bool
 JSJitFrameIter::checkInvalidation() const
 {
     IonScript* dummy;
     return checkInvalidation(&dummy);
 }
 
 bool
--- a/js/src/jit/JSJitFrameIter.h
+++ b/js/src/jit/JSJitFrameIter.h
@@ -107,17 +107,16 @@ class JSJitFrameIter
     mutable const SafepointIndex* cachedSafepointIndex_;
     const JitActivation* activation_;
 
     void dumpBaseline() const;
 
   public:
     // See comment above the class.
     explicit JSJitFrameIter(const JitActivation* activation);
-    explicit JSJitFrameIter(JSContext* cx);
 
     // Used only by DebugModeOSRVolatileJitFrameIter.
     void exchangeReturnAddressIfMatch(uint8_t* oldAddr, uint8_t* newAddr) {
         if (returnAddressToFp_ == oldAddr)
             returnAddressToFp_ = newAddr;
     }
 
     // Current frame information.
--- a/js/src/jit/JitFrames-inl.h
+++ b/js/src/jit/JitFrames-inl.h
@@ -24,17 +24,17 @@ SafepointIndex::resolve()
 #ifdef DEBUG
     resolved = true;
 #endif
 }
 
 inline BaselineFrame*
 GetTopBaselineFrame(JSContext* cx)
 {
-    JSJitFrameIter frame(cx);
+    JSJitFrameIter frame(cx->activation()->asJit());
     MOZ_ASSERT(frame.type() == JitFrame_Exit);
     ++frame;
     if (frame.isBaselineStub())
         ++frame;
     MOZ_ASSERT(frame.isBaselineJS());
     return frame.baselineFrame();
 }
 
--- a/js/src/jit/JitFrames.cpp
+++ b/js/src/jit/JitFrames.cpp
@@ -586,20 +586,17 @@ struct AutoResetLastProfilerFrameOnRetur
         MOZ_CRASH("Invalid ResumeFromException type!");
         return nullptr;
     }
 };
 
 void
 HandleExceptionWasm(JSContext* cx, wasm::WasmFrameIter* iter, ResumeFromException* rfe)
 {
-    // Maintain the wasm invariant that we have wasm frames when unwinding.
-    JitActivation* act = cx->activation()->asJit();
-    act->setWasmExitFP((const wasm::Frame*) act->jsExitFP());
-
+    MOZ_ASSERT(cx->activation()->asJit()->hasWasmExitFP());
     rfe->kind = ResumeFromException::RESUME_WASM;
     rfe->framePointer = (uint8_t*) wasm::FailFP;
     rfe->stackPointer = (uint8_t*) wasm::HandleThrow(cx, *iter);
     MOZ_ASSERT(iter->done());
 }
 
 void
 HandleException(ResumeFromException* rfe)
@@ -731,66 +728,55 @@ HandleException(ResumeFromException* rfe
             JSScript* script = frame.script();
             probes::ExitScript(cx, script, script->functionNonDelazifying(),
                                /* popProfilerFrame = */ false);
 
             if (rfe->kind == ResumeFromException::RESUME_FORCED_RETURN)
                 return;
         }
 
-        JitFrameLayout* current = frame.isScripted() ? frame.jsFrame() : nullptr;
-
         ++iter;
 
-        if (current) {
-            // Unwind the frame by updating packedExitFP. This is necessary so
-            // that (1) debugger exception unwind and leave frame hooks don't
-            // see this frame when they use ScriptFrameIter, and (2)
-            // ScriptFrameIter does not crash when accessing an IonScript
-            // that's destroyed by the ionScript->decref call.
-            EnsureBareExitFrame(cx, current);
-        }
-
         if (overrecursed) {
             // We hit an overrecursion error during bailout. Report it now.
             ReportOverRecursed(cx);
         }
     }
 
     // Wasm sets its own value of SP in HandleExceptionWasm.
     if (iter.isJSJit())
         rfe->stackPointer = iter.asJSJit().fp();
 }
 
 // Turns a JitFrameLayout into an ExitFrameLayout. Note that it has to be a
 // bare exit frame so it's ignored by TraceJitExitFrame.
 void
-EnsureBareExitFrame(JSContext* cx, JitFrameLayout* frame)
+EnsureBareExitFrame(JitActivation* act, JitFrameLayout* frame)
 {
     ExitFrameLayout* exitFrame = reinterpret_cast<ExitFrameLayout*>(frame);
 
-    if (cx->activation()->asJit()->jsExitFP() == (uint8_t*)frame) {
+    if (act->jsExitFP() == (uint8_t*)frame) {
         // If we already called this function for the current frame, do
         // nothing.
         MOZ_ASSERT(exitFrame->isBareExit());
         return;
     }
 
 #ifdef DEBUG
-    JSJitFrameIter iter(cx);
+    JSJitFrameIter iter(act);
     while (!iter.isScripted())
         ++iter;
     MOZ_ASSERT(iter.current() == frame, "|frame| must be the top JS frame");
 
-    MOZ_ASSERT(!!cx->activation()->asJit()->jsExitFP());
-    MOZ_ASSERT((uint8_t*)exitFrame->footer() >= cx->activation()->asJit()->jsExitFP(),
+    MOZ_ASSERT(!!act->jsExitFP());
+    MOZ_ASSERT((uint8_t*)exitFrame->footer() >= act->jsExitFP(),
                "Must have space for ExitFooterFrame before jsExitFP");
 #endif
 
-    cx->activation()->asJit()->setJSExitFP((uint8_t*)frame);
+    act->setJSExitFP((uint8_t*)frame);
     exitFrame->footer()->setBareExitFrame();
     MOZ_ASSERT(exitFrame->isBareExit());
 }
 
 CalleeToken
 TraceCalleeToken(JSTracer* trc, CalleeToken token)
 {
     switch (CalleeTokenTag tag = GetCalleeTokenTag(token)) {
--- a/js/src/jit/JitFrames.h
+++ b/js/src/jit/JitFrames.h
@@ -279,17 +279,17 @@ struct ResumeFromException
     // Value to push when resuming into a |finally| block.
     Value exception;
 
     BaselineBailoutInfo* bailoutInfo;
 };
 
 void HandleException(ResumeFromException* rfe);
 
-void EnsureBareExitFrame(JSContext* cx, JitFrameLayout* frame);
+void EnsureBareExitFrame(JitActivation* act, JitFrameLayout* frame);
 
 void TraceJitActivations(JSContext* cx, const CooperatingContext& target, JSTracer* trc);
 
 void UpdateJitActivationsForMinorGC(JSRuntime* rt, JSTracer* trc);
 
 static inline uint32_t
 EncodeFrameHeaderSize(size_t headerSize)
 {
@@ -307,17 +307,17 @@ MakeFrameDescriptor(uint32_t frameSize, 
     headerSize = EncodeFrameHeaderSize(headerSize);
     return 0 | (frameSize << FRAMESIZE_SHIFT) | (headerSize << FRAME_HEADER_SIZE_SHIFT) | type;
 }
 
 // Returns the JSScript associated with the topmost JIT frame.
 inline JSScript*
 GetTopJitJSScript(JSContext* cx)
 {
-    JSJitFrameIter frame(cx);
+    JSJitFrameIter frame(cx->activation()->asJit());
     MOZ_ASSERT(frame.type() == JitFrame_Exit);
     ++frame;
 
     if (frame.isBaselineStub()) {
         ++frame;
         MOZ_ASSERT(frame.isBaselineJS());
     }
 
@@ -527,21 +527,16 @@ class IonDOMExitFrameLayout;
 // this is the frame layout when we are exiting ion code, and about to enter platform ABI code
 class ExitFrameLayout : public CommonFrameLayout
 {
     inline uint8_t* top() {
         return reinterpret_cast<uint8_t*>(this + 1);
     }
 
   public:
-    // Pushed for "bare" fake exit frames that have no GC things on stack to be
-    // traced.
-    static ExitFrameType BareType() { return ExitFrameType::Bare; }
-    static ExitFrameType VMFunctionType() { return ExitFrameType::VMFunction; }
-
     static inline size_t Size() {
         return sizeof(ExitFrameLayout);
     }
     static inline size_t SizeWithFooter() {
         return Size() + ExitFooterFrame::Size();
     }
 
     inline ExitFooterFrame* footer() {
--- a/js/src/jit/VMFunctions.cpp
+++ b/js/src/jit/VMFunctions.cpp
@@ -386,17 +386,17 @@ ArrayPushDense(JSContext* cx, HandleArra
         (*length)++;
         return result == DenseElementResult::Success;
     }
 
     // AutoDetectInvalidation uses GetTopJitJSScript(cx)->ionScript(), but it's
     // possible the setOrExtendDenseElements call already invalidated the
     // IonScript. JSJitFrameIter::ionScript works when the script is invalidated
     // so we use that instead.
-    JSJitFrameIter frame(cx);
+    JSJitFrameIter frame(cx->activation()->asJit());
     MOZ_ASSERT(frame.type() == JitFrame_Exit);
     ++frame;
     IonScript* ionScript = frame.ionScript();
 
     JS::AutoValueArray<3> argv(cx);
     AutoDetectInvalidation adi(cx, argv[0], ionScript);
     argv[0].setUndefined();
     argv[1].setObject(*arr);
@@ -867,17 +867,17 @@ DebugEpilogue(JSContext* cx, BaselineFra
     UnwindAllEnvironmentsInFrame(cx, ei);
     JSScript* script = frame->script();
     frame->setOverridePc(script->lastPC());
 
     if (!ok) {
         // Pop this frame by updating packedExitFP, so that the exception
         // handling code will start at the previous frame.
         JitFrameLayout* prefix = frame->framePrefix();
-        EnsureBareExitFrame(cx, prefix);
+        EnsureBareExitFrame(cx->activation()->asJit(), prefix);
         return false;
     }
 
     // Clear the override pc. This is not necessary for correctness: the frame
     // will return immediately, but this simplifies the check we emit in debug
     // builds after each callVM, to ensure this flag is not set.
     frame->clearOverridePc();
     return true;
--- a/js/src/moz.build
+++ b/js/src/moz.build
@@ -635,16 +635,17 @@ DIRS += [
     'build',
 ]
 
 FINAL_LIBRARY = 'js'
 
 if CONFIG['NIGHTLY_BUILD']:
     DEFINES['ENABLE_BINARYDATA'] = True
     DEFINES['ENABLE_SIMD'] = True
+    DEFINES['ENABLE_WASM_SIGNEXTEND_OPS'] = True
     DEFINES['ENABLE_WASM_THREAD_OPS'] = True
 
 if CONFIG['JS_BUILD_BINAST']:
     # Using SOURCES as UNIFIED_SOURCES causes mysterious bugs on 32-bit platforms.
     # These parts of BinAST are designed only to test evolutions of the
     # specification.
     SOURCES += ['frontend/BinTokenReaderTester.cpp']
     # These parts of BinAST should eventually move to release.
--- a/js/src/vm/Stack.cpp
+++ b/js/src/vm/Stack.cpp
@@ -477,35 +477,37 @@ JitFrameIter::JitFrameIter(const JitFram
 }
 
 JitFrameIter&
 JitFrameIter::operator=(const JitFrameIter& another)
 {
     MOZ_ASSERT(this != &another);
 
     act_ = another.act_;
+    mustUnwindActivation_ = another.mustUnwindActivation_;
 
     if (isSome())
         iter_.destroy();
     if (!another.isSome())
         return *this;
 
     if (another.isJSJit()) {
         iter_.construct<jit::JSJitFrameIter>(another.asJSJit());
     } else {
         MOZ_ASSERT(another.isWasm());
         iter_.construct<wasm::WasmFrameIter>(another.asWasm());
     }
 
     return *this;
 }
 
-JitFrameIter::JitFrameIter(jit::JitActivation* act)
+JitFrameIter::JitFrameIter(jit::JitActivation* act, bool mustUnwindActivation)
 {
     act_ = act;
+    mustUnwindActivation_ = mustUnwindActivation;
     MOZ_ASSERT(act->hasExitFP(), "packedExitFP is used to determine if JSJit or wasm");
     if (act->hasJSExitFP()) {
         iter_.construct<jit::JSJitFrameIter>(act);
     } else {
         MOZ_ASSERT(act->hasWasmExitFP());
         iter_.construct<wasm::WasmFrameIter>(act);
     }
     settle();
@@ -552,33 +554,53 @@ JitFrameIter::settle()
         // [WASM JIT EXIT FRAME ]
         // [JIT WASM ENTRY FRAME] <-- we're here.
         //
         // So prevFP points to the wasm jit exit FP, maintaing the invariant in
         // WasmFrameIter that the first frame is an exit frame and can be
         // popped.
 
         wasm::Frame* prevFP = (wasm::Frame*) jitFrame.prevFp();
+
+        if (mustUnwindActivation_)
+            act_->setWasmExitFP(prevFP);
+
         iter_.destroy();
         iter_.construct<wasm::WasmFrameIter>(act_, prevFP);
         MOZ_ASSERT(!asWasm().done());
         return;
     }
 }
 
 void
 JitFrameIter::operator++()
 {
     MOZ_ASSERT(isSome());
-    if (isJSJit())
+    if (isJSJit()) {
+        const jit::JSJitFrameIter& jitFrame = asJSJit();
+
+        jit::JitFrameLayout* prevFrame = nullptr;
+        if (mustUnwindActivation_ && jitFrame.isScripted())
+            prevFrame = jitFrame.jsFrame();
+
         ++asJSJit();
-    else if (isWasm())
+
+        if (prevFrame) {
+            // Unwind the frame by updating packedExitFP. This is necessary
+            // so that (1) debugger exception unwind and leave frame hooks
+            // don't see this frame when they use ScriptFrameIter, and (2)
+            // ScriptFrameIter does not crash when accessing an IonScript
+            // that's destroyed by the ionScript->decref call.
+            EnsureBareExitFrame(act_, prevFrame);
+        }
+    } else if (isWasm()) {
         ++asWasm();
-    else
+    } else {
         MOZ_CRASH("unhandled case");
+    }
     settle();
 }
 
 OnlyJSJitFrameIter::OnlyJSJitFrameIter(jit::JitActivation* act)
   : JitFrameIter(act)
 {
     settle();
 }
--- a/js/src/vm/Stack.h
+++ b/js/src/vm/Stack.h
@@ -1775,22 +1775,23 @@ class InterpreterFrameIterator
 // TODO(bug 1360211) In particular, this can handle the transition from wasm to
 // ion and from ion to wasm, since these will be interleaved in the same
 // JitActivation.
 class JitFrameIter
 {
   protected:
     jit::JitActivation* act_;
     mozilla::MaybeOneOf<jit::JSJitFrameIter, wasm::WasmFrameIter> iter_;
+    bool mustUnwindActivation_;
 
     void settle();
 
   public:
-    JitFrameIter() : act_(nullptr), iter_() {}
-    explicit JitFrameIter(jit::JitActivation* activation);
+    JitFrameIter() : act_(nullptr), iter_(), mustUnwindActivation_(false) {}
+    explicit JitFrameIter(jit::JitActivation* activation, bool mustUnwindActivation = false);
 
     explicit JitFrameIter(const JitFrameIter& another);
     JitFrameIter& operator=(const JitFrameIter& another);
 
     bool isSome() const { return !iter_.empty(); }
     void reset() { MOZ_ASSERT(isSome()); iter_.destroy(); }
 
     bool isJSJit() const { return isSome() && iter_.constructed<jit::JSJitFrameIter>(); }
--- a/js/src/wasm/WasmBaselineCompile.cpp
+++ b/js/src/wasm/WasmBaselineCompile.cpp
@@ -8954,17 +8954,17 @@ BaseCompiler::emitBody()
           case uint16_t(Op::F64Le):
             CHECK_NEXT(emitComparison(emitCompareF64, ValType::F64, Assembler::DoubleLessThanOrEqual));
           case uint16_t(Op::F64Gt):
             CHECK_NEXT(emitComparison(emitCompareF64, ValType::F64, Assembler::DoubleGreaterThan));
           case uint16_t(Op::F64Ge):
             CHECK_NEXT(emitComparison(emitCompareF64, ValType::F64, Assembler::DoubleGreaterThanOrEqual));
 
           // Sign extensions
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
           case uint16_t(Op::I32Extend8S):
             CHECK_NEXT(emitConversion(emitExtendI32_8, ValType::I32, ValType::I32));
           case uint16_t(Op::I32Extend16S):
             CHECK_NEXT(emitConversion(emitExtendI32_16, ValType::I32, ValType::I32));
           case uint16_t(Op::I64Extend8S):
             CHECK_NEXT(emitConversion(emitExtendI64_8, ValType::I64, ValType::I64));
           case uint16_t(Op::I64Extend16S):
             CHECK_NEXT(emitConversion(emitExtendI64_16, ValType::I64, ValType::I64));
--- a/js/src/wasm/WasmBinaryConstants.h
+++ b/js/src/wasm/WasmBinaryConstants.h
@@ -309,17 +309,17 @@ enum class Op
     F64PromoteF32                        = 0xbb,
 
     // Reinterpretations
     I32ReinterpretF32                    = 0xbc,
     I64ReinterpretF64                    = 0xbd,
     F32ReinterpretI32                    = 0xbe,
     F64ReinterpretI64                    = 0xbf,
 
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
     // Sign extension
     I32Extend8S                          = 0xc0,
     I32Extend16S                         = 0xc1,
     I64Extend8S                          = 0xc2,
     I64Extend16S                         = 0xc3,
     I64Extend32S                         = 0xc4,
 #endif
 
--- a/js/src/wasm/WasmBinaryIterator.cpp
+++ b/js/src/wasm/WasmBinaryIterator.cpp
@@ -172,17 +172,17 @@ wasm::Classify(OpBytes op)
       case Op::F32ConvertUI64:
       case Op::F32DemoteF64:
       case Op::F64ConvertSI32:
       case Op::F64ConvertUI32:
       case Op::F64ConvertSI64:
       case Op::F64ConvertUI64:
       case Op::F64ReinterpretI64:
       case Op::F64PromoteF32:
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
       case Op::I32Extend8S:
       case Op::I32Extend16S:
       case Op::I64Extend8S:
       case Op::I64Extend16S:
       case Op::I64Extend32S:
 #endif
         return OpKind::Conversion;
       case Op::I32Load8S:
--- a/js/src/wasm/WasmBinaryToAST.cpp
+++ b/js/src/wasm/WasmBinaryToAST.cpp
@@ -1508,17 +1508,17 @@ AstDecodeExpr(AstDecodeContext& c)
       case uint16_t(Op::F64ReinterpretI64):
         if (!AstDecodeConversion(c, ValType::I64, ValType::F64, Op(op.b0)))
             return false;
         break;
       case uint16_t(Op::F64PromoteF32):
         if (!AstDecodeConversion(c, ValType::F32, ValType::F64, Op(op.b0)))
             return false;
         break;
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
       case uint16_t(Op::I32Extend8S):
       case uint16_t(Op::I32Extend16S):
         if (!AstDecodeConversion(c, ValType::I32, ValType::I32, Op(op.b0)))
             return false;
         break;
       case uint16_t(Op::I64Extend8S):
       case uint16_t(Op::I64Extend16S):
       case uint16_t(Op::I64Extend32S):
--- a/js/src/wasm/WasmBinaryToText.cpp
+++ b/js/src/wasm/WasmBinaryToText.cpp
@@ -731,17 +731,17 @@ RenderConversionOperator(WasmRenderConte
       case Op::F32ConvertUI64:    opStr = "f32.convert_u/i64"; break;
       case Op::F32DemoteF64:      opStr = "f32.demote/f64"; break;
       case Op::F64ConvertSI32:    opStr = "f64.convert_s/i32"; break;
       case Op::F64ConvertUI32:    opStr = "f64.convert_u/i32"; break;
       case Op::F64ConvertSI64:    opStr = "f64.convert_s/i64"; break;
       case Op::F64ConvertUI64:    opStr = "f64.convert_u/i64"; break;
       case Op::F64ReinterpretI64: opStr = "f64.reinterpret/i64"; break;
       case Op::F64PromoteF32:     opStr = "f64.promote/f32"; break;
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
       case Op::I32Extend8S:       opStr = "i32.extend8_s"; break;
       case Op::I32Extend16S:      opStr = "i32.extend16_s"; break;
       case Op::I64Extend8S:       opStr = "i64.extend8_s"; break;
       case Op::I64Extend16S:      opStr = "i64.extend16_s"; break;
       case Op::I64Extend32S:      opStr = "i64.extend32_s"; break;
 #endif
       case Op::I32Eqz:            opStr = "i32.eqz"; break;
       case Op::I64Eqz:            opStr = "i64.eqz"; break;
--- a/js/src/wasm/WasmIonCompile.cpp
+++ b/js/src/wasm/WasmIonCompile.cpp
@@ -2425,17 +2425,17 @@ EmitTruncate(FunctionCompiler& f, ValTyp
     } else {
         MOZ_ASSERT(resultType == ValType::I64);
         MOZ_ASSERT(!f.env().isAsmJS());
         f.iter().setResult(f.truncate<MWasmTruncateToInt64>(input, isUnsigned));
     }
     return true;
 }
 
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
 static bool
 EmitSignExtend(FunctionCompiler& f, uint32_t srcSize, uint32_t targetSize)
 {
     MDefinition* input;
     ValType type = targetSize == 4 ? ValType::I32 : ValType::I64;
     if (!f.iter().readConversion(type, type, &input))
         return false;
 
@@ -3960,17 +3960,17 @@ EmitBodyExprs(FunctionCompiler& f)
           case uint16_t(Op::I64ReinterpretF64):
             CHECK(EmitReinterpret(f, ValType::I64, ValType::F64, MIRType::Int64));
           case uint16_t(Op::F32ReinterpretI32):
             CHECK(EmitReinterpret(f, ValType::F32, ValType::I32, MIRType::Float32));
           case uint16_t(Op::F64ReinterpretI64):
             CHECK(EmitReinterpret(f, ValType::F64, ValType::I64, MIRType::Double));
 
           // Sign extensions
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
           case uint16_t(Op::I32Extend8S):
             CHECK(EmitSignExtend(f, 1, 4));
           case uint16_t(Op::I32Extend16S):
             CHECK(EmitSignExtend(f, 2, 4));
           case uint16_t(Op::I64Extend8S):
             CHECK(EmitSignExtend(f, 1, 8));
           case uint16_t(Op::I64Extend16S):
             CHECK(EmitSignExtend(f, 2, 8));
--- a/js/src/wasm/WasmTextToBinary.cpp
+++ b/js/src/wasm/WasmTextToBinary.cpp
@@ -1216,17 +1216,17 @@ WasmTokenStream::next()
                 if (consume(u"div_u"))
                     return WasmToken(WasmToken::BinaryOpcode, Op::I32DivU, begin, cur_);
                 break;
               case 'e':
                 if (consume(u"eqz"))
                     return WasmToken(WasmToken::UnaryOpcode, Op::I32Eqz, begin, cur_);
                 if (consume(u"eq"))
                     return WasmToken(WasmToken::ComparisonOpcode, Op::I32Eq, begin, cur_);
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
                 if (consume(u"extend8_s"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I32Extend8S, begin, cur_);
                 if (consume(u"extend16_s"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I32Extend16S, begin, cur_);
 #endif
                 break;
               case 'g':
                 if (consume(u"ge_s"))
@@ -1444,17 +1444,17 @@ WasmTokenStream::next()
                 if (consume(u"eq"))
                     return WasmToken(WasmToken::ComparisonOpcode, Op::I64Eq, begin, cur_);
                 if (consume(u"extend_s/i32"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I64ExtendSI32,
                                      begin, cur_);
                 if (consume(u"extend_u/i32"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I64ExtendUI32,
                                      begin, cur_);
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
                 if (consume(u"extend8_s"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I64Extend8S, begin, cur_);
                 if (consume(u"extend16_s"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I64Extend16S, begin, cur_);
                 if (consume(u"extend32_s"))
                     return WasmToken(WasmToken::ConversionOpcode, Op::I64Extend32S, begin, cur_);
 #endif
                 break;
--- a/js/src/wasm/WasmValidate.cpp
+++ b/js/src/wasm/WasmValidate.cpp
@@ -602,17 +602,17 @@ DecodeFunctionBodyExprs(const ModuleEnvi
           case uint16_t(Op::F64ConvertUI32):
             CHECK(iter.readConversion(ValType::I32, ValType::F64, &nothing));
           case uint16_t(Op::F64ConvertSI64):
           case uint16_t(Op::F64ConvertUI64):
           case uint16_t(Op::F64ReinterpretI64):
             CHECK(iter.readConversion(ValType::I64, ValType::F64, &nothing));
           case uint16_t(Op::F64PromoteF32):
             CHECK(iter.readConversion(ValType::F32, ValType::F64, &nothing));
-#ifdef ENABLE_WASM_THREAD_OPS
+#ifdef ENABLE_WASM_SIGNEXTEND_OPS
           case uint16_t(Op::I32Extend8S):
           case uint16_t(Op::I32Extend16S):
             CHECK(iter.readConversion(ValType::I32, ValType::I32, &nothing));
           case uint16_t(Op::I64Extend8S):
           case uint16_t(Op::I64Extend16S):
           case uint16_t(Op::I64Extend32S):
             CHECK(iter.readConversion(ValType::I64, ValType::I64, &nothing));
 #endif
--- a/taskcluster/ci/release-balrog-publishing/kind.yml
+++ b/taskcluster/ci/release-balrog-publishing/kind.yml
@@ -69,18 +69,28 @@ job-defaults:
 
 jobs:
    firefox:
       name: release-firefox_schedule_publishing_in_balrog
       shipping-product: firefox
       run:
          product: firefox
          buildername: release-{branch}-firefox_schedule_publishing_in_balrog
+         channels:
+            by-project:
+               birch: release
+               maple: beta
+               mozilla-beta: beta
+               mozilla-release: release
+               mozilla-esr52: esr
+               mozilla-esr59: esr
+               default: unknown
       index:
          product: firefox
    devedition:
       name: release-devedition_schedule_publishing_in_balrog
       shipping-product: devedition
       run:
          product: devedition
          buildername: release-{branch}-devedition_schedule_publishing_in_balrog
+         channels: aurora
       index:
          product: devedition
--- a/taskcluster/ci/release-secondary-final-verify/kind.yml
+++ b/taskcluster/ci/release-secondary-final-verify/kind.yml
@@ -76,15 +76,15 @@ jobs:
    firefox:
       description: secondary final verify
       shipping-phase: promote
       shipping-product: firefox
       worker:
          env:
             FINAL_VERIFY_CONFIGS:
                by-project:
-                  mozilla-beta: "beta-firefox-linux.cfg beta-firefox-linux64.cfg beta-firefox-macosx64.cfg beta-firefox-win32.cfg beta-firefox-win64.cfg"
+                  mozilla-release: "beta-firefox-linux.cfg beta-firefox-linux64.cfg beta-firefox-macosx64.cfg beta-firefox-win32.cfg beta-firefox-win64.cfg"
                   default: ""
       treeherder:
          platform: linux64/opt
          kind: test
          symbol: Rel(FVS)
          tier: 1
--- a/taskcluster/ci/release-updates-builder/kind.yml
+++ b/taskcluster/ci/release-updates-builder/kind.yml
@@ -97,16 +97,17 @@ jobs:
                   mozilla-beta: "beta"
                   # beta gets removed for non RCs by the
                   # release_updates transform
                   mozilla-release: "beta,release"
                   mozilla-esr52: "esr"
                   default: "default"
             repo_path:
                by-project:
+                  birch: "projects/birch"
                   jamun: "projects/jamun"
                   maple: "projects/maple"
                   mozilla-beta: "releases/mozilla-beta"
                   mozilla-release: "releases/mozilla-release"
                   mozilla-esr52: "releases/mozilla-esr52"
                   default: "default"
 
    devedition:
--- a/taskcluster/docker/update-verify/Dockerfile
+++ b/taskcluster/docker/update-verify/Dockerfile
@@ -1,11 +1,11 @@
 FROM python:2-slim-stretch
 
 MAINTAINER release@mozilla.com
 
 RUN dpkg --add-architecture i386 && apt-get -q update \
     # p7zip-full is for extracting Windows and OS X packages
     # Mercurial is for cloning required repositories
     # wget is for downloading update.xml, installers, and MARs
-    # libgtk-3-0 is required to run the Firefox updater
-    && apt-get -q --yes install p7zip-full mercurial wget libgtk-3-0 libgtk-3.0:i386 \
+    # libgtk-3-0 and libgtk2.0-0 are required to run the Firefox updater
+    && apt-get -q --yes install p7zip-full mercurial wget libgtk-3-0 libgtk-3.0:i386 libgtk2.0-0 libgtk2.0-0:i386 \
     && apt-get clean
--- a/taskcluster/taskgraph/transforms/job/buildbot.py
+++ b/taskcluster/taskgraph/transforms/job/buildbot.py
@@ -6,76 +6,66 @@
 Support for running jobs via buildbot.
 
 """
 
 from __future__ import absolute_import, print_function, unicode_literals
 import slugid
 from urlparse import urlparse
 
-from taskgraph.util.schema import Schema
+from taskgraph.util.schema import Schema, optionally_keyed_by, resolve_keyed_by
 from taskgraph.util.scriptworker import get_release_config
 from voluptuous import Optional, Required, Any
 
 from taskgraph.transforms.job import run_job_using
 
 
 buildbot_run_schema = Schema({
     Required('using'): 'buildbot',
 
     # the buildername to use for buildbot-bridge, will expand {branch} in name from
     # the current project.
     Required('buildername'): basestring,
 
     # the product to use
     Required('product'): Any('firefox', 'mobile', 'fennec', 'devedition', 'thunderbird'),
 
+    Optional('channels'): optionally_keyed_by('project', basestring),
+
     Optional('release-promotion'): bool,
 })
 
 
 def _get_balrog_api_root(branch):
     if branch in ('mozilla-beta', 'mozilla-release') or branch.startswith('mozilla-esr'):
         return 'https://aus4-admin.mozilla.org/api'
     else:
         return 'https://balrog-admin.stage.mozaws.net/api'
 
 
-def _get_balrog_channel(product, branch):
-    if product == 'devedition':
-        return 'aurora'
-    elif product == 'firefox':
-        if branch in ('mozilla-beta', 'maple'):
-            return 'beta'
-        elif branch == 'mozilla-release':
-            return 'release'
-        elif branch.startswith('mozilla-esr'):
-            return 'esr'
-    # Unsupported channels are filtered out after the task is generated. Then, we must
-    # provide a dummy value for them, otherwise the Decision task breaks.
-    return 'unknown'
-
-
 def bb_release_worker(config, worker, run):
     # props
     release_props = get_release_config(config)
     repo_path = urlparse(config.params['head_repository']).path.lstrip('/')
     revision = config.params['head_rev']
     branch = config.params['project']
     product = run['product']
 
     release_props.update({
         'release_promotion': True,
         'repo_path': repo_path,
         'revision': revision,
     })
 
+    if 'channels' in run:
+        release_props['channels'] = run['channels']
+        resolve_keyed_by(release_props, 'channels', 'channels', **config.params)
+
     if product in ('devedition', 'firefox'):
         release_props['balrog_api_root'] = _get_balrog_api_root(branch)
-        release_props['channels'] = _get_balrog_channel(product, branch)
 
     worker['properties'].update(release_props)
     # Setting script_repo_revision to the gecko revision doesn't work for
     # jobs that clone build/tools or other repos instead of gecko.
     if 'script_repo_revision' not in worker['properties']:
         worker['properties']['script_repo_revision'] = revision
 
 
--- a/testing/web-platform/meta/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm.ini
+++ b/testing/web-platform/meta/2dcontext/building-paths/canvas_complexshapes_arcto_001.htm.ini
@@ -1,3 +1,2 @@
 [canvas_complexshapes_arcto_001.htm]
-  type: reftest
   expected: FAIL
--- a/testing/web-platform/meta/2dcontext/building-paths/canvas_complexshapes_beziercurveto_001.htm.ini
+++ b/testing/web-platform/meta/2dcontext/building-paths/canvas_complexshapes_beziercurveto_001.htm.ini
@@ -1,4 +1,3 @@
 [canvas_complexshapes_beziercurveto_001.htm]
-  type: reftest
   disabled: if (os == "win") and (version == "10.0.15603"): https://bugzilla.mozilla.org/show_bug.cgi?id=1372037
   expected: FAIL
--- a/testing/web-platform/meta/2dcontext/compositing/2d.composite.operation.clear.html.ini
+++ b/testing/web-platform/meta/2dcontext/compositing/2d.composite.operation.clear.html.ini
@@ -1,5 +1,4 @@
 [2d.composite.operation.clear.html]
-  type: testharness
   [Canvas test: 2d.composite.operation.clear]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.animated.poster.html.ini
@@ -1,5 +1,4 @@
 [2d.drawImage.animated.poster.html]
-  type: testharness
   [drawImage() of an APNG draws the poster frame]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.incomplete.reload.html.ini
@@ -1,5 +1,4 @@
 [2d.drawImage.incomplete.reload.html]
-  type: testharness
   [Canvas test: 2d.drawImage.incomplete.reload]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerocanvas.html.ini
@@ -1,5 +1,4 @@
 [2d.drawImage.zerocanvas.html]
-  type: testharness
   [Canvas test: 2d.drawImage.zerocanvas]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-images-to-the-canvas/2d.drawImage.zerosource.html.ini
@@ -1,5 +1,4 @@
 [2d.drawImage.zerosource.html]
-  type: testharness
   [drawImage with zero-sized source rectangle draws nothing without exception]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawCustomFocusRing_001.html.ini
@@ -1,8 +1,7 @@
 [canvas_focus_drawCustomFocusRing_001.html]
-  type: testharness
   [drawCustomFocusRing must return false for an element that is not focused.]
     expected: FAIL
 
   [drawCustomFocusRing must return false for an element that is not a descendant of the canvas element.]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_001.html.ini
@@ -1,10 +1,9 @@
 [drawFocusIfNeeded_001.html]
-  type: testharness
   disabled:
     if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
   [drawFocusIfNeeded draws a focus ring.]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_004.html.ini
@@ -1,10 +1,9 @@
 [drawFocusIfNeeded_004.html]
-  type: testharness
   disabled:
     if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
   [drawFocusIfNeeded does draw a focus ring if the element is in focus.]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
 
--- a/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html.ini
+++ b/testing/web-platform/meta/2dcontext/drawing-paths-to-the-canvas/drawFocusIfNeeded_005.html.ini
@@ -1,10 +1,9 @@
 [drawFocusIfNeeded_005.html]
-  type: testharness
   disabled:
     if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1092458
   [drawFocusIfNeeded does draw a focus ring if the element is in focus and the user activated a particular focus ring.]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "5.1.2600") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.overlap.html.ini
@@ -1,9 +1,8 @@
 [2d.gradient.interpolate.overlap.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.overlap]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fill.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.fill.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.fill]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillRect.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.fillRect.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.fillRect]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillText.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.fillText.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.fillText.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.fillText]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.stroke.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.stroke]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.strokeRect.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.strokeRect]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeText.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeText.html.ini
@@ -1,5 +1,4 @@
 [2d.gradient.interpolate.zerosize.strokeText.html]
-  type: testharness
   [Canvas test: 2d.gradient.interpolate.zerosize.strokeText]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.object.current.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.object.current.html.ini
@@ -1,6 +1,5 @@
 [2d.gradient.object.current.html]
-  type: testharness
   [Canvas test: 2d.gradient.object.current]
     expected:
       if not stylo: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.radial.outside3.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.gradient.radial.outside3.html.ini
@@ -1,8 +1,7 @@
 [2d.gradient.radial.outside3.html]
-  type: testharness
   [Canvas test: 2d.gradient.radial.outside3]
     expected:
       if (os == "win") and (version != "6.2.9200"): FAIL
       if os == "mac": FAIL
       if os == "linux": FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.broken.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.broken.html.ini
@@ -1,10 +1,9 @@
 [2d.pattern.image.broken.html]
-  type: testharness
   [Canvas test: 2d.pattern.image.broken]
     disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1016482
     expected:
       if not debug and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "linux") and (version == "Ubuntu 12.04") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "mac") and (version == "OS X 10.6.8") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "mac") and (version == "OS X 10.9") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.emptysrc.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.emptysrc.html.ini
@@ -1,5 +1,4 @@
 [2d.pattern.image.incomplete.emptysrc.html]
-  type: testharness
   [Canvas test: 2d.pattern.image.incomplete.emptysrc]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.nosrc.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.nosrc.html.ini
@@ -1,5 +1,4 @@
 [2d.pattern.image.incomplete.nosrc.html]
-  type: testharness
   [Canvas test: 2d.pattern.image.incomplete.nosrc]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.reload.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.reload.html.ini
@@ -1,5 +1,4 @@
 [2d.pattern.image.incomplete.reload.html]
-  type: testharness
   [Canvas test: 2d.pattern.image.incomplete.reload]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/2d.pattern.image.incomplete.removedsrc.html.ini
@@ -1,5 +1,4 @@
 [2d.pattern.image.incomplete.removedsrc.html]
-  type: testharness
   [Canvas test: 2d.pattern.image.incomplete.removedsrc]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/canvas_colorsandstyles_createlineargradient_001.htm.ini
+++ b/testing/web-platform/meta/2dcontext/fill-and-stroke-styles/canvas_colorsandstyles_createlineargradient_001.htm.ini
@@ -1,5 +1,4 @@
 [canvas_colorsandstyles_createlineargradient_001.htm]
-  type: testharness
   [linear gradient from point to self draws nothing]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/hit-regions/addHitRegions-NotSupportedError-01.html.ini
+++ b/testing/web-platform/meta/2dcontext/hit-regions/addHitRegions-NotSupportedError-01.html.ini
@@ -1,10 +1,9 @@
 [addHitRegions-NotSupportedError-01.html]
-  type: testharness
   [fillRect should not affect current default path and NotSupportedError should be thrown.]
     expected: FAIL
 
   [strokeRect should not affect current default path and NotSupportedError should be thrown.]
     expected: FAIL
 
   [fillText should not affect current default path and NotSupportedError should be thrown.]
     expected: FAIL
--- a/testing/web-platform/meta/2dcontext/hit-regions/hitregions-members-exist.html.ini
+++ b/testing/web-platform/meta/2dcontext/hit-regions/hitregions-members-exist.html.ini
@@ -1,10 +1,9 @@
 [hitregions-members-exist.html]
-  type: testharness
   [context.addHitRegion Exists]
     expected: FAIL
 
   [context.removeHitRegion Exists]
     expected: FAIL
 
   [context.clearHitRegions Exists]
     expected: FAIL
--- a/testing/web-platform/meta/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini
+++ b/testing/web-platform/meta/2dcontext/imagebitmap/createImageBitmap-invalid-args.html.ini
@@ -1,10 +1,18 @@
 [createImageBitmap-invalid-args.html]
-  type: testharness
+  expected:
+    if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH
+    if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH
+    if debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): CRASH
+    if debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): CRASH
+    if debug and stylo and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH
+    if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): CRASH
+    if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): CRASH
+    if debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): CRASH
   [createImageBitmap with a HTMLImageElement source and sw set to 0 rejects with a RangeError.]
     expected: FAIL
 
   [createImageBitmap with a HTMLImageElement source and sh set to 0 rejects with a RangeError.]
     expected: FAIL
 
   [createImageBitmap with a HTMLImageElement source and oversized (unallocatable) crop region rejects with an InvalidStateError DOMException.]
     expected: FAIL
@@ -61,8 +69,14 @@
     expected: FAIL
 
   [createImageBitmap with an oversized canvas source rejects with a RangeError.]
     expected: FAIL
 
   [createImageBitmap with an invalid OffscreenCanvas source rejects with a RangeError.]
     expected: FAIL
 
+  [createImageBitmap with a broken image source rejects with an InvalidStateError.]
+    expected: FAIL
+
+  [createImageBitmap with an available but undecodable image source rejects with an InvalidStateError.]
+    expected: FAIL
+
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.selfintersect.1.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.selfintersect.1.html.ini
@@ -1,8 +1,7 @@
 [2d.path.arc.selfintersect.1.html]
-  type: testharness
   [arc() with lineWidth > 2*radius is drawn sensibly]
     expected:
       if (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.shape.3.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.arc.shape.3.html.ini
@@ -1,6 +1,5 @@
 [2d.path.arc.shape.3.html]
-  type: testharness
   [arc() from 0 to -pi/2 does not draw anything in the wrong quadrant]
     expected:
       if (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.rect.zero.3.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.rect.zero.3.html.ini
@@ -1,9 +1,8 @@
 [2d.path.rect.zero.3.html]
-  type: testharness
   [Canvas test: 2d.path.rect.zero.3]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.arc.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.arc.html.ini
@@ -1,10 +1,9 @@
 [2d.path.stroke.prune.arc.html]
-  type: testharness
   [Zero-length line segments from arcTo and arc are removed before stroking]
     expected:
       if not debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if os == "win": FAIL
       if os == "mac": FAIL
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.closed.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.closed.html.ini
@@ -1,8 +1,7 @@
 [2d.path.stroke.prune.closed.html]
-  type: testharness
   [Zero-length line segments from closed paths are removed before stroking]
     expected:
       if os == "win": FAIL
       if os == "mac": FAIL
       if os == "linux": FAIL
 
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.curve.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.curve.html.ini
@@ -1,10 +1,9 @@
 [2d.path.stroke.prune.curve.html]
-  type: testharness
   [Zero-length line segments from quadraticCurveTo and bezierCurveTo are removed before stroking]
     expected:
       if not debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if os == "win": FAIL
       if os == "mac": FAIL
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.line.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.line.html.ini
@@ -1,10 +1,9 @@
 [2d.path.stroke.prune.line.html]
-  type: testharness
   [Zero-length line segments from lineTo are removed before stroking]
     expected:
       if not debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if not debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "linux") and (processor == "x86") and (bits == 32): FAIL
       if os == "win": FAIL
       if os == "mac": FAIL
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.rect.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.prune.rect.html.ini
@@ -1,8 +1,7 @@
 [2d.path.stroke.prune.rect.html]
-  type: testharness
   [Zero-length line segments from rect and strokeRect are removed before stroking]
     expected:
       if os == "win": FAIL
       if os == "mac": FAIL
       if os == "linux": FAIL
 
--- a/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.scale2.html.ini
+++ b/testing/web-platform/meta/2dcontext/path-objects/2d.path.stroke.scale2.html.ini
@@ -1,9 +1,8 @@
 [2d.path.stroke.scale2.html]
-  type: testharness
   [Stroke line widths are scaled by the current transformation matrix]
     expected:
       if not debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): FAIL
       if debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
       if not debug and (os == "win") and (version == "10.0.10240") and (processor == "x86_64") and (bits == 64): FAIL
 
--- a/testing/web-platform/meta/2dcontext/pixel-manipulation/2d.imageData.create2.zero.html.ini
+++ b/testing/web-platform/meta/2dcontext/pixel-manipulation/2d.imageData.create2.zero.html.ini
@@ -1,5 +1,4 @@
 [2d.imageData.create2.zero.html]
-  type: testharness
   [createImageData(sw, sh) throws INDEX_SIZE_ERR if size is zero]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/pixel-manipulation/2d.imageData.get.zero.html.ini
+++ b/testing/web-platform/meta/2dcontext/pixel-manipulation/2d.imageData.get.zero.html.ini
@@ -1,5 +1,4 @@
 [2d.imageData.get.zero.html]
-  type: testharness
   [getImageData() throws INDEX_SIZE_ERR if size is zero]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.baseline.hanging.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.baseline.hanging.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.baseline.hanging.html]
-  type: testharness
   [Canvas test: 2d.text.draw.baseline.hanging]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.baseline.ideographic.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.baseline.ideographic.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.baseline.ideographic.html]
-  type: testharness
   [Canvas test: 2d.text.draw.baseline.ideographic]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.end.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.end.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.space.collapse.end.html]
-  type: testharness
   [Space characters at the end of a line are collapsed (per CSS)]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.other.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.other.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.space.collapse.other.html]
-  type: testharness
   [Space characters are converted to U+0020, and collapsed (per CSS)]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.space.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.space.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.space.collapse.space.html]
-  type: testharness
   [Space characters are converted to U+0020, and collapsed (per CSS)]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.start.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.draw.space.collapse.start.html.ini
@@ -1,5 +1,4 @@
 [2d.text.draw.space.collapse.start.html]
-  type: testharness
   [Space characters at the start of a line are collapsed (per CSS)]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.complex.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.complex.html.ini
@@ -1,5 +1,4 @@
 [2d.text.font.parse.complex.html]
-  type: testharness
   [Canvas test: 2d.text.font.parse.complex]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.size.percentage.default.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.size.percentage.default.html.ini
@@ -1,5 +1,4 @@
 [2d.text.font.parse.size.percentage.default.html]
-  type: testharness
   [Canvas test: 2d.text.font.parse.size.percentage.default]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.size.percentage.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.size.percentage.html.ini
@@ -1,5 +1,4 @@
 [2d.text.font.parse.size.percentage.html]
-  type: testharness
   [Canvas test: 2d.text.font.parse.size.percentage]
     expected: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.system.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.font.parse.system.html.ini
@@ -1,6 +1,5 @@
 [2d.text.font.parse.system.html]
-  type: testharness
   [System fonts must be computed to explicit values]
     expected:
       if stylo: FAIL
 
--- a/testing/web-platform/meta/2dcontext/text-styles/2d.text.measure.width.space.html.ini
+++ b/testing/web-platform/meta/2dcontext/text-styles/2d.text.measure.width.space.html.ini
@@ -1,5 +1,4 @@
 [2d.text.measure.width.space.html]
-  type: testharness
   [Space characters are converted to U+0020 and collapsed (per CSS)]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/blob/Blob-Request-revoke-fetch.html.ini
@@ -0,0 +1,4 @@
+[Blob-Request-revoke-fetch.html]
+  [Revoke blob URL after creating Request, will fetch]
+    expected: FAIL
+
--- a/testing/web-platform/meta/FileAPI/blob/Blob-constructor.html.ini
+++ b/testing/web-platform/meta/FileAPI/blob/Blob-constructor.html.ini
@@ -1,8 +1,7 @@
 [Blob-constructor.html]
-  type: testharness
   [The 'endings' property should be ignored.]
     expected: FAIL
 
   [Newlines should not change when endings is 'native'.]
     expected: FAIL
 
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/File-constructor-endings.html.ini
@@ -0,0 +1,104 @@
+[File-constructor-endings.html]
+  [Invalid "endings" value: null]
+    expected: FAIL
+
+  [Invalid "endings" value: ""]
+    expected: FAIL
+
+  [Invalid "endings" value: "invalidEnumValue"]
+    expected: FAIL
+
+  [Invalid "endings" value: "Transparent"]
+    expected: FAIL
+
+  [Invalid "endings" value: "NATIVE"]
+    expected: FAIL
+
+  [Invalid "endings" value: 0]
+    expected: FAIL
+
+  [Invalid "endings" value: {}]
+    expected: FAIL
+
+  [Exception propagation from options]
+    expected: FAIL
+
+  [The "endings" options property is used]
+    expected: FAIL
+
+  [Input LF with endings 'native']
+    expected:
+      if debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+
+  [Input CR with endings 'native']
+    expected: FAIL
+
+  [Input CRLF with endings 'native']
+    expected:
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+
+  [Input CRCR with endings 'native']
+    expected: FAIL
+
+  [Input LFCR with endings 'native']
+    expected: FAIL
+
+  [Input LFLF with endings 'native']
+    expected:
+      if debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and stylo and e10s and (os == "win") and (version == "10.0.15063") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and not e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+      if debug and stylo and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): FAIL
+
+  [Input CRCRLF with endings 'native']
+    expected: FAIL
+
+  [Input CRLFLF with endings 'native']
+    expected: FAIL
+
+  [Input CRLFCR with endings 'native']
+    expected:
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+
+  [Input CRLFCRLF with endings 'native']
+    expected:
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+      if not debug and not stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): FAIL
+      if debug and stylo and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): FAIL
+
+  [Input LFCRLFCR with endings 'native']
+    expected: FAIL
+
+  [CR/LF in adjacent input strings]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/send-file-form-iso-2022-jp.tentative.html.ini
@@ -0,0 +1,19 @@
+[send-file-form-iso-2022-jp.tentative.html]
+  [Upload file-for-upload-in-form.txt (ASCII) in ISO-2022-JP form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-.txt (x-user-defined) in ISO-2022-JP form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (windows-1252) in ISO-2022-JP form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-★星★.txt (JIS X 0201 and JIS X 0208) in ISO-2022-JP form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (Unicode) in ISO-2022-JP form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ.txt (Unicode) in ISO-2022-JP form]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/send-file-form-utf-8.html.ini
@@ -0,0 +1,19 @@
+[send-file-form-utf-8.html]
+  [Upload file-for-upload-in-form.txt (ASCII) in UTF-8 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-.txt (x-user-defined) in UTF-8 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (windows-1252) in UTF-8 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-★星★.txt (JIS X 0201 and JIS X 0208) in UTF-8 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (Unicode) in UTF-8 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ.txt (Unicode) in UTF-8 form]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/send-file-form-windows-1252.tentative.html.ini
@@ -0,0 +1,19 @@
+[send-file-form-windows-1252.tentative.html]
+  [Upload file-for-upload-in-form.txt (ASCII) in windows-1252 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-.txt (x-user-defined) in windows-1252 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (windows-1252) in windows-1252 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-★星★.txt (JIS X 0201 and JIS X 0208) in windows-1252 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (Unicode) in windows-1252 form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ.txt (Unicode) in windows-1252 form]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/send-file-form-x-user-defined.tentative.html.ini
@@ -0,0 +1,19 @@
+[send-file-form-x-user-defined.tentative.html]
+  [Upload file-for-upload-in-form.txt (ASCII) in x-user-defined form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-.txt (x-user-defined) in x-user-defined form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (windows-1252) in x-user-defined form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-★星★.txt (JIS X 0201 and JIS X 0208) in x-user-defined form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-☺😂.txt (Unicode) in x-user-defined form]
+    expected: FAIL
+
+  [Upload file-for-upload-in-form-ABC~‾¥≈¤・・•∙·☼★星🌟星★☼·∙•・・¤≈¥‾~XYZ.txt (Unicode) in x-user-defined form]
+    expected: FAIL
+
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/FileAPI/file/send-file-form.html.ini
@@ -0,0 +1,4 @@
+[send-file-form.html]
+  [Upload file-for-upload-in-form.txt (ASCII) in UTF-8 form]
+    expected: FAIL
+
--- a/testing/web-platform/meta/FileAPI/historical.https.html.ini
+++ b/testing/web-platform/meta/FileAPI/historical.https.html.ini
@@ -1,5 +1,4 @@
 [historical.https.html]
-  type: testharness
   ["FileReaderSync" should not be supported in service workers]
     expected: FAIL
 
--- a/testing/web-platform/meta/FileAPI/idlharness.html.ini
+++ b/testing/web-platform/meta/FileAPI/idlharness.html.ini
@@ -1,10 +1,9 @@
 [idlharness.html]
-  type: testharness
   [FileReaderSync interface object length]
     expected: FAIL
 
   [FileReaderSync interface: existence and properties of interface prototype object]
     expected: FAIL
 
   [FileReaderSync interface: existence and properties of interface prototype object's "constructor" property]
     expected: FAIL
--- a/testing/web-platform/meta/FileAPI/idlharness.worker.js.ini
+++ b/testing/web-platform/meta/FileAPI/idlharness.worker.js.ini
@@ -8,17 +8,16 @@
   [EventTarget interface: existence and properties of interface object]
     expected: FAIL
 
   [Event interface: existence and properties of interface object]
     expected: FAIL
 
 
 [idlharness.worker.html]
-  type: testharness
   [ArrayBuffer interface: existence and properties of interface object]
     expected: FAIL
 
   [EventTarget interface: existence and properties of interface object]
     expected: FAIL
 
   [Event interface: existence and properties of interface object]
     expected: FAIL
--- a/testing/web-platform/meta/FileAPI/reading-data-section/filereader_abort.html.ini
+++ b/testing/web-platform/meta/FileAPI/reading-data-section/filereader_abort.html.ini
@@ -1,5 +1,4 @@
 [filereader_abort.html]
-  type: testharness
   [Aborting after read]
     expected: FAIL
 
--- a/testing/web-platform/meta/IndexedDB/clone-before-keypath-eval.html.ini
+++ b/testing/web-platform/meta/IndexedDB/clone-before-keypath-eval.html.ini
@@ -1,10 +1,9 @@
 [clone-before-keypath-eval.html]
-  type: testharness
   [Key generator and key path validity check operates on a clone]
     expected: FAIL
 
   [Failing key path validity check operates on a clone]
     expected: FAIL
 
   [Index key path evaluations operate on a clone]
     expected: FAIL
--- a/testing/web-platform/meta/IndexedDB/event-dispatch-active-flag.html.ini
+++ b/testing/web-platform/meta/IndexedDB/event-dispatch-active-flag.html.ini
@@ -1,10 +1,9 @@
 [event-dispatch-active-flag.html]
-  type: testharness
   [Transactions are active during success handlers]
     expected: FAIL
 
   [Transactions are active during success listeners]
     expected: FAIL
 
   [Transactions are active during error handlers]
     expected: FAIL
--- a/testing/web-platform/meta/IndexedDB/fire-error-event-exception.html.ini
+++ b/testing/web-platform/meta/IndexedDB/fire-error-event-exception.html.ini
@@ -1,4 +1,3 @@
 [fire-error-event-exception.html]
-  type: testharness
   disabled:
     if not debug and (os == "win") and (version == "6.2.9200"): https://bugzilla.mozilla.org/show_bug.cgi?id=1347505
--- a/testing/web-platform/meta/IndexedDB/idb-binary-key-detached.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idb-binary-key-detached.htm.ini
@@ -1,8 +1,7 @@
 [idb-binary-key-detached.htm]
-  type: testharness
   [Detached ArrayBuffer]
     expected: FAIL
 
   [Detached TypedArray]
     expected: FAIL
 
--- a/testing/web-platform/meta/IndexedDB/idbcursor-update-exception-order.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idbcursor-update-exception-order.htm.ini
@@ -1,3 +1,2 @@
 [idbcursor-update-exception-order.htm]
-  type: testharness
   disabled: if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
--- a/testing/web-platform/meta/IndexedDB/idbdatabase-createObjectStore-exception-order.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idbdatabase-createObjectStore-exception-order.htm.ini
@@ -1,10 +1,9 @@
 [idbdatabase-createObjectStore-exception-order.htm]
-  type: testharness
   disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
   expected:
     if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
     if debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
     if not debug and e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86") and (bits == 32): ERROR
     if debug and e10s and (os == "mac") and (version == "OS X 10.10.5") and (processor == "x86_64") and (bits == 64): ERROR
     if not debug and not e10s and (os == "linux") and (version == "Ubuntu 16.04") and (processor == "x86_64") and (bits == 64): ERROR
     if not debug and e10s and (os == "win") and (version == "6.1.7601") and (processor == "x86") and (bits == 32): ERROR
--- a/testing/web-platform/meta/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idbdatabase-deleteObjectStore-exception-order.htm.ini
@@ -1,7 +1,6 @@
 [idbdatabase-deleteObjectStore-exception-order.htm]
-  type: testharness
   disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
   expected: ERROR
   [IDBDatabase.deleteObjectStore exception order: InvalidStateError vs. TransactionInactiveError]
     expected: FAIL
 
--- a/testing/web-platform/meta/IndexedDB/idbfactory_open9.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idbfactory_open9.htm.ini
@@ -1,10 +1,9 @@
 [idbfactory_open9.htm]
-  type: testharness
   [Calling open() with version argument undefined should throw TypeError.]
     expected: FAIL
 
   [Calling open() with version argument null should throw TypeError.]
     expected: FAIL
 
   [Calling open() with version argument object should throw TypeError.]
     expected: FAIL
--- a/testing/web-platform/meta/IndexedDB/idbindex_getAll.html.ini
+++ b/testing/web-platform/meta/IndexedDB/idbindex_getAll.html.ini
@@ -1,4 +1,3 @@
 [idbindex_getAll.html]
-  type: testharness
   disabled:
     if (os == "win") and (version == "6.2.9200") and not debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1364124
--- a/testing/web-platform/meta/IndexedDB/idbindex_getAllKeys.html.ini
+++ b/testing/web-platform/meta/IndexedDB/idbindex_getAllKeys.html.ini
@@ -1,4 +1,3 @@
 [idbindex_getAllKeys.html]
-  type: testharness
   disabled:
     if (os == "win") and (version == "6.2.9200") and not debug: https://bugzilla.mozilla.org/show_bug.cgi?id=1364124
--- a/testing/web-platform/meta/IndexedDB/idbobjectstore-deleteIndex-exception-order.html.ini
+++ b/testing/web-platform/meta/IndexedDB/idbobjectstore-deleteIndex-exception-order.html.ini
@@ -1,3 +1,2 @@
 [idbobjectstore-deleteIndex-exception-order.html]
-  type: testharness
   disabled: if os == "win": https://bugzilla.mozilla.org/show_bug.cgi?id=1336639
--- a/testing/web-platform/meta/IndexedDB/idbobjectstore_createIndex15-autoincrement.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/idbobjectstore_createIndex15-autoincrement.htm.ini
@@ -1,5 +1,4 @@
 [idbobjectstore_createIndex15-autoincrement.htm]
-  type: testharness
   [Auto-Increment Primary Key]
     expected: FAIL
 
--- a/testing/web-platform/meta/IndexedDB/idbobjectstore_getAll.html.ini
+++ b/testing/web-platform/meta/IndexedDB/idbobjectstore_getAll.html.ini
@@ -1,8 +1,7 @@
 [idbobjectstore_getAll.html]
-  type: testharness
   expected:
     if not debug and not stylo and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT
   [zero maxCount]
     expected:
       if not debug and not stylo and e10s and (os == "win") and (version == "6.2.9200") and (processor == "x86_64") and (bits == 64): TIMEOUT
 
--- a/testing/web-platform/meta/IndexedDB/keypath-exceptions.htm.ini
+++ b/testing/web-platform/meta/IndexedDB/keypath-exceptions.htm.ini
@@ -1,3 +1,2 @@
 [keypath-exceptions.htm]
-  type: testharness
   disabled: feature is incomplete: https://bugzilla.mozilla.org/show_bug.cgi?id=1404274
--- a/testing/web-platform/meta/IndexedDB/transaction-deactivation-timing.html.ini
+++ b/testing/web-platform/meta/IndexedDB/transaction-deactivation-timing.html.ini
@@ -1,10 +1,9 @@
 [transaction-deactivation-timing.html]
-  type: testharness
   [New transactions are not deactivated until after the microtask checkpoint]
     expected: FAIL
 
   [New transactions from microtask are still active through the microtask checkpoint]
     expected: FAIL
 
   [Deactivation of new transactions happens at end of invocation]
     expected: FAIL
--- a/testing/web-platform/meta/IndexedDB/upgrade-transaction-deactivation-timing.html.ini
+++ b/testing/web-platform/meta/IndexedDB/upgrade-transaction-deactivation-timing.html.ini
@@ -1,5 +1,4 @@
 [upgrade-transaction-deactivation-timing.html]
-  type: testharness
   [Upgrade transactions are active in upgradeneeded callback and microtasks]
     expected: FAIL
 
--- a/testing/web-platform/meta/IndexedDB/upgrade-transaction-lifecycle-user-aborted.html.ini
+++ b/testing/web-platform/meta/IndexedDB/upgrade-transaction-lifecycle-user-aborted.html.ini
@@ -1,5 +1,4 @@
 [upgrade-transaction-lifecycle-user-aborted.html]
-  type: testharness
   [in a promise microtask after abort() is called, before the transaction abort event is fired]
     expected: FAIL
 
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -17714,16 +17714,22 @@
     ]
    ],
    "uievents/keyboard/key-102fr-fr-manual.html": [
     [
      "/uievents/keyboard/key-102fr-fr-manual.html",
      {}
     ]
    ],
+   "uievents/mouse/layout_change_should_fire_mouseover-manual.html": [
+    [
+     "/uievents/mouse/layout_change_should_fire_mouseover-manual.html",
+     {}
+    ]
+   ],
    "uievents/mouse/mouseevent_move_button-manual.html": [
     [
      "/uievents/mouse/mouseevent_move_button-manual.html",
      {}
     ]
    ],
    "uievents/order-of-events/focus-events/focus-contained-manual.html": [
     [
@@ -48568,16 +48574,28 @@
       [
        "/css/CSS2/fonts/font-146-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/fonts/font-148.xht": [
+    [
+     "/css/CSS2/fonts/font-148.xht",
+     [
+      [
+       "/css/CSS2/fonts/font-148-ref.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/fonts/font-applies-to-001.xht": [
     [
      "/css/CSS2/fonts/font-applies-to-001.xht",
      [
       [
        "/css/CSS2/fonts/font-applies-to-001-ref.xht",
        "=="
       ]
@@ -50476,28 +50494,76 @@
       [
        "/css/CSS2/generated-content/after-content-display-001-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/after-inheritable-001.xht": [
+    [
+     "/css/CSS2/generated-content/after-inheritable-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/after-inheritable-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/after-inheritable-002.xht": [
+    [
+     "/css/CSS2/generated-content/after-inheritable-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/after-inheritable-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/after-location-001.xht": [
+    [
+     "/css/CSS2/generated-content/after-location-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/after-location-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/before-after-001.xht": [
     [
      "/css/CSS2/generated-content/before-after-001.xht",
      [
       [
        "/css/CSS2/reference/no-red-on-blank-page-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/before-after-002.xht": [
+    [
+     "/css/CSS2/generated-content/before-after-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/before-after-011.xht": [
     [
      "/css/CSS2/generated-content/before-after-011.xht",
      [
       [
        "/css/CSS2/generated-content/before-after-011-ref.xht",
        "=="
       ]
@@ -50836,34 +50902,970 @@
       [
        "/css/CSS2/generated-content/after-content-display-001-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/before-inheritable-001.xht": [
+    [
+     "/css/CSS2/generated-content/before-inheritable-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/after-inheritable-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/before-inheritable-002.xht": [
+    [
+     "/css/CSS2/generated-content/before-inheritable-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/after-inheritable-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/before-location-001.xht": [
+    [
+     "/css/CSS2/generated-content/before-location-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/before-location-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/bidi-generated-content-001.xht": [
+    [
+     "/css/CSS2/generated-content/bidi-generated-content-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/bidi-generated-content-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/bidi-generated-content-002.xht": [
+    [
+     "/css/CSS2/generated-content/bidi-generated-content-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/bidi-generated-content-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/content-001.xht": [
     [
      "/css/CSS2/generated-content/content-001.xht",
      [
       [
-       "/css/CSS2/reference/no-red-on-blank-page-ref.xht",
+       "/css/CSS2/generated-content/content-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-002.xht": [
+    [
+     "/css/CSS2/generated-content/content-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-003.xht": [
+    [
+     "/css/CSS2/generated-content/content-003.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-004.xht": [
+    [
+     "/css/CSS2/generated-content/content-004.xht",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square-only.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-005.xht": [
+    [
+     "/css/CSS2/generated-content/content-005.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-005-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-006.xht": [
+    [
+     "/css/CSS2/generated-content/content-006.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-006-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-007.xht": [
+    [
+     "/css/CSS2/generated-content/content-007.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-007-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-009.xht": [
+    [
+     "/css/CSS2/generated-content/content-009.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-005-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-010.xht": [
+    [
+     "/css/CSS2/generated-content/content-010.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-010-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-011.xht": [
+    [
+     "/css/CSS2/generated-content/content-011.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-011-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-012.xht": [
+    [
+     "/css/CSS2/generated-content/content-012.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-012-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-013.xht": [
+    [
+     "/css/CSS2/generated-content/content-013.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-013-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-014.xht": [
+    [
+     "/css/CSS2/generated-content/content-014.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-014-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-015.xht": [
+    [
+     "/css/CSS2/generated-content/content-015.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-015-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-016.xht": [
+    [
+     "/css/CSS2/generated-content/content-016.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-016-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-017.xht": [
+    [
+     "/css/CSS2/generated-content/content-017.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-017-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-018.xht": [
+    [
+     "/css/CSS2/generated-content/content-018.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-014-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-019.xht": [
+    [
+     "/css/CSS2/generated-content/content-019.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-015-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-020.xht": [
+    [
+     "/css/CSS2/generated-content/content-020.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-021.xht": [
+    [
+     "/css/CSS2/generated-content/content-021.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-021-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-022.xht": [
+    [
+     "/css/CSS2/generated-content/content-022.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-022-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-023.xht": [
+    [
+     "/css/CSS2/generated-content/content-023.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-023-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-025.xht": [
+    [
+     "/css/CSS2/generated-content/content-025.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-021-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-026.xht": [
+    [
+     "/css/CSS2/generated-content/content-026.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-026-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-027.xht": [
+    [
+     "/css/CSS2/generated-content/content-027.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-027-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-028.xht": [
+    [
+     "/css/CSS2/generated-content/content-028.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-028-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-029.xht": [
+    [
+     "/css/CSS2/generated-content/content-029.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-029-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-030.xht": [
+    [
+     "/css/CSS2/generated-content/content-030.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-030-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-031.xht": [
+    [
+     "/css/CSS2/generated-content/content-031.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-031-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-032.xht": [
+    [
+     "/css/CSS2/generated-content/content-032.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-032-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-033.xht": [
+    [
+     "/css/CSS2/generated-content/content-033.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-033-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-034.xht": [
+    [
+     "/css/CSS2/generated-content/content-034.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-030-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-035.xht": [
+    [
+     "/css/CSS2/generated-content/content-035.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-031-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/CSS2/generated-content/content-036.xht": [
     [
      "/css/CSS2/generated-content/content-036.xht",
      [
       [
-       "/css/CSS2/reference/no-red-on-blank-page-ref.xht",
+       "/css/CSS2/generated-content/content-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-037.xht": [
+    [
+     "/css/CSS2/generated-content/content-037.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-037-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-038.xht": [
+    [
+     "/css/CSS2/generated-content/content-038.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-039.xht": [
+    [
+     "/css/CSS2/generated-content/content-039.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-040.xht": [
+    [
+     "/css/CSS2/generated-content/content-040.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-040-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-041.xht": [
+    [
+     "/css/CSS2/generated-content/content-041.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-041-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-042.xht": [
+    [
+     "/css/CSS2/generated-content/content-042.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-042-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-043.xht": [
+    [
+     "/css/CSS2/generated-content/content-043.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-043-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-046.xht": [
+    [
+     "/css/CSS2/generated-content/content-046.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-037-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-047.xht": [
+    [
+     "/css/CSS2/generated-content/content-047.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-048.xht": [
+    [
+     "/css/CSS2/generated-content/content-048.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-048-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-050.xht": [
+    [
+     "/css/CSS2/generated-content/content-050.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-050-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-052.xht": [
+    [
+     "/css/CSS2/generated-content/content-052.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-052-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-053.xht": [
+    [
+     "/css/CSS2/generated-content/content-053.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-053-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-054.xht": [
+    [
+     "/css/CSS2/generated-content/content-054.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-056.xht": [
+    [
+     "/css/CSS2/generated-content/content-056.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-057.xht": [
+    [
+     "/css/CSS2/generated-content/content-057.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-063.xht": [
+    [
+     "/css/CSS2/generated-content/content-063.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-063-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-065.xht": [
+    [
+     "/css/CSS2/generated-content/content-065.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-053-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-067.xht": [
+    [
+     "/css/CSS2/generated-content/content-067.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-068.xht": [
+    [
+     "/css/CSS2/generated-content/content-068.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-068-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-070.xht": [
+    [
+     "/css/CSS2/generated-content/content-070.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-070-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-072.xht": [
+    [
+     "/css/CSS2/generated-content/content-072.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-072-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-073.xht": [
+    [
+     "/css/CSS2/generated-content/content-073.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-073-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-075.xht": [
+    [
+     "/css/CSS2/generated-content/content-075.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-075-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-076.xht": [
+    [
+     "/css/CSS2/generated-content/content-076.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-077.xht": [
+    [
+     "/css/CSS2/generated-content/content-077.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-041-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-080.xht": [
+    [
+     "/css/CSS2/generated-content/content-080.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-080-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-081.xht": [
+    [
+     "/css/CSS2/generated-content/content-081.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-081-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-082.xht": [
+    [
+     "/css/CSS2/generated-content/content-082.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-082-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-083.xht": [
+    [
+     "/css/CSS2/generated-content/content-083.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-083-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-085.xht": [
+    [
+     "/css/CSS2/generated-content/content-085.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-086.xht": [
+    [
+     "/css/CSS2/generated-content/content-086.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-041-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-089.xht": [
+    [
+     "/css/CSS2/generated-content/content-089.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-089-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-090.xht": [
+    [
+     "/css/CSS2/generated-content/content-090.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-090-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-091.xht": [
+    [
+     "/css/CSS2/generated-content/content-091.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-091-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-096.xht": [
+    [
+     "/css/CSS2/generated-content/content-096.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-096-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-097.xht": [
+    [
+     "/css/CSS2/generated-content/content-097.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-097-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-099.xht": [
+    [
+     "/css/CSS2/generated-content/content-099.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-041-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-100.xht": [
+    [
+     "/css/CSS2/generated-content/content-100.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-100-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-103.xht": [
+    [
+     "/css/CSS2/generated-content/content-103.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-103-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-105.xht": [
+    [
+     "/css/CSS2/generated-content/content-105.xht",
+     [
+      [
+       "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/CSS2/generated-content/content-107.xht": [
     [
@@ -50884,16 +51886,28 @@
       [
        "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/content-109.xht": [
+    [
+     "/css/CSS2/generated-content/content-109.xht",
+     [
+      [
+       "/css/reference/only_pass_parens_semicolon.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/content-110.xht": [
     [
      "/css/CSS2/generated-content/content-110.xht",
      [
       [
        "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
@@ -50920,16 +51934,28 @@
       [
        "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/content-113.xht": [
+    [
+     "/css/CSS2/generated-content/content-113.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-113-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/content-114.xht": [
     [
      "/css/CSS2/generated-content/content-114.xht",
      [
       [
        "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
@@ -51004,16 +52030,316 @@
       [
        "/css/reference/only_pass_parens_semicolon.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/content-122.xht": [
+    [
+     "/css/CSS2/generated-content/content-122.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-113-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-123.xht": [
+    [
+     "/css/CSS2/generated-content/content-123.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-126.xht": [
+    [
+     "/css/CSS2/generated-content/content-126.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-126-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-127.xht": [
+    [
+     "/css/CSS2/generated-content/content-127.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-126-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-129.xht": [
+    [
+     "/css/CSS2/generated-content/content-129.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-053-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-131.xht": [
+    [
+     "/css/CSS2/generated-content/content-131.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-132.xht": [
+    [
+     "/css/CSS2/generated-content/content-132.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-132-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-135.xht": [
+    [
+     "/css/CSS2/generated-content/content-135.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-135-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-136.xht": [
+    [
+     "/css/CSS2/generated-content/content-136.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-136-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-138.xht": [
+    [
+     "/css/CSS2/generated-content/content-138.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-141.xht": [
+    [
+     "/css/CSS2/generated-content/content-141.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-141-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-143.xht": [
+    [
+     "/css/CSS2/generated-content/content-143.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-143-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-144.xht": [
+    [
+     "/css/CSS2/generated-content/content-144.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-144-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-145.xht": [
+    [
+     "/css/CSS2/generated-content/content-145.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-091-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-146.xht": [
+    [
+     "/css/CSS2/generated-content/content-146.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-147.xht": [
+    [
+     "/css/CSS2/generated-content/content-147.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-147-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-149.xht": [
+    [
+     "/css/CSS2/generated-content/content-149.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-149-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-150.xht": [
+    [
+     "/css/CSS2/generated-content/content-150.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-150-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-152.xht": [
+    [
+     "/css/CSS2/generated-content/content-152.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-047-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-153.xht": [
+    [
+     "/css/CSS2/generated-content/content-153.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-091-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-155.xht": [
+    [
+     "/css/CSS2/generated-content/content-155.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-155-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-156.xht": [
+    [
+     "/css/CSS2/generated-content/content-156.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-156-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-157.xht": [
+    [
+     "/css/CSS2/generated-content/content-157.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-156-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-158.xht": [
+    [
+     "/css/CSS2/generated-content/content-158.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-158-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-159.xht": [
+    [
+     "/css/CSS2/generated-content/content-159.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-159-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/content-171.xht": [
     [
      "/css/CSS2/generated-content/content-171.xht",
      [
       [
        "/css/CSS2/generated-content/content-171-ref.xht",
        "=="
       ]
@@ -51076,16 +52402,64 @@
       [
        "/css/CSS2/generated-content/content-177-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/content-attr-001.xht": [
+    [
+     "/css/CSS2/generated-content/content-attr-001.xht",
+     [
+      [
+       "/css/CSS2/reference/ref-nothing-below.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-attr-case-001.html": [
+    [
+     "/css/CSS2/generated-content/content-attr-case-001.html",
+     [
+      [
+       "/css/reference/pass_if_pass_below.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-attr-case-002.xht": [
+    [
+     "/css/CSS2/generated-content/content-attr-case-002.xht",
+     [
+      [
+       "/css/CSS2/reference/no-red-on-blank-page-ref.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-auto-reset-001.xht": [
+    [
+     "/css/CSS2/generated-content/content-auto-reset-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-auto-reset-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/content-counter-000.xht": [
     [
      "/css/CSS2/generated-content/content-counter-000.xht",
      [
       [
        "/css/CSS2/generated-content/content-counter-000-ref.xht",
        "=="
       ]
@@ -51292,16 +52666,160 @@
       [
        "/css/CSS2/generated-content/content-inherit-002-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/generated-content/content-newline-001.xht": [
+    [
+     "/css/CSS2/generated-content/content-newline-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-newline-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-white-space-001.xht": [
+    [
+     "/css/CSS2/generated-content/content-white-space-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-white-space-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-white-space-002.xht": [
+    [
+     "/css/CSS2/generated-content/content-white-space-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-white-space-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-white-space-003.xht": [
+    [
+     "/css/CSS2/generated-content/content-white-space-003.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-white-space-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/content-white-space-004.xht": [
+    [
+     "/css/CSS2/generated-content/content-white-space-004.xht",
+     [
+      [
+       "/css/CSS2/generated-content/content-white-space-004-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-hidden-000.xht": [
+    [
+     "/css/CSS2/generated-content/counters-hidden-000.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-hidden-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-hidden-001.xht": [
+    [
+     "/css/CSS2/generated-content/counters-hidden-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-hidden-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-hidden-002.xht": [
+    [
+     "/css/CSS2/generated-content/counters-hidden-002.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-hidden-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-multi-000.xht": [
+    [
+     "/css/CSS2/generated-content/counters-multi-000.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-multi-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-multi-001.xht": [
+    [
+     "/css/CSS2/generated-content/counters-multi-001.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-multi-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-order-000.xht": [
+    [
+     "/css/CSS2/generated-content/counters-order-000.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-order-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/generated-content/counters-root-000.xht": [
+    [
+     "/css/CSS2/generated-content/counters-root-000.xht",
+     [
+      [
+       "/css/CSS2/generated-content/counters-root-000-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/generated-content/multiple-content-values-001.xht": [
     [
      "/css/CSS2/generated-content/multiple-content-values-001.xht",
      [
       [
        "/css/reference/pass_if_pass_below.html",
        "=="
       ]
@@ -94372,16 +95890,76 @@
       [
        "/css/CSS2/values/units-006-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/visudet/content-height-001.html": [
+    [
+     "/css/CSS2/visudet/content-height-001.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/content-height-001-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/content-height-002.html": [
+    [
+     "/css/CSS2/visudet/content-height-002.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/content-height-002-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/content-height-003.html": [
+    [
+     "/css/CSS2/visudet/content-height-003.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/content-height-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/content-height-004.html": [
+    [
+     "/css/CSS2/visudet/content-height-004.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/content-height-004-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/content-height-005.html": [
+    [
+     "/css/CSS2/visudet/content-height-005.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/content-height-005-ref.html",
+       "!="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/visudet/height-applies-to-010a.xht": [
     [
      "/css/CSS2/visudet/height-applies-to-010a.xht",
      [
       [
        "/css/CSS2/visudet/height-applies-to-010a-ref.xht",
        "=="
       ]
@@ -94432,16 +96010,88 @@
       [
        "/css/CSS2/visudet/height-percentage-004-ref.xht",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/CSS2/visudet/line-height-201.html": [
+    [
+     "/css/CSS2/visudet/line-height-201.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-201-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/line-height-202.html": [
+    [
+     "/css/CSS2/visudet/line-height-202.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-202-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/line-height-203.html": [
+    [
+     "/css/CSS2/visudet/line-height-203.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-203-ref.html",
+       "!="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/line-height-204.html": [
+    [
+     "/css/CSS2/visudet/line-height-204.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-202-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/line-height-205.html": [
+    [
+     "/css/CSS2/visudet/line-height-205.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-202-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/CSS2/visudet/line-height-206.html": [
+    [
+     "/css/CSS2/visudet/line-height-206.html",
+     [
+      [
+       "/css/CSS2/visudet/reference/line-height-206-ref.html",
+       "!="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/CSS2/visufx/clip-001.xht": [
     [
      "/css/CSS2/visufx/clip-001.xht",
      [
       [
        "/css/CSS2/reference/ref-filled-green-100px-square.xht",
        "=="
       ]
@@ -96532,16 +98182,52 @@
       [
        "/css/css-backgrounds/reference/background_clip_padding-box.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-backgrounds/background-color-body-propagation-001.html": [
+    [
+     "/css/css-backgrounds/background-color-body-propagation-001.html",
+     [
+      [
+       "/css/css-backgrounds/background-color-body-propagation-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-backgrounds/background-color-body-propagation-002.html": [
+    [
+     "/css/css-backgrounds/background-color-body-propagation-002.html",
+     [
+      [
+       "/css/css-backgrounds/background-color-body-propagation-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-backgrounds/background-color-body-propagation-003.html": [
+    [
+     "/css/css-backgrounds/background-color-body-propagation-003.html",
+     [
+      [
+       "/css/css-backgrounds/background-color-body-propagation-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-backgrounds/background-image-001.html": [
     [
      "/css/css-backgrounds/background-image-001.html",
      [
       [
        "/css/css-backgrounds/reference/background-image-001-ref.html",
        "=="
       ]
@@ -96628,16 +98314,28 @@
       [
        "/css/css-backgrounds/reference/background-image-first-letter-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-backgrounds/background-image-none-gradient-repaint.html": [
+    [
+     "/css/css-backgrounds/background-image-none-gradient-repaint.html",
+     [
+      [
+       "/css/css-backgrounds/background-clip-color-repaint-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-backgrounds/background-origin-002.html": [
     [
      "/css/css-backgrounds/background-origin-002.html",
      [
       [
        "/css/css-backgrounds/reference/background-origin-002-ref.html",
        "=="
       ]
@@ -100713,29 +102411,29 @@
      {}
     ]
    ],
    "css/css-color/currentcolor-001.html": [
     [
      "/css/css-color/currentcolor-001.html",
      [
       [
-       "/css/css-color/greentext-ref.html",
+       "/css/css-color/greensquare-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-color/currentcolor-002.html": [
     [
      "/css/css-color/currentcolor-002.html",
      [
       [
-       "/css/css-color/greentext-ref.html",
+       "/css/css-color/greensquare-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
    "css/css-color/hex-001.html": [
     [
@@ -100756,16 +102454,232 @@
       [
        "/css/css-color/greentext-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-color/hex-003.html": [
+    [
+     "/css/css-color/hex-003.html",
+     [
+      [
+       "/css/css-color/hex-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hex-004.html": [
+    [
+     "/css/css-color/hex-004.html",
+     [
+      [
+       "/css/css-color/hex-003-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-001.html": [
+    [
+     "/css/css-color/hsl-001.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-002.html": [
+    [
+     "/css/css-color/hsl-002.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-003.html": [
+    [
+     "/css/css-color/hsl-003.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-004.html": [
+    [
+     "/css/css-color/hsl-004.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-005.html": [
+    [
+     "/css/css-color/hsl-005.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-006.html": [
+    [
+     "/css/css-color/hsl-006.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-007.html": [
+    [
+     "/css/css-color/hsl-007.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsl-008.html": [
+    [
+     "/css/css-color/hsl-008.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-001.html": [
+    [
+     "/css/css-color/hsla-001.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-002.html": [
+    [
+     "/css/css-color/hsla-002.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-003.html": [
+    [
+     "/css/css-color/hsla-003.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-004.html": [
+    [
+     "/css/css-color/hsla-004.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-005.html": [
+    [
+     "/css/css-color/hsla-005.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-006.html": [
+    [
+     "/css/css-color/hsla-006.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-007.html": [
+    [
+     "/css/css-color/hsla-007.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/hsla-008.html": [
+    [
+     "/css/css-color/hsla-008.html",
+     [
+      [
+       "/css/css-color/greentext-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/lab-001.html": [
     [
      "/css/css-color/lab-001.html",
      [
       [
        "/css/css-color/greentext-ref.html",
        "=="
       ]
@@ -101152,16 +103066,76 @@
       [
        "/css/css-color/t31-color-text-a-ref.xht",
        "!="
       ]
      ],
      {}
     ]
    ],
+   "css/css-color/t32-opacity-basic-0.0-a.xht": [
+    [
+     "/css/css-color/t32-opacity-basic-0.0-a.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-basic-0.0-a-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t32-opacity-basic-1.0-a.xht": [
+    [
+     "/css/css-color/t32-opacity-basic-1.0-a.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-basic-1.0-a-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t32-opacity-clamping-0.0-b.xht": [
+    [
+     "/css/css-color/t32-opacity-clamping-0.0-b.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-basic-0.0-a-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t32-opacity-clamping-1.0-b.xht": [
+    [
+     "/css/css-color/t32-opacity-clamping-1.0-b.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-clamping-1.0-b-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t32-opacity-offscreen-b.xht": [
+    [
+     "/css/css-color/t32-opacity-offscreen-b.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-offscreen-b-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/t32-opacity-offscreen-multiple-boxes-1-c.xht": [
     [
      "/css/css-color/t32-opacity-offscreen-multiple-boxes-1-c.xht",
      [
       [
        "/css/css-color/t32-opacity-offscreen-multiple-boxes-1-c-ref.html",
        "=="
       ]
@@ -101176,16 +103150,52 @@
       [
        "/css/css-color/t32-opacity-offscreen-multiple-boxes-2-c-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-color/t32-opacity-offscreen-with-alpha-c.xht": [
+    [
+     "/css/css-color/t32-opacity-offscreen-with-alpha-c.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-offscreen-with-alpha-c-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t41-html4-keywords-a.xht": [
+    [
+     "/css/css-color/t41-html4-keywords-a.xht",
+     [
+      [
+       "/css/css-color/t41-html4-keywords-a-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t421-rgb-clip-outside-gamut-b.xht": [
+    [
+     "/css/css-color/t421-rgb-clip-outside-gamut-b.xht",
+     [
+      [
+       "/css/css-color/t421-rgb-clip-outside-gamut-b-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/t421-rgb-func-int-a.xht": [
     [
      "/css/css-color/t421-rgb-func-int-a.xht",
      [
       [
        "/css/css-color/t422-rgba-func-int-a-ref.html",
        "=="
       ]
@@ -101260,16 +103270,40 @@
       [
        "/css/css-color/t422-rgba-func-int-a-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-color/t421-rgb-values-meaning-b.xht": [
+    [
+     "/css/css-color/t421-rgb-values-meaning-b.xht",
+     [
+      [
+       "/css/css-color/t421-rgb-values-meaning-b-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
+   "css/css-color/t422-rgba-a0.0-a.xht": [
+    [
+     "/css/css-color/t422-rgba-a0.0-a.xht",
+     [
+      [
+       "/css/css-color/t32-opacity-basic-0.0-a-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/t422-rgba-a1.0-a.xht": [
     [
      "/css/css-color/t422-rgba-a1.0-a.xht",
      [
       [
        "/css/css-color/t422-rgba-a1.0-a-ref.html",
        "=="
       ]
@@ -101380,16 +103414,28 @@
       [
        "/css/css-color/t422-rgba-onscreen-multiple-boxes-c-ref.html",
        "=="
       ]
      ],
      {}
     ]
    ],
+   "css/css-color/t422-rgba-values-meaning-b.xht": [
+    [
+     "/css/css-color/t422-rgba-values-meaning-b.xht",
+     [
+      [
+       "/css/css-color/t422-rgba-values-meaning-b-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-color/t423-transparent-1-a.xht": [
     [
      "/css/css-color/t423-transparent-1-a.xht",
      [
       [
        "/css/css-color/t422-rgba-clamping-a0.0-b-ref.html",
        "=="
       ]