Merge mozilla-central to autoland a=merge on a CLOSED TREE
authorCoroiu Cristina <ccoroiu@mozilla.com>
Wed, 21 Nov 2018 23:48:40 +0200
changeset 504051 9b6242ab169a1ba89acedac1bd978661d97decce
parent 504050 6dc7299787eaa33e81f401d4ef9e8593922ed539 (current diff)
parent 504033 fbd97100c83cc07705244725a3245e6d14bbe9cf (diff)
child 504052 c18244a415389d76f0d786313d0687ab1c7ebeeb
push id10290
push userffxbld-merge
push dateMon, 03 Dec 2018 16:23:23 +0000
treeherdermozilla-beta@700bed2445e6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone65.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to autoland a=merge on a CLOSED TREE
js/src/tests/test262/built-ins/RegExp/named-groups/non-unicode-malformed.js
js/src/tests/test262/built-ins/RegExp/named-groups/unicode-malformed.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-field-delete-twice-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/expressions/class/err-method-delete-twice-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/line-terminators/7.3-11.js
js/src/tests/test262/language/line-terminators/7.3-12.js
js/src/tests/test262/language/line-terminators/7.3-13.js
js/src/tests/test262/language/line-terminators/7.3-14.js
js/src/tests/test262/language/module-code/dynamic-import/assign-expr-get-value-abrupt-throws.js
js/src/tests/test262/language/module-code/dynamic-import/browser.js
js/src/tests/test262/language/module-code/dynamic-import/catch/browser.js
js/src/tests/test262/language/module-code/dynamic-import/catch/eval-rqstd-abrupt-err-type_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/eval-rqstd-abrupt-err-uri_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-ambiguous-1_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-ambiguous-2_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-ambiguous-export_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-ambiguous_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-circular-1_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/instn-iee-err-circular-2_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-arrow-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-await-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-return-await-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-async-function-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-block-labeled-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-do-while-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-else-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-function-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-if-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/nested-while-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/catch/script-code_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/catch/shell.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-typeerror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-eval-rqstd-abrupt-urierror.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-eval-script-code-target.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-file-does-not-exist.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-instn-iee-err-ambiguous-import.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-instn-iee-err-circular.js
js/src/tests/test262/language/module-code/dynamic-import/catch/top-level-import-catch-specifier-tostring-abrupt-rejects.js
js/src/tests/test262/language/module-code/dynamic-import/dynamic-import-module_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-cls-anon.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-cls-name-meth.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-cls-named.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-cls-anon.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-cls-name-meth.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-cls-named.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-fn-anon.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-fn-named.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-gen-anon.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-gen-named.js
js/src/tests/test262/language/module-code/dynamic-import/eval-export-dflt-expr-in.js
js/src/tests/test262/language/module-code/dynamic-import/eval-rqstd-once.js
js/src/tests/test262/language/module-code/dynamic-import/eval-rqstd-once_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/eval-self-once-module.js
js/src/tests/test262/language/module-code/dynamic-import/eval-self-once-script.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-Symbol-toStringTag.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-define-own-property.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-delete-exported-init-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-delete-exported-init-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-delete-non-exported-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-delete-non-exported-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-extensible.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-nested-namespace-dflt-direct.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-nested-namespace-dflt-indirect.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-nested-namespace-props-nrml.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-own-property-str-found-init.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-own-property-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-own-property-sym.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-str-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-sym-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-get-sym-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-has-property-str-found-init.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-has-property-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-has-property-sym-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-has-property-sym-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-no-iterator.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-own-property-keys-sort.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-prevent-extensions-object.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-prevent-extensions-reflect.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-prop-descs.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-prototype.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-prototype-of-null.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-prototype-of.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-same-values-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-same-values-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/await-ns-set-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/browser.js
js/src/tests/test262/language/module-code/dynamic-import/ns/define-own-property_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/empty_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-dflt-skip-named-end_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-dflt-skip-named_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-dflt-skip-prod-end_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-dflt-skip-prod_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-props-nrml-1_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-props-nrml-2_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/get-nested-namespace-props-nrml-3_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/module-code_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/own-keys-sort_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-Symbol-toStringTag.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-define-own-property.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-delete-exported-init-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-delete-exported-init-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-delete-non-exported-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-delete-non-exported-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-extensible.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-nested-namespace-dflt-direct.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-nested-namespace-dflt-indirect.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-nested-namespace-props-nrml.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-own-property-str-found-init.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-own-property-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-own-property-sym.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-str-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-sym-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-get-sym-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-has-property-str-found-init.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-has-property-str-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-has-property-sym-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-has-property-sym-not-found.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-no-iterator.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-own-property-keys-sort.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-prevent-extensions-object.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-prevent-extensions-reflect.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-prop-descs.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-prototype.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-prototype-of-null.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-prototype-of.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-same-values-no-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-same-values-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/promise-then-ns-set-strict-strict.js
js/src/tests/test262/language/module-code/dynamic-import/ns/shell.js
js/src/tests/test262/language/module-code/dynamic-import/returns-promise.js
js/src/tests/test262/language/module-code/dynamic-import/shell.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/browser.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/browser.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-assignment-expression-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-arrow-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-await-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-await-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-await-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-return-await-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-return-await-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-async-function-return-await-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-labeled-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-labeled-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-labeled-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-block-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-do-while-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-do-while-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-do-while-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-braceless-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-braceless-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-braceless-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-else-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-return-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-return-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-function-return-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-braceless-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-braceless-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-braceless-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-if-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-while-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-while-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-while-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-with-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-with-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/nested-with-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/shell.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/top-level-assignment-expr-not-optional.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/top-level-not-extensible-args.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/invalid/top-level-not-extensible-no-trailing-comma.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/shell.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/browser.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/empty_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-assignment-expression-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-assignment-expression-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-assignment-expression-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-arrow-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-await-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-await-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-await-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-return-await-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-return-await-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-return-await-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-async-function-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-labeled-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-labeled-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-labeled-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-block-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-do-while-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-do-while-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-do-while-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-braceless-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-braceless-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-braceless-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-else-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-return-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-return-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-return-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-function-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-braceless-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-braceless-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-braceless-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-if-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-while-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-while-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-while-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-with-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-with-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/nested-with-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/shell.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/top-level-empty-str-is-valid-assign-expr.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/top-level-nested-imports.js
js/src/tests/test262/language/module-code/dynamic-import/syntax/valid/top-level-script-code-valid.js
js/src/tests/test262/language/module-code/dynamic-import/usage/browser.js
js/src/tests/test262/language/module-code/dynamic-import/usage/dynamic-import-module_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/usage/eval-gtbndng-indirect-update-dflt_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/usage/eval-gtbndng-indirect-update_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/usage/module-code_FIXTURE.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-assignment-expression-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-arrow-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-await-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-return-await-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-async-function-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-block-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-do-while-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-else-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-function-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-braceless-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-if-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/nested-while-import-then-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/shell.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/syntax-nested-block-labeled-specifier-tostring.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update-dflt.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-eval-gtbndng-indirect-update.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-eval-script-code-host-resolves-module-code.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-is-call-expression-square-brackets.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-returns-thenable.js
js/src/tests/test262/language/module-code/dynamic-import/usage/top-level-import-then-specifier-tostring.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-field-delete-twice-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-call-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-call-expression-privatename-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-async-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-async-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-gen-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-member-expression-private-method-strict.js
js/src/tests/test262/language/statements/class/err-method-delete-twice-covered-err-delete-member-expression-privatename-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-1-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-12-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-12.js
js/src/tests/test262/language/statements/variable/12.2.1-13-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-14-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-15-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-23-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-24-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-25-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-26-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-27-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-28-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-29-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-30-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-31-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-32-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-33-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-34-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-35-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-36-s-strict.js
js/src/tests/test262/language/statements/variable/12.2.1-37-s-strict.js
testing/web-platform/meta/css/selectors/invalidation/matches.html.ini
testing/web-platform/meta/css/selectors/matches-nested.html.ini
testing/web-platform/meta/css/selectors/matches-specificity.html.ini
testing/web-platform/meta/fetch/api/basic/request-headers.any.js.ini
testing/web-platform/meta/fetch/api/cors/cors-cookies-redirect.any.js.ini
testing/web-platform/meta/fetch/api/cors/cors-redirect.any.js.ini
testing/web-platform/meta/fetch/api/redirect/redirect-origin.any.js.ini
testing/web-platform/meta/infrastructure/testdriver/actions/elementPosition.html.ini
testing/web-platform/meta/infrastructure/testdriver/actions/eventOrder.html.ini
testing/web-platform/meta/webrtc/RTCQuicStream.https.html.ini
testing/web-platform/meta/webrtc/RTCQuicTransport.https.html.ini
testing/web-platform/tests/css/selectors/invalidation/matches.html
testing/web-platform/tests/css/selectors/matches-nested.html
testing/web-platform/tests/css/selectors/matches-specificity.html
testing/web-platform/tests/pointerevents/pointerevent_pointermove.html
testing/web-platform/tests/webrtc/RTCQuicStream-helper.js
testing/web-platform/tests/webrtc/RTCQuicStream.https.html
testing/web-platform/tests/webrtc/RTCQuicTransport-helper.js
testing/web-platform/tests/webrtc/RTCQuicTransport.https.html
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_1/bootstrap.js
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_1/install.rdf
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_1/test.txt
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_2/bootstrap.js
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_2/install.rdf
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/bootstrap_2/test.txt
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/long_63_hash.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/long_63_plain.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/long_64_hash.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/long_64_plain.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/long_65_hash.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/preliminary_bootstrap_2.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/privileged_bootstrap_2.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_1.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_2.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_badid_2.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/signed_bootstrap_sha256_1.xpi
toolkit/mozapps/extensions/test/xpcshell/data/signing_checks/unsigned_bootstrap_2.xpi
--- a/accessible/xul/XULElementAccessibles.cpp
+++ b/accessible/xul/XULElementAccessibles.cpp
@@ -89,19 +89,21 @@ Relation
 XULLabelAccessible::RelationByType(RelationType aType) const
 {
   Relation rel = HyperTextAccessibleWrap::RelationByType(aType);
 
   // The label for xul:groupbox is generated from the first xul:label
   if (aType == RelationType::LABEL_FOR) {
     Accessible* parent = Parent();
     if (parent && parent->Role() == roles::GROUPING &&
-        parent->GetContent()->IsXULElement(nsGkAtoms::groupbox) &&
         parent->GetChildAt(0) == this) {
-      rel.AppendTarget(parent);
+      nsIContent* parentContent = parent->GetContent();
+      if (parentContent && parentContent->IsXULElement(nsGkAtoms::groupbox)) {
+        rel.AppendTarget(parent);
+      }
     }
   }
 
   return rel;
 }
 
 void
 XULLabelAccessible::UpdateLabelValue(const nsString& aValue)
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -1887,17 +1887,17 @@
           return;
 
         this._tabDropIndicator.collapsed = true;
         event.stopPropagation();
       ]]></handler>
     </handlers>
   </binding>
 
-  <binding id="tabbrowser-tab" display="xul:hbox"
+  <binding id="tabbrowser-tab"
            extends="chrome://global/content/bindings/tabbox.xml#tab">
     <content context="tabContextMenu">
       <xul:stack class="tab-stack" flex="1">
         <xul:vbox xbl:inherits="selected=visuallyselected,fadein"
                   class="tab-background">
           <xul:hbox xbl:inherits="selected=visuallyselected,multiselected,before-multiselected"
                     class="tab-line"/>
           <xul:spacer flex="1"/>
--- a/devtools/client/preferences/devtools-client.js
+++ b/devtools/client/preferences/devtools-client.js
@@ -49,18 +49,23 @@ pref("devtools.inspector.showUserAgentSt
 // Show all native anonymous content
 pref("devtools.inspector.showAllAnonymousContent", false);
 // Show user agent shadow roots
 pref("devtools.inspector.showUserAgentShadowRoots", false);
 // Enable the CSS shapes highlighter
 pref("devtools.inspector.shapesHighlighter.enabled", true);
 // Enable the font highlight-on-hover feature
 pref("devtools.inspector.fonthighlighter.enabled", true);
+
 // Enable tracking of style changes and the Changes panel in the Inspector
+#if defined(NIGHTLY_BUILD)
+pref("devtools.inspector.changes.enabled", true);
+#else
 pref("devtools.inspector.changes.enabled", false);
+#endif
 
 // Flexbox preferences
 // Enable the Flexbox highlighter and inspector panel in Nightly and DevEdition
 #if defined(NIGHTLY_BUILD) || defined(MOZ_DEV_EDITION)
 pref("devtools.inspector.flexboxHighlighter.enabled", true);
 pref("devtools.flexboxinspector.enabled", true);
 #else
 pref("devtools.inspector.flexboxHighlighter.enabled", false);
--- a/devtools/server/actors/thread.js
+++ b/devtools/server/actors/thread.js
@@ -559,18 +559,22 @@ const ThreadActor = ActorClassWithSpec(t
         if (parentFrame && parentFrame.script) {
           // We can't use the completion value in stepping hooks if we're
           // replaying, as we can't use its contents after resuming.
           const ncompletion = thread.dbg.replaying ? null : completion;
           const { onStep, onPop } = thread._makeSteppingHooks(
             originalLocation, "next", false, ncompletion
           );
           if (thread.dbg.replaying) {
+            const parentGeneratedLocation = thread.sources.getFrameLocation(parentFrame);
+            const parentOriginalLocation = thread.unsafeSynchronize(
+              thread.sources.getOriginalLocation(parentGeneratedLocation)
+            );
             const offsets =
-              thread._findReplayingStepOffsets(originalLocation, parentFrame,
+              thread._findReplayingStepOffsets(parentOriginalLocation, parentFrame,
                                                /* rewinding = */ false);
             parentFrame.setReplayingOnStep(onStep, offsets);
           } else {
             parentFrame.onStep = onStep;
           }
           // We need the onPop alongside the onStep because it is possible that
           // the parent frame won't have any steppable offsets, and we want to
           // make sure that we always pause in the parent _somewhere_.
--- a/dom/base/nsContentPermissionHelper.cpp
+++ b/dom/base/nsContentPermissionHelper.cpp
@@ -719,16 +719,63 @@ ContentPermissionRequestBase::RequestDel
   default:
     r = new RequestPromptEvent(this, mWindow);
     break;
   }
 
   aTarget->Dispatch(r.forget());
 }
 
+nsresult
+TranslateChoices(JS::HandleValue aChoices,
+                 const nsTArray<PermissionRequest>& aPermissionRequests,
+                 nsTArray<PermissionChoice>& aTranslatedChoices)
+{
+  if (aChoices.isNullOrUndefined()) {
+    // No choice is specified.
+  } else if (aChoices.isObject()) {
+    // Iterate through all permission types.
+    for (uint32_t i = 0; i < aPermissionRequests.Length(); ++i) {
+      nsCString type = aPermissionRequests[i].type();
+
+      JS::Rooted<JSObject*> obj(RootingCx(), &aChoices.toObject());
+      obj = CheckedUnwrap(obj);
+      if (!obj) {
+        return NS_ERROR_FAILURE;
+      }
+
+      AutoJSAPI jsapi;
+      jsapi.Init();
+
+      JSContext* cx = jsapi.cx();
+      JSAutoRealm ar(cx, obj);
+
+      JS::Rooted<JS::Value> val(cx);
+
+      if (!JS_GetProperty(cx, obj, type.BeginReading(), &val) ||
+          !val.isString()) {
+        // no setting for the permission type, clear exception and skip it
+        jsapi.ClearException();
+      } else {
+        nsAutoJSString choice;
+        if (!choice.init(cx, val)) {
+          jsapi.ClearException();
+          return NS_ERROR_FAILURE;
+        }
+        aTranslatedChoices.AppendElement(PermissionChoice(type, choice));
+      }
+    }
+  } else {
+    MOZ_ASSERT(false, "SelectedChoices should be undefined or an JS object");
+    return NS_ERROR_FAILURE;
+  }
+
+  return NS_OK;
+}
+
 } // namespace dom
 } // namespace mozilla
 
 NS_IMPL_ISUPPORTS(nsContentPermissionRequestProxy::nsContentPermissionRequesterProxy,
                   nsIContentPermissionRequester)
 
 NS_IMETHODIMP
 nsContentPermissionRequestProxy::nsContentPermissionRequesterProxy
