Merge m-c to autoland. a=merge
authorRyan VanderMeulen <ryanvm@gmail.com>
Fri, 19 May 2017 12:26:48 -0400
changeset 359325 a4e84d8efb1939109c76347444bb325259b7d8c0
parent 359324 190c25686f1cf06876f78b8b476b37af62ec6ad9 (current diff)
parent 359275 c800b6dfca673f8cb0f3cf41e4f495755d04bbb3 (diff)
child 359326 c219c4a401b04e37f8c75439fe9af81425e4f8f1
push id90494
push userkwierso@gmail.com
push dateFri, 19 May 2017 22:19:13 +0000
treeherdermozilla-inbound@cd9b1ab819e8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone55.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 m-c to autoland. a=merge
dom/ipc/TabChild.cpp
js/src/tests/test262/built-ins/Array/prototype/every/15.4.4.16-2-15.js
js/src/tests/test262/built-ins/Array/prototype/every/15.4.4.16-7-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-2-15.js
js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-9-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-2-15.js
js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-7-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-1-17.js
js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-2-15.js
js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-9-b-i-23.js
js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-1-17.js
js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-2-15.js
js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-8-b-i-23.js
js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-2-15.js
js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-8-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-2-15.js
js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-8-b-iii-1-23.js
js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-9-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-2-15.js
js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-8-b-iii-1-23.js
js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-9-c-i-23.js
js/src/tests/test262/built-ins/Array/prototype/slice/create-species-undef-invalid-len.js
js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-2-15.js
js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-7-c-i-23.js
js/src/tests/test262/built-ins/Simd/AUTHORS
js/src/tests/test262/built-ins/Simd/all_true.js
js/src/tests/test262/built-ins/Simd/any_true.js
js/src/tests/test262/built-ins/Simd/bit_conversion.js
js/src/tests/test262/built-ins/Simd/bit_preservation.js
js/src/tests/test262/built-ins/Simd/browser.js
js/src/tests/test262/built-ins/Simd/check.js
js/src/tests/test262/built-ins/Simd/constructor.js
js/src/tests/test262/built-ins/Simd/float_operators.js
js/src/tests/test262/built-ins/Simd/from.js
js/src/tests/test262/built-ins/Simd/from_bits.js
js/src/tests/test262/built-ins/Simd/loadn.js
js/src/tests/test262/built-ins/Simd/logical_operators.js
js/src/tests/test262/built-ins/Simd/negate.js
js/src/tests/test262/built-ins/Simd/not.js
js/src/tests/test262/built-ins/Simd/numerical_operators.js
js/src/tests/test262/built-ins/Simd/operators.js
js/src/tests/test262/built-ins/Simd/replace_lane.js
js/src/tests/test262/built-ins/Simd/round_trip.js
js/src/tests/test262/built-ins/Simd/saturate.js
js/src/tests/test262/built-ins/Simd/select.js
js/src/tests/test262/built-ins/Simd/shell.js
js/src/tests/test262/built-ins/Simd/shift_operator.js
js/src/tests/test262/built-ins/Simd/shuffle.js
js/src/tests/test262/built-ins/Simd/storen.js
js/src/tests/test262/built-ins/Simd/swizzle.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-function-declaration-with-function-declaration-strict.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-function-declaration-with-let.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-function-declaration-with-var.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-var-binding-with-let.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/attempt-to-redeclare-var-with-function-declaration.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/browser.js
js/src/tests/test262/language/block-scope/syntax/redeclaration-in-block/shell.js
js/src/tests/test262/language/expressions/addition/S9.3_A1_T2.js
js/src/tests/test262/language/expressions/addition/S9.3_A2_T2.js
js/src/tests/test262/language/expressions/addition/S9.3_A3_T2.js
js/src/tests/test262/language/expressions/addition/S9.3_A4.1_T2.js
js/src/tests/test262/language/expressions/addition/S9.3_A4.2_T2.js
js/src/tests/test262/language/expressions/addition/S9.3_A5_T2.js
js/src/tests/test262/language/expressions/assignment/11.13.1-1-1.js
js/src/tests/test262/language/expressions/assignment/11.13.1-1-2.js
js/src/tests/test262/language/expressions/assignment/11.13.1-1-3.js
js/src/tests/test262/language/expressions/assignment/11.13.1-1-4.js
js/src/tests/test262/language/expressions/generators/yield-as-label.js
js/src/tests/test262/language/expressions/object/method-definition/yield-as-binding-identifier.js
js/src/tests/test262/language/expressions/object/method-definition/yield-as-label.js
js/src/tests/test262/language/future-reserved-words/7.6.1-17-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-18-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-19-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-20-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-21-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-22-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-23-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-24-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1-25-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-1-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-10-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-11-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-12-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-13-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-14-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-16-s.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-2-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-3-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-4-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-5-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-6-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-7-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-8-s-strict.js
js/src/tests/test262/language/future-reserved-words/7.6.1.2-9-s-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.1.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.10.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.11.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.12.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.13.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.14.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.15-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.15ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.16.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.17.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.18-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.18ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.19.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.2.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.20.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.21-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.21ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.22-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.22ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.23-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.23ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.24-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.24ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.25.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.26-strict.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.26ns.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.27.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.28.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.29.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.3.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.30.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.31.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.4.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.5.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.6.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.7.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.8.js
js/src/tests/test262/language/future-reserved-words/S7.6.1.2_A1.9.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.1.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.10.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.11.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.12.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.13.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.14.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.15.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.16.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.17.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.18.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.19.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.2.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.20.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.21.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.22.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.23.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.24.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.25.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.3.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.4.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.5.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.6.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.7.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.8.js
js/src/tests/test262/language/keywords/S7.6.1.1_A1.9.js
js/src/tests/test262/language/reserved-words/7.6.1-1-1.js
js/src/tests/test262/language/reserved-words/7.6.1-1-10.js
js/src/tests/test262/language/reserved-words/7.6.1-1-11.js
js/src/tests/test262/language/reserved-words/7.6.1-1-12.js
js/src/tests/test262/language/reserved-words/7.6.1-1-13.js
js/src/tests/test262/language/reserved-words/7.6.1-1-14.js
js/src/tests/test262/language/reserved-words/7.6.1-1-15.js
js/src/tests/test262/language/reserved-words/7.6.1-1-16.js
js/src/tests/test262/language/reserved-words/7.6.1-1-2.js
js/src/tests/test262/language/reserved-words/7.6.1-1-3.js
js/src/tests/test262/language/reserved-words/7.6.1-1-4.js
js/src/tests/test262/language/reserved-words/7.6.1-1-5.js
js/src/tests/test262/language/reserved-words/7.6.1-1-6.js
js/src/tests/test262/language/reserved-words/7.6.1-1-7.js
js/src/tests/test262/language/reserved-words/7.6.1-1-8.js
js/src/tests/test262/language/reserved-words/7.6.1-1-9.js
js/src/tests/test262/language/reserved-words/7.6.1-2-1.js
js/src/tests/test262/language/reserved-words/7.6.1-2-10.js
js/src/tests/test262/language/reserved-words/7.6.1-2-11.js
js/src/tests/test262/language/reserved-words/7.6.1-2-12.js
js/src/tests/test262/language/reserved-words/7.6.1-2-13.js
js/src/tests/test262/language/reserved-words/7.6.1-2-14.js
js/src/tests/test262/language/reserved-words/7.6.1-2-15.js
js/src/tests/test262/language/reserved-words/7.6.1-2-16.js
js/src/tests/test262/language/reserved-words/7.6.1-2-2.js
js/src/tests/test262/language/reserved-words/7.6.1-2-3.js
js/src/tests/test262/language/reserved-words/7.6.1-2-4.js
js/src/tests/test262/language/reserved-words/7.6.1-2-5.js
js/src/tests/test262/language/reserved-words/7.6.1-2-6.js
js/src/tests/test262/language/reserved-words/7.6.1-2-7.js
js/src/tests/test262/language/reserved-words/7.6.1-2-8.js
js/src/tests/test262/language/reserved-words/7.6.1-2-9.js
js/src/tests/test262/language/reserved-words/7.6.1-3-1.js
js/src/tests/test262/language/reserved-words/7.6.1-3-10.js
js/src/tests/test262/language/reserved-words/7.6.1-3-11.js
js/src/tests/test262/language/reserved-words/7.6.1-3-12.js
js/src/tests/test262/language/reserved-words/7.6.1-3-13.js
js/src/tests/test262/language/reserved-words/7.6.1-3-14.js
js/src/tests/test262/language/reserved-words/7.6.1-3-15.js
js/src/tests/test262/language/reserved-words/7.6.1-3-16.js
js/src/tests/test262/language/reserved-words/7.6.1-3-2.js
js/src/tests/test262/language/reserved-words/7.6.1-3-3.js
js/src/tests/test262/language/reserved-words/7.6.1-3-4.js
js/src/tests/test262/language/reserved-words/7.6.1-3-5.js
js/src/tests/test262/language/reserved-words/7.6.1-3-6.js
js/src/tests/test262/language/reserved-words/7.6.1-3-7.js
js/src/tests/test262/language/reserved-words/7.6.1-3-8.js
js/src/tests/test262/language/reserved-words/7.6.1-3-9.js
js/src/tests/test262/language/reserved-words/7.6.1-4-1.js
js/src/tests/test262/language/reserved-words/7.6.1-4-10.js
js/src/tests/test262/language/reserved-words/7.6.1-4-11.js
js/src/tests/test262/language/reserved-words/7.6.1-4-12.js
js/src/tests/test262/language/reserved-words/7.6.1-4-13.js
js/src/tests/test262/language/reserved-words/7.6.1-4-14.js
js/src/tests/test262/language/reserved-words/7.6.1-4-15.js
js/src/tests/test262/language/reserved-words/7.6.1-4-16.js
js/src/tests/test262/language/reserved-words/7.6.1-4-2.js
js/src/tests/test262/language/reserved-words/7.6.1-4-3.js
js/src/tests/test262/language/reserved-words/7.6.1-4-4.js
js/src/tests/test262/language/reserved-words/7.6.1-4-5.js
js/src/tests/test262/language/reserved-words/7.6.1-4-6.js
js/src/tests/test262/language/reserved-words/7.6.1-4-7.js
js/src/tests/test262/language/reserved-words/7.6.1-4-8.js
js/src/tests/test262/language/reserved-words/7.6.1-4-9.js
js/src/tests/test262/language/reserved-words/7.6.1-5-1.js
js/src/tests/test262/language/reserved-words/7.6.1-5-10.js
js/src/tests/test262/language/reserved-words/7.6.1-5-11.js
js/src/tests/test262/language/reserved-words/7.6.1-5-12.js
js/src/tests/test262/language/reserved-words/7.6.1-5-13.js
js/src/tests/test262/language/reserved-words/7.6.1-5-14.js
js/src/tests/test262/language/reserved-words/7.6.1-5-15.js
js/src/tests/test262/language/reserved-words/7.6.1-5-16.js
js/src/tests/test262/language/reserved-words/7.6.1-5-2.js
js/src/tests/test262/language/reserved-words/7.6.1-5-3.js
js/src/tests/test262/language/reserved-words/7.6.1-5-4.js
js/src/tests/test262/language/reserved-words/7.6.1-5-5.js
js/src/tests/test262/language/reserved-words/7.6.1-5-6.js
js/src/tests/test262/language/reserved-words/7.6.1-5-7.js
js/src/tests/test262/language/reserved-words/7.6.1-5-8.js
js/src/tests/test262/language/reserved-words/7.6.1-5-9.js
js/src/tests/test262/language/reserved-words/7.6.1-6-1.js
js/src/tests/test262/language/reserved-words/7.6.1-6-10.js
js/src/tests/test262/language/reserved-words/7.6.1-6-11.js
js/src/tests/test262/language/reserved-words/7.6.1-6-12.js
js/src/tests/test262/language/reserved-words/7.6.1-6-13.js
js/src/tests/test262/language/reserved-words/7.6.1-6-14.js
js/src/tests/test262/language/reserved-words/7.6.1-6-15.js
js/src/tests/test262/language/reserved-words/7.6.1-6-16.js
js/src/tests/test262/language/reserved-words/7.6.1-6-2.js
js/src/tests/test262/language/reserved-words/7.6.1-6-3.js
js/src/tests/test262/language/reserved-words/7.6.1-6-4.js
js/src/tests/test262/language/reserved-words/7.6.1-6-5.js
js/src/tests/test262/language/reserved-words/7.6.1-6-6.js
js/src/tests/test262/language/reserved-words/7.6.1-6-7.js
js/src/tests/test262/language/reserved-words/7.6.1-6-8.js
js/src/tests/test262/language/reserved-words/7.6.1-6-9.js
js/src/tests/test262/language/reserved-words/7.6.1-7-1.js
js/src/tests/test262/language/reserved-words/7.6.1-7-10.js
js/src/tests/test262/language/reserved-words/7.6.1-7-11.js
js/src/tests/test262/language/reserved-words/7.6.1-7-12.js
js/src/tests/test262/language/reserved-words/7.6.1-7-13.js
js/src/tests/test262/language/reserved-words/7.6.1-7-14.js
js/src/tests/test262/language/reserved-words/7.6.1-7-15.js
js/src/tests/test262/language/reserved-words/7.6.1-7-16.js
js/src/tests/test262/language/reserved-words/7.6.1-7-2.js
js/src/tests/test262/language/reserved-words/7.6.1-7-3.js
js/src/tests/test262/language/reserved-words/7.6.1-7-4.js
js/src/tests/test262/language/reserved-words/7.6.1-7-5.js
js/src/tests/test262/language/reserved-words/7.6.1-7-6.js
js/src/tests/test262/language/reserved-words/7.6.1-7-7.js
js/src/tests/test262/language/reserved-words/7.6.1-7-8.js
js/src/tests/test262/language/reserved-words/7.6.1-7-9.js
js/src/tests/test262/language/reserved-words/7.6.1-8-1.js
js/src/tests/test262/language/reserved-words/7.6.1-8-10.js
js/src/tests/test262/language/reserved-words/7.6.1-8-11.js
js/src/tests/test262/language/reserved-words/7.6.1-8-12.js
js/src/tests/test262/language/reserved-words/7.6.1-8-13.js
js/src/tests/test262/language/reserved-words/7.6.1-8-14.js
js/src/tests/test262/language/reserved-words/7.6.1-8-15.js
js/src/tests/test262/language/reserved-words/7.6.1-8-16.js
js/src/tests/test262/language/reserved-words/7.6.1-8-2.js
js/src/tests/test262/language/reserved-words/7.6.1-8-3.js
js/src/tests/test262/language/reserved-words/7.6.1-8-4.js
js/src/tests/test262/language/reserved-words/7.6.1-8-5.js
js/src/tests/test262/language/reserved-words/7.6.1-8-6.js
js/src/tests/test262/language/reserved-words/7.6.1-8-7.js
js/src/tests/test262/language/reserved-words/7.6.1-8-8.js
js/src/tests/test262/language/reserved-words/7.6.1-8-9.js
js/src/tests/test262/language/reserved-words/7.6.1.2-1gs-strict.js
js/src/tests/test262/language/reserved-words/S7.6.1_A1.1.js
js/src/tests/test262/language/reserved-words/S7.6.1_A1.2.js
js/src/tests/test262/language/reserved-words/S7.6.1_A1.3.js
js/src/tests/test262/language/reserved-words/S7.6.1_A2.js
js/src/tests/test262/language/statements/class/definition/methods-gen-yield-as-binding-identifier.js
js/src/tests/test262/language/statements/class/definition/methods-gen-yield-as-label.js
js/src/tests/test262/language/statements/generators/yield-as-label.js
js/src/tests/test262/language/statements/switch/early-lex-dup.js
js/src/tests/test262/language/statements/switch/early-lex-var-collision.js
mobile/android/base/java/org/mozilla/gecko/Tabs.java
tools/profiler/public/StoreSequencer.h
widget/cocoa/nsChildView.mm
widget/cocoa/nsCocoaWindow.h
widget/cocoa/nsCocoaWindow.mm
widget/nsBaseWidget.cpp
widget/nsBaseWidget.h
--- a/browser/components/extensions/ExtensionPopups.jsm
+++ b/browser/components/extensions/ExtensionPopups.jsm
@@ -125,19 +125,21 @@ class BasePopup {
         this.browser.remove();
       }
 
       if (this.viewNode) {
         this.viewNode.removeEventListener(this.DESTROY_EVENT, this);
         this.viewNode.style.maxHeight = "";
       }
 