@@ -778,19 +825,17 @@ nsContentPermissionRequestProxy::nsConte
 }
 
 nsContentPermissionRequestProxy::nsContentPermissionRequestProxy(ContentPermissionRequestParent* parent)
   : mParent(parent)
 {
     NS_ASSERTION(mParent, "null parent");
 }
 
-nsContentPermissionRequestProxy::~nsContentPermissionRequestProxy()
-{
-}
+nsContentPermissionRequestProxy::~nsContentPermissionRequestProxy() = default;
 
 nsresult
 nsContentPermissionRequestProxy::Init(const nsTArray<PermissionRequest>& requests)
 {
   mPermissionRequests = requests;
   mRequester = new nsContentPermissionRequesterProxy(mParent);
 
   nsCOMPtr<nsIContentPermissionPrompt> prompt = do_GetService(NS_CONTENT_PERMISSION_PROMPT_CONTRACTID);
@@ -906,53 +951,19 @@ nsContentPermissionRequestProxy::Allow(J
 
   // Don't send out the delete message when the managing protocol (PBrowser) is
   // being destroyed and PContentPermissionRequest will soon be.
   if (mParent->IsBeingDestroyed()) {
     return NS_ERROR_FAILURE;
   }
 
   nsTArray<PermissionChoice> choices;
-  if (aChoices.isNullOrUndefined()) {
-    // No choice is specified.
-  } else if (aChoices.isObject()) {
-    // Iterate through all permission types.
-    for (uint32_t i = 0; i < mPermissionRequests.Length(); ++i) {
-      nsCString type = mPermissionRequests[i].type();
-
-      JS::Rooted<JSObject*> obj(RootingCx(), &aChoices.toObject());
-      obj = CheckedUnwrap(obj);
-      if (!obj) {
-        return NS_ERROR_FAILURE;
-      }
-
-      AutoJSAPI jsapi;
-      jsapi.Init();
-
-      JSContext* cx = jsapi.cx();
-      JSAutoRealm ar(cx, obj);
-
-      JS::Rooted<JS::Value> val(cx);
-
-      if (!JS_GetProperty(cx, obj, type.BeginReading(), &val) ||
-          !val.isString()) {
-        // no setting for the permission type, clear exception and skip it
-        jsapi.ClearException();
-      } else {
-        nsAutoJSString choice;
-        if (!choice.init(cx, val)) {
-          jsapi.ClearException();
-          return NS_ERROR_FAILURE;
-        }
-        choices.AppendElement(PermissionChoice(type, choice));
-      }
-    }
-  } else {
-    MOZ_ASSERT(false, "SelectedChoices should be undefined or an JS object");
-    return NS_ERROR_FAILURE;
+  nsresult rv = TranslateChoices(aChoices, mPermissionRequests, choices);
+  if (NS_FAILED(rv)) {
+    return rv;
   }
 
   Unused << mParent->SendNotifyResult(true, choices);
   return NS_OK;
 }
 
 void
 nsContentPermissionRequestProxy::NotifyVisibility(const bool& aIsVisible)
--- a/dom/base/nsContentPermissionHelper.h
+++ b/dom/base/nsContentPermissionHelper.h
@@ -108,16 +108,21 @@ public:
 
 private:
   virtual ~nsContentPermissionRequester();
 
   nsWeakPtr mWindow;
   RefPtr<VisibilityChangeListener> mListener;
 };
 
+nsresult
+TranslateChoices(JS::HandleValue aChoices,
+                 const nsTArray<PermissionRequest>& aPermissionRequests,
+                 nsTArray<PermissionChoice>& aTranslatedChoices);
+
 class ContentPermissionRequestBase : public nsIContentPermissionRequest
 {
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_CLASS(ContentPermissionRequestBase)
 
   NS_IMETHOD GetTypes(nsIArray **aTypes) override;
   NS_IMETHOD GetPrincipal(nsIPrincipal **aPrincipal) override;
--- a/dom/fetch/FetchDriver.cpp
+++ b/dom/fetch/FetchDriver.cpp
@@ -1472,17 +1472,19 @@ FetchDriver::SetRequestHeaders(nsIHttpCh
   if (!hasAccept) {
     DebugOnly<nsresult> rv =
       aChannel->SetRequestHeader(NS_LITERAL_CSTRING("accept"),
                                  NS_LITERAL_CSTRING("*/*"),
                                  false /* merge */);
     MOZ_ASSERT(NS_SUCCEEDED(rv));
   }
 
-  if (mRequest->ForceOriginHeader()) {
+  nsAutoCString method;
+  mRequest->GetMethod(method);
+  if (!method.EqualsLiteral("GET") && !method.EqualsLiteral("HEAD")) {
     nsAutoString origin;
     if (NS_SUCCEEDED(nsContentUtils::GetUTFOrigin(mPrincipal, origin))) {
       DebugOnly<nsresult> rv =
         aChannel->SetRequestHeader(nsDependentCString(net::nsHttp::Origin),
                                    NS_ConvertUTF16toUTF8(origin),
                                    false /* merge */);
       MOZ_ASSERT(NS_SUCCEEDED(rv));
     }
--- a/dom/fetch/InternalRequest.cpp
+++ b/dom/fetch/InternalRequest.cpp
@@ -26,17 +26,16 @@ InternalRequest::GetRequestConstructorCo
   MOZ_RELEASE_ASSERT(!mURLList.IsEmpty(), "Internal Request's urlList should not be empty when copied from constructor.");
   RefPtr<InternalRequest> copy = new InternalRequest(mURLList.LastElement(),
                                                      mFragment);
   copy->SetMethod(mMethod);
   copy->mHeaders = new InternalHeaders(*mHeaders);
   copy->SetUnsafeRequest();
   copy->mBodyStream = mBodyStream;
   copy->mBodyLength = mBodyLength;
-  copy->mForceOriginHeader = true;
   // The "client" is not stored in our implementation. Fetch API users should
   // use the appropriate window/document/principal and other Gecko security
   // mechanisms as appropriate.
   copy->mSameOriginDataURL = true;
   copy->mPreserveContentCodings = true;
   copy->mReferrer = mReferrer;
   copy->mReferrerPolicy = mReferrerPolicy;
   copy->mEnvironmentReferrerPolicy = mEnvironmentReferrerPolicy;
@@ -90,17 +89,16 @@ InternalRequest::InternalRequest(const n
   , mEnvironmentReferrerPolicy(net::RP_Unset)
   , mMode(RequestMode::No_cors)
   , mCredentialsMode(RequestCredentials::Omit)
   , mResponseTainting(LoadTainting::Basic)
   , mCacheMode(RequestCache::Default)
   , mRedirectMode(RequestRedirect::Follow)
   , mMozErrors(false)
   , mAuthenticationFlag(false)
-  , mForceOriginHeader(false)
   , mPreserveContentCodings(false)
     // FIXME(nsm): This should be false by default, but will lead to the
     // algorithm never loading data: URLs right now. See Bug 1018872 about
     // how certain contexts will override it to set it to true. Fetch
     // specification does not handle this yet.
   , mSameOriginDataURL(true)
   , mSkipServiceWorker(false)
   , mSynchronous(false)
@@ -132,17 +130,16 @@ InternalRequest::InternalRequest(const n
   , mMode(aMode)
   , mCredentialsMode(aRequestCredentials)
   , mResponseTainting(LoadTainting::Basic)
   , mCacheMode(aCacheMode)
   , mRedirectMode(aRequestRedirect)
   , mIntegrity(aIntegrity)
   , mMozErrors(false)
   , mAuthenticationFlag(false)
-  , mForceOriginHeader(false)
   , mPreserveContentCodings(false)
     // FIXME See the above comment in the default constructor.
   , mSameOriginDataURL(true)
   , mSkipServiceWorker(false)
   , mSynchronous(false)
   , mUnsafeRequest(false)
   , mUseURLCredentials(false)
 {
@@ -162,17 +159,16 @@ InternalRequest::InternalRequest(const I
   , mCredentialsMode(aOther.mCredentialsMode)
   , mResponseTainting(aOther.mResponseTainting)
   , mCacheMode(aOther.mCacheMode)
   , mRedirectMode(aOther.mRedirectMode)
   , mIntegrity(aOther.mIntegrity)
   , mMozErrors(aOther.mMozErrors)
   , mFragment(aOther.mFragment)
   , mAuthenticationFlag(aOther.mAuthenticationFlag)
-  , mForceOriginHeader(aOther.mForceOriginHeader)
   , mPreserveContentCodings(aOther.mPreserveContentCodings)
   , mSameOriginDataURL(aOther.mSameOriginDataURL)
   , mSkipServiceWorker(aOther.mSkipServiceWorker)
   , mSynchronous(aOther.mSynchronous)
   , mUnsafeRequest(aOther.mUnsafeRequest)
   , mUseURLCredentials(aOther.mUseURLCredentials)
   , mCreatedByFetchEvent(aOther.mCreatedByFetchEvent)
   , mContentPolicyTypeOverridden(aOther.mContentPolicyTypeOverridden)
--- a/dom/fetch/InternalRequest.h
+++ b/dom/fetch/InternalRequest.h
@@ -446,22 +446,16 @@ public:
 
   InternalHeaders*
   Headers()
   {
     return mHeaders;
   }
 
   bool
-  ForceOriginHeader()
-  {
-    return mForceOriginHeader;
-  }
-
-  bool
   SameOriginDataURL() const
   {
     return mSameOriginDataURL;
   }
 
   void
   UnsetSameOriginDataURL()
   {
@@ -645,17 +639,16 @@ private:
   RequestCredentials mCredentialsMode;
   MOZ_INIT_OUTSIDE_CTOR LoadTainting mResponseTainting;
   RequestCache mCacheMode;
   RequestRedirect mRedirectMode;
   nsString mIntegrity;
   bool mMozErrors;
   nsCString mFragment;
   MOZ_INIT_OUTSIDE_CTOR bool mAuthenticationFlag;
-  MOZ_INIT_OUTSIDE_CTOR bool mForceOriginHeader;
   MOZ_INIT_OUTSIDE_CTOR bool mPreserveContentCodings;
   MOZ_INIT_OUTSIDE_CTOR bool mSameOriginDataURL;
   MOZ_INIT_OUTSIDE_CTOR bool mSkipServiceWorker;
   MOZ_INIT_OUTSIDE_CTOR bool mSynchronous;
   MOZ_INIT_OUTSIDE_CTOR bool mUnsafeRequest;
   MOZ_INIT_OUTSIDE_CTOR bool mUseURLCredentials;
   // This is only set when a Request object is created by a fetch event.  We
   // use it to check if Service Workers are simply fetching intercepted Request
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -63,17 +63,17 @@ skip-if = os == 'mac' || os == 'win' || 
 [test_getUserMedia_audioConstraints_concurrentStreams.html]
 skip-if = os == 'mac' || os == 'win' || toolkit == 'android' # Bug 1404995, no loopback devices on some platforms
 [test_getUserMedia_basicAudio_loopback.html]
 skip-if = os == 'mac' || os == 'win' || toolkit == 'android' # Bug 1404995, no loopback devices on some platforms
 [test_getUserMedia_basicAudio.html]
 [test_getUserMedia_basicVideo.html]
 [test_getUserMedia_basicVideo_playAfterLoadedmetadata.html]
 [test_getUserMedia_basicScreenshare.html]
-skip-if = toolkit == 'android' # no screenshare on android
+skip-if = toolkit == 'android' || (os == 'win' && webrender) # no screenshare on android, see bug 1504162 for webrender on windows
 [test_getUserMedia_basicTabshare.html]
 skip-if = toolkit == 'android' # no windowshare on android
 [test_getUserMedia_basicWindowshare.html]
 skip-if = toolkit == 'android' # no windowshare on android
 [test_getUserMedia_basicVideoAudio.html]
 [test_getUserMedia_bug1223696.html]
 [test_getUserMedia_constraints.html]
 [test_getUserMedia_callbacks.html]
--- a/dom/script/ScriptLoader.cpp
+++ b/dom/script/ScriptLoader.cpp
@@ -2431,20 +2431,16 @@ ScriptLoader::EvaluateScript(ScriptLoadR
                                               aRequest->ScriptBinASTData().begin(),
                                               aRequest->ScriptBinASTData().length(),
                                               &script);
               } else {
                 MOZ_ASSERT(aRequest->IsTextSource());
                 auto srcBuf = GetScriptSource(cx, aRequest);
 
                 if (srcBuf) {
-                  if (recordreplay::IsRecordingOrReplaying()) {
-                    recordreplay::NoteContentParse16(this, options.filename(), "application/javascript",
-                                                     srcBuf->get(), srcBuf->length());
-                  }
                   rv = exec.CompileAndExec(options, *srcBuf, &script);
                 } else {
                   rv = NS_ERROR_OUT_OF_MEMORY;
                 }
               }
             }
           }
 
--- a/gfx/2d/2D.h
+++ b/gfx/2d/2D.h
@@ -398,17 +398,18 @@ public:
 
   /**
    * This function will return true if the surface type matches that of a
    * DataSourceSurface and if GetDataSurface will return the same object.
    */
   bool IsDataSourceSurface() const {
     SurfaceType type = GetType();
     return type == SurfaceType::DATA ||
-           type == SurfaceType::DATA_SHARED;
+           type == SurfaceType::DATA_SHARED ||
+           type == SurfaceType::DATA_RECYCLING_SHARED;
   }
 
   /**
    * This function will get a DataSourceSurface for this surface, a
    * DataSourceSurface's data can be accessed directly.
    */
   virtual already_AddRefed<DataSourceSurface> GetDataSurface() = 0;
 
--- a/gfx/2d/Types.h
+++ b/gfx/2d/Types.h
@@ -28,17 +28,18 @@ enum class SurfaceType : int8_t {
   COREGRAPHICS_IMAGE, /* Surface wrapping a CoreGraphics Image */
   COREGRAPHICS_CGCONTEXT, /* Surface wrapping a CG context */
   SKIA, /* Surface wrapping a Skia bitmap */
   DUAL_DT, /* Snapshot of a dual drawtarget */
   D2D1_1_IMAGE, /* A D2D 1.1 ID2D1Image SourceSurface */
   RECORDING, /* Surface used for recording */
   TILED, /* Surface from a tiled DrawTarget */
   DATA_SHARED, /* Data surface using shared memory */
-  CAPTURE /* Data from a DrawTargetCapture */
+  CAPTURE, /* Data from a DrawTargetCapture */
+  DATA_RECYCLING_SHARED /* Data surface using shared memory */
 };
 
 enum class SurfaceFormat : int8_t {
   // The following values are named to reflect layout of colors in memory, from
   // lowest byte to highest byte. The 32-bit value layout depends on machine
   // endianness.
   //               in-memory            32-bit LE value   32-bit BE value
   B8G8R8A8,     // [BB, GG, RR, AA]     0xAARRGGBB        0xBBGGRRAA
--- a/gfx/layers/ImageContainer.cpp
+++ b/gfx/layers/ImageContainer.cpp
@@ -240,16 +240,19 @@ ImageContainer::~ImageContainer()
   if (mNotifyCompositeListener) {
     mNotifyCompositeListener->ClearImageContainer();
   }
   if (mAsyncContainerHandle) {
     if (RefPtr<ImageBridgeChild> imageBridge = ImageBridgeChild::GetSingleton()) {
       imageBridge->ForgetImageContainer(mAsyncContainerHandle);
     }
   }
+  if (mSharedAnimation) {
+    mSharedAnimation->Destroy();
+  }
 }
 
 RefPtr<PlanarYCbCrImage>
 ImageContainer::CreatePlanarYCbCrImage()
 {
   RecursiveMutexAutoLock lock(mRecursiveMutex);
   EnsureImageClient();
   if (mImageClient && mImageClient->AsImageClientSingle()) {
--- a/gfx/layers/ImageContainer.h
+++ b/gfx/layers/ImageContainer.h
@@ -704,17 +704,17 @@ private:
   // sucessfully created with ENABLE_ASYNC, or points to null otherwise.
   // 'unsuccessful' in this case only means that the ImageClient could not
   // be created, most likely because off-main-thread compositing is not enabled.
   // In this case the ImageContainer is perfectly usable, but it will forward
   // frames to the compositor through transactions in the main thread rather than
   // asynchronusly using the ImageBridge IPDL protocol.
   RefPtr<ImageClient> mImageClient;
 
-  nsAutoPtr<SharedSurfacesAnimation> mSharedAnimation;
+  RefPtr<SharedSurfacesAnimation> mSharedAnimation;
 
   bool mIsAsync;
   CompositableHandle mAsyncContainerHandle;
 
   // ProducerID for last current image(s)
   ProducerID mCurrentProducerID;
 
   RefPtr<ImageContainerListener> mNotifyCompositeListener;
--- a/gfx/layers/ipc/PWebRenderBridge.ipdl
+++ b/gfx/layers/ipc/PWebRenderBridge.ipdl
@@ -18,16 +18,17 @@ using mozilla::layers::APZTestData from 
 using mozilla::layers::ScrollUpdatesMap from "FrameMetrics.h";
 using struct mozilla::layers::ScrollableLayerGuid from "mozilla/layers/ScrollableLayerGuid.h";
 using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h";
 using struct mozilla::layers::TextureInfo from "mozilla/layers/CompositorTypes.h";
 using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h";
 using mozilla::wr::BuiltDisplayListDescriptor from "mozilla/webrender/webrender_ffi.h";
 using mozilla::wr::IdNamespace from "mozilla/webrender/WebRenderTypes.h";
 using mozilla::wr::MaybeIdNamespace from "mozilla/webrender/WebRenderTypes.h";
+using mozilla::wr::ExternalImageKeyPair from "mozilla/webrender/WebRenderTypes.h";
 using mozilla::layers::WebRenderScrollData from "mozilla/layers/WebRenderScrollData.h";
 using mozilla::layers::FocusTarget from "mozilla/layers/FocusTarget.h";
 using mozilla::layers::LayersObserverEpoch from "mozilla/layers/LayersTypes.h";
 using mozilla::layers::TransactionId from "mozilla/layers/LayersTypes.h";
 
 namespace mozilla {
 namespace layers {
 
@@ -79,13 +80,14 @@ parent:
   sync SetAsyncZoom(ViewID scrollId, float zoom);
   async FlushApzRepaints();
   sync GetAPZTestData() returns (APZTestData data);
 
   async Shutdown();
   sync ShutdownSync();
 child:
   async WrUpdated(IdNamespace aNewIdNamespace, TextureFactoryIdentifier textureFactoryIdentifier);
+  async WrReleasedImages(ExternalImageKeyPair[] pairs);
   async __delete__();
 };
 
 } // layers
 } // mozilla
--- a/gfx/layers/ipc/SharedSurfacesChild.cpp
+++ b/gfx/layers/ipc/SharedSurfacesChild.cpp
@@ -3,16 +3,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "SharedSurfacesChild.h"
 #include "SharedSurfacesParent.h"
 #include "CompositorManagerChild.h"
 #include "mozilla/gfx/gfxVars.h"
+#include "mozilla/image/RecyclingSourceSurface.h"
 #include "mozilla/layers/SourceSurfaceSharedData.h"
 #include "mozilla/layers/WebRenderBridgeChild.h"
 #include "mozilla/layers/WebRenderLayerManager.h"
 #include "mozilla/SystemGroup.h"        // for SystemGroup
 
 namespace mozilla {
 namespace layers {
 
@@ -151,16 +152,34 @@ SharedSurfacesChild::SharedUserData::Upd
     ImageKeyData data(aManager, key);
     mKeys.AppendElement(std::move(data));
     aResources.AddExternalImage(mId, key);
   }
 
   return key;
 }
 
+/* static */ SourceSurfaceSharedData*
+SharedSurfacesChild::AsSourceSurfaceSharedData(SourceSurface* aSurface)
+{
+  MOZ_ASSERT(aSurface);
+  switch (aSurface->GetType()) {
+    case SurfaceType::DATA_SHARED:
+      return static_cast<SourceSurfaceSharedData*>(aSurface);
+    case SurfaceType::DATA_RECYCLING_SHARED: {
+      auto recycleSurface =
+        static_cast<image::RecyclingSourceSurface*>(aSurface);
+      auto childSurface = recycleSurface->GetChildSurface();
+      return static_cast<SourceSurfaceSharedData*>(childSurface);
+    }
+    default:
+      return nullptr;
+  }
+}
+
 /* static */ void
 SharedSurfacesChild::DestroySharedUserData(void* aClosure)
 {
   MOZ_ASSERT(aClosure);
   auto data = static_cast<SharedUserData*>(aClosure);
   delete data;
 }
 
@@ -333,44 +352,44 @@ SharedSurfacesChild::Share(ImageContaine
     return NS_ERROR_NOT_AVAILABLE;
   }
 
   RefPtr<gfx::SourceSurface> surface = images[0].mImage->GetAsSourceSurface();
   if (!surface) {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
-  if (surface->GetType() != SurfaceType::DATA_SHARED) {
+  auto sharedSurface = AsSourceSurfaceSharedData(surface);
+  if (!sharedSurface) {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
-  auto sharedSurface = static_cast<SourceSurfaceSharedData*>(surface.get());
   SharedSurfacesAnimation* anim = aContainer->GetSharedSurfacesAnimation();
   if (anim) {
-    return anim->UpdateKey(sharedSurface, aManager, aResources, aKey);
+    return anim->UpdateKey(surface, sharedSurface, aManager, aResources, aKey);
   }
 
   return Share(sharedSurface, aManager, aResources, aKey);
 }
 
 /* static */ nsresult
 SharedSurfacesChild::Share(SourceSurface* aSurface,
                            wr::ExternalImageId& aId)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(aSurface);
 
-  if (aSurface->GetType() != SurfaceType::DATA_SHARED) {
+  auto sharedSurface = AsSourceSurfaceSharedData(aSurface);
+  if (!sharedSurface) {
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
   // The external image ID does not change with the invalidation counter. The
   // caller of this should be aware of the invalidations of the surface through
   // another mechanism (e.g. imgRequestProxy listener notifications).
-  auto sharedSurface = static_cast<SourceSurfaceSharedData*>(aSurface);
   SharedUserData* data = nullptr;
   nsresult rv = ShareInternal(sharedSurface, &data);
   if (NS_SUCCEEDED(rv)) {
     MOZ_ASSERT(data);
     aId = data->Id();
   }
 
   return rv;
@@ -438,84 +457,242 @@ SharedSurfacesChild::UpdateAnimation(Ima
                                      const IntRect& aDirtyRect)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(aContainer);
   MOZ_ASSERT(!aContainer->IsAsync());
   MOZ_ASSERT(aSurface);
 
   // If we aren't using shared surfaces, then is nothing to do.
-  if (aSurface->GetType() != SurfaceType::DATA_SHARED) {
+  auto sharedSurface = SharedSurfacesChild::AsSourceSurfaceSharedData(aSurface);
+  if (!sharedSurface) {
     MOZ_ASSERT(!aContainer->GetSharedSurfacesAnimation());
     return NS_ERROR_NOT_IMPLEMENTED;
   }
 
   SharedSurfacesAnimation* anim =
     aContainer->EnsureSharedSurfacesAnimation();
   MOZ_ASSERT(anim);
 
-  auto sharedSurface = static_cast<SourceSurfaceSharedData*>(aSurface);
-  return anim->SetCurrentFrame(sharedSurface, aDirtyRect);
+  return anim->SetCurrentFrame(aSurface, sharedSurface, aDirtyRect);
+}
+
+AnimationImageKeyData::AnimationImageKeyData(WebRenderLayerManager* aManager,
+                                             const wr::ImageKey& aImageKey)
+  : SharedSurfacesChild::ImageKeyData(aManager, aImageKey)
+  , mRecycling(false)
+{ }
+
+AnimationImageKeyData::AnimationImageKeyData(AnimationImageKeyData&& aOther)
+  : SharedSurfacesChild::ImageKeyData(std::move(aOther))
+  , mPendingRelease(std::move(aOther.mPendingRelease))
+  , mRecycling(aOther.mRecycling)
+{ }
+
+AnimationImageKeyData&
+AnimationImageKeyData::operator=(AnimationImageKeyData&& aOther)
+{
+  mPendingRelease = std::move(aOther.mPendingRelease);
+  mRecycling = aOther.mRecycling;
+  SharedSurfacesChild::ImageKeyData::operator=(std::move(aOther));
+  return *this;
+}
+
+AnimationImageKeyData::~AnimationImageKeyData() = default;
+
+SharedSurfacesAnimation::~SharedSurfacesAnimation()
+{
+  MOZ_ASSERT(mKeys.IsEmpty());
+}
+
+void
+SharedSurfacesAnimation::Destroy()
+{
+  if (!NS_IsMainThread()) {
+    nsCOMPtr<nsIRunnable> task =
+      NewRunnableMethod("SharedSurfacesAnimation::Destroy",
+                        this, &SharedSurfacesAnimation::Destroy);
+    SystemGroup::Dispatch(TaskCategory::Other, task.forget());
+    return;
+  }
+
+  if (mKeys.IsEmpty()) {
+    return;
+  }
+
+  for (const auto& entry : mKeys) {
+    MOZ_ASSERT(!entry.mManager->IsDestroyed());
+    if (entry.mRecycling) {
+      entry.mManager->DeregisterAsyncAnimation(entry.mImageKey);
+    }
+    entry.mManager->AddImageKeyForDiscard(entry.mImageKey);
+  }
+
+  mKeys.Clear();
+}
+
+void
+SharedSurfacesAnimation::HoldSurfaceForRecycling(AnimationImageKeyData& aEntry,
+                                                 SourceSurface* aParentSurface,
+                                                 SourceSurfaceSharedData* aSurface)
+{
+  if (aParentSurface == static_cast<SourceSurface*>(aSurface)) {
+    return;
+  }
+
+  if (!aEntry.mRecycling) {
+    aEntry.mManager->RegisterAsyncAnimation(aEntry.mImageKey, this);
+    aEntry.mRecycling = true;
+  }
+
+  aEntry.mPendingRelease.AppendElement(aParentSurface);
 }
 
 nsresult
-SharedSurfacesAnimation::SetCurrentFrame(SourceSurfaceSharedData* aSurface,
+SharedSurfacesAnimation::SetCurrentFrame(SourceSurface* aParentSurface,
+                                         SourceSurfaceSharedData* aSurface,
                                          const gfx::IntRect& aDirtyRect)
 {
   MOZ_ASSERT(aSurface);
 
-  SharedUserData* data = nullptr;
+  SharedSurfacesChild::SharedUserData* data = nullptr;
   nsresult rv = SharedSurfacesChild::ShareInternal(aSurface, &data);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   MOZ_ASSERT(data);
   mId = data->Id();
 
   auto i = mKeys.Length();
   while (i > 0) {
     --i;
-    SharedSurfacesChild::ImageKeyData& entry = mKeys[i];
-    if (entry.mManager->IsDestroyed()) {
-      mKeys.RemoveElementAt(i);
-      continue;
-    }
+    AnimationImageKeyData& entry = mKeys[i];
+    MOZ_ASSERT(!entry.mManager->IsDestroyed());
 
     entry.MergeDirtyRect(Some(aDirtyRect));
-
     Maybe<IntRect> dirtyRect = entry.TakeDirtyRect();
     if (dirtyRect) {
+      HoldSurfaceForRecycling(entry, aParentSurface, aSurface);
       auto& resourceUpdates = entry.mManager->AsyncResourceUpdates();
       resourceUpdates.UpdateExternalImage(mId, entry.mImageKey,
                                           ViewAs<ImagePixel>(dirtyRect.ref()));
     }
   }
 
   return NS_OK;
 }
 
 nsresult
-SharedSurfacesAnimation::UpdateKey(SourceSurfaceSharedData* aSurface,
+SharedSurfacesAnimation::UpdateKey(SourceSurface* aParentSurface,
+                                   SourceSurfaceSharedData* aSurface,
                                    WebRenderLayerManager* aManager,
                                    wr::IpcResourceUpdateQueue& aResources,
                                    wr::ImageKey& aKey)
 {
-  SharedUserData* data = nullptr;
+  SharedSurfacesChild::SharedUserData* data = nullptr;
   nsresult rv = SharedSurfacesChild::ShareInternal(aSurface, &data);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   MOZ_ASSERT(data);
   if (mId.mHandle != data->Id().mHandle) {
     mKeys.Clear();
     mId = data->Id();
   }
 
-  aKey = SharedSurfacesChild::SharedUserData::UpdateKey(aManager,
-                                                        aResources,
-                                                        Nothing());
+  // We iterate through all of the items to ensure we clean up the old
+  // WebRenderLayerManager references. Most of the time there will be few
+  // entries and this should not be particularly expensive compared to the
+  // cost of duplicating image keys. In an ideal world, we would generate a
+  // single key for the surface, and it would be usable on all of the
+  // renderer instances. For now, we must allocate a key for each WR bridge.
+  bool found = false;
+  auto i = mKeys.Length();
+  while (i > 0) {
+    --i;
+    AnimationImageKeyData& entry = mKeys[i];
+    MOZ_ASSERT(!entry.mManager->IsDestroyed());
+    if (entry.mManager == aManager) {
+      WebRenderBridgeChild* wrBridge = aManager->WrBridge();
+      MOZ_ASSERT(wrBridge);
+
+      // Even if the manager is the same, its underlying WebRenderBridgeChild
+      // can change state. If our namespace differs, then our old key has
+      // already been discarded.
+      bool ownsKey = wrBridge->GetNamespace() == entry.mImageKey.mNamespace;
+      if (!ownsKey) {
+        entry.mImageKey = wrBridge->GetNextImageKey();
+        HoldSurfaceForRecycling(entry, aParentSurface, aSurface);
+        aResources.AddExternalImage(mId, entry.mImageKey);
+      } else {
+        MOZ_ASSERT(entry.mDirtyRect.isNothing());
+      }
+
+      aKey = entry.mImageKey;
+      found = true;
+      break;
+    }
+  }
+
+  if (!found) {
+    aKey = aManager->WrBridge()->GetNextImageKey();
+    AnimationImageKeyData data(aManager, aKey);
+    HoldSurfaceForRecycling(data, aParentSurface, aSurface);
+    mKeys.AppendElement(std::move(data));
+    aResources.AddExternalImage(mId, aKey);
+  }
+
   return NS_OK;
 }
 
+void
+SharedSurfacesAnimation::ReleasePreviousFrame(WebRenderLayerManager* aManager,
+                                              const wr::ExternalImageId& aId)
+{
+  MOZ_ASSERT(aManager);
+
+  auto i = mKeys.Length();
+  while (i > 0) {
+    --i;
+    AnimationImageKeyData& entry = mKeys[i];
+    MOZ_ASSERT(!entry.mManager->IsDestroyed());
+    if (entry.mManager == aManager) {
+      size_t k;
+      for (k = 0; k < entry.mPendingRelease.Length(); ++k) {
+        auto sharedSurface =
+          SharedSurfacesChild::AsSourceSurfaceSharedData(entry.mPendingRelease[k]);
+        MOZ_ASSERT(sharedSurface);
+
+        Maybe<wr::ExternalImageId> extId =
+          SharedSurfacesChild::GetExternalId(sharedSurface);
+        if (extId && extId.ref() == aId) {
+          break;
+        }
+      }
+
+      if (k == entry.mPendingRelease.Length()) {
+        continue;
+      }
+
+      entry.mPendingRelease.RemoveElementsAt(0, k + 1);
+      break;
+    }
+  }
+}
+
+void
+SharedSurfacesAnimation::Invalidate(WebRenderLayerManager* aManager)
+{
+  auto i = mKeys.Length();
+  while (i > 0) {
+    --i;
+    AnimationImageKeyData& entry = mKeys[i];
+    if (entry.mManager == aManager) {
+      mKeys.RemoveElementAt(i);
+      break;
+    }
+  }
+}
+
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/ipc/SharedSurfacesChild.h
+++ b/gfx/layers/ipc/SharedSurfacesChild.h
@@ -12,16 +12,28 @@
 #include "mozilla/Maybe.h"              // for Maybe
 #include "mozilla/RefPtr.h"             // for already_AddRefed
 #include "mozilla/StaticPtr.h"          // for StaticRefPtr
 #include "mozilla/gfx/UserData.h"       // for UserDataKey
 #include "mozilla/webrender/WebRenderTypes.h" // for wr::ImageKey
 #include "nsTArray.h"                   // for AutoTArray
 
 namespace mozilla {
+namespace layers {
+class AnimationImageKeyData;
+} // namespace mozilla
+} // namespace layers
+
+template<>
+struct nsTArray_CopyChooser<mozilla::layers::AnimationImageKeyData>
+{
+  typedef nsTArray_CopyWithConstructors<mozilla::layers::AnimationImageKeyData> Type;
+};
+
+namespace mozilla {
 namespace gfx {
 class SourceSurfaceSharedData;
 } // namespace gfx
 
 namespace wr {
 class IpcResourceUpdateQueue;
 } // namespace wr
 
@@ -75,27 +87,28 @@ public:
 
   /**
    * Get the external ID, if any, bound to the shared surface. Used for memory
    * reporting purposes.
    */
   static Maybe<wr::ExternalImageId>
   GetExternalId(const gfx::SourceSurfaceSharedData* aSurface);
 
+  /**
+   * Get the surface (or its underlying surface) as a SourceSurfaceSharedData
+   * pointer, if valid.
+   */
+  static gfx::SourceSurfaceSharedData*
+  AsSourceSurfaceSharedData(gfx::SourceSurface* aSurface);
+
   static nsresult UpdateAnimation(ImageContainer* aContainer,
                                   gfx::SourceSurface* aSurface,
                                   const gfx::IntRect& aDirtyRect);
 
-private:
-  SharedSurfacesChild() = delete;
-  ~SharedSurfacesChild() = delete;
-
-  friend class SharedSurfacesAnimation;
-
-  class ImageKeyData final {
+  class ImageKeyData {
   public:
     ImageKeyData(WebRenderLayerManager* aManager,
                  const wr::ImageKey& aImageKey);
     ~ImageKeyData();
 
     ImageKeyData(ImageKeyData&& aOther);
     ImageKeyData& operator=(ImageKeyData&& aOther);
     ImageKeyData(const ImageKeyData&) = delete;
@@ -108,17 +121,23 @@ private:
       return std::move(mDirtyRect);
     }
 
     RefPtr<WebRenderLayerManager> mManager;
     Maybe<gfx::IntRect> mDirtyRect;
     wr::ImageKey mImageKey;
   };
 
-  class SharedUserData {
+private:
+  SharedSurfacesChild() = delete;
+  ~SharedSurfacesChild() = delete;
+
+  friend class SharedSurfacesAnimation;
+
+  class SharedUserData final {
   public:
     SharedUserData()
       : mShared(false)
     { }
 
     explicit SharedUserData(const wr::ExternalImageId& aId)
       : mId(aId)
       , mShared(false)
@@ -172,44 +191,94 @@ private:
                       bool aReleaseId,
                       nsTArray<ImageKeyData>& aKeys);
 
   static void DestroySharedUserData(void* aClosure);
 
   static gfx::UserDataKey sSharedKey;
 };
 
+class AnimationImageKeyData final : public SharedSurfacesChild::ImageKeyData
+{
+public:
+  AnimationImageKeyData(WebRenderLayerManager* aManager,
+               const wr::ImageKey& aImageKey);
+
+  ~AnimationImageKeyData();
+
+  AnimationImageKeyData(AnimationImageKeyData&& aOther);
+  AnimationImageKeyData& operator=(AnimationImageKeyData&& aOther);
+
+  AutoTArray<RefPtr<gfx::SourceSurface>, 2> mPendingRelease;
+  bool mRecycling;
+};
+
 /**
  * This helper class owns a single ImageKey which will map to different external
  * image IDs representing different frames in an animation.
  */
-class SharedSurfacesAnimation final : private SharedSurfacesChild::SharedUserData
+class SharedSurfacesAnimation final
 {
 public:
+  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(SharedSurfacesAnimation)
+
   SharedSurfacesAnimation()
   { }
 
+  void Destroy();
+
   /**
    * Set the animation to display the given frame.
+   * @param aParentSurface The owning surface of aSurface. This may be the same
+   *                       or it may be a wrapper surface such as
+   *                       RecyclingSourceSurface.
    * @param aSurface    The current frame.
    * @param aDirtyRect  Dirty rect representing the change between the new frame
    *                    and the previous frame. We will request only the delta
    *                    be reuploaded by WebRender.
    */
-  nsresult SetCurrentFrame(gfx::SourceSurfaceSharedData* aSurface,
+  nsresult SetCurrentFrame(gfx::SourceSurface* aParentSurface,
+                           gfx::SourceSurfaceSharedData* aSurface,
                            const gfx::IntRect& aDirtyRect);
 
   /**
    * Generate an ImageKey for the given frame.
+   * @param aParentSurface The owning surface of aSurface. This may be the same
+   *                       or it may be a wrapper surface such as
+   *                       RecyclingSourceSurface.
    * @param aSurface  The current frame. This should match what was cached via
    *                  SetCurrentFrame, but if it does not, it will need to
    *                  regenerate the cached ImageKey.
    */
-  nsresult UpdateKey(gfx::SourceSurfaceSharedData* aSurface,
+  nsresult UpdateKey(gfx::SourceSurface* aParentSurface,
+                     gfx::SourceSurfaceSharedData* aSurface,
                      WebRenderLayerManager* aManager,
                      wr::IpcResourceUpdateQueue& aResources,
                      wr::ImageKey& aKey);
+
+  /**
+   * Release our reference to all frames up to and including the frame which
+   * has an external image ID which matches aId.
+   */
+  void ReleasePreviousFrame(WebRenderLayerManager* aManager,
+                            const wr::ExternalImageId& aId);
+
+  /**
+   * Destroy any state information bound for the given layer manager. Any
+   * image keys are already invalid.
+   */
+  void Invalidate(WebRenderLayerManager* aManager);
+
+private:
+  ~SharedSurfacesAnimation();
+
+  void HoldSurfaceForRecycling(AnimationImageKeyData& aEntry,
+                               gfx::SourceSurface* aParentSurface,
+                               gfx::SourceSurfaceSharedData* aSurface);
+
+  AutoTArray<AnimationImageKeyData, 1> mKeys;
+  wr::ExternalImageId mId;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif
--- a/gfx/layers/wr/WebRenderBridgeChild.cpp
+++ b/gfx/layers/wr/WebRenderBridgeChild.cpp
@@ -566,16 +566,25 @@ WebRenderBridgeChild::RecvWrUpdated(cons
   // Since usage of invalid keys could cause crash in webrender.
   mIdNamespace = aNewIdNamespace;
   // Just clear FontInstaceKeys/FontKeys, they are removed during WebRenderAPI destruction.
   mFontInstanceKeys.Clear();
   mFontKeys.Clear();
   return IPC_OK();
 }
 
+mozilla::ipc::IPCResult
+WebRenderBridgeChild::RecvWrReleasedImages(nsTArray<wr::ExternalImageKeyPair>&& aPairs)
+{
+  if (mManager) {
+    mManager->WrReleasedImages(aPairs);
+  }
+  return IPC_OK();
+}
+
 void
 WebRenderBridgeChild::BeginClearCachedResources()
 {
   mIsInClearCachedResources = true;
   // Clear display list and animtaions at parent side before clearing cached
   // resources on client side. It prevents to clear resources before clearing
   // display list at parent side.
   SendClearCachedResources();
--- a/gfx/layers/wr/WebRenderBridgeChild.h
+++ b/gfx/layers/wr/WebRenderBridgeChild.h
@@ -206,16 +206,17 @@ private:
   bool InForwarderThread() override;
 
   void ActorDestroy(ActorDestroyReason why) override;
 
   void DoDestroy();
 
   mozilla::ipc::IPCResult RecvWrUpdated(const wr::IdNamespace& aNewIdNamespace,
                                         const TextureFactoryIdentifier& textureFactoryIdentifier) override;
+  mozilla::ipc::IPCResult RecvWrReleasedImages(nsTArray<wr::ExternalImageKeyPair>&& aPairs) override;
 
   void AddIPDLReference() {
     MOZ_ASSERT(mIPCOpen == false);
     mIPCOpen = true;
     AddRef();
   }
   void ReleaseIPDLReference() {
     MOZ_ASSERT(mIPCOpen == true);
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -249,33 +249,42 @@ protected:
   TimeStamp mTxnStartTime;
 };
 
 
 class WebRenderBridgeParent::ScheduleSharedSurfaceRelease final
   : public wr::NotificationHandler
 {
 public:
-  ScheduleSharedSurfaceRelease()
+  explicit ScheduleSharedSurfaceRelease(WebRenderBridgeParent* aWrBridge)
+    : mWrBridge(aWrBridge)
+    , mSurfaces(20)
   { }
 
-  void Add(const wr::ExternalImageId& aId)
+  void Add(const wr::ImageKey& aKey,
+           const wr::ExternalImageId& aId)
   {
-    mSurfaces.AppendElement(aId);
+    mSurfaces.AppendElement(wr::ExternalImageKeyPair { aKey, aId });
   }
 
   void Notify(wr::Checkpoint) override
   {
-    for (const auto& id : mSurfaces) {
-      SharedSurfacesParent::Release(id);
-    }
+    CompositorThreadHolder::Loop()->PostTask(
+      NewRunnableMethod<nsTArray<wr::ExternalImageKeyPair>>(
+        "ObserveSharedSurfaceRelease",
+        mWrBridge,
+        &WebRenderBridgeParent::ObserveSharedSurfaceRelease,
+        std::move(mSurfaces)
+      )
+    );
   }
 
 private:
-  AutoTArray<wr::ExternalImageId, 20> mSurfaces;
+  RefPtr<WebRenderBridgeParent> mWrBridge;
+  nsTArray<wr::ExternalImageKeyPair> mSurfaces;
 };
 
 class MOZ_STACK_CLASS AutoWebRenderBridgeParentAsyncMessageSender
 {
 public:
   explicit AutoWebRenderBridgeParentAsyncMessageSender(WebRenderBridgeParent* aWebRenderBridgeParent,
                                                        InfallibleTArray<OpDestroy>* aDestroyActors = nullptr)
     : mWebRenderBridgeParent(aWebRenderBridgeParent)
@@ -535,17 +544,18 @@ WebRenderBridgeParent::UpdateResources(c
         aUpdates.DeleteFontInstance(op.key());
         break;
       }
       case OpUpdateResource::T__None: break;
     }
   }
 
   if (scheduleRelease) {
-    aUpdates.Notify(wr::Checkpoint::FrameRendered, std::move(scheduleRelease));
+    aUpdates.Notify(wr::Checkpoint::FrameTexturesUpdated,
+                    std::move(scheduleRelease));
   }
   return true;
 }
 
 bool
 WebRenderBridgeParent::AddExternalImage(wr::ExternalImageId aExtId, wr::ImageKey aKey,
                                         wr::TransactionBuilder& aResources)
 {
@@ -690,19 +700,19 @@ WebRenderBridgeParent::UpdateExternalIma
     return false;
   }
 
   if (!(it->second == aExtId)) {
     // We already have a mapping for this image key, so ensure we release the
     // previous external image ID. This can happen when an image is animated,
     // and it is changing the external image that the animation points to.
     if (!aScheduleRelease) {
-      aScheduleRelease = MakeUnique<ScheduleSharedSurfaceRelease>();
+      aScheduleRelease = MakeUnique<ScheduleSharedSurfaceRelease>(this);
     }
-    aScheduleRelease->Add(it->second);
+    aScheduleRelease->Add(aKey, it->second);
     it->second = aExtId;
   }
 
   if (!gfxEnv::EnableWebRenderRecording()) {
     wr::ImageDescriptor descriptor(dSurf->GetSize(), dSurf->Stride(),
                                    dSurf->GetFormat());
     aResources.UpdateExternalImageWithDirtyRect(aKey, descriptor, aExtId,
                                                 wr::WrExternalImageBufferType::ExternalBuffer,
@@ -720,16 +730,27 @@ WebRenderBridgeParent::UpdateExternalIma
   IntSize size = dSurf->GetSize();
   wr::ImageDescriptor descriptor(size, map.GetStride(), dSurf->GetFormat());
   wr::Vec<uint8_t> data;
   data.PushBytes(Range<uint8_t>(map.GetData(), size.height * map.GetStride()));
   aResources.UpdateImageBuffer(keys[0], descriptor, data);
   return true;
 }
 
+void
+WebRenderBridgeParent::ObserveSharedSurfaceRelease(const nsTArray<wr::ExternalImageKeyPair>& aPairs)
+{
+  if (!mDestroyed) {
+    Unused << SendWrReleasedImages(aPairs);
+  }
+  for (const auto& pair : aPairs) {
+    SharedSurfacesParent::Release(pair.id);
+  }
+}
+
 mozilla::ipc::IPCResult
 WebRenderBridgeParent::RecvUpdateResources(nsTArray<OpUpdateResource>&& aResourceUpdates,
                                            nsTArray<RefCountedShmem>&& aSmallShmems,
                                            nsTArray<ipc::Shmem>&& aLargeShmems,
                                            const bool& aScheduleComposite)
 {
   if (mDestroyed) {
     wr::IpcResourceUpdateQueue::ReleaseShmems(this, aSmallShmems);
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -250,16 +250,17 @@ private:
                        const nsTArray<ipc::Shmem>& aLargeShmems,
                        wr::TransactionBuilder& aUpdates);
   bool AddExternalImage(wr::ExternalImageId aExtId, wr::ImageKey aKey,
                         wr::TransactionBuilder& aResources);
   bool UpdateExternalImage(wr::ExternalImageId aExtId, wr::ImageKey aKey,
                            const ImageIntRect& aDirtyRect,
                            wr::TransactionBuilder& aResources,
                            UniquePtr<ScheduleSharedSurfaceRelease>& aScheduleRelease);
+  void ObserveSharedSurfaceRelease(const nsTArray<wr::ExternalImageKeyPair>& aPairs);
 
   bool PushExternalImageForTexture(wr::ExternalImageId aExtId,
                                    wr::ImageKey aKey,
                                    TextureHost* aTexture,
                                    bool aIsUpdate,
                                    wr::TransactionBuilder& aResources);
 
   void AddPipelineIdForCompositable(const wr::PipelineId& aPipelineIds,
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -115,16 +115,18 @@ WebRenderLayerManager::DoDestroy(bool aI
   }
 
   // Clear this before calling RemoveUnusedAndResetWebRenderUserData(),
   // otherwise that function might destroy some WebRenderAnimationData instances
   // which will put stuff back into mDiscardedCompositorAnimationsIds. If
   // mActiveCompositorAnimationIds is empty that won't happen.
   mActiveCompositorAnimationIds.clear();
 
+  ClearAsyncAnimations();
+
   mWebRenderCommandBuilder.Destroy();
 
   if (mTransactionIdAllocator) {
     // Make sure to notify the refresh driver just in case it's waiting on a
     // pending transaction. Do this at the top of the event loop so we don't
     // cause a paint to occur during compositor shutdown.
     RefPtr<TransactionIdAllocator> allocator = mTransactionIdAllocator;
     TransactionId id = mLatestTransactionId;
@@ -588,16 +590,17 @@ WebRenderLayerManager::ClearCachedResour
   mActiveCompositorAnimationIds.clear();
   mDiscardedCompositorAnimationsIds.Clear();
   WrBridge()->EndClearCachedResources();
 }
 
 void
 WebRenderLayerManager::WrUpdated()
 {
+  ClearAsyncAnimations();
   mWebRenderCommandBuilder.ClearCachedResources();
   DiscardLocalImages();
 
   if (mWidget) {
     if (dom::TabChild* tabChild = mWidget->GetOwningTabChild()) {
       tabChild->SchedulePaint();
     }
   }
@@ -760,10 +763,53 @@ WebRenderLayerManager::FlushAsyncResourc
   if (!IsDestroyed() && WrBridge()) {
     WrBridge()->UpdateResources(mAsyncResourceUpdates.ref(),
                                 /* aScheduleComposite */ true);
   }
 
   mAsyncResourceUpdates.reset();
 }
 
+void
+WebRenderLayerManager::RegisterAsyncAnimation(const wr::ImageKey& aKey,
+                                              SharedSurfacesAnimation* aAnimation)
+{
+  mAsyncAnimations.insert(std::make_pair(wr::AsUint64(aKey), aAnimation));
+}
+
+void
+WebRenderLayerManager::DeregisterAsyncAnimation(const wr::ImageKey& aKey)
+{
+  mAsyncAnimations.erase(wr::AsUint64(aKey));
+}
+
+void
+WebRenderLayerManager::ClearAsyncAnimations()
+{
+  for (const auto& i : mAsyncAnimations) {
+    i.second->Invalidate(this);
+  }
+  mAsyncAnimations.clear();
+}
+
+void
+WebRenderLayerManager::WrReleasedImages(const nsTArray<wr::ExternalImageKeyPair>& aPairs)
+{
+  // A SharedSurfaceAnimation object's lifetime is tied to its owning
+  // ImageContainer. When the ImageContainer is released,
+  // SharedSurfaceAnimation::Destroy is called which should ensure it is removed
+  // from the layer manager. Whenever the namespace for the
+  // WebRenderLayerManager itself is invalidated (e.g. we changed windows, or
+  // were destroyed ourselves), we callback into the SharedSurfaceAnimation
+  // object to remove its image key for us and any bound surfaces. If, for any
+  // reason, we somehow missed an WrReleasedImages call before the animation
+  // was bound to the layer manager, it will free those associated surfaces on
+  // the next ReleasePreviousFrame call.
+  for (const auto& pair : aPairs) {
+    auto i = mAsyncAnimations.find(wr::AsUint64(pair.key));
+    if (i != mAsyncAnimations.end()) {
+      i->second->ReleasePreviousFrame(this, pair.id);
+    }
+  }
+}
+
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/wr/WebRenderLayerManager.h
+++ b/gfx/layers/wr/WebRenderLayerManager.h
@@ -3,25 +3,27 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #ifndef GFX_WEBRENDERLAYERMANAGER_H
 #define GFX_WEBRENDERLAYERMANAGER_H
 
 #include <unordered_set>
+#include <unordered_map>
 #include <vector>
 
 #include "gfxPrefs.h"
 #include "Layers.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/MozPromise.h"
 #include "mozilla/layers/APZTestData.h"
 #include "mozilla/layers/FocusTarget.h"
 #include "mozilla/layers/IpcResourceUpdateQueue.h"
+#include "mozilla/layers/SharedSurfacesChild.h"
 #include "mozilla/layers/StackingContextHelper.h"
 #include "mozilla/layers/TransactionIdAllocator.h"
 #include "mozilla/layers/WebRenderCommandBuilder.h"
 #include "mozilla/layers/WebRenderScrollData.h"
 #include "mozilla/layers/WebRenderUserData.h"
 #include "mozilla/webrender/WebRenderAPI.h"
 #include "mozilla/webrender/WebRenderTypes.h"
 #include "nsDisplayList.h"
@@ -133,16 +135,21 @@ public:
   // transaction or destruction
   void AddImageKeyForDiscard(wr::ImageKey);
   void DiscardImages();
   void DiscardLocalImages();
 
   wr::IpcResourceUpdateQueue& AsyncResourceUpdates();
   void FlushAsyncResourceUpdates();
 
+  void RegisterAsyncAnimation(const wr::ImageKey& aKey, SharedSurfacesAnimation* aAnimation);
+  void DeregisterAsyncAnimation(const wr::ImageKey& aKey);
+  void ClearAsyncAnimations();
+  void WrReleasedImages(const nsTArray<wr::ExternalImageKeyPair>& aPairs);
+
   // Methods to manage the compositor animation ids. Active animations are still
   // going, and when they end we discard them and remove them from the active
   // list.
   void AddActiveCompositorAnimationId(uint64_t aId);
   void AddCompositorAnimationsIdForDiscard(uint64_t aId);
   void DiscardCompositorAnimations();
 
   WebRenderBridgeChild* WrBridge() const { return mWrChild; }
@@ -222,14 +229,15 @@ private:
 
   TimeStamp mTransactionStart;
   nsCString mURL;
   WebRenderCommandBuilder mWebRenderCommandBuilder;
 
   size_t mLastDisplayListSize;
 
   Maybe<wr::IpcResourceUpdateQueue> mAsyncResourceUpdates;
+  std::unordered_map<uint64_t, RefPtr<SharedSurfacesAnimation>> mAsyncAnimations;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif /* GFX_WEBRENDERLAYERMANAGER_H */
--- a/gfx/layers/wr/WebRenderMessageUtils.h
+++ b/gfx/layers/wr/WebRenderMessageUtils.h
@@ -184,11 +184,17 @@ struct ParamTraits<mozilla::wr::MemoryRe
 };
 
 template<>
 struct ParamTraits<mozilla::wr::OpacityType>
   : public PlainOldDataSerializer<mozilla::wr::OpacityType>
 {
 };
 
+template<>
+struct ParamTraits<mozilla::wr::ExternalImageKeyPair>
+  : public PlainOldDataSerializer<mozilla::wr::ExternalImageKeyPair>
+{
+};
+
 } // namespace IPC
 
 #endif // GFX_WEBRENDERMESSAGEUTILS_H
--- a/gfx/webrender_bindings/WebRenderTypes.h
+++ b/gfx/webrender_bindings/WebRenderTypes.h
@@ -45,16 +45,22 @@ typedef wr::WrDebugFlags DebugFlags;
 
 typedef mozilla::Maybe<mozilla::wr::IdNamespace> MaybeIdNamespace;
 typedef mozilla::Maybe<mozilla::wr::WrImageMask> MaybeImageMask;
 typedef Maybe<ExternalImageId> MaybeExternalImageId;
 
 typedef Maybe<FontInstanceOptions> MaybeFontInstanceOptions;
 typedef Maybe<FontInstancePlatformOptions> MaybeFontInstancePlatformOptions;
 
+struct ExternalImageKeyPair
+{
+  ImageKey key;
+  ExternalImageId id;
+};
+
 /* Generate a brand new window id and return it. */
 WindowId NewWindowId();
 
 inline DebugFlags NewDebugFlags(uint32_t aFlags) {
   DebugFlags flags;
   flags.mBits = aFlags;
   return flags;
 }
--- a/image/AnimationFrameBuffer.cpp
+++ b/image/AnimationFrameBuffer.cpp
@@ -216,21 +216,20 @@ AnimationFrameDiscardingQueue::MarkCompl
 void
 AnimationFrameDiscardingQueue::AdvanceInternal()
 {
   // We only want to change the current frame index if we have advanced. This
   // means either a higher frame index, or going back to the beginning.
   // We should never have advanced beyond the frame buffer.
   MOZ_ASSERT(mGetIndex < mSize);
 
-  // Unless we are recycling, we should have the current frame still in the
-  // display queue. Either way, we should at least have an entry in the queue
-  // which we need to consume.
-  MOZ_ASSERT(mRecycling || bool(mDisplay.front()));
+  // We should have the current frame still in the display queue. Either way,
+  // we should at least have an entry in the queue which we need to consume.
   MOZ_ASSERT(!mDisplay.empty());
+  MOZ_ASSERT(mDisplay.front());
   mDisplay.pop_front();
   MOZ_ASSERT(!mDisplay.empty());
   MOZ_ASSERT(mDisplay.front());
 
   if (mDisplay.size() + mPending - 1 < mBatch) {
     // If we have fewer frames than the batch size, then ask for more. If we
     // do not have any pending, then we know that there is no active decoding.
     mPending += mBatch;
@@ -349,16 +348,21 @@ AnimationFrameRecyclingQueue::AddSizeOfE
       );
     }
   }
 }
 
 void
 AnimationFrameRecyclingQueue::AdvanceInternal()
 {
+  // We only want to change the current frame index if we have advanced. This
+  // means either a higher frame index, or going back to the beginning.
+  // We should never have advanced beyond the frame buffer.
+  MOZ_ASSERT(mGetIndex < mSize);
+
   MOZ_ASSERT(!mDisplay.empty());
   MOZ_ASSERT(mDisplay.front());
 
   RefPtr<imgFrame>& front = mDisplay.front();
 
   // The first frame should always have a dirty rect that matches the frame
   // rect. As such, we should use mFirstFrameRefreshArea instead for recycle
   // rect calculations.
@@ -383,17 +387,40 @@ AnimationFrameRecyclingQueue::AdvanceInt
     }
 
     newEntry.mFrame = std::move(front);
   }
 
   // Even if the frame itself isn't saved, we want the dirty rect to calculate
   // the recycle rect for future recycled frames.
   mRecycle.push_back(std::move(newEntry));
-  AnimationFrameDiscardingQueue::AdvanceInternal();
+  mDisplay.pop_front();
+  MOZ_ASSERT(!mDisplay.empty());
+  MOZ_ASSERT(mDisplay.front());
+
+  if (mDisplay.size() + mPending - 1 < mBatch) {
+    // If we have fewer frames than the batch size, then ask for more. If we
+    // do not have any pending, then we know that there is no active decoding.
+    //
+    // We limit the batch to avoid using the frame we just added to the queue.
+    // This gives other parts of the system time to switch to the new current
+    // frame, and maximize buffer reuse. In particular this is useful for
+    // WebRender which holds onto the previous frame for much longer.
+    size_t newPending = std::min(mPending + mBatch, mRecycle.size() - 1);
+    if (newPending == 0 && (mDisplay.size() <= 1 || mPending > 0)) {
+      // If we already have pending frames, then the decoder is active and we
+      // cannot go below one. If we are displaying the only frame we have, and
+      // there are none pending, then we must request at least one more frame to
+      // continue to animation, because we won't advance again without a new
+      // frame. This may cause us to skip recycling because the previous frame
+      // is still in use.
+      newPending = 1;
+    }
+    mPending = newPending;
+  }
 }
 
 bool
 AnimationFrameRecyclingQueue::ResetInternal()
 {
   mRecycle.clear();
   return AnimationFrameDiscardingQueue::ResetInternal();
 }
--- a/image/AnimationSurfaceProvider.cpp
+++ b/image/AnimationSurfaceProvider.cpp
@@ -421,18 +421,17 @@ AnimationSurfaceProvider::RequestFrameDi
   auto oldFrameQueue = static_cast<AnimationFrameRetainedBuffer*>(mFrames.get());
 
   // We only recycle if it is a full frame. Partial frames may be sized
   // differently from each other. We do not support recycling with WebRender
   // and shared surfaces at this time as there is additional synchronization
   // required to know when it is safe to recycle.
   MOZ_ASSERT(!mDecoder->GetFrameRecycler());
   if (gfxPrefs::ImageAnimatedDecodeOnDemandRecycle() &&
-      mDecoder->ShouldBlendAnimation() &&
-      (!gfxVars::GetUseWebRenderOrDefault() || !gfxPrefs::ImageMemShared())) {
+      mDecoder->ShouldBlendAnimation()) {
     mFrames.reset(new AnimationFrameRecyclingQueue(std::move(*oldFrameQueue)));
     mDecoder->SetFrameRecycler(this);
   } else {
     mFrames.reset(new AnimationFrameDiscardingQueue(std::move(*oldFrameQueue)));
   }
 }
 
 void
--- a/image/imgFrame.cpp
+++ b/image/imgFrame.cpp
@@ -930,17 +930,18 @@ imgFrame::FinalizeSurface()
 }
 
 void
 imgFrame::FinalizeSurfaceInternal()
 {
   mMonitor.AssertCurrentThreadOwns();
 
   // Not all images will have mRawSurface to finalize (i.e. paletted images).
-  if (!mRawSurface || mRawSurface->GetType() != SurfaceType::DATA_SHARED) {
+  if (mShouldRecycle || !mRawSurface ||
+      mRawSurface->GetType() != SurfaceType::DATA_SHARED) {
     return;
   }
 
   auto sharedSurf = static_cast<SourceSurfaceSharedData*>(mRawSurface.get());
   sharedSurf->Finalize();
 }
 
 already_AddRefed<SourceSurface>
@@ -1075,16 +1076,20 @@ imgFrame::AddSizeOfExcludingThis(MallocS
 
 RecyclingSourceSurface::RecyclingSourceSurface(imgFrame* aParent, DataSourceSurface* aSurface)
   : mParent(aParent)
   , mSurface(aSurface)
   , mType(SurfaceType::DATA)
 {
   mParent->mMonitor.AssertCurrentThreadOwns();
   ++mParent->mRecycleLockCount;
+
+  if (aSurface->GetType() == SurfaceType::DATA_SHARED) {
+    mType = SurfaceType::DATA_RECYCLING_SHARED;
+  }
 }
 
 RecyclingSourceSurface::~RecyclingSourceSurface()
 {
   MonitorAutoLock lock(mParent->mMonitor);
   MOZ_ASSERT(mParent->mRecycleLockCount > 0);
   if (--mParent->mRecycleLockCount == 0) {
     mParent->mMonitor.NotifyAll();
--- a/image/test/gtest/TestAnimationFrameBuffer.cpp
+++ b/image/test/gtest/TestAnimationFrameBuffer.cpp
@@ -483,17 +483,25 @@ static void TestDiscardingQueueLoop(Anim
   EXPECT_EQ(size_t(3), aQueue.PendingDecode());
   VerifyDiscardingQueueContents(aQueue);
 
   // Make sure frames get removed as we advance.
   VerifyInsertAndAdvance(aQueue, 5, AnimationFrameBuffer::InsertStatus::CONTINUE);
   EXPECT_EQ(size_t(1), aQueue.Display().size());
   VerifyInsertAndAdvance(aQueue, 6, AnimationFrameBuffer::InsertStatus::CONTINUE);
   EXPECT_EQ(size_t(1), aQueue.Display().size());
-  VerifyInsertAndAdvance(aQueue, 7, AnimationFrameBuffer::InsertStatus::CONTINUE);
+
+  // We actually will yield if we are recycling instead of continuing because
+  // the pending calculation is slightly different. We will actually request one
+  // less frame than we have to recycle.
+  if (aQueue.IsRecycling()) {
+    VerifyInsertAndAdvance(aQueue, 7, AnimationFrameBuffer::InsertStatus::YIELD);
+  } else {
+    VerifyInsertAndAdvance(aQueue, 7, AnimationFrameBuffer::InsertStatus::CONTINUE);
+  }
   EXPECT_EQ(size_t(1), aQueue.Display().size());
 
   // We should get throttled if we insert too much.
   VerifyInsert(aQueue, AnimationFrameBuffer::InsertStatus::CONTINUE);
   EXPECT_EQ(size_t(2), aQueue.Display().size());
   EXPECT_EQ(size_t(1), aQueue.PendingDecode());
   VerifyInsert(aQueue, AnimationFrameBuffer::InsertStatus::YIELD);
   EXPECT_EQ(size_t(3), aQueue.Display().size());
--- a/js/src/frontend/BytecodeCompiler.cpp
+++ b/js/src/frontend/BytecodeCompiler.cpp
@@ -438,16 +438,23 @@ frontend::SourceAwareCompiler<Unit>::cre
     if (!info.createScriptSource(parameterListEnd)) {
         return false;
     }
 
     if (!info.assignSource(sourceBuffer_)) {
         return false;
     }
 
+    // Note the contents of any compiled scripts when recording/replaying.
+    if (mozilla::recordreplay::IsRecordingOrReplaying()) {
+        mozilla::recordreplay::NoteContentParse(this, info.options.filename(),
+                                                "application/javascript",
+                                                sourceBuffer_.units(), sourceBuffer_.length());
+    }
+
     info.createUsedNames();
 
     if (info.canLazilyParse()) {
         syntaxParser.emplace(info.cx, info.cx->tempLifoAlloc(), info.options,
                              sourceBuffer_.units(), sourceBuffer_.length(),
                              /* foldConstants = */ false, *info.usedNames, nullptr, nullptr,
                              info.sourceObject, goal);
         if (!syntaxParser->checkOptions()) {
--- a/js/src/tests/jstests.list
+++ b/js/src/tests/jstests.list
@@ -480,16 +480,26 @@ skip include test262/intl402/RelativeTim
 # https://bugzilla.mozilla.org/show_bug.cgi?id=1483545
 skip script test262/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-always.js
 skip script test262/intl402/RelativeTimeFormat/prototype/format/en-us-numeric-auto.js
 skip script test262/intl402/RelativeTimeFormat/prototype/format/en-us-style-short.js
 skip script test262/intl402/RelativeTimeFormat/prototype/format/pl-pl-style-long.js
 skip script test262/intl402/RelativeTimeFormat/prototype/format/pl-pl-style-narrow.js
 skip script test262/intl402/RelativeTimeFormat/prototype/format/pl-pl-style-short.js
 
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1508684
+skip script test262/built-ins/RegExp/prototype/multiline/cross-realm.js
+skip script test262/built-ins/RegExp/prototype/global/cross-realm.js
+skip script test262/built-ins/RegExp/prototype/sticky/cross-realm.js
+skip script test262/built-ins/RegExp/prototype/ignoreCase/cross-realm.js
+skip script test262/built-ins/RegExp/prototype/unicode/cross-realm.js
+skip script test262/built-ins/RegExp/prototype/source/cross-realm.js
+
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1508684
+skip script test262/language/expressions/import.meta/syntax/invalid-assignment-target-update-expr.js
 
 ###########################################################
 # Tests disabled due to issues in test262 importer script #
 ###########################################################
 
 # test262 importer merges all includes in a per directory shell.js file, breaking this harness test case.
 skip script test262/harness/detachArrayBuffer.js
 
--- a/js/src/tests/test262/GIT-INFO
+++ b/js/src/tests/test262/GIT-INFO
@@ -1,36 +1,6 @@
-commit b98c45ca5a46966bce1ac691d5f608beb36d5db7
-Author: Maya Lekova <apokalyptra@gmail.com>
-Date:   Wed Oct 17 22:10:09 2018 +0200
+commit 2726142bb97e4538703eda748c3b7300183bc66d
+Author: test262-automation <test262-automation@bocoup.com>
+Date:   Wed Nov 14 19:00:37 2018 +0000
 
-    AsyncFunction: Add tests ensuring the new 1-tick await behaviour (#1843)
-    
-    * AsyncFunction: Add tests ensuring the new 1-tick await behaviour
-    
-    This commit adds 3 tests ensuring the optimized behaviour of await
-    (see https://github.com/tc39/ecma262/pull/1250) in the following cases:
-    - async functions
-    - yielding from async generator functions
-    - for-await-of loops
-    
-    * AsyncFunction: Add tests ensuring the monkey-patched promises behaviour
-    
-    This commit adds 2 more tests ensuring the optimized behaviour of await
-    (see tc39/ecma262#1250) in the following cases:
-    - awaiting on a native promise with monkey-patched "then"
-    - awaiting on a non-native promise (a "thenable" object)
-    
-    * AsyncFunction: Add tests ensuring the non-native promises behaviour
-    
-    This commit adds 1 more tests ensuring the optimized behaviour of await
-    (see tc39/ecma262#1250) in the following cases:
-    - awaiting on a non-promise, non-thenable object
-    
-    It also renames the previous test for non-promise (a "thenable" object)
-    to distinguish from the new case.
-    
-    The commit adds checks for proper await/promises interleaving in the
-    aforementioned cases and includes a small code clean-up.
-    
-    * AsyncFunction: Refactor tests ensuring the new 1-tick await behaviour
-    
-    Gather all the tests to their appropriate folder and update copyright header.
+    [v8-test262-automation] Updated curation log with latest revision sha's from export and changed files.
+        sourceRevisionAtLastExport: ac250b9b targetRevisionAtLastExport: 6218e682b2
--- a/js/src/tests/test262/annexB/built-ins/escape/escape-below.js
+++ b/js/src/tests/test262/annexB/built-ins/escape/escape-below.js
@@ -21,17 +21,17 @@ assert.sameValue(
   escape('\x00\x01\x02\x03'),
   '%00%01%02%03',
   'characters: \\x00\\x01\\x02\\x03'
 );
 
 assert.sameValue(
   escape('!"#$%&\'()'),
   '%21%22%23%24%25%26%27%28%29',
-  'characters preceeding "*": !"#$%&\'()'
+  'characters preceding "*": !"#$%&\'()'
 );
 
 assert.sameValue(escape(','), '%2C', 'character between "+" and "-": ,');
 
 assert.sameValue(
   escape(':;<=>?'),
   '%3A%3B%3C%3D%3E%3F',
   'characters between "9" and "@": :;<=>?'
--- a/js/src/tests/test262/annexB/language/expressions/object/__proto__-duplicate.js
+++ b/js/src/tests/test262/annexB/language/expressions/object/__proto__-duplicate.js
@@ -10,15 +10,15 @@ info: |
     any duplicate entries for "__proto__" and at least two of those entries
     were obtained from productions of the form
     PropertyDefinition : PropertyName : AssignmentExpression .
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 ({
   __proto__: null,
   other: null,
   '__proto__': null
 });
--- a/js/src/tests/test262/annexB/language/expressions/template-literal/legacy-octal-escape-sequence-strict-strict.js
+++ b/js/src/tests/test262/annexB/language/expressions/template-literal/legacy-octal-escape-sequence-strict-strict.js
@@ -10,11 +10,11 @@ description: >
     The SV of EscapeSequence :: HexEscapeSequence is the SV of the
     HexEscapeSequence.
 negative:
   phase: parse
   type: SyntaxError
 flags: [onlyStrict]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 `${'\07'}`;
--- a/js/src/tests/test262/annexB/language/statements/for-in/bare-initializer.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/bare-initializer.js
@@ -5,13 +5,13 @@
 esid: sec-initializers-in-forin-statement-heads
 description: >
     for-in heads prohibit AssignmentExpressions
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 var a;
 throw NotEarlyError;
 for (a = 0 in {});
 
--- a/js/src/tests/test262/annexB/language/statements/for-in/const-initializer.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/const-initializer.js
@@ -5,12 +5,12 @@
 esid: sec-initializers-in-forin-statement-heads
 description: >
     for-in initializers with const are prohibited
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 throw NotEarlyError;
 for (const a = 0 in {});
 
--- a/js/src/tests/test262/annexB/language/statements/for-in/let-initializer.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/let-initializer.js
@@ -5,12 +5,12 @@
 esid: sec-initializers-in-forin-statement-heads
 description: >
     for-in initializers with let are prohibited
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 throw NotEarlyError;
 for (let a = 0 in {});
 
--- a/js/src/tests/test262/annexB/language/statements/for-in/strict-initializer-strict.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/strict-initializer-strict.js
@@ -7,12 +7,12 @@ esid: sec-initializers-in-forin-statemen
 description: >
     for-in initializers in strict mode are prohibited
 negative:
   phase: parse
   type: SyntaxError
 flags: [onlyStrict]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 throw NotEarlyError;
 for (var a = 0 in {});
 
--- a/js/src/tests/test262/annexB/language/statements/for-in/var-arraybindingpattern-initializer.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/var-arraybindingpattern-initializer.js
@@ -5,12 +5,12 @@
 esid: sec-initializers-in-forin-statement-heads
 description: >
     for-in initializers with ArrayBindingPatterns are always prohibited
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 throw NotEarlyError;
 for (var [a] = 0 in {});
 
--- a/js/src/tests/test262/annexB/language/statements/for-in/var-objectbindingpattern-initializer.js
+++ b/js/src/tests/test262/annexB/language/statements/for-in/var-objectbindingpattern-initializer.js
@@ -5,12 +5,12 @@
 esid: sec-initializers-in-forin-statement-heads
 description: >
     for-in initializers with ObjectBindingPattern are always prohibited
 negative:
   phase: parse
   type: SyntaxError
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 throw NotEarlyError;
 for (var {a} = 0 in {});
 
--- a/js/src/tests/test262/built-ins/AsyncGeneratorFunction/invoked-as-function-multiple-arguments.js
+++ b/js/src/tests/test262/built-ins/AsyncGeneratorFunction/invoked-as-function-multiple-arguments.js
@@ -1,17 +1,17 @@
 // Copyright (C) 2018 Valerie Young. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 esid: sec-asyncgeneratorfunction
 description: >
     When invoked via the function invocation pattern with multiple arguments,
     the AsyncGeneratorFunction intrinsic creates a valid generator whose body is the
     last argument evaluated as source code and whose formal parameters are
-    defined by the preceeding arguments.
+    defined by the preceding arguments.
 features: [async-iteration]
 flags: [async]
 ---*/
 
 var AsyncGeneratorFunction = Object.getPrototypeOf(async function* () {}).constructor;
 
 var g = AsyncGeneratorFunction('x', 'y', 'yield x + y;');
 var iter = g(2, 3);
--- a/js/src/tests/test262/built-ins/Date/prototype/setDate/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setDate/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setDate.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setDate.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setDate/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setDate/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setDate.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setDate.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setFullYear/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setFullYear/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setFullYear.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setFullYear.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setFullYear/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setFullYear/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setFullYear.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setFullYear.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setHours/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setHours/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setHours.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setHours.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setHours/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setHours/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setHours.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setHours.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMilliseconds/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMilliseconds/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMilliseconds.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setMilliseconds.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMilliseconds/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMilliseconds/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMilliseconds.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setMilliseconds.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMinutes/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMinutes/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMinutes.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setMinutes.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMinutes/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMinutes/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMinutes.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setMinutes.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMonth/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMonth/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMonth.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setMonth.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setMonth/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setMonth/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setMonth.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setMonth.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setSeconds/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setSeconds/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setSeconds.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setSeconds.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setSeconds/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setSeconds/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setSeconds.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setSeconds.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setTime/this-value-non-date.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setTime/this-value-non-date.js
@@ -36,11 +36,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setTime.call([], arg);
 }, 'array exotic object');
 
 assert.throws(TypeError, function() {
   setTime.call(args, arg);
 }, 'arguments exotic object');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Date/prototype/setTime/this-value-non-object.js
+++ b/js/src/tests/test262/built-ins/Date/prototype/setTime/this-value-non-object.js
@@ -46,11 +46,11 @@ assert.throws(TypeError, function() {
 assert.throws(TypeError, function() {
   setTime.call('', arg);
 }, 'string');
 
 assert.throws(TypeError, function() {
   setTime.call(symbol, arg);
 }, 'symbol');
 
-assert.sameValue(callCount, 0, 'validation preceeds input coercion');
+assert.sameValue(callCount, 0, 'validation precedes input coercion');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-generator-function.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-generator-function.js
@@ -9,16 +9,16 @@ info: |
   If Type(func) is Object and IsCallable(func) is true, then return an
   implementation-dependent String source code representation of func.
   The representation must have the syntax of a NativeFunction.
   ...
 
   NativeFunction:
     function IdentifierName_opt ( FormalParameters ) { [ native code ] }
 
-features: [async-functions, generators, Proxy]
+features: [async-iteration, Proxy]
 includes: [nativeFunctionMatcher.js]
 ---*/
 
 assertNativeFunction(new Proxy(async function * () {}, {}));
 assertNativeFunction(new Proxy(async function * () {}, { apply() {} }).apply);
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-generator-method-definition.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-generator-method-definition.js
@@ -9,16 +9,16 @@ info: |
   If Type(func) is Object and IsCallable(func) is true, then return an
   implementation-dependent String source code representation of func.
   The representation must have the syntax of a NativeFunction.
   ...
 
   NativeFunction:
     function IdentifierName_opt ( FormalParameters ) { [ native code ] }
 
-features: [async-functions, generators, Proxy]
+features: [async-iteration, Proxy]
 includes: [nativeFunctionMatcher.js]
 ---*/
 
 assertNativeFunction(new Proxy({ async * method() {} }.method, {}));
 assertNativeFunction(new Proxy({ async * method() {} }.method, { apply() {} }).apply);
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-method-definition.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/proxy-async-method-definition.js
@@ -9,16 +9,16 @@ info: |
   If Type(func) is Object and IsCallable(func) is true, then return an
   implementation-dependent String source code representation of func.
   The representation must have the syntax of a NativeFunction.
   ...
 
   NativeFunction:
     function IdentifierName_opt ( FormalParameters ) { [ native code ] }
 
-features: [async-functions, generators, Proxy]
+features: [async-functions, Proxy]
 includes: [nativeFunctionMatcher.js]
 ---*/
 
 assertNativeFunction(new Proxy({ async method() {} }.method, {}));
 assertNativeFunction(new Proxy({ async method() {} }.method, { apply() {} }).apply);
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/GeneratorFunction/invoked-as-function-multiple-arguments.js
+++ b/js/src/tests/test262/built-ins/GeneratorFunction/invoked-as-function-multiple-arguments.js
@@ -1,17 +1,17 @@
 // Copyright (C) 2013 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 /*---
 es6id: 25.2
 description: >
     When invoked via the function invocation pattern with multiple arguments,
     the GeneratorFunction intrinsic creates a valid generator whose body is the
     last argument evaluated as source code and whose formal parameters are
-    defined by the preceeding arguments.
+    defined by the preceding arguments.
 features: [generators]
 ---*/
 
 var GeneratorFunction = Object.getPrototypeOf(function*() {}).constructor;
 
 var g = GeneratorFunction('x', 'y', 'yield x + y;');
 var iter = g(2, 3);
 var result;
--- a/js/src/tests/test262/built-ins/Object/prototype/toString/proxy-function.js
+++ b/js/src/tests/test262/built-ins/Object/prototype/toString/proxy-function.js
@@ -9,17 +9,17 @@ info: |
 
   9.5.14 ProxyCreate(target, handler)
 
   [...]
   7. If IsCallable(target) is true, then
     a. Set the [[Call]] internal method of P as specified in 9.5.12.
   [...]
 
-features: [Proxy, Symbol.toStringTag]
+features: [generators, Proxy, Symbol.toStringTag]
 ---*/
 
 var functionProxy = new Proxy(function() {}, {});
 var functionProxyProxy = new Proxy(functionProxy, {});
 
 assert.sameValue(
   Object.prototype.toString.call(functionProxy), '[object Function]', 'function proxy'
 );
--- a/js/src/tests/test262/built-ins/Promise/all/ctx-ctor.js
+++ b/js/src/tests/test262/built-ins/Promise/all/ctx-ctor.js
@@ -23,17 +23,17 @@ var callCount = 0;
 class SubPromise extends Promise {
   constructor(a) {
     super(a);
     executor = a;
     callCount += 1;
   }
 }
 
-var instance = Promise.all.call(SubPromise);
+var instance = Promise.all.call(SubPromise, []);
 
 assert.sameValue(instance.constructor, SubPromise);
 assert.sameValue(instance instanceof SubPromise, true);
 
 assert.sameValue(callCount, 1);
 assert.sameValue(typeof executor, 'function');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Promise/race/ctx-ctor.js
+++ b/js/src/tests/test262/built-ins/Promise/race/ctx-ctor.js
@@ -23,17 +23,17 @@ var callCount = 0;
 class SubPromise extends Promise {
   constructor(a) {
     super(a);
     executor = a;
     callCount += 1;
   }
 }
 
-var instance = Promise.race.call(SubPromise);
+var instance = Promise.race.call(SubPromise, []);
 
 assert.sameValue(instance.constructor, SubPromise);
 assert.sameValue(instance instanceof SubPromise, true);
 
 assert.sameValue(callCount, 1);
 assert.sameValue(typeof executor, 'function');
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Digit class escape, \\d with flags ug
+    Compare range for digit class escape \d with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,31 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x0030, 0x0039],
+    ],
+});
 
 const re = /\d/ug;
-const matchingRange = /[0-9]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Digit class escape, \\d+ with flags ug
+    Compare range for digit class escape \d+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,31 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x0030, 0x0039],
+    ],
+});
 
 const re = /\d+/ug;
-const matchingRange = /[0-9]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Digit class escape, \\d+ with flags g
+    Compare range for digit class escape \d+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,31 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x0030, 0x0039],
+    ],
+});
 
 const re = /\d+/g;
-const matchingRange = /[0-9]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-digit-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Digit class escape, \\d with flags g
+    Compare range for digit class escape \d with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,31 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x0030, 0x0039],
+    ],
+});
 
 const re = /\d/g;
-const matchingRange = /[0-9]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Digit class escape, \\D with flags ug
+    Compare range for non-digit class escape \D with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,32 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x000000, 0x00002F],
+        [0x00003A, 0x10FFFF],
+    ],
+});
 
 const re = /\D/ug;
-const matchingRange = /[\0-\/:-\u{10FFFF}]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Digit class escape, \\D+ with flags ug
+    Compare range for non-digit class escape \D+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,32 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+  loneCodePoints: [],
+  ranges: [
+      [0x000000, 0x00002F],
+      [0x00003A, 0x10FFFF],
+  ],
+});
 
 const re = /\D+/ug;
-const matchingRange = /[\0-\/:-\u{10FFFF}]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Digit class escape, \\D+ with flags g
+    Compare range for non-digit class escape \D+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,32 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+  loneCodePoints: [],
+  ranges: [
+      [0x000000, 0x00002F],
+      [0x00003A, 0x00FFFF],
+  ],
+});
 
 const re = /\D+/g;
-const matchingRange = /[\0-\/:-\uFFFF]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-digit-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Digit class escape, \\D with flags g
+    Compare range for non-digit class escape \D with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,32 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+  loneCodePoints: [],
+  ranges: [
+      [0x000000, 0x00002F],
+      [0x00003A, 0x00FFFF],
+  ],
+});
 
 const re = /\D/g;
-const matchingRange = /[\0-\/:-\uFFFF]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non whitespace class escape, \\S with flags ug
+    Compare range for non-whitespace class escape \S with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,43 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x000008],
+        [0x00000E, 0x00001F],
+        [0x000021, 0x00009F],
+        [0x0000A1, 0x00167F],
+        [0x001681, 0x001FFF],
+        [0x00200B, 0x002027],
+        [0x00202A, 0x00202E],
+        [0x002030, 0x00205E],
+        [0x002060, 0x002FFF],
+        [0x003001, 0x00DBFF],
+        [0x00E000, 0x00FEFE],
+        [0x00FF00, 0x10FFFF],
+    ],
+});
 
 const re = /\S/ug;
-const matchingRange = /[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uFEFE\uFF00-\u{10FFFF}]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non whitespace class escape, \\S+ with flags ug
+    Compare range for non-whitespace class escape \S+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,43 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x000008],
+        [0x00000E, 0x00001F],
+        [0x000021, 0x00009F],
+        [0x0000A1, 0x00167F],
+        [0x001681, 0x001FFF],
+        [0x00200B, 0x002027],
+        [0x00202A, 0x00202E],
+        [0x002030, 0x00205E],
+        [0x002060, 0x002FFF],
+        [0x003001, 0x00DBFF],
+        [0x00E000, 0x00FEFE],
+        [0x00FF00, 0x10FFFF],
+    ],
+});
 
 const re = /\S+/ug;