-      if (this.panel) {
-        this.panel.style.removeProperty("--arrowpanel-background");
-        this.panel.style.removeProperty("--panel-arrow-image-vertical");
+      let {panel} = this;
+      if (panel) {
+        panel.style.removeProperty("--arrowpanel-background");
+        panel.style.removeProperty("--panel-arrow-image-vertical");
+        panel.removeAttribute("remote");
       }
 
       this.browser = null;
       this.viewNode = null;
     });
   }
 
   destroyBrowser(browser, finalize = false) {
@@ -372,16 +374,19 @@ class PanelPopup extends BasePopup {
     let document = imageNode.ownerDocument;
 
     let panel = document.createElement("panel");
     panel.setAttribute("id", makeWidgetId(extension.id) + "-panel");
     panel.setAttribute("class", "browser-extension-panel");
     panel.setAttribute("tabspecific", "true");
     panel.setAttribute("type", "arrow");
     panel.setAttribute("role", "group");
+    if (extension.remote) {
+      panel.setAttribute("remote", "true");
+    }
 
     document.getElementById("mainPopupSet").appendChild(panel);
 
     super(extension, panel, popupURL, browserStyle);
 
     this.contentReady.then(() => {
       panel.openPopup(imageNode, "bottomcenter topright", 0, 0, false, false);
 
@@ -445,16 +450,20 @@ class ViewPopup extends BasePopup {
    *        Resolves when the browser is ready. Resolves to `false` if the
    *        browser was destroyed before it was fully loaded, and the popup
    *        should be closed, or `true` otherwise.
    */
   async attach(viewNode) {
     this.viewNode = viewNode;
     this.viewNode.addEventListener(this.DESTROY_EVENT, this);
 
+    if (this.extension.remote) {
+      this.panel.setAttribute("remote", "true");
+    }
+
     // Wait until the browser element is fully initialized, and give it at least
     // a short grace period to finish loading its initial content, if necessary.
     //
     // In practice, the browser that was created by the mousdown handler should
     // nearly always be ready by this point.
     await Promise.all([
       this.browserReady,
       Promise.race([
--- a/browser/config/mozconfigs/linux64/debug-static-analysis-clang
+++ b/browser/config/mozconfigs/linux64/debug-static-analysis-clang
@@ -2,16 +2,19 @@ MOZ_AUTOMATION_BUILD_SYMBOLS=0
 MOZ_AUTOMATION_PACKAGE_TESTS=0
 MOZ_AUTOMATION_L10N_CHECK=0
 
 . "$topsrcdir/build/mozconfig.common"
 
 ac_add_options --enable-debug
 ac_add_options --enable-dmd
 
+# Disable stylo until bug 1356926 is fixed and we have >= llvm39 on centos.
+ac_add_options --disable-stylo
+
 # Use Clang as specified in manifest
 export CC="$topsrcdir/clang/bin/clang"
 export CXX="$topsrcdir/clang/bin/clang++"
 
 # Add the static checker
 ac_add_options --enable-clang-plugin
 
 . "$topsrcdir/build/unix/mozconfig.stdcxx"
--- a/browser/config/mozconfigs/linux64/opt-static-analysis-clang
+++ b/browser/config/mozconfigs/linux64/opt-static-analysis-clang
@@ -1,16 +1,19 @@
 MOZ_AUTOMATION_BUILD_SYMBOLS=0
 MOZ_AUTOMATION_PACKAGE_TESTS=0
 MOZ_AUTOMATION_L10N_CHECK=0
 
 . "$topsrcdir/build/mozconfig.common"
 
 ac_add_options --enable-dmd
 
+# Disable stylo until bug 1356926 is fixed and we have >= llvm39 on centos.
+ac_add_options --disable-stylo
+
 # Use Clang as specified in manifest
 CC="$topsrcdir/clang/bin/clang"
 CXX="$topsrcdir/clang/bin/clang++"
 
 # Add the static checker
 ac_add_options --enable-clang-plugin
 
 . "$topsrcdir/build/unix/mozconfig.stdcxx"
--- a/browser/config/mozconfigs/linux64/stylo
+++ b/browser/config/mozconfigs/linux64/stylo
@@ -1,5 +1,3 @@
 . "$topsrcdir/browser/config/mozconfigs/linux64/nightly"
 
-export LLVM_CONFIG="${TOOLTOOL_DIR}/clang/bin/llvm-config"
-
 ac_add_options --enable-stylo
--- a/browser/config/mozconfigs/linux64/stylo-debug
+++ b/browser/config/mozconfigs/linux64/stylo-debug
@@ -1,5 +1,3 @@
 . "$topsrcdir/browser/config/mozconfigs/linux64/debug"
 
-export LLVM_CONFIG="${TOOLTOOL_DIR}/clang/bin/llvm-config"
-
 ac_add_options --enable-stylo
--- a/browser/config/mozconfigs/linux64/valgrind
+++ b/browser/config/mozconfigs/linux64/valgrind
@@ -1,10 +1,14 @@
 . $topsrcdir/browser/config/mozconfigs/linux64/nightly
 
 ac_add_options --enable-valgrind
 ac_add_options --disable-jemalloc
 ac_add_options --disable-install-strip
 ac_add_options --disable-gtest-in-build
 
+# Rust code gives false positives that we have not entirely suppressed yet.
+# Bug 1365915 tracks fixing these.
+ac_add_options --disable-stylo
+
 # Include the override mozconfig again (even though the above includes it)
 # since it's supposed to override everything.
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/tooltool-manifests/linux32/releng.manifest
+++ b/browser/config/tooltool-manifests/linux32/releng.manifest
@@ -26,10 +26,18 @@
   {
     "version": "sccache rev d3aa1116844b50c03015266d2f48235509fa7deb",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "sccache2.tar.xz",
     "unpack": true,
     "digest": "fde0128b9a4df74f268f9d45748534d0314db0467ae22e36101df4a5374c36bb8676514e8b70254fb2e6f2a2d1224ff7ce498305223035d5f1e7e306fda2f5d5",
     "size": 2179220
+  },
+  {
+    "version": "clang + llvm 3.9.0, built from SVN r290136",
+    "size": 166261192,
+    "digest": "52f3fc23f0f5c98050f8b0ac7c92a6752d067582a16f712a5a58074be98975d594f9e36249fc2be7f1cc2ca6d509c663faaf2bea66f949243cc1f41651638ba6",
+    "algorithm": "sha512",
+    "filename": "clang.tar.xz",
+    "unpack": true
   }
 ]
--- a/browser/config/tooltool-manifests/linux64/hazard.manifest
+++ b/browser/config/tooltool-manifests/linux64/hazard.manifest
@@ -34,10 +34,18 @@
   {
     "version": "sccache rev d3aa1116844b50c03015266d2f48235509fa7deb",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "sccache2.tar.xz",
     "unpack": true,
     "digest": "fde0128b9a4df74f268f9d45748534d0314db0467ae22e36101df4a5374c36bb8676514e8b70254fb2e6f2a2d1224ff7ce498305223035d5f1e7e306fda2f5d5",
     "size": 2179220
+  },
+  {
+    "version": "clang + llvm 3.9.0, built from SVN r290136",
+    "size": 166261192,
+    "digest": "52f3fc23f0f5c98050f8b0ac7c92a6752d067582a16f712a5a58074be98975d594f9e36249fc2be7f1cc2ca6d509c663faaf2bea66f949243cc1f41651638ba6",
+    "algorithm": "sha512",
+    "filename": "clang.tar.xz",
+    "unpack": true
   }
 ]
--- a/browser/config/tooltool-manifests/win32/releng.manifest
+++ b/browser/config/tooltool-manifests/win32/releng.manifest
@@ -33,10 +33,18 @@
   {
     "version": "makecab rev d2bc6797648b7a834782714a55d339d2fd4e58c8",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "makecab.tar.bz2",
     "unpack": true,
     "digest": "196ac6a567c85559957dfe511c3d8654d23c94d5603259e19ccafe9d71e0e4ccee63ccc9a778f2699654b786cda54266108b7d4db543d01bb0b42545b4e6ec75",
     "size": 297118
+  },
+  {
+    "version": "clang 5.0pre/r293859",
+    "size": 309009013,
+    "digest": "cd3ed31acefd185f441632158dde73538c62bab7ebf2a8ec630985ab345938ec522983721ddb1bead1de22d5ac1571d50a958ae002364d739f2a78c6e7244222",
+    "algorithm": "sha512",
+    "filename": "clang.tar.bz2",
+    "unpack": true
   }
 ]
--- a/browser/config/tooltool-manifests/win64/releng.manifest
+++ b/browser/config/tooltool-manifests/win64/releng.manifest
@@ -34,10 +34,18 @@
   {
     "version": "makecab rev d2bc6797648b7a834782714a55d339d2fd4e58c8",
     "algorithm": "sha512",
     "visibility": "public",
     "filename": "makecab.tar.bz2",
     "unpack": true,
     "digest": "196ac6a567c85559957dfe511c3d8654d23c94d5603259e19ccafe9d71e0e4ccee63ccc9a778f2699654b786cda54266108b7d4db543d01bb0b42545b4e6ec75",
     "size": 297118
+  },
+  {
+    "version": "clang 5.0pre/r293859",
+    "size": 313862839,
+    "digest": "44dee70d525ea93952af27f943d1cc773311970c31d971d2bc2e3437cce0c899f3a03ddd8e42e86f1b4fd9ab1c4bc1767cdb0406eb4b3934ae4fc272dab830dc",
+    "algorithm": "sha512",
+    "filename": "clang.tar.bz2",
+    "unpack": true
   }
 ]
--- a/build/mozconfig.common
+++ b/build/mozconfig.common
@@ -11,16 +11,19 @@
 # of this file.
 
 mk_add_options AUTOCLOBBER=1
 
 ac_add_options --enable-crashreporter
 
 ac_add_options --enable-release
 
+# Tell the build system where to find llvm-config for builds on automation.
+export LLVM_CONFIG="${TOOLTOOL_DIR:-$topsrcdir}/clang/bin/llvm-config"
+
 # Enable checking that add-ons are signed by the trusted root
 MOZ_ADDON_SIGNING=${MOZ_ADDON_SIGNING-1}
 # Disable enforcing that add-ons are signed by the trusted root
 MOZ_REQUIRE_SIGNING=${MOZ_REQUIRE_SIGNING-0}
 
 ac_add_options --enable-js-shell
 
 . "$topsrcdir/build/mozconfig.automation"
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -3379,17 +3379,17 @@ return /******/ (function(modules) { // 
 	    isDevelopment = _require5.isDevelopment;
 
 	var L10N = __webpack_require__(185);
 
 	var _require6 = __webpack_require__(966),
 	    showMenu = _require6.showMenu,
 	    buildMenu = _require6.buildMenu;
 
-	setConfig(({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"searchNav":{"enabled":true}}}));
+	setConfig(({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js"},"features":{"blackbox":{"enabled":true},"chromeScopes":{"enabled":false},"eventListeners":{"enabled":false},"codeCoverage":{"enabled":false},"searchNav":{"enabled":true},"collapseFrame":{"enabled":true}}}));
 
 	// Set various flags before requiring app code.
 	if (getValue("logging.client")) {
 	  // DevToolsUtils.dumpn.wantLogging = true;
 	}
 
 	var _require7 = __webpack_require__(885),
 	    firefox = _require7.firefox,
@@ -13295,29 +13295,31 @@ return /******/ (function(modules) { // 
 	  pref("devtools.debugger.client-source-maps-enabled", true);
 	  pref("devtools.debugger.pause-on-exceptions", false);
 	  pref("devtools.debugger.ignore-caught-exceptions", false);
 	  pref("devtools.debugger.call-stack-visible", false);
 	  pref("devtools.debugger.scopes-visible", false);
 	  pref("devtools.debugger.start-panel-collapsed", false);
 	  pref("devtools.debugger.end-panel-collapsed", false);
 	  pref("devtools.debugger.tabs", "[]");
+	  pref("devtools.debugger.ui.framework-grouping-on", true);
 	  pref("devtools.debugger.pending-selected-location", "{}");
 	  pref("devtools.debugger.pending-breakpoints", "[]");
 	  pref("devtools.debugger.expressions", "[]");
 	}
 
 	const prefs = new PrefsHelper("devtools", {
 	  clientSourceMapsEnabled: ["Bool", "debugger.client-source-maps-enabled"],
 	  pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
 	  ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
 	  callStackVisible: ["Bool", "debugger.call-stack-visible"],
 	  scopesVisible: ["Bool", "debugger.scopes-visible"],
 	  startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"],
 	  endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"],
+	  frameworkGroupingOn: ["Bool", "debugger.ui.framework-grouping-on"],
 	  tabs: ["Json", "debugger.tabs"],
 	  pendingSelectedLocation: ["Json", "debugger.pending-selected-location"],
 	  pendingBreakpoints: ["Json", "debugger.pending-breakpoints"],
 	  expressions: ["Json", "debugger.expressions"]
 	});
 
 	module.exports = { prefs };
 
@@ -13557,16 +13559,17 @@ return /******/ (function(modules) { // 
 	  UPDATE_EXPRESSION: "UPDATE_EXPRESSION",
 	  DELETE_EXPRESSION: "DELETE_EXPRESSION",
 
 	  RECORD_COVERAGE: "RECORD_COVERAGE",
 
 	  TOGGLE_PROJECT_SEARCH: "TOGGLE_PROJECT_SEARCH",
 	  TOGGLE_FILE_SEARCH: "TOGGLE_FILE_SEARCH",
 	  TOGGLE_SYMBOL_SEARCH: "TOGGLE_SYMBOL_SEARCH",
+	  TOGGLE_FRAMEWORK_GROUPING: "TOGGLE_FRAMEWORK_GROUPING",
 	  SET_SYMBOL_SEARCH_TYPE: "SET_SYMBOL_SEARCH_TYPE",
 	  UPDATE_FILE_SEARCH_QUERY: "UPDATE_FILE_SEARCH_QUERY",
 	  TOGGLE_FILE_SEARCH_MODIFIER: "TOGGLE_FILE_SEARCH_MODIFIER",
 	  SHOW_SOURCE: "SHOW_SOURCE",
 	  TOGGLE_PANE: "TOGGLE_PANE"
 	};
 
 /***/ },
@@ -14769,59 +14772,47 @@ return /******/ (function(modules) { // 
 /***/ function(module, exports, __webpack_require__) {
 
 	"use strict";
 
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	exports.getSelectedFrame = exports.getLoadedObjects = exports.getPause = exports.State = undefined;
+
+	var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+	/* 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/. */
+
 	exports.getLoadedObject = getLoadedObject;
 	exports.getObjectProperties = getObjectProperties;
 	exports.getIsWaitingOnBreak = getIsWaitingOnBreak;
 	exports.getShouldPauseOnExceptions = getShouldPauseOnExceptions;
 	exports.getShouldIgnoreCaughtExceptions = getShouldIgnoreCaughtExceptions;
 	exports.getFrames = getFrames;
 	exports.getDebuggeeUrl = getDebuggeeUrl;
 	exports.getChromeScopes = getChromeScopes;
 
 	var _reselect = __webpack_require__(993);
 
-	var _fromJS = __webpack_require__(237);
-
-	var _fromJS2 = _interopRequireDefault(_fromJS);
-
-	var _makeRecord = __webpack_require__(230);
-
-	var _makeRecord2 = _interopRequireDefault(_makeRecord);
-
 	var _prefs = __webpack_require__(226);
 
-	var _immutable = __webpack_require__(146);
-
-	var I = _interopRequireWildcard(_immutable);
-
 	var _constants = __webpack_require__(229);
 
 	var _constants2 = _interopRequireDefault(_constants);
 
-	function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
-
-	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-	/* 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/. */
-
-	var State = exports.State = (0, _makeRecord2.default)({
+	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+	var State = exports.State = () => ({
 	  pause: undefined,
 	  isWaitingOnBreak: false,
 	  frames: undefined,
 	  selectedFrameId: undefined,
-	  loadedObjects: I.Map(),
+	  loadedObjects: {},
 	  shouldPauseOnExceptions: _prefs.prefs.pauseOnExceptions,
 	  shouldIgnoreCaughtExceptions: _prefs.prefs.ignoreCaughtExceptions,
 	  debuggeeUrl: ""
 	});
 
 	function update() {
 	  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : State();
 	  var action = arguments[1];
@@ -14837,85 +14828,89 @@ return /******/ (function(modules) { // 
 	        pauseInfo.isInterrupted = pauseInfo.why.type === "interrupted";
 
 	        // turn this into an object keyed by object id
 	        var objectMap = {};
 	        _loadedObjects.forEach(obj => {
 	          objectMap[obj.value.objectId] = obj;
 	        });
 
-	        return state.merge({
+	        return Object.assign({}, state, {
 	          isWaitingOnBreak: false,
-	          pause: (0, _fromJS2.default)(pauseInfo),
+	          pause: pauseInfo,
 	          selectedFrameId: _selectedFrameId,
 	          frames: _frames,
 	          loadedObjects: objectMap
 	        });
 	      }
 
 	    case _constants2.default.RESUME:
-	      return state.merge({
+	      return Object.assign({}, state, {
 	        pause: null,
 	        frames: null,
 	        selectedFrameId: null,
 	        loadedObjects: {}
 	      });
 
 	    case _constants2.default.TOGGLE_PRETTY_PRINT:
 	      if (action.status == "done") {
 	        var _frames2 = action.value.frames;
-	        var _pause = state.get("pause");
+	        var _pause = state.pause;
 	        if (_pause) {
-	          _pause = _pause.set("frame", (0, _fromJS2.default)(_frames2[0]));
-	        }
-
-	        return state.merge({ pause: _pause, frames: _frames2 });
+	          _pause.frame = _frames2[0];
+	        }
+
+	        return Object.assign({}, state, { pause: _pause, frames: _frames2 });
 	      }
 
 	      break;
 	    case _constants2.default.BREAK_ON_NEXT:
-	      return state.set("isWaitingOnBreak", true);
+	      return Object.assign({}, state, { isWaitingOnBreak: true });
 
 	    case _constants2.default.SELECT_FRAME:
-	      return state.set("selectedFrameId", action.frame.id);
+	      return Object.assign({}, state, { selectedFrameId: action.frame.id });
 
 	    case _constants2.default.LOAD_OBJECT_PROPERTIES:
 	      if (action.status === "start") {
-	        return state.setIn(["loadedObjects", action.objectId], {});
+	        return _extends({}, state, {
+	          loadedObjects: _extends({}, state.loadedObjects, {
+	            [action.objectId]: {}
+	          })
+	        });
 	      }
 
 	      if (action.status === "done") {
 	        if (!action.value) {
-	          return state;
+	          return Object.assign({}, state);
 	        }
 
 	        var ownProperties = action.value.ownProperties;
 	        var ownSymbols = action.value.ownSymbols || [];
 	        var prototype = action.value.prototype;
 
-	        return state.setIn(["loadedObjects", action.objectId], {
-	          ownProperties,
-	          prototype,
-	          ownSymbols
+	        return _extends({}, state, {
+	          loadedObjects: _extends({}, state.loadedObjects, {
+	            [action.objectId]: { ownProperties, prototype, ownSymbols }
+	          })
 	        });
 	      }
 	      break;
 
 	    case _constants2.default.NAVIGATE:
-	      return State().set("debuggeeUrl", action.url);
+	      return Object.assign({}, State(), { debuggeeUrl: action.url });
 
 	    case _constants2.default.PAUSE_ON_EXCEPTIONS:
 	      var _shouldPauseOnExceptions = action.shouldPauseOnExceptions,
 	          _shouldIgnoreCaughtExceptions = action.shouldIgnoreCaughtExceptions;
 
 
 	      _prefs.prefs.pauseOnExceptions = _shouldPauseOnExceptions;
 	      _prefs.prefs.ignoreCaughtExceptions = _shouldIgnoreCaughtExceptions;
 
-	      return state.merge({
+	      return Object.assign({}, state, {
 	        shouldPauseOnExceptions: _shouldPauseOnExceptions,
 	        shouldIgnoreCaughtExceptions: _shouldIgnoreCaughtExceptions
 	      });
 	  }
 
 	  return state;
 	}
 
@@ -14927,56 +14922,57 @@ return /******/ (function(modules) { // 
 	// module for the UI, and all of those selectors should take the
 	// top-level app state, so we'd have to "wrap" them to automatically
 	// pick off the piece of state we're interested in. It's impossible
 	// (right now) to type those wrapped functions.
 
 
 	var getPauseState = state => state.pause;
 
-	var getPause = exports.getPause = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.get("pause"));
-
-	var getLoadedObjects = exports.getLoadedObjects = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.get("loadedObjects"));
+	var getPause = exports.getPause = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.pause);
+
+	var getLoadedObjects = exports.getLoadedObjects = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.loadedObjects);
 
 	function getLoadedObject(state, objectId) {
-	  return getLoadedObjects(state).get(objectId);
+	  return getLoadedObjects(state)[objectId];
 	}
 
 	function getObjectProperties(state, parentId) {
-	  return getLoadedObjects(state).filter(obj => obj.get("parentId") == parentId);
+	  return getLoadedObjects(state).filter(obj => obj.parentId == parentId);
 	}
 
 	function getIsWaitingOnBreak(state) {
-	  return state.pause.get("isWaitingOnBreak");
+	  return state.pause.isWaitingOnBreak;
 	}
 
 	function getShouldPauseOnExceptions(state) {
-	  return state.pause.get("shouldPauseOnExceptions");
+	  return state.pause.shouldPauseOnExceptions;
 	}
 
 	function getShouldIgnoreCaughtExceptions(state) {
-	  return state.pause.get("shouldIgnoreCaughtExceptions");
+	  return state.pause.shouldIgnoreCaughtExceptions;
 	}
 
 	function getFrames(state) {
-	  return state.pause.get("frames");
-	}
-
-	var getSelectedFrameId = (0, _reselect.createSelector)(getPauseState, pauseWrapper => pauseWrapper.get("selectedFrameId"));
+	  return state.pause.frames;
+	}
+
+	var getSelectedFrameId = (0, _reselect.createSelector)(getPauseState, pauseWrapper => {
+	  return pauseWrapper.selectedFrameId;
+	});
 
 	var getSelectedFrame = exports.getSelectedFrame = (0, _reselect.createSelector)(getSelectedFrameId, getFrames, (selectedFrameId, frames) => {
 	  if (!frames) {
 	    return null;
 	  }
-
-	  return frames.find(frame => frame.get("id") == selectedFrameId).toJS();
+	  return frames.find(frame => frame.id == selectedFrameId);
 	});
 
 	function getDebuggeeUrl(state) {
-	  return state.pause.get("debuggeeUrl");
+	  return state.pause.debuggeeUrl;
 	}
 
 	// NOTE: currently only used for chrome
 	function getChromeScopes(state) {
 	  var frame = getSelectedFrame(state);
 	  return frame ? frame.scopeChain : undefined;
 	}
 
@@ -14989,16 +14985,17 @@ return /******/ (function(modules) { // 
 	"use strict";
 
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	exports.getSymbolSearchState = exports.getFileSearchState = exports.getProjectSearchState = exports.State = undefined;
 	exports.getFileSearchQueryState = getFileSearchQueryState;
 	exports.getFileSearchModifierState = getFileSearchModifierState;
+	exports.getFrameworkGroupingState = getFrameworkGroupingState;
 	exports.getSymbolSearchType = getSymbolSearchType;
 	exports.getShownSource = getShownSource;
 	exports.getPaneCollapse = getPaneCollapse;
 	exports.getHighlightedLineRange = getHighlightedLineRange;
 
 	var _makeRecord = __webpack_require__(230);
 
 	var _makeRecord2 = _interopRequireDefault(_makeRecord);
@@ -15020,16 +15017,17 @@ return /******/ (function(modules) { // 
 	    regexMatch: false
 	  })(),
 	  projectSearchOn: false,
 	  symbolSearchOn: false,
 	  symbolSearchType: "functions",
 	  shownSource: "",
 	  startPanelCollapsed: _prefs.prefs.startPanelCollapsed,
 	  endPanelCollapsed: _prefs.prefs.endPanelCollapsed,
+	  frameworkGroupingOn: _prefs.prefs.frameworkGroupingOn,
 	  highlightedLineRange: undefined
 	});
 
 	/**
 	 * UI reducer
 	 * @module reducers/ui
 	 */
 
@@ -15038,16 +15036,22 @@ return /******/ (function(modules) { // 
 	  var action = arguments[1];
 
 	  switch (action.type) {
 	    case _constants2.default.TOGGLE_PROJECT_SEARCH:
 	      {
 	        return state.set("projectSearchOn", action.value);
 	      }
 
+	    case _constants2.default.TOGGLE_FRAMEWORK_GROUPING:
+	      {
+	        _prefs.prefs.frameworkGroupingOn = action.value;
+	        return state.set("frameworkGroupingOn", action.value);
+	      }
+
 	    case _constants2.default.TOGGLE_FILE_SEARCH:
 	      {
 	        return state.set("fileSearchOn", action.value);
 	      }
 
 	    case _constants2.default.TOGGLE_SYMBOL_SEARCH:
 	      {
 	        return state.set("symbolSearchOn", action.value);
@@ -15118,16 +15122,20 @@ return /******/ (function(modules) { // 
 	function getFileSearchQueryState(state) {
 	  return state.ui.get("fileSearchQuery");
 	}
 
 	function getFileSearchModifierState(state) {
 	  return state.ui.get("fileSearchModifiers");
 	}
 
+	function getFrameworkGroupingState(state) {
+	  return state.ui.get("frameworkGroupingOn");
+	}
+
 	function getSymbolSearchType(state) {
 	  return state.ui.get("symbolSearchType");
 	}
 
 	var getProjectSearchState = exports.getProjectSearchState = getSearchState.bind(null, "projectSearchOn");
 	var getFileSearchState = exports.getFileSearchState = getSearchState.bind(null, "fileSearchOn");
 	var getSymbolSearchState = exports.getSymbolSearchState = getSearchState.bind(null, "symbolSearchOn");
 
@@ -15274,16 +15282,17 @@ return /******/ (function(modules) { // 
 	  getCoverageEnabled: coverage.getCoverageEnabled,
 
 	  getEventListeners: eventListeners.getEventListeners,
 
 	  getProjectSearchState: ui.getProjectSearchState,
 	  getFileSearchState: ui.getFileSearchState,
 	  getFileSearchQueryState: ui.getFileSearchQueryState,
 	  getFileSearchModifierState: ui.getFileSearchModifierState,
+	  getFrameworkGroupingState: ui.getFrameworkGroupingState,
 	  getSymbolSearchState: ui.getSymbolSearchState,
 	  getSymbolSearchType: ui.getSymbolSearchType,
 	  getShownSource: ui.getShownSource,
 	  getPaneCollapse: ui.getPaneCollapse,
 
 	  getExpressions: expressions.getExpressions,
 	  getVisibleExpressions: expressions.getVisibleExpressions,
 	  getExpression: expressions.getExpression,
@@ -15536,17 +15545,17 @@ return /******/ (function(modules) { // 
 	var ui = _interopRequireWildcard(_ui);
 
 	var _coverage = __webpack_require__(322);
 
 	var coverage = _interopRequireWildcard(_coverage);
 
 	function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
-	exports.default = Object.assign(navigation, breakpoints, expressions, eventListeners, sources, pause, ui, coverage);
+	exports.default = Object.assign({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, coverage);
 
 /***/ },
 /* 245 */
 /***/ function(module, exports, __webpack_require__) {
 
 	"use strict";
 
 	Object.defineProperty(exports, "__esModule", {
@@ -16888,17 +16897,17 @@ return /******/ (function(modules) { // 
 	        }),
 	            code = _ref16.code,
 	            mappings = _ref16.mappings;
 
 	        yield sourceMaps.applySourceMap(source.id, url, code, mappings);
 
 	        var frames = (0, _selectors.getFrames)(getState());
 	        if (frames) {
-	          frames = yield (0, _pause.updateFrameLocations)(frames.toJS(), sourceMaps);
+	          frames = yield (0, _pause.updateFrameLocations)(frames, sourceMaps);
 	        }
 
 	        dispatch(selectSource(originalSource.id));
 
 	        return { text: code, contentType: "text/javascript", frames };
 	      })()
 	    });
 	  };
@@ -17076,44 +17085,45 @@ return /******/ (function(modules) { // 
 	    }
 
 	    return deferred.promise;
 	  };
 	}
 
 /***/ },
 /* 255 */
-/***/ function(module, exports) {
+/***/ function(module, exports, __webpack_require__) {
 
 	"use strict";
 
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	exports.updateFrameLocations = updateFrameLocations;
 	exports.getPauseReason = getPauseReason;
+
+	var get = __webpack_require__(67);
 	function updateFrameLocations(frames, sourceMaps) {
 	  if (!frames || frames.length == 0) {
 	    return Promise.resolve(frames);
 	  }
 
 	  return Promise.all(frames.map(frame => {
 	    return sourceMaps.getOriginalLocation(frame.location).then(loc => {
-	      return Object.assign(frame, {
+	      return Object.assign({}, frame, {
 	        location: loc
 	      });
 	    });
 	  }));
 	}
 
 	// Map protocol pause "why" reason to a valid L10N key
 	// These are the known unhandled reasons:
 	// "breakpointConditionThrown", "clientEvaluated"
 	// "interrupted", "attached"
-
 	var reasons = {
 	  debuggerStatement: "whyPaused.debuggerStatement",
 	  breakpoint: "whyPaused.breakpoint",
 	  exception: "whyPaused.exception",
 	  resumeLimit: "whyPaused.resumeLimit",
 	  pauseOnDOMEvents: "whyPaused.pauseOnDOMEvents",
 	  breakpointConditionThrown: "whyPaused.breakpointConditionThrown",
 
@@ -17127,17 +17137,17 @@ return /******/ (function(modules) { // 
 	  other: "whyPaused.other"
 	};
 
 	function getPauseReason(pauseInfo) {
 	  if (!pauseInfo) {
 	    return null;
 	  }
 
-	  var reasonType = pauseInfo.getIn(["why"]).get("type");
+	  var reasonType = get(pauseInfo, "why.type", null);
 	  if (!reasons[reasonType]) {
 	    console.log("Please file an issue: reasonType=", reasonType);
 	  }
 	  return reasons[reasonType];
 	}
 
 /***/ },
 /* 256 */,
@@ -19492,17 +19502,17 @@ return /******/ (function(modules) { // 
 	          why = pauseInfo.why,
 	          loadedObjects = pauseInfo.loadedObjects;
 
 	      frames = yield (0, _pause.updateFrameLocations)(frames, sourceMaps);
 	      var frame = frames[0];
 
 	      dispatch({
 	        type: _constants2.default.PAUSED,
-	        pauseInfo: { why, frame },
+	        pauseInfo: { why, frame, frames },
 	        frames: frames,
 	        selectedFrameId: frame.id,
 	        loadedObjects: loadedObjects || []
 	      });
 
 	      dispatch((0, _expressions.evaluateExpressions)(frame.id));
 
 	      dispatch((0, _sources.selectSource)(frame.location.sourceId, { line: frame.location.line }));
@@ -19779,16 +19789,17 @@ return /******/ (function(modules) { // 
 	"use strict";
 
 	Object.defineProperty(exports, "__esModule", {
 	  value: true
 	});
 	exports.toggleProjectSearch = toggleProjectSearch;
 	exports.toggleFileSearch = toggleFileSearch;
 	exports.toggleSymbolSearch = toggleSymbolSearch;
+	exports.toggleFrameworkGrouping = toggleFrameworkGrouping;
 	exports.setSelectedSymbolType = setSelectedSymbolType;
 	exports.setFileSearchQuery = setFileSearchQuery;
 	exports.toggleFileSearchModifier = toggleFileSearchModifier;
 	exports.showSource = showSource;
 	exports.togglePaneCollapse = togglePaneCollapse;
 	exports.highlightLineRange = highlightLineRange;
 	exports.clearHighlightLineRange = clearHighlightLineRange;
 
@@ -19850,22 +19861,34 @@ return /******/ (function(modules) { // 
 
 	    dispatch({
 	      type: _constants2.default.TOGGLE_SYMBOL_SEARCH,
 	      value: toggleValue
 	    });
 	  };
 	}
 
-	function setSelectedSymbolType(symbolType) {
+	function toggleFrameworkGrouping(toggleValue) {
 	  return (_ref4) => {
 	    var dispatch = _ref4.dispatch,
 	        getState = _ref4.getState;
 
 	    dispatch({
+	      type: _constants2.default.TOGGLE_FRAMEWORK_GROUPING,
+	      value: toggleValue
+	    });
+	  };
+	}
+
+	function setSelectedSymbolType(symbolType) {
+	  return (_ref5) => {
+	    var dispatch = _ref5.dispatch,
+	        getState = _ref5.getState;
+
+	    dispatch({
 	      type: _constants2.default.SET_SYMBOL_SEARCH_TYPE,
 	      symbolType
 	    });
 	  };
 	}
 
 	function setFileSearchQuery(query) {
 	  return {
@@ -19874,19 +19897,19 @@ return /******/ (function(modules) { // 
 	  };
 	}
 
 	function toggleFileSearchModifier(modifier) {
 	  return { type: _constants2.default.TOGGLE_FILE_SEARCH_MODIFIER, modifier };
 	}
 
 	function showSource(sourceId) {
-	  return (_ref5) => {
-	    var dispatch = _ref5.dispatch,
-	        getState = _ref5.getState;
+	  return (_ref6) => {
+	    var dispatch = _ref6.dispatch,
+	        getState = _ref6.getState;
 
 	    var source = (0, _selectors.getSource)(getState(), sourceId);
 	    dispatch({
 	      type: _constants2.default.SHOW_SOURCE,
 	      sourceUrl: source.get("url")
 	    });
 	  };
 	}
@@ -24673,17 +24696,17 @@ return /******/ (function(modules) { // 
 	  enableBreakpoint: _react.PropTypes.func.isRequired,
 	  removeBreakpoint: _react.PropTypes.func.isRequired,
 	  setBreakpointCondition: _react.PropTypes.func.isRequired,
 	  selectSource: _react.PropTypes.func,
 	  jumpToMappedLocation: _react.PropTypes.func,
 	  toggleBlackBox: _react.PropTypes.func,
 	  showSource: _react.PropTypes.func,
 	  coverageOn: _react.PropTypes.bool,
-	  pauseData: _reactImmutableProptypes2.default.map,
+	  pauseData: _react.PropTypes.object,
 	  selectedFrame: _react.PropTypes.object,
 	  getExpression: _react.PropTypes.func.isRequired,
 	  addExpression: _react.PropTypes.func.isRequired,
 	  horizontal: _react.PropTypes.bool,
 	  query: _react.PropTypes.string.isRequired,
 	  searchModifiers: _reactImmutableProptypes2.default.recordOf({
 	    caseSensitive: _react.PropTypes.bool.isRequired,
 	    regexMatch: _react.PropTypes.bool.isRequired,
@@ -26498,17 +26521,17 @@ return /******/ (function(modules) { // 
 
 
 	    popoverTarget.classList.add("selected-token");
 
 	    if (!value || !value.type == "object") {
 	      return;
 	    }
 
-	    if (value.actor && !loadedObjects.has(value.actor)) {
+	    if (value.actor && !loadedObjects[value.actor]) {
 	      loadObjectProperties(value);
 	    }
 	  }
 
 	  componentWillUnmount() {
 	    var popoverTarget = this.props.popoverTarget;
 
 	    popoverTarget.classList.remove("selected-token");
@@ -26550,17 +26573,17 @@ return /******/ (function(modules) { // 
 	  }
 
 	  renderObjectInspector(root) {
 	    var _props2 = this.props,
 	        loadObjectProperties = _props2.loadObjectProperties,
 	        loadedObjects = _props2.loadedObjects;
 
 
-	    var getObjectProperties = id => loadedObjects.get(id);
+	    var getObjectProperties = id => loadedObjects[id];
 	    var roots = this.getChildren(root, getObjectProperties);
 
 	    return ObjectInspector({
 	      roots,
 	      getObjectProperties,
 	      autoExpandDepth: 0,
 	      onDoubleClick: () => {},
 	      loadObjectProperties
@@ -28149,17 +28172,17 @@ return /******/ (function(modules) { // 
 	      className: "secondary-panes",
 	      style: { overflowX: "hidden" }
 	    }, CommandBar(), WhyPaused(), this.props.horizontal ? this.renderHorizontalLayout() : this.renderVerticalLayout());
 	  }
 	}
 
 	SecondaryPanes.propTypes = {
 	  evaluateExpressions: _react.PropTypes.func.isRequired,
-	  pauseData: _reactImmutableProptypes2.default.map,
+	  pauseData: _react.PropTypes.object,
 	  horizontal: _react.PropTypes.bool,
 	  breakpoints: _reactImmutableProptypes2.default.map.isRequired,
 	  breakpointsDisabled: _react.PropTypes.bool,
 	  breakpointsLoading: _react.PropTypes.bool,
 	  toggleAllBreakpoints: _react.PropTypes.func.isRequired
 	};
 
 	SecondaryPanes.contextTypes = {
@@ -28351,17 +28374,17 @@ return /******/ (function(modules) { // 
 	      contents: { value }
 	    };
 
 	    return _react.DOM.div({
 	      className: "expression-container",
 	      key: path || input
 	    }, ObjectInspector({
 	      roots: [root],
-	      getObjectProperties: id => loadedObjects.get(id),
+	      getObjectProperties: id => loadedObjects[id],
 	      autoExpandDepth: 0,
 	      onDoubleClick: (item, options) => this.editExpression(expression, options),
 	      loadObjectProperties
 	    }), CloseButton({ handleClick: e => this.deleteExpression(e, expression) }));
 	  }
 
 	  componentDidUpdate() {
 	    if (this._input) {
@@ -28428,60 +28451,57 @@ return /******/ (function(modules) { // 
 	});
 
 	var _react = __webpack_require__(2);
 
 	var _redux = __webpack_require__(3);
 
 	var _reactRedux = __webpack_require__(151);
 
-	var _reactImmutableProptypes = __webpack_require__(150);
-
-	var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
-
 	var _actions = __webpack_require__(244);
 
 	var _actions2 = _interopRequireDefault(_actions);
 
 	var _selectors = __webpack_require__(242);
 
 	var _isString = __webpack_require__(602);
 
 	var _isString2 = _interopRequireDefault(_isString);
 
 	var _pause = __webpack_require__(255);
 
 	__webpack_require__(723);
 
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+	var get = __webpack_require__(67);
+
 	function renderExceptionSummary(exception) {
 	  if ((0, _isString2.default)(exception)) {
 	    return exception;
 	  }
 
-	  var message = exception.getIn(["preview", "message"]);
-	  var name = exception.getIn(["preview", "name"]);
+	  var message = get(exception, "preview.message");
+	  var name = get(exception, "preview.name");
 
 	  return `${name}: ${message}`;
 	}
 
-
 	class WhyPaused extends _react.Component {
 	  renderMessage(pauseInfo) {
 	    if (!pauseInfo) {
 	      return null;
 	    }
 
-	    var message = pauseInfo.getIn(["why", "message"]);
+	    var message = get(pauseInfo, "why.message");
 	    if (message) {
 	      return _react.DOM.div({ className: "message" }, message);
 	    }
 
-	    var exception = pauseInfo.getIn(["why", "exception"]);
+	    var exception = get(pauseInfo, "why.exception");
 	    if (exception) {
 	      return _react.DOM.div({ className: "message" }, renderExceptionSummary(exception));
 	    }
 
 	    return null;
 	  }
 
 	  render() {
@@ -28495,17 +28515,17 @@ return /******/ (function(modules) { // 
 
 	    return _react.DOM.div({ className: "pane why-paused" }, _react.DOM.div(null, L10N.getStr(reason)), this.renderMessage(pauseInfo));
 	  }
 	}
 
 	WhyPaused.displayName = "WhyPaused";
 
 	WhyPaused.propTypes = {
-	  pauseInfo: _reactImmutableProptypes2.default.map
+	  pauseInfo: _react.PropTypes.object
 	};
 
 	exports.default = (0, _reactRedux.connect)(state => ({
 	  pauseInfo: (0, _selectors.getPause)(state)
 	}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(WhyPaused);
 
 /***/ },
 /* 723 */
@@ -28555,28 +28575,29 @@ return /******/ (function(modules) { // 
 	var _Close = __webpack_require__(378);
 
 	var _Close2 = _interopRequireDefault(_Close);
 
 	__webpack_require__(726);
 
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
+	var get = __webpack_require__(67);
+
+
 	function isCurrentlyPausedAtBreakpoint(pause, breakpoint) {
-	  if (!pause || pause.get("isInterrupted")) {
+	  if (!pause || pause.isInterrupted) {
 	    return false;
 	  }
 
 	  var bpId = (0, _breakpoints.makeLocationId)(breakpoint.location);
-	  var pausedId = (0, _breakpoints.makeLocationId)(pause.getIn(["frame", "location"]).toJS());
-
+	  var pausedId = (0, _breakpoints.makeLocationId)(get(pause, "frame.location"));
 	  return bpId === pausedId;
 	}
 
-
 	function renderSourceLocation(source, line, column) {
 	  var url = source.get("url") ? (0, _path.basename)(source.get("url")) : null;
 	  var bpLocation = line + (column ? `:${column}` : "");
 	  // const line = url !== "" ? `: ${line}` : "";
 	  return url ? _react.DOM.div({ className: "location" }, `${(0, _utils.endTruncateStr)(url, 30)}: ${bpLocation}`) : null;
 	}
 
 	class Breakpoints extends _react.PureComponent {
@@ -28813,17 +28834,17 @@ return /******/ (function(modules) { // 
 	      className: (0, _classnames2.default)({
 	        expanded: expanded,
 	        hidden: nodeIsPrimitive(item)
 	      })
 	    }), _react.DOM.span({ className: "object-label" }, item.name), _react.DOM.span({ className: "object-delimiter" }, objectValue ? ": " : ""), _react.DOM.span({ className: "object-value" }, objectValue || ""));
 	  }
 
 	  getObjectProperties(item) {
-	    this.props.loadedObjects.get(item.contents.value.objectId);
+	    this.props.loadedObjects[item.contents.value.objectId];
 	  }
 
 	  getChildren(item) {
 	    var obj = item.contents;
 
 	    // Nodes can either have children already, or be an object with
 	    // properties that we need to go and fetch.
 	    if (nodeHasChildren(item)) {
@@ -28933,20 +28954,16 @@ return /******/ (function(modules) { // 
 	});
 
 	var _react = __webpack_require__(2);
 
 	var _redux = __webpack_require__(3);
 
 	var _reactRedux = __webpack_require__(151);
 
-	var _reactImmutableProptypes = __webpack_require__(150);
-
-	var _reactImmutableProptypes2 = _interopRequireDefault(_reactImmutableProptypes);
-
 	var _actions = __webpack_require__(244);
 
 	var _actions2 = _interopRequireDefault(_actions);
 
 	var _selectors = __webpack_require__(242);
 
 	var _scopes = __webpack_require__(732);
 
@@ -28955,16 +28972,17 @@ return /******/ (function(modules) { // 
 	var _ObjectInspector3 = _interopRequireDefault(_ObjectInspector2);
 
 	__webpack_require__(729);
 
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 	var ObjectInspector = (0, _react.createFactory)(_ObjectInspector3.default);
 
+
 	function info(text) {
 	  return _react.DOM.div({ className: "pane-info" }, text);
 	}
 
 	class Scopes extends _react.PureComponent {
 
 	  constructor(props) {
 	    var pauseInfo = props.pauseInfo,
@@ -29003,28 +29021,28 @@ return /******/ (function(modules) { // 
 	        loadedObjects = _props2.loadedObjects;
 	    var scopes = this.state.scopes;
 
 
 	    var scopeInspector = info(L10N.getStr("scopes.notAvailable"));
 	    if (scopes) {
 	      scopeInspector = ObjectInspector({
 	        roots: scopes,
-	        getObjectProperties: id => loadedObjects.get(id),
+	        getObjectProperties: id => loadedObjects[id],
 	        loadObjectProperties: loadObjectProperties
 	      });
 	    }
 
 	    return _react.DOM.div({ className: "pane scopes-list" }, pauseInfo ? scopeInspector : info(L10N.getStr("scopes.notPaused")));
 	  }
 	}
 
 	Scopes.propTypes = {
-	  pauseInfo: _reactImmutableProptypes2.default.map,
-	  loadedObjects: _reactImmutableProptypes2.default.map,
+	  pauseInfo: _react.PropTypes.object,
+	  loadedObjects: _react.PropTypes.object,
 	  loadObjectProperties: _react.PropTypes.func,
 	  selectedFrame: _react.PropTypes.object
 	};
 
 	Scopes.displayName = "Scopes";
 
 	exports.default = (0, _reactRedux.connect)(state => ({
 	  pauseInfo: (0, _selectors.getPause)(state),
@@ -29048,58 +29066,47 @@ return /******/ (function(modules) { // 
 	var _toPairs = __webpack_require__(195);
 
 	var _toPairs2 = _interopRequireDefault(_toPairs);
 
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 	function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
 
+	var get = __webpack_require__(67);
+
 	// Create the tree nodes representing all the variables and arguments
 	// for the bindings from a scope.
 	function getBindingVariables(bindings, parentName) {
 	  var args = bindings.arguments.map(arg => (0, _toPairs2.default)(arg)[0]);
 	  var variables = (0, _toPairs2.default)(bindings.variables);
 
 	  return args.concat(variables).map(binding => ({
 	    name: binding[0],
 	    path: `${parentName}/${binding[0]}`,
 	    contents: binding[1]
 	  }));
 	}
 
-	// Support dehydrating immutable objects, while ignoring
-	// primitive values like strings, numbers...
-	function dehydrateValue(value) {
-	  if (typeof value == "object" && !!value && value.toJS) {
-	    value = value.toJS();
-	  }
-
-	  return value;
-	}
-
 	function getSpecialVariables(pauseInfo, path) {
-	  var thrown = pauseInfo.getIn(["why", "frameFinished", "throw"], undefined);
-
-	  var returned = pauseInfo.getIn(["why", "frameFinished", "return"], undefined);
+	  var thrown = get(pauseInfo, "why.frameFinished.throw", undefined);
+
+	  var returned = get(pauseInfo, "why.frameFinished.return", undefined);
 
 	  var vars = [];
 
 	  if (thrown !== undefined) {
-	    thrown = dehydrateValue(thrown);
 	    vars.push({
 	      name: "<exception>",
 	      path: `${path}/<exception>`,
 	      contents: { value: thrown }
 	    });
 	  }
 
 	  if (returned !== undefined) {
-	    returned = dehydrateValue(returned);
-
 	    // Do not display a return value of "undefined",
 	    if (!returned || !returned.type || returned.type !== "undefined") {
 	      vars.push({
 	        name: "<return>",
 	        path: `${path}/<return>`,
 	        contents: { value: returned }
 	      });
 	    }
@@ -29131,17 +29138,17 @@ return /******/ (function(modules) { // 
 
 	  if (!selectedScope) {
 	    return null;
 	  }
 
 	  var scopes = [];
 
 	  var scope = selectedScope;
-	  var pausedScopeActor = pauseInfo.getIn(["frame", "scope"]).get("actor");
+	  var pausedScopeActor = get(pauseInfo, "frame.scope.actor");
 	  var scopeIndex = 1;
 
 	  do {
 	    var _scope = scope,
 	        type = _scope.type,
 	        actor = _scope.actor;
 
 	    var key = `${actor}-${scopeIndex}`;
@@ -29640,17 +29647,17 @@ return /******/ (function(modules) { // 
 	  }
 
 	  render() {
 	    return _react.DOM.div({ className: "command-bar" }, this.renderPauseButton(), this.renderStepButtons(), this.renderPauseOnExceptions());
 	  }
 	}
 
 	CommandBar.contextTypes = {
-	  shortcuts: Object
+	  shortcuts: _react.PropTypes.object
 	};
 
 	CommandBar.displayName = "CommandBar";
 
 	exports.default = (0, _reactRedux.connect)(state => {
 	  return {
 	    pause: (0, _selectors.getPause)(state),
 	    isWaitingOnBreak: (0, _selectors.getIsWaitingOnBreak)(state),
@@ -31383,16 +31390,25 @@ return /******/ (function(modules) { // 
 	        store,
 	        actions,
 	        selectors,
 	        client: client.clientCommands,
 	        connection
 	      };
 	    };
 
+	    if (!isFirefoxPanel()) {
+	      console.group("Developement Notes");
+	      var baseUrl = "https://devtools-html.github.io/debugger.html";
+	      var localDevelopmentUrl = `${baseUrl}/docs/local-development.html`;
+	      console.log("Debugging Tips", localDevelopmentUrl);
+	      console.log("getGlobalsForTesting", window.getGlobalsForTesting());
+	      console.groupEnd();
+	    }
+
 	    bootstrapApp(connection, { store, actions });
 
 	    return { store, actions, selectors, client: commands };
 	  });
 
 	  return function onConnect(_x, _x2) {
 	    return _ref.apply(this, arguments);
 	  };
@@ -31401,20 +31417,23 @@ return /******/ (function(modules) { // 
 	function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 	var firefox = __webpack_require__(889);
 	var chrome = __webpack_require__(893);
 
 	var _require = __webpack_require__(226),
 	    prefs = _require.prefs;
 
-	var _require2 = __webpack_require__(897),
-	    bootstrapApp = _require2.bootstrapApp,
-	    bootstrapStore = _require2.bootstrapStore,
-	    bootstrapWorkers = _require2.bootstrapWorkers;
+	var _require2 = __webpack_require__(828),
+	    isFirefoxPanel = _require2.isFirefoxPanel;
+
+	var _require3 = __webpack_require__(897),
+	    bootstrapApp = _require3.bootstrapApp,
+	    bootstrapStore = _require3.bootstrapStore,
+	    bootstrapWorkers = _require3.bootstrapWorkers;
 
 	function loadFromPrefs(actions) {
 	  var pauseOnExceptions = prefs.pauseOnExceptions,
 	      ignoreCaughtExceptions = prefs.ignoreCaughtExceptions;
 
 	  if (pauseOnExceptions || ignoreCaughtExceptions) {
 	    return actions.pauseOnExceptions(pauseOnExceptions, ignoreCaughtExceptions);
 	  }
@@ -37188,22 +37207,104 @@ return /******/ (function(modules) { // 
 	  rep: wrapRender(GripMap),
 	  supportsObject
 	};
 
 /***/ },
 /* 960 */
 /***/ function(module, exports) {
 
-	module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\n\n# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from\n# the context menu.\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy Stack Trace\n\n# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from\n# the context menu.\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step Over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step In %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step Out %S\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event Listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.deleteAll=Remove all breakpoints\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove Breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call Stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not Paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse Rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand Rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=no results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next Result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous Result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add Breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable Breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable Breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove Breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit Breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add Conditional Breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add Watch Expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select\n# source tab from the editor context menu item.\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close others\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs\n# from the editor context menu.\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs\n# after the selected tab from the editor context menu.\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the\n# editor context menu.\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in Tree\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the\n# tree from the context menu.\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy Link Address\n\n# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the\n# editor context menu.\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty Print Source\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from\n# the editor context menu.\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.blackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes Unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not Paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch Expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search Sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults=No files matching %S found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous Sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n"
+	module.exports = "# This Source Code Form is subject to the terms of the Mozilla Public\n# License, v. 2.0. If a copy of the MPL was not distributed with this\n# file, You can obtain one at http://mozilla.org/MPL/2.0/.\n\n# LOCALIZATION NOTE These strings are used inside the Debugger\n# which is available from the Web Developer sub-menu -> 'Debugger'.\n# The correct localization of this file might be to keep it in\n# English, or another language commonly spoken among web developers.\n# You want to make that choice consistent across the developer tools.\n# A good criteria is the language in which you'd find the best\n# documentation on web development on the web.\n\n# LOCALIZATION NOTE (collapsePanes): This is the tooltip for the button\n# that collapses the left and right panes in the debugger UI.\ncollapsePanes=Collapse panes\n\n# LOCALIZATION NOTE (copySourceUrl): This is the text that appears in the\n# context menu to copy the source URL of file open.\ncopySourceUrl=Copy Source Url\n\n# LOCALIZATION NOTE (copySourceUrl.accesskey): Access key to copy the source URL of a file from\n# the context menu.\ncopySourceUrl.accesskey=u\n\n# LOCALIZATION NOTE (copyStackTrace): This is the text that appears in the\n# context menu to copy the stack trace methods, file names and row number.\ncopyStackTrace=Copy Stack Trace\n\n# LOCALIZATION NOTE (copyStackTrace.accesskey): Access key to copy the stack trace data from\n# the context menu.\ncopyStackTrace.accesskey=c\n\n# LOCALIZATION NOTE (expandPanes): This is the tooltip for the button\n# that expands the left and right panes in the debugger UI.\nexpandPanes=Expand panes\n\n# LOCALIZATION NOTE (pauseButtonTooltip): The tooltip that is displayed for the pause\n# button when the debugger is in a running state.\npauseButtonTooltip=Pause %S\n\n# LOCALIZATION NOTE (pausePendingButtonTooltip): The tooltip that is displayed for\n# the pause button after it's been clicked but before the next JavaScript to run.\npausePendingButtonTooltip=Waiting for next execution\n\n# LOCALIZATION NOTE (resumeButtonTooltip): The label that is displayed on the pause\n# button when the debugger is in a paused state.\nresumeButtonTooltip=Resume %S\n\n# LOCALIZATION NOTE (stepOverTooltip): The label that is displayed on the\n# button that steps over a function call.\nstepOverTooltip=Step Over %S\n\n# LOCALIZATION NOTE (stepInTooltip): The label that is displayed on the\n# button that steps into a function call.\nstepInTooltip=Step In %S\n\n# LOCALIZATION NOTE (stepOutTooltip): The label that is displayed on the\n# button that steps out of a function call.\nstepOutTooltip=Step Out %S\n\n# LOCALIZATION NOTE (noWorkersText): The text to display in the workers list\n# when there are no workers.\nnoWorkersText=This page has no workers.\n\n# LOCALIZATION NOTE (noSourcesText): The text to display in the sources list\n# when there are no sources.\nnoSourcesText=This page has no sources.\n\n# LOCALIZATION NOTE (noEventListenersText): The text to display in the events tab\n# when there are no events.\nnoEventListenersText=No event listeners to display\n\n# LOCALIZATION NOTE (eventListenersHeader): The text to display in the events\n# header.\neventListenersHeader=Event Listeners\n\n# LOCALIZATION NOTE (noStackFramesText): The text to display in the call stack tab\n# when there are no stack frames.\nnoStackFramesText=No stack frames to display\n\n# LOCALIZATION NOTE (eventCheckboxTooltip): The tooltip text to display when\n# the user hovers over the checkbox used to toggle an event breakpoint.\neventCheckboxTooltip=Toggle breaking on this event\n\n# LOCALIZATION NOTE (eventOnSelector): The text to display in the events tab\n# for every event item, between the event type and event selector.\neventOnSelector=on\n\n# LOCALIZATION NOTE (eventInSource): The text to display in the events tab\n# for every event item, between the event selector and listener's owner source.\neventInSource=in\n\n# LOCALIZATION NOTE (eventNodes): The text to display in the events tab when\n# an event is listened on more than one target node.\neventNodes=%S nodes\n\n# LOCALIZATION NOTE (eventNative): The text to display in the events tab when\n# a listener is added from plugins, thus getting translated to native code.\neventNative=[native code]\n\n# LOCALIZATION NOTE (*Events): The text to display in the events tab for\n# each group of sub-level event entries.\nanimationEvents=Animation\naudioEvents=Audio\nbatteryEvents=Battery\nclipboardEvents=Clipboard\ncompositionEvents=Composition\ndeviceEvents=Device\ndisplayEvents=Display\ndragAndDropEvents=Drag and Drop\ngamepadEvents=Gamepad\nindexedDBEvents=IndexedDB\ninteractionEvents=Interaction\nkeyboardEvents=Keyboard\nmediaEvents=HTML5 Media\nmouseEvents=Mouse\nmutationEvents=Mutation\nnavigationEvents=Navigation\npointerLockEvents=Pointer Lock\nsensorEvents=Sensor\nstorageEvents=Storage\ntimeEvents=Time\ntouchEvents=Touch\notherEvents=Other\n\n# LOCALIZATION NOTE (blackboxCheckboxTooltip2): The tooltip text to display when\n# the user hovers over the checkbox used to toggle blackboxing its associated\n# source.\nblackboxCheckboxTooltip2=Toggle blackboxing\n\n# LOCALIZATION NOTE (sources.search.key2): Key shortcut to open the search for\n# searching all the source files the debugger has seen.\nsources.search.key2=CmdOrCtrl+P\n\n# LOCALIZATION NOTE (sources.search.alt.key): A second key shortcut to open the\n# search for searching all the source files the debugger has seen.\nsources.search.alt.key=CmdOrCtrl+O\n\n# LOCALIZATION NOTE (sources.noSourcesAvailable): Text shown when the debugger\n# does not have any sources.\nsources.noSourcesAvailable=This page has no sources\n\n# LOCALIZATION NOTE (sourceSearch.search.key2): Key shortcut to open the search\n# for searching within a the currently opened files in the editor\nsourceSearch.search.key2=CmdOrCtrl+F\n\n# LOCALIZATION NOTE (sourceSearch.search.placeholder): placeholder text in\n# the source search input bar\nsourceSearch.search.placeholder=Search in file…\n\n# LOCALIZATION NOTE (sourceSearch.search.again.key2): Key shortcut to highlight\n# the next occurrence of the last search triggered from a source search\nsourceSearch.search.again.key2=CmdOrCtrl+G\n\n# LOCALIZATION NOTE (sourceSearch.search.againPrev.key2): Key shortcut to highlight\n# the previous occurrence of the last search triggered from a source search\nsourceSearch.search.againPrev.key2=CmdOrCtrl+Shift+G\n\n# LOCALIZATION NOTE (sourceSearch.resultsSummary1): Shows a summary of\n# the number of matches for autocomplete\nsourceSearch.resultsSummary1=%d results\n\n# LOCALIZATION NOTE (noMatchingStringsText): The text to display in the\n# global search results when there are no matching strings after filtering.\nnoMatchingStringsText=No matches found\n\n# LOCALIZATION NOTE (emptySearchText): This is the text that appears in the\n# filter text box when it is empty and the scripts container is selected.\nemptySearchText=Search scripts (%S)\n\n# LOCALIZATION NOTE (emptyVariablesFilterText): This is the text that\n# appears in the filter text box for the variables view container.\nemptyVariablesFilterText=Filter variables\n\n# LOCALIZATION NOTE (emptyPropertiesFilterText): This is the text that\n# appears in the filter text box for the editor's variables view bubble.\nemptyPropertiesFilterText=Filter properties\n\n# LOCALIZATION NOTE (searchPanelFilter): This is the text that appears in the\n# filter panel popup for the filter scripts operation.\nsearchPanelFilter=Filter scripts (%S)\n\n# LOCALIZATION NOTE (searchPanelGlobal): This is the text that appears in the\n# filter panel popup for the global search operation.\nsearchPanelGlobal=Search in all files (%S)\n\n# LOCALIZATION NOTE (searchPanelFunction): This is the text that appears in the\n# filter panel popup for the function search operation.\nsearchPanelFunction=Search for function definition (%S)\n\n# LOCALIZATION NOTE (searchPanelToken): This is the text that appears in the\n# filter panel popup for the token search operation.\nsearchPanelToken=Find in this file (%S)\n\n# LOCALIZATION NOTE (searchPanelGoToLine): This is the text that appears in the\n# filter panel popup for the line search operation.\nsearchPanelGoToLine=Go to line (%S)\n\n# LOCALIZATION NOTE (searchPanelVariable): This is the text that appears in the\n# filter panel popup for the variables search operation.\nsearchPanelVariable=Filter variables (%S)\n\n# LOCALIZATION NOTE (breakpointMenuItem): The text for all the elements that\n# are displayed in the breakpoints menu item popup.\nbreakpointMenuItem.setConditional=Configure conditional breakpoint\nbreakpointMenuItem.enableSelf=Enable breakpoint\nbreakpointMenuItem.disableSelf=Disable breakpoint\nbreakpointMenuItem.deleteSelf=Remove breakpoint\nbreakpointMenuItem.enableOthers=Enable others\nbreakpointMenuItem.disableOthers=Disable others\nbreakpointMenuItem.deleteOthers=Remove others\nbreakpointMenuItem.enableAll=Enable all breakpoints\nbreakpointMenuItem.disableAll=Disable all breakpoints\nbreakpointMenuItem.deleteAll=Remove all breakpoints\n\n# LOCALIZATION NOTE (breakpoints.header): Breakpoints right sidebar pane header.\nbreakpoints.header=Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.none): The text that appears when there are\n# no breakpoints present\nbreakpoints.none=No Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.enable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.enable=Enable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.disable): The text that may appear as a tooltip\n# when hovering over the 'disable breakpoints' switch button in right sidebar\nbreakpoints.disable=Disable Breakpoints\n\n# LOCALIZATION NOTE (breakpoints.removeBreakpointTooltip): The tooltip that is displayed\n# for remove breakpoint button in right sidebar\nbreakpoints.removeBreakpointTooltip=Remove Breakpoint\n\n# LOCALIZATION NOTE (callStack.header): Call Stack right sidebar pane header.\ncallStack.header=Call Stack\n\n# LOCALIZATION NOTE (callStack.notPaused): Call Stack right sidebar pane\n# message when not paused.\ncallStack.notPaused=Not Paused\n\n# LOCALIZATION NOTE (callStack.collapse): Call Stack right sidebar pane\n# message to hide some of the frames that are shown.\ncallStack.collapse=Collapse Rows\n\n# LOCALIZATION NOTE (callStack.expand): Call Stack right sidebar pane\n# message to show more of the frames.\ncallStack.expand=Expand Rows\n\n# LOCALIZATION NOTE (editor.searchResults): Editor Search bar message\n# for the summarizing the selected search result. e.g. 5 of 10 results.\neditor.searchResults=%d of %d results\n\n# LOCALIZATION NOTE (sourceSearch.singleResult): Copy shown when there is one result.\neditor.singleResult=1 result\n\n# LOCALIZATION NOTE (editor.noResults): Editor Search bar message\n# for when no results found.\neditor.noResults=no results\n\n# LOCALIZATION NOTE (editor.searchResults.nextResult): Editor Search bar\n# tooltip for traversing to the Next Result\neditor.searchResults.nextResult=Next Result\n\n# LOCALIZATION NOTE (editor.searchResults.prevResult): Editor Search bar\n# tooltip for traversing to the Previous Result\neditor.searchResults.prevResult=Previous Result\n\n# LOCALIZATION NOTE (editor.searchTypeToggleTitle): Search bar title for\n# toggling search type buttons(function search, variable search)\neditor.searchTypeToggleTitle=Search for:\n\n# LOCALIZATION NOTE (editor.addBreakpoint): Editor gutter context menu item\n# for adding a breakpoint on a line.\neditor.addBreakpoint=Add Breakpoint\n\n# LOCALIZATION NOTE (editor.disableBreakpoint): Editor gutter context menu item\n# for disabling a breakpoint on a line.\neditor.disableBreakpoint=Disable Breakpoint\n\n# LOCALIZATION NOTE (editor.enableBreakpoint): Editor gutter context menu item\n# for enabling a breakpoint on a line.\neditor.enableBreakpoint=Enable Breakpoint\n\n# LOCALIZATION NOTE (editor.removeBreakpoint): Editor gutter context menu item\n# for removing a breakpoint on a line.\neditor.removeBreakpoint=Remove Breakpoint\n\n# LOCALIZATION NOTE (editor.editBreakpoint): Editor gutter context menu item\n# for setting a breakpoint condition on a line.\neditor.editBreakpoint=Edit Breakpoint\n\n# LOCALIZATION NOTE (editor.addConditionalBreakpoint): Editor gutter context\n# menu item for adding a breakpoint condition on a line.\neditor.addConditionalBreakpoint=Add Conditional Breakpoint\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Placeholder text for\n# input element inside ConditionalPanel component\neditor.conditionalPanel.placeholder=This breakpoint will pause when the expression is true\n\n# LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for\n# close button inside ConditionalPanel component\neditor.conditionalPanel.close=Cancel edit breakpoint and close\n\n# LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item\n# for navigating to a source mapped location\neditor.jumpToMappedLocation1=Jump to %S location\n\n# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the\n# context menu to disable framework grouping.\nframework.disableGrouping=Disable Framework Grouping\n\n# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the\n# context menu to enable framework grouping.\nframework.enableGrouping=Enable Framework Grouping\n\n# LOCALIZATION NOTE (framework.accesskey): Access key to toggle framework grouping from\n# the context menu.\nframework.accesskey=u\n\n# LOCALIZATION NOTE (generated): Source Map term for a server source location\ngenerated=generated\n\n# LOCALIZATION NOTE (original): Source Map term for a debugger UI source location\noriginal=original\n\n# LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression\n# input element\nexpressions.placeholder=Add Watch Expression\n\n# LOCALIZATION NOTE (sourceTabs.closeTab): Editor source tab context menu item\n# for closing the selected tab below the mouse.\nsourceTabs.closeTab=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.closeTab.accesskey): Access key to close the currently select\n# source tab from the editor context menu item.\nsourceTabs.closeTab.accesskey=c\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs): Editor source tab context menu item\n# for closing the other tabs.\nsourceTabs.closeOtherTabs=Close others\n\n# LOCALIZATION NOTE (sourceTabs.closeOtherTabs.accesskey): Access key to close other source tabs\n# from the editor context menu.\nsourceTabs.closeOtherTabs.accesskey=o\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd): Editor source tab context menu item\n# for closing the tabs to the end (the right for LTR languages) of the selected tab.\nsourceTabs.closeTabsToEnd=Close tabs to the right\n\n# LOCALIZATION NOTE (sourceTabs.closeTabsToEnd.accesskey): Access key to close source tabs\n# after the selected tab from the editor context menu.\nsourceTabs.closeTabsToEnd.accesskey=e\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs): Editor source tab context menu item\n# for closing all tabs.\nsourceTabs.closeAllTabs=Close all tabs\n\n# LOCALIZATION NOTE (sourceTabs.closeAllTabs.accesskey): Access key to close all tabs from the\n# editor context menu.\nsourceTabs.closeAllTabs.accesskey=a\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree): Editor source tab context menu item\n# for revealing source in tree.\nsourceTabs.revealInTree=Reveal in Tree\n\n# LOCALIZATION NOTE (sourceTabs.revealInTree.accesskey): Access key to reveal a source in the\n# tree from the context menu.\nsourceTabs.revealInTree.accesskey=r\n\n# LOCALIZATION NOTE (sourceTabs.copyLink): Editor source tab context menu item\n# for copying a link address.\nsourceTabs.copyLink=Copy Link Address\n\n# LOCALIZATION NOTE (sourceTabs.copyLink.accesskey): Access key to copy a link addresss from the\n# editor context menu.\nsourceTabs.copyLink.accesskey=l\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint): Editor source tab context menu item\n# for pretty printing the source.\nsourceTabs.prettyPrint=Pretty Print Source\n\n# LOCALIZATION NOTE (sourceTabs.prettyPrint.accesskey): Access key to pretty print a source from\n# the editor context menu.\nsourceTabs.prettyPrint.accesskey=p\n\n# LOCALIZATION NOTE (sourceFooter.blackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.blackbox=Blackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.unblackbox): Tooltip text associated\n# with the blackbox button\nsourceFooter.unblackbox=Unblackbox Source\n\n# LOCALIZATION NOTE (sourceFooter.blackbox.accesskey): Access key to blackbox\n# an associated source\nsourceFooter.blackbox.accesskey=b\n\n# LOCALIZATION NOTE (sourceFooter.blackboxed): Text associated\n# with a blackboxed source\nsourceFooter.blackboxed=Blackboxed Source\n\n# LOCALIZATION NOTE (sourceTabs.closeTabButtonTooltip): The tooltip that is displayed\n# for close tab button in source tabs.\nsourceTabs.closeTabButtonTooltip=Close tab\n\n# LOCALIZATION NOTE (sourceTabs.newTabButtonTooltip): The tooltip that is displayed for\n# new tab button in source tabs.\nsourceTabs.newTabButtonTooltip=Search for sources (%S)\n\n# LOCALIZATION NOTE (scopes.header): Scopes right sidebar pane header.\nscopes.header=Scopes\n\n# LOCALIZATION NOTE (scopes.notAvailable): Scopes right sidebar pane message\n# for when the debugger is paused, but there isn't pause data.\nscopes.notAvailable=Scopes Unavailable\n\n# LOCALIZATION NOTE (scopes.notPaused): Scopes right sidebar pane message\n# for when the debugger is not paused.\nscopes.notPaused=Not Paused\n\n# LOCALIZATION NOTE (scopes.block): Refers to a block of code in\n# the scopes pane when the debugger is paused.\nscopes.block=Block\n\n# LOCALIZATION NOTE (sources.header): Sources left sidebar header\nsources.header=Sources\n\n# LOCALIZATION NOTE (sources.search): Sources left sidebar prompt\n# e.g. Cmd+P to search. On a mac, we use the command unicode character.\n# On windows, it's ctrl.\nsources.search=%S to search\n\n# LOCALIZATION NOTE (watchExpressions.header): Watch Expressions right sidebar\n# pane header.\nwatchExpressions.header=Watch Expressions\n\n# LOCALIZATION NOTE (watchExpressions.refreshButton): Watch Expressions header\n# button for refreshing the expressions.\nwatchExpressions.refreshButton=Refresh\n\n# LOCALIZATION NOTE (welcome.search): The center pane welcome panel's\n# search prompt. e.g. cmd+p to search for files. On windows, it's ctrl, on\n# a mac we use the unicode character.\nwelcome.search=%S to search for sources\n\n# LOCALIZATION NOTE (sourceSearch.search): The center pane Source Search\n# prompt for searching for files.\nsourceSearch.search=Search Sources…\n\n# LOCALIZATION NOTE (sourceSearch.noResults): The center pane Source Search\n# message when the query did not match any of the sources.\nsourceSearch.noResults=No files matching %S found\n\n# LOCALIZATION NOTE (ignoreExceptions): The pause on exceptions button tooltip\n# when the debugger will not pause on exceptions.\nignoreExceptions=Ignore exceptions. Click to pause on uncaught exceptions\n\n# LOCALIZATION NOTE (pauseOnUncaughtExceptions): The pause on exceptions button\n# tooltip when the debugger will pause on uncaught exceptions.\npauseOnUncaughtExceptions=Pause on uncaught exceptions. Click to pause on all exceptions\n\n# LOCALIZATION NOTE (pauseOnExceptions): The pause on exceptions button tooltip\n# when the debugger will pause on all exceptions.\npauseOnExceptions=Pause on all exceptions. Click to ignore exceptions\n\n# LOCALIZATION NOTE (loadingText): The text that is displayed in the script\n# editor when the loading process has started but there is no file to display\n# yet.\nloadingText=Loading\\u2026\n\n# LOCALIZATION NOTE (errorLoadingText2): The text that is displayed in the debugger\n# viewer when there is an error loading a file\nerrorLoadingText2=Error loading this URL: %S\n\n# LOCALIZATION NOTE (addWatchExpressionText): The text that is displayed in the\n# watch expressions list to add a new item.\naddWatchExpressionText=Add watch expression\n\n# LOCALIZATION NOTE (addWatchExpressionButton): The button that is displayed in the\n# variables view popup.\naddWatchExpressionButton=Watch\n\n# LOCALIZATION NOTE (emptyVariablesText): The text that is displayed in the\n# variables pane when there are no variables to display.\nemptyVariablesText=No variables to display\n\n# LOCALIZATION NOTE (scopeLabel): The text that is displayed in the variables\n# pane as a header for each variable scope (e.g. \"Global scope, \"With scope\",\n# etc.).\nscopeLabel=%S scope\n\n# LOCALIZATION NOTE (watchExpressionsScopeLabel): The name of the watch\n# expressions scope. This text is displayed in the variables pane as a header for\n# the watch expressions scope.\nwatchExpressionsScopeLabel=Watch expressions\n\n# LOCALIZATION NOTE (globalScopeLabel): The name of the global scope. This text\n# is added to scopeLabel and displayed in the variables pane as a header for\n# the global scope.\nglobalScopeLabel=Global\n\n# LOCALIZATION NOTE (variablesViewErrorStacktrace): This is the text that is\n# shown before the stack trace in an error.\nvariablesViewErrorStacktrace=Stack trace:\n\n# LOCALIZATION NOTE (variablesViewMoreObjects): the text that is displayed\n# when you have an object preview that does not show all of the elements. At the end of the list\n# you see \"N more...\" in the web console output.\n# This is a semi-colon list of plural forms.\n# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals\n# #1 number of remaining items in the object\n# example: 3 more…\nvariablesViewMoreObjects=#1 more…;#1 more…\n\n# LOCALIZATION NOTE (variablesEditableNameTooltip): The text that is displayed\n# in the variables list on an item with an editable name.\nvariablesEditableNameTooltip=Double click to edit\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in the variables list on an item with an editable value.\nvariablesEditableValueTooltip=Click to change value\n\n# LOCALIZATION NOTE (variablesCloseButtonTooltip): The text that is displayed\n# in the variables list on an item which can be removed.\nvariablesCloseButtonTooltip=Click to remove\n\n# LOCALIZATION NOTE (variablesEditButtonTooltip): The text that is displayed\n# in the variables list on a getter or setter which can be edited.\nvariablesEditButtonTooltip=Click to set value\n\n# LOCALIZATION NOTE (variablesEditableValueTooltip): The text that is displayed\n# in a tooltip on the \"open in inspector\" button in the the variables list for a\n# DOMNode item.\nvariablesDomNodeValueTooltip=Click to select the node in the inspector\n\n# LOCALIZATION NOTE (configurable|...|Tooltip): The text that is displayed\n# in the variables list on certain variables or properties as tooltips.\n# Expanations of what these represent can be found at the following links:\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen\n# https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed\n# It's probably best to keep these in English.\nconfigurableTooltip=configurable\nenumerableTooltip=enumerable\nwritableTooltip=writable\nfrozenTooltip=frozen\nsealedTooltip=sealed\nextensibleTooltip=extensible\noverriddenTooltip=overridden\nWebIDLTooltip=WebIDL\n\n# LOCALIZATION NOTE (variablesSeparatorLabel): The text that is displayed\n# in the variables list as a separator between the name and value.\nvariablesSeparatorLabel=:\n\n# LOCALIZATION NOTE (watchExpressionsSeparatorLabel2): The text that is displayed\n# in the watch expressions list as a separator between the code and evaluation.\nwatchExpressionsSeparatorLabel2=\\u0020→\n\n# LOCALIZATION NOTE (functionSearchSeparatorLabel): The text that is displayed\n# in the functions search panel as a separator between function's inferred name\n# and its real name (if available).\nfunctionSearchSeparatorLabel=←\n\n# LOCALIZATION NOTE(symbolSearch.search.functionsPlaceholder): The placeholder\n# text displayed when the user searches for functions in a file\nsymbolSearch.search.functionsPlaceholder=Search functions…\n\n# LOCALIZATION NOTE(symbolSearch.search.variablesPlaceholder): The placeholder\n# text displayed when the user searches for variables in a file\nsymbolSearch.search.variablesPlaceholder=Search variables…\n\n# LOCALIZATION NOTE(symbolSearch.search.key2): The Key Shortcut for\n# searching for a function or variable\nsymbolSearch.search.key2=CmdOrCtrl+Shift+O\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.regex): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.regex=Regex\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.caseSensitive): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.caseSensitive=Case sensitive\n\n# LOCALIZATION NOTE(symbolSearch.searchModifier.wholeWord): A search option\n# when searching text in a file\nsymbolSearch.searchModifier.wholeWord=Whole word\n\n# LOCALIZATION NOTE (resumptionOrderPanelTitle): This is the text that appears\n# as a description in the notification panel popup, when multiple debuggers are\n# open in separate tabs and the user tries to resume them in the wrong order.\n# The substitution parameter is the URL of the last paused window that must be\n# resumed first.\nresumptionOrderPanelTitle=There are one or more paused debuggers. Please resume the most-recently paused debugger first at: %S\n\nvariablesViewOptimizedOut=(optimized away)\nvariablesViewUninitialized=(uninitialized)\nvariablesViewMissingArgs=(unavailable)\n\nanonymousSourcesLabel=Anonymous Sources\n\nexperimental=This is an experimental feature\n\n# LOCALIZATION NOTE (whyPaused.debuggerStatement): The text that is displayed\n# in a info block explaining how the debugger is currently paused due to a `debugger`\n# statement in the code\nwhyPaused.debuggerStatement=Paused on debugger statement\n\n# LOCALIZATION NOTE (whyPaused.breakpoint): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a breakpoint\nwhyPaused.breakpoint=Paused on breakpoint\n\n# LOCALIZATION NOTE (whyPaused.exception): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an exception\nwhyPaused.exception=Paused on exception\n\n# LOCALIZATION NOTE (whyPaused.resumeLimit): The text that is displayed\n# in a info block explaining how the debugger is currently paused while stepping\n# in or out of the stack\nwhyPaused.resumeLimit=Paused while stepping\n\n# LOCALIZATION NOTE (whyPaused.pauseOnDOMEvents): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# dom event\nwhyPaused.pauseOnDOMEvents=Paused on event listener\n\n# LOCALIZATION NOTE (whyPaused.breakpointConditionThrown): The text that is displayed\n# in an info block when evaluating a conditional breakpoint throws an error\nwhyPaused.breakpointConditionThrown=Error with conditional breakpoint\n\n# LOCALIZATION NOTE (whyPaused.xhr): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# xml http request\nwhyPaused.xhr=Paused on XMLHttpRequest\n\n# LOCALIZATION NOTE (whyPaused.promiseRejection): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# promise rejection\nwhyPaused.promiseRejection=Paused on promise rejection\n\n# LOCALIZATION NOTE (whyPaused.assert): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an\n# assert\nwhyPaused.assert=Paused on assertion\n\n# LOCALIZATION NOTE (whyPaused.debugCommand): The text that is displayed\n# in a info block explaining how the debugger is currently paused on a\n# debugger statement\nwhyPaused.debugCommand=Paused on debugged function\n\n# LOCALIZATION NOTE (whyPaused.other): The text that is displayed\n# in a info block explaining how the debugger is currently paused on an event\n# listener breakpoint set\nwhyPaused.other=Debugger paused\n\n# LOCALIZATION NOTE (ctrl): The text that is used for documenting\n# keyboard shortcuts that use the control key\nctrl=Ctrl\n"
 
 /***/ },
 /* 961 */,
 /* 962 */,
-/* 963 */,
+/* 963 */
+/***/ function(module, exports, __webpack_require__) {
+
+	var baseKeys = __webpack_require__(217),
+	    getTag = __webpack_require__(198),
+	    isArguments = __webpack_require__(208),
+	    isArray = __webpack_require__(70),
+	    isArrayLike = __webpack_require__(220),
+	    isBuffer = __webpack_require__(210),
+	    isPrototype = __webpack_require__(218),
+	    isTypedArray = __webpack_require__(212);
+
+	/** `Object#toString` result references. */
+	var mapTag = '[object Map]',
+	    setTag = '[object Set]';
+
+	/** Used for built-in method references. */
+	var objectProto = Object.prototype;
+
+	/** Used to check objects for own properties. */
+	var hasOwnProperty = objectProto.hasOwnProperty;
+
+	/**
+	 * Checks if `value` is an empty object, collection, map, or set.
+	 *
+	 * Objects are considered empty if they have no own enumerable string keyed
+	 * properties.
+	 *
+	 * Array-like values such as `arguments` objects, arrays, buffers, strings, or
+	 * jQuery-like collections are considered empty if they have a `length` of `0`.
+	 * Similarly, maps and sets are considered empty if they have a `size` of `0`.
+	 *
+	 * @static
+	 * @memberOf _
+	 * @since 0.1.0
+	 * @category Lang
+	 * @param {*} value The value to check.
+	 * @returns {boolean} Returns `true` if `value` is empty, else `false`.
+	 * @example
+	 *
+	 * _.isEmpty(null);
+	 * // => true
+	 *
+	 * _.isEmpty(true);
+	 * // => true
+	 *
+	 * _.isEmpty(1);
+	 * // => true
+	 *
+	 * _.isEmpty([1, 2, 3]);
+	 * // => false
+	 *
+	 * _.isEmpty({ 'a': 1 });
+	 * // => false
+	 */
+	function isEmpty(value) {
+	  if (value == null) {
+	    return true;
+	  }
+	  if (isArrayLike(value) &&
+	      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
+	        isBuffer(value) || isTypedArray(value) || isArguments(value))) {
+	    return !value.length;
+	  }
+	  var tag = getTag(value);
+	  if (tag == mapTag || tag == setTag) {
+	    return !value.size;
+	  }
+	  if (isPrototype(value)) {
+	    return !baseKeys(value).length;
+	  }
+	  for (var key in value) {
+	    if (hasOwnProperty.call(value, key)) {
+	      return false;
+	    }
+	  }
+	  return true;
+	}
+
+	module.exports = isEmpty;
+
+
+/***/ },
 /* 964 */,
 /* 965 */
 /***/ function(module, exports) {
 
 	
 	/**
 	 * slice() reference.
 	 */
@@ -47153,34 +47254,46 @@ return /******/ (function(modules) { // 
 	var FrameComponent = (0, _react.createFactory)(_Frame2.default);
 
 	var Group = (0, _react.createFactory)(_Group3.default);
 
 	var NUM_FRAMES_SHOWN = 7;
 
 	class Frames extends _react.Component {
 
+	  collapseFrames(frames) {
+	    var frameworkGroupingOn = this.props.frameworkGroupingOn;
+
+	    if (!frameworkGroupingOn) {
+	      return frames;
+	    }
+
+	    return (0, _frame.collapseFrames)(frames);
+	  }
+
 	  constructor() {
 	    super(...arguments);
 
 	    this.state = {
 	      showAllFrames: false
 	    };
 
 	    this.toggleFramesDisplay = this.toggleFramesDisplay.bind(this);
 	    this.copyStackTrace = this.copyStackTrace.bind(this);
+	    this.toggleFrameworkGrouping = this.toggleFrameworkGrouping.bind(this);
 	  }
 
 	  shouldComponentUpdate(nextProps, nextState) {
 	    var _props = this.props,
 	        frames = _props.frames,
-	        selectedFrame = _props.selectedFrame;
+	        selectedFrame = _props.selectedFrame,
+	        frameworkGroupingOn = _props.frameworkGroupingOn;
 	    var showAllFrames = this.state.showAllFrames;
 
-	    return frames !== nextProps.frames || selectedFrame !== nextProps.selectedFrame || showAllFrames !== nextState.showAllFrames;
+	    return frames !== nextProps.frames || selectedFrame !== nextProps.selectedFrame || showAllFrames !== nextState.showAllFrames || frameworkGroupingOn !== nextProps.frameworkGroupingOn;
 	  }
 
 	  toggleFramesDisplay() {
 	    this.setState({
 	      showAllFrames: !this.state.showAllFrames
 	    });
 	  }
 
@@ -47192,35 +47305,48 @@ return /******/ (function(modules) { // 
 
 	  copyStackTrace() {
 	    var frames = this.props.frames;
 
 	    var framesToCopy = frames.map(f => (0, _frame.formatCopyName)(f)).join("\n");
 	    (0, _clipboard.copyToTheClipboard)(framesToCopy);
 	  }
 
-	  renderFrames(frames) {
+	  toggleFrameworkGrouping() {
 	    var _props2 = this.props,
-	        selectFrame = _props2.selectFrame,
-	        selectedFrame = _props2.selectedFrame;
-
-
-	    var framesOrGroups = this.truncateFrames((0, _frame.collapseFrames)(frames));
+	        toggleFrameworkGrouping = _props2.toggleFrameworkGrouping,
+	        frameworkGroupingOn = _props2.frameworkGroupingOn;
+
+	    toggleFrameworkGrouping(!frameworkGroupingOn);
+	  }
+
+	  renderFrames(frames) {
+	    var _props3 = this.props,
+	        selectFrame = _props3.selectFrame,
+	        selectedFrame = _props3.selectedFrame,
+	        frameworkGroupingOn = _props3.frameworkGroupingOn;
+
+
+	    var framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
 
 
 	    return _react.DOM.ul({}, framesOrGroups.map(frameOrGroup => frameOrGroup.id ? FrameComponent({
 	      frame: frameOrGroup,
+	      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
 	      copyStackTrace: this.copyStackTrace,
+	      frameworkGroupingOn,
 	      frames,
 	      selectFrame,
 	      selectedFrame,
 	      key: frameOrGroup.id
 	    }) : Group({
 	      group: frameOrGroup,
+	      toggleFrameworkGrouping: this.toggleFrameworkGrouping,
 	      copyStackTrace: this.copyStackTrace,
+	      frameworkGroupingOn,
 	      selectFrame,
 	      selectedFrame,
 	      key: frameOrGroup[0].id
 	    })));
 	  }
 
 	  renderToggleButton(frames) {
 	    var buttonMessage = this.state.showAllFrames ? L10N.getStr("callStack.collapse") : L10N.getStr("callStack.expand");
@@ -47242,16 +47368,18 @@ return /******/ (function(modules) { // 
 	    }
 
 	    return _react.DOM.div({ className: "pane frames" }, this.renderFrames(frames), this.renderToggleButton(frames));
 	  }
 	}
 
 	Frames.propTypes = {
 	  frames: _react.PropTypes.array,
+	  frameworkGroupingOn: _react.PropTypes.bool.isRequired,
+	  toggleFrameworkGrouping: _react.PropTypes.func.isRequired,
 	  selectedFrame: _react.PropTypes.object,
 	  selectFrame: _react.PropTypes.func.isRequired
 	};
 
 	Frames.displayName = "Frames";
 
 	function getSourceForFrame(sources, frame) {
 	  return (0, _selectors.getSourceInSources)(sources, frame.location.sourceId);
@@ -47263,23 +47391,24 @@ return /******/ (function(modules) { // 
 	  });
 	}
 
 	var getAndProcessFrames = (0, _reselect.createSelector)(_selectors.getFrames, _selectors.getSources, (frames, sources) => {
 	  if (!frames) {
 	    return null;
 	  }
 
-	  frames = frames.toJS().filter(frame => getSourceForFrame(sources, frame)).filter(frame => !get(frame, "source.isBlackBoxed")).map(frame => appendSource(sources, frame)).map(_frame.annotateFrame);
+	  frames = frames.filter(frame => getSourceForFrame(sources, frame)).filter(frame => !get(frame, "source.isBlackBoxed")).map(frame => appendSource(sources, frame)).map(_frame.annotateFrame);
 
 	  return frames;
 	});
 
 	exports.default = (0, _reactRedux.connect)(state => ({
 	  frames: getAndProcessFrames(state),
+	  frameworkGroupingOn: (0, _selectors.getFrameworkGroupingState)(state),
 	  selectedFrame: (0, _selectors.getSelectedFrame)(state)
 	}), dispatch => (0, _redux.bindActionCreators)(_actions2.default, dispatch))(Frames);
 
 /***/ },
 /* 1013 */
 /***/ function(module, exports, __webpack_require__) {
 
 	"use strict";
@@ -47334,19 +47463,21 @@ return /******/ (function(modules) { // 
 
 	  constructor() {
 	    super(...arguments);
 	  }
 
 	  onContextMenu(event) {
 	    var _props = this.props,
 	        frame = _props.frame,
-	        copyStackTrace = _props.copyStackTrace;
-
-	    (0, _FrameMenu2.default)(frame, copyStackTrace, event);
+	        copyStackTrace = _props.copyStackTrace,
+	        toggleFrameworkGrouping = _props.toggleFrameworkGrouping,
+	        frameworkGroupingOn = _props.frameworkGroupingOn;
+
+	    (0, _FrameMenu2.default)(frame, frameworkGroupingOn, { copyStackTrace, toggleFrameworkGrouping }, event);
 	  }
 
 	  onMouseDown(e, frame, selectedFrame) {
 	    if (e.nativeEvent.which == 3 && selectedFrame.id != frame.id) {
 	      return;
 	    }
 	    this.props.selectFrame(frame);
 	  }
@@ -47688,40 +47819,46 @@ return /******/ (function(modules) { // 
 	    var self = this;
 
 	    self.toggleFrames = this.toggleFrames.bind(this);
 	  }
 
 	  onContextMenu(event) {
 	    var _props = this.props,
 	        group = _props.group,
-	        copyStackTrace = _props.copyStackTrace;
+	        copyStackTrace = _props.copyStackTrace,
+	        toggleFrameworkGrouping = _props.toggleFrameworkGrouping,
+	        frameworkGroupingOn = _props.frameworkGroupingOn;
 
 	    var frame = group[0];
-	    (0, _FrameMenu2.default)(frame, copyStackTrace, event);
+	    (0, _FrameMenu2.default)(frame, frameworkGroupingOn, { copyStackTrace, toggleFrameworkGrouping }, event);
 	  }
 
 	  toggleFrames() {
 	    this.setState({ expanded: !this.state.expanded });
 	  }
 
 	  renderFrames() {
 	    var _props2 = this.props,
 	        group = _props2.group,
 	        selectFrame = _props2.selectFrame,
 	        selectedFrame = _props2.selectedFrame,
+	        toggleFrameworkGrouping = _props2.toggleFrameworkGrouping,
+	        frameworkGroupingOn = _props2.frameworkGroupingOn,
 	        copyStackTrace = _props2.copyStackTrace;
 	    var expanded = this.state.expanded;
 
 	    if (!expanded) {
 	      return null;
 	    }
 	    return _react.DOM.div({ className: "frames-list" }, group.map(frame => FrameComponent({
 	      frame,
 	      copyStackTrace,
+	      toggleFrameworkGrouping,
+	      frameworkGroupingOn,
 	      selectFrame,
 	      selectedFrame,
 	      key: frame.id,
 	      hideLocation: true,
 	      shouldMapDisplayName: false
 	    })));
 	  }
 
@@ -47779,16 +47916,20 @@ return /******/ (function(modules) { // 
 	});
 
 	var _react = __webpack_require__(2);
 
 	var _range = __webpack_require__(1026);
 
 	var _range2 = _interopRequireDefault(_range);
 
+	var _isEmpty = __webpack_require__(963);
+
+	var _isEmpty2 = _interopRequireDefault(_isEmpty);
+
 	function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 	class HighlightLines extends _react.Component {
 
 	  constructor() {
 	    super();
 	    this.highlightLineRange = this.highlightLineRange.bind(this);
 	  }
@@ -47821,17 +47962,17 @@ return /******/ (function(modules) { // 
 
 	    if (!editor) {
 	      return;
 	    }
 
 	    var codeMirror = editor.codeMirror;
 
 
-	    if (!highlightedLineRange || !editor || !codeMirror) {
+	    if ((0, _isEmpty2.default)(highlightedLineRange) || !editor || !codeMirror) {
 	      return;
 	    }
 
 	    var start = highlightedLineRange.start,
 	        end = highlightedLineRange.end;
 
 
 	    (0, _range2.default)(start - 1, end).forEach(line => {
@@ -47847,17 +47988,17 @@ return /******/ (function(modules) { // 
 
 	    if (!editor) {
 	      return;
 	    }
 
 	    var codeMirror = editor.codeMirror;
 
 
-	    if (!highlightedLineRange || !codeMirror) {
+	    if ((0, _isEmpty2.default)(highlightedLineRange) || !codeMirror) {
 	      return;
 	    }
 
 	    var start = highlightedLineRange.start,
 	        end = highlightedLineRange.end;
 
 
 	    editor.alignLine(start);
@@ -47867,16 +48008,17 @@ return /******/ (function(modules) { // 
 	    });
 	  }
 
 	  render() {
 	    return null;
 	  }
 	}
 
+
 	HighlightLines.displayName = "HighlightLines";
 
 	exports.default = HighlightLines;
 
 /***/ },
 /* 1026 */
 /***/ function(module, exports, __webpack_require__) {
 
@@ -48064,48 +48206,59 @@ return /******/ (function(modules) { // 
 	var _clipboard = __webpack_require__(423);
 
 	var _kebabCase = __webpack_require__(1034);
 
 	function formatMenuElement(labelString, accesskeyString, click) {
 	  var disabled = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
 
 	  var label = L10N.getStr(labelString);
+	  var accesskey = L10N.getStr(accesskeyString);
 	  var id = `node-menu-${(0, _kebabCase.kebabCase)(label)}`;
 	  return {
 	    id,
 	    label,
-	    accesskey: L10N.getStr(accesskeyString),
+	    accesskey,
 	    disabled,
 	    click
 	  };
 	}
 
 
 	function copySourceElement(url) {
 	  return formatMenuElement("copySourceUrl", "copySourceUrl.accesskey", () => (0, _clipboard.copyToTheClipboard)(url));
 	}
 
 	function copyStackTraceElement(copyStackTrace) {
 	  return formatMenuElement("copyStackTrace", "copyStackTrace.accesskey", () => copyStackTrace());
 	}
 
-	function FrameMenu(frame, copyStackTrace, event) {
+	function toggleFrameworkGroupingElement(toggleFrameworkGrouping, frameworkGroupingOn) {
+	  var actionType = frameworkGroupingOn ? "framework.disableGrouping" : "framework.enableGrouping";
+
+	  return formatMenuElement(actionType, "framework.accesskey", () => toggleFrameworkGrouping());
+	}
+
+	function FrameMenu(frame, frameworkGroupingOn, callbacks, event) {
 	  event.stopPropagation();
 	  event.preventDefault();
 
 	  var menuOptions = [];
 
 	  var source = frame.source;
+
+	  var toggleFrameworkElement = toggleFrameworkGroupingElement(callbacks.toggleFrameworkGrouping, frameworkGroupingOn);
+	  menuOptions.push(toggleFrameworkElement);
+
 	  if (source) {
 	    var copySourceUrl = copySourceElement(source.url);
 	    menuOptions.push(copySourceUrl);
 	  }
 
-	  var copyStackTraceItem = copyStackTraceElement(copyStackTrace);
+	  var copyStackTraceItem = copyStackTraceElement(callbacks.copyStackTrace);
 
 	  menuOptions.push(copyStackTraceItem);
 
 	  (0, _devtoolsLaunchpad.showMenu)(event, menuOptions);
 	}
 
 /***/ },
 /* 1033 */,
--- a/devtools/client/debugger/new/panel.js
+++ b/devtools/client/debugger/new/panel.js
@@ -60,17 +60,16 @@ DebuggerPanel.prototype = {
     // Frames is null when the debugger is not paused.
     if (!frames) {
       return {
         frames: [],
         selected: -1
       };
     }
 
-    frames = frames.toJS();
     const selectedFrame = this._selectors.getSelectedFrame(this._getState());
     const selected = frames.findIndex(frame => frame.id == selectedFrame.id);
 
     frames.forEach(frame => {
       frame.actor = frame.id;
     });
 
     return { frames, selected };
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -29192,17 +29192,17 @@ return /******/ (function(modules) { // 
 	    return end.column >= column;
 	  }
 
 	  // node is either inside the block body or outside of it
 	  return start.line < line && end.line > line;
 	}
 
 	function isLexicalScope(path) {
-	  return isFunction(path) || t.isProgram(path);
+	  return t.isBlockStatement(path) || isFunction(path) || t.isProgram(path);
 	}
 
 	function getSymbols(source) {
 	  if (symbolDeclarations.has(source.id)) {
 	    var _symbols = symbolDeclarations.get(source.id);
 	    if (_symbols) {
 	      return _symbols;
 	    }
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-chrome-debugging.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-chrome-debugging.js
@@ -63,26 +63,26 @@ registerCleanupFunction(function() {
   gThreadClient = null;
   gNewGlobal = null;
   gNewChromeSource = null;
 
   customLoader = null;
   DebuggerServer = null;
 });
 
-add_task(function* () {
+add_task(function*() {
   gClient = initDebuggerClient();
 
   const [type] = yield gClient.connect();
   is(type, "browser", "Root actor should identify itself as a browser.");
 
   const response = yield gClient.getProcess();
   let actor = response.form.actor;
   gThreadClient = yield attachThread(gClient, actor);
   gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, "about:mozilla");
 
   // listen for a new source and global
   gThreadClient.addListener("newSource", onNewSource);
   gClient.addListener("newGlobal", onNewGlobal);
-  yield promise.all([ gNewGlobal.promise, gNewChromeSource.promise ]);
+  yield promise.all([gNewGlobal.promise, gNewChromeSource.promise]);
 
   yield resumeAndCloseConnection();
 });
--- a/devtools/client/debugger/new/test/mochitest/head.js
+++ b/devtools/client/debugger/new/test/mochitest/head.js
@@ -203,19 +203,21 @@ function waitForElement(dbg, selector) {
 function assertPausedLocation(dbg, source, line) {
   const { selectors: { getSelectedSource, getPause }, getState } = dbg;
   source = findSource(dbg, source);
 
   // Check the selected source
   is(getSelectedSource(getState()).get("id"), source.id);
 
   // Check the pause location
-  const location = getPause(getState()).getIn(["frame", "location"]);
-  is(location.get("sourceId"), source.id);
-  is(location.get("line"), line);
+  const pause = getPause(getState());
+  const location = pause && pause.frame && pause.frame.location;
+
+  is(location.sourceId, source.id);
+  is(location.line, line);
 
   // Check the debug line
   ok(
     getCM(dbg).lineInfo(line - 1).wrapClass.includes("debug-line"),
     "Line is highlighted as paused"
   );
 }
 
@@ -275,17 +277,17 @@ function waitForPaused(dbg) {
     yield waitForThreadEvents(dbg, "paused"), yield waitForState(dbg, state => {
       const pause = dbg.selectors.getPause(state);
       // Make sure we have the paused state.
       if (!pause) {
         return false;
       }
       // Make sure the source text is completely loaded for the
       // source we are paused in.
-      const sourceId = pause.getIn(["frame", "location", "sourceId"]);
+      const sourceId = pause && pause.frame && pause.frame.location.sourceId;
       const sourceText = dbg.selectors.getSourceText(dbg.getState(), sourceId);
       return sourceText && !sourceText.get("loading");
     });
   });
 }
 
 function createDebuggerContext(toolbox) {
   const panel = toolbox.getPanel("jsdebugger");
--- a/devtools/client/locales/en-US/debugger.properties
+++ b/devtools/client/locales/en-US/debugger.properties
@@ -301,16 +301,28 @@ editor.conditionalPanel.placeholder=This
 # LOCALIZATION NOTE (editor.conditionalPanel.placeholder): Tooltip text for
 # close button inside ConditionalPanel component
 editor.conditionalPanel.close=Cancel edit breakpoint and close
 
 # LOCALIZATION NOTE (editor.jumpToMappedLocation1): Context menu item
 # for navigating to a source mapped location
 editor.jumpToMappedLocation1=Jump to %S location
 
+# LOCALIZATION NOTE (framework.disableGrouping): This is the text that appears in the
+# context menu to disable framework grouping.
+framework.disableGrouping=Disable Framework Grouping
+
+# LOCALIZATION NOTE (framework.enableGrouping): This is the text that appears in the
+# context menu to enable framework grouping.
+framework.enableGrouping=Enable Framework Grouping
+
+# LOCALIZATION NOTE (framework.accesskey): Access key to toggle framework grouping from
+# the context menu.
+framework.accesskey=u
+
 # LOCALIZATION NOTE (generated): Source Map term for a server source location
 generated=generated
 
 # LOCALIZATION NOTE (original): Source Map term for a debugger UI source location
 original=original
 
 # LOCALIZATION NOTE (expressions.placeholder): Placeholder text for expression
 # input element
--- a/devtools/client/preferences/debugger.js
+++ b/devtools/client/preferences/debugger.js
@@ -25,16 +25,17 @@ pref("devtools.debugger.workers", false)
 
 // The default Debugger UI settings
 pref("devtools.debugger.ui.panes-workers-and-sources-width", 200);
 pref("devtools.debugger.ui.panes-instruments-width", 300);
 pref("devtools.debugger.ui.panes-visible-on-startup", false);
 pref("devtools.debugger.ui.variables-sorting-enabled", true);
 pref("devtools.debugger.ui.variables-only-enum-visible", false);
 pref("devtools.debugger.ui.variables-searchbox-visible", false);
+pref("devtools.debugger.ui.framework-grouping-on", true);
 pref("devtools.debugger.call-stack-visible", false);
 pref("devtools.debugger.scopes-visible", false);
 pref("devtools.debugger.start-panel-collapsed", false);
 pref("devtools.debugger.end-panel-collapsed", false);
 pref("devtools.debugger.tabs", "[]");
 pref("devtools.debugger.pending-selected-location", "{}");
 pref("devtools.debugger.pending-breakpoints", "[]");
 pref("devtools.debugger.expressions", "[]");
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -7171,19 +7171,32 @@ nsContentUtils::IsFullScreenApiEnabled()
 {
   return sIsFullScreenApiEnabled;
 }
 
 /* static */
 bool
 nsContentUtils::IsRequestFullScreenAllowed(CallerType aCallerType)
 {
-  return !sTrustedFullScreenOnly ||
-         EventStateManager::IsHandlingUserInput() ||
-         aCallerType == CallerType::System;
+  // If more time has elapsed since the user input than is specified by the
+  // dom.event.handling-user-input-time-limit pref (default 1 second), this
+  // function also returns false.
+
+  if (!sTrustedFullScreenOnly || aCallerType == CallerType::System) {
+    return true;
+  }
+
+  if (EventStateManager::IsHandlingUserInput()) {
+    TimeDuration timeout = HandlingUserInputTimeout();
+    return timeout <= TimeDuration(0) ||
+      (TimeStamp::Now() -
+       EventStateManager::GetHandlingInputStart()) <= timeout;
+  }
+
+  return false;
 }
 
 /* static */
 bool
 nsContentUtils::IsCutCopyAllowed(nsIPrincipal* aSubjectPrincipal)
 {
   if (!IsCutCopyRestricted() && EventStateManager::IsHandlingUserInput()) {
     return true;
@@ -8766,75 +8779,16 @@ nsContentUtils::GetWindowRoot(nsIDocumen
     if (nsPIDOMWindowOuter* win = aDoc->GetWindow()) {
       return win->GetTopWindowRoot();
     }
   }
   return nullptr;
 }
 
 /* static */
-nsContentPolicyType
-nsContentUtils::InternalContentPolicyTypeToExternal(nsContentPolicyType aType)
-{
-  switch (aType) {
-  case nsIContentPolicy::TYPE_INTERNAL_SCRIPT:
-  case nsIContentPolicy::TYPE_INTERNAL_SCRIPT_PRELOAD:
-  case nsIContentPolicy::TYPE_INTERNAL_WORKER:
-  case nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER:
-  case nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER:
-  case nsIContentPolicy::TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS:
-    return nsIContentPolicy::TYPE_SCRIPT;
-
-  case nsIContentPolicy::TYPE_INTERNAL_EMBED:
-  case nsIContentPolicy::TYPE_INTERNAL_OBJECT:
-    return nsIContentPolicy::TYPE_OBJECT;
-
-  case nsIContentPolicy::TYPE_INTERNAL_FRAME:
-  case nsIContentPolicy::TYPE_INTERNAL_IFRAME:
-    return nsIContentPolicy::TYPE_SUBDOCUMENT;
-
-  case nsIContentPolicy::TYPE_INTERNAL_AUDIO:
-  case nsIContentPolicy::TYPE_INTERNAL_VIDEO:
-  case nsIContentPolicy::TYPE_INTERNAL_TRACK:
-    return nsIContentPolicy::TYPE_MEDIA;
-
-  case nsIContentPolicy::TYPE_INTERNAL_XMLHTTPREQUEST:
-  case nsIContentPolicy::TYPE_INTERNAL_EVENTSOURCE:
-    return nsIContentPolicy::TYPE_XMLHTTPREQUEST;
-
-  case nsIContentPolicy::TYPE_INTERNAL_IMAGE:
-  case nsIContentPolicy::TYPE_INTERNAL_IMAGE_PRELOAD:
-  case nsIContentPolicy::TYPE_INTERNAL_IMAGE_FAVICON:
-    return nsIContentPolicy::TYPE_IMAGE;
-
-  case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET:
-  case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET_PRELOAD:
-    return nsIContentPolicy::TYPE_STYLESHEET;
-
-  default:
-    return aType;
-  }
-}
-
-/* static */
-nsContentPolicyType
-nsContentUtils::InternalContentPolicyTypeToExternalOrWorker(nsContentPolicyType aType)
-{
-  switch (aType) {
-  case nsIContentPolicy::TYPE_INTERNAL_WORKER:
-  case nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER:
-  case nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER:
-    return aType;
-
-  default:
-    return InternalContentPolicyTypeToExternal(aType);
-  }
-}
-
-/* static */
 bool
 nsContentUtils::IsPreloadType(nsContentPolicyType aType)
 {
   if (aType == nsIContentPolicy::TYPE_INTERNAL_SCRIPT_PRELOAD ||
       aType == nsIContentPolicy::TYPE_INTERNAL_IMAGE_PRELOAD ||
       aType == nsIContentPolicy::TYPE_INTERNAL_STYLESHEET_PRELOAD) {
     return true;
   }
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -1155,27 +1155,29 @@ public:
   /**
    * Return the content policy service
    */
   static nsIContentPolicy *GetContentPolicy();
 
   /**
    * Map internal content policy types to external ones.
    */
-  static nsContentPolicyType InternalContentPolicyTypeToExternal(nsContentPolicyType aType);
+  static inline nsContentPolicyType
+    InternalContentPolicyTypeToExternal(nsContentPolicyType aType);
 
   /**
    * Map internal content policy types to external ones or preload types:
    *   * TYPE_INTERNAL_SCRIPT_PRELOAD
    *   * TYPE_INTERNAL_IMAGE_PRELOAD
    *   * TYPE_INTERNAL_STYLESHEET_PRELOAD
    *
    * Note: DO NOT call this function unless you know what you're doing!
    */
-  static nsContentPolicyType InternalContentPolicyTypeToExternalOrPreload(nsContentPolicyType aType);
+  static inline nsContentPolicyType
+    InternalContentPolicyTypeToExternalOrPreload(nsContentPolicyType aType);
 
   /**
    * Map internal content policy types to external ones, worker, or preload types:
    *   * TYPE_INTERNAL_WORKER
    *   * TYPE_INTERNAL_SHARED_WORKER
    *   * TYPE_INTERNAL_SERVICE_WORKER
    *
    * Note: DO NOT call this function unless you know what you're doing!
@@ -3104,16 +3106,75 @@ private:
 
 #if !(defined(DEBUG) || defined(MOZ_ENABLE_JS_DUMP))
   static bool sDOMWindowDumpEnabled;
 #endif
   static bool sDoNotTrackEnabled;
   static mozilla::LazyLogModule sDOMDumpLog;
 };
 
+/* static */ inline
+nsContentPolicyType
+nsContentUtils::InternalContentPolicyTypeToExternal(nsContentPolicyType aType)
+{
+  switch (aType) {
+  case nsIContentPolicy::TYPE_INTERNAL_SCRIPT:
+  case nsIContentPolicy::TYPE_INTERNAL_SCRIPT_PRELOAD:
+  case nsIContentPolicy::TYPE_INTERNAL_WORKER:
+  case nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER:
+  case nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER:
+  case nsIContentPolicy::TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS:
+    return nsIContentPolicy::TYPE_SCRIPT;
+
+  case nsIContentPolicy::TYPE_INTERNAL_EMBED:
+  case nsIContentPolicy::TYPE_INTERNAL_OBJECT:
+    return nsIContentPolicy::TYPE_OBJECT;
+
+  case nsIContentPolicy::TYPE_INTERNAL_FRAME:
+  case nsIContentPolicy::TYPE_INTERNAL_IFRAME:
+    return nsIContentPolicy::TYPE_SUBDOCUMENT;
+
+  case nsIContentPolicy::TYPE_INTERNAL_AUDIO:
+  case nsIContentPolicy::TYPE_INTERNAL_VIDEO:
+  case nsIContentPolicy::TYPE_INTERNAL_TRACK:
+    return nsIContentPolicy::TYPE_MEDIA;
+
+  case nsIContentPolicy::TYPE_INTERNAL_XMLHTTPREQUEST:
+  case nsIContentPolicy::TYPE_INTERNAL_EVENTSOURCE:
+    return nsIContentPolicy::TYPE_XMLHTTPREQUEST;
+
+  case nsIContentPolicy::TYPE_INTERNAL_IMAGE:
+  case nsIContentPolicy::TYPE_INTERNAL_IMAGE_PRELOAD:
+  case nsIContentPolicy::TYPE_INTERNAL_IMAGE_FAVICON:
+    return nsIContentPolicy::TYPE_IMAGE;
+
+  case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET:
+  case nsIContentPolicy::TYPE_INTERNAL_STYLESHEET_PRELOAD:
+    return nsIContentPolicy::TYPE_STYLESHEET;
+
+  default:
+    return aType;
+  }
+}
+
+/* static */ inline
+nsContentPolicyType
+nsContentUtils::InternalContentPolicyTypeToExternalOrWorker(nsContentPolicyType aType)
+{
+  switch (aType) {
+  case nsIContentPolicy::TYPE_INTERNAL_WORKER:
+  case nsIContentPolicy::TYPE_INTERNAL_SHARED_WORKER:
+  case nsIContentPolicy::TYPE_INTERNAL_SERVICE_WORKER:
+    return aType;
+
+  default:
+    return InternalContentPolicyTypeToExternal(aType);
+  }
+}
+
 class MOZ_RAII nsAutoScriptBlocker {
 public:
   explicit nsAutoScriptBlocker(MOZ_GUARD_OBJECT_NOTIFIER_ONLY_PARAM) {
     MOZ_GUARD_OBJECT_NOTIFIER_INIT;
     nsContentUtils::AddScriptBlocker();
   }
   ~nsAutoScriptBlocker() {
     nsContentUtils::RemoveScriptBlocker();
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -1098,16 +1098,17 @@ GK_ATOM(range, "range")
 GK_ATOM(readonly, "readonly")
 GK_ATOM(rect, "rect")
 GK_ATOM(rectangle, "rectangle")
 GK_ATOM(ref, "ref")
 GK_ATOM(refresh, "refresh")
 GK_ATOM(rel, "rel")
 GK_ATOM(onreloadpage, "onreloadpage")
 GK_ATOM(rem, "rem")
+GK_ATOM(remote, "remote")
 GK_ATOM(removeelement, "removeelement")
 GK_ATOM(renderingobserverlist, "renderingobserverlist")
 GK_ATOM(repeat, "repeat")
 GK_ATOM(replace, "replace")
 GK_ATOM(required, "required")
 GK_ATOM(reserved, "reserved")
 GK_ATOM(reset, "reset")
 GK_ATOM(resizeafter, "resizeafter")
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -8428,17 +8428,27 @@ nsGlobalWindow::ScrollTo(double aXScroll
   auto scrollPos = CSSIntPoint::Truncate(mozilla::ToZeroIfNonfinite(aXScroll),
                                          mozilla::ToZeroIfNonfinite(aYScroll));
   ScrollTo(scrollPos, ScrollOptions());
 }
 
 void
 nsGlobalWindow::ScrollTo(const ScrollToOptions& aOptions)
 {
-  FlushPendingNotifications(FlushType::Layout);
+  // When scrolling to a non-zero offset, we need to determine whether that
+  // position is within our scrollable range, so we need updated layout
+  // information which requires a layout flush, otherwise all we need is to
+  // flush frames to be able to access our scrollable frame here.
+  FlushType flushType = ((aOptions.mLeft.WasPassed() &&
+                          aOptions.mLeft.Value() > 0) ||
+                         (aOptions.mTop.WasPassed() &&
+                          aOptions.mTop.Value() > 0)) ?
+                          FlushType::Layout :
+                          FlushType::Frames;
+  FlushPendingNotifications(flushType);
   nsIScrollableFrame *sf = GetScrollFrame();
 
   if (sf) {
     CSSIntPoint scrollPos = sf->GetScrollPositionCSSPixels();
     if (aOptions.mLeft.WasPassed()) {
       scrollPos.x = mozilla::ToZeroIfNonfinite(aOptions.mLeft.Value());
     }
     if (aOptions.mTop.WasPassed()) {
@@ -8454,17 +8464,24 @@ nsGlobalWindow::Scroll(const ScrollToOpt
 {
   ScrollTo(aOptions);
 }
 
 void
 nsGlobalWindow::ScrollTo(const CSSIntPoint& aScroll,
                          const ScrollOptions& aOptions)
 {
-  FlushPendingNotifications(FlushType::Layout);
+  // When scrolling to a non-zero offset, we need to determine whether that
+  // position is within our scrollable range, so we need updated layout
+  // information which requires a layout flush, otherwise all we need is to
+  // flush frames to be able to access our scrollable frame here.
+  FlushType flushType = (aScroll.x || aScroll.y) ?
+                          FlushType::Layout :
+                          FlushType::Frames;
+  FlushPendingNotifications(flushType);
   nsIScrollableFrame *sf = GetScrollFrame();
 
   if (sf) {
     // Here we calculate what the max pixel value is that we can
     // scroll to, we do this by dividing maxint with the pixel to
     // twips conversion factor, and subtracting 4, the 4 comes from
     // experimenting with this value, anything less makes the view
     // code not scroll correctly, I have no idea why. -- jst
--- a/dom/base/test/test_bug1118689.html
+++ b/dom/base/test/test_bug1118689.html
@@ -8,49 +8,32 @@ https://bugzilla.mozilla.org/show_bug.cg
   <title>Test for Bug 1118689</title>
   <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
   <script type="application/javascript">
 
   /** Test for Bug 1118689 **/
   SimpleTest.requestFlakyTimeout("Just need some random timeout.");
 
-  function test1() {
-    // test 1, check that error handling in data documents is still the same
-    //         as it has been for ages.
-    var d = document.implementation.createHTMLDocument();
-    d.body.innerHTML = "<img onerror='ok(false, \"EventHandler shouldn't be called in data document\")'>";
-    d.body.firstChild.addEventListener("error",
-      function() {
-        ok(true, "EventListener should be called in data document");
-        test2();
-      });
-    d.body.firstChild.addEventListener("load",
-      function() {
-        ok(false, "Images in data document shouldn't be loaded");
-      });
-    d.body.firstChild.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP";
-  }
-
-  function test2() {
-    // test 2, check that load event doesn't keep up being dispatched if
-    //         window has been closed.
+  function test() {
+    // check that load event doesn't keep up being dispatched if
+    // window has been closed.
     var win = window.open('data:text/html,<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP" onload="this.src = this.src">',
                           "", "height=100,width=100");
     setTimeout(function() {
         win.close();
         SimpleTest.finish();
       }, 2500);
   }
 
   SimpleTest.waitForExplicitFinish();
 
   </script>
 </head>
-<body onload="test1();">
+<body onload="test();">
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1118689">Mozilla Bug 1118689</a>
 <p id="display"></p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 </body>
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -3863,23 +3863,17 @@ public:
   }
 
   nsCOMPtr<nsIContent> mTarget;
 };
 
 /*static*/ bool
 EventStateManager::IsHandlingUserInput()
 {
-  if (sUserInputEventDepth <= 0) {
-    return false;
-  }
-
-  TimeDuration timeout = nsContentUtils::HandlingUserInputTimeout();
-  return timeout <= TimeDuration(0) ||
-         (TimeStamp::Now() - sHandlingInputStart) <= timeout;
+  return sUserInputEventDepth > 0;
 }
 
 static void
 CreateMouseOrPointerWidgetEvent(WidgetMouseEvent* aMouseEvent,
                                 EventMessage aMessage,
                                 nsIContent* aRelatedContent,
                                 nsAutoPtr<WidgetMouseEvent>& aNewEvent)
 {
--- a/dom/events/EventStateManager.h
+++ b/dom/events/EventStateManager.h
@@ -210,25 +210,26 @@ public:
   static void StopHandlingUserInput()
   {
     --sUserInputEventDepth;
     if (sUserInputEventDepth == 0) {
       sHandlingInputStart = TimeStamp();
     }
   }
 
+  static TimeStamp GetHandlingInputStart() {
+    return sHandlingInputStart;
+  }
+
   /**
    * Returns true if the current code is being executed as a result of
    * user input.  This includes anything that is initiated by user,
    * with the exception of page load events or mouse over events. If
    * this method is called from asynchronously executed code, such as
-   * during layout reflows, it will return false. If more time has
-   * elapsed since the user input than is specified by the
-   * dom.event.handling-user-input-time-limit pref (default 1 second),
-   * this function also returns false.
+   * during layout reflows, it will return false.
    */
   static bool IsHandlingUserInput();
 
   /**
    * Get the number of user inputs handled since process start. This
    * includes anything that is initiated by user, with the exception
    * of page load events or mouse over events.
    */
--- a/dom/html/HTMLImageElement.cpp
+++ b/dom/html/HTMLImageElement.cpp
@@ -530,17 +530,17 @@ HTMLImageElement::SetAttr(int32_t aNameS
     mUseUrgentStartForChannel = EventStateManager::IsHandlingUserInput();
 
     if (InResponsiveMode()) {
       if (mResponsiveSelector &&
           mResponsiveSelector->Content() == this) {
         mResponsiveSelector->SetDefaultSource(aValue);
       }
       QueueImageLoadTask(true);
-    } else if (aNotify) {
+    } else if (aNotify && OwnerDoc()->IsCurrentActiveDocument()) {
       // If aNotify is false, we are coming from the parser or some such place;
       // we'll get bound after all the attributes have been set, so we'll do the
       // sync image load from BindToTree. Skip the LoadImage call in that case.
 
       // Note that this sync behavior is partially removed from the spec, bug 1076583
 
       // A hack to get animations to reset. See bug 594771.
       mNewRequestsWillNeedAnimationReset = true;
@@ -589,17 +589,17 @@ HTMLImageElement::SetAttr(int32_t aNameS
     // Mark channel as urgent-start before load image if the image load is
     // initaiated by a user interaction.
     mUseUrgentStartForChannel = EventStateManager::IsHandlingUserInput();
 
     if (InResponsiveMode()) {
       // per spec, full selection runs when this changes, even though
       // it doesn't directly affect the source selection
       QueueImageLoadTask(true);
-    } else {
+    } else if (OwnerDoc()->IsCurrentActiveDocument()) {
       // Bug 1076583 - We still use the older synchronous algorithm in
       // non-responsive mode. Force a new load of the image with the
       // new cross origin policy
       ForceReload(aNotify);
     }
   }
 
   return rv;
@@ -655,17 +655,18 @@ HTMLImageElement::BindToTree(nsIDocument
 
     // We still act synchronously for the non-responsive case (Bug
     // 1076583), but still need to delay if it is unsafe to run
     // script.
 
     // If loading is temporarily disabled, don't even launch MaybeLoadImage.
     // Otherwise MaybeLoadImage may run later when someone has reenabled
     // loading.
-    if (LoadingEnabled()) {
+    if (LoadingEnabled() &&
+        OwnerDoc()->IsCurrentActiveDocument()) {
       nsContentUtils::AddScriptRunner(
           NewRunnableMethod(this, &HTMLImageElement::MaybeLoadImage));
     }
   }
 
   return rv;
 }
 
@@ -860,17 +861,18 @@ HTMLImageElement::CopyInnerTo(Element* a
   }
 
   if (!destIsStatic) {
     // In SetAttr (called from nsGenericHTMLElement::CopyInnerTo), dest skipped
     // doing the image load because we passed in false for aNotify.  But we
     // really do want it to do the load, so set it up to happen once the cloning
     // reaches a stable state.
     if (!dest->InResponsiveMode() &&
-        dest->HasAttr(kNameSpaceID_None, nsGkAtoms::src)) {
+        dest->HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
+        dest->OwnerDoc()->IsCurrentActiveDocument()) {
       // Mark channel as urgent-start before load image if the image load is
       // initaiated by a user interaction.
       mUseUrgentStartForChannel = EventStateManager::IsHandlingUserInput();
 
       nsContentUtils::AddScriptRunner(
         NewRunnableMethod(dest, &HTMLImageElement::MaybeLoadImage));
     }
   }
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -546,38 +546,42 @@ ContentChild::Init(MessageLoop* aIOLoop,
                    bool aIsForBrowser)
 {
 #ifdef MOZ_WIDGET_GTK
   // We need to pass a display down to gtk_init because it's not going to
   // use the one from the environment on its own when deciding which backend
   // to use, and when starting under XWayland, it may choose to start with
   // the wayland backend instead of the x11 backend.
   // The DISPLAY environment variable is normally set by the parent process.
-  const char* display_name = DetectDisplay();
-  if (display_name) {
-    int argc = 3;
-    char option_name[] = "--display";
-    char* argv[] = {
-      // argv0 is unused because g_set_prgname() was called in
-      // XRE_InitChildProcess().
-      nullptr,
-      option_name,
-      const_cast<char*>(display_name),
-      nullptr
-    };
-    char** argvp = argv;
-    gtk_init(&argc, &argvp);
-  } else {
-    gtk_init(nullptr, nullptr);
+  if (!gfxPlatform::IsHeadless()) {
+    const char* display_name = DetectDisplay();
+    if (display_name) {
+      int argc = 3;
+      char option_name[] = "--display";
+      char* argv[] = {
+        // argv0 is unused because g_set_prgname() was called in
+        // XRE_InitChildProcess().
+        nullptr,
+        option_name,
+        const_cast<char*>(display_name),
+        nullptr
+      };
+      char** argvp = argv;
+      gtk_init(&argc, &argvp);
+    } else {
+      gtk_init(nullptr, nullptr);
+    }
   }
 #endif
 
 #ifdef MOZ_X11
-  // Do this after initializing GDK, or GDK will install its own handler.
-  XRE_InstallX11ErrorHandler();
+  if (!gfxPlatform::IsHeadless()) {
+    // Do this after initializing GDK, or GDK will install its own handler.
+    XRE_InstallX11ErrorHandler();
+  }
 #endif
 
   NS_ASSERTION(!sSingleton, "only one ContentChild per child");
 
   // Once we start sending IPC messages, we need the thread manager to be
   // initialized so we can deal with the responses. Do that here before we
   // try to construct the crash reporter.
   nsresult rv = nsThreadManager::get().Init();
@@ -598,20 +602,22 @@ ContentChild::Init(MessageLoop* aIOLoop,
 #endif
 
   // This must be sent before any IPDL message, which may hit sentinel
   // errors due to parent and content processes having different
   // versions.
   GetIPCChannel()->SendBuildID();
 
 #ifdef MOZ_X11
-  // Send the parent our X socket to act as a proxy reference for our X
-  // resources.
-  int xSocketFd = ConnectionNumber(DefaultXDisplay());
-  SendBackUpXResources(FileDescriptor(xSocketFd));
+  if (!gfxPlatform::IsHeadless()) {
+    // Send the parent our X socket to act as a proxy reference for our X
+    // resources.
+    int xSocketFd = ConnectionNumber(DefaultXDisplay());
+    SendBackUpXResources(FileDescriptor(xSocketFd));
+  }
 #endif
 
 #ifdef MOZ_CRASHREPORTER
   CrashReporterClient::InitSingleton(this);
 #endif
 
   mID = aChildID;
   mIsForBrowser = aIsForBrowser;
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -2495,17 +2495,18 @@ TabChild::RecvSetDocShellIsActive(const 
   if (mCompositorOptions) {
     // Note that |GetLayerManager()| has side-effects in that it creates a layer
     // manager if one doesn't exist already. Calling it inside a debug-only
     // assertion is generally bad but in this case we call it unconditionally
     // just below so it's ok.
     MOZ_ASSERT(mPuppetWidget);
     MOZ_ASSERT(mPuppetWidget->GetLayerManager());
     MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-            || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
+            || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
+            || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
 
     // We send the current layer observer epoch to the compositor so that
     // TabParent knows whether a layer update notification corresponds to the
     // latest SetDocShellIsActive request that was made.
     mPuppetWidget->GetLayerManager()->SetLayerObserverEpoch(aLayerObserverEpoch);
   }
 
   // docshell is consider prerendered only if not active yet
@@ -3012,17 +3013,18 @@ TabChild::GetFrom(uint64_t aLayersId)
 void
 TabChild::DidComposite(uint64_t aTransactionId,
                        const TimeStamp& aCompositeStart,
                        const TimeStamp& aCompositeEnd)
 {
   MOZ_ASSERT(mPuppetWidget);
   MOZ_ASSERT(mPuppetWidget->GetLayerManager());
   MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
+             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
+             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
 
   mPuppetWidget->GetLayerManager()->DidComposite(aTransactionId, aCompositeStart, aCompositeEnd);
 }
 
 void
 TabChild::DidRequestComposite(const TimeStamp& aCompositeReqStart,
                               const TimeStamp& aCompositeReqEnd)
 {
@@ -3049,28 +3051,30 @@ TabChild::DidRequestComposite(const Time
 }
 
 void
 TabChild::ClearCachedResources()
 {
   MOZ_ASSERT(mPuppetWidget);
   MOZ_ASSERT(mPuppetWidget->GetLayerManager());
   MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
+             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
+             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
 
   mPuppetWidget->GetLayerManager()->ClearCachedResources();
 }
 
 void
 TabChild::InvalidateLayers()
 {
   MOZ_ASSERT(mPuppetWidget);
   MOZ_ASSERT(mPuppetWidget->GetLayerManager());
   MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
+             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
+             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
 
   RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
   FrameLayerBuilder::InvalidateAllLayers(lm);
 }
 
 void
 TabChild::ReinitRendering()
 {
@@ -3149,17 +3153,18 @@ TabChild::ReinitRenderingForDeviceReset(
   ReinitRendering();
 }
 
 void
 TabChild::CompositorUpdated(const TextureFactoryIdentifier& aNewIdentifier,
                             uint64_t aDeviceResetSeqNo)
 {
   MOZ_ASSERT(mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_CLIENT
-             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR);
+             || mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_WR
+             || (gfxPlatform::IsHeadless() && mPuppetWidget->GetLayerManager()->GetBackendType() == LayersBackend::LAYERS_BASIC));
 
   RefPtr<LayerManager> lm = mPuppetWidget->GetLayerManager();
 
   mTextureFactoryIdentifier = aNewIdentifier;
   lm->UpdateTextureFactoryIdentifier(aNewIdentifier, aDeviceResetSeqNo);
   FrameLayerBuilder::InvalidateAllLayers(lm);
 }
 
--- a/dom/workers/ServiceWorkerClients.cpp
+++ b/dom/workers/ServiceWorkerClients.cpp
@@ -29,17 +29,17 @@
 #include "nsIWindowMediator.h"
 #include "nsIWindowWatcher.h"
 #include "nsNetUtil.h"
 #include "nsPIWindowWatcher.h"
 #include "nsWindowWatcher.h"
 #include "nsWeakReference.h"
 
 #ifdef MOZ_WIDGET_ANDROID
-#include "AndroidBridge.h"
+#include "FennecJNIWrappers.h"
 #endif
 
 using namespace mozilla;
 using namespace mozilla::dom;
 using namespace mozilla::dom::workers;
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(ServiceWorkerClients)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(ServiceWorkerClients)
@@ -549,17 +549,19 @@ public:
     MutexAutoLock lock(mPromiseProxy->Lock());
     if (mPromiseProxy->CleanedUp()) {
       return NS_OK;
     }
 
 #ifdef MOZ_WIDGET_ANDROID
     // This fires an intent that will start launching Fennec and foreground it,
     // if necessary.
-    java::GeckoAppShell::LaunchOrBringToFront();
+    if (jni::IsFennec()) {
+      java::GeckoApp::LaunchOrBringToFront();
+    }
 #endif
 
     nsCOMPtr<nsPIDOMWindowOuter> window;
     nsresult rv = OpenWindow(getter_AddRefs(window));
     if (NS_SUCCEEDED(rv)) {
       MOZ_ASSERT(window);
 
       rv = nsContentUtils::DispatchFocusChromeEvent(window);
@@ -591,17 +593,17 @@ public:
         new WebProgressListener(mPromiseProxy, swp, window, baseURI);
 
       rv = webProgress->AddProgressListener(listener,
                                             nsIWebProgress::NOTIFY_STATE_DOCUMENT);
       MOZ_ASSERT(NS_SUCCEEDED(rv));
       return NS_OK;
     }
 #ifdef MOZ_WIDGET_ANDROID
-    else if (rv == NS_ERROR_NOT_AVAILABLE) {
+    else if (rv == NS_ERROR_NOT_AVAILABLE && jni::IsFennec()) {
       // We couldn't get a browser window, so Fennec must not be running.
       // Send an Intent to launch Fennec and wait for "BrowserChrome:Ready"
       // to try opening a window again.
       RefPtr<ServiceWorkerPrivate> swp = GetServiceWorkerPrivate();
       NS_ENSURE_STATE(swp);
 
       nsCOMPtr<nsIObserverService> os = services::GetObserverService();
       NS_ENSURE_STATE(os);
--- a/gfx/thebes/gfxPlatform.cpp
+++ b/gfx/thebes/gfxPlatform.cpp
@@ -831,17 +831,23 @@ gfxPlatform::InitMoz2DLogging()
     cfg.mMaxAllocSize = gfxPrefs::MaxAllocSize();
 
     gfx::Factory::Init(cfg);
 }
 
 /* static */ bool
 gfxPlatform::IsHeadless()
 {
-    return PR_GetEnv("MOZ_HEADLESS");
+    static bool initialized = false;
+    static bool headless = false;
+    if (!initialized) {
+      initialized = true;
+      headless = PR_GetEnv("MOZ_HEADLESS");
+    }
+    return headless;
 }
 
 static bool sLayersIPCIsUp = false;
 
 /* static */ void
 gfxPlatform::InitNullMetadata()
 {
   ScrollMetadata::sNullMetadata = new ScrollMetadata();
--- a/js/src/frontend/BytecodeCompiler.cpp
+++ b/js/src/frontend/BytecodeCompiler.cpp
@@ -640,20 +640,21 @@ frontend::CompileModule(JSContext* cx, c
     return module;
 }
 
 bool
 frontend::CompileLazyFunction(JSContext* cx, Handle<LazyScript*> lazy, const char16_t* chars, size_t length)
 {
     MOZ_ASSERT(cx->compartment() == lazy->functionNonDelazifying()->compartment());
 
+    uint32_t sourceStartColumn = lazy->scriptSource()->startColumn();
     CompileOptions options(cx, lazy->version());
     options.setMutedErrors(lazy->mutedErrors())
            .setFileAndLine(lazy->filename(), lazy->lineno())
-           .setColumn(lazy->column())
+           .setColumn(lazy->column(), sourceStartColumn)
            .setNoScriptRval(false)
            .setSelfHostingMode(false);
 
     // Update statistics to find out if we are delazifying just after having
     // lazified. Note that we are interested in the delta between end of
     // syntax parsing and start of full parsing, so we do this now rather than
     // after parsing below.
     if (!lazy->scriptSource()->parseEnded().IsNull()) {
@@ -676,17 +677,17 @@ frontend::CompileLazyFunction(JSContext*
     Parser<FullParseHandler, char16_t> parser(cx, cx->tempLifoAlloc(), options, chars, length,
                                               /* foldConstants = */ true, usedNames, nullptr,
                                               lazy);
     if (!parser.checkOptions())
         return false;
 
     Rooted<JSFunction*> fun(cx, lazy->functionNonDelazifying());
     MOZ_ASSERT(!lazy->isLegacyGenerator());
-    ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->toStringStart() + lazy->column(),
+    ParseNode* pn = parser.standaloneLazyFunction(fun, lazy->toStringStart() + sourceStartColumn,
                                                   lazy->strict(), lazy->generatorKind(), lazy->asyncKind());
     if (!pn)
         return false;
 
     RootedScriptSource sourceObject(cx, lazy->sourceObject());
     MOZ_ASSERT(sourceObject);
 
     Rooted<JSScript*> script(cx, JSScript::Create(cx, options, sourceObject,
--- a/js/src/frontend/BytecodeEmitter.cpp
+++ b/js/src/frontend/BytecodeEmitter.cpp
@@ -10682,17 +10682,25 @@ BytecodeEmitter::emitClass(ParseNode* pn
             if (!emit2(JSOP_INITHOMEOBJECT, 0))
                 return false;
         }
     } else {
         // In the case of default class constructors, emit the start and end
         // offsets in the source buffer as source notes so that when we
         // actually make the constructor during execution, we can give it the
         // correct toString output.
-        if (!newSrcNote3(SRC_CLASS_SPAN, ptrdiff_t(pn->pn_pos.begin), ptrdiff_t(pn->pn_pos.end)))
+        //
+        // Token positions are already offset from the start column. Since
+        // toString offsets are absolute offsets into the ScriptSource,
+        // de-offset from the starting column.
+        ptrdiff_t classStart = ptrdiff_t(pn->pn_pos.begin) -
+                               tokenStream().options().sourceStartColumn;
+        ptrdiff_t classEnd = ptrdiff_t(pn->pn_pos.end) -
+                             tokenStream().options().sourceStartColumn;
+        if (!newSrcNote3(SRC_CLASS_SPAN, classStart, classEnd))
             return false;
 
         JSAtom *name = names ? names->innerBinding()->pn_atom : cx->names().empty;
         if (heritageExpression) {
             if (!emitAtomOp(name, JSOP_DERIVEDCONSTRUCTOR))
                 return false;
         } else {
             if (!emitAtomOp(name, JSOP_CLASSCONSTRUCTOR))
--- a/js/src/frontend/SharedContext.h
+++ b/js/src/frontend/SharedContext.h
@@ -561,32 +561,36 @@ class FunctionBox : public ObjectBox, pu
     }
 
     void setStart(const TokenStream& tokenStream) {
         // Token positions are already offset from the start column in
         // CompileOptions. bufStart and toStringStart, however, refer to
         // absolute positions within the ScriptSource buffer, and need to
         // de-offset from the starting column.
         uint32_t offset = tokenStream.currentToken().pos.begin;
-        MOZ_ASSERT(offset >= tokenStream.options().column);
-        MOZ_ASSERT(toStringStart >= tokenStream.options().column);
-        toStringStart -= tokenStream.options().column;
-        bufStart = offset - tokenStream.options().column;
+        uint32_t sourceStartColumn = tokenStream.options().sourceStartColumn;
+
+        MOZ_ASSERT(offset >= sourceStartColumn);
+        MOZ_ASSERT(toStringStart >= sourceStartColumn);
+        toStringStart -= sourceStartColumn;
+        bufStart = offset - sourceStartColumn;
         tokenStream.srcCoords.lineNumAndColumnIndex(offset, &startLine, &startColumn);
     }
 
     void setEnd(const TokenStream& tokenStream) {
         // For all functions except class constructors, the buffer and
         // toString ending positions are the same. Class constructors override
         // the toString ending position with the end of the class definition.
         //
         // Offsets are de-offset for the same reason as in setStart above.
         uint32_t offset = tokenStream.currentToken().pos.end;
-        MOZ_ASSERT(offset >= tokenStream.options().column);
-        bufEnd = offset - tokenStream.options().column;
+        uint32_t sourceStartColumn = tokenStream.options().sourceStartColumn;
+
+        MOZ_ASSERT(offset >= sourceStartColumn);
+        bufEnd = offset - sourceStartColumn;
         toStringEnd = bufEnd;
     }
 
     void trace(JSTracer* trc) override;
 };
 
 inline FunctionBox*
 SharedContext::asFunctionBox()
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/parser/bug-1364648.js
@@ -0,0 +1,1 @@
+assertEq(evaluate("var f = x=>class { }; f()", { columnNumber: 1729 }).toString(), "class { }");
--- a/js/src/jsapi.cpp
+++ b/js/src/jsapi.cpp
@@ -3880,16 +3880,17 @@ JS::TransitiveCompileOptions::copyPODTra
 };
 
 void
 JS::ReadOnlyCompileOptions::copyPODOptions(const ReadOnlyCompileOptions& rhs)
 {
     copyPODTransitiveOptions(rhs);
     lineno = rhs.lineno;
     column = rhs.column;
+    sourceStartColumn = rhs.sourceStartColumn;
     isRunOnce = rhs.isRunOnce;
     noScriptRval = rhs.noScriptRval;
 }
 
 JS::OwningCompileOptions::OwningCompileOptions(JSContext* cx)
     : ReadOnlyCompileOptions(),
       elementRoot(cx),
       elementAttributeNameRoot(cx),
--- a/js/src/jsapi.h
+++ b/js/src/jsapi.h
@@ -3966,16 +3966,17 @@ class JS_FRIEND_API(ReadOnlyCompileOptio
 {
     friend class CompileOptions;
 
   protected:
     ReadOnlyCompileOptions()
       : TransitiveCompileOptions(),
         lineno(1),
         column(0),
+        sourceStartColumn(0),
         isRunOnce(false),
         noScriptRval(false)
     { }
 
     // Set all POD options (those not requiring reference counts, copies,
     // rooting, or other hand-holding) to their values in |rhs|.
     void copyPODOptions(const ReadOnlyCompileOptions& rhs);
 
@@ -3988,16 +3989,17 @@ class JS_FRIEND_API(ReadOnlyCompileOptio
     const char16_t* sourceMapURL() const { return sourceMapURL_; }
     virtual JSObject* element() const = 0;
     virtual JSString* elementAttributeName() const = 0;
     virtual JSScript* introductionScript() const = 0;
 
     // POD options.
     unsigned lineno;
     unsigned column;
+    unsigned sourceStartColumn;
     // isRunOnce only applies to non-function scripts.
     bool isRunOnce;
     bool noScriptRval;
 
   private:
     void operator=(const ReadOnlyCompileOptions&) = delete;
 };
 
@@ -4060,17 +4062,22 @@ class JS_FRIEND_API(OwningCompileOptions
         return *this;
     }
     OwningCompileOptions& setVersion(JSVersion v) {
         version = v;
         versionSet = true;
         return *this;
     }
     OwningCompileOptions& setUTF8(bool u) { utf8 = u; return *this; }
-    OwningCompileOptions& setColumn(unsigned c) { column = c; return *this; }
+    OwningCompileOptions& setColumn(unsigned c, unsigned ssc) {
+        MOZ_ASSERT(ssc <= c);
+        column = c;
+        sourceStartColumn = ssc;
+        return *this;
+    }
     OwningCompileOptions& setIsRunOnce(bool once) { isRunOnce = once; return *this; }
     OwningCompileOptions& setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; }
     OwningCompileOptions& setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; }
     OwningCompileOptions& setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; }
     OwningCompileOptions& setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; }
     OwningCompileOptions& setIntroductionType(const char* t) { introductionType = t; return *this; }
     bool setIntroductionInfo(JSContext* cx, const char* introducerFn, const char* intro,
                              unsigned line, JSScript* script, uint32_t offset)
@@ -4156,17 +4163,22 @@ class MOZ_STACK_CLASS JS_FRIEND_API(Comp
         return *this;
     }
     CompileOptions& setVersion(JSVersion v) {
         version = v;
         versionSet = true;
         return *this;
     }
     CompileOptions& setUTF8(bool u) { utf8 = u; return *this; }
-    CompileOptions& setColumn(unsigned c) { column = c; return *this; }
+    CompileOptions& setColumn(unsigned c, unsigned ssc) {
+        MOZ_ASSERT(ssc <= c);
+        column = c;
+        sourceStartColumn = ssc;
+        return *this;
+    }
     CompileOptions& setIsRunOnce(bool once) { isRunOnce = once; return *this; }
     CompileOptions& setNoScriptRval(bool nsr) { noScriptRval = nsr; return *this; }
     CompileOptions& setSelfHostingMode(bool shm) { selfHostingMode = shm; return *this; }
     CompileOptions& setCanLazilyParse(bool clp) { canLazilyParse = clp; return *this; }
     CompileOptions& setSourceIsLazy(bool l) { sourceIsLazy = l; return *this; }
     CompileOptions& setIntroductionType(const char* t) { introductionType = t; return *this; }
     CompileOptions& setIntroductionInfo(const char* introducerFn, const char* intro,
                                         unsigned line, JSScript* script, uint32_t offset)
--- a/js/src/jsscript.cpp
+++ b/js/src/jsscript.cpp
@@ -2268,16 +2268,17 @@ ScriptSource::initFromOptions(JSContext*
 {
     MOZ_ASSERT(!filename_);
     MOZ_ASSERT(!introducerFilename_);
 
     mutedErrors_ = options.mutedErrors();
 
     introductionType_ = options.introductionType;
     setIntroductionOffset(options.introductionOffset);
+    startColumn_ = options.sourceStartColumn;
     parameterListEnd_ = parameterListEnd.isSome() ? parameterListEnd.value() : 0;
 
     if (options.hasIntroductionInfo) {
         MOZ_ASSERT(options.introductionType != nullptr);
         const char* filename = options.filename() ? options.filename() : "<unknown>";
         char* formatted = FormatIntroducedFilename(cx, filename, options.introductionLineno,
                                                    options.introductionType);
         if (!formatted)
--- a/js/src/jsscript.h
+++ b/js/src/jsscript.h
@@ -425,16 +425,22 @@ class ScriptSource
 
     // The filename of this script.
     UniqueChars filename_;
 
     UniqueTwoByteChars displayURL_;
     UniqueTwoByteChars sourceMapURL_;
     bool mutedErrors_;
 
+    // The start column of the source. Offsets kept for toString and the
+    // function source in LazyScripts are absolute positions within a
+    // ScriptSource buffer. To get their positions, they need to be offset
+    // with the starting column.
+    uint32_t startColumn_;
+
     // bytecode offset in caller script that generated this code.
     // This is present for eval-ed code, as well as "new Function(...)"-introduced
     // scripts.
     uint32_t introductionOffset_;
 
     // If this source is for Function constructor, the position of ")" after
     // parameter list in the source.  This is used to get function body.
     // 0 for other cases.
@@ -501,16 +507,17 @@ class ScriptSource
     explicit ScriptSource()
       : refs(0),
         data(SourceType(Missing())),
         pinnedCharsStack_(nullptr),
         filename_(nullptr),
         displayURL_(nullptr),
         sourceMapURL_(nullptr),
         mutedErrors_(false),
+        startColumn_(0),
         introductionOffset_(0),
         parameterListEnd_(0),
         introducerFilename_(nullptr),
         introductionType_(nullptr),
         xdrEncoder_(nullptr),
         sourceRetrievable_(false),
         hasIntroductionOffset_(false)
     {
@@ -613,16 +620,18 @@ class ScriptSource
     bool hasSourceMapURL() const { return sourceMapURL_ != nullptr; }
     const char16_t * sourceMapURL() {
         MOZ_ASSERT(hasSourceMapURL());
         return sourceMapURL_.get();
     }
 
     bool mutedErrors() const { return mutedErrors_; }
 
+    uint32_t startColumn() const { return startColumn_; }
+
     bool hasIntroductionOffset() const { return hasIntroductionOffset_; }
     uint32_t introductionOffset() const {
         MOZ_ASSERT(hasIntroductionOffset());
         return introductionOffset_;
     }
     void setIntroductionOffset(uint32_t offset) {
         MOZ_ASSERT(!hasIntroductionOffset());
         MOZ_ASSERT(offset <= (uint32_t)INT32_MAX);
@@ -1591,16 +1600,17 @@ class JSScript : public js::gc::TenuredC
     }
     static size_t offsetOfBaselineOrIonSkipArgCheck() {
         return offsetof(JSScript, baselineOrIonSkipArgCheck);
     }
 
     bool isRelazifiable() const {
         return (selfHosted() || lazyScript) && !hasInnerFunctions_ && !types_ &&
                !isStarGenerator() && !isLegacyGenerator() && !isAsync() &&
+               !isDefaultClassConstructor() &&
                !hasBaselineScript() && !hasAnyIonScript() &&
                !doNotRelazify_;
     }
     void setLazyScript(js::LazyScript* lazy) {
         lazyScript = lazy;
     }
     js::LazyScript* maybeLazyScript() {
         return lazyScript;
--- a/js/src/jsstr.h
+++ b/js/src/jsstr.h
@@ -82,23 +82,24 @@ struct JSSubString {
         this->base = base;
         this->offset = offset;
         this->length = length;
     }
 };
 
 /*
  * Shorthands for ASCII (7-bit) decimal and hex conversion.
- * Manually inline isdigit for performance; MSVC doesn't do this for us.
+ * Manually inline isdigit and isxdigit for performance; MSVC doesn't do this for us.
  */
 #define JS7_ISDEC(c)    ((((unsigned)(c)) - '0') <= 9)
+#define JS7_ISA2F(c)    ((((((unsigned)(c)) - 'a') <= 5) || (((unsigned)(c)) - 'A') <= 5))
 #define JS7_UNDEC(c)    ((c) - '0')
 #define JS7_ISOCT(c)    ((((unsigned)(c)) - '0') <= 7)
 #define JS7_UNOCT(c)    (JS7_UNDEC(c))
-#define JS7_ISHEX(c)    ((c) < 128 && isxdigit(c))
+#define JS7_ISHEX(c)    ((c) < 128 && (JS7_ISDEC(c) || JS7_ISA2F(c)))
 #define JS7_UNHEX(c)    (unsigned)(JS7_ISDEC(c) ? (c) - '0' : 10 + tolower(c) - 'a')
 #define JS7_ISLET(c)    ((c) < 128 && isalpha(c))
 
 extern size_t
 js_strlen(const char16_t* s);
 
 extern int32_t
 js_strcmp(const char16_t* lhs, const char16_t* rhs);
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -1384,17 +1384,17 @@ ParseCompileOptions(JSContext* cx, Compi
     }
 
     if (!JS_GetProperty(cx, opts, "columnNumber", &v))
         return false;
     if (!v.isUndefined()) {
         int32_t c;
         if (!ToInt32(cx, v, &c))
             return false;
-        options.setColumn(c);
+        options.setColumn(c, c);
     }
 
     if (!JS_GetProperty(cx, opts, "sourceIsLazy", &v))
         return false;
     if (v.isBoolean())
         options.setSourceIsLazy(v.toBoolean());
 
     return true;
--- a/js/src/tests/jstests.list
+++ b/js/src/tests/jstests.list
@@ -80,108 +80,17 @@ skip-if(!xulRuntime.shell) script test26
 skip-if(!xulRuntime.shell) script test262/language/global-code/script-decl-func-err-non-configurable.js
 skip-if(!xulRuntime.shell) script test262/language/global-code/script-decl-func.js
 
 # Calls preventExtensions() on the WindowProxy object.
 skip-if(!xulRuntime.shell) script test262/language/global-code/script-decl-func-err-non-extensible.js
 skip-if(!xulRuntime.shell) script test262/language/global-code/script-decl-lex.js
 skip-if(!xulRuntime.shell) script test262/language/global-code/script-decl-var-err.js
 
-# Fails because window has a "length" property resp. the indexed property access on WindowProxy.
-skip-if(!xulRuntime.shell) script test262/language/expressions/arrow-function/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/arrow-function/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/assignment/dstr-array-rest-nested-obj-null.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-hole.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/assignment/dstr-array-rest-nested-obj-undefined-own.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/assignment/dstr-array-rest-nested-obj-undefined.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/async-generator/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/async-generator/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/async-generator/dstr-named-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/async-generator/dstr-named-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-async-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-async-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-async-gen-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-async-gen-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-gen-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-gen-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/class/dstr-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/function/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/function/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/generators/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/generators/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-async-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-async-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/expressions/object/dstr-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/async-generator/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/async-generator/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-async-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-async-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-async-gen-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-async-gen-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-gen-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-gen-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-gen-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-gen-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-meth-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-meth-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-meth-static-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/class/dstr-meth-static-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/const/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-array-rest-nested-obj-null.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-array-rest-nested-obj-undefined-hole.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-array-rest-nested-obj-undefined-own.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-array-rest-nested-obj-undefined.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-const-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-let-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for-of/dstr-var-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for/dstr-const-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for/dstr-let-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/for/dstr-var-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/function/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/function/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/generators/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/generators/dstr-dflt-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/let/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/try/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/language/statements/variable/dstr-ary-ptrn-rest-obj-prop-id.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/every/15.4.4.16-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/every/15.4.4.16-7-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/filter/15.4.4.20-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/filter/15.4.4.20-9-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/forEach/15.4.4.18-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/forEach/15.4.4.18-7-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/indexOf/15.4.4.14-1-17.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/indexOf/15.4.4.14-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/indexOf/15.4.4.14-9-b-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-1-17.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-8-b-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/map/15.4.4.19-8-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduce/15.4.4.21-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduce/15.4.4.21-8-b-iii-1-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduce/15.4.4.21-9-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduceRight/15.4.4.22-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduceRight/15.4.4.22-8-b-iii-1-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/reduceRight/15.4.4.22-9-c-i-23.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/some/15.4.4.17-2-15.js
-skip-if(!xulRuntime.shell) script test262/built-ins/Array/prototype/some/15.4.4.17-7-c-i-23.js
+# Defines a restricted property on the WindowProxy object.
 skip-if(!xulRuntime.shell) script test262/built-ins/Object/defineProperty/15.2.3.6-4-354-13.js
 skip-if(!xulRuntime.shell) script test262/built-ins/Object/defineProperty/15.2.3.6-4-360-7.js
 skip-if(!xulRuntime.shell) script test262/built-ins/Object/defineProperty/15.2.3.6-4-531-13.js
 skip-if(!xulRuntime.shell) script test262/built-ins/Object/defineProperty/15.2.3.6-4-531-17.js
 skip-if(!xulRuntime.shell) script test262/built-ins/Object/defineProperty/15.2.3.6-4-538-7.js
 
 # Fails because window has a "name" property on WindowProxy.
 skip-if(!xulRuntime.shell) script test262/language/expressions/object/method-definition/generator-name-prop-symbol.js
@@ -585,11 +494,47 @@ skip include test262/built-ins/RegExp/pr
 # RegExp lookBehind
 # https://bugzilla.mozilla.org/show_bug.cgi?id=1225665
 skip include test262/built-ins/RegExp/lookBehind/jstests.list
 
 # RegExp named groups
 # https://bugzilla.mozilla.org/show_bug.cgi?id=1362154
 skip include test262/built-ins/RegExp/named-groups/jstests.list
 
+# Stash rval in AsyncIteratorClose
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1364608
+skip script test262/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-func-dstr-const-ary-ptrn-rest-id-iter-step-err.js
+skip script test262/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-func-dstr-let-ary-ptrn-rest-id-iter-step-err.js
+skip script test262/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-func-dstr-var-ary-ptrn-rest-id-iter-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-const-ary-ptrn-rest-id-iter-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-let-ary-ptrn-rest-id-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-elision-step-err.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-close.js
+skip script test262/language/statements/for-await-of/async-gen-dstr-var-ary-ptrn-rest-id-iter-step-err.js
+
+# Missing expression statement restriction for "async function"
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1361143
+skip script test262/language/statements/for/decl-async-fun.js
+skip script test262/language/statements/for/decl-async-gen.js
+skip script test262/language/statements/for-in/decl-async-fun.js
+skip script test262/language/statements/for-in/decl-async-gen.js
+skip script test262/language/statements/for-of/decl-async-fun.js
+skip script test262/language/statements/for-of/decl-async-gen.js
+skip script test262/language/statements/labeled/decl-async-function.js
+skip script test262/language/statements/labeled/decl-async-generator.js
+skip script test262/language/statements/while/decl-async-fun.js
+skip script test262/language/statements/while/decl-async-gen.js
+skip script test262/language/statements/with/decl-async-fun.js
+skip script test262/language/statements/with/decl-async-gen.js
+
 ####################################################
 # Tests disabled due to invalid test expectations  #
 ####################################################
--- a/js/src/tests/test262-update.py
+++ b/js/src/tests/test262-update.py
@@ -14,16 +14,17 @@ import tempfile
 import shutil
 import sys
 
 from functools import partial
 from itertools import chain, imap
 
 # Skip all tests which use features not supported in SpiderMonkey.
 UNSUPPORTED_FEATURES = set(["tail-call-optimization"])
+RELEASE_OR_BETA = set(["async-iteration"])
 
 @contextlib.contextmanager
 def TemporaryDirectory():
     tmpDir = tempfile.mkdtemp()
     try:
         yield tmpDir
     finally:
         shutil.rmtree(tmpDir)
@@ -224,21 +225,30 @@ def convertTestFile(test262parser, testS
     # Skip non-test files.
     isSupportFile = fileNameEndsWith(testName, "FIXTURE")
     if isSupportFile:
         refTestSkip.append("not a test file")
 
     # Skip tests with unsupported features.
     if "features" in testRec:
         unsupported = UNSUPPORTED_FEATURES.intersection(testRec["features"])
+        releaseOrBeta = RELEASE_OR_BETA.intersection(testRec["features"])
         if unsupported:
-            refTestSkip.append("%s is not supported" % ",".join(list(unsupported)))
+            refTestSkip.append(
+              "%s is not supported" % ",".join(list(unsupported)))
+        elif releaseOrBeta:
+            refTestSkipIf.append(
+              ("release_or_beta",
+               "%s is not released yet" % ",".join(list(releaseOrBeta)))
+            )
         elif "SharedArrayBuffer" in testRec["features"]:
-            refTestSkipIf.append(("!this.hasOwnProperty('SharedArrayBuffer')",
-                                  "SharedArrayBuffer not yet riding the trains"))
+            refTestSkipIf.append(
+              ("!this.hasOwnProperty('SharedArrayBuffer')",
+               "SharedArrayBuffer not yet riding the trains")
+            )
 
     # Includes for every test file in a directory is collected in a single
     # shell.js file per directory level. This is done to avoid adding all
     # test harness files to the top level shell.js file.
     if "includes" in testRec:
         assert not raw, "Raw test with includes: %s" % testName
         includeSet.update(testRec["includes"])
 
--- a/js/src/tests/test262/GIT-INFO
+++ b/js/src/tests/test262/GIT-INFO
@@ -1,5 +1,7 @@
-commit 19eb1d2e02c31ba813fe0ff5d10ea2c09a911fb5
-Author: Joseph Pecoraro <joepeck02@gmail.com>
-Date:   Thu May 4 08:22:28 2017 -0700
+commit 5c8f4db9d72385965ff8b4fa94536649279f1470
+Author: Rick Waldron <waldron.rick@gmail.com>
+Date:   Wed May 17 15:46:04 2017 -0400
 
-    Add tests for completion value of function / class declaration statements (#1012)
+    Merge pull request #1040 from leobalter/remove-unnecessary-tests
+    
+    Remove unnecessary tests
--- a/js/src/tests/test262/annexB/language/statements/labeled/function-declaration.js
+++ b/js/src/tests/test262/annexB/language/statements/labeled/function-declaration.js
@@ -4,10 +4,11 @@
 es6id: 13.1
 description: >
     function declarations in statement position in non-strict mode:
     label: Statement
 flags: [noStrict]
 ---*/
 label: function g() {}
 
+label1: label2: function f() {}
 
 reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/every/15.4.4.16-2-15.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.16-2-15
-description: Array.prototype.every - 'length' is property of the global object
----*/
-
-        function callbackfn1(val, idx, obj) {
-            return val > 10;
-        }
-
-        function callbackfn2(val, idx, obj) {
-            return val > 11;
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-
-assert(Array.prototype.every.call(this, callbackfn1), 'Array.prototype.every.call(this, callbackfn1) !== true');
-assert.sameValue(Array.prototype.every.call(this, callbackfn2), false, 'Array.prototype.every.call(this, callbackfn2)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/every/15.4.4.16-7-c-i-23.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.16-7-c-i-23
-description: >
-    Array.prototype.every - This object is an global object which
-    contains index property
----*/
-
-        function callbackfn(val, idx, obj) {
-            if (idx === 0) {
-                return val !== 11;
-            } else {
-                return true;
-            }
-        }
-
-            this[0] = 11;
-            this.length = 1;
-
-assert.sameValue(Array.prototype.every.call(this, callbackfn), false, 'Array.prototype.every.call(this, callbackfn)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-2-15.js
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.20-2-15
-description: Array.prototype.filter - 'length' is property of the global object
----*/
-
-        function callbackfn(val, idx, obj) {
-            return  obj.length === 2;
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-            var newArr = Array.prototype.filter.call(this, callbackfn);
-
-assert.sameValue(newArr.length, 2, 'newArr.length');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/filter/15.4.4.20-9-c-i-23.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.20-9-c-i-23
-description: >
-    Array.prototype.filter - This object is the global object which
-    contains index property
----*/
-
-        function callbackfn(val, idx, obj) {
-            return idx === 0 && val === 11;
-        }
-
-            this[0] = 11;
-            this.length = 1;
-            var newArr = Array.prototype.filter.call(this, callbackfn);
-
-assert.sameValue(newArr.length, 1, 'newArr.length');
-assert.sameValue(newArr[0], 11, 'newArr[0]');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-2-15.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.18-2-15
-description: Array.prototype.forEach - 'length' is property of the global object
----*/
-
-        var result = false;
-        function callbackfn(val, idx, obj) {
-            result = (obj.length === 2);
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-            Array.prototype.forEach.call(this, callbackfn);
-
-assert(result, 'result !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/forEach/15.4.4.18-7-c-i-23.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.18-7-c-i-23
-description: >
-    Array.prototype.forEach - This object is an global object which
-    contains index property
----*/
-
-        var testResult = false;
-
-        function callbackfn(val, idx, obj) {
-            if (idx === 0) {
-                testResult = (val === 11);
-            }
-        }
-
-            this[0] = 11;
-            this.length = 1;
-
-            Array.prototype.forEach.call(this, callbackfn);
-
-assert(testResult, 'testResult !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-1-17.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.14-1-17
-description: Array.prototype.indexOf applied to the global object
----*/
-
-            this[1] = true;
-            this.length = 2;
-
-assert.sameValue(Array.prototype.indexOf.call(this, true), 1, 'Array.prototype.indexOf.call(this, true)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-2-15.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.14-2-15
-description: Array.prototype.indexOf - 'length' is property of the global object
----*/
-
-        var targetObj = {};
-
-            this.length = 2;
-
-            this[1] = targetObj;
-
-assert.sameValue(Array.prototype.indexOf.call(this, targetObj), 1, 'Array.prototype.indexOf.call(this, targetObj)');
-
-            this[1] = {};
-            this[2] = targetObj;
-
-assert.sameValue(Array.prototype.indexOf.call(this, targetObj), -1, 'Array.prototype.indexOf.call(this, targetObj)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/indexOf/15.4.4.14-9-b-i-23.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.14-9-b-i-23
-description: Array.prototype.indexOf - This object is the global object
----*/
-
-        var targetObj = {};
-
-            this[0] = targetObj;
-            this[100] = "100";
-            this[200] = "200";
-            this.length = 200;
-
-assert.sameValue(Array.prototype.indexOf.call(this, targetObj), 0, 'Array.prototype.indexOf.call(this, targetObj)');
-assert.sameValue(Array.prototype.indexOf.call(this, "100"), 100, 'Array.prototype.indexOf.call(this, "100")');
-assert.sameValue(Array.prototype.indexOf.call(this, "200"), -1, 'Array.prototype.indexOf.call(this, "200")');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-1-17.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.15-1-17
-description: Array.prototype.lastIndexOf applied to the global object
----*/
-
-        var targetObj = ["global"];
-
-            this[1] = targetObj;
-            this.length = 3;
-
-assert.sameValue(Array.prototype.lastIndexOf.call(this, targetObj), 1, 'Array.prototype.lastIndexOf.call(this, targetObj)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-2-15.js
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.15-2-15
-description: >
-    Array.prototype.lastIndexOf - 'length' is property of the global
-    object
----*/
-
-        var targetObj = {};
-
-            this.length = 2;
-
-            this[1] = targetObj;
-
-assert.sameValue(Array.prototype.lastIndexOf.call(this, targetObj), 1);
-
-            this[1] = {};
-            this[2] = targetObj;
-
-assert.sameValue(Array.prototype.lastIndexOf.call(this, targetObj), -1);
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/lastIndexOf/15.4.4.15-8-b-i-23.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.15-8-b-i-23
-description: Array.prototype.lastIndexOf - This object is the global object
----*/
-
-        var targetObj = {};
-
-            this[0] = targetObj;
-            this[100] = "100";
-            this[200] = "200";
-            this.length = 200;
-
-assert.sameValue(Array.prototype.lastIndexOf.call(this, targetObj), 0, 'Array.prototype.lastIndexOf.call(this, targetObj)');
-assert.sameValue(Array.prototype.lastIndexOf.call(this, "100"), 100, 'Array.prototype.lastIndexOf.call(this, "100")');
-assert.sameValue(Array.prototype.lastIndexOf.call(this, "200"), -1, 'Array.prototype.lastIndexOf.call(this, "200")');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-2-15.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.19-2-15
-description: >
-    Array.prototype.map - when 'length' is property of the global
-    object
----*/
-
-        function callbackfn(val, idx, obj) {
-            return val > 10;
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-            var testResult = Array.prototype.map.call(this, callbackfn);
-
-assert.sameValue(testResult.length, 2, 'testResult.length');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/map/15.4.4.19-8-c-i-23.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.19-8-c-i-23
-description: >
-    Array.prototype.map - This object is the global object which
-    contains index property
----*/
-
-        var kValue = "abc";
-
-        function callbackfn(val, idx, obj) {
-            if (idx === 0) {
-                return val === kValue;
-            }
-            return false;
-        }
-
-            this[0] = kValue;
-            this.length = 2;
-
-            var testResult = Array.prototype.map.call(this, callbackfn);
-
-assert.sameValue(testResult[0], true, 'testResult[0]');
-
-reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/pop/clamps-to-integer-limit.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.pop
+description: >
+  Length values exceeding 2^53-1 are clamped to 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+  4. Else len > 0,
+  a. Let newLen be len-1.
+  ...
+  e. Perform ? Set(O, "length", newLen, true).
+  ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+Array.prototype.pop.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 2, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+Array.prototype.pop.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 2, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+Array.prototype.pop.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 2, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+Array.prototype.pop.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 2, "Length is Infinity");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/pop/length-near-integer-limit.js
@@ -0,0 +1,45 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.pop
+description: >
+  A value is removed from an array-like object whose length property is near the integer limit.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+  4. Else len > 0,
+    a. Let newLen be len-1.
+    b. Let index be ! ToString(newLen).
+    c. Let element be ? Get(O, index).
+    d. Perform ? DeletePropertyOrThrow(O, index).
+    e. Perform ? Set(O, "length", newLen, true).
+    f. Return element. 
+---*/
+
+var arrayLike = {
+  "9007199254740989": "9007199254740989",
+  "9007199254740990": "9007199254740990",
+  "9007199254740991": "9007199254740991",
+  length: 2**53 - 1
+};
+
+var value = Array.prototype.pop.call(arrayLike);
+
+assert.sameValue(value, "9007199254740990",
+                 "arrayLike['9007199254740990'] is returned from pop()");
+
+assert.sameValue(arrayLike.length, 2**53 - 2,
+                 "New arrayLike.length is 2**53 - 2");
+
+assert.sameValue(arrayLike["9007199254740989"], "9007199254740989",
+                 "arrayLike['9007199254740989'] is unchanged");
+
+assert.sameValue("9007199254740990" in arrayLike, false,
+                 "arrayLike['9007199254740990'] is removed");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/push/clamps-to-integer-limit.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.push
+description: >
+  Length values exceeding 2^53-1 are clamped to 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let items be a List whose elements are, in left to right order, the arguments
+     that were passed to this function invocation.
+  4. Let argCount be the number of elements in items.
+  ...
+  7. Perform ? Set(O, "length", len, true).
+  ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+Array.prototype.push.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+Array.prototype.push.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+Array.prototype.push.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+Array.prototype.push.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is Infinity");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/push/length-near-integer-limit.js
@@ -0,0 +1,41 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.push
+description: >
+  A value is inserted in an array-like object whose length property is near the integer limit.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let items be a List whose elements are, in left to right order, the
+     arguments that were passed to this function invocation.
+  ...
+  5. Repeat, while items is not empty
+    ...
+  7. Perform ? Set(O, "length", len, true).
+  ...
+---*/
+
+var arrayLike = {
+  "9007199254740989": "9007199254740989",
+  /* "9007199254740990": empty */
+  "9007199254740991": "9007199254740991",
+  length: 2**53 - 2
+};
+
+Array.prototype.push.call(arrayLike, "new-value");
+
+assert.sameValue(arrayLike.length, 2**53 - 1,
+                 "New arrayLike.length is 2**53 - 1");
+
+assert.sameValue(arrayLike["9007199254740989"], "9007199254740989",
+                 "arrayLike['9007199254740989'] is unchanged");
+
+assert.sameValue(arrayLike["9007199254740990"], "new-value",
+                 "arrayLike['9007199254740990'] has new value");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/push/throws-if-integer-limit-exceeded.js
@@ -0,0 +1,40 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.push
+description: >
+  A TypeError is thrown if the new length exceeds 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let items be a List whose elements are, in left to right order, the arguments
+     that were passed to this function invocation.
+  4. Let argCount be the number of elements in items.
+  5. If len + argCount > 2^53-1, throw a TypeError exception.
+  ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+assert.throws(TypeError, function() {
+  Array.prototype.push.call(arrayLike, null);
+}, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+assert.throws(TypeError, function() {
+  Array.prototype.push.call(arrayLike, null);
+}, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+assert.throws(TypeError, function() {
+  Array.prototype.push.call(arrayLike, null);
+}, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+assert.throws(TypeError, function() {
+  Array.prototype.push.call(arrayLike, null);
+}, "Length is Infinity");
+
+reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-2-15.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.21-2-15
-description: Array.prototype.reduce - 'length' is property of the global object
----*/
-
-        function callbackfn(prevVal, curVal, idx, obj) {
-            return (obj.length === 2);
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-
-assert.sameValue(Array.prototype.reduce.call(this, callbackfn, 1), true, 'Array.prototype.reduce.call(this, callbackfn, 1)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-8-b-iii-1-23.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.21-8-b-iii-1-23
-description: >
-    Array.prototype.reduce - This object is the global object which
-    contains index property
----*/
-
-        var testResult = false;
-        function callbackfn(prevVal, curVal, idx, obj) {
-            if (idx === 1) {
-                testResult = (prevVal === 0);
-            }
-        }
-
-            this[0] = 0;
-            this[1] = 1;
-            this[2] = 2;
-            this.length = 3;
-
-            Array.prototype.reduce.call(this, callbackfn);
-
-assert(testResult, 'testResult !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduce/15.4.4.21-9-c-i-23.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.21-9-c-i-23
-description: >
-    Array.prototype.reduce - This object is the global object which
-    contains index property
----*/
-
-        var testResult = false;
-        var initialValue = 0;
-        function callbackfn(prevVal, curVal, idx, obj) {
-            if (idx === 1) {
-                testResult = (curVal === 1);
-            }
-        }
-
-            this[0] = 0;
-            this[1] = 1;
-            this.length = 2;
-
-            Array.prototype.reduce.call(this, callbackfn, initialValue);
-
-assert(testResult, 'testResult !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-2-15.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.22-2-15
-description: >
-    Array.prototype.reduceRight - 'length' is property of the global
-    object
----*/
-
-var global = this;
-        var accessed = false;
-
-        function callbackfn(prevVal, curVal, idx, obj) {
-            accessed = true;
-            return obj.length === global.length;
-        }
-
-            this[0] = 12;
-            this[1] = 11;
-            this[2] = 9;
-            this.length = 2;
-
-assert(Array.prototype.reduceRight.call(this, callbackfn, 111), 'Array.prototype.reduceRight.call(this, callbackfn, 111) !== true');
-assert(accessed, 'accessed !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-8-b-iii-1-23.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.22-8-b-iii-1-23
-description: >
-    Array.prototype.reduceRight - This object is the global object
-    which contains index property
----*/
-
-        var testResult = false;
-        function callbackfn(prevVal, curVal, idx, obj) {
-            if (idx === 1) {
-                testResult = (prevVal === 2);
-            }
-        }
-
-            this[0] = 0;
-            this[1] = 1;
-            this[2] = 2;
-            this.length = 3;
-
-            Array.prototype.reduceRight.call(this, callbackfn);
-
-assert(testResult, 'testResult !== true');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/reduceRight/15.4.4.22-9-c-i-23.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.22-9-c-i-23
-description: >
-    Array.prototype.reduceRight - This object is an global object
-    which contains index property
----*/
-
-        var testResult = false;
-        function callbackfn(prevVal, curVal, idx, obj) {
-            if (idx === 1) {
-                testResult = (curVal === 1);
-            }
-        }
-
-            this[0] = 0;
-            this[1] = 1;
-            this[2] = 2;
-            this.length = 3;
-
-            Array.prototype.reduceRight.call(this, callbackfn, "initialValue");
-
-assert(testResult, 'testResult !== true');
-
-reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-object.js
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.reverse
+description: >
+  Ensure reverse() implementation correctly handles length exceeding 2^53-1 with plain objects.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+---*/
+
+function StopReverse() { }
+
+// Object with large "length" property and no indexed properties in the uint32 range.
+var arrayLike = {
+  get "9007199254740990"() {
+    throw new StopReverse();
+  },
+  get "9007199254740991"() {
+    $ERROR("Get 9007199254740991");
+  },
+  get "9007199254740992"() {
+    $ERROR("Get 9007199254740992");
+  },
+  length: 2**53 + 2,
+};
+
+assert.throws(StopReverse, function() {
+  Array.prototype.reverse.call(arrayLike);
+});
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/reverse/length-exceeding-integer-limit-with-proxy.js
@@ -0,0 +1,121 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.reverse
+description: >
+  Ensure correct MOP operations are called when length exceeds 2^53-1.
+includes: [compareArray.js, proxyTrapsHelper.js]
+---*/
+
+function StopReverse() { }
+
+var arrayLike = {
+  0: "zero",
+  /* 1: hole, */
+  2: "two",
+  /* 3: hole, */
+
+  get 4() {
+    throw new StopReverse();
+  },
+
+  9007199254740987: "2**53-5",
+  /* 9007199254740988: hole, */
+  /* 9007199254740989: hole, */
+  9007199254740990: "2**53-2",
+
+  length: 2**53 + 2,
+};
+
+var traps = [];
+
+var proxy = new Proxy(arrayLike, allowProxyTraps({
+  getOwnPropertyDescriptor(t, pk) {
+    traps.push(`GetOwnPropertyDescriptor:${String(pk)}`);
+    return Reflect.getOwnPropertyDescriptor(t, pk);
+  },
+  defineProperty(t, pk, desc) {
+    traps.push(`DefineProperty:${String(pk)}`);
+    return Reflect.defineProperty(t, pk, desc);
+  },
+  has(t, pk) {
+    traps.push(`Has:${String(pk)}`);
+    return Reflect.has(t, pk);
+  },
+  get(t, pk, r) {
+    traps.push(`Get:${String(pk)}`);
+    return Reflect.get(t, pk, r);
+  },
+  set(t, pk, v, r) {
+    traps.push(`Set:${String(pk)}`);
+    return Reflect.set(t, pk, v, r);
+  },
+  deleteProperty(t, pk) {
+    traps.push(`Delete:${String(pk)}`);
+    return Reflect.deleteProperty(t, pk);
+  },
+}))
+
+// Uses a separate exception than Test262Error, so that errors from allowProxyTraps
+// are properly propagated.
+assert.throws(StopReverse, function() {
+  Array.prototype.reverse.call(proxy);
+});
+
+assert.compareArray(traps, [
+  // Initial get length operation.
+  "Get:length",
+
+  // Lower and upper index are both present.
+  "Has:0",
+  "Get:0",
+  "Has:9007199254740990",
+  "Get:9007199254740990",
+  "Set:0",
+  "GetOwnPropertyDescriptor:0",
+  "DefineProperty:0",
+  "Set:9007199254740990",
+  "GetOwnPropertyDescriptor:9007199254740990",
+  "DefineProperty:9007199254740990",
+
+  // Lower and upper index are both absent.
+  "Has:1",
+  "Has:9007199254740989",
+
+  // Lower index is present, upper index is absent.
+  "Has:2",
+  "Get:2",
+  "Has:9007199254740988",
+  "Delete:2",
+  "Set:9007199254740988",
+  "GetOwnPropertyDescriptor:9007199254740988",
+  "DefineProperty:9007199254740988",
+
+  // Lower index is absent, upper index is present.
+  "Has:3",
+  "Has:9007199254740987",
+  "Get:9007199254740987",
+  "Set:3",
+  "GetOwnPropertyDescriptor:3",
+  "DefineProperty:3",
+  "Delete:9007199254740987",
+
+  // Stop exception.
+  "Has:4",
+  "Get:4",
+]);
+
+assert.sameValue(arrayLike.length, 2**53 + 2, "Length property is not modified");
+
+assert.sameValue(arrayLike[0], "2**53-2", "Property at index 0");
+assert.sameValue(1 in arrayLike, false, "Property at index 1");
+assert.sameValue(2 in arrayLike, false, "Property at index 2");
+assert.sameValue(arrayLike[3], "2**53-5", "Property at index 3");
+
+assert.sameValue(9007199254740987 in arrayLike, false, "Property at index 2**53-5");
+assert.sameValue(arrayLike[9007199254740988], "two", "Property at index 2**53-4");
+assert.sameValue(9007199254740989 in arrayLike, false, "Property at index 2**53-3");
+assert.sameValue(arrayLike[9007199254740990], "zero", "Property at index 2**53-2");
+
+reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Array/prototype/reverse/shell.js
+++ b/js/src/tests/test262/built-ins/Array/prototype/reverse/shell.js
@@ -0,0 +1,23 @@
+// file: proxyTrapsHelper.js
+function allowProxyTraps(overrides) {
+  function throwTest262Error(msg) {
+    return function () { throw new Test262Error(msg); };
+  }
+  if (!overrides) { overrides = {}; }
+  return {
+    getPrototypeOf: overrides.getPrototypeOf || throwTest262Error('[[GetPrototypeOf]] trap called'),
+    setPrototypeOf: overrides.setPrototypeOf || throwTest262Error('[[SetPrototypeOf]] trap called'),
+    isExtensible: overrides.isExtensible || throwTest262Error('[[IsExtensible]] trap called'),
+    preventExtensions: overrides.preventExtensions || throwTest262Error('[[PreventExtensions]] trap called'),
+    getOwnPropertyDescriptor: overrides.getOwnPropertyDescriptor || throwTest262Error('[[GetOwnProperty]] trap called'),
+    has: overrides.has || throwTest262Error('[[HasProperty]] trap called'),
+    get: overrides.get || throwTest262Error('[[Get]] trap called'),
+    set: overrides.set || throwTest262Error('[[Set]] trap called'),
+    deleteProperty: overrides.deleteProperty || throwTest262Error('[[Delete]] trap called'),
+    defineProperty: overrides.defineProperty || throwTest262Error('[[DefineOwnProperty]] trap called'),
+    enumerate: throwTest262Error('[[Enumerate]] trap called: this trap has been removed'),
+    ownKeys: overrides.ownKeys || throwTest262Error('[[OwnPropertyKeys]] trap called'),
+    apply: overrides.apply || throwTest262Error('[[Call]] trap called'),
+    construct: overrides.construct || throwTest262Error('[[Construct]] trap called')
+  };
+}
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/slice/create-proxied-array-invalid-len.js
@@ -0,0 +1,55 @@
+// Copyright (C) 2016 the V8 project authors. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+/*---
+es6id: 22.1.3.23
+esid: sec-array.prototype.slice
+description: >
+    Ensure a RangeError is thrown when a proxied array returns an invalid array length.
+info: |
+    [...]
+    8. Let A be ? ArraySpeciesCreate(O, count).
+    [...]
+
+    9.4.2.3 ArraySpeciesCreate
+
+    [...]
+    3. Let isArray be ? IsArray(originalArray).
+    [...]
+    5. Let C be ? Get(originalArray, "constructor").
+    [...]
+    10. Return ? Construct(C, « length »).
+
+    9.4.2.2 ArrayCreate
+
+    [...]
+    3. If length>2^32-1, throw a RangeError exception.
+features: [Proxy]
+---*/
+
+var array = [];
+var maxLength = Math.pow(2, 32);
+var callCount = 0;
+var proxy = new Proxy(array, {
+  get: function(_, name) {
+    if (name === 'length') {
+      return maxLength;
+    }
+    return array[name];
+  },
+  set: function() {
+    callCount += 1;
+    return true;
+  }
+});
+
+assert.throws(RangeError, function() {
+  Array.prototype.slice.call(proxy);
+});
+
+assert.sameValue(
+  callCount,
+  0,
+  'RangeError thrown during array creation, not property modification'
+);
+
+reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/slice/create-species-undef-invalid-len.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2016 the V8 project authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-/*---
-es6id: 22.1.3.23
-esid: sec-array.prototype.slice
-description: >
-    An undefined value for the @@species constructor triggers the creation  of
-    an Array exotic object
-info: |
-    [...]
-    8. Let A be ? ArraySpeciesCreate(O, count).
-    [...]
-
-    9.4.2.3 ArraySpeciesCreate
-
-    [...]
-    5. Let C be ? Get(originalArray, "constructor").
-    [...]
-    7. If Type(C) is Object, then
-       a. Let C be ? Get(C, @@species).
-       b. If C is null, let C be undefined.
-    8. If C is undefined, return ? ArrayCreate(length).
-
-    9.4.2.2 ArrayCreate
-
-    [...]
-    3. If length>232-1, throw a RangeError exception.
-features: [Proxy]
----*/
-
-var array = [];
-var maxLength = Math.pow(2, 32);
-var callCount = 0;
-var proxy = new Proxy(array, {
-  get: function(_, name) {
-    if (name === 'length') {
-      return maxLength;
-    }
-    return array[name];
-  },
-  set: function() {
-    callCount += 1;
-    return true;
-  }
-});
-
-assert.throws(RangeError, function() {
-  Array.prototype.slice.call(proxy);
-});
-
-assert.sameValue(
-  callCount,
-  0,
-  'RangeError thrown during array creation, not property modification'
-);
-
-reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/slice/length-exceeding-integer-limit-proxied-array.js
@@ -0,0 +1,58 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.slice
+description: >
+  Length property is clamped to 2^53-1, test with indices near 2^53-1 and negative indices
+  and a proxy to an array.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let relativeStart be ? ToInteger(start).
+  4. If relativeStart < 0, let k be max((len + relativeStart), 0);
+     else let k be min(relativeStart, len).
+  5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
+  6. If relativeEnd < 0, let final be max((len + relativeEnd), 0);
+     else let final be min(relativeEnd, len).
+  ...
+includes: [compareArray.js]
+---*/
+
+var array = [];
+array["9007199254740988"] = "9007199254740988";
+array["9007199254740989"] = "9007199254740989";
+array["9007199254740990"] = "9007199254740990";
+array["9007199254740991"] = "9007199254740991";
+
+// Create a proxy to an array object, so IsArray returns true, but we can still
+// return a length value exceeding the integer limit.
+var proxy = new Proxy(array, {
+  get(t, pk, r) {
+    if (pk === "length")
+      return 2**53 + 2;
+    return Reflect.get(t, pk, r);
+  }
+});
+
+var result = Array.prototype.slice.call(proxy, 9007199254740989);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(9007199254740989)");
+
+var result = Array.prototype.slice.call(proxy, 9007199254740989, 9007199254740990);
+assert.compareArray(result, [ "9007199254740989" ],
+                    "slice(9007199254740989, 9007199254740990)");
+
+var result = Array.prototype.slice.call(proxy, 9007199254740989, 9007199254740996);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(9007199254740989, 9007199254740996)");
+
+var result = Array.prototype.slice.call(proxy, -2);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(-2)");
+
+var result = Array.prototype.slice.call(proxy, -2, -1);
+assert.compareArray(result, [ "9007199254740989" ],
+                    "slice(-2, -1)");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/slice/length-exceeding-integer-limit.js
@@ -0,0 +1,49 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.slice
+description: >
+  Length property is clamped to 2^53-1, test with indices near 2^53-1 and negative indices.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let relativeStart be ? ToInteger(start).
+  4. If relativeStart < 0, let k be max((len + relativeStart), 0);
+     else let k be min(relativeStart, len).
+  5. If end is undefined, let relativeEnd be len; else let relativeEnd be ? ToInteger(end).
+  6. If relativeEnd < 0, let final be max((len + relativeEnd), 0);
+     else let final be min(relativeEnd, len).
+  ...
+includes: [compareArray.js]
+---*/
+
+var arrayLike = {
+  "9007199254740988": "9007199254740988",
+  "9007199254740989": "9007199254740989",
+  "9007199254740990": "9007199254740990",
+  "9007199254740991": "9007199254740991",
+  length: 2**53 + 2,
+};
+
+var result = Array.prototype.slice.call(arrayLike, 9007199254740989);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(9007199254740989)");
+
+var result = Array.prototype.slice.call(arrayLike, 9007199254740989, 9007199254740990);
+assert.compareArray(result, [ "9007199254740989" ],
+                    "slice(9007199254740989, 9007199254740990)");
+
+var result = Array.prototype.slice.call(arrayLike, 9007199254740989, 9007199254740996);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(9007199254740989, 9007199254740996)");
+
+var result = Array.prototype.slice.call(arrayLike, -2);
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "slice(-2)");
+
+var result = Array.prototype.slice.call(arrayLike, -2, -1);
+assert.compareArray(result, [ "9007199254740989" ],
+                    "slice(-2, -1)");
+
+reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-2-15.js
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.17-2-15
-description: Array.prototype.some - 'length' is property of the global object
----*/
-
-        function callbackfn1(val, idx, obj) {
-            return val > 10;
-        }
-
-        function callbackfn2(val, idx, obj) {
-            return val > 11;
-        }
-
-            this[0] = 9;
-            this[1] = 11;
-            this[2] = 12;
-            this.length = 2;
-
-assert(Array.prototype.some.call(this, callbackfn1), 'Array.prototype.some.call(this, callbackfn1) !== true');
-assert.sameValue(Array.prototype.some.call(this, callbackfn2), false, 'Array.prototype.some.call(this, callbackfn2)');
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Array/prototype/some/15.4.4.17-7-c-i-23.js
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2012 Ecma International.  All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-es5id: 15.4.4.17-7-c-i-23
-description: >
-    Array.prototype.some - This object is an global object which
-    contains index property
----*/
-
-        function callbackfn(val, idx, obj) {
-            if (idx === 0) {
-                return val === 11;
-            }
-            return false;
-        }
-
-            this[0] = 11;
-            this.length = 1;
-
-assert(Array.prototype.some.call(this, callbackfn), 'Array.prototype.some.call(this, callbackfn) !== true');
-
-reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/clamps-length-to-integer-limit.js
@@ -0,0 +1,38 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  Length values exceeding 2^53-1 are clamped to 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+  5. If the number of actual arguments is 0, then
+    a. Let insertCount be 0.
+    b. Let actualDeleteCount be 0.
+  ...
+  19. Perform ? Set(O, "length", len - actualDeleteCount + itemCount, true).
+  ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+Array.prototype.splice.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+Array.prototype.splice.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+Array.prototype.splice.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+Array.prototype.splice.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is Infinity");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/create-species-length-exceeding-integer-limit.js
@@ -0,0 +1,90 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  Create species constructor with length exceeding integer limit and ensure MOP
+  operations are called in correct order.
+info: |
+  ...
+   9. Let A be ? ArraySpeciesCreate(O, actualDeleteCount).
+  10. Let k be 0.
+  11. Repeat, while k < actualDeleteCount
+    a. Let from be ! ToString(actualStart+k).
+    b. Let fromPresent be ? HasProperty(O, from).
+    c. If fromPresent is true, then
+       i. Let fromValue be ? Get(O, from).
+      ii. Perform ? CreateDataPropertyOrThrow(A, ! ToString(k), fromValue).
+    d. Increment k by 1.
+  12. Perform ? Set(A, "length", actualDeleteCount, true).
+  ...
+includes: [compareArray.js, proxyTrapsHelper.js]
+---*/
+
+function StopSplice() {}
+
+var traps = [];
+var targetLength;
+
+var array = ["no-hole", /* hole */, "stop"];
+array.constructor = {
+  [Symbol.species]: function(n) {
+    targetLength = n;
+    return target;
+  }
+};
+
+var source = new Proxy(array, allowProxyTraps({
+  get(t, pk, r) {
+    traps.push(`source.[[Get]]:${String(pk)}`);
+
+    // length property exceeding 2^53-1.
+    if (pk === "length")
+      return 2**53 + 2;
+
+    return Reflect.get(t, pk, r);
+  },
+  has(t, pk, r) {
+    traps.push(`source.[[Has]]:${String(pk)}`);
+
+    return Reflect.get(t, pk, r);
+  },
+}));
+
+var target = new Proxy([], allowProxyTraps({
+  defineProperty(t, pk, desc) {
+    traps.push(`target.[[DefineProperty]]:${String(pk)}`);
+
+    if (pk === "0" || pk === "1")
+      return Reflect.defineProperty(t, pk, desc);
+
+    throw new StopSplice();
+  }
+}));
+
+assert.throws(StopSplice, function() {
+  // deleteCount argument exceeding 2^53-1.
+  Array.prototype.splice.call(source, 0, 2**53 + 4);
+});
+
+assert.sameValue(targetLength, 2**53 - 1,
+                 "length and deleteCount were correctly clamped to 2^53-1");
+
+assert.compareArray(traps, [
+  "source.[[Get]]:length",
+
+  "source.[[Get]]:constructor",
+
+  "source.[[Has]]:0",
+  "source.[[Get]]:0",
+  "target.[[DefineProperty]]:0",
+
+  "source.[[Has]]:1",
+
+  "source.[[Has]]:2",
+  "source.[[Get]]:2",
+  "target.[[DefineProperty]]:2",
+]);
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/length-and-deleteCount-exceeding-integer-limit.js
@@ -0,0 +1,56 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  Length and deleteCount are both clamped to 2^53-1 when they exceed the integer limit.
+info: |
+  ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+  7. Else,
+    a. Let insertCount be the number of actual arguments minus 2.
+    b. Let dc be ? ToInteger(deleteCount).
+    c. Let actualDeleteCount be min(max(dc, 0), len - actualStart).
+  ...
+  11. Repeat, while k < actualDeleteCount
+    a. Let from be ! ToString(actualStart+k).
+    b. Let fromPresent be ? HasProperty(O, from).
+    c. If fromPresent is true, then
+       i. Let fromValue be ? Get(O, from).
+      ii. Perform ? CreateDataPropertyOrThrow(A, ! ToString(k), fromValue).
+    d. Increment k by 1.
+  ...
+includes: [compareArray.js]
+---*/
+
+var arrayLike = {
+  "9007199254740988": "9007199254740988",
+  "9007199254740989": "9007199254740989",
+  "9007199254740990": "9007199254740990",
+  "9007199254740991": "9007199254740991",
+  length: 2**53 + 2,
+};
+
+var result = Array.prototype.splice.call(arrayLike, 9007199254740989, 2**53 + 4);
+
+assert.compareArray(result, [ "9007199254740989", "9007199254740990" ],
+                    "arrayLike['9007199254740989'] and arrayLike['9007199254740990'] are removed");
+
+assert.sameValue(arrayLike.length, 2**53 - 3,
+                 "New length is 2**53 - 3");
+
+assert.sameValue(arrayLike["9007199254740988"], "9007199254740988",
+                 "arrayLike['9007199254740988'] is unchanged");
+
+assert.sameValue("9007199254740989" in arrayLike, false,
+                 "arrayLike['9007199254740989'] is removed");
+
+assert.sameValue("9007199254740990" in arrayLike, false,
+                 "arrayLike['9007199254740990'] is removed");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/length-exceeding-integer-limit-shrink-array.js
@@ -0,0 +1,66 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  An element is removed from an array-like object whose length exceeds the integer limit.
+info: |
+  ...
+  15. If itemCount < actualDeleteCount, then
+    a. Let k be actualStart.
+    b. Repeat, while k < (len - actualDeleteCount)
+        i. Let from be ! ToString(k+actualDeleteCount).
+       ii. Let to be ! ToString(k+itemCount).
+      iii. Let fromPresent be ? HasProperty(O, from).
+       iv. If fromPresent is true, then
+          1. Let fromValue be ? Get(O, from).
+          2. Perform ? Set(O, to, fromValue, true).
+        v. Else fromPresent is false,
+          1. Perform ? DeletePropertyOrThrow(O, to).
+       vi. Increase k by 1.
+    c. Let k be len.
+    d. Repeat, while k > (len - actualDeleteCount + itemCount)
+       i. Perform ? DeletePropertyOrThrow(O, ! ToString(k-1)).
+      ii. Decrease k by 1.
+  ...
+includes: [compareArray.js]
+---*/
+
+var arrayLike = {
+  "9007199254740986": "9007199254740986",
+  "9007199254740987": "9007199254740987",
+  "9007199254740988": "9007199254740988",
+  /* "9007199254740989": hole */
+  "9007199254740990": "9007199254740990",
+  "9007199254740991": "9007199254740991",
+  length: 2**53 + 2,
+};
+
+var result = Array.prototype.splice.call(arrayLike, 9007199254740987, 1);
+
+assert.compareArray(result, [ "9007199254740987" ],
+                    "arrayLike['9007199254740987'] is removed");
+
+assert.sameValue(arrayLike.length, 2**53 - 2,
+                 "New length is 2**53 - 2");
+
+assert.sameValue(arrayLike["9007199254740986"], "9007199254740986",
+                 "arrayLike['9007199254740986'] is unchanged");
+
+assert.sameValue(arrayLike["9007199254740987"], "9007199254740988",
+                 "arrayLike['9007199254740988'] is moved to arrayLike['9007199254740987']");
+
+assert.sameValue("9007199254740988" in arrayLike, false,
+                 "arrayLike['9007199254740990'] is removed");
+
+assert.sameValue(arrayLike["9007199254740989"], "9007199254740990",
+                 "arrayLike['9007199254740990'] is moved to arrayLike['9007199254740989']");
+
+assert.sameValue("9007199254740990" in arrayLike, false,
+                 "arrayLike['9007199254740990'] is removed");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/length-near-integer-limit-grow-array.js
@@ -0,0 +1,64 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  A value is inserted in an array-like object whose length property is near the integer limit.
+info: |
+  ...
+  16. Else if itemCount > actualDeleteCount, then
+    a. Let k be (len - actualDeleteCount).
+    b. Repeat, while k > actualStart
+        i. Let from be ! ToString(k + actualDeleteCount - 1).
+       ii. Let to be ! ToString(k + itemCount - 1).
+      iii. Let fromPresent be ? HasProperty(O, from).
+       iv. If fromPresent is true, then
+          1. Let fromValue be ? Get(O, from).
+          2. Perform ? Set(O, to, fromValue, true).
+        v. Else fromPresent is false,
+          1. Perform ? DeletePropertyOrThrow(O, to).
+       vi. Decrease k by 1.
+  ...
+includes: [compareArray.js]
+---*/
+
+var arrayLike = {
+  "9007199254740985": "9007199254740985",
+  "9007199254740986": "9007199254740986",
+  "9007199254740987": "9007199254740987",
+  /* "9007199254740988": hole */
+  "9007199254740989": "9007199254740989",
+  /* "9007199254740990": empty */
+  "9007199254740991": "9007199254740991",
+  length: 2**53 - 2,
+};
+
+var result = Array.prototype.splice.call(arrayLike, 9007199254740986, 0, "new-value");
+
+assert.compareArray(result, [], "No elements are removed");
+
+assert.sameValue(arrayLike.length, 2**53 - 1, "New length is 2**53 - 1");
+
+assert.sameValue(arrayLike["9007199254740985"], "9007199254740985",
+                 "arrayLike['9007199254740985'] is unchanged");
+
+assert.sameValue(arrayLike["9007199254740986"], "new-value",
+                 "arrayLike['9007199254740986'] contains the inserted value");
+
+assert.sameValue(arrayLike["9007199254740987"], "9007199254740986",
+                 "arrayLike['9007199254740986'] is moved to arrayLike['9007199254740987']");
+
+assert.sameValue(arrayLike["9007199254740988"], "9007199254740987",
+                 "arrayLike['9007199254740987'] is moved to arrayLike['9007199254740988']");
+
+assert.sameValue("9007199254740989" in arrayLike, false,
+                 "arrayLike['9007199254740989'] is removed");
+
+assert.sameValue(arrayLike["9007199254740990"], "9007199254740989",
+                 "arrayLike['9007199254740989'] is moved to arrayLike['9007199254740990']");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Array/prototype/splice/shell.js
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/shell.js
@@ -0,0 +1,23 @@
+// file: proxyTrapsHelper.js
+function allowProxyTraps(overrides) {
+  function throwTest262Error(msg) {
+    return function () { throw new Test262Error(msg); };
+  }
+  if (!overrides) { overrides = {}; }
+  return {
+    getPrototypeOf: overrides.getPrototypeOf || throwTest262Error('[[GetPrototypeOf]] trap called'),
+    setPrototypeOf: overrides.setPrototypeOf || throwTest262Error('[[SetPrototypeOf]] trap called'),
+    isExtensible: overrides.isExtensible || throwTest262Error('[[IsExtensible]] trap called'),
+    preventExtensions: overrides.preventExtensions || throwTest262Error('[[PreventExtensions]] trap called'),
+    getOwnPropertyDescriptor: overrides.getOwnPropertyDescriptor || throwTest262Error('[[GetOwnProperty]] trap called'),
+    has: overrides.has || throwTest262Error('[[HasProperty]] trap called'),
+    get: overrides.get || throwTest262Error('[[Get]] trap called'),
+    set: overrides.set || throwTest262Error('[[Set]] trap called'),
+    deleteProperty: overrides.deleteProperty || throwTest262Error('[[Delete]] trap called'),
+    defineProperty: overrides.defineProperty || throwTest262Error('[[DefineOwnProperty]] trap called'),
+    enumerate: throwTest262Error('[[Enumerate]] trap called: this trap has been removed'),
+    ownKeys: overrides.ownKeys || throwTest262Error('[[OwnPropertyKeys]] trap called'),
+    apply: overrides.apply || throwTest262Error('[[Call]] trap called'),
+    construct: overrides.construct || throwTest262Error('[[Construct]] trap called')
+  };
+}
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/splice/throws-if-integer-limit-exceeded.js
@@ -0,0 +1,42 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.splice
+description: >
+  A TypeError is thrown if the new length exceeds 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  ...
+  7. Else,
+    a. Let insertCount be the number of actual arguments minus 2.
+    b. Let dc be ? ToInteger(deleteCount).
+    c. Let actualDeleteCount be min(max(dc, 0), len - actualStart).
+  8. If len+insertCount-actualDeleteCount > 2^53-1, throw a TypeError exception.
+  ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+assert.throws(TypeError, function() {
+  Array.prototype.splice.call(arrayLike, 0, 0, null);
+}, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+assert.throws(TypeError, function() {
+  Array.prototype.splice.call(arrayLike, 0, 0, null);
+}, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+assert.throws(TypeError, function() {
+  Array.prototype.splice.call(arrayLike, 0, 0, null);
+}, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+assert.throws(TypeError, function() {
+  Array.prototype.splice.call(arrayLike, 0, 0, null);
+}, "Length is Infinity");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/unshift/clamps-to-integer-limit.js
@@ -0,0 +1,34 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.unshift
+description: >
+  Length values exceeding 2^53-1 are clamped to 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let argCount be the number of actual arguments.
+  4. If argCount > 0, then ...
+  5. Perform ? Set(O, "length", len+argCount, true).
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+Array.prototype.unshift.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+Array.prototype.unshift.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+Array.prototype.unshift.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+Array.prototype.unshift.call(arrayLike);
+assert.sameValue(arrayLike.length, 2**53 - 1, "Length is Infinity");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/unshift/length-near-integer-limit.js
@@ -0,0 +1,62 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.unshift
+description: >
+  Test properties are correctly accessed when length property is near 2^53-1.
+info: |
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let argCount be the number of actual arguments.
+  4. If argCount > 0, then
+    ...
+    b. Let k be len.
+    c. Repeat, while k > 0,
+        i. Let from be ! ToString(k-1).
+       ii. Let to be ! ToString(k+argCount-1).
+      iii. Let fromPresent be ? HasProperty(O, from).
+       iv. If fromPresent is true, then
+          1. Let fromValue be ? Get(O, from).
+          2. Perform ? Set(O, to, fromValue, true).
+        v. Else fromPresent is false,
+          1. Perform ? DeletePropertyOrThrow(O, to).
+       vi. Decrease k by 1.
+---*/
+
+function StopUnshift() {}
+
+var arrayLike = {
+  get "9007199254740986"() {
+    throw new StopUnshift();
+  },
+  "9007199254740987": "9007199254740987",
+  /* "9007199254740988": hole */
+  "9007199254740989": "9007199254740989",
+  /* "9007199254740990": empty */
+  "9007199254740991": "9007199254740991",
+  length: 2**53 - 2
+};
+
+assert.throws(StopUnshift, function() {
+  Array.prototype.unshift.call(arrayLike, null);
+});
+
+assert.sameValue(arrayLike.length, 2**53 - 2,
+                 "arrayLike.length is unchanged");
+
+assert.sameValue(arrayLike["9007199254740987"], "9007199254740987",
+                 "arrayLike['9007199254740987'] is unchanged");
+
+assert.sameValue(arrayLike["9007199254740988"], "9007199254740987",
+                 "arrayLike['9007199254740988'] is replaced with arrayLike['9007199254740987']");
+
+assert.sameValue("9007199254740989" in arrayLike, false,
+                 "arrayLike['9007199254740989'] is removed");
+
+assert.sameValue(arrayLike["9007199254740990"], "9007199254740989",
+                 "arrayLike['9007199254740990'] is replaced with arrayLike['9007199254740989']");
+
+assert.sameValue(arrayLike["9007199254740991"], "9007199254740991",
+                 "arrayLike['9007199254740991'] is unchanged");
+
+reportCompare(0, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Array/prototype/unshift/throws-if-integer-limit-exceeded.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2017 André Bargull. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+esid: sec-array.prototype.unshift
+description: >
+  A TypeError is thrown if the new length exceeds 2^53-1.
+info: |
+  1. ...
+  2. Let len be ? ToLength(? Get(O, "length")).
+  3. Let argCount be the number of actual arguments.
+  4. If argCount > 0, then
+    a. If len+argCount > 2^53-1, throw a TypeError exception.
+    b. ...
+---*/
+
+var arrayLike = {};
+
+arrayLike.length = 2**53 - 1;
+assert.throws(TypeError, function() {
+  Array.prototype.unshift.call(arrayLike, null);
+}, "Length is 2**53 - 1");
+
+arrayLike.length = 2**53;
+assert.throws(TypeError, function() {
+  Array.prototype.unshift.call(arrayLike, null);
+}, "Length is 2**53");
+
+arrayLike.length = 2**53 + 2;
+assert.throws(TypeError, function() {
+  Array.prototype.unshift.call(arrayLike, null);
+}, "Length is 2**53 + 2");
+
+arrayLike.length = Infinity;
+assert.throws(TypeError, function() {
+  Array.prototype.unshift.call(arrayLike, null);
+}, "Length is Infinity");
+
+reportCompare(0, 0);
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/AsyncGenerator.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/AsyncGenerator.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: >
   Function.prototype.toString on an async generator created with the
   AsyncGenerator constructor.
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-declaration.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-declaration.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator declaration
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-expression.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-expression.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator expression
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-expression-static.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-expression-static.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator method
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-expression.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-expression.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator method
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-statement-static.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-statement-static.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator method
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-statement.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-class-statement.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator method
 features: [async-iteration]
 ---*/
--- a/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-object.js
+++ b/js/src/tests/test262/built-ins/Function/prototype/toString/async-generator-method-object.js
@@ -1,8 +1,9 @@
+// |reftest| skip-if(release_or_beta) -- async-iteration is not released yet
 // Copyright 2017 André Bargull. All rights reserved.
 // This code is governed by the BSD license found in the LICENSE file.
 
 /*---
 esid: pending
 description: Function.prototype.toString on an async generator method
 features: [async-iteration]
 ---*/
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Promise/reject-via-abrupt-queue.js
@@ -0,0 +1,54 @@
+// Copyright (C) 2017 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+description: >
+  Rejecting through an abrupt completion - captured in a queued job
+esid: sec-promise-executor
+info: |
+  25.4.3.1 Promise ( executor )
+
+  ...
+  9. Let completion be Call(executor, undefined, « resolvingFunctions.[[Resolve]],
+    resolvingFunctions.[[Reject]] »).
+  10. If completion is an abrupt completion, then
+    a. Perform ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] »).
+  11. Return promise.
+
+  25.4.1.3.1 Promise Reject Functions
+
+  ...
+  6. Return RejectPromise(promise, reason).
+
+  25.4.5.3.1 PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability )
+
+  ...
+  4. If IsCallable(onRejected) is false, then
+    a. Set onRejected to undefined.
+  ...
+  6. Let rejectReaction be the PromiseReaction { [[Capability]]: resultCapability,
+    [[Type]]: "Reject", [[Handler]]: onRejected }.
+  ...
+  9. Else,
+    a. Assert: The value of promise.[[PromiseState]] is "rejected".
+    ...
+    d. Perform EnqueueJob("PromiseJobs", PromiseReactionJob, « rejectReaction, reason »).
+flags: [async]
+---*/
+
+var thenable = Promise.resolve();
+var p = new Promise(function() {
+  throw thenable;
+});
+
+p.then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }).then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }, function(x) {
+    if (x !== thenable) {
+      $DONE('The promise should be rejected with the resolution value.');
+      return;
+    }
+    $DONE();
+  });
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Promise/reject-via-fn-deferred-queue.js
@@ -0,0 +1,62 @@
+// Copyright (C) 2017 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+description: >
+  Rejecting through deferred invocation of the provided resolving function,
+  captured in a queued job.
+esid: sec-promise-executor
+info: |
+  25.4.3.1 Promise ( executor )
+
+  ...
+  9. Let completion be Call(executor, undefined, « resolvingFunctions.[[Resolve]],
+    resolvingFunctions.[[Reject]] »).
+  10. If completion is an abrupt completion, then
+    a. Perform ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] »).
+  11. Return promise.
+
+  25.4.1.3.1 Promise Reject Functions
+
+  ...
+  6. Return RejectPromise(promise, reason).
+
+  25.4.5.3.1 PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability )
+
+  ...
+  4. If IsCallable(onRejected) is false, then
+    a. Set onRejected to undefined.
+  ...
+  6. Let rejectReaction be the PromiseReaction { [[Capability]]: resultCapability,
+    [[Type]]: "Reject", [[Handler]]: onRejected }.
+  7. If promise.[[PromiseState]] is "pending", then
+    ...
+    b. Append rejectReaction as the last element of the List that is
+      promise.[[PromiseRejectReactions]].
+  ...
+flags: [async]
+---*/
+
+var thenable = Promise.resolve();
+var returnValue = null;
+var reject;
+var p = new Promise(function(_, _reject) {
+  reject = _reject;
+});
+
+p.then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }).then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }, function(x) {
+    if (x !== thenable) {
+      $DONE('The promise should be rejected with the resolution value.');
+      return;
+    }
+
+    $DONE();
+  });
+
+returnValue = reject(thenable);
+
+assert.sameValue(returnValue, undefined, '"reject" function return value');
new file mode 100644
--- /dev/null
+++ b/js/src/tests/test262/built-ins/Promise/reject-via-fn-immed-queue.js
@@ -0,0 +1,59 @@
+// Copyright (C) 2017 Mozilla Corporation. All rights reserved.
+// This code is governed by the BSD license found in the LICENSE file.
+
+/*---
+description: >
+  Rejecting through immediate invocation of the provided resolving function,
+  captured in a queued job.
+esid: sec-promise-executor
+info: |
+  25.4.3.1 Promise ( executor )
+
+  ...
+  9. Let completion be Call(executor, undefined, « resolvingFunctions.[[Resolve]],
+    resolvingFunctions.[[Reject]] »).
+  10. If completion is an abrupt completion, then
+    a. Perform ? Call(resolvingFunctions.[[Reject]], undefined, « completion.[[Value]] »).
+  11. Return promise.
+
+  25.4.1.3.1 Promise Reject Functions
+
+  ...
+  6. Return RejectPromise(promise, reason).
+
+  25.4.5.3.1 PerformPromiseThen ( promise, onFulfilled, onRejected, resultCapability )
+
+  ...
+  4. If IsCallable(onRejected) is false, then
+    a. Set onRejected to undefined.
+  ...
+  6. Let rejectReaction be the PromiseReaction { [[Capability]]: resultCapability,
+    [[Type]]: "Reject", [[Handler]]: onRejected }.
+  ...
+  9. Else,
+    a. Assert: The value of promise.[[PromiseState]] is "rejected".
+    ...
+    d. Perform EnqueueJob("PromiseJobs", PromiseReactionJob, « rejectReaction, reason »).
+flags: [async]
+---*/
+
+var thenable = Promise.resolve();
+var returnValue = null;
+var p = new Promise(function(_, reject) {
+  returnValue = reject(thenable);
+});
+
+assert.sameValue(returnValue, undefined, '"reject" function return value');
+
+p.then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }).then(function() {
+    $DONE('The promise should not be fulfilled.');
+  }, function(x) {
+    if (x !== thenable) {
+      $DONE('The promise should be rejected with the resolution value.');
+      return;
+    }
+
+    $DONE();
+  });
--- a/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class.js
+++ b/js/src/tests/test262/built-ins/RegExp/property-escapes/character-class.js
@@ -5,19 +5,21 @@
 author: Mathias Bynens
 description: >
   Unicode property escapes must be supported in character classes.
 esid: sec-static-semantics-unicodematchproperty-p
 features: [regexp-unicode-property-escapes]
 ---*/
 
 /[\p{Hex}]/u;
-assert(
-  /[\p{Hex}-\uFFFF]/u.test('-'),
-  'property escape in character class should not be parsed as the start of a range'
+assert.throws(
+  SyntaxError,
+  () => /[\p{Hex}-\uFFFF]/u,
+  // See step 1 of https://tc39.github.io/ecma262/#sec-runtime-semantics-characterrange-abstract-operation.
+  'property escape at start of character class range should throw if it expands to multiple characters'
 );
 assert.throws.early(SyntaxError, "/[\\p{}]/u");
 assert.throws.early(SyntaxError, "/[\\p{invalid}]/u");
 assert.throws.early(SyntaxError, "/[\\p{]/u");
 assert.throws.early(SyntaxError, "/[\\p{]}/u");
 assert.throws.early(SyntaxError, "/[\\p}]/u");
 assert(
   /[\p{Hex}\P{Hex}]/u.test('\u{1D306}'),
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/AUTHORS
+++ /dev/null
@@ -1,12 +0,0 @@
-Arun Purushan <arun.etm@gmail.com>
-Benjamin Bouvier <public@benj.me>
-Bill Budge <bbudge@chromium.org>
-Dan Ehrenberg <littledan@chromium.org>
-Dan Gohman <sunfish@mozilla.com>
-Deepti Gandluri <gdeepti@google.com>
-Florian Scholz <elchi3@elchi3.de>
-Heidi Pan <heidi.pan@intel.com>
-Jakob Stoklund Olesen <jolesen@mozilla.com>
-John McCutchan <john@johnmccutchan.com>
-Ningxin Hu <ningxin.hu@intel.com>
-Peter Jensen <peter.jensen@intel.com>
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/all_true.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-all-true
-description: AllTrue returns true if all the SIMDElements are true.
-includes: [simdUtilities.js]
----*/
-
-function testAllTrue(type) {
-  assert.sameValue('function', typeof type.fn.allTrue);
-  // All lanes 'true'.
-  var a = type.fn.splat(true);
-  assert(type.fn.allTrue(a));
-  // One lane 'false'.
-  for (var i = 0; i < type.lanes; i++) {
-    a = type.fn.replaceLane(a, i, false);
-    assert(!type.fn.allTrue(a));
-  }
-  // All lanes 'false'.
-  a = type.fn.splat(false);
-  assert(!type.fn.allTrue(a));
-}
-
-simdTypes.filter(isBoolType).forEach(function(type) {
-  testSimdFunction(type.name + ' allTrue', function() {
-    testAllTrue(type, 'allTrue');
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/any_true.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-any-true
-description: AllTrue returns true if all the SIMDElements are true.
-includes: [simdUtilities.js]
----*/
-
-function testAnyTrue(type) {
-  assert.sameValue('function', typeof type.fn.anyTrue);
-  // All lanes 'false'.
-  var a = type.fn.splat(false);
-  assert(!type.fn.anyTrue(a));
-  // One lane 'true'.
-  for (var i = 0; i < type.lanes; i++) {
-    a = type.fn.replaceLane(a, i, true);
-    assert(type.fn.anyTrue(a));
-  }
-  // All lanes 'true'.
-  a = type.fn.splat(true);
-  assert(type.fn.anyTrue(a));
-}
-
-simdTypes.filter(isBoolType).forEach(function(type) {
-  testSimdFunction(type.name + ' anyTrue', function() {
-    testAnyTrue(type, 'anyTrue');
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/bit_conversion.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: pending
-description: Tests Float32x4 Int32x4 bit conversion.
-includes: [simdUtilities.js]
----*/
-
-testSimdFunction('Float32x4 Int32x4 bit conversion', function() {
-  var m = SIMD.Int32x4(0x3F800000, 0x40000000, 0x40400000, 0x40800000);
-  var n = SIMD.Float32x4.fromInt32x4Bits(m);
-  assert.sameValue(1.0, SIMD.Float32x4.extractLane(n, 0));
-  assert.sameValue(2.0, SIMD.Float32x4.extractLane(n, 1));
-  assert.sameValue(3.0, SIMD.Float32x4.extractLane(n, 2));
-  assert.sameValue(4.0, SIMD.Float32x4.extractLane(n, 3));
-  n = SIMD.Float32x4(5.0, 6.0, 7.0, 8.0);
-  m = SIMD.Int32x4.fromFloat32x4Bits(n);
-  assert.sameValue(0x40A00000, SIMD.Int32x4.extractLane(m, 0));
-  assert.sameValue(0x40C00000, SIMD.Int32x4.extractLane(m, 1));
-  assert.sameValue(0x40E00000, SIMD.Int32x4.extractLane(m, 2));
-  assert.sameValue(0x41000000, SIMD.Int32x4.extractLane(m, 3));
-  // Flip sign using bit-wise operators.
-  n = SIMD.Float32x4(9.0, 10.0, 11.0, 12.0);
-  m = SIMD.Int32x4(0x80000000, 0x80000000, 0x80000000, 0x80000000);
-  var nMask = SIMD.Int32x4.fromFloat32x4Bits(n);
-  nMask = SIMD.Int32x4.xor(nMask, m); // flip sign.
-  n = SIMD.Float32x4.fromInt32x4Bits(nMask);
-  assert.sameValue(-9.0, SIMD.Float32x4.extractLane(n, 0));
-  assert.sameValue(-10.0, SIMD.Float32x4.extractLane(n, 1));
-  assert.sameValue(-11.0, SIMD.Float32x4.extractLane(n, 2));
-  assert.sameValue(-12.0, SIMD.Float32x4.extractLane(n, 3));
-  nMask = SIMD.Int32x4.fromFloat32x4Bits(n);
-  nMask = SIMD.Int32x4.xor(nMask, m); // flip sign.
-  n = SIMD.Float32x4.fromInt32x4Bits(nMask);
-  assert.sameValue(9.0, SIMD.Float32x4.extractLane(n, 0));
-  assert.sameValue(10.0, SIMD.Float32x4.extractLane(n, 1));
-  assert.sameValue(11.0, SIMD.Float32x4.extractLane(n, 2));
-  assert.sameValue(12.0, SIMD.Float32x4.extractLane(n, 3));
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/bit_preservation.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: pending
-description: Tests SIMD load and store bit preservation.
-includes: [simdUtilities.js]
----*/
-
-testSimdFunction('Float32x4 Int32x4 load/store bit preservation', function() {
-   // NaNs should stay unmodified when storing and loading to Float32Array
-  var taf32 = new Float32Array(4);
-  var tai32 = new Int32Array(4);
-  var i4a, i4b;
-  i4a = SIMD.Int32x4(0x7fc00000,0x7fe00000,0x7ff00000,0x7ff80000);
-  SIMD.Int32x4.store(taf32, 0, i4a);
-  i4b = SIMD.Int32x4.load(taf32, 0);
-  equalInt32x4(i4a, i4b);
-
-  // NaNs should stay unmodified when loading as Float32x4 and
-  // storing as Int32x4
-  SIMD.Int32x4.store(taf32, 0, i4a);
-  var f4 = SIMD.Float32x4.load(taf32, 0);
-  SIMD.Float32x4.store(tai32, 0, f4);
-  i4b = SIMD.Int32x4.load(tai32, 0);
-  equalInt32x4(i4a, i4b);
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/check.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-check
-description: Checks if a SIMDTypeDescriptor is not a SIMDDescriptor.
-includes: [simdUtilities.js]
----*/
-
-function testCheck(type) {
-  assert.sameValue('function', typeof type.fn.check);
-  // Other SIMD types shouldn't check for this type.
-  var a = type.fn();
-  for (var otherType of simdTypes) {
-    if (otherType === type) {
-      var result = type.fn.check(a);
-      checkValue(type, result, function(index) {
-        return type.fn.extractLane(a, index);
-      });
-      assert.sameValue(a, type.fn.check(a));
-    } else {
-      assert.throws(TypeError, function() { otherType.check(a); });
-    }
-  }
-  // Neither should other types.
-  for (var x of [ {}, "", 0, 1, true, false, undefined, null, NaN, Infinity]) {
-    assert.throws(TypeError, function() { type.fn.check(x); });
-  }
-}
-
-simdTypes.forEach(function(type) {
-  testSimdFunction(type.name + ' check', function() {
-    testCheck(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/constructor.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-wrapper
-description: Test the constructor and splat with the given lane values.
-includes: [simdUtilities.js]
----*/
-
-function testConstructor(type) {
-  assert.sameValue('function', typeof type.fn);
-  assert.sameValue('function', typeof type.fn.splat);
-  for (var v of type.interestingValues) {
-    var expected = simdConvert(type, v);
-    var result = createSplatValue(type, v);
-    checkValue(type, result, function(index) { return expected; });
-    // splat.
-    result = type.fn.splat(v);
-    checkValue(type, result, function(index) { return expected; });
-  }
-}
-
-simdTypes.forEach(function(type) {
-  testSimdFunction(type.name + ' constructor', function() {
-    testConstructor(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/float_operators.js
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: constructor-properties
-description: Test floating point SIMD operations.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isFloatType).forEach(function(type) {
-  testSimdFunction(type.name + ' div', function() {
-    testBinaryOp(type, 'div', function(a, b) { return a / b; });
-  });
-  testSimdFunction(type.name + ' abs', function() {
-    testUnaryOp(type, 'abs', Math.abs);
-  });
-  testSimdFunction(type.name + ' min', function() {
-    testBinaryOp(type, 'min', Math.min);
-  });
-  testSimdFunction(type.name + ' max', function() {
-    testBinaryOp(type, 'max', Math.max);
-  });
-  testSimdFunction(type.name + ' minNum', function() {
-    testBinaryOp(type, 'minNum', minNum);
-  });
-  testSimdFunction(type.name + ' maxNum', function() {
-    testBinaryOp(type, 'maxNum', maxNum);
-  });
-  testSimdFunction(type.name + ' sqrt', function() {
-    testUnaryOp(type, 'sqrt', function(a) { return Math.sqrt(a); });
-  });
-  testSimdFunction(type.name + ' reciprocalApproximation', function() {
-    testUnaryOp(type, 'reciprocalApproximation', function(a) { return 1 / a; });
-  });
-  testSimdFunction(type.name + ' reciprocalSqrtApproximation', function() {
-    testUnaryOp(type, 'reciprocalSqrtApproximation', function(a) {
-      return 1 / Math.sqrt(a); });
-  });
-})
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/from.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-to-timd-logical
-description: Tests From<type> functions.
-includes: [simdUtilities.js]
----*/
-
-function testFrom(toType, fromType, name) {
-  assert.sameValue('function', typeof toType.fn[name]);
-  for (var v of fromType.interestingValues) {
-    var fromValue = createSplatValue(fromType, v);
-    v = Math.trunc(simdConvert(fromType, v));
-    if (toType.minVal !== undefined &&
-        !(toType.minVal <= v && v <= toType.maxVal)) {
-      assert.throws(RangeError, function() { toType.fn[name](fromValue) });
-    } else {
-      v = simdConvert(toType, v);
-      var result = toType.fn[name](fromValue);
-      checkValue(toType, result, function(index) { return v; });
-    }
-  }
-}
-
-simdTypes.forEach(function(toType) {
-  if (!toType.from) return;
-  for (var fromType of toType.from) {
-    var fn = 'from' + fromType.name;
-    testSimdFunction(toType.name + ' ' + fn, function() {
-      testFrom(toType, fromType, fn);
-    });
-  }
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/from_bits.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-to-timd
-description: From<type>Bits functions.
-includes: [simdUtilities.js]
----*/
-
-function testFromBits(toType, fromType, name) {
-  assert.sameValue('function', typeof toType.fn[name]);
-  for (var v of fromType.interestingValues) {
-    var fromValue = createSplatValue(fromType, v);
-    var result = toType.fn[name](fromValue);
-    for (var i = 0; i < fromType.lanes; i++)
-      fromType.buffer[i] = fromType.fn.extractLane(fromValue, i);
-    checkValue(toType, result, function(index) {
-      return toType.buffer[index];
-    });
-  }
-}
-
-simdTypes.forEach(function(toType) {
-  if (!toType.fromBits) return;
-  for (var fromType of toType.fromBits) {
-    var fn = 'from' + fromType.name + 'Bits';
-    testSimdFunction(toType.name + ' ' + fn, function() {
-      testFromBits(toType, fromType, fn);
-    });
-  }
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/loadn.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-load-from-tarray
-description: Tests SIMD load functions.
-includes: [simdUtilities.js]
----*/
-
-function testLoad(type, name, count) {
-  var loadFn = type.fn[name];
-  assert.sameValue('function', typeof loadFn);
-  var bufLanes = 2 * type.lanes;  // Test all alignments.
-  var bufSize = bufLanes * type.laneSize + 8;  // Extra for over-alignment test.
-  var ab = new ArrayBuffer(bufSize);
-  var buf = new type.view(ab);
-  for (var i = 0; i < bufLanes; i++) buf[i] = i; // Number buffer sequentially.
-  // Test aligned loads.
-  for (var i = 0; i < type.lanes; i++) {
-    var a = loadFn(buf, i);
-    checkValue(type, a, function(index) {
-      return index < count ? i + index : 0;
-    });
-  }
-
-  // Test index coercions
-  // Unlike typedArray[index], non-canonical strings are allowed here.
-  checkValue(type, loadFn(buf, "0"),
-      function(index) { return index < count ? index : 0; });
-  checkValue(type, loadFn(buf, " -0.0 "),
-      function(index) { return index < count ? index : 0; });
-  checkValue(type, loadFn(buf, "00"),
-      function(index) { return index < count ? index : 0; });
-  checkValue(type, loadFn(buf, false),
-      function(index) { return index < count ? index : 0; });
-  checkValue(type, loadFn(buf, null),
-      function(index) { return index < count ? index : 0; });
-  checkValue(type, loadFn(buf, "01"),
-      function(index) { return index < count ? 1 + index : 0; });
-  checkValue(type, loadFn(buf, " +1e0"),
-      function(index) { return index < count ? 1 + index : 0; });
-  checkValue(type, loadFn(buf, true),
-      function(index) { return index < count ? 1 + index : 0; });
-
-  // Test the 2 possible over-alignments.
-  var f64 = new Float64Array(ab);
-  var stride = 8 / type.laneSize;
-  for (var i = 0; i < 1; i++) {
-    var a = loadFn(f64, i);
-    checkValue(type, a, function(index) {
-      return index < count ? stride * i + index : 0;
-    });
-  }
-  // Test the 7 possible mis-alignments.
-  var i8 = new Int8Array(ab);
-  for (var misalignment = 1; misalignment < 8; misalignment++) {
-    // Shift the buffer up by 1 byte.
-    for (var i = i8.length - 1; i > 0; i--)
-      i8[i] = i8[i - 1];
-    var a = loadFn(i8, misalignment);
-    checkValue(type, a, function(index) {
-      return index < count ? i + index : 0;
-    });
-  }
-
-  function testIndexCheck(buf, index, err) {
-    assert.throws(err, function () { loadFn(buf, index); });
-  }
-  testIndexCheck(buf, -1, RangeError);
-  testIndexCheck(buf, 0.7, RangeError);
-  testIndexCheck(buf, -0.1, RangeError);
-  testIndexCheck(buf, NaN, RangeError);
-  testIndexCheck(buf, bufSize / type.laneSize - count + 1, RangeError);
-  testIndexCheck(buf.buffer, 1, TypeError);
-  testIndexCheck(buf, "a", RangeError);
-}
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' load', function() {
-    testLoad(type, 'load', type.lanes);
-  });
-});
-
-simdTypes.filter(hasLoadStore123).forEach(function(type) {
-  testSimdFunction(type.name + ' load1', function() {
-    testLoad(type, 'load1', 1);
-  });
-  testSimdFunction(type.name + ' load2', function() {
-    testLoad(type, 'load2', 2);
-  });
-  testSimdFunction(type.name + ' load3', function() {
-    testLoad(type, 'load3', 3);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/logical_operators.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: constructor-properties
-description: Test SIMD Logical operations.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isLogical).forEach(function(type) {
-  testSimdFunction(type.name + ' and', function() {
-    testBinaryOp(type, 'and', function(a, b) { return a & b; });
-  });
-  testSimdFunction(type.name + ' or', function() {
-    testBinaryOp(type, 'or', function(a, b) { return a | b; });
-  });
-  testSimdFunction(type.name + ' xor', function() {
-    testBinaryOp(type, 'xor', function(a, b) { return a ^ b; });
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/negate.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-neg
-description: Tests the unary '-' operation.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' neg', function() {
-    testUnaryOp(type, 'neg', function(a) { return -a; });
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/not.js
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-not
-description: Tests the unary not operation.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isIntType).forEach(function(type) {
-  testSimdFunction(type.name + ' not', function() {
-    testUnaryOp(type, 'not', function(a) { return ~a; });
-  });
-});
-
-simdTypes.filter(isBoolType).forEach(function(type) {
-  testSimdFunction(type.name + ' not', function() {
-    testUnaryOp(type, 'not', function(a) { return !a; });
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/numerical_operators.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: constructor-properties
-description: Tests the SIMD numerical operations.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' equal', function() {
-    testRelationalOp(type, 'equal', function(a, b) { return a == b; });
-  });
-  testSimdFunction(type.name + ' notEqual', function() {
-    testRelationalOp(type, 'notEqual', function(a, b) { return a != b; });
-  });
-  testSimdFunction(type.name + ' lessThan', function() {
-    testRelationalOp(type, 'lessThan', function(a, b) { return a < b; });
-  });
-  testSimdFunction(type.name + ' lessThanOrEqual', function() {
-    testRelationalOp(type, 'lessThanOrEqual', function(a, b) {
-      return a <= b;
-    });
-  });
-  testSimdFunction(type.name + ' greaterThan', function() {
-    testRelationalOp(type, 'greaterThan', function(a, b) { return a > b; });
-  });
-  testSimdFunction(type.name + ' greaterThanOrEqual', function() {
-    testRelationalOp(type, 'greaterThanOrEqual', function(a, b) { return a >= b; });
-  });
-  testSimdFunction(type.name + ' add', function() {
-    testBinaryOp(type, 'add', function(a, b) { return a + b; });
-  });
-  testSimdFunction(type.name + ' sub', function() {
-    testBinaryOp(type, 'sub', function(a, b) { return a - b; });
-  });
-  testSimdFunction(type.name + ' mul', function() {
-    testBinaryOp(type, 'mul', type.mulFn);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/operators.js
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: pending
-description: Test SIMD operators.
-includes: [simdUtilities.js]
----*/
-
-function testOperators(type) {
-  var inst = createTestValue(type);
-  assert.throws(TypeError, function() { Number(inst) });
-  assert.throws(TypeError, function() { +inst });
-  assert.throws(TypeError, function() { -inst });
-  assert.throws(TypeError, function() { ~inst });
-  assert.throws(TypeError, function() { Math.fround(inst) });
-  assert.throws(TypeError, function() { inst|0} );
-  assert.throws(TypeError, function() { inst&0 });
-  assert.throws(TypeError, function() { inst^0 });
-  assert.throws(TypeError, function() { inst>>>0 });
-  assert.throws(TypeError, function() { inst>>0 });
-  assert.throws(TypeError, function() { inst<<0 });
-  assert.throws(TypeError, function() { (inst + inst) });
-  assert.throws(TypeError, function() { inst - inst });
-  assert.throws(TypeError, function() { inst * inst });
-  assert.throws(TypeError, function() { inst / inst });
-  assert.throws(TypeError, function() { inst % inst });
-  assert.throws(TypeError, function() { inst < inst });
-  assert.throws(TypeError, function() { inst > inst });
-  assert.throws(TypeError, function() { inst <= inst });
-  assert.throws(TypeError, function() { inst >= inst });
-  assert.throws(TypeError, function() { inst(); });
-
-  assert.sameValue(inst[0], undefined);
-  assert.sameValue(inst.a, undefined);
-  assert.sameValue(!inst, false);
-  assert.sameValue(!inst, false);
-  assert.sameValue(inst ? 1 : 2, 1);
-  assert.sameValue(inst ? 1 : 2, 1);
-
-  assert.sameValue('function', typeof inst.toString);
-  assert.sameValue('function', typeof inst.toLocaleString);
-  assert.sameValue(inst.toLocaleString(), simdToLocaleString(type, inst));
-
-  var eval_value = eval(inst.toString());
-  var value = type.fn.check(inst);
-  for(var i = 0; i < type.lanes; i++) {
-    assert.sameValue(type.fn.extractLane(eval_value, i),
-        type.fn.extractLane(value, i));
-  }
-  // TODO: test valueOf?
-}
-
-simdTypes.forEach(function(type) {
-  testSimdFunction(type.name + ' operators', function() {
-    testOperators(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/replace_lane.js
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-abstract-replace-lane
-description: Tests SIMD ReplaceLane.
-includes: [simdUtilities.js]
----*/
-
-function testReplaceLane(type) {
-  assert.sameValue('function', typeof type.fn.replaceLane);
-  var a = createTestValue(type);
-  for (var v of type.interestingValues) {
-    var expected = simdConvert(type, v);
-    for (var i = 0; i < type.lanes; i++) {
-      var result = type.fn.replaceLane(a, i, v);
-      checkValue(type, result,
-                 function(index) {
-                   return index == i ? expected : type.fn.extractLane(a, index);
-                 });
-    }
-  }
-
-  function testIndexCheck(index, err) {
-    assert.throws(err, function() { type.fn.replaceLane(a, index, 0); });
-  }
-  testIndexCheck(type.lanes, RangeError);
-  testIndexCheck(13.37, TypeError);
-  testIndexCheck(undefined, TypeError);
-  testIndexCheck({}, TypeError);
-  testIndexCheck('yo', TypeError);
-  testIndexCheck(-1, RangeError);
-  testIndexCheck(128, RangeError);
-}
-
-simdTypes.forEach(function(type) {
-  testSimdFunction(type.name + ' replaceLane', function() {
-    testReplaceLane(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/round_trip.js
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: pending
-description: Test round trip.
-includes: [simdUtilities.js]
----*/
-
-testSimdFunction('Float32x4 Int32x4 round trip', function() {
-  // NaNs should stay unmodified across bit conversions
-  var m = SIMD.Int32x4(0xFFFFFFFF, 0xFFFF0000, 0x80000000, 0x0);
-  var m2 = SIMD.Int32x4.fromFloat32x4Bits(SIMD.Float32x4.fromInt32x4Bits(m));
-  equalInt32x4(m, m2);
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/saturate.js
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: saturate
-description: Tests saturate methods.
-includes: [simdUtilities.js]
----*/
-
-simdTypes.filter(isSmallIntType).forEach(function(type) {
-  function saturate(type, a) {
-    if (a < type.minVal) return type.minVal;
-    if (a > type.maxVal) return type.maxVal;
-    return a;
-  }
-  testSimdFunction(type.name + ' addSaturate', function() {
-    testBinaryOp(type, 'addSaturate', function(a, b) {
-      return saturate(type, a + b);
-    });
-  });
-  testSimdFunction(type.name + ' subSaturate', function() {
-    testBinaryOp(type, 'subSaturate', function(a, b) {
-      return saturate(type, a - b);
-    });
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/select.js
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-select
-description: Tests SIMD Select.
-includes: [simdUtilities.js]
----*/
-
-function testSelect(type) {
-  assert.sameValue('function', typeof type.fn.select);
-  // set a and b to values that are different for all numerical types.
-  var av = 1;
-  var bv = 2;
-  var a = type.fn.splat(av);
-  var b = type.fn.splat(bv);
-  // test all selectors with a single 'true' lane.
-  for (var i = 0; i < type.lanes; i++) {
-    var selector = type.boolType.fn();
-    selector = type.boolType.fn.replaceLane(selector, i, true);
-    var result = type.fn.select(selector, a, b);
-    checkValue(type, result, function(index) { return index == i ? av : bv; });
-  }
-}
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' select', function() {
-    testSelect(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/shell.js
+++ /dev/null
@@ -1,427 +0,0 @@
-// file: simdUtilities.js
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-function minNum(x, y) {
-  return x != x ? y :
-    y != y ? x :
-    Math.min(x, y);
-}
-
-function maxNum(x, y) {
-  return x != x ? y :
-    y != y ? x :
-    Math.max(x, y);
-}
-
-function sameValue(x, y) {
-  if (x == y)
-    return x != 0 || y != 0 || (1/x == 1/y);
-
-  return x != x && y != y;
-}
-
-function binaryMul(a, b) { return a * b; }
-var binaryImul;
-if (typeof Math.imul !== "undefined") {
-  binaryImul = Math.imul;
-} else {
-  binaryImul = function(a, b) {
-  var ah = (a >>> 16) & 0xffff;
-  var al = a & 0xffff;
-  var bh = (b >>> 16) & 0xffff;
-  var bl = b & 0xffff;
-  // the shift by 0 fixes the sign on the high part
-  // the final |0 converts the unsigned value into a signed value
-  return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0);
-  };
-}
-
-var _f32x4 = new Float32Array(4);
-var _f64x2 = new Float64Array(_f32x4.buffer);
-var _i32x4 = new Int32Array(_f32x4.buffer);
-var _i16x8 = new Int16Array(_f32x4.buffer);
-var _i8x16 = new Int8Array(_f32x4.buffer);
-var _ui32x4 = new Uint32Array(_f32x4.buffer);
-var _ui16x8 = new Uint16Array(_f32x4.buffer);
-var _ui8x16 = new Uint8Array(_f32x4.buffer);
-
-var float32x4 = {
-  name: "Float32x4",
-  fn: SIMD.Float32x4,
-  floatLane: true,
-  signed: true,
-  numerical: true,
-  lanes: 4,
-  laneSize: 4,
-  interestingValues: [0, -0, 1, -1, 0.9, -0.9, 1.414, 0x7F, -0x80, -0x8000,
-  -0x80000000, 0x7FFF, 0x7FFFFFFF, Infinity, -Infinity, NaN],
-  view: Float32Array,
-  buffer: _f32x4,
-  mulFn: binaryMul,
-}
-
-var int32x4 = {
-  name: "Int32x4",
-  fn: SIMD.Int32x4,
-  intLane: true,
-  signed: true,
-  numerical: true,
-  logical: true,
-  lanes: 4,
-  laneSize: 4,
-  minVal: -0x80000000,
-  maxVal: 0x7FFFFFFF,
-  interestingValues: [0, 1, -1, 0x40000000, 0x7FFFFFFF, -0x80000000],
-  view: Int32Array,
-  buffer: _i32x4,
-  mulFn: binaryImul,
-}
-
-var int16x8 = {
-  name: "Int16x8",
-  fn: SIMD.Int16x8,
-  intLane: true,
-  signed: true,
-  numerical: true,
-  logical: true,
-  lanes: 8,
-  laneSize: 2,
-  laneMask: 0xFFFF,
-  minVal: -0x8000,
-  maxVal: 0x7FFF,
-  interestingValues: [0, 1, -1, 0x4000, 0x7FFF, -0x8000],
-  view: Int16Array,
-  buffer: _i16x8,
-  mulFn: binaryMul,
-}
-
-var int8x16 = {
-  name: "Int8x16",
-  fn: SIMD.Int8x16,
-  intLane: true,
-  signed: true,
-  numerical: true,
-  logical: true,
-  lanes: 16,
-  laneSize: 1,
-  laneMask: 0xFF,
-  minVal: -0x80,
-  maxVal: 0x7F,
-  interestingValues: [0, 1, -1, 0x40, 0x7F, -0x80],
-  view: Int8Array,
-  buffer: _i8x16,
-  mulFn: binaryMul,
-}
-
-var uint32x4 = {
-  name: "Uint32x4",
-  fn: SIMD.Uint32x4,
-  intLane: true,
-  unsigned: true,
-  numerical: true,
-  logical: true,
-  lanes: 4,
-  laneSize: 4,
-  minVal: 0,
-  maxVal: 0xFFFFFFFF,
-  interestingValues: [0, 1, 0x40000000, 0x7FFFFFFF, 0xFFFFFFFF],
-  view: Uint32Array,
-  buffer: _ui32x4,
-  mulFn: binaryImul,
-}
-
-var uint16x8 = {
-  name: "Uint16x8",
-  fn: SIMD.Uint16x8,
-  intLane: true,
-  unsigned: true,
-  numerical: true,
-  logical: true,
-  lanes: 8,
-  laneSize: 2,
-  laneMask: 0xFFFF,
-  minVal: 0,
-  maxVal: 0xFFFF,
-  interestingValues: [0, 1, 0x4000, 0x7FFF, 0xFFFF],
-  view: Uint16Array,
-  buffer: _ui16x8,
-  mulFn: binaryMul,
-}
-
-var uint8x16 = {
-  name: "Uint8x16",
-  fn: SIMD.Uint8x16,
-  intLane: true,
-  unsigned: true,
-  numerical: true,
-  logical: true,
-  lanes: 16,
-  laneSize: 1,
-  laneMask: 0xFF,
-  minVal: 0,
-  maxVal: 0xFF,
-  interestingValues: [0, 1, 0x40, 0x7F, 0xFF],
-  view: Int8Array,
-  buffer: _ui8x16,
-  mulFn: binaryMul,
-}
-
-var bool32x4 = {
-  name: "Bool32x4",
-  fn: SIMD.Bool32x4,
-  boolLane: true,
-  logical: true,
-  lanes: 4,
-  laneSize: 4,
-  interestingValues: [true, false],
-}
-
-var bool16x8 = {
-  name: "Bool16x8",
-  fn: SIMD.Bool16x8,
-  boolLane: true,
-  logical: true,
-  lanes: 8,
-  laneSize: 2,
-  interestingValues: [true, false],
-}
-
-var bool8x16 = {
-  name: "Bool8x16",
-  fn: SIMD.Bool8x16,
-  boolLane: true,
-  logical: true,
-  lanes: 16,
-  laneSize: 1,
-  interestingValues: [true, false],
-}
-
-// Filter functions.
-function isFloatType(type) { return type.floatLane; }
-function isIntType(type) { return type.intLane; }
-function isBoolType(type) { return type.boolLane; }
-function isNumerical(type) { return type.numerical; }
-function isLogical(type) { return type.logical; }
-function isSigned(type) { return type.signed; }
-function isSignedIntType(type) { return type.intLane && type.signed; }
-function isUnsignedIntType(type) { return type.intLane && type.unsigned; }
-function isSmallIntType(type) { return type.intLane && type.lanes >= 8; }
-function isSmallUnsignedIntType(type) {
-  return type.intLane && type.unsigned && type.lanes >= 8;
-}
-function hasLoadStore123(type) { return !type.boolLane && type.lanes == 4; }
-
-// Each SIMD type has a corresponding Boolean SIMD type, which is returned by
-// relational ops.
-float32x4.boolType = int32x4.boolType = uint32x4.boolType = bool32x4;
-int16x8.boolType = uint16x8.boolType = bool16x8;
-int8x16.boolType = uint8x16.boolType = bool8x16;
-
-// SIMD fromTIMD types.
-float32x4.from = [int32x4, uint32x4];
-int32x4.from = [float32x4];
-int16x8.from = [];
-int8x16.from = [];
-uint32x4.from = [float32x4];
-uint16x8.from = [int16x8];
-uint8x16.from = [int8x16];
-
-// SIMD fromBits types.
-float32x4.fromBits = [int32x4, int16x8, int8x16, uint32x4, uint16x8, uint8x16];
-int32x4.fromBits = [float32x4, int16x8, int8x16, uint32x4, uint16x8, uint8x16];
-int16x8.fromBits = [float32x4, int32x4, int8x16, uint32x4, uint16x8, uint8x16];
-int8x16.fromBits = [float32x4, int32x4, int16x8, uint32x4, uint16x8, uint8x16];
-uint32x4.fromBits = [float32x4, int32x4, int16x8, int8x16, uint16x8, uint8x16];
-uint16x8.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, uint8x16];
-uint8x16.fromBits = [float32x4, int32x4, int16x8, int8x16, uint32x4, uint16x8];
-
-var simdTypes = [float32x4,
-  int32x4, int16x8, int8x16,
-  uint32x4, uint16x8, uint8x16,
-  bool32x4, bool16x8, bool8x16];
-
-if (typeof simdPhase2 !== "undefined") {
-  var float64x2 = {
-    name: "Float64x2",
-    fn: SIMD.Float64x2,
-    floatLane: true,
-    signed: true,
-    numerical: true,
-    lanes: 2,
-    laneSize: 8,
-    interestingValues: [0, -0, 1, -1, 1.414, 0x7F, -0x80, -0x8000, -0x80000000,
-    0x7FFF, 0x7FFFFFFF, Infinity, -Infinity, NaN],
-    view: Float64Array,
-    buffer: _f64x2,
-    mulFn: binaryMul,
-  };
-
-  var bool64x2 = {
-    name: "Bool64x2",
-    fn: SIMD.Bool64x2,
-    boolLane: true,
-    lanes: 2,
-    laneSize: 8,
-    interestingValues: [true, false],
-  };
-
-  float64x2.boolType = bool64x2;
-
-  float32x4.fromBits.push(float64x2);
-  int32x4.fromBits.push(float64x2);
-  int16x8.fromBits.push(float64x2);
-  int8x16.fromBits.push(float64x2);
-  uint32x4.fromBits.push(float64x2);
-  uint16x8.fromBits.push(float64x2);
-  uint8x16.fromBits.push(float64x2);
-
-  float64x2.fromBits = [float32x4, int32x4, int16x8, int8x16,
-  uint32x4, uint16x8, uint8x16];
-
-  int32x4.fromBits = [float32x4, int16x8, int8x16, uint32x4,
-  uint16x8, uint8x16];
-  int16x8.fromBits = [float32x4, int32x4, int8x16, uint32x4,
-  uint16x8, uint8x16];
-  int8x16.fromBits = [float32x4, int32x4, int16x8, uint32x4,
-  uint16x8, uint8x16];
-  uint32x4.fromBits = [float32x4, int32x4, int16x8, int8x16,
-  uint16x8, uint8x16];
-  uint16x8.fromBits = [float32x4, int32x4, int16x8, int8x16,
-  uint32x4, uint8x16];
-  uint8x16.fromBits = [float32x4, int32x4, int16x8, int8x16,
-  uint32x4, uint16x8];
-
-  simdTypes.push(float64x2);
-  simdTypes.push(bool64x2);
-}
-
-// SIMD utility functions.
-
-// Create a value for testing, with vanilla lane values, i.e. [0, 1, 2, ..]
-// for numeric types, [false, true, true, ..] for boolean types. These test
-// values shouldn't contain NaNs or other "interesting" values.
-function createTestValue(type) {
-  var lanes = [];
-  for (var i = 0; i < type.lanes; i++)
-    lanes.push(i);
-  return type.fn.apply(type.fn, lanes);
-}
-
-function createSplatValue(type, v) {
-  var lanes = [];
-  for (var i = 0; i < type.lanes; i++)
-    lanes.push(v);
-  return type.fn.apply(type.fn, lanes);
-}
-
-// SIMD reference functions.
-
-// Returns converted array buffer value of specified type.
-function simdConvert(type, value) {
-  if (type.buffer === undefined) return !!value;  // bool types
-  type.buffer[0] = value;
-  return type.buffer[0];
-}
-
-function checkValue(type, a, expect) {
-  var fail = false;
-  for (var i = 0; i < type.lanes; i++) {
-    var v = type.fn.extractLane(a, i);
-    var ev = simdConvert(type, expect(i));
-    if (!sameValue(ev, v) && Math.abs(ev - v) >= 0.00001)
-      fail = true;
-  }
-  if (fail) {
-  var lanes = [];
-  for (var i = 0; i < type.lanes; i++){
-    lanes.push(simdConvert(type, expect(i)));
-  }
-  $ERROR("expected SIMD." + type.name + "(" + lanes +
-    ") but found " + a.toString());
-  }
-}
-
-// SIMD reference functions.
-
-// Reference implementation of toLocaleString.
-function simdToLocaleString(type, value) {
-  value = type.fn.check(value);
-  var str = "SIMD." + type.name + "(";
-  str += type.fn.extractLane(value, 0).toLocaleString();
-  for (var i = 1; i < type.lanes; i++) {
-    str += "," + type.fn.extractLane(value, i).toLocaleString();
-  }
-  return str + ")";
-}
-
-function equalInt32x4(a, b) {
-  assert.sameValue(SIMD.Int32x4.extractLane(a, 0),
-    SIMD.Int32x4.extractLane(b, 0));
-  assert.sameValue(SIMD.Int32x4.extractLane(a, 1),
-    SIMD.Int32x4.extractLane(b, 1));
-  assert.sameValue(SIMD.Int32x4.extractLane(a, 2),
-    SIMD.Int32x4.extractLane(b, 2));
-  assert.sameValue(SIMD.Int32x4.extractLane(a, 3),
-    SIMD.Int32x4.extractLane(b, 3));
-}
-
-// Compare unary op's behavior to ref op at each lane.
-function testUnaryOp(type, op, refOp) {
-  assert.sameValue("function", typeof type.fn[op]);
-  for (var v of type.interestingValues) {
-    var expected = simdConvert(type, refOp(v));
-    var a = type.fn.splat(v);
-    var result = type.fn[op](a);
-    checkValue(type, result, function(index) { return expected; });
-  }
-}
-
-// Compare binary op's behavior to ref op at each lane with the Cartesian
-// product of the given values.
-function testBinaryOp(type, op, refOp) {
-  assert.sameValue("function", typeof type.fn[op]);
-  var zero = type.fn();
-  for (var av of type.interestingValues) {
-    for (var bv of type.interestingValues) {
-      var expected = simdConvert(type, refOp(simdConvert(type, av),
-        simdConvert(type, bv)));
-      var a = type.fn.splat(av);
-      var b = type.fn.splat(bv);
-      var result = type.fn[op](a, b);
-      checkValue(type, result, function(index) { return expected; });
-    }
-  }
-}
-
-// Compare relational op's behavior to ref op at each lane with the Cartesian
-// product of the given values.
-function testRelationalOp(type, op, refOp) {
-  assert.sameValue("function", typeof type.fn[op]);
-  var zero = type.fn();
-  for (var av of type.interestingValues) {
-    for (var bv of type.interestingValues) {
-      var expected = refOp(simdConvert(type, av), simdConvert(type, bv));
-      var a = type.fn.splat(av);
-      var b = type.fn.splat(bv);
-      var result = type.fn[op](a, b);
-      checkValue(type.boolType, result, function(index) { return expected; });
-    }
-  }
-}
-
-// Test utilities.
-var currentName = "<global>";
-var skipValueTests = false;
-
-function testSimdFunction(name, func) {
-  currentName = name;
-  if (typeof skipValueTests !== "undefined" && skipValueTests &&
-    name.indexOf("value semantics") != -1) return;
-  try {
-    func();
-  } catch (e) {
-    e.message += " (Testing with " + name + ".)";
-    throw e;
-  }
-}
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/shift_operator.js
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: constructor-properties
-description: Test Shift operations.
-includes: [simdUtilities.js]
----*/
-
-// Compare shift op's behavior to ref op at each lane.
-function testShiftOp(type, op, refOp) {
-  assert.sameValue('function', typeof type.fn[op]);
-  var zero = type.fn();
-  for (var v of type.interestingValues) {
-    var s = type.laneSize * 8;
-    for (var bits of [-1, 0, 1, 2, s - 1, s, s + 1]) {
-      var expected = simdConvert(type, refOp(simdConvert(type, v), bits));
-      var a = type.fn.splat(v);
-      var result = type.fn[op](a, bits);
-      checkValue(type, result, function(index) { return expected; });
-    }
-  }
-}
-
-simdTypes.filter(isIntType).forEach(function(type) {
-  testSimdFunction(type.name + ' shiftLeftByScalar', function() {
-    function shift(a, bits) {
-      bits &= type.laneSize * 8 - 1;
-      return a << bits;
-    }
-    testShiftOp(type, 'shiftLeftByScalar', shift);
-  });
-});
-
-simdTypes.filter(isSignedIntType).forEach(function(type) {
-  testSimdFunction(type.name + ' shiftRightByScalar', function() {
-    function shift(a, bits) {
-      bits &= type.laneSize * 8 - 1;
-      return a >> bits;
-    }
-    testShiftOp(type, 'shiftRightByScalar', shift);
-  });
-});
-
-simdTypes.filter(isUnsignedIntType).forEach(function(type) {
-  testSimdFunction(type.name + ' shiftRightByScalar', function() {
-    function shift(a, bits) {
-      bits &= type.laneSize * 8 - 1;
-      if (type.laneMask)
-        a &= type.laneMask;
-      return a >>> bits;
-    }
-    testShiftOp(type, 'shiftRightByScalar', shift);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/shuffle.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: shuffle
-description: Tests SIMD shuffle.
-includes: [simdUtilities.js]
----*/
-
-function testShuffle(type) {
-  assert.sameValue('function', typeof type.fn.shuffle);
-  var indices = [];
-  for (var i = 0; i < type.lanes; i++) indices.push(i);
-
-  var a = type.fn.apply(type.fn, indices);            // 0, 1, 2, 3, 4 ...
-  var b = type.fn.add(a, type.fn.splat(type.lanes));  // lanes, lanes+1 ...
-  // All lanes from a.
-  var result = type.fn.shuffle.apply(type.fn, [a, b].concat(indices));
-  checkValue(type, result, function(index) {
-    return type.fn.extractLane(a, index);
-  });
-  // One lane from b.
-  for (var i = 0; i < type.lanes; i++) {
-    var args = [a, b].concat(indices);
-    args[2 + i] += type.lanes;
-    var result = type.fn.shuffle.apply(type.fn, args);
-    checkValue(type, result, function(index) {
-      var val = index == i ? b : a;
-      return type.fn.extractLane(val, index);
-    });
-  }
-  // All lanes from b.
-  for (var i = 0; i < type.lanes; i++) indices[i] += type.lanes;
-  var result = type.fn.shuffle.apply(type.fn, [a, b].concat(indices));
-  checkValue(type, result, function(index) {
-    return type.fn.extractLane(b, index);
-  });
-
-  function testIndexCheck(index, err) {
-    for (var i = 0; i < type.lanes; i++) {
-      var args = [a, b].concat(indices);
-      args[i + 2] = index;
-      assert.throws(err, function() { type.fn.shuffle.apply(type.fn, args); });
-    }
-  }
-  testIndexCheck(2 * type.lanes, RangeError);
-  testIndexCheck(13.37, TypeError);
-  testIndexCheck(undefined, TypeError);
-  testIndexCheck({}, TypeError);
-  testIndexCheck('yo', TypeError);
-  testIndexCheck(-1, RangeError);
-  testIndexCheck(128, RangeError);
-}
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' shuffle', function() {
-    testShuffle(type);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/storen.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: simd-store-in-tarray
-description: Tests Simdstore functions.
-includes: [simdUtilities.js]
----*/
-
-function testStore(type, name, count) {
-  var storeFn = type.fn[name];
-  assert.sameValue('function', typeof storeFn);
-  var bufLanes = 2 * type.lanes;  // Test all alignments.
-  var bufSize = bufLanes * type.laneSize + 8;  // Extra for over-alignment test.
-  var ab = new ArrayBuffer(bufSize);
-  var buf = new type.view(ab);
-  var a = createTestValue(type); // Value containing 0, 1, 2, 3 ...
-  function checkBuffer(offset) {
-    for (var i = 0; i < count; i++)
-      if (buf[offset + i] != i) return false;
-    return true;
-  }
-  // Test aligned stores.
-  for (var i = 0; i < type.lanes; i++) {
-    assert.sameValue(storeFn(buf, i, a), a);
-    assert(checkBuffer(i));
-  }
-  // Test the 2 over-alignments.
-  var f64 = new Float64Array(ab);
-  var stride = 8 / type.laneSize;
-  for (var i = 0; i < 1; i++) {
-    assert.sameValue(storeFn(f64, i, a), a);
-    assert(checkBuffer(stride * i));
-  }
-  // Test the 7 mis-alignments.
-  var i8 = new Int8Array(ab);
-  for (var misalignment = 1; misalignment < 8; misalignment++) {
-    assert.sameValue(storeFn(i8, misalignment, a), a);
-    // Shift the buffer down by misalignment.
-    for (var i = 0; i < i8.length - misalignment; i++)
-      i8[i] = i8[i + misalignment];
-    assert(checkBuffer(0));
-  }
-
-  //Test index coercions
-  storeFn(buf, "0", a);
-  assert(checkBuffer(0));
-  storeFn(buf, "01", a);
-  assert(checkBuffer(1));
-  storeFn(buf, " -0.0 ", a);
-  assert(checkBuffer(0));
-  storeFn(buf, " +1e0", a);
-  assert(checkBuffer(1));
-  storeFn(buf, false, a);
-  assert(checkBuffer(0));
-  storeFn(buf, true, a);
-  assert(checkBuffer(1));
-  storeFn(buf, null, a);
-  assert(checkBuffer(0));
-
-  function testIndexCheck(buf, index, err) {
-    assert.throws(err, function () { storeFn(buf, index, type.fn()); });
-  }
-  testIndexCheck(buf, -1, RangeError);
-  testIndexCheck(buf, bufSize / type.laneSize - count + 1, RangeError);
-  testIndexCheck(buf.buffer, 1, TypeError);
-  testIndexCheck(buf, "a", RangeError);
-}
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' store', function() {
-    testStore(type, 'store', type.lanes);
-  });
-});
-
-simdTypes.filter(hasLoadStore123).forEach(function(type) {
-  testSimdFunction(type.name + ' store1', function() {
-    testStore(type, 'store1', 1);
-  });
-  testSimdFunction(type.name + ' store1', function() {
-    testStore(type, 'store2', 2);
-  });
-  testSimdFunction(type.name + ' store3', function() {
-    testStore(type, 'store3', 3);
-  });
-});
-
-reportCompare(0, 0);
deleted file mode 100644
--- a/js/src/tests/test262/built-ins/Simd/swizzle.js
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2016 ecmascript_simd authors. All rights reserved.
-// This code is governed by the BSD license found in the LICENSE file.
-
-/*---
-esid: swizzle
-description: Tests Simd swizzle.
-includes: [simdUtilities.js]
----*/
-
-function testSwizzle(type) {
-  assert.sameValue('function', typeof type.fn.swizzle);
-  var a = createTestValue(type);  // 0, 1, 2, 3, 4, 5, 6, ...
-  var indices = [];
-  // Identity swizzle.
-  for (var i = 0; i < type.lanes; i++) indices.push(i);
-  var result = type.fn.swizzle.apply(type.fn, [a].concat(indices));
-  checkValue(type, result, function(index) {
-    return type.fn.extractLane(a, index);
-  });
-  // Reverse swizzle.
-  indices.reverse();
-  var result = type.fn.swizzle.apply(type.fn, [a].concat(indices));
-  checkValue(type, result, function(index) {
-    return type.fn.extractLane(a, type.lanes - index - 1);
-  });
-
-  function testIndexCheck(index, err) {
-    for (var i = 0; i < type.lanes; i++) {
-      var args = [a].concat(indices);
-      args[i + 1] = index;
-      assert.throws(err, function() { type.fn.swizzle.apply(type.fn, args); });
-    }
-  }
-  // RangeError
-  testIndexCheck(type.lanes, RangeError);
-  testIndexCheck(-1, RangeError);
-  testIndexCheck(128, RangeError);
-  testIndexCheck(13.37, TypeError);
-  testIndexCheck(undefined, TypeError);
-  testIndexCheck({}, TypeError);
-  testIndexCheck('yo', TypeError);
-}
-
-simdTypes.filter(isNumerical).forEach(function(type) {
-  testSimdFunction(type.name + ' swizzle', function() {
-    testSwizzle(type);
-  });
-});
-
-reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/6.2.2_b.js
+++ b/js/src/tests/test262/intl402/6.2.2_b.js
@@ -20,25 +20,17 @@ var invalidLanguageTags = [
     "enochian_enochian",
     "de-gregory_u-ca-gregory",
     "de-tester-Tester",  // Case-insensitive duplicate variant subtag
     "de-DE-u-kn-true-U-kn-true",  // Case-insensitive duplicate singleton subtag
 ];
 
 testWithIntlConstructors(function (Constructor) {
     invalidLanguageTags.forEach(function (tag) {
-        var error;
-        try {
-            // this must throw an exception for an invalid language tag
+        // this must throw an exception for an invalid language tag
+        assert.throws(RangeError, function() {
             var obj = new Constructor([tag]);
-        } catch (e) {
-            error = e;
-        }
-        if (error === undefined) {
-            $ERROR("Invalid language tag " + tag + " was not rejected.");
-        } else if (error.name !== "RangeError") {
-            $ERROR("Invalid language tag " + tag + " was rejected with wrong error " + error.name + ".");
-        }
+        }, "Invalid language tag " + tag + " was not rejected.");
     });
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/6.2.2_c.js
+++ b/js/src/tests/test262/intl402/6.2.2_c.js
@@ -26,25 +26,17 @@ var invalidLanguageTags = [
     "de-*", // language range
     "中文", // non-ASCII letters
     "en-ß", // non-ASCII letters
     "ıd" // non-ASCII letters
 ];
 
 testWithIntlConstructors(function (Constructor) {
     invalidLanguageTags.forEach(function (tag) {
-        var error;
-        try {
-            // this must throw an exception for an invalid language tag
+        // this must throw an exception for an invalid language tag
+        assert.throws(RangeError, function() {
             var obj = new Constructor([tag]);
-        } catch (e) {
-            error = e;
-        }
-        if (error === undefined) {
-            $ERROR("Invalid language tag " + tag + " was not rejected.");
-        } else if (error.name !== "RangeError") {
-            $ERROR("Invalid language tag " + tag + " was rejected with wrong error " + error.name + ".");
-        }
+        }, "Invalid language tag " + tag + " was not rejected.");
     });
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/6.2.3.js
+++ b/js/src/tests/test262/intl402/6.2.3.js
@@ -30,40 +30,32 @@ var canonicalizedTags = {
     "sgn-ils": ["ils"],
     "in": ["id"],
     "x-foo": ["x-foo"]
 };
 
 // make sure the data above is correct
 Object.getOwnPropertyNames(canonicalizedTags).forEach(function (tag) {
     canonicalizedTags[tag].forEach(function (canonicalTag) {
-        if (!isCanonicalizedStructurallyValidLanguageTag(canonicalTag)) {
-            $ERROR("Test data \"" + canonicalTag + "\" is not canonicalized and structurally valid language tag.");
-        }
+        assert(isCanonicalizedStructurallyValidLanguageTag(canonicalTag), "Test data \"" + canonicalTag + "\" is not canonicalized and structurally valid language tag.");
     });
 });
 
 // now the actual test
 testWithIntlConstructors(function (Constructor) {
     var defaultLocale = new Constructor().resolvedOptions().locale;
     Object.getOwnPropertyNames(canonicalizedTags).forEach(function (tag) {
         // use lookup locale matcher to keep the set of possible return values predictable
 
         // Variant 1: construct an object and see whether its locale is canonicalized.
         // In this variant, shortened forms or the default locale may be returned
         var object = new Constructor([tag], {localeMatcher: "lookup"});
         var locale = object.resolvedOptions().locale;
-        if (canonicalizedTags[tag].indexOf(locale) === -1 && locale !== defaultLocale) {
-            $ERROR("For " + tag + " got " + locale + "; expected one of " +
-                canonicalizedTags[tag].join(", ") + ".");
-        }
+        assert(canonicalizedTags[tag].indexOf(locale) !== -1 || locale === defaultLocale, "For " + tag + " got " + locale + "; expected one of " + canonicalizedTags[tag].join(", ") + ".");
         
         // Variant 2: get the supported locales. If the tag is supported, it should be returned canonicalized but unshortened
         var supported = Constructor.supportedLocalesOf([tag]);
-        if (supported.length > 0 && supported[0] !== canonicalizedTags[tag][0]) {
-            $ERROR("For " + tag + " got " + supported[0] + "; expected " +
-                canonicalizedTags[tag][0] + ".");
-        }            
+        assert(supported.length === 0 || supported[0] === canonicalizedTags[tag][0], "For " + tag + " got " + supported[0] + "; expected " + canonicalizedTags[tag][0] + ".");
     });
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/6.2.4.js
+++ b/js/src/tests/test262/intl402/6.2.4.js
@@ -7,15 +7,13 @@ description: >
     Tests that the default locale is a String value representing the
     structurally valid and canonicalized BCP 47 language tag.
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 testWithIntlConstructors(function (Constructor) {
     var defaultLocale = new Constructor().resolvedOptions().locale;
-    if (!isCanonicalizedStructurallyValidLanguageTag(defaultLocale)) {
-        $ERROR("Default locale \"" + defaultLocale + "\" is not canonicalized and structurally valid language tag.");
-    }
+    assert(isCanonicalizedStructurallyValidLanguageTag(defaultLocale), "Default locale \"" + defaultLocale + "\" is not canonicalized and structurally valid language tag.");
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.1_a.js
+++ b/js/src/tests/test262/intl402/9.1_a.js
@@ -6,14 +6,12 @@ es5id: 9.1_a
 description: Tests that default locale is available.
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 testWithIntlConstructors(function (Constructor) {
     var defaultLocale = new Constructor().resolvedOptions().locale;
     var supportedLocales = Constructor.supportedLocalesOf([defaultLocale]);
-    if (supportedLocales.indexOf(defaultLocale) === -1) {
-        $ERROR("Default locale is not reported as available.");
-    }
+    assert.notSameValue(supportedLocales.indexOf(defaultLocale), -1, "Default locale is not reported as available.");
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.1_b.js
+++ b/js/src/tests/test262/intl402/9.1_b.js
@@ -12,23 +12,19 @@ includes: [testIntl.js]
 
 testWithIntlConstructors(function (Constructor) {
     var info = getLocaleSupportInfo(Constructor);
     var fallback;
     info.supported.forEach(function (locale) {
         var pos = locale.lastIndexOf("-");
         if (pos !== -1) {
             fallback = locale.substring(0, pos);
-            if (info.supported.indexOf(fallback) === -1) {
-                $ERROR("Locale " + locale + " is supported, but fallback " + fallback + " isn't.");
-            }
+            assert.notSameValue(info.supported.indexOf(fallback), -1, "Locale " + locale + " is supported, but fallback " + fallback + " isn't.");
         }
         var match = /([a-z]{2,3})(-[A-Z][a-z]{3})(-[A-Z]{2})/.exec(locale);
         if (match !== null) {
             fallback = match[1] + match[3];
-            if (info.supported.indexOf(fallback) === -1) {
-                $ERROR("Locale " + locale + " is supported, but fallback " + fallback + " isn't.");
-            }
+            assert.notSameValue(info.supported.indexOf(fallback), -1, "Locale " + locale + " is supported, but fallback " + fallback + " isn't.");
         }
     });
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_1.js
+++ b/js/src/tests/test262/intl402/9.2.1_1.js
@@ -8,19 +8,15 @@ description: >
     empty lists the same.
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 testWithIntlConstructors(function (Constructor) {
     var supportedForUndefined = Constructor.supportedLocalesOf(undefined);
     var supportedForEmptyList = Constructor.supportedLocalesOf([]);
-    if (supportedForUndefined.length !== supportedForEmptyList.length) {
-        $ERROR("Supported locales differ between undefined and empty list input.");
-    }
+    assert.sameValue(supportedForUndefined.length, supportedForEmptyList.length, "Supported locales differ between undefined and empty list input.");
     // we don't compare the elements because length should be 0 - let's just verify that
-    if (supportedForUndefined.length !== 0) {
-        $ERROR("Internal test error: Assumption about length being 0 is invalid.");
-    }
+    assert.sameValue(supportedForUndefined.length, 0, "Internal test error: Assumption about length being 0 is invalid.");
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_2.js
+++ b/js/src/tests/test262/intl402/9.2.1_2.js
@@ -10,14 +10,12 @@ author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 taintArray();
 
 testWithIntlConstructors(function (Constructor) {
     var defaultLocale = new Constructor().resolvedOptions().locale;
     var canonicalized = Constructor.supportedLocalesOf([defaultLocale, defaultLocale]);
-    if (canonicalized.length > 1) {
-        $ERROR("Canonicalization didn't remove duplicate language tags from locale list.");
-    }
+    assert.sameValue(canonicalized.length > 1, false, "Canonicalization didn't remove duplicate language tags from locale list.");
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_3.js
+++ b/js/src/tests/test262/intl402/9.2.1_3.js
@@ -56,33 +56,20 @@ testWithIntlConstructors(function (Const
         }
         try {
             obj2 = new Constructor([locale]);
             locale2 = obj2.resolvedOptions().locale;
         } catch (e) {
             error2 = e;
         }
 
-        if ((error1 === undefined) !== (error2 === undefined)) {
-            if (error1 === undefined) {
-                $ERROR("Single locale string " + locale +
-                    " was accepted, but locale list containing that string wasn't.");
-            } else {
-                $ERROR("Single locale string " + locale +
-                    " was rejected, but locale list containing that string wasn't.");
-            }
-        } else if (error1 === undefined) {
-             if (locale1 !== locale2) {
-                $ERROR("Single locale string " + locale + " results in " + locale1 +
-                    ", but locale list [" + locale + "] results in " + locale2 + ".");
-             }
+        assert.sameValue((error1 === undefined), (error2 === undefined), "Single locale string " + locale + " was " + (error1 === undefined ? "accepted" : "rejected") + ", but locale list containing that string wasn't.");
+        if (error1 === undefined) {
+            assert.sameValue(locale1, locale2, "Single locale string " + locale + " results in " + locale1 + ", but locale list [" + locale + "] results in " + locale2 + ".");
         } else {
-            if (error1.name !== error2.name) {
-                $ERROR("Single locale string " + locale + " results in error " + error1.name +
-                    ", but locale list [" + locale + "] results in error " + error2.name + ".");
-             }
+            assert.sameValue(error1.name, error2.name, "Single locale string " + locale + " results in error " + error1.name + ", but locale list [" + locale + "] results in error " + error2.name + ".");
         }
     });
     
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_4.js
+++ b/js/src/tests/test262/intl402/9.2.1_4.js
@@ -9,41 +9,27 @@ description: >
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 testWithIntlConstructors(function (Constructor) {
     // undefined is handled separately
     
     // null should result in a TypeError
-    var error;
-    try {
+    assert.throws(TypeError, function() {
         var supportedForNull = Constructor.supportedLocalesOf(null);
-    } catch (e) {
-        error = e;
-    }
-    if (error === undefined) {
-        $ERROR("Null as locale list was not rejected.");
-    } else if (error.name !== "TypeError") {
-        $ERROR("Null as locale list was rejected with wrong error " + error.name + ".");
-    }    
+    }, "Null as locale list was not rejected.");
     
     // let's use an empty list for comparison
     var supportedForEmptyList = Constructor.supportedLocalesOf([]);
     // we don't compare the elements because length should be 0 - let's just verify that
-    if (supportedForEmptyList.length !== 0) {
-        $ERROR("Internal test error: Assumption about length being 0 is invalid.");
-    }
+    assert.sameValue(supportedForEmptyList.length, 0, "Internal test error: Assumption about length being 0 is invalid.");
 
     // most non-objects will be interpreted as empty lists because a missing length property is interpreted as 0
     var supportedForNumber = Constructor.supportedLocalesOf(5);
-    if (supportedForNumber.length !== supportedForEmptyList.length) {
-        $ERROR("Supported locales differ between numeric and empty list input.");
-    }
+    assert.sameValue(supportedForNumber.length, supportedForEmptyList.length, "Supported locales differ between numeric and empty list input.");
     var supportedForBoolean = Constructor.supportedLocalesOf(true);
-    if (supportedForBoolean.length !== supportedForEmptyList.length) {
-        $ERROR("Supported locales differ between boolean and empty list input.");
-    }
+    assert.sameValue(supportedForBoolean.length, supportedForEmptyList.length, "Supported locales differ between boolean and empty list input.");
     
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_8_c_ii.js
+++ b/js/src/tests/test262/intl402/9.2.1_8_c_ii.js
@@ -7,25 +7,17 @@ description: Tests that values other tha
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 var notStringOrObject = [undefined, null, true, false, 0, 5, -5, NaN];
 
 testWithIntlConstructors(function (Constructor) {
     notStringOrObject.forEach(function (value) {
-        var error;
-        try {
+        assert.throws(TypeError, function() {
             var supported = Constructor.supportedLocalesOf([value]);
-        } catch (e) {
-            error = e;
-        }
-        if (error === undefined) {
-            $ERROR("" + value + " as locale was not rejected.");
-        } else if (error.name !== "TypeError") {
-            $ERROR("" + value + " as locale was rejected with wrong error " + error.name + ".");
-        }
+        }, "" + value + " as locale was not rejected.");
     });
     
     return true;
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.1_8_c_vi.js
+++ b/js/src/tests/test262/intl402/9.2.1_8_c_vi.js
@@ -8,14 +8,12 @@ description: >
     language tags.
 author: Norbert Lindenberg
 includes: [testIntl.js]
 ---*/
 
 testWithIntlConstructors(function (Constructor) {
     var defaultLocale = new Constructor().resolvedOptions().locale;
     var canonicalized = Constructor.supportedLocalesOf([defaultLocale, defaultLocale]);
-    if (canonicalized.length > 1) {
-        $ERROR("Canonicalization didn't remove duplicate language tags from locale list.");
-    }
+    assert.sameValue(canonicalized.length > 1, false, "Canonicalization didn't remove duplicate language tags from locale list.");
 });
 
 reportCompare(0, 0);
--- a/js/src/tests/test262/intl402/9.2.2.js
+++ b/js/src/tests/test262/intl402/9.2.2.js
@@ -18,30 +18,22 @@ testWithIntlConstructors(function (Const
         var supported = Constructor.supportedLocalesOf(supportedByConstructor,
             {localeMatcher: matcher});
         // we could check the length first, but it's probably more interesting which locales are missing