-const matchingRange = /[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uFEFE\uFF00-\u{10FFFF}]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non whitespace class escape, \\S+ with flags g
+    Compare range for non-whitespace class escape \S+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,43 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x000008],
+        [0x00000E, 0x00001F],
+        [0x000021, 0x00009F],
+        [0x0000A1, 0x00167F],
+        [0x001681, 0x001FFF],
+        [0x00200B, 0x002027],
+        [0x00202A, 0x00202E],
+        [0x002030, 0x00205E],
+        [0x002060, 0x002FFF],
+        [0x003001, 0x00DBFF],
+        [0x00E000, 0x00FEFE],
+        [0x00FF00, 0x00FFFF],
+    ],
+});
 
 const re = /\S+/g;
-const matchingRange = /[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uFEFE\uFF00-\uFFFF]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-whitespace-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non whitespace class escape, \\S with flags g
+    Compare range for non-whitespace class escape \S with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,43 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x000008],
+        [0x00000E, 0x00001F],
+        [0x000021, 0x00009F],
+        [0x0000A1, 0x00167F],
+        [0x001681, 0x001FFF],
+        [0x00200B, 0x002027],
+        [0x00202A, 0x00202E],
+        [0x002030, 0x00205E],
+        [0x002060, 0x002FFF],
+        [0x003001, 0x00DBFF],
+        [0x00E000, 0x00FEFE],
+        [0x00FF00, 0x00FFFF],
+    ],
+});
 
 const re = /\S/g;
-const matchingRange = /[\0-\x08\x0E-\x1F!-\x9F\xA1-\u167F\u1681-\u1FFF\u200B-\u2027\u202A-\u202E\u2030-\u205E\u2060-\u2FFF\u3001-\uFEFE\uFF00-\uFFFF]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Word class escape, \\W with flags ug
+    Compare range for non-word class escape \W with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,36 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [0x000060],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x00002F],
+        [0x00003A, 0x000040],
+        [0x00005B, 0x00005E],
+        [0x00007B, 0x00DBFF],
+        [0x00E000, 0x10FFFF],
+    ],
+});
 
 const re = /\W/ug;
-const matchingRange = /[\0-\/:-@\[-\^`\{-\u{10FFFF}]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Word class escape, \\W+ with flags ug
+    Compare range for non-word class escape \W+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,36 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [0x000060],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x00002F],
+        [0x00003A, 0x000040],
+        [0x00005B, 0x00005E],
+        [0x00007B, 0x00DBFF],
+        [0x00E000, 0x10FFFF],
+    ],
+});
 
 const re = /\W+/ug;
-const matchingRange = /[\0-\/:-@\[-\^`\{-\u{10FFFF}]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Word class escape, \\W+ with flags g
+    Compare range for non-word class escape \W+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,36 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [0x000060],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x00002F],
+        [0x00003A, 0x000040],
+        [0x00005B, 0x00005E],
+        [0x00007B, 0x00DBFF],
+        [0x00E000, 0x00FFFF],
+    ],
+});
 
 const re = /\W+/g;
-const matchingRange = /[\0-\/:-@\[-\^`\{-\uFFFF]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-non-word-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Non Word class escape, \\W with flags g
+    Compare range for non-word class escape \W with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,36 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [0x000060],
+    ranges: [
+        [0x00DC00, 0x00DFFF],
+        [0x000000, 0x00002F],
+        [0x00003A, 0x000040],
+        [0x00005B, 0x00005E],
+        [0x00007B, 0x00DBFF],
+        [0x00E000, 0x00FFFF],
+    ],
+});
 
 const re = /\W/g;
-const matchingRange = /[\0-\/:-@\[-\^`\{-\uFFFF]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Whitespace class escape, \\s with flags ug
+    Compare range for whitespace class escape \s with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,41 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [
+        0x000020,
+        0x0000A0,
+        0x001680,
+        0x00202F,
+        0x00205F,
+        0x003000,
+        0x00FEFF,
+    ],
+    ranges: [
+        [0x000009, 0x00000D],
+        [0x002000, 0x00200A],
+        [0x002028, 0x002029],
+    ],
+});
 
 const re = /\s/ug;
-const matchingRange = /[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Whitespace class escape, \\s+ with flags ug
+    Compare range for whitespace class escape \s+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,41 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [
+        0x000020,
+        0x0000A0,
+        0x001680,
+        0x00202F,
+        0x00205F,
+        0x003000,
+        0x00FEFF,
+    ],
+    ranges: [
+        [0x000009, 0x00000D],
+        [0x002000, 0x00200A],
+        [0x002028, 0x002029],
+    ],
+});
 
 const re = /\s+/ug;
-const matchingRange = /[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Whitespace class escape, \\s+ with flags g
+    Compare range for whitespace class escape \s+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,41 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [
+        0x000020,
+        0x0000A0,
+        0x001680,
+        0x00202F,
+        0x00205F,
+        0x003000,
+        0x00FEFF,
+    ],
+    ranges: [
+        [0x000009, 0x00000D],
+        [0x002000, 0x00200A],
+        [0x002028, 0x002029],
+    ],
+});
 
 const re = /\s+/g;
-const matchingRange = /[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-whitespace-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Whitespace class escape, \\s with flags g
+    Compare range for whitespace class escape \s with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,41 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [
+        0x000020,
+        0x0000A0,
+        0x001680,
+        0x00202F,
+        0x00205F,
+        0x003000,
+        0x00FEFF,
+    ],
+    ranges: [
+        [0x000009, 0x00000D],
+        [0x002000, 0x00200A],
+        [0x002028, 0x002029],
+    ],
+});
 
 const re = /\s/g;
-const matchingRange = /[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Word class escape, \\w with flags ug
+    Compare range for word class escape \w with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,33 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [0x00005F],
+    ranges: [
+        [0x000030, 0x000039],
+        [0x000041, 0x00005A],
+        [0x000061, 0x00007A],
+    ],
+});
 
 const re = /\w/ug;
-const matchingRange = /[0-9A-Z_a-z]/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-plus-quantifier-flags-u.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-plus-quantifier-flags-u.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Word class escape, \\w+ with flags ug
+    Compare range for word class escape \w+ with flags ug
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,33 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0x10FFFF]]});
+const str = buildString({
+    loneCodePoints: [0x00005F],
+    ranges: [
+        [0x000030, 0x000039],
+        [0x000041, 0x00005A],
+        [0x000061, 0x00007A],
+    ],
+});
 
 const re = /\w+/ug;
-const matchingRange = /[0-9A-Z_a-z]+/ug;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-plus-quantifier.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape-plus-quantifier.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Word class escape, \\w+ with flags g
+    Compare range for word class escape \w+ with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,33 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [0x00005F],
+    ranges: [
+        [0x000030, 0x000039],
+        [0x000041, 0x00005A],
+        [0x000061, 0x00007A],
+    ],
+});
 
 const re = /\w+/g;
-const matchingRange = /[0-9A-Z_a-z]+/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
--- a/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape.js
+++ b/js/src/tests/test262/built-ins/RegExp/CharacterClassEscapes/character-class-word-class-escape.js
@@ -1,29 +1,30 @@
 // Copyright (C) 2018 Leo Balter.  All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: prod-CharacterClassEscape
 description: >
-    Compare range for Word class escape, \\w with flags g
+    Compare range for word class escape \w with flags g
 info: |
-    This is a generated test, please checkout https://github.com/bocoup/test262-regexp-generator
+    This is a generated test. Please check out
+    https://github.com/bocoup/test262-regexp-generator
     for any changes.
 
     CharacterClassEscape[U] ::
         d
         D
         s
         S
         w
         W
 
     21.2.2.12 CharacterClassEscape
-    
+
     The production CharacterClassEscape :: d evaluates as follows:
         Return the ten-element set of characters containing the characters 0 through 9 inclusive.
     The production CharacterClassEscape :: D evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: d.
     The production CharacterClassEscape :: s evaluates as follows:
         Return the set of characters containing the characters that are on the right-hand side of
         the WhiteSpace or LineTerminator productions.
     The production CharacterClassEscape :: S evaluates as follows:
@@ -31,31 +32,33 @@ info: |
     The production CharacterClassEscape :: w evaluates as follows:
         Return the set of all characters returned by WordCharacters().
     The production CharacterClassEscape :: W evaluates as follows:
         Return the set of all characters not included in the set returned by CharacterClassEscape :: w.
 features: [String.fromCodePoint]
 includes: [regExpUtils.js]
 ---*/
 
-const str = buildString({loneCodePoints: [], ranges: [[0, 0xFFFF]]});
+const str = buildString({
+    loneCodePoints: [0x00005F],
+    ranges: [
+        [0x000030, 0x000039],
+        [0x000041, 0x00005A],
+        [0x000061, 0x00007A],
+    ],
+});
 
 const re = /\w/g;
-const matchingRange = /[0-9A-Z_a-z]/g;
 
 const errors = [];
 
-function matching(str) {
-    return str.replace(re, '') === str.replace(matchingRange, '');
-}
-
-if (!matching(str)) {
+if (!re.test(str)) {
     // Error, let's find out where
     for (const char of str) {
-        if (!matching(char)) {
+        if (!re.test(char)) {
             errors.push('0x' + char.codePointAt(0).toString(16));
         }
     }
 }
 
 assert.sameValue(
     errors.length,
     0,
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/RegExp/named-groups/non-unicode-malformed.js
+++ /dev/null
@@ -1,38 +0,0 @@
-// |reftest| skip -- regexp-named-groups is not supported
-// Copyright 2017 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: >
-  Named groups in Unicode RegExps have some syntax errors and some
-  compatibility escape fallback behavior.
-esid: prod-GroupSpecifier
-features: [regexp-named-groups]
-includes: [compareArray.js]
----*/
-
-assert.throws(SyntaxError, () => eval("/(?<>a)/"));
-assert.throws(SyntaxError, () => eval("/(?<aa)/"));
-assert.throws(SyntaxError, () => eval("/(?<42a>a)/"));
-assert.throws(SyntaxError, () => eval("/(?<:a>a)/"));
-assert.throws(SyntaxError, () => eval("/(?<a:>a)/"));
-assert.throws(SyntaxError, () => eval("/(?<a>a)(?<a>a)/"));
-assert.throws(SyntaxError, () => eval("/(?<a>a)(?<b>b)(?<a>a)/"));
-
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k/"));
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<a/"));
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<>/"));
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<b>/"));
-assert.throws(SyntaxError, () => eval("/(?<a>a)\\k<ab>/"));
-assert.throws(SyntaxError, () => eval("/(?<ab>a)\\k<a>/"));
-assert.throws(SyntaxError, () => eval("/\\k<a>(?<ab>a)/"));
-assert.throws(SyntaxError, () => eval("/\\k<a(?<a>a)/"));
-
-// A couple of corner cases around '\k' as named back-references vs. identity
-// escapes.
-assert(/\k<a>(?<a>x)/.test("x"));
-assert.throws(SyntaxError, () => eval("/\\k<a>(?<b>x)/"));
-assert.throws(SyntaxError, () => eval("/\\k<a(?<a>.)/"));
-assert.throws(SyntaxError, () => eval("/\\k(?<a>.)/"));
-
-reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/RegExp/named-groups/non-unicode-property-names.js
+++ b/js/src/tests/test262/built-ins/RegExp/named-groups/non-unicode-property-names.js
@@ -1,47 +1,26 @@
 // |reftest| skip -- regexp-named-groups is not supported
 // Copyright 2017 the V8 project authors. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 description: Exotic named group names in non-Unicode RegExps
 esid: prod-GroupSpecifier
 features: [regexp-named-groups]
-includes: [compareArray.js]
 ---*/
 
 assert.sameValue("a", /(?<π>a)/.exec("bab").groups.π);
-assert.throws(SyntaxError, () => eval('/(?<\\u{03C0}>a)/'), "\\u{} escapes allowed only in Unicode mode");
 assert.sameValue("a", /(?<π>a)/.exec("bab").groups.\u03C0);
 assert.sameValue("a", /(?<$>a)/.exec("bab").groups.$);
 assert.sameValue("a", /(?<_>a)/.exec("bab").groups._);
-assert.throws(SyntaxError, () => eval('/(?<$𐒤>a)/'), "Individual surrogates not in ID_Continue");
 assert.sameValue("a", /(?<_\u200C>a)/.exec("bab").groups._\u200C);
 assert.sameValue("a", /(?<_\u200D>a)/.exec("bab").groups._\u200D);
 assert.sameValue("a", /(?<ಠ_ಠ>a)/.exec("bab").groups.ಠ_ಠ);
-assert.throws(SyntaxError, () => eval('/(?<❤>a)/'));
-assert.throws(SyntaxError, () => eval('/(?<𐒤>a)/'), "Individual surrogate not in ID_Start.");
 
 // Unicode escapes in capture names.
-assert.throws(SyntaxError, () => eval("/(?<a\\uD801\uDCA4>.)/"));
-assert.throws(SyntaxError, () => eval("/(?<a\\uD801>.)/"));
-assert.throws(SyntaxError, () => eval("/(?<a\\uDCA4>.)/"));
 assert(/(?<\u0041>.)/.test("a"));
-assert.throws(SyntaxError, () => eval("/(?<a\\u{104A4}>.)/"));
-assert.throws(SyntaxError, () => eval("/(?<a\\u{10FFFF}>.)/"));
-assert.throws(SyntaxError, () => eval("/(?<a\uD801>.)/"), "Lea");
-assert.throws(SyntaxError, () => eval("/(?<a\uDCA4>.)/"), "Trai");
 assert(RegExp("(?<\u{0041}>.)").test("a"), "Non-surrogate");
 
-// Bracketed escapes are not allowed;
 // 4-char escapes must be the proper ID_Start/ID_Continue
-assert.throws(SyntaxError, () => eval("/(?<a\\uD801>.)/"), "Lead");
-assert.throws(SyntaxError, () => eval("/(?<a\\uDCA4>.)/"), "Trail");
-assert.throws(SyntaxError, () => eval("/(?<\\u{0041}>.)/"), "Non-surrogate");
-assert.throws(SyntaxError, () => eval("/(?<a\\u{104A4}>.)/"), "Surrogate, ID_Continue");
 assert(RegExp("(?<\\u0041>.)").test("a"), "Non-surrogate");
 
-// Backslash is not allowed as ID_Start and ID_Continue
-assert.throws(SyntaxError, () => eval("/(?<\\>.)/"), "'\' misclassified as ID_Start");
-assert.throws(SyntaxError, () => eval("/(?<a\\>.)/"), "'\' misclassified as ID_Continue");
-
 reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/RegExp/named-groups/unicode-malformed.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// |reftest| skip -- regexp-named-groups is not supported
-// Copyright 2017 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-description: Various syntax errors for Unicode RegExps containing named groups
-esid: prod-GroupSpecifier
-features: [regexp-named-groups]
----*/
-
-assert.throws(SyntaxError, () => eval("/(?<>a)/u"), "Empty name");
-assert.throws(SyntaxError, () => eval("/(?<aa)/u"), "Unterminated name");
-assert.throws(SyntaxError, () => eval("/(?<42a>a)/u"), "Name starting with digits");
-assert.throws(SyntaxError, () => eval("/(?<:a>a)/u"), "Name starting with invalid char");
-assert.throws(SyntaxError, () => eval("/(?<a:>a)/u"), "Name containing with invalid char");
-assert.throws(SyntaxError, () => eval("/(?<a>a)(?<a>a)/u"), "Duplicate name");
-assert.throws(SyntaxError, () => eval("/(?<a>a)(?<b>b)(?<a>a)/u"), "Duplicate name");
-assert.throws(SyntaxError, () => eval("/\\k<a>/u"), "Invalid reference");
-assert.throws(SyntaxError, () => eval("/\\k<a/u"), "Unterminated reference");
-assert.throws(SyntaxError, () => eval("/\\k<>/u"), "Empty reference");
-assert.throws(SyntaxError, () => eval("/\\k/u"), "Lone \k");
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k/u"), "Lone \k");
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<a/u"), "Unterminated reference");
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<>/u"), "Empty reference");
-assert.throws(SyntaxError, () => eval("/(?<a>.)\\k<b>/u"), "Invalid reference");
-assert.throws(SyntaxError, () => eval("/(?<a>a)\\k<ab>/u"), "Invalid reference");
-assert.throws(SyntaxError, () => eval("/(?<ab>a)\\k<a>/u"), "Invalid reference");
-assert.throws(SyntaxError, () => eval("/\\k<a>(?<ab>a)/u"), "Invalid reference");
-assert.throws(SyntaxError, () => eval("/(?<a>\\a)/u"), "Identity escape in capture");
-
-
-reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/RegExp/named-groups/unicode-property-names.js
+++ b/js/src/tests/test262/built-ins/RegExp/named-groups/unicode-property-names.js
@@ -13,37 +13,21 @@ assert.sameValue("a", /(?<\u{03C0}>a)/u.exec("bab").groups.π);
 assert.sameValue("a", /(?<π>a)/u.exec("bab").groups.\u03C0);
 assert.sameValue("a", /(?<\u{03C0}>a)/u.exec("bab").groups.\u03C0);
 assert.sameValue("a", /(?<$>a)/u.exec("bab").groups.$);
 assert.sameValue("a", /(?<_>a)/u.exec("bab").groups._);
 assert.sameValue("a", /(?<$𐒤>a)/u.exec("bab").groups.$𐒤);
 assert.sameValue("a", /(?<_\u200C>a)/u.exec("bab").groups._\u200C);
 assert.sameValue("a", /(?<_\u200D>a)/u.exec("bab").groups._\u200D);
 assert.sameValue("a", /(?<ಠ_ಠ>a)/u.exec("bab").groups.ಠ_ಠ);
-assert.throws(SyntaxError, () => eval('/(?<❤>a)/u'));
-assert.throws(SyntaxError, () => eval('/(?<𐒤>a)/u'), "ID_Continue but not ID_Start.");
 
 // Unicode escapes in capture names.
 assert(/(?<a\uD801\uDCA4>.)/u.test("a"), "\\u Lead \\u Trail");
-assert.throws(SyntaxError, () => eval("/(?<a\\uD801>.)/u"), "\\u Lea");
-assert.throws(SyntaxError, () => eval("/(?<a\\uDCA4>.)/u"), "\\u Trai");
 assert(/(?<\u0041>.)/u.test("a"), "\\u NonSurrogate");
 assert(/(?<\u{0041}>.)/u.test("a"), "\\u{ Non-surrogate }");
 assert(/(?<a\u{104A4}>.)/u.test("a"), "\\u{ Surrogate, ID_Continue }");
-assert.throws(SyntaxError, () => eval("/(?<a\\u{110000}>.)/u"), "\\u{ Out-of-bounds ");
-assert.throws(SyntaxError, () => eval("/(?<a\uD801>.)/u"), "Lea");
-assert.throws(SyntaxError, () => eval("/(?<a\uDCA4>.)/u"), "Trai");
 assert(RegExp("(?<\u{0041}>.)", "u").test("a"), "Non-surrogate");
 assert(RegExp("(?<a\u{104A4}>.)", "u").test("a"), "Surrogate,ID_Continue");
-
-// Bracketed escapes are not allowed;
-// 4-char escapes must be the proper ID_Start/ID_Continue
-assert.throws(SyntaxError, () => eval("/(?<a\\uD801>.)/u"), "Lead");
-assert.throws(SyntaxError, () => eval("/(?<a\\uDCA4>.)/u"), "Trail");
 assert((/(?<\u{0041}>.)/u).test("a"), "Non-surrogate");
 assert(/(?<a\u{104A4}>.)/u.test("a"), "Surrogate, ID_Continue");
 assert(RegExp("(?<\\u0041>.)", "u").test("a"), "Non-surrogate");
 
-// Backslash is not allowed as ID_Start and ID_Continue
-assert.throws(SyntaxError, () => eval("/(?<\\>.)/u"), "'\' misclassified as ID_Start");
-assert.throws(SyntaxError, () => eval("/(?<a\\>.)/u"), "'\' misclassified as ID_Continue");
-
 reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=F}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=F}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Invalid-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Invalid-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=Invalid}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Invalid.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Invalid.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=Invalid}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_N-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_N-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=N}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_N.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_N.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=N}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_No-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_No-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=No}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_No.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_No.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=No}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_T-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_T-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=T}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_T.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_T.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=T}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Y-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Y-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=Y}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Y.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Y.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=Y}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Yes-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Yes-negated.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\P{ASCII=Yes}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Yes.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_Yes.js
@@ -9,11 +9,11 @@ description: >
   escapes (even if the value is valid).
 esid: sec-static-semantics-unicodematchproperty-p
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /\p{ASCII=Yes}/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-end.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-end.js
@@ -11,11 +11,11 @@ description: >
   true or IsCharacterClass of the second ClassAtom is true.
 esid: sec-patterns-static-semantics-early-errors
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /[--\p{Hex}]/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-no-dash-end.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-no-dash-end.js
@@ -11,11 +11,11 @@ description: >
   IsCharacterClass of ClassAtom is true.
 esid: sec-patterns-static-semantics-early-errors
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /[\uFFFF-\p{Hex}]/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-no-dash-start.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-no-dash-start.js
@@ -11,11 +11,11 @@ description: >
   IsCharacterClass of ClassAtom is true.
 esid: sec-patterns-static-semantics-early-errors
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /[\p{Hex}-\uFFFF]/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-start.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class-range-start.js
@@ -11,11 +11,11 @@ description: >
   true or IsCharacterClass of the second ClassAtom is true.
 esid: sec-patterns-static-semantics-early-errors
 negative:
   phase: parse
   type: SyntaxError
 features: [regexp-unicode-property-escapes]
 ---*/
 
-throw "Test262: This statement should not be evaluated.";
+$DONOTEVALUATE();
 
 /[\p{Hex}--]/u;
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/grammar-extension-In-prefix-Block-implicit-negated.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/grammar-extension-In-prefix-Block-implicit-negated.js
@@ -12,11 +12,11 @@ description: >
     [+U] P{ UnicodePropertyValueExpression }
 esid: prod-CharacterClassEscape
 negative: