Merge mozilla-central to inbound. a=merge CLOSED TREE
authorMargareta Eliza Balazs <ebalazs@mozilla.com>
Tue, 23 Oct 2018 12:33:44 +0300
changeset 490851 141e6f82a895f2f044ae87df08f7b9d69f59564c
parent 490754 ff4c77d7c5ea2cb88d321f44bd9d80ac5c3ab08a (current diff)
parent 490850 6e96c7ec0d1187c1b488dd4ba645df9cfd68ec16 (diff)
child 490852 6383d580c71308d8bc43e61f692a3cbafda54069
push id247
push userfmarier@mozilla.com
push dateSat, 27 Oct 2018 01:06:44 +0000
reviewersmerge
milestone65.0a1
Merge mozilla-central to inbound. a=merge CLOSED TREE
browser/components/customizableui/test/browser_887438_currentset_shim.js
browser/components/customizableui/test/browser_888817_currentset_updating.js
devtools/client/debugger/content/actions/breakpoints.js
devtools/client/debugger/content/actions/event-listeners.js
devtools/client/debugger/content/actions/moz.build
devtools/client/debugger/content/actions/sources.js
devtools/client/debugger/content/constants.js
devtools/client/debugger/content/globalActions.js
devtools/client/debugger/content/moz.build
devtools/client/debugger/content/queries.js
devtools/client/debugger/content/reducers/async-requests.js
devtools/client/debugger/content/reducers/breakpoints.js
devtools/client/debugger/content/reducers/event-listeners.js
devtools/client/debugger/content/reducers/index.js
devtools/client/debugger/content/reducers/moz.build
devtools/client/debugger/content/reducers/sources.js
devtools/client/debugger/content/tooltip/Tooltip.js
devtools/client/debugger/content/tooltip/VariableContentHelper.js
devtools/client/debugger/content/tooltip/moz.build
devtools/client/debugger/content/tooltip/tooltips-old.css
devtools/client/debugger/content/utils.js
devtools/client/debugger/content/views/event-listeners-view.js
devtools/client/debugger/content/views/moz.build
devtools/client/debugger/content/views/sources-view.js
devtools/client/debugger/debugger-controller.js
devtools/client/debugger/debugger-view.js
devtools/client/debugger/debugger.css
devtools/client/debugger/index.xul
devtools/client/debugger/panel.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon3/lib/main.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon3/package.json
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/bootstrap.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/chrome.manifest
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/install.rdf
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/test.jsm
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/test.xul
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/test2.jsm
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/test2.xul
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/testxul.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon4/testxul2.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/bootstrap.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/chrome.manifest
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/install.rdf
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/test.jsm
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/test.xul
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/test2.jsm
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/test2.xul
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/testxul.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon5/testxul2.js
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon_webext_contentscript/manifest.json
devtools/client/debugger/test/mochitest/addon-source/browser_dbg_addon_webext_contentscript/webext-content-script.js
devtools/client/debugger/test/mochitest/addon-webext-contentscript.xpi
devtools/client/debugger/test/mochitest/addon5.xpi
devtools/client/debugger/test/mochitest/browser2.ini
devtools/client/debugger/test/mochitest/browser_dbg_aaa_run_first_leaktest.js
devtools/client/debugger/test/mochitest/browser_dbg_addon-modules-unpacked.js
devtools/client/debugger/test/mochitest/browser_dbg_addon-modules.js
devtools/client/debugger/test/mochitest/browser_dbg_bfcache.js
devtools/client/debugger/test/mochitest/browser_dbg_break-in-anon.js
devtools/client/debugger/test/mochitest/browser_dbg_break-on-next-console.js
devtools/client/debugger/test/mochitest/browser_dbg_break-on-next.js
devtools/client/debugger/test/mochitest/browser_dbg_break-unselected.js
devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-editor.js
devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-eval.js
devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-new-script.js
devtools/client/debugger/test/mochitest/browser_dbg_breakpoints-other-tabs.js
devtools/client/debugger/test/mochitest/browser_dbg_bug-896139.js
devtools/client/debugger/test/mochitest/browser_dbg_clean-exit.js
devtools/client/debugger/test/mochitest/browser_dbg_closure-inspection.js
devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-01.js
devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js
devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-03.js
devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-04.js
devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-05.js
devtools/client/debugger/test/mochitest/browser_dbg_console-eval.js
devtools/client/debugger/test/mochitest/browser_dbg_console-named-eval.js
devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-01.js
devtools/client/debugger/test/mochitest/browser_dbg_controller-evaluate-02.js
devtools/client/debugger/test/mochitest/browser_dbg_file-reload.js
devtools/client/debugger/test/mochitest/browser_dbg_host-layout.js
devtools/client/debugger/test/mochitest/browser_dbg_iframes.js
devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js
devtools/client/debugger/test/mochitest/browser_dbg_jump-to-function-definition.js
devtools/client/debugger/test/mochitest/browser_dbg_on-pause-raise.js
devtools/client/debugger/test/mochitest/browser_dbg_optimized-out-vars.js
devtools/client/debugger/test/mochitest/browser_dbg_pause-resume.js
devtools/client/debugger/test/mochitest/browser_dbg_pause-warning.js
devtools/client/debugger/test/mochitest/browser_dbg_paused-keybindings.js
devtools/client/debugger/test/mochitest/browser_dbg_post-page.js
devtools/client/debugger/test/mochitest/browser_dbg_progress-listener-bug.js
devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-01.js
devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-02.js
devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-03.js
devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-04.js
devtools/client/debugger/test/mochitest/browser_dbg_server-conditional-bp-05.js
devtools/client/debugger/test/mochitest/browser_dbg_sources-bookmarklet.js
devtools/client/debugger/test/mochitest/browser_dbg_sources-cache.js
devtools/client/debugger/test/mochitest/browser_dbg_sources-iframe-reload.js
devtools/client/debugger/test/mochitest/browser_dbg_split-console-keypress.js
devtools/client/debugger/test/mochitest/browser_dbg_split-console-paused-reload.js
devtools/client/debugger/test/mochitest/browser_dbg_worker-source-map.js
devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker1.js
devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker2.js
devtools/client/debugger/test/mochitest/code_binary_search.coffee
devtools/client/debugger/test/mochitest/code_binary_search.js
devtools/client/debugger/test/mochitest/code_binary_search.map
devtools/client/debugger/test/mochitest/code_breakpoints-break-on-last-line-of-script-on-reload.js
devtools/client/debugger/test/mochitest/code_breakpoints-other-tabs.js
devtools/client/debugger/test/mochitest/code_bug-896139.js
devtools/client/debugger/test/mochitest/code_frame-script.js
devtools/client/debugger/test/mochitest/code_function-jump-01.js
devtools/client/debugger/test/mochitest/code_function-search-01.js
devtools/client/debugger/test/mochitest/code_function-search-02.js
devtools/client/debugger/test/mochitest/code_function-search-03.js
devtools/client/debugger/test/mochitest/code_location-changes.js
devtools/client/debugger/test/mochitest/code_math.js
devtools/client/debugger/test/mochitest/code_math.map
devtools/client/debugger/test/mochitest/code_math.min.js
devtools/client/debugger/test/mochitest/code_math_bogus_map.js
devtools/client/debugger/test/mochitest/code_same-line-functions.js
devtools/client/debugger/test/mochitest/code_script-eval.js
devtools/client/debugger/test/mochitest/code_script-switching-01.js
devtools/client/debugger/test/mochitest/code_script-switching-02.js
devtools/client/debugger/test/mochitest/code_test-editor-mode
devtools/client/debugger/test/mochitest/code_ugly-2.js
devtools/client/debugger/test/mochitest/code_ugly-3.js
devtools/client/debugger/test/mochitest/code_ugly-4.js
devtools/client/debugger/test/mochitest/code_ugly-5.js
devtools/client/debugger/test/mochitest/code_ugly-6.js
devtools/client/debugger/test/mochitest/code_ugly-7.js
devtools/client/debugger/test/mochitest/code_ugly-8
devtools/client/debugger/test/mochitest/code_ugly-8^headers^
devtools/client/debugger/test/mochitest/code_ugly.js
devtools/client/debugger/test/mochitest/code_worker-source-map.coffee
devtools/client/debugger/test/mochitest/code_worker-source-map.js
devtools/client/debugger/test/mochitest/code_worker-source-map.js.map
devtools/client/debugger/test/mochitest/code_workeractor-worker.js
devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab1.html
devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab2.html
devtools/client/debugger/test/mochitest/doc_binary_search.html
devtools/client/debugger/test/mochitest/doc_breakpoint-move.html
devtools/client/debugger/test/mochitest/doc_breakpoints-break-on-last-line-of-script-on-reload.html
devtools/client/debugger/test/mochitest/doc_breakpoints-other-tabs.html
devtools/client/debugger/test/mochitest/doc_breakpoints-reload.html
devtools/client/debugger/test/mochitest/doc_bug-896139.html
devtools/client/debugger/test/mochitest/doc_closure-optimized-out.html
devtools/client/debugger/test/mochitest/doc_closures.html
devtools/client/debugger/test/mochitest/doc_conditional-breakpoints.html
devtools/client/debugger/test/mochitest/doc_domnode-variables.html
devtools/client/debugger/test/mochitest/doc_editor-mode.html
devtools/client/debugger/test/mochitest/doc_empty-tab-01.html
devtools/client/debugger/test/mochitest/doc_empty-tab-02.html
devtools/client/debugger/test/mochitest/doc_event-listeners-02.html
devtools/client/debugger/test/mochitest/doc_frame-parameters.html
devtools/client/debugger/test/mochitest/doc_function-display-name.html
devtools/client/debugger/test/mochitest/doc_function-jump.html
devtools/client/debugger/test/mochitest/doc_function-search.html
devtools/client/debugger/test/mochitest/doc_iframes.html
devtools/client/debugger/test/mochitest/doc_included-script.html
devtools/client/debugger/test/mochitest/doc_inline-script.html
devtools/client/debugger/test/mochitest/doc_large-array-buffer.html
devtools/client/debugger/test/mochitest/doc_map-set.html
devtools/client/debugger/test/mochitest/doc_minified.html
devtools/client/debugger/test/mochitest/doc_minified_bogus_map.html
devtools/client/debugger/test/mochitest/doc_no-page-sources.html
devtools/client/debugger/test/mochitest/doc_pause-exceptions.html
devtools/client/debugger/test/mochitest/doc_promise.html
devtools/client/debugger/test/mochitest/doc_proxy.html
devtools/client/debugger/test/mochitest/doc_random-javascript.html
devtools/client/debugger/test/mochitest/doc_recursion-stack.html
devtools/client/debugger/test/mochitest/doc_scope-variable-2.html
devtools/client/debugger/test/mochitest/doc_scope-variable-3.html
devtools/client/debugger/test/mochitest/doc_scope-variable-4.html
devtools/client/debugger/test/mochitest/doc_scope-variable.html
devtools/client/debugger/test/mochitest/doc_script-bookmarklet.html
devtools/client/debugger/test/mochitest/doc_script-eval.html
devtools/client/debugger/test/mochitest/doc_script-switching-01.html
devtools/client/debugger/test/mochitest/doc_script-switching-02.html
devtools/client/debugger/test/mochitest/doc_script_webext_contentscript.html
devtools/client/debugger/test/mochitest/doc_split-console-paused-reload.html
devtools/client/debugger/test/mochitest/doc_step-many-statements.html
devtools/client/debugger/test/mochitest/doc_step-out.html
devtools/client/debugger/test/mochitest/doc_watch-expression-button.html
devtools/client/debugger/test/mochitest/doc_watch-expressions.html
devtools/client/debugger/test/mochitest/doc_whitespace-property-names.html
devtools/client/debugger/test/mochitest/doc_with-frame.html
devtools/client/debugger/test/mochitest/doc_worker-source-map.html
devtools/client/debugger/test/mochitest/sjs_post-page.sjs
devtools/client/debugger/test/mochitest/sjs_random-javascript.sjs
devtools/client/debugger/test/mochitest/testactors.js
devtools/client/debugger/utils.js
devtools/client/debugger/views/filter-view.js
devtools/client/debugger/views/global-search-view.js
devtools/client/debugger/views/options-view.js
devtools/client/debugger/views/stack-frames-classic-view.js
devtools/client/debugger/views/stack-frames-view.js
devtools/client/debugger/views/toolbar-view.js
devtools/client/debugger/views/variable-bubble-view.js
devtools/client/debugger/views/watch-expressions-view.js
devtools/client/debugger/views/workers-view.js
devtools/client/locales/en-US/debugger.dtd
devtools/client/themes/debugger.css
devtools/client/themes/images/aboutdebugging-globe-icon.svg
devtools/client/themes/images/alerticon-warning.png
devtools/client/themes/images/alerticon-warning@2x.png
devtools/client/themes/images/arrow-e.png
devtools/client/themes/images/arrow-e@2x.png
devtools/client/themes/images/controls.png
devtools/client/themes/images/controls@2x.png
devtools/client/themes/images/cubic-bezier-swatch.png
devtools/client/themes/images/cubic-bezier-swatch@2x.png
devtools/client/themes/images/debugger-step-over.png
devtools/client/themes/images/debugger-step-over@2x.png
devtools/client/themes/images/debugger-toggleBreakpoints.svg
devtools/client/themes/images/filetypes/dir-close.svg
devtools/client/themes/images/filetypes/dir-open.svg
devtools/client/themes/images/filetypes/globe.svg
devtools/client/themes/images/magnifying-glass.png
devtools/client/themes/images/magnifying-glass@2x.png
devtools/client/themes/images/tracer-icon.png
devtools/client/themes/images/tracer-icon@2x.png
devtools/client/themes/images/webconsole/alert.svg
devtools/client/themes/images/webconsole/globe.svg
devtools/client/themes/tooltip/arrow-horizontal-dark.png
devtools/client/themes/tooltip/arrow-horizontal-dark@2x.png
devtools/client/themes/tooltip/arrow-horizontal-light.png
devtools/client/themes/tooltip/arrow-horizontal-light@2x.png
devtools/client/themes/tooltip/arrow-vertical-dark.png
devtools/client/themes/tooltip/arrow-vertical-dark@2x.png
devtools/client/themes/tooltip/arrow-vertical-light.png
devtools/client/themes/tooltip/arrow-vertical-light@2x.png
js/xpconnect/idl/xpcIJSModuleLoader.idl
third_party/rust/new-ordered-float/.cargo-checksum.json
third_party/rust/new-ordered-float/.travis.yml
third_party/rust/new-ordered-float/Cargo.toml
third_party/rust/new-ordered-float/LICENSE-MIT
third_party/rust/new-ordered-float/README.md
third_party/rust/new-ordered-float/src/lib.rs
third_party/rust/new-ordered-float/tests/test.rs
third_party/rust/new-ordered-float/tests/test_deprecated_names.rs
third_party/rust/uuid-0.5.1/.cargo-checksum.json
third_party/rust/uuid-0.5.1/.travis.yml
third_party/rust/uuid-0.5.1/Cargo.toml
third_party/rust/uuid-0.5.1/LICENSE-APACHE
third_party/rust/uuid-0.5.1/LICENSE-MIT
third_party/rust/uuid-0.5.1/README.md
third_party/rust/uuid-0.5.1/benches/parse_str.rs
third_party/rust/uuid-0.5.1/src/lib.rs
third_party/rust/uuid-0.5.1/src/rustc_serialize.rs
third_party/rust/uuid-0.5.1/src/serde.rs
third_party/rust/uuid-0.5.1/src/std_support.rs
toolkit/mozapps/extensions/content/eula.js
toolkit/mozapps/extensions/content/eula.xul
toolkit/themes/osx/mozapps/extensions/eula.css
toolkit/themes/windows/mozapps/extensions/eula.css
xpcom/components/ModuleLoader.h
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -762,17 +762,17 @@ dependencies = [
 name = "dump_syms_rust_demangle"
 version = "0.1.0"
 dependencies = [
  "rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "dwrote"
-version = "0.5.2"
+version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)",
  "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
@@ -969,17 +969,17 @@ dependencies = [
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozprofile 0.4.0",
  "mozrunner 0.8.0",
  "mozversion 0.1.3",
  "regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)",
  "serde_json 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "webdriver 0.38.0",
  "zip 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "geckoservo"
 version = "0.0.1"
 dependencies = [
@@ -1044,17 +1044,17 @@ dependencies = [
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "mozurl 0.0.1",
  "mp4parse_capi 0.10.1",
  "netwerk_helper 0.0.1",
  "nserror 0.1.0",
  "nsstring 0.1.0",
  "prefs_parser 0.0.1",
  "profiler_helper 0.1.0",
- "rkv 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rkv 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "rsdparsa_capi 0.1.0",
  "rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "u2fhid 0.2.2",
  "webrender_bindings 0.1.0",
  "xpcom 0.1.0",
 ]
 
 [[package]]
@@ -1654,25 +1654,16 @@ dependencies = [
 name = "netwerk_helper"
 version = "0.0.1"
 dependencies = [
  "nserror 0.1.0",
  "nsstring 0.1.0",
 ]
 
 [[package]]
-name = "new-ordered-float"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
- "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
 name = "new_debug_unreachable"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -2067,28 +2058,28 @@ name = "regex-syntax"
 version = "0.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "ucd-util 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "rkv"
-version = "0.4.1"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "arrayref 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "lmdb-rkv 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "new-ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
  "url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "ron"
 version = "0.1.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2856,28 +2847,21 @@ dependencies = [
 
 [[package]]
 name = "utf8-ranges"
 version = "1.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "uuid"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-dependencies = [
- "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)",
-]
-
-[[package]]
-name = "uuid"
 version = "0.6.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "vcpkg"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
@@ -2951,17 +2935,17 @@ dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-text 13.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "dwrote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "freetype 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "lazy_static 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "plane-split 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2979,42 +2963,42 @@ name = "webrender_api"
 version = "0.57.2"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "dwrote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)",
  "serde_derive 1.0.66 (git+https://github.com/servo/serde?branch=deserialize_from_enums8)",
  "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
 name = "webrender_bindings"
 version = "0.1.0"
 dependencies = [
  "app_units 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "bincode 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-foundation 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "core-graphics 0.17.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "dwrote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
+ "dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "foreign-types 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
  "gleam 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "nsstring 0.1.0",
  "rayon 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "thread_profiler 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
- "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
+ "uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
  "webrender 0.57.2",
 ]
 
 [[package]]
 name = "which"
 version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
@@ -3204,17 +3188,17 @@ dependencies = [
 "checksum darling_macro 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb69a38fdeaeaf3db712e1df170de67ee9dfc24fb88ca3e9d21e703ec25a4d8e"
 "checksum devd-rs 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e7c9ac481c38baf400d3b732e4a06850dfaa491d1b6379a249d9d40d14c2434c"
 "checksum diff 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "3c2b69f912779fbb121ceb775d74d51e915af17aaebc38d28a592843a2dd0a3a"
 "checksum digest 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "03b072242a8cbaf9c145665af9d250c59af3b958f83ed6824e13533cf76d5b90"
 "checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a"
 "checksum docopt 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d8acd393692c503b168471874953a2531df0e9ab77d0b6bbc582395743300a4a"
 "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab"
 "checksum dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "068d4026697c1a18f0b0bb8cfcad1b0c151b90d8edb9bf4c235ad68128920d1d"
-"checksum dwrote 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f5472f94ba0d9e65b4fefb8c1661ad5b253455eec42cb0702cf0189526321034"
+"checksum dwrote 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8b5a0af6d47ecf67355dc36e5fc09547050bd8a4b87870e637911ffe4aced32a"
 "checksum either 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "18785c1ba806c258137c937e44ada9ee7e69a37e3c72077542cd2f069d78562a"
 "checksum ena 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "88dc8393b3c7352f94092497f6b52019643e493b6b890eb417cdb7c46117e621"
 "checksum encoding_c 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "769ecb8b33323998e482b218c0d13cd64c267609023b4b7ec3ee740714c318ee"
 "checksum encoding_rs 0.8.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f1a79fa56c329a5b087de13748054fb3b974c4a672c12c71f0b66e35c5addec5"
 "checksum env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0561146661ae44c579e993456bc76d11ce1e0c7d745e57b2fa7146b6e49fa2ad"
 "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3"
 "checksum euclid 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "70a2ebdf55fb9d6329046e026329a55ef8fbaae5ea833f56e170beb3125a8a5f"
 "checksum failure 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7efb22686e4a466b1ec1a15c2898f91fa9cb340452496dca654032de20ff95b9"
@@ -3276,17 +3260,16 @@ dependencies = [
 "checksum miniz_oxide_c_api 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "92d98fdbd6145645828069b37ea92ca3de225e000d80702da25c20d3584b38a5"
 "checksum mio 0.6.15 (registry+https://github.com/rust-lang/crates.io-index)" = "4fcfcb32d63961fb6f367bfd5d21e4600b92cd310f71f9dca25acae196eb1560"
 "checksum mio-uds 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1731a873077147b626d89cc6c2a0db6288d607496c5d10c0cfcf3adc697ec673"
 "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919"
 "checksum moz_cbor 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20c82a57087fd5990d7122dbff1607c3b20c3d2958e9d9ad9765aab415e2c91c"
 "checksum mp4parse_fallible 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6626c2aef76eb8f984eef02e475883d3fe9112e114720446c5810fc5f045cd30"
 "checksum msdos_time 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aad9dfe950c057b1bfe9c1f2aa51583a8468ef2a5baba2ebbe06d775efeb7729"
 "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0"
-"checksum new-ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8ccbebba6fb53a6d2bdcfaf79cb339bc136dee3bfff54dc337a334bafe36476a"
 "checksum new_debug_unreachable 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdc457076c78ab54d5e0d6fa7c47981757f1e34dc39ff92787f217dede586c4"
 "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
 "checksum nom 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "05aec50c70fd288702bcd93284a8444607f3292dbdf2a30de5ea5dcdbe72287b"
 "checksum nom 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9c349f68f25f596b9f44cf0e7c69752a5c633b0550c3ff849518bfba0233774a"
 "checksum num-derive 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0d2c31b75c36a993d30c7a13d70513cb93f02acafdd5b7ba250f9b0e18615de7"
 "checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
 "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
 "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
@@ -3322,17 +3305,17 @@ dependencies = [
 "checksum rayon-core 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9d24ad214285a7729b174ed6d3bcfcb80177807f959d95fafd5bfc5c4f201ac8"
 "checksum redox_syscall 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "ab105df655884ede59d45b7070c8a65002d921461ee813a024558ca16030eea0"
 "checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
 "checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26"
 "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b"
 "checksum regex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "75ecf88252dce580404a22444fc7d626c01815debba56a7f4f536772a5ff19d3"
 "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db"
 "checksum regex-syntax 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8f1ac0f60d675cc6cf13a20ec076568254472551051ad5dd050364d70671bf6b"
-"checksum rkv 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "21983ae9330b1e1cb1d01868229618a3c7cc5134955f0dc1a86a0a1886f3acb7"
+"checksum rkv 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "663e50c3b2454387726a83b01629892824dcf113c0471841ea4bc9b5929eb75e"
 "checksum ron 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "da06feaa07f69125ab9ddc769b11de29090122170b402547f64b86fe16ebc399"
 "checksum runloop 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd"
 "checksum rust-ini 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8a654c5bda722c699be6b0fe4c0d90de218928da5b724c3e467fc48865c37263"
 "checksum rustc-demangle 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "76d7ba1feafada44f2d38eed812bd2489a03c0f5abb975799251518b68848649"
 "checksum rustc_version 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b9743a7670d88d5d52950408ecdb7c71d8986251ab604d4689dd2ca25c9bca69"
 "checksum ryu 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0568787116e13c652377b6846f5931454a363a8fdf8ae50463ee40935b278b"
 "checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
 "checksum same-file 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cfb6eded0b06a0b512c8ddbcf04089138c9b4362c2f696f3c3d76039d68f3637"
@@ -3398,17 +3381,16 @@ dependencies = [
 "checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
 "checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f"
 "checksum unicode-segmentation 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "aa6024fc12ddfd1c6dbc14a80fa2324d4568849869b779f6bd37e5e4c03344d1"
 "checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
 "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
 "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
 "checksum url 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f808aadd8cfec6ef90e4a14eb46f24511824d1ac596b9682703c87056c8678b7"
 "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
-"checksum uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22"
 "checksum uuid 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e1436e58182935dcd9ce0add9ea0b558e8a87befe01c1a301e6020aeb0876363"
 "checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b"
 "checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
 "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
 "checksum walkdir 2.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "63636bd0eb3d00ccb8b9036381b526efac53caf112b7783b730ab3f8e44da369"
 "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
 "checksum wasmparser 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fed18a63a6796175be2254fccca1da4e8b8fec0abca37ad155aea345feb50798"
 "checksum webidl 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0f807f7488d680893f7188aa09d7672a3a0a8461975a098a2edf0a52e3fee29"
--- a/accessible/android/AccessibleWrap.cpp
+++ b/accessible/android/AccessibleWrap.cpp
@@ -201,164 +201,16 @@ bool
 AccessibleWrap::GetSelectionBounds(int32_t* aStartOffset, int32_t* aEndOffset) {
   if (IsHyperText()) {
     return AsHyperText()->SelectionBoundsAt(0, aStartOffset, aEndOffset);
   }
 
   return false;
 }
 
-mozilla::java::GeckoBundle::LocalRef
-AccessibleWrap::CreateBundle(int32_t aParentID,
-                             role aRole,
-                             uint64_t aState,
-                             const nsString& aName,
-                             const nsString& aTextValue,
-                             const nsString& aDOMNodeID,
-                             const nsIntRect& aBounds,
-                             double aCurVal,
-                             double aMinVal,
-                             double aMaxVal,
-                             double aStep,
-                             nsIPersistentProperties* aAttributes,
-                             const nsTArray<int32_t>& aChildren) const
-{
-  GECKOBUNDLE_START(nodeInfo);
-  GECKOBUNDLE_PUT(nodeInfo, "id", java::sdk::Integer::ValueOf(VirtualViewID()));
-  GECKOBUNDLE_PUT(nodeInfo, "parentId", java::sdk::Integer::ValueOf(aParentID));
-  uint64_t flags = GetFlags(aRole, aState);
-  GECKOBUNDLE_PUT(nodeInfo, "flags", java::sdk::Integer::ValueOf(flags));
-
-  nsAutoString geckoRole;
-  nsAutoString roleDescription;
-  int32_t androidClass = java::SessionAccessibility::CLASSNAME_VIEW;
-  if (VirtualViewID() == kNoID) {
-    androidClass = java::SessionAccessibility::CLASSNAME_WEBVIEW;
-  } else {
-    GetRoleDescription(aRole, geckoRole, roleDescription);
-    androidClass = GetAndroidClass(aRole);
-  }
-
-  GECKOBUNDLE_PUT(
-    nodeInfo, "roleDescription", jni::StringParam(roleDescription));
-  GECKOBUNDLE_PUT(nodeInfo, "geckoRole", jni::StringParam(geckoRole));
-  GECKOBUNDLE_PUT(nodeInfo, "className", java::sdk::Integer::ValueOf(androidClass));
-
-  if (!aTextValue.IsEmpty() &&
-      (flags & java::SessionAccessibility::FLAG_EDITABLE)) {
-    GECKOBUNDLE_PUT(nodeInfo, "hint", jni::StringParam(aName));
-    GECKOBUNDLE_PUT(nodeInfo, "text", jni::StringParam(aTextValue));
-  } else {
-    GECKOBUNDLE_PUT(nodeInfo, "text", jni::StringParam(aName));
-  }
-
-  if (!aDOMNodeID.IsEmpty()) {
-    GECKOBUNDLE_PUT(
-      nodeInfo, "viewIdResourceName", jni::StringParam(aDOMNodeID));
-  }
-
-  const int32_t data[4] = {
-    aBounds.x, aBounds.y, aBounds.x + aBounds.width, aBounds.y + aBounds.height
-  };
-  GECKOBUNDLE_PUT(nodeInfo, "bounds", jni::IntArray::New(data, 4));
-
-  if (HasNumericValue()) {
-    GECKOBUNDLE_START(rangeInfo);
-    if (aMaxVal == 1 && aMinVal == 0) {
-      GECKOBUNDLE_PUT(
-        rangeInfo, "type", java::sdk::Integer::ValueOf(2)); // percent
-    } else if (std::round(aStep) != aStep) {
-      GECKOBUNDLE_PUT(
-        rangeInfo, "type", java::sdk::Integer::ValueOf(1)); // float
-    } else {
-      GECKOBUNDLE_PUT(
-        rangeInfo, "type", java::sdk::Integer::ValueOf(0)); // integer
-    }
-
-    if (!IsNaN(aCurVal)) {
-      GECKOBUNDLE_PUT(rangeInfo, "current", java::sdk::Double::New(aCurVal));
-    }
-    if (!IsNaN(aMinVal)) {
-      GECKOBUNDLE_PUT(rangeInfo, "min", java::sdk::Double::New(aMinVal));
-    }
-    if (!IsNaN(aMaxVal)) {
-      GECKOBUNDLE_PUT(rangeInfo, "max", java::sdk::Double::New(aMaxVal));
-    }
-
-    GECKOBUNDLE_FINISH(rangeInfo);
-    GECKOBUNDLE_PUT(nodeInfo, "rangeInfo", rangeInfo);
-  }
-
-  nsString inputTypeAttr;
-  nsAccUtils::GetAccAttr(aAttributes, nsGkAtoms::textInputType, inputTypeAttr);
-  int32_t inputType = GetInputType(inputTypeAttr);
-  if (inputType) {
-    GECKOBUNDLE_PUT(nodeInfo, "inputType", java::sdk::Integer::ValueOf(inputType));
-  }
-
-  nsString posinset;
-  nsresult rv = aAttributes->GetStringProperty(NS_LITERAL_CSTRING("posinset"), posinset);
-  if (NS_SUCCEEDED(rv)) {
-    int32_t rowIndex;
-    if (sscanf(NS_ConvertUTF16toUTF8(posinset).get(), "%d", &rowIndex) > 0) {
-      GECKOBUNDLE_START(collectionItemInfo);
-      GECKOBUNDLE_PUT(
-        collectionItemInfo, "rowIndex", java::sdk::Integer::ValueOf(rowIndex));
-      GECKOBUNDLE_PUT(
-        collectionItemInfo, "columnIndex", java::sdk::Integer::ValueOf(0));
-      GECKOBUNDLE_PUT(
-        collectionItemInfo, "rowSpan", java::sdk::Integer::ValueOf(1));
-      GECKOBUNDLE_PUT(
-        collectionItemInfo, "columnSpan", java::sdk::Integer::ValueOf(1));
-      GECKOBUNDLE_FINISH(collectionItemInfo);
-
-      GECKOBUNDLE_PUT(nodeInfo, "collectionItemInfo", collectionItemInfo);
-    }
-  }
-
-  nsString colSize;
-  rv = aAttributes->GetStringProperty(NS_LITERAL_CSTRING("child-item-count"),
-                                      colSize);
-  if (NS_SUCCEEDED(rv)) {
-    int32_t rowCount;
-    if (sscanf(NS_ConvertUTF16toUTF8(colSize).get(), "%d", &rowCount) > 0) {
-      GECKOBUNDLE_START(collectionInfo);
-      GECKOBUNDLE_PUT(
-        collectionInfo, "rowCount", java::sdk::Integer::ValueOf(rowCount));
-      GECKOBUNDLE_PUT(
-        collectionInfo, "columnCount", java::sdk::Integer::ValueOf(1));
-
-      nsString unused;
-      rv = aAttributes->GetStringProperty(NS_LITERAL_CSTRING("hierarchical"),
-                                          unused);
-      if (NS_SUCCEEDED(rv)) {
-        GECKOBUNDLE_PUT(
-          collectionInfo, "isHierarchical", java::sdk::Boolean::TRUE());
-      }
-
-      if (IsSelect()) {
-        int32_t selectionMode = (aState & states::MULTISELECTABLE) ? 2 : 1;
-        GECKOBUNDLE_PUT(collectionInfo,
-                        "selectionMode",
-                        java::sdk::Integer::ValueOf(selectionMode));
-      }
-      GECKOBUNDLE_FINISH(collectionInfo);
-
-      GECKOBUNDLE_PUT(nodeInfo, "collectionInfo", collectionInfo);
-    }
-  }
-
-  GECKOBUNDLE_PUT(nodeInfo,
-                  "children",
-                  jni::IntArray::New(aChildren.Elements(), aChildren.Length()));
-  GECKOBUNDLE_FINISH(nodeInfo);
-
-  return nodeInfo;
-}
-
 uint64_t
 AccessibleWrap::GetFlags(role aRole, uint64_t aState)
 {
   uint64_t flags = 0;
   if (aState & states::CHECKABLE) {
     flags |= java::SessionAccessibility::FLAG_CHECKABLE;
   }
 
@@ -490,58 +342,205 @@ AccessibleWrap::GetInputType(const nsStr
   if (aInputTypeAttr.EqualsIgnoreCase("url")) {
     return java::sdk::InputType::TYPE_CLASS_TEXT | java::sdk::InputType::TYPE_TEXT_VARIATION_URI;
   }
 
   return 0;
 }
 
 void
-AccessibleWrap::DOMNodeID(nsString& aDOMNodeID)
+AccessibleWrap::WrapperDOMNodeID(nsString& aDOMNodeID)
 {
   if (mContent) {
     nsAtom* id = mContent->GetID();
     if (id) {
       id->ToString(aDOMNodeID);
     }
   }
 }
 
+bool
+AccessibleWrap::WrapperRangeInfo(double* aCurVal, double* aMinVal,
+                             double* aMaxVal, double* aStep)
+{
+  if (HasNumericValue()) {
+    *aCurVal = CurValue();
+    *aMinVal = MinValue();
+    *aMaxVal = MaxValue();
+    *aStep = Step();
+    return true;
+  }
+
+  return false;
+}
+
 mozilla::java::GeckoBundle::LocalRef
-AccessibleWrap::ToBundle()
+AccessibleWrap::ToBundle(bool aMinimal)
 {
-  if (IsDefunct()) {
+  if (!IsProxy() && IsDefunct()) {
     return nullptr;
   }
 
-  AccessibleWrap* parent = static_cast<AccessibleWrap*>(Parent());
-  nsAutoString name;
-  Name(name);
+  GECKOBUNDLE_START(nodeInfo);
+  GECKOBUNDLE_PUT(nodeInfo, "id", java::sdk::Integer::ValueOf(VirtualViewID()));
+
+  AccessibleWrap* parent = WrapperParent();
+  GECKOBUNDLE_PUT(nodeInfo, "parentId",
+    java::sdk::Integer::ValueOf(parent ? parent->VirtualViewID() : 0));
+
+  role role = WrapperRole();
+  uint64_t state = State();
+  uint64_t flags = GetFlags(role, state);
+  GECKOBUNDLE_PUT(nodeInfo, "flags", java::sdk::Integer::ValueOf(flags));
+  GECKOBUNDLE_PUT(nodeInfo, "className", java::sdk::Integer::ValueOf(AndroidClass()));
+
+  nsAutoString text;
+  if (state & states::EDITABLE) {
+    Value(text);
+  }
 
-  nsAutoString value;
-  Value(value);
+  if (!text.IsEmpty()) {
+    nsAutoString hint;
+    Name(hint);
+    GECKOBUNDLE_PUT(nodeInfo, "hint", jni::StringParam(hint));
+  } else {
+    Name(text);
+  }
+  GECKOBUNDLE_PUT(nodeInfo, "text", jni::StringParam(text));
+
+  if (aMinimal) {
+    GECKOBUNDLE_FINISH(nodeInfo);
+    return nodeInfo;
+  }
+
+  nsAutoString geckoRole;
+  nsAutoString roleDescription;
+  if (VirtualViewID() != kNoID) {
+    GetRoleDescription(role, geckoRole, roleDescription);
+  }
+
+  GECKOBUNDLE_PUT(
+    nodeInfo, "roleDescription", jni::StringParam(roleDescription));
+  GECKOBUNDLE_PUT(nodeInfo, "geckoRole", jni::StringParam(geckoRole));
+
+  GECKOBUNDLE_PUT(
+    nodeInfo, "roleDescription", jni::StringParam(roleDescription));
+  GECKOBUNDLE_PUT(nodeInfo, "geckoRole", jni::StringParam(geckoRole));
 
   nsAutoString viewIdResourceName;
-  DOMNodeID(viewIdResourceName);
+  WrapperDOMNodeID(viewIdResourceName);
+  if (!viewIdResourceName.IsEmpty()) {
+    GECKOBUNDLE_PUT(
+      nodeInfo, "viewIdResourceName", jni::StringParam(viewIdResourceName));
+  }
+
+  nsIntRect bounds = Bounds();
+  const int32_t data[4] = {
+    bounds.x, bounds.y, bounds.x + bounds.width, bounds.y + bounds.height
+  };
+  GECKOBUNDLE_PUT(nodeInfo, "bounds", jni::IntArray::New(data, 4));
+
+  double curValue = 0;
+  double minValue = 0;
+  double maxValue = 0;
+  double step = 0;
+  if (WrapperRangeInfo(&curValue, &minValue, &maxValue, &step)) {
+    GECKOBUNDLE_START(rangeInfo);
+    if (maxValue == 1 && minValue == 0) {
+      GECKOBUNDLE_PUT(
+        rangeInfo, "type", java::sdk::Integer::ValueOf(2)); // percent
+    } else if (std::round(step) != step) {
+      GECKOBUNDLE_PUT(
+        rangeInfo, "type", java::sdk::Integer::ValueOf(1)); // float
+    } else {
+      GECKOBUNDLE_PUT(
+        rangeInfo, "type", java::sdk::Integer::ValueOf(0)); // integer
+    }
+
+    if (!IsNaN(curValue)) {
+      GECKOBUNDLE_PUT(rangeInfo, "current", java::sdk::Double::New(curValue));
+    }
+    if (!IsNaN(minValue)) {
+      GECKOBUNDLE_PUT(rangeInfo, "min", java::sdk::Double::New(minValue));
+    }
+    if (!IsNaN(maxValue)) {
+      GECKOBUNDLE_PUT(rangeInfo, "max", java::sdk::Double::New(maxValue));
+    }
+
+    GECKOBUNDLE_FINISH(rangeInfo);
+    GECKOBUNDLE_PUT(nodeInfo, "rangeInfo", rangeInfo);
+  }
 
   nsCOMPtr<nsIPersistentProperties> attributes = Attributes();
 
+  nsString inputTypeAttr;
+  nsAccUtils::GetAccAttr(attributes, nsGkAtoms::textInputType, inputTypeAttr);
+  int32_t inputType = GetInputType(inputTypeAttr);
+  if (inputType) {
+    GECKOBUNDLE_PUT(nodeInfo, "inputType", java::sdk::Integer::ValueOf(inputType));
+  }
+
+  nsString posinset;
+  nsresult rv = attributes->GetStringProperty(NS_LITERAL_CSTRING("posinset"), posinset);
+  if (NS_SUCCEEDED(rv)) {
+    int32_t rowIndex;
+    if (sscanf(NS_ConvertUTF16toUTF8(posinset).get(), "%d", &rowIndex) > 0) {
+      GECKOBUNDLE_START(collectionItemInfo);
+      GECKOBUNDLE_PUT(
+        collectionItemInfo, "rowIndex", java::sdk::Integer::ValueOf(rowIndex));
+      GECKOBUNDLE_PUT(
+        collectionItemInfo, "columnIndex", java::sdk::Integer::ValueOf(0));
+      GECKOBUNDLE_PUT(
+        collectionItemInfo, "rowSpan", java::sdk::Integer::ValueOf(1));
+      GECKOBUNDLE_PUT(
+        collectionItemInfo, "columnSpan", java::sdk::Integer::ValueOf(1));
+      GECKOBUNDLE_FINISH(collectionItemInfo);
+
+      GECKOBUNDLE_PUT(nodeInfo, "collectionItemInfo", collectionItemInfo);
+    }
+  }
+
+  nsString colSize;
+  rv = attributes->GetStringProperty(NS_LITERAL_CSTRING("child-item-count"),
+                                      colSize);
+  if (NS_SUCCEEDED(rv)) {
+    int32_t rowCount;
+    if (sscanf(NS_ConvertUTF16toUTF8(colSize).get(), "%d", &rowCount) > 0) {
+      GECKOBUNDLE_START(collectionInfo);
+      GECKOBUNDLE_PUT(
+        collectionInfo, "rowCount", java::sdk::Integer::ValueOf(rowCount));
+      GECKOBUNDLE_PUT(
+        collectionInfo, "columnCount", java::sdk::Integer::ValueOf(1));
+
+      nsString unused;
+      rv = attributes->GetStringProperty(NS_LITERAL_CSTRING("hierarchical"),
+                                          unused);
+      if (NS_SUCCEEDED(rv)) {
+        GECKOBUNDLE_PUT(
+          collectionInfo, "isHierarchical", java::sdk::Boolean::TRUE());
+      }
+
+      if (IsSelect()) {
+        int32_t selectionMode = (state & states::MULTISELECTABLE) ? 2 : 1;
+        GECKOBUNDLE_PUT(collectionInfo,
+                        "selectionMode",
+                        java::sdk::Integer::ValueOf(selectionMode));
+      }
+      GECKOBUNDLE_FINISH(collectionInfo);
+
+      GECKOBUNDLE_PUT(nodeInfo, "collectionInfo", collectionInfo);
+    }
+  }
+
   auto childCount = ChildCount();
   nsTArray<int32_t> children(childCount);
   for (uint32_t i = 0; i < childCount; i++) {
     auto child = static_cast<AccessibleWrap*>(GetChildAt(i));
     children.AppendElement(child->VirtualViewID());
   }
 
-  return CreateBundle(parent ? parent->VirtualViewID() : 0,
-                      Role(),
-                      State(),
-                      name,
-                      value,
-                      viewIdResourceName,
-                      Bounds(),
-                      CurValue(),
-                      MinValue(),
-                      MaxValue(),
-                      Step(),
-                      attributes,
-                      children);
+  GECKOBUNDLE_PUT(nodeInfo,
+                  "children",
+                  jni::IntArray::New(children.Elements(), children.Length()));
+  GECKOBUNDLE_FINISH(nodeInfo);
+
+  return nodeInfo;
 }
--- a/accessible/android/AccessibleWrap.h
+++ b/accessible/android/AccessibleWrap.h
@@ -26,48 +26,46 @@ public:
   int32_t VirtualViewID() const { return mID; }
 
   virtual void SetTextContents(const nsAString& aText);
 
   virtual void GetTextContents(nsAString& aText);
 
   virtual bool GetSelectionBounds(int32_t* aStartOffset, int32_t* aEndOffset);
 
-  virtual mozilla::java::GeckoBundle::LocalRef ToBundle();
+  mozilla::java::GeckoBundle::LocalRef ToBundle(bool aMinimal = false);
+
+  int32_t AndroidClass()
+  {
+    return mID == kNoID ? java::SessionAccessibility::CLASSNAME_WEBVIEW
+                        : GetAndroidClass(WrapperRole());
+  }
 
   static const int32_t kNoID = -1;
 
 protected:
-  mozilla::java::GeckoBundle::LocalRef CreateBundle(
-    int32_t aParentID,
-    role aRole,
-    uint64_t aState,
-    const nsString& aName,
-    const nsString& aTextValue,
-    const nsString& aDOMNodeID,
-    const nsIntRect& aBounds,
-    double aCurVal,
-    double aMinVal,
-    double aMaxVal,
-    double aStep,
-    nsIPersistentProperties* aAttributes,
-    const nsTArray<int32_t>& aChildren) const;
 
   // IDs should be a positive 32bit integer.
   static int32_t AcquireID();
   static void ReleaseID(int32_t aID);
 
   static int32_t GetAndroidClass(role aRole);
 
   static int32_t GetInputType(const nsString& aInputTypeAttr);
 
   int32_t mID;
 
 private:
-  void DOMNodeID(nsString& aDOMNodeID);
+  virtual AccessibleWrap* WrapperParent() { return static_cast<AccessibleWrap*>(Parent()); }
+
+  virtual bool WrapperRangeInfo(double* aCurVal, double* aMinVal, double* aMaxVal, double* aStep);
+
+  virtual role WrapperRole() { return Role(); }
+
+  virtual void WrapperDOMNodeID(nsString& aDOMNodeID);
 
   static void GetRoleDescription(role aRole,
                                  nsAString& aGeckoRole,
                                  nsAString& aRoleDescription);
 
   static uint64_t GetFlags(role aRole, uint64_t aState);
 };
 
--- a/accessible/android/ProxyAccessibleWrap.cpp
+++ b/accessible/android/ProxyAccessibleWrap.cpp
@@ -67,16 +67,48 @@ ProxyAccessibleWrap::Attributes()
 }
 
 uint32_t
 ProxyAccessibleWrap::ChildCount() const
 {
   return Proxy()->ChildrenCount();
 }
 
+Accessible*
+ProxyAccessibleWrap::GetChildAt(uint32_t aIndex) const
+{
+  ProxyAccessible* child = Proxy()->ChildAt(aIndex);
+  return child ? WrapperFor(child) : nullptr;
+}
+
+ENameValueFlag
+ProxyAccessibleWrap::Name(nsString& aName) const
+{
+  Proxy()->Name(aName);
+  return eNameOK;
+}
+
+void
+ProxyAccessibleWrap::Value(nsString& aValue) const
+{
+  Proxy()->Value(aValue);
+}
+
+uint64_t
+ProxyAccessibleWrap::State()
+{ 
+  return Proxy()->State();
+}
+
+nsIntRect
+ProxyAccessibleWrap::Bounds() const
+{
+  return Proxy()->Bounds();
+}
+
 void
 ProxyAccessibleWrap::ScrollTo(uint32_t aHow) const
 {
   Proxy()->ScrollTo(aHow);
 }
 
 // Other
 
@@ -97,51 +129,43 @@ ProxyAccessibleWrap::GetTextContents(nsA
 bool
 ProxyAccessibleWrap::GetSelectionBounds(int32_t* aStartOffset,
                                         int32_t* aEndOffset)
 {
   nsAutoString unused;
   return Proxy()->SelectionBoundsAt(0, unused, aStartOffset, aEndOffset);
 }
 
-mozilla::java::GeckoBundle::LocalRef
-ProxyAccessibleWrap::ToBundle()
+role
+ProxyAccessibleWrap::WrapperRole()
+{
+  return Proxy()->Role();
+}
+
+AccessibleWrap*
+ProxyAccessibleWrap::WrapperParent()
 {
-  ProxyAccessible* proxy = Proxy();
-  if (!proxy) {
-    return nullptr;
+  return Proxy()->Parent() ? WrapperFor(Proxy()->Parent()) : nullptr;
+}
+
+bool
+ProxyAccessibleWrap::WrapperRangeInfo(double* aCurVal,
+                                      double* aMinVal,
+                                      double* aMaxVal,
+                                      double* aStep)
+{
+  if (HasNumericValue()) {
+    ProxyAccessible* proxy = Proxy();
+    *aCurVal = proxy->CurValue();
+    *aMinVal = proxy->MinValue();
+    *aMaxVal = proxy->MaxValue();
+    *aStep = proxy->Step();
+    return true;
   }
 
-  int32_t parentID = proxy->Parent() ?
-    WrapperFor(proxy->Parent())->VirtualViewID() : 0;
-
-  nsAutoString name;
-  proxy->Name(name);
-
-  nsAutoString value;
-  proxy->Value(value);
-
-  nsAutoString viewIdResourceName;
-  proxy->DOMNodeID(viewIdResourceName);
-
-  nsCOMPtr<nsIPersistentProperties> attributes = Attributes();
+  return false;
+}
 
-  auto childCount = proxy->ChildrenCount();
-  nsTArray<int32_t> children(childCount);
-  for (uint32_t i = 0; i < childCount; i++) {
-    auto child = WrapperFor(proxy->ChildAt(i));
-    children.AppendElement(child->VirtualViewID());
-  }
-
-  return CreateBundle(parentID,
-                      proxy->Role(),
-                      proxy->State(),
-                      name,
-                      value,
-                      viewIdResourceName,
-                      proxy->Bounds(),
-                      proxy->CurValue(),
-                      proxy->MinValue(),
-                      proxy->MaxValue(),
-                      proxy->Step(),
-                      attributes,
-                      children);
+void
+ProxyAccessibleWrap::WrapperDOMNodeID(nsString& aDOMNodeID)
+{
+  Proxy()->DOMNodeID(aDOMNodeID);
 }
--- a/accessible/android/ProxyAccessibleWrap.h
+++ b/accessible/android/ProxyAccessibleWrap.h
@@ -29,27 +29,45 @@ public:
   virtual void Shutdown() override;
 
   // Accessible
 
   virtual already_AddRefed<nsIPersistentProperties> Attributes() override;
 
   virtual uint32_t ChildCount() const override;
 
+  virtual Accessible* GetChildAt(uint32_t aIndex) const override;
+
+  virtual ENameValueFlag Name(nsString& aName) const override;
+
+  virtual void Value(nsString& aValue) const override;
+
+  virtual uint64_t State() override;
+
+  virtual nsIntRect Bounds() const override;
+
   virtual void ScrollTo(uint32_t aHow) const override;
 
   // AccessibleWrap
 
   virtual void SetTextContents(const nsAString& aText) override;
 
   virtual void GetTextContents(nsAString& aText) override;
 
   virtual bool GetSelectionBounds(int32_t* aStartOffset, int32_t* aEndOffset) override;
 
-  virtual mozilla::java::GeckoBundle::LocalRef ToBundle() override;
+private:
+  virtual role WrapperRole() override;
+
+  virtual AccessibleWrap* WrapperParent() override;
+
+  virtual bool WrapperRangeInfo(double* aCurVal, double* aMinVal, double* aMaxVal, double* aStep) override;
+
+  virtual void WrapperDOMNodeID(nsString& aDOMNodeID) override;
+
 };
 
 class DocProxyAccessibleWrap : public ProxyAccessibleWrap
 {
 public:
   explicit DocProxyAccessibleWrap(DocAccessibleParent* aProxy)
     : ProxyAccessibleWrap(aProxy)
   {
--- a/accessible/android/SessionAccessibility.cpp
+++ b/accessible/android/SessionAccessibility.cpp
@@ -146,40 +146,40 @@ SessionAccessibility::GetInstanceFor(Acc
   return nullptr;
 }
 
 void
 SessionAccessibility::SendAccessibilityFocusedEvent(AccessibleWrap* aAccessible)
 {
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_ACCESSIBILITY_FOCUSED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
   aAccessible->ScrollTo(nsIAccessibleScrollType::SCROLL_TYPE_ANYWHERE);
 }
 
 void
 SessionAccessibility::SendHoverEnterEvent(AccessibleWrap* aAccessible)
 {
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_HOVER_ENTER,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendFocusEvent(AccessibleWrap* aAccessible)
 {
   // Suppress focus events from about:blank pages.
   // This is important for tests.
   if (aAccessible->IsDoc() && aAccessible->ChildCount() == 0) {
     return;
   }
 
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_FOCUSED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendScrollingEvent(AccessibleWrap* aAccessible,
                                          int32_t aScrollX,
                                          int32_t aScrollY,
                                          int32_t aMaxScrollX,
                                          int32_t aMaxScrollY)
@@ -194,42 +194,42 @@ SessionAccessibility::SendScrollingEvent
   GECKOBUNDLE_START(eventInfo);
   GECKOBUNDLE_PUT(eventInfo, "scrollX", java::sdk::Integer::ValueOf(aScrollX));
   GECKOBUNDLE_PUT(eventInfo, "scrollY", java::sdk::Integer::ValueOf(aScrollY));
   GECKOBUNDLE_PUT(eventInfo, "maxScrollX", java::sdk::Integer::ValueOf(aMaxScrollX));
   GECKOBUNDLE_PUT(eventInfo, "maxScrollY", java::sdk::Integer::ValueOf(aMaxScrollY));
   GECKOBUNDLE_FINISH(eventInfo);
 
   mSessionAccessibility->SendEvent(
-    java::sdk::AccessibilityEvent::TYPE_VIEW_SCROLLED, virtualViewId,
-    eventInfo, aAccessible->ToBundle());
+    java::sdk::AccessibilityEvent::TYPE_VIEW_SCROLLED, virtualViewId, eventInfo,
+    aAccessible->ToBundle(true));
 
   SendWindowContentChangedEvent(aAccessible);
 }
 
 void
 SessionAccessibility::SendWindowContentChangedEvent(AccessibleWrap* aAccessible)
 {
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_WINDOW_CONTENT_CHANGED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendWindowStateChangedEvent(AccessibleWrap* aAccessible)
 {
   // Suppress window state changed events from about:blank pages.
   // This is important for tests.
   if (aAccessible->IsDoc() && aAccessible->ChildCount() == 0) {
     return;
   }
 
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_WINDOW_STATE_CHANGED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendTextSelectionChangedEvent(AccessibleWrap* aAccessible,
                                                     int32_t aCaretOffset)
 {
   int32_t fromIndex = aCaretOffset;
   int32_t startSel = -1;
@@ -240,17 +240,17 @@ SessionAccessibility::SendTextSelectionC
 
   GECKOBUNDLE_START(eventInfo);
   GECKOBUNDLE_PUT(eventInfo, "fromIndex", java::sdk::Integer::ValueOf(fromIndex));
   GECKOBUNDLE_PUT(eventInfo, "toIndex", java::sdk::Integer::ValueOf(aCaretOffset));
   GECKOBUNDLE_FINISH(eventInfo);
 
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_TEXT_SELECTION_CHANGED,
-    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendTextChangedEvent(AccessibleWrap* aAccessible,
                                            const nsString& aStr,
                                            int32_t aStart,
                                            uint32_t aLen,
                                            bool aIsInsert,
@@ -274,17 +274,17 @@ SessionAccessibility::SendTextChangedEve
   GECKOBUNDLE_PUT(eventInfo, "text", jni::StringParam(text));
   GECKOBUNDLE_PUT(eventInfo, "beforeText", jni::StringParam(beforeText));
   GECKOBUNDLE_PUT(eventInfo, "addedCount", java::sdk::Integer::ValueOf(aIsInsert ? aLen : 0));
   GECKOBUNDLE_PUT(eventInfo, "removedCount", java::sdk::Integer::ValueOf(aIsInsert ? 0 : aLen));
   GECKOBUNDLE_FINISH(eventInfo);
 
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_TEXT_CHANGED,
-    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendTextTraversedEvent(AccessibleWrap* aAccessible,
                                              int32_t aStartOffset,
                                              int32_t aEndOffset)
 {
   nsAutoString text;
@@ -294,26 +294,26 @@ SessionAccessibility::SendTextTraversedE
   GECKOBUNDLE_PUT(eventInfo, "text", jni::StringParam(text));
   GECKOBUNDLE_PUT(eventInfo, "fromIndex", java::sdk::Integer::ValueOf(aStartOffset));
   GECKOBUNDLE_PUT(eventInfo, "toIndex", java::sdk::Integer::ValueOf(aEndOffset));
   GECKOBUNDLE_FINISH(eventInfo);
 
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::
       TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY,
-    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), eventInfo, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendClickedEvent(AccessibleWrap* aAccessible)
 {
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_CLICKED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
 
 void
 SessionAccessibility::SendSelectedEvent(AccessibleWrap* aAccessible)
 {
   mSessionAccessibility->SendEvent(
     java::sdk::AccessibilityEvent::TYPE_VIEW_SELECTED,
-    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle());
+    aAccessible->VirtualViewID(), nullptr, aAccessible->ToBundle(true));
 }
--- a/accessible/base/MarkupMap.h
+++ b/accessible/base/MarkupMap.h
@@ -19,17 +19,17 @@ MARKUPMAP(acronym,
 
 MARKUPMAP(article,
           New_HyperText,
           roles::ARTICLE,
           Attr(xmlroles, article))
 
 MARKUPMAP(aside,
           New_HyperText,
-          roles::NOTE)
+          roles::LANDMARK)
 
 MARKUPMAP(blockquote,
           New_HyperText,
           roles::BLOCKQUOTE)
 
 MARKUPMAP(dd,
           New_HTMLDtOrDd<HyperTextAccessibleWrap>,
           roles::DEFINITION)
@@ -114,16 +114,20 @@ MARKUPMAP(label,
 MARKUPMAP(legend,
           New_HTMLLegend,
           roles::LABEL)
 
 MARKUPMAP(li,
           New_HTMLListitem,
           0)
 
+MARKUPMAP(main,
+          New_HyperText,
+          roles::LANDMARK)
+
 MARKUPMAP(map,
           nullptr,
           roles::TEXT_CONTAINER)
 
 MARKUPMAP(math,
           New_HyperText,
           roles::MATHML_MATH)
 
@@ -288,17 +292,17 @@ MARKUPMAP(mscarry_,
 
 MARKUPMAP(msline_,
           New_HyperText,
           roles::MATHML_STACK_LINE,
           AttrFromDOM(position, position))
 
 MARKUPMAP(nav,
           New_HyperText,
-          roles::SECTION)
+          roles::LANDMARK)
 
 MARKUPMAP(ol,
           New_HTMLList,
           roles::LIST)
 
 MARKUPMAP(option,
           New_HTMLOption,
           0)
--- a/accessible/html/HTMLElementAccessibles.cpp
+++ b/accessible/html/HTMLElementAccessibles.cpp
@@ -218,37 +218,33 @@ HTMLHeaderOrFooterAccessible::NativeRole
                              nsGkAtoms::figure, nsGkAtoms::td)) {
       break;
     }
     parent = parent->GetParent();
   }
 
   // No sectioning or sectioning root elements found.
   if (!parent) {
-    if (mContent->IsHTMLElement(nsGkAtoms::header)) {
-      return roles::HEADER;
-    }
-
-    if (mContent->IsHTMLElement(nsGkAtoms::footer)) {
-      return roles::FOOTER;
-    }
+    return roles::LANDMARK;
   }
 
   return roles::SECTION;
 }
 
 nsAtom*
 HTMLHeaderOrFooterAccessible::LandmarkRole() const
 {
   if (!HasOwnContent())
     return nullptr;
 
   a11y::role r = const_cast<HTMLHeaderOrFooterAccessible*>(this)->Role();
-  if (r == roles::HEADER) {
-    return nsGkAtoms::banner;
-  }
+  if (r == roles::LANDMARK) {
+    if (mContent->IsHTMLElement(nsGkAtoms::header)) {
+      return nsGkAtoms::banner;
+    }
 
-  if (r == roles::FOOTER) {
-    return nsGkAtoms::contentinfo;
+    if (mContent->IsHTMLElement(nsGkAtoms::footer)) {
+      return nsGkAtoms::contentinfo;
+    }
   }
 
   return nullptr;
 }
--- a/accessible/tests/mochitest/elm/test_HTMLSpec.html
+++ b/accessible/tests/mochitest/elm/test_HTMLSpec.html
@@ -114,17 +114,17 @@
         states: STATE_READONLY,
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("article", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:aside
       obj = {
-        role: ROLE_NOTE,
+        role: ROLE_LANDMARK,
         attributes: { "xml-roles": "complementary" },
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("aside", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       obj = { // HTML:audio
         role: ROLE_GROUPING,
@@ -508,17 +508,17 @@
         ],
       };
       testElm("figure", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:footer
 
       obj = {
-        role: ROLE_FOOTER,
+        role: ROLE_LANDMARK,
         attributes: { "xml-roles": "contentinfo" },
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("footer", obj);
 
       obj = {
         role: ROLE_SECTION,
         absentAttributes: { "xml-roles": "contentinfo" },
@@ -610,17 +610,17 @@
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("h6", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:header
 
       obj = {
-        role: ROLE_HEADER,
+        role: ROLE_LANDMARK,
         attributes: { "xml-roles": "banner" },
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("header", obj);
 
       obj = {
         role: ROLE_SECTION,
         absentAttributes: { "xml-roles": "banner" },
@@ -973,17 +973,17 @@
       // HTML:link
 
       ok(!isAccessible("link"), "link element is not accessible");
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:main
 
       obj = {
-        todo_role: ROLE_GROUPING,
+        role: ROLE_LANDMARK,
         attributes: { "xml-roles": "main" },
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("main", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:map
 
@@ -1031,17 +1031,17 @@
       // HTML:meter
 
       todo(isAccessible("meter"), "meter element is not accessible");
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:nav
 
       obj = {
-        role: ROLE_SECTION,
+        role: ROLE_LANDMARK,
         attributes: { "xml-roles": "navigation" },
         interfaces: [ nsIAccessibleText, nsIAccessibleHyperText ],
       };
       testElm("nav", obj);
 
       // ////////////////////////////////////////////////////////////////////////
       // HTML:object (windowless and windowed plugins) and HTML:param
 
--- a/accessible/tests/mochitest/role/test_general.html
+++ b/accessible/tests/mochitest/role/test_general.html
@@ -16,29 +16,29 @@
 
   <script type="application/javascript">
     function doTests() {
       // landmark tests section
       testRole("frm", ROLE_FORM);
 
       // nsHyperTextAcc tests section
       // Test html:form.
-      testRole("nav", ROLE_SECTION);
-      testRole("header", ROLE_HEADER);
-      testRole("footer", ROLE_FOOTER);
+      testRole("nav", ROLE_LANDMARK);
+      testRole("header", ROLE_LANDMARK);
+      testRole("footer", ROLE_LANDMARK);
       testRole("article", ROLE_ARTICLE);
-      testRole("aside", ROLE_NOTE);
+      testRole("aside", ROLE_LANDMARK);
       testRole("section", ROLE_SECTION);
 
       // Bug 996821
       // Check that landmark elements get accessibles with styled overflow.
       testRole("section_overflow", ROLE_SECTION);
-      testRole("nav_overflow", ROLE_SECTION);
+      testRole("nav_overflow", ROLE_LANDMARK);
       testRole("header_overflow", ROLE_SECTION);
-      testRole("aside_overflow", ROLE_NOTE);
+      testRole("aside_overflow", ROLE_LANDMARK);
       testRole("footer_overflow", ROLE_SECTION);
       testRole("article_overflow", ROLE_ARTICLE);
 
       // test html:div
       testRole("sec", ROLE_SECTION);
 
       // Test html:blockquote
       testRole("quote", ROLE_BLOCKQUOTE);
--- a/browser/app/macbuild/Contents/Info.plist.in
+++ b/browser/app/macbuild/Contents/Info.plist.in
@@ -216,16 +216,20 @@
 			<key>CFBundleURLSchemes</key>
 			<array>
 				<string>file</string>
 			</array>
 		</dict>
 	</array>
 	<key>CFBundleVersion</key>
 	<string>%MAC_BUNDLE_VERSION%</string>
+	<key>NSUserActivityTypes</key>
+	<array>
+		<string>NSUserActivityTypeBrowsingWeb</string>
+	</array>
 	<key>NSAppleScriptEnabled</key>
 	<true/>
 	<key>LSApplicationCategoryType</key>
 	<string>public.app-category.productivity</string>
 	<key>LSEnvironment</key>
 	<dict>
 		<key>MallocNanoZone</key>
 		<string>0</string>
--- a/browser/app/moz.build
+++ b/browser/app/moz.build
@@ -79,16 +79,21 @@ if CONFIG['OS_ARCH'] == 'WINNT':
     LOCAL_INCLUDES += [
         '/browser/app/winlauncher',
     ]
     DELAYLOAD_DLLS += [
         'oleaut32.dll',
         'ole32.dll',
     ]
 
+if CONFIG['MOZ_SANDBOX'] and CONFIG['OS_ARCH'] == 'Darwin':
+    USE_LIBS += [
+        'mozsandbox',
+    ]
+
 if CONFIG['MOZ_SANDBOX'] and CONFIG['OS_ARCH'] == 'WINNT':
     # For sandbox includes and the include dependencies those have
     LOCAL_INCLUDES += [
         '/security/sandbox/chromium',
         '/security/sandbox/chromium-shim',
     ]
 
     USE_LIBS += [
--- a/browser/app/nsBrowserApp.cpp
+++ b/browser/app/nsBrowserApp.cpp
@@ -38,16 +38,20 @@
 #include "mozilla/Sprintf.h"
 #include "mozilla/StartupTimeline.h"
 #include "mozilla/WindowsDllBlocklist.h"
 
 #ifdef LIBFUZZER
 #include "FuzzerDefs.h"
 #endif
 
+#ifdef XP_MACOSX
+#include "mozilla/Sandbox.h"
+#endif
+
 #ifdef MOZ_LINUX_32_SSE2_STARTUP_ERROR
 #include <cpuid.h>
 #include "mozilla/Unused.h"
 
 static bool
 IsSSE2Available()
 {
   // The rest of the app has been compiled to assume that SSE2 is present
@@ -258,16 +262,26 @@ InitXPCOMGlue()
 // NB: This must be extern, as this value is checked elsewhere
 uint32_t gBlocklistInitFlags = eDllBlocklistInitFlagDefault;
 #endif
 
 int main(int argc, char* argv[], char* envp[])
 {
   mozilla::TimeStamp start = mozilla::TimeStamp::Now();
 
+#ifdef XP_MACOSX
+  if (argc > 1 && IsArg(argv[1], "contentproc")) {
+    std::string err;
+    if (!mozilla::EarlyStartMacSandboxIfEnabled(argc, argv, err)) {
+      Output("Sandbox error: %s\n", err.c_str());
+      MOZ_CRASH("Sandbox initialization failed");
+    }
+  }
+#endif
+
 #ifdef MOZ_BROWSER_CAN_BE_CONTENTPROC
   // We are launching as a content process, delegate to the appropriate
   // main
   if (argc > 1 && IsArg(argv[1], "contentproc")) {
 #ifdef HAS_DLL_BLOCKLIST
     DllBlocklist_Initialize(eDllBlocklistInitFlagIsChildProcess);
 #endif
 #if defined(XP_WIN) && defined(MOZ_SANDBOX)
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1018,16 +1018,22 @@ pref("security.sandbox.gpu.level", 0);
 
 // Controls whether we disable win32k for the GMP processes.
 // true means that win32k system calls are not permitted.
 // Note: win32k is currently _not_ disabled due to intermittent test failures,
 // where the GMP process fails very early. See bug 1449348.
 pref("security.sandbox.gmp.win32k-disable", false);
 #endif
 
+#if defined(NIGHTLY_BUILD) && defined(XP_MACOSX) && defined(MOZ_SANDBOX)
+// Start the Mac sandbox immediately during child process startup instead
+// of when messaged by the parent after the message loop is running.
+pref("security.sandbox.content.mac.earlyinit", false);
+#endif
+
 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX) && defined(MOZ_CONTENT_SANDBOX)
 // This pref is discussed in bug 1083344, the naming is inspired from its
 // Windows counterpart, but on Mac it's an integer which means:
 // 0 -> "no sandbox" (nightly only)
 // 1 -> "preliminary content sandboxing enabled: write access to
 //       home directory is prevented"
 // 2 -> "preliminary content sandboxing enabled with profile protection:
 //       write access to home directory is prevented, read and write access
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -67,17 +67,17 @@
 }
 
 toolbar[customizable="true"] {
   -moz-binding: url("chrome://browser/content/customizableui/toolbar.xml#toolbar");
 }
 
 %ifdef XP_MACOSX
 #toolbar-menubar {
-  -moz-binding: url("chrome://browser/content/customizableui/toolbar.xml#toolbar-menubar-stub");
+  -moz-binding: none;
 }
 %endif
 
 panelmultiview {
   -moz-box-align: start;
 }
 
 panelmultiview[transitioning] {
--- a/browser/base/content/test/performance/browser_startup.js
+++ b/browser/base/content/test/performance/browser_startup.js
@@ -152,33 +152,32 @@ add_task(async function() {
        "the startup recorder component shouldn't exist in this non-nightly/non-devedition/" +
        "non-debug build.");
     return;
   }
 
   let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService().wrappedJSObject;
   await startupRecorder.done;
 
-  let loader = Cc["@mozilla.org/moz/jsloader;1"].getService(Ci.xpcIJSModuleLoader);
   let componentStacks = new Map();
   let data = Cu.cloneInto(startupRecorder.data.code, {});
   // Keep only the file name for components, as the path is an absolute file
   // URL rather than a resource:// URL like for modules.
   for (let phase in data) {
     data[phase].components =
       data[phase].components.map(uri => {
         let fileName = uri.replace(/.*\//, "");
-        componentStacks.set(fileName, loader.getComponentLoadStack(uri));
+        componentStacks.set(fileName, Cu.getComponentLoadStack(uri));
         return fileName;
       }).filter(c => c != "startupRecorder.js");
   }
 
   function printStack(scriptType, name) {
     if (scriptType == "modules")
-      info(loader.getModuleImportStack(name));
+      info(Cu.getModuleImportStack(name));
     else if (scriptType == "components")
       info(componentStacks.get(name));
   }
 
   // This block only adds debug output to help find the next bugs to file,
   // it doesn't contribute to the actual test.
   SimpleTest.requestCompleteLog();
   let previous;
--- a/browser/base/content/test/performance/browser_startup_content.js
+++ b/browser/base/content/test/performance/browser_startup_content.js
@@ -105,27 +105,26 @@ add_task(async function() {
 
   // Load a custom frame script to avoid using ContentTask which loads Task.jsm
   mm.loadFrameScript("data:text/javascript,(" + function() {
     /* eslint-env mozilla/frame-script */
     const Cm = Components.manager;
     Cm.QueryInterface(Ci.nsIServiceManager);
     ChromeUtils.import("resource://gre/modules/AppConstants.jsm");
     let collectStacks = AppConstants.NIGHTLY_BUILD || AppConstants.DEBUG;
-    let loader = Cc["@mozilla.org/moz/jsloader;1"].getService(Ci.xpcIJSModuleLoader);
     let components = {};
-    for (let component of loader.loadedComponents()) {
+    for (let component of Cu.loadedComponents()) {
       /* Keep only the file name for components, as the path is an absolute file
          URL rather than a resource:// URL like for modules. */
       components[component.replace(/.*\//, "")] =
-        collectStacks ? loader.getComponentLoadStack(component) : "";
+        collectStacks ? Cu.getComponentLoadStack(component) : "";
     }
     let modules = {};
-    for (let module of loader.loadedModules()) {
-      modules[module] = collectStacks ? loader.getModuleImportStack(module) : "";
+    for (let module of Cu.loadedModules()) {
+      modules[module] = collectStacks ? Cu.getModuleImportStack(module) : "";
     }
     let services = {};
     for (let contractID of Object.keys(Cc)) {
       try {
         if (Cm.isServiceInstantiatedByContractID(contractID, Ci.nsISupports)) {
           services[contractID] = "";
         }
       } catch (e) {}
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -204,46 +204,42 @@ var CustomizableUIInternal = {
       "sidebar-button",
     ];
 
     if (AppConstants.MOZ_DEV_EDITION) {
       navbarPlacements.splice(2, 0, "developer-button");
     }
 
     this.registerArea(CustomizableUI.AREA_NAVBAR, {
-      legacy: true,
       type: CustomizableUI.TYPE_TOOLBAR,
       overflowable: true,
       defaultPlacements: navbarPlacements,
       defaultCollapsed: false,
     }, true);
 
     if (AppConstants.MENUBAR_CAN_AUTOHIDE) {
       this.registerArea(CustomizableUI.AREA_MENUBAR, {
-        legacy: true,
         type: CustomizableUI.TYPE_TOOLBAR,
         defaultPlacements: [
           "menubar-items",
         ],
         defaultCollapsed: true,
       }, true);
     }
 
     this.registerArea(CustomizableUI.AREA_TABSTRIP, {
-      legacy: true,
       type: CustomizableUI.TYPE_TOOLBAR,
       defaultPlacements: [
         "tabbrowser-tabs",
         "new-tab-button",
         "alltabs-button",
       ],
       defaultCollapsed: null,
     }, true);
     this.registerArea(CustomizableUI.AREA_BOOKMARKS, {
-      legacy: true,
       type: CustomizableUI.TYPE_TOOLBAR,
       defaultPlacements: [
         "personal-bookmarks",
       ],
       defaultCollapsed: true,
     }, true);
 
     SearchWidgetTracker.init();
@@ -585,17 +581,17 @@ var CustomizableUIInternal = {
 
   registerArea(aName, aProperties, aInternalCaller) {
     if (typeof aName != "string" || !/^[a-z0-9-_]{1,}$/i.test(aName)) {
       throw new Error("Invalid area name");
     }
 
     let areaIsKnown = gAreas.has(aName);
     let props = areaIsKnown ? gAreas.get(aName) : new Map();
-    const kImmutableProperties = new Set(["type", "legacy", "overflowable"]);
+    const kImmutableProperties = new Set(["type", "overflowable"]);
     for (let key in aProperties) {
       if (areaIsKnown && kImmutableProperties.has(key) &&
           props.get(key) != aProperties[key]) {
         throw new Error("An area cannot change the property for '" + key + "'");
       }
       props.set(key, aProperties[key]);
     }
     // Default to a toolbar:
@@ -630,17 +626,17 @@ var CustomizableUIInternal = {
     }
 
     if (!areaIsKnown) {
       gAreas.set(aName, props);
 
       // Reconcile new default widgets. Have to do this before we start restoring things.
       this._placeNewDefaultWidgetsInArea(aName);
 
-      if (props.get("legacy") && !gPlacements.has(aName)) {
+      if (props.get("type") == CustomizableUI.TYPE_TOOLBAR && !gPlacements.has(aName)) {
         // Guarantee this area exists in gFuturePlacements, to avoid checking it in
         // various places elsewhere.
         if (!gFuturePlacements.has(aName)) {
           gFuturePlacements.set(aName, new Set());
         }
       } else {
         this.restoreStateForArea(aName);
       }
@@ -702,44 +698,29 @@ var CustomizableUIInternal = {
     let area = aToolbar.id;
     if (gBuildAreas.has(area) && gBuildAreas.get(area).has(aToolbar)) {
       return;
     }
     let areaProperties = gAreas.get(area);
 
     // If this area is not registered, try to do it automatically:
     if (!areaProperties) {
-      // If there's no default set attribute at all, we assume that we should
-      // wait for registerArea to be called:
-      if (!aToolbar.hasAttribute("defaultset")) {
-        if (!gPendingBuildAreas.has(area)) {
-          gPendingBuildAreas.set(area, new Map());
-        }
-        let pendingNodes = gPendingBuildAreas.get(area);
-        pendingNodes.set(aToolbar, aExistingChildren);
-        return;
+      if (!gPendingBuildAreas.has(area)) {
+        gPendingBuildAreas.set(area, new Map());
       }
-      let props = {type: CustomizableUI.TYPE_TOOLBAR, legacy: true};
-      let defaultsetAttribute = aToolbar.getAttribute("defaultset") || "";
-      props.defaultPlacements = defaultsetAttribute.split(",").filter(s => s);
-      this.registerArea(area, props);
-      areaProperties = gAreas.get(area);
+      let pendingNodes = gPendingBuildAreas.get(area);
+      pendingNodes.set(aToolbar, aExistingChildren);
+      return;
     }
 
     this.beginBatchUpdate();
     try {
       let placements = gPlacements.get(area);
-      if (!placements && areaProperties.has("legacy")) {
-        let legacyState = aToolbar.getAttribute("currentset");
-        if (legacyState) {
-          legacyState = legacyState.split(",").filter(s => s);
-        }
-
-        // Manually restore the state here, so the legacy state can be converted.
-        this.restoreStateForArea(area, legacyState);
+      if (!placements && areaProperties.get("type") == CustomizableUI.TYPE_TOOLBAR) {
+        this.restoreStateForArea(area);
         placements = gPlacements.get(area);
       }
 
       // Check that the current children and the current placements match. If
       // not, mark it as dirty:
       if (aExistingChildren.length != placements.length ||
           aExistingChildren.every((id, i) => id == placements[i])) {
         gDirtyAreaCache.add(area);
@@ -758,17 +739,16 @@ var CustomizableUIInternal = {
       //    the placements array for that area.
       //
       // This notion of being "dirty" is stored in a cache which is persisted
       // in the saved state.
       if (gDirtyAreaCache.has(area)) {
         this.buildArea(area, placements, aToolbar);
       }
       this.notifyListeners("onAreaNodeRegistered", area, aToolbar.customizationTarget);
-      aToolbar.setAttribute("currentset", placements.join(","));
     } finally {
       this.endBatchUpdate();
     }
   },
 
   buildArea(aArea, aPlacements, aAreaNode) {
     let document = aAreaNode.ownerDocument;
     let window = document.defaultView;
@@ -1069,20 +1049,16 @@ var CustomizableUIInternal = {
       this.ensureButtonContextMenu(widgetNode);
       if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
         container.removeChild(widgetNode);
       } else {
         window.gNavToolbox.palette.appendChild(widgetNode);
       }
       this.notifyListeners("onWidgetAfterDOMChange", widgetNode, null, container, true);
 
-      if (isToolbar) {
-        areaNode.setAttribute("currentset", gPlacements.get(aArea).join(","));
-      }
-
       let windowCache = gSingleWrapperCache.get(window);
       if (windowCache) {
         windowCache.delete(aWidgetId);
       }
     }
     if (!gResetting) {
       this._clearPreviousUIState();
     }
@@ -1237,20 +1213,16 @@ var CustomizableUIInternal = {
 
     let areaId = aAreaNode.id;
     if (isNew) {
       this.ensureButtonContextMenu(widgetNode, aAreaNode);
     }
 
     let [insertionContainer, nextNode] = this.findInsertionPoints(widgetNode, aAreaNode);
     this.insertWidgetBefore(widgetNode, nextNode, insertionContainer, areaId);
-
-    if (gAreas.get(areaId).get("type") == CustomizableUI.TYPE_TOOLBAR) {
-      aAreaNode.setAttribute("currentset", gPlacements.get(areaId).join(","));
-    }
   },
 
   findInsertionPoints(aNode, aAreaNode) {
     let areaId = aAreaNode.id;
     let props = gAreas.get(areaId);
 
     // For overflowable toolbars, rely on them (because the work is more complicated):
     if (props.get("type") == CustomizableUI.TYPE_TOOLBAR && props.get("overflowable")) {
@@ -2017,20 +1989,18 @@ var CustomizableUIInternal = {
     gDirtyAreaCache.add(oldPlacement.area);
 
     this.saveState();
 
     this.notifyListeners("onWidgetMoved", aWidgetId, oldPlacement.area,
                          oldPlacement.position, aPosition);
   },
 
-  // Note that this does not populate gPlacements, which is done lazily so that
-  // the legacy state can be migrated, which is only available once a browser
-  // window is openned.
-  // The panel area is an exception here, since it has no legacy state.
+  // Note that this does not populate gPlacements, which is done lazily.
+  // The panel area is an exception here.
   loadSavedState() {
     let state = Services.prefs.getCharPref(kPrefCustomizationState, "");
     if (!state) {
       log.debug("No saved state found");
       // Nothing has been customized, so silently fall back to the defaults.
       return;
     }
     try {
@@ -2052,17 +2022,17 @@ var CustomizableUIInternal = {
       gSavedState.currentVersion = 0;
     }
 
     gSeenWidgets = new Set(gSavedState.seen || []);
     gDirtyAreaCache = new Set(gSavedState.dirtyAreaCache || []);
     gNewElementCount = gSavedState.newElementCount || 0;
   },
 
-  restoreStateForArea(aArea, aLegacyState) {
+  restoreStateForArea(aArea) {
     let placementsPreexisted = gPlacements.has(aArea);
 
     this.beginBatchUpdate();
     try {
       gRestoring = true;
 
       let restored = false;
       if (placementsPreexisted) {
@@ -2080,25 +2050,16 @@ var CustomizableUIInternal = {
         log.debug("Restoring " + aArea + " from saved state");
         let placements = gSavedState.placements[aArea];
         for (let id of placements)
           this.addWidgetToArea(id, aArea);
         gDirty = false;
         restored = true;
       }
 
-      if (!restored && aLegacyState) {
-        log.debug("Restoring " + aArea + " from legacy state");
-        for (let id of aLegacyState)
-          this.addWidgetToArea(id, aArea);
-        // Don't override dirty state, to ensure legacy state is saved here and
-        // therefore only used once.
-        restored = true;
-      }
-
       if (!restored) {
         log.debug("Restoring " + aArea + " from default state");
         let defaults = gAreas.get(aArea).get("defaultPlacements");
         if (defaults) {
           for (let id of defaults)
             this.addWidgetToArea(id, aArea, null, true);
         }
         gDirty = false;
@@ -2377,17 +2338,17 @@ var CustomizableUIInternal = {
     }
   },
 
   // Returns true if the area will eventually lazily restore (but hasn't yet).
   isAreaLazy(aArea) {
     if (gPlacements.has(aArea)) {
       return false;
     }
-    return gAreas.get(aArea).has("legacy");
+    return gAreas.get(aArea).get("type") == CustomizableUI.TYPE_TOOLBAR;
   },
 
   // XXXunf Log some warnings here, when the data provided isn't up to scratch.
   normalizeWidget(aData, aSource) {
     let widget = {
       implementation: aData,
       source: aSource || CustomizableUI.SOURCE_EXTERNAL,
       instances: new Map(),
@@ -2807,61 +2768,78 @@ var CustomizableUIInternal = {
     if (existingNode) {
       return true;
     }
 
     this.insertNodeInWindow(aWidgetId, container[0], true);
     return true;
   },
 
+  _getCurrentWidgetsInContainer(container) {
+    // Get a list of all the widget IDs in this container, including any that
+    // are overflown.
+    let currentWidgets = new Set();
+    function addUnskippedChildren(parent) {
+      for (let node of parent.children) {
+        let realNode = node.localName == "toolbarpaletteitem" ? node.firstElementChild : node;
+        if (realNode.getAttribute("skipintoolbarset") != "true") {
+          currentWidgets.add(realNode.id);
+        }
+      }
+    }
+    addUnskippedChildren(container.customizationTarget);
+    if (container.getAttribute("overflowing") == "true") {
+      let overflowTarget = container.getAttribute("overflowtarget");
+      addUnskippedChildren(container.ownerDocument.getElementById(overflowTarget));
+    }
+    // Then get the sorted list of placements, and filter based on the nodes
+    // that are present. This avoids including items that don't exist (e.g. ids
+    // of add-on items that the user has uninstalled).
+    let orderedPlacements = CustomizableUI.getWidgetIdsInArea(container.id);
+    return orderedPlacements.filter(w => currentWidgets.has(w));
+  },
+
   get inDefaultState() {
     for (let [areaId, props] of gAreas) {
       let defaultPlacements = props.get("defaultPlacements");
-      // Areas without default placements (like legacy ones?) get skipped
-      if (!defaultPlacements) {
-        continue;
-      }
-
       let currentPlacements = gPlacements.get(areaId);
       // We're excluding all of the placement IDs for items that do not exist,
       // and items that have removable="false",
       // because we don't want to consider them when determining if we're
       // in the default state. This way, if an add-on introduces a widget
       // and is then uninstalled, the leftover placement doesn't cause us to
       // automatically assume that the buttons are not in the default state.
       let buildAreaNodes = gBuildAreas.get(areaId);
       if (buildAreaNodes && buildAreaNodes.size) {
         let container = [...buildAreaNodes][0];
         let removableOrDefault = (itemNodeOrItem) => {
           let item = (itemNodeOrItem && itemNodeOrItem.id) || itemNodeOrItem;
           let isRemovable = this.isWidgetRemovable(itemNodeOrItem);
           let isInDefault = defaultPlacements.includes(item);
           return isRemovable || isInDefault;
         };
-        // Toolbars have a currentSet property which also deals correctly with overflown
-        // widgets (if any) - use that instead:
+        // Toolbars need to deal with overflown widgets (if any) - so
+        // specialcase them:
         if (props.get("type") == CustomizableUI.TYPE_TOOLBAR) {
-          let currentSet = container.currentSet;
-          currentPlacements = currentSet ? currentSet.split(",") : [];
-          currentPlacements = currentPlacements.filter(removableOrDefault);
+          currentPlacements =
+            this._getCurrentWidgetsInContainer(container).filter(removableOrDefault);
         } else {
-          // Clone the array so we don't modify the actual placements...
-          currentPlacements = [...currentPlacements];
           currentPlacements = currentPlacements.filter((item) => {
             let itemNode = container.getElementsByAttribute("id", item)[0];
             return itemNode && removableOrDefault(itemNode || item);
           });
         }
 
         if (props.get("type") == CustomizableUI.TYPE_TOOLBAR) {
           let attribute = container.getAttribute("type") == "menubar" ? "autohide" : "collapsed";
           let collapsed = container.getAttribute(attribute) == "true";
           let defaultCollapsed = props.get("defaultCollapsed");
           if (defaultCollapsed !== null && collapsed != defaultCollapsed) {
-            log.debug("Found " + areaId + " had non-default toolbar visibility (expected " + defaultCollapsed + ", was " + collapsed + ")");
+            log.debug("Found " + areaId + " had non-default toolbar visibility" +
+                      "(expected " + defaultCollapsed + ", was " + collapsed + ")");
             return false;
           }
         }
       }
       log.debug("Checking default state for " + areaId + ":\n" + currentPlacements.join(",") +
                 "\nvs.\n" + defaultPlacements.join(","));
 
       if (currentPlacements.length != defaultPlacements.length) {
@@ -3113,18 +3091,16 @@ var CustomizableUI = {
    * @param aName   the name of the area to register. Can only contain
    *                alphanumeric characters, dashes (-) and underscores (_).
    * @param aProps  the properties of the area. The following properties are
    *                recognized:
    *                - type:   the type of area. Either TYPE_TOOLBAR (default) or
    *                          TYPE_MENU_PANEL;
    *                - anchor: for a menu panel or overflowable toolbar, the
    *                          anchoring node for the panel.
-   *                - legacy: set to true if you want customizableui to
-   *                          automatically migrate the currentset attribute
    *                - overflowable: set to true if your toolbar is overflowable.
    *                                This requires an anchor, and only has an
    *                                effect for toolbars.
    *                - defaultPlacements: an array of widget IDs making up the
    *                                     default contents of the area
    *                - defaultCollapsed: (INTERNAL ONLY) applies if the type is TYPE_TOOLBAR, specifies
    *                                    if toolbar is collapsed by default (default to true).
    *                                    Specify null to ensure that reset/inDefaultArea don't care
@@ -3137,19 +3113,17 @@ var CustomizableUI = {
    * Register a concrete node for a registered area. This method is automatically
    * called from any toolbar in the main browser window that has its
    * "customizable" attribute set to true. There should normally be no need to
    * call it yourself.
    *
    * Note that ideally, you should register your toolbar using registerArea
    * before any of the toolbars have their XBL bindings constructed (which
    * will happen when they're added to the DOM and are not hidden). If you
-   * don't, and your toolbar has a defaultset attribute, CustomizableUI will
-   * register it automatically. If your toolbar does not have a defaultset
-   * attribute, the node will be saved for processing when you call
+   * don't, the node will be saved for processing when you call
    * registerArea. Note that CustomizableUI won't restore state in the area,
    * allow the user to customize it in customize mode, or otherwise deal
    * with it, until the area has been registered.
    */
   registerToolbarNode(aToolbar, aExistingChildren) {
     CustomizableUIInternal.registerToolbarNode(aToolbar, aExistingChildren);
   },
   /**
@@ -3184,18 +3158,16 @@ var CustomizableUI = {
    */
   unregisterArea(aName, aDestroyPlacements) {
     CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
   },
   /**
    * Add a widget to an area.
    * If the area to which you try to add is not known to CustomizableUI,
    * this will throw.
-   * If the area to which you try to add has not yet been restored from its
-   * legacy state, this will postpone the addition.
    * If the area to which you try to add is the same as the area in which
    * the widget is currently placed, this will do the same as
    * moveWidgetWithinArea.
    * If the widget cannot be removed from its original location, this will
    * no-op.
    *
    * This will fire an onWidgetAdded notification,
    * and an onWidgetBeforeDOMChange and onWidgetAfterDOMChange notification
@@ -3238,21 +3210,17 @@ var CustomizableUI = {
    *                  respectively the first or last position.
    */
   moveWidgetWithinArea(aWidgetId, aPosition) {
     CustomizableUIInternal.moveWidgetWithinArea(aWidgetId, aPosition);
   },
   /**
    * Ensure a XUL-based widget created in a window after areas were
    * initialized moves to its correct position.
-   * This is roughly equivalent to manually looking up the position and using
-   * insertItem in the old API, but a lot less work for consumers.
-   * Always prefer this over using toolbar.insertItem (which might no-op
-   * because it delegates to addWidgetToArea) or, worse, moving items in the
-   * DOM yourself.
+   * Always prefer this over moving items in the DOM yourself.
    *
    * @param aWidgetId the ID of the widget that was just created
    * @param aWindow the window in which you want to ensure it was added.
    *
    * NB: why is this API per-window, you wonder? Because if you need this,
    * presumably you yourself need to create the widget in all the windows
    * and need to loop through them anyway.
    */
@@ -3469,19 +3437,18 @@ var CustomizableUI = {
    */
   getUnusedWidgets(aWindowPalette) {
     return CustomizableUIInternal.getUnusedWidgets(aWindowPalette).map(
       CustomizableUIInternal.wrapWidget,
       CustomizableUIInternal
     );
   },
   /**
-   * Get an array of all the widget IDs placed in an area. This is roughly
-   * equivalent to fetching the currentset attribute and splitting by commas
-   * in the legacy APIs. Modifying the array will not affect CustomizableUI.
+   * Get an array of all the widget IDs placed in an area.
+   * Modifying the array will not affect CustomizableUI.
    *
    * @param aArea the ID of the area whose placements you want to obtain.
    * @return an array containing the widget IDs that are in the area.
    *
    * NB: will throw if called too early (before placements have been fetched)
    *     or if the area is not currently known to CustomizableUI.
    */
   getWidgetIdsInArea(aArea) {
@@ -3494,19 +3461,18 @@ var CustomizableUI = {
 
     // We need to clone this, as we don't want to let consumers muck with placements
     return [...gPlacements.get(aArea)];
   },
   /**
    * Get an array of widget wrappers for all the widgets in an area. This is
    * the same as calling getWidgetIdsInArea and .map() ing the result through
    * CustomizableUI.getWidget. Careful: this means that if there are IDs in there
-   * which don't have corresponding DOM nodes (like in the old-style currentset
-   * attribute), there might be nulls in this array, or items for which
-   * wrapper.forWindow(win) will return null.
+   * which don't have corresponding DOM nodes, there might be nulls in this array,
+   * or items for which wrapper.forWindow(win) will return null.
    *
    * @param aArea the ID of the area whose widgets you want to obtain.
    * @return an array of widget wrappers and/or null values for the widget IDs
    *         placed in an area.
    *
    * NB: will throw if called too early (before placements have been fetched)
    *     or if the area is not currently known to CustomizableUI.
    */
--- a/browser/components/customizableui/CustomizeMode.jsm
+++ b/browser/components/customizableui/CustomizeMode.jsm
@@ -420,24 +420,16 @@ CustomizeMode.prototype = {
       customizer.hidden = true;
 
       window.gNavToolbox.removeEventListener("toolbarvisibilitychange", this);
 
       this._teardownPaletteDragging();
 
       await this._unwrapToolbarItems();
 
-      if (this._changed) {
-        // XXXmconley: At first, it seems strange to also persist the old way with
-        //             currentset - but this might actually be useful for switching
-        //             to old builds. We might want to keep this around for a little
-        //             bit.
-        this.persistCurrentSets();
-      }
-
       // And drop all area references.
       this.areas.clear();
 
       // Let everybody in this window know that we're starting to
       // exit customization mode.
       CustomizableUI.dispatchToolboxEvent("customizationending", {}, window);
 
       window.PanelUI.menuButton.disabled = false;
@@ -1060,47 +1052,32 @@ CustomizeMode.prototype = {
           }
         }
         this._removeDragHandlers(target);
       }
       this.areas.clear();
     })().catch(log.error);
   },
 
-  persistCurrentSets(aSetBeforePersisting) {
-    let document = this.document;
-    let toolbars = document.querySelectorAll("toolbar[customizable='true'][currentset]");
-    for (let toolbar of toolbars) {
-      if (aSetBeforePersisting) {
-        let set = toolbar.currentSet;
-        toolbar.setAttribute("currentset", set);
-      }
-      // Persist the currentset attribute directly on hardcoded toolbars.
-      Services.xulStore.persist(toolbar, "currentset");
-    }
-  },
-
   reset() {
     this.resetting = true;
     // Disable the reset button temporarily while resetting:
     let btn = this.$("customization-reset-button");
     btn.disabled = true;
     return (async () => {
       await this.depopulatePalette();
       await this._unwrapToolbarItems();
 
       CustomizableUI.reset();
 
       this._updateLWThemeButtonIcon();
 
       await this._wrapToolbarItems();
       this.populatePalette();
 
-      this.persistCurrentSets(true);
-
       this._updateResetButton();
       this._updateUndoResetButton();
       this._updateEmptyPaletteNotice();
       this._moveDownloadsButtonToNavBar = false;
       this.resetting = false;
       if (!this._wantToBeInCustomizeMode) {
         this.exit();
       }
@@ -1116,18 +1093,16 @@ CustomizeMode.prototype = {
 
       CustomizableUI.undoReset();
 
       this._updateLWThemeButtonIcon();
 
       await this._wrapToolbarItems();
       this.populatePalette();
 
-      this.persistCurrentSets(true);
-
       this._updateResetButton();
       this._updateUndoResetButton();
       this._updateEmptyPaletteNotice();
       this._moveDownloadsButtonToNavBar = false;
       this.resetting = false;
     })().catch(log.error);
   },
 
--- a/browser/components/customizableui/content/toolbar.xml
+++ b/browser/components/customizableui/content/toolbar.xml
@@ -31,138 +31,31 @@
 
           // pass the current set of children for comparison with placements:
           let children = Array.from(this.children)
                               .filter(node => node.getAttribute("skipintoolbarset") != "true" && node.id)
                               .map(node => node.id);
           CustomizableUI.registerToolbarNode(this, children);
       ]]></constructor>
 
-      <method name="insertItem">
-        <parameter name="aId"/>
-        <parameter name="aBeforeElt"/>
-        <parameter name="aWrapper"/>
-        <body><![CDATA[
-          if (aWrapper) {
-            Cu.reportError("Can't insert " + aId + ": using insertItem " +
-                           "no longer supports wrapper elements.");
-            return null;
-          }
-
-          // Hack, the customizable UI code makes this be the last position
-          let pos = null;
-          if (aBeforeElt) {
-            let beforeInfo = CustomizableUI.getPlacementOfWidget(aBeforeElt.id);
-            if (beforeInfo.area != this.id) {
-              Cu.reportError("Can't insert " + aId + " before " +
-                             aBeforeElt.id + " which isn't in this area (" +
-                             this.id + ").");
-              return null;
-            }
-            pos = beforeInfo.position;
-          }
-
-          CustomizableUI.addWidgetToArea(aId, this.id, pos);
-          return this.ownerDocument.getElementById(aId);
-        ]]></body>
-      </method>
-
       <property name="customizationTarget" readonly="true">
         <getter><![CDATA[
           if (this._customizationTarget)
             return this._customizationTarget;
 
           let id = this.getAttribute("customizationtarget");
           if (id)
             this._customizationTarget = document.getElementById(id);
 
-          if (this._customizationTarget)
-            this._customizationTarget.insertItem = this.insertItem.bind(this);
-          else
+          if (!this._customizationTarget)
             this._customizationTarget = this;
 
           return this._customizationTarget;
         ]]></getter>
       </property>
-
-      <property name="currentSet">
-        <getter><![CDATA[
-          let currentWidgets = new Set();
-          for (let node of this.customizationTarget.children) {
-            let realNode = node.localName == "toolbarpaletteitem" ? node.firstElementChild : node;
-            if (realNode.getAttribute("skipintoolbarset") != "true") {
-              currentWidgets.add(realNode.id);
-            }
-          }
-          if (this.getAttribute("overflowing") == "true") {
-            let overflowTarget = this.getAttribute("overflowtarget");
-            let overflowList = this.ownerDocument.getElementById(overflowTarget);
-            for (let node of overflowList.children) {
-              let realNode = node.localName == "toolbarpaletteitem" ? node.firstElementChild : node;
-              if (realNode.getAttribute("skipintoolbarset") != "true") {
-                currentWidgets.add(realNode.id);
-              }
-            }
-          }
-          let orderedPlacements = CustomizableUI.getWidgetIdsInArea(this.id);
-          return orderedPlacements.filter(w => currentWidgets.has(w)).join(",");
-        ]]></getter>
-        <setter><![CDATA[
-          // Get list of new and old ids:
-          let newVal = (val || "").split(",").filter(x => x);
-          let oldIds = CustomizableUI.getWidgetIdsInArea(this.id);
-
-          // Get a list of items only in the new list
-          let newIds = newVal.filter(id => !oldIds.includes(id));
-          CustomizableUI.beginBatchUpdate();
-          try {
-            for (let newId of newIds) {
-              oldIds = CustomizableUI.getWidgetIdsInArea(this.id);
-              let nextId = newId;
-              let pos;
-              do {
-                // Get the next item
-                nextId = newVal[newVal.indexOf(nextId) + 1];
-                // Figure out where it is in the old list
-                pos = oldIds.indexOf(nextId);
-                // If it's not in the old list, repeat:
-              } while (pos == -1 && nextId);
-              if (pos == -1) {
-                pos = null; // We didn't find anything, insert at the end
-              }
-              CustomizableUI.addWidgetToArea(newId, this.id, pos);
-            }
-
-            let currentIds = this.currentSet.split(",");
-            let removedIds = currentIds.filter(id => !newIds.includes(id) && !newVal.includes(id));
-            for (let removedId of removedIds) {
-              CustomizableUI.removeWidgetFromArea(removedId);
-            }
-          } finally {
-            CustomizableUI.endBatchUpdate();
-          }
-        ]]></setter>
-      </property>
-
-
-    </implementation>
-  </binding>
-
-  <binding id="toolbar-menubar-stub">
-    <implementation>
-      <property name="currentSet" readonly="true">
-        <getter><![CDATA[
-          return this.getAttribute("defaultset");
-        ]]></getter>
-      </property>
-      <method name="insertItem">
-        <body><![CDATA[
-          return null;
-        ]]></body>
-      </method>
     </implementation>
   </binding>
 
   <!-- The toolbar-drag binding is almost a verbatim copy of its toolkit counterpart,
        but it inherits from the customizableui's toolbar binding instead of toolkit's.
        This functionality will move into CustomizableUI proper as part of our move
        away from XBL. -->
   <binding id="toolbar-drag"
--- a/browser/components/customizableui/test/browser.ini
+++ b/browser/components/customizableui/test/browser.ini
@@ -15,18 +15,16 @@ support-files =
 skip-if = os == "linux" || verify
 [browser_885052_customize_mode_observers_disabed.js]
 tags = fullscreen
 # Bug 951403 - Disabled on OSX for frequent failures
 skip-if = os == "mac"
 
 [browser_885530_showInPrivateBrowsing.js]
 [browser_886323_buildArea_removable_nodes.js]
-[browser_887438_currentset_shim.js]
-[browser_888817_currentset_updating.js]
 [browser_890262_destroyWidget_after_add_to_panel.js]
 [browser_892955_isWidgetRemovable_for_removed_widgets.js]
 [browser_892956_destroyWidget_defaultPlacements.js]
 [browser_909779_overflow_toolbars_new_window.js]
 skip-if = os == "linux"
 
 [browser_901207_searchbar_in_panel.js]
 [browser_913972_currentset_overflow.js]
deleted file mode 100644
--- a/browser/components/customizableui/test/browser_887438_currentset_shim.js
+++ /dev/null
@@ -1,75 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-var navbar = document.getElementById("nav-bar");
-var navbarCT = navbar.customizationTarget;
-var overflowPanelList = document.getElementById("widget-overflow-list");
-
-// Reading currentset
-add_task(function() {
-  let nodeIds = [];
-  for (let node of navbarCT.children) {
-    if (node.getAttribute("skipintoolbarset") != "true") {
-      nodeIds.push(node.id);
-    }
-  }
-  for (let node of overflowPanelList.children) {
-    if (node.getAttribute("skipintoolbarset") != "true") {
-      nodeIds.push(node.id);
-    }
-  }
-  let currentSet = navbar.currentSet;
-  is(currentSet.split(",").length, nodeIds.length, "Should be just as many nodes as there are.");
-  is(currentSet, nodeIds.join(","), "Current set and node IDs should match.");
-});
-
-// Insert, then remove items
-add_task(function() {
-  let currentSet = navbar.currentSet;
-  let newCurrentSet = currentSet.replace("home-button", "new-window-button,sync-button,home-button");
-  navbar.currentSet = newCurrentSet;
-  is(newCurrentSet, navbar.currentSet, "Current set should match expected current set.");
-  let feedBtn = document.getElementById("new-window-button");
-  let syncBtn = document.getElementById("sync-button");
-  ok(feedBtn, "Feed button should have been added.");
-  ok(syncBtn, "Sync button should have been added.");
-  if (feedBtn && syncBtn) {
-    let feedParent = feedBtn.parentNode;
-    let syncParent = syncBtn.parentNode;
-    ok(feedParent == navbarCT || feedParent == overflowPanelList,
-       "Feed button should be in navbar or overflow");
-    ok(syncParent == navbarCT || syncParent == overflowPanelList,
-       "Feed button should be in navbar or overflow");
-    is(feedBtn.nextElementSibling, syncBtn, "Feed button should be next to sync button.");
-    let homeBtn = document.getElementById("home-button");
-    is(syncBtn.nextElementSibling, homeBtn, "Sync button should be next to home button.");
-  }
-  navbar.currentSet = currentSet;
-  is(currentSet, navbar.currentSet, "Should be able to remove the added items.");
-});
-
-// Simultaneous insert/remove:
-add_task(function() {
-  let currentSet = navbar.currentSet;
-  let newCurrentSet = currentSet.replace("home-button", "new-window-button");
-  navbar.currentSet = newCurrentSet;
-  is(newCurrentSet, navbar.currentSet, "Current set should match expected current set.");
-  let feedBtn = document.getElementById("new-window-button");
-  ok(feedBtn, "Feed button should have been added.");
-  let homeBtn = document.getElementById("home-button");
-  ok(!homeBtn, "Home button should have been removed.");
-  if (feedBtn) {
-    let feedParent = feedBtn.parentNode;
-    ok(feedParent == navbarCT || feedParent == overflowPanelList,
-       "Feed button should be in navbar or overflow");
-  }
-  navbar.currentSet = currentSet;
-  is(currentSet, navbar.currentSet, "Should be able to return to original state.");
-});
-
-add_task(async function asyncCleanup() {
-  await resetCustomization();
-});
deleted file mode 100644
--- a/browser/components/customizableui/test/browser_888817_currentset_updating.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-// Adding, moving and removing items should update the relevant currentset attributes
-add_task(async function() {
-  ok(CustomizableUI.inDefaultState, "Should be in the default state when we start");
-  let personalbar = document.getElementById(CustomizableUI.AREA_BOOKMARKS);
-  setToolbarVisibility(personalbar, true);
-  ok(!CustomizableUI.inDefaultState, "Making the bookmarks toolbar visible takes it out of the default state");
-
-  let navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
-  personalbar = document.getElementById(CustomizableUI.AREA_BOOKMARKS);
-  let navbarCurrentset = navbar.getAttribute("currentset") || navbar.currentSet;
-  let personalbarCurrentset = personalbar.getAttribute("currentset") || personalbar.currentSet;
-
-  let otherWin = await openAndLoadWindow();
-  let otherNavbar = otherWin.document.getElementById(CustomizableUI.AREA_NAVBAR);
-  let otherPersonalbar = otherWin.document.getElementById(CustomizableUI.AREA_BOOKMARKS);
-
-  CustomizableUI.moveWidgetWithinArea("home-button", 0);
-  navbarCurrentset = "home-button," + navbarCurrentset.replace(",home-button", "");
-  is(navbar.getAttribute("currentset"), navbarCurrentset,
-     "Should have updated currentSet after move.");
-  is(otherNavbar.getAttribute("currentset"), navbarCurrentset,
-     "Should have updated other window's currentSet after move.");
-
-  CustomizableUI.addWidgetToArea("home-button", CustomizableUI.AREA_BOOKMARKS);
-  navbarCurrentset = navbarCurrentset.replace("home-button,", "");
-  personalbarCurrentset = personalbarCurrentset + ",home-button";
-  is(navbar.getAttribute("currentset"), navbarCurrentset,
-     "Should have updated navbar currentSet after implied remove.");
-  is(otherNavbar.getAttribute("currentset"), navbarCurrentset,
-     "Should have updated other window's navbar currentSet after implied remove.");
-  is(personalbar.getAttribute("currentset"), personalbarCurrentset,
-     "Should have updated personalbar currentSet after add.");
-  is(otherPersonalbar.getAttribute("currentset"), personalbarCurrentset,
-     "Should have updated other window's personalbar currentSet after add.");
-
-  CustomizableUI.removeWidgetFromArea("home-button");
-  personalbarCurrentset = personalbarCurrentset.replace(",home-button", "");
-  is(personalbar.getAttribute("currentset"), personalbarCurrentset,
-     "Should have updated currentSet after remove.");
-  is(otherPersonalbar.getAttribute("currentset"), personalbarCurrentset,
-     "Should have updated other window's currentSet after remove.");
-
-  await promiseWindowClosed(otherWin);
-  // Reset in asyncCleanup will put our button back for us.
-});
-
-add_task(async function asyncCleanup() {
-  let personalbar = document.getElementById(CustomizableUI.AREA_BOOKMARKS);
-  setToolbarVisibility(personalbar, false);
-  await resetCustomization();
-});
--- a/browser/components/customizableui/test/browser_890262_destroyWidget_after_add_to_panel.js
+++ b/browser/components/customizableui/test/browser_890262_destroyWidget_after_add_to_panel.js
@@ -5,34 +5,34 @@
 "use strict";
 
 const kLazyAreaId = "test-890262-lazy-area";
 const kWidget1Id  = "test-890262-widget1";
 const kWidget2Id  = "test-890262-widget2";
 
 setupArea();
 
-// Destroying a widget after defaulting it to a non-legacy area should work.
+// Destroying a widget after defaulting it to a lazy area should work.
 add_task(function() {
   CustomizableUI.createWidget({
     id: kWidget1Id,
     removable: true,
     defaultArea: kLazyAreaId,
   });
   let noError = true;
   try {
     CustomizableUI.destroyWidget(kWidget1Id);
   } catch (ex) {
     Cu.reportError(ex);
     noError = false;
   }
   ok(noError, "Shouldn't throw an exception for a widget that was created in a not-yet-constructed area");
 });
 
-// Destroying a widget after moving it to a non-legacy area should work.
+// Destroying a widget after moving it to a lazy area should work.
 add_task(function() {
   CustomizableUI.createWidget({
     id: kWidget2Id,
     removable: true,
     defaultArea: CustomizableUI.AREA_NAVBAR,
   });
 
   CustomizableUI.addWidgetToArea(kWidget2Id, kLazyAreaId);
--- a/browser/components/customizableui/test/browser_913972_currentset_overflow.js
+++ b/browser/components/customizableui/test/browser_913972_currentset_overflow.js
@@ -1,55 +1,50 @@
 /* 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/. */
 
 "use strict";
 
 var navbar = document.getElementById(CustomizableUI.AREA_NAVBAR);
 
-// Resize to a small window, resize back, shouldn't affect currentSet
+registerCleanupFunction(async function asyncCleanup() {
+  await resetCustomization();
+});
+
+// Resize to a small window, resize back, shouldn't affect default state.
 add_task(async function() {
   let originalWindowWidth = window.outerWidth;
-  let oldCurrentSet = navbar.currentSet;
   ok(!navbar.hasAttribute("overflowing"), "Should start with a non-overflowing toolbar.");
   ok(CustomizableUI.inDefaultState, "Should start in default state.");
   let oldChildCount = navbar.customizationTarget.childElementCount;
   window.resizeTo(kForceOverflowWidthPx, window.outerHeight);
   await waitForCondition(() => navbar.hasAttribute("overflowing"));
   ok(navbar.hasAttribute("overflowing"), "Should have an overflowing toolbar.");
-  is(navbar.currentSet, oldCurrentSet, "Currentset should be the same when overflowing.");
   ok(CustomizableUI.inDefaultState, "Should still be in default state when overflowing.");
   ok(navbar.customizationTarget.childElementCount < oldChildCount, "Should have fewer children.");
   window.resizeTo(originalWindowWidth, window.outerHeight);
   await waitForCondition(() => !navbar.hasAttribute("overflowing"));
   ok(!navbar.hasAttribute("overflowing"), "Should no longer have an overflowing toolbar.");
-  is(navbar.currentSet, oldCurrentSet, "Currentset should still be the same now we're no longer overflowing.");
   ok(CustomizableUI.inDefaultState, "Should still be in default state now we're no longer overflowing.");
 
   // Verify actual physical placements match those of the placement array:
   let placementCounter = 0;
   let placements = CustomizableUI.getWidgetIdsInArea(CustomizableUI.AREA_NAVBAR);
   for (let node of navbar.customizationTarget.children) {
     if (node.getAttribute("skipintoolbarset") == "true") {
       continue;
     }
     is(placements[placementCounter++], node.id, "Nodes should match after overflow");
   }
   is(placements.length, placementCounter, "Should have as many nodes as expected");
   is(navbar.customizationTarget.childElementCount, oldChildCount, "Number of nodes should match");
 });
 
-// Enter and exit customization mode, check that currentSet works
+// Enter and exit customization mode, check that default state is correct.
 add_task(async function() {
-  let oldCurrentSet = navbar.currentSet;
   ok(CustomizableUI.inDefaultState, "Should start in default state.");
   await startCustomizing();
   ok(CustomizableUI.inDefaultState, "Should be in default state in customization mode.");
-  is(navbar.currentSet, oldCurrentSet, "Currentset should be the same in customization mode.");
   await endCustomizing();
   ok(CustomizableUI.inDefaultState, "Should be in default state after customization mode.");
-  is(navbar.currentSet, oldCurrentSet, "Currentset should be the same after customization mode.");
 });
 
-add_task(async function asyncCleanup() {
-  await resetCustomization();
-});
--- a/browser/components/customizableui/test/browser_940013_registerToolbarNode_calls_registerArea.js
+++ b/browser/components/customizableui/test/browser_940013_registerToolbarNode_calls_registerArea.js
@@ -3,37 +3,16 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 const kToolbarId = "test-registerToolbarNode-toolbar";
 const kButtonId = "test-registerToolbarNode-button";
 registerCleanupFunction(cleanup);
 
-// Registering a toolbar with defaultset attribute should work
-add_task(async function() {
-  ok(CustomizableUI.inDefaultState, "Everything should be in its default state.");
-  let btn = createDummyXULButton(kButtonId);
-  let toolbar = document.createXULElement("toolbar");
-  toolbar.id = kToolbarId;
-  toolbar.setAttribute("customizable", true);
-  toolbar.setAttribute("defaultset", kButtonId);
-  gNavToolbox.appendChild(toolbar);
-  ok(CustomizableUI.areas.includes(kToolbarId),
-     "Toolbar should have been registered automatically.");
-  is(CustomizableUI.getAreaType(kToolbarId), CustomizableUI.TYPE_TOOLBAR,
-     "Area should be registered as toolbar");
-  assertAreaPlacements(kToolbarId, [kButtonId]);
-  ok(!CustomizableUI.inDefaultState, "No longer in default state after toolbar is registered and visible.");
-  CustomizableUI.unregisterArea(kToolbarId, true);
-  toolbar.remove();
-  ok(CustomizableUI.inDefaultState, "Everything should be in its default state.");
-  btn.remove();
-});
-
 // Registering a toolbar without a defaultset attribute should
 // wait for the registerArea call
 add_task(async function() {
   ok(CustomizableUI.inDefaultState, "Everything should be in its default state.");
   let btn = createDummyXULButton(kButtonId);
   let toolbar = document.createXULElement("toolbar");
   toolbar.id = kToolbarId;
   toolbar.setAttribute("customizable", true);
--- a/browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js
+++ b/browser/components/customizableui/test/browser_968565_insert_before_hidden_items.js
@@ -33,18 +33,18 @@ add_task(async function() {
 
   info("The last visible item in the nav-bar has ID: " + lastVisible.id);
 
   let hidden1 = createDummyXULButton(kHidden1Id, "You can't see me");
   let hidden2 = createDummyXULButton(kHidden2Id, "You can't see me either.");
   hidden1.hidden = hidden2.hidden = true;
 
   // Make sure we have some hidden items at the end of the nav-bar.
-  navbar.insertItem(hidden1.id);
-  navbar.insertItem(hidden2.id);
+  CustomizableUI.addWidgetToArea(kHidden1Id, "nav-bar");
+  CustomizableUI.addWidgetToArea(kHidden2Id, "nav-bar");
 
   // Drag an item and drop it onto the nav-bar customization target, but
   // not over a particular item.
   await startCustomizing();
   let homeButton = document.getElementById("home-button");
   simulateItemDrag(homeButton, navbar.customizationTarget, "end");
 
   await endCustomizing();
--- a/browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js
+++ b/browser/components/customizableui/test/browser_995164_registerArea_during_customize_mode.js
@@ -43,17 +43,17 @@ add_task(async function() {
 
   setToolbarVisibility(toolbar, true);
 
   info("Check that removing the area registration from within customize mode works");
   CustomizableUI.unregisterArea(TOOLBARID);
   ok(CustomizableUI.inDefaultState, "Now that the toolbar is no longer registered, should be in default state.");
   ok(!gCustomizeMode.areas.has(toolbar), "Toolbar shouldn't be known to customize mode.");
 
-  CustomizableUI.registerArea(TOOLBARID, {legacy: true, defaultPlacements: []});
+  CustomizableUI.registerArea(TOOLBARID, {defaultPlacements: []});
   CustomizableUI.registerToolbarNode(toolbar, []);
   ok(!CustomizableUI.inDefaultState, "Now that the toolbar is registered again, should no longer be in default state.");
   ok(gCustomizeMode.areas.has(toolbar), "Toolbar should be known to customize mode again.");
 
   button.scrollIntoView();
   simulateItemDrag(button, toolbar);
   ok(CustomizableUI.getPlacementOfWidget(kNonPlacedWidgetId), "Button moved out of palette");
   is(CustomizableUI.getPlacementOfWidget(kNonPlacedWidgetId).area, TOOLBARID, "Button's back on toolbar");
--- a/browser/components/customizableui/test/browser_996364_registerArea_different_properties.js
+++ b/browser/components/customizableui/test/browser_996364_registerArea_different_properties.js
@@ -85,28 +85,16 @@ add_task(function() {
   }
   ok(!exceptionThrown, "Changing defaultPlacements shouldn't throw an exception: " + (exceptionThrown ? exceptionThrown : "[no exception]"));
   CustomizableUI.unregisterArea("area-996899-2", true);
 });
 
 add_task(function() {
   let exceptionThrown;
   try {
-    CustomizableUI.registerArea("area-996899-3", { legacy: true });
-    CustomizableUI.registerArea("area-996899-3", { legacy: false });
-  } catch (ex) {
-    exceptionThrown = ex;
-  }
-  ok(exceptionThrown, "Changing 'legacy' should throw an exception: " + (exceptionThrown ? exceptionThrown : "[no exception]"));
-  CustomizableUI.unregisterArea("area-996899-3", true);
-});
-
-add_task(function() {
-  let exceptionThrown;
-  try {
     CustomizableUI.registerArea("area-996899-4", { overflowable: true });
     CustomizableUI.registerArea("area-996899-4", { overflowable: false });
   } catch (ex) {
     exceptionThrown = ex;
   }
   ok(exceptionThrown, "Changing 'overflowable' should throw an exception: " + (exceptionThrown ? exceptionThrown : "[no exception]"));
   CustomizableUI.unregisterArea("area-996899-4", true);
 });
--- a/browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js
+++ b/browser/components/customizableui/test/browser_bootstrapped_custom_toolbar.js
@@ -4,78 +4,71 @@
 
 "use strict";
 
 requestLongerTimeout(2);
 
 const kTestBarID = "testBar";
 const kWidgetID = "characterencoding-button";
 
-function createTestBar(aLegacy) {
+function createTestBar() {
   let testBar = document.createXULElement("toolbar");
   testBar.id = kTestBarID;
   testBar.setAttribute("customizable", "true");
   CustomizableUI.registerArea(kTestBarID, {
     type: CustomizableUI.TYPE_TOOLBAR,
-    legacy: aLegacy,
   });
   gNavToolbox.appendChild(testBar);
   return testBar;
 }
 
 /**
  * Helper function that does the following:
  *
  * 1) Creates a custom toolbar and registers it
- *    with CustomizableUI. Sets the legacy attribute
- *    of the object passed to registerArea to aLegacy.
+ *    with CustomizableUI.
  * 2) Adds the widget with ID aWidgetID to that new
  *    toolbar.
  * 3) Enters customize mode and makes sure that the
  *    widget is still in the right toolbar.
  * 4) Exits customize mode, then removes and deregisters
  *    the custom toolbar.
  * 5) Checks that the widget has no placement.
  * 6) Re-adds and re-registers a custom toolbar with the same
  *    ID and options as the first one.
  * 7) Enters customize mode and checks that the widget is
  *    properly back in the toolbar.
  * 8) Exits customize mode, removes and de-registers the
  *    toolbar, and resets the toolbars to default.
  */
-function checkRestoredPresence(aWidgetID, aLegacy) {
+function checkRestoredPresence(aWidgetID) {
   return (async function() {
-    let testBar = createTestBar(aLegacy);
+    let testBar = createTestBar();
     CustomizableUI.addWidgetToArea(aWidgetID, kTestBarID);
     let placement = CustomizableUI.getPlacementOfWidget(aWidgetID);
     is(placement.area, kTestBarID,
        "Expected " + aWidgetID + " to be in the test toolbar");
 
     CustomizableUI.unregisterArea(testBar.id);
     testBar.remove();
 
     placement = CustomizableUI.getPlacementOfWidget(aWidgetID);
     is(placement, null, "Expected " + aWidgetID + " to be in the palette");
 
-    testBar = createTestBar(aLegacy);
+    testBar = createTestBar();
 
     await startCustomizing();
     placement = CustomizableUI.getPlacementOfWidget(aWidgetID);
     is(placement.area, kTestBarID,
        "Expected " + aWidgetID + " to be in the test toolbar");
     await endCustomizing();
 
     CustomizableUI.unregisterArea(testBar.id);
     testBar.remove();
 
     await resetCustomization();
   })();
 }
 
 add_task(async function() {
-  await checkRestoredPresence("downloads-button", false);
-  await checkRestoredPresence("downloads-button", true);
+  await checkRestoredPresence("downloads-button");
+  await checkRestoredPresence("characterencoding-button");
 });
-
-add_task(async function() {
-  await checkRestoredPresence("characterencoding-button", false);
-  await checkRestoredPresence("characterencoding-button", true);
-});
--- a/browser/components/customizableui/test/browser_currentset_post_reset.js
+++ b/browser/components/customizableui/test/browser_currentset_post_reset.js
@@ -1,23 +1,24 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 function checkSpacers() {
+  let bsPass = ChromeUtils.import("resource:///modules/CustomizableUI.jsm", {});
   let navbarWidgets = CustomizableUI.getWidgetIdsInArea("nav-bar");
-  let currentSetWidgets = document.getElementById("nav-bar").currentSet.split(",");
+  let currentSetWidgets = bsPass.CustomizableUIInternal._getCurrentWidgetsInContainer(document.getElementById("nav-bar"));
   navbarWidgets = navbarWidgets.filter(w => CustomizableUI.isSpecialWidget(w));
   currentSetWidgets = currentSetWidgets.filter(w => CustomizableUI.isSpecialWidget(w));
   Assert.deepEqual(navbarWidgets, currentSetWidgets, "Should have the same 'special' widgets in currentset and placements");
 }
 
 /**
- * Check that after a reset, the currentset property correctly deals with flexible spacers.
+ * Check that after a reset, CUI's internal bookkeeping correctly deals with flexible spacers.
  */
 add_task(async function() {
   await startCustomizing();
   checkSpacers();
 
   CustomizableUI.addWidgetToArea("spring", "nav-bar", 4 /* Insert before the last extant spacer */);
   await gCustomizeMode.reset();
   checkSpacers();
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -2182,17 +2182,17 @@ BrowserGlue.prototype = {
       }
     }
   },
 
   // eslint-disable-next-line complexity
   _migrateUI: function BG__migrateUI() {
     // Use an increasing number to keep track of the current migration state.
     // Completely unrelated to the current Firefox release number.
-    const UI_VERSION = 76;
+    const UI_VERSION = 77;
     const BROWSER_DOCURL = AppConstants.BROWSER_CHROME_URL;
 
     let currentUIVersion;
     if (Services.prefs.prefHasUserValue("browser.migration.version")) {
       currentUIVersion = Services.prefs.getIntPref("browser.migration.version");
     } else {
       // This is a new profile, nothing to migrate.
       Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
@@ -2543,16 +2543,24 @@ BrowserGlue.prototype = {
       if (onboardingPrefs) {
         let onboardingPrefsArray = onboardingPrefs.getChildList("");
         for (let item of onboardingPrefsArray) {
           Services.prefs.clearUserPref("browser.onboarding." + item);
         }
       }
     }
 
+    if (currentUIVersion < 77) {
+      // Remove currentset from all the toolbars
+      let toolbars = ["nav-bar", "PersonalToolbar", "TabsToolbar", "toolbar-menubar"];
+      for (let toolbarId of toolbars) {
+        xulStore.removeValue(BROWSER_DOCURL, toolbarId, "currentset");
+      }
+    }
+
     // Update the migration version.
     Services.prefs.setIntPref("browser.migration.version", UI_VERSION);
   },
 
   _checkForDefaultBrowser() {
     // Perform default browser checking.
     if (!ShellService) {
       return;
--- a/browser/components/tests/startupRecorder.js
+++ b/browser/components/tests/startupRecorder.js
@@ -38,17 +38,16 @@ let afterPaintListener = () => {
   * loaded at each of these points.
   * The records are meant to be used by startup tests in
   * browser/base/content/test/performance
   * This component only exists in nightly and debug builds, it doesn't ship in
   * our release builds.
   */
 function startupRecorder() {
   this.wrappedJSObject = this;
-  this.loader = Cc["@mozilla.org/moz/jsloader;1"].getService(Ci.xpcIJSModuleLoader);
   this.data = {
     images: {
       "image-drawing": new Set(),
       "image-loading": new Set(),
     },
     code: {},
     prefStats: {},
   };
@@ -59,18 +58,18 @@ startupRecorder.prototype = {
 
   QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
 
   record(name) {
     if (!Services.prefs.getBoolPref("browser.startup.record", false))
       return;
 
     this.data.code[name] = {
-      components: this.loader.loadedComponents(),
-      modules: this.loader.loadedModules(),
+      components: Cu.loadedComponents(),
+      modules: Cu.loadedModules(),
       services: Object.keys(Cc).filter(c => {
         try {
           return Cm.isServiceInstantiatedByContractID(c, Ci.nsISupports);
         } catch (e) {
           return false;
         }
       }),
     };
--- a/devtools/client/aboutdebugging-new/src/components/connect/ConnectPage.js
+++ b/devtools/client/aboutdebugging-new/src/components/connect/ConnectPage.js
@@ -21,17 +21,17 @@ loader.lazyRequireGetter(this, "ADB_ADDO
 
 const ConnectSection = createFactory(require("./ConnectSection"));
 const ConnectSteps = createFactory(require("./ConnectSteps"));
 const NetworkLocationsForm = createFactory(require("./NetworkLocationsForm"));
 const NetworkLocationsList = createFactory(require("./NetworkLocationsList"));
 
 const USB_ICON_SRC = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 const WIFI_ICON_SRC = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
-const GLOBE_ICON_SRC = "chrome://devtools/skin/images/aboutdebugging-globe-icon.svg";
+const GLOBE_ICON_SRC = "chrome://devtools/skin/images/globe.svg";
 
 class ConnectPage extends PureComponent {
   static get propTypes() {
     return {
       adbAddonStatus: PropTypes.string,
       dispatch: PropTypes.func.isRequired,
       // Provided by wrapping the component with FluentReact.withLocalization.
       getString: PropTypes.func.isRequired,
--- a/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
+++ b/devtools/client/aboutdebugging-new/src/components/sidebar/Sidebar.js
@@ -14,17 +14,17 @@ const Localized = createFactory(FluentRe
 const { PAGES, RUNTIMES } = require("../../constants");
 const Types = require("../../types");
 loader.lazyRequireGetter(this, "ADB_ADDON_STATES", "devtools/shared/adb/adb-addon", true);
 
 const SidebarFixedItem = createFactory(require("./SidebarFixedItem"));
 const SidebarRuntimeItem = createFactory(require("./SidebarRuntimeItem"));
 const FIREFOX_ICON = "chrome://devtools/skin/images/aboutdebugging-firefox-logo.svg";
 const CONNECT_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
-const GLOBE_ICON = "chrome://devtools/skin/images/aboutdebugging-globe-icon.svg";
+const GLOBE_ICON = "chrome://devtools/skin/images/globe.svg";
 const USB_ICON = "chrome://devtools/skin/images/aboutdebugging-connect-icon.svg";
 
 class Sidebar extends PureComponent {
   static get propTypes() {
     return {
       adbAddonStatus: PropTypes.string,
       className: PropTypes.string,
       dispatch: PropTypes.func.isRequired,
--- a/devtools/client/aboutdebugging/aboutdebugging.css
+++ b/devtools/client/aboutdebugging/aboutdebugging.css
@@ -177,35 +177,33 @@ button {
   line-height: 1.5em;
 }
 
 .service-worker-multi-process .update-button {
   margin: 5px 0;
 }
 
 .warning {
-  background-image: url(chrome://devtools/skin/images/alerticon-warning.png);
-  background-size: 13px 12px;
   display: inline-block;
-  width: 13px;
-  height: 12px;
-  margin-inline-end: 10px;
-}
-
-@media (min-resolution: 1.1dppx) {
-  .warning {
-    background-image: url(chrome://devtools/skin/images/alerticon-warning@2x.png);
-  }
+  width: 16px;
+  height: 16px;
+  vertical-align: -2px;
+  margin-inline-end: 6px;
+  background-image: url(chrome://devtools/skin/images/alert.svg);
+  background-repeat: no-repeat;
+  background-size: cover;
+  -moz-context-properties: fill;
+  fill: #d7b600;
 }
 
 .addons-install-error .warning,
 .service-worker-multi-process .warning {
   /* The warning icon can be hard to see on red / yellow backgrounds, this turns the icon
   to a black icon. */
-  filter: brightness(0%);
+  fill: #0c0c0d;
 }
 
 .addons-options {
   flex: 1;
 }
 
 .service-worker-disabled-label,
 .addons-debugging-label,
--- a/devtools/client/accessibility/accessibility.css
+++ b/devtools/client/accessibility/accessibility.css
@@ -9,29 +9,29 @@
   --accessibility-toolbar-focus: var(--blue-50);
   --accessibility-toolbar-focus-alpha30: rgba(10, 132, 255, 0.3);
   --accessibility-full-length-minus-splitter: calc(100% - 1px);
   --accessibility-horizontal-padding: 5px;
   --accessibility-properties-item-width: calc(100% - var(--accessibility-horizontal-padding));
   --accessibility-arrow-horizontal-padding: 4px;
   --accessibility-tree-row-height: 21px;
   --accessibility-unfocused-tree-focused-node-background: var(--grey-20);
-  --accessibility-tree-focused-node-twisty-brightness: brightness(20%);
+  --accessibility-unfocused-tree-focused-node-twisty-fill: var(--theme-twisty-fill);
   --accessibility-link-color: var(--blue-60);
   --accessibility-link-color-active: var(--blue-70);
   --accessible-role-active-background-color: var(--blue-50);
   --accessible-role-active-border-color: #FFFFFFB3;
   --accessible-role-background-color: white;
   --accessible-role-border-color: #CACAD1;
   --accessible-role-color: var(--grey-60);
 }
 
 :root.theme-dark {
   --accessibility-unfocused-tree-focused-node-background: var(--grey-70);
-  --accessibility-tree-focused-node-twisty-brightness: unset;
+  --accessibility-unfocused-tree-focused-node-twisty-fill: var(--theme-twisty-selected-fill);
   --accessibility-link-color: var(--theme-highlight-blue);
   --accessibility-link-color-active: var(--blue-40);
   --accessible-role-active-background-color: var(--blue-60);
   --accessible-role-active-border-color: #FFF6;
   --accessible-role-background-color: var(--grey-80);
   --accessible-role-border-color: var(--grey-50);
   --accessible-role-color: var(--grey-40);
 }
@@ -52,22 +52,17 @@ body {
 @keyframes flash-out {
   from {
     background: var(--theme-contrast-background);
   }
 }
 
 .accessible .tree .node.focused .theme-twisty,
 .treeTable .treeRow.selected .theme-twisty {
-  background-position: -28px -14px;
-}
-
-.accessible .tree .node.focused .theme-twisty.open,
-.treeTable .treeRow.selected .theme-twisty.open {
-  background-position: -42px -14px;
+  fill: var(--theme-twisty-selected-fill);
 }
 
 .mainFrame .main-panel {
   flex: 1 1 auto;
   overflow: auto;
 }
 
 .mainFrame {
@@ -241,17 +236,17 @@ body {
   border: 0;
 }
 
 .treeTable:not(:focus) tbody:not(:focus) .treeRow.selected {
   background-color: var(--accessibility-unfocused-tree-focused-node-background);
 }
 
 .treeTable:not(:focus) tbody:not(:focus) .treeRow.selected .theme-twisty {
-  filter: var(--accessibility-tree-focused-node-twisty-brightness);
+  fill: var(--accessibility-unfocused-tree-focused-node-twisty-fill);
 }
 
 .treeTable:not(:focus) tbody:not(:focus) .treeRow.selected *,
 .treeTable:not(:focus) tbody:not(:focus) .treeRow.selected .treeLabelCell:after {
   color: inherit;
 }
 
 .treeTable:not(:focus) tbody:not(:focus) .treeRow.selected .objectBox-string {
@@ -371,17 +366,17 @@ body {
   background-color: transparent;
 }
 
 .accessible .tree:not(:focus) .node.focused {
   background-color: var(--accessibility-unfocused-tree-focused-node-background);
 }
 
 .accessible .tree:not(:focus) .node.focused .theme-twisty {
-  filter: var(--accessibility-tree-focused-node-twisty-brightness);
+  fill: var(--accessibility-unfocused-tree-focused-node-twisty-fill);
 }
 
 .accessible .tree .node:not(.focused):hover {
   background-color: var(--theme-selection-background-hover);
 }
 
 .accessible .tree:focus .node.focused {
   background-color: var(--theme-selection-background);
deleted file mode 100644
--- a/devtools/client/debugger/content/actions/breakpoints.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const promise = require("promise");
-const { asPaused } = require("../utils");
-const { PROMISE } = require("devtools/client/shared/redux/middleware/promise");
-const {
-  getSource, getBreakpoint, getBreakpoints, makeLocationId
-} = require("../queries");
-const { Task } = require("devtools/shared/task");
-
-// Because breakpoints are just simple data structures, we still need
-// a way to lookup the actual client instance to talk to the server.
-// We keep an internal database of clients based off of actor ID.
-const BREAKPOINT_CLIENT_STORE = new Map();
-
-function setBreakpointClient(actor, client) {
-  BREAKPOINT_CLIENT_STORE.set(actor, client);
-}
-
-function getBreakpointClient(actor) {
-  return BREAKPOINT_CLIENT_STORE.get(actor);
-}
-
-function enableBreakpoint(location) {
-  // Enabling is exactly the same as adding. It will use the existing
-  // breakpoint that still stored.
-  return addBreakpoint(location);
-}
-
-function _breakpointExists(state, location) {
-  const currentBp = getBreakpoint(state, location);
-  return currentBp && !currentBp.disabled;
-}
-
-function _getOrCreateBreakpoint(state, location, condition) {
-  return getBreakpoint(state, location) || { location, condition };
-}
-
-function addBreakpoint(location, condition) {
-  return (dispatch, getState) => {
-    if (_breakpointExists(getState(), location)) {
-      return;
-    }
-
-    const bp = _getOrCreateBreakpoint(getState(), location, condition);
-
-    return dispatch({
-      type: constants.ADD_BREAKPOINT,
-      breakpoint: bp,
-      condition: condition,
-      [PROMISE]: Task.spawn(function* () {
-        const sourceClient = gThreadClient.source(
-          getSource(getState(), bp.location.actor)
-        );
-        const [response, bpClient] = yield sourceClient.setBreakpoint({
-          line: bp.location.line,
-          column: bp.location.column,
-          condition: bp.condition
-        });
-        const { isPending, actualLocation } = response;
-
-        // Save the client instance
-        setBreakpointClient(bpClient.actor, bpClient);
-        let lineOrOffset = DebuggerView.editor.isWasm ? bp.location.line :
-          (actualLocation ? actualLocation.line : bp.location.line) - 1;
-        return {
-          text: DebuggerView.editor.getText(lineOrOffset).trim(),
-          isWasm: DebuggerView.editor.isWasm,
-
-          // If the breakpoint response has an "actualLocation" attached, then
-          // the original requested placement for the breakpoint wasn't
-          // accepted.
-          actualLocation: isPending ? null : actualLocation,
-          actor: bpClient.actor
-        };
-      })
-    });
-  };
-}
-
-function disableBreakpoint(location) {
-  return _removeOrDisableBreakpoint(location, true);
-}
-
-function removeBreakpoint(location) {
-  return _removeOrDisableBreakpoint(location);
-}
-
-function _removeOrDisableBreakpoint(location, isDisabled) {
-  return (dispatch, getState) => {
-    let bp = getBreakpoint(getState(), location);
-    if (!bp) {
-      throw new Error("attempt to remove breakpoint that does not exist");
-    }
-    if (bp.loading) {
-      // TODO(jwl): make this wait until the breakpoint is saved if it
-      // is still loading
-      throw new Error("attempt to remove unsaved breakpoint");
-    }
-
-    const bpClient = getBreakpointClient(bp.actor);
-    const action = {
-      type: constants.REMOVE_BREAKPOINT,
-      breakpoint: bp,
-      disabled: isDisabled
-    };
-
-    // If the breakpoint is already disabled, we don't need to remove
-    // it from the server. We just need to dispatch an action
-    // simulating a successful server request to remove it, and it
-    // will be removed completely from the state.
-    if (!bp.disabled) {
-      return dispatch(Object.assign({}, action, {
-        [PROMISE]: bpClient.remove()
-      }));
-    } else {
-      return dispatch(Object.assign({}, action, { status: "done" }));
-    }
-  };
-}
-
-function removeAllBreakpoints() {
-  return (dispatch, getState) => {
-    const breakpoints = getBreakpoints(getState());
-    const activeBreakpoints = breakpoints.filter(bp => !bp.disabled);
-    activeBreakpoints.forEach(bp => removeBreakpoint(bp.location));
-  };
-}
-
-/**
- * Update the condition of a breakpoint.
- *
- * @param object aLocation
- *        @see DebuggerController.Breakpoints.addBreakpoint
- * @param string aClients
- *        The condition to set on the breakpoint
- * @return object
- *         A promise that will be resolved with the breakpoint client
- */
-function setBreakpointCondition(location, condition) {
-  return (dispatch, getState) => {
-    const bp = getBreakpoint(getState(), location);
-    if (!bp) {
-      throw new Error("Breakpoint does not exist at the specified location");
-    }
-    if (bp.loading) {
-      // TODO(jwl): when this function is called, make sure the action
-      // creator waits for the breakpoint to exist
-      throw new Error("breakpoint must be saved");
-    }
-
-    const bpClient = getBreakpointClient(bp.actor);
-    const action = {
-      type: constants.SET_BREAKPOINT_CONDITION,
-      breakpoint: bp,
-      condition: condition
-    };
-
-    // If it's not disabled, we need to update the condition on the
-    // server. Otherwise, just dispatch a non-remote action that
-    // updates the condition locally.
-    if (!bp.disabled) {
-      return dispatch(Object.assign({}, action, {
-        [PROMISE]: Task.spawn(function* () {
-          const newClient = yield bpClient.setCondition(gThreadClient, condition);
-
-          // Remove the old instance and save the new one
-          setBreakpointClient(bpClient.actor, null);
-          setBreakpointClient(newClient.actor, newClient);
-
-          return { actor: newClient.actor };
-        })
-      }));
-    } else {
-      return dispatch(action);
-    }
-  };
-}
-
-module.exports = {
-  enableBreakpoint,
-  addBreakpoint,
-  disableBreakpoint,
-  removeBreakpoint,
-  removeAllBreakpoints,
-  setBreakpointCondition
-};
deleted file mode 100644
--- a/devtools/client/debugger/content/actions/event-listeners.js
+++ /dev/null
@@ -1,118 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const { asPaused } = require("../utils");
-const { reportException } = require("devtools/shared/DevToolsUtils");
-const { setNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
-const { Task } = require("devtools/shared/task");
-
-const FETCH_EVENT_LISTENERS_DELAY = 200; // ms
-
-function fetchEventListeners() {
-  return (dispatch, getState) => {
-    // Make sure we"re not sending a batch of closely repeated requests.
-    // This can easily happen whenever new sources are fetched.
-    setNamedTimeout("event-listeners-fetch", FETCH_EVENT_LISTENERS_DELAY, () => {
-      // In case there is still a request of listeners going on (it
-      // takes several RDP round trips right now), make sure we wait
-      // on a currently running request
-      if (getState().eventListeners.fetchingListeners) {
-        dispatch({
-          type: services.WAIT_UNTIL,
-          predicate: action => (
-            action.type === constants.FETCH_EVENT_LISTENERS &&
-            action.status === "done"
-          ),
-          run: dispatch => dispatch(fetchEventListeners())
-        });
-        return;
-      }
-
-      dispatch({
-        type: constants.FETCH_EVENT_LISTENERS,
-        status: "begin"
-      });
-
-      asPaused(gThreadClient, _getListeners).then(listeners => {
-        // Notify that event listeners were fetched and shown in the view,
-        // and callback to resume the active thread if necessary.
-        window.emit(EVENTS.EVENT_LISTENERS_FETCHED);
-
-        dispatch({
-          type: constants.FETCH_EVENT_LISTENERS,
-          status: "done",
-          listeners: listeners
-        });
-      });
-    });
-  };
-}
-
-const _getListeners = Task.async(function* () {
-  const response = yield gThreadClient.eventListeners();
-
-  // Make sure all the listeners are sorted by the event type, since
-  // they"re not guaranteed to be clustered together.
-  response.listeners.sort((a, b) => a.type > b.type ? 1 : -1);
-
-  // Add all the listeners in the debugger view event linsteners container.
-  let fetchedDefinitions = new Map();
-  let listeners = [];
-  for (let listener of response.listeners) {
-    let definitionSite;
-    if (fetchedDefinitions.has(listener.function.actor)) {
-      definitionSite = fetchedDefinitions.get(listener.function.actor);
-    } else if (listener.function.class == "Function") {
-      definitionSite = yield _getDefinitionSite(listener.function);
-      if (!definitionSite) {
-        // We don"t know where this listener comes from so don"t show it in
-        // the UI as breaking on it doesn"t work (bug 942899).
-        continue;
-      }
-
-      fetchedDefinitions.set(listener.function.actor, definitionSite);
-    }
-    listener.function.url = definitionSite;
-    listeners.push(listener);
-  }
-  fetchedDefinitions.clear();
-
-  return listeners;
-});
-
-const _getDefinitionSite = Task.async(function* (aFunction) {
-  const grip = gThreadClient.pauseGrip(aFunction);
-  let response;
-
-  try {
-    response = yield grip.getDefinitionSite();
-  }
-  catch (e) {
-    // Don't make this error fatal, because it would break the entire events pane.
-    reportException("_getDefinitionSite", e);
-    return null;
-  }
-
-  return response.source.url;
-});
-
-function updateEventBreakpoints(eventNames) {
-  return dispatch => {
-    setNamedTimeout("event-breakpoints-update", 0, () => {
-      gThreadClient.pauseOnDOMEvents(eventNames, function () {
-        // Notify that event breakpoints were added/removed on the server.
-        window.emit(EVENTS.EVENT_BREAKPOINTS_UPDATED);
-
-        dispatch({
-          type: constants.UPDATE_EVENT_BREAKPOINTS,
-          eventNames: eventNames
-        });
-      });
-    });
-  };
-}
-
-module.exports = { updateEventBreakpoints, fetchEventListeners };
deleted file mode 100644
--- a/devtools/client/debugger/content/actions/moz.build
+++ /dev/null
@@ -1,10 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DevToolsModules(
-    'breakpoints.js',
-    'event-listeners.js',
-    'sources.js'
-)
deleted file mode 100644
--- a/devtools/client/debugger/content/actions/sources.js
+++ /dev/null
@@ -1,283 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const promise = require("promise");
-const Services = require("Services");
-const { dumpn } = require("devtools/shared/DevToolsUtils");
-const { PROMISE, HISTOGRAM_ID } = require("devtools/client/shared/redux/middleware/promise");
-const { getSource, getSourceText } = require("../queries");
-const { Task } = require("devtools/shared/task");
-const Telemetry = require("devtools/client/shared/telemetry");
-
-const NEW_SOURCE_IGNORED_URLS = ["debugger eval code", "XStringBundle"];
-const FETCH_SOURCE_RESPONSE_DELAY = 200; // ms
-
-const telemetry = new Telemetry();
-
-function getSourceClient(source) {
-  return gThreadClient.source(source);
-}
-
-/**
- * Handler for the debugger client's unsolicited newSource notification.
- */
-function newSource(source) {
-  return dispatch => {
-    // Ignore bogus scripts, e.g. generated from 'clientEvaluate' packets.
-    if (NEW_SOURCE_IGNORED_URLS.includes(source.url)) {
-      return;
-    }
-
-    // Signal that a new source has been added.
-    window.emit(EVENTS.NEW_SOURCE);
-
-    return dispatch({
-      type: constants.ADD_SOURCE,
-      source: source
-    });
-  };
-}
-
-function selectSource(source, opts) {
-  return (dispatch, getState) => {
-    if (!gThreadClient) {
-      // No connection, do nothing. This happens when the debugger is
-      // shut down too fast and it tries to display a default source.
-      return;
-    }
-
-    source = getSource(getState(), source.actor);
-
-    // Make sure to start a request to load the source text.
-    dispatch(loadSourceText(source));
-
-    dispatch({
-      type: constants.SELECT_SOURCE,
-      source: source,
-      opts: opts
-    });
-  };
-}
-
-function loadSources() {
-  return {
-    type: constants.LOAD_SOURCES,
-    [PROMISE]: Task.spawn(function* () {
-      const response = yield gThreadClient.getSources();
-
-      // Top-level breakpoints may pause the entire loading process
-      // because scripts are executed as they are loaded, so the
-      // engine may pause in the middle of loading all the sources.
-      // This is relatively harmless, as individual `newSource`
-      // notifications are fired for each script and they will be
-      // added to the UI through that.
-      if (!response.sources) {
-        dumpn(
-          "Error getting sources, probably because a top-level " +
-          "breakpoint was hit while executing them"
-        );
-        return;
-      }
-
-      // Ignore bogus scripts, e.g. generated from 'clientEvaluate' packets.
-      return response.sources.filter(source => {
-        return !NEW_SOURCE_IGNORED_URLS.includes(source.url);
-      });
-    })
-  };
-}
-
-/**
- * Set the black boxed status of the given source.
- *
- * @param Object aSource
- *        The source form.
- * @param bool aBlackBoxFlag
- *        True to black box the source, false to un-black box it.
- * @returns Promise
- *          A promize that resolves to [aSource, isBlackBoxed] or rejects to
- *          [aSource, error].
- */
-function blackbox(source, shouldBlackBox) {
-  const client = getSourceClient(source);
-
-  return {
-    type: constants.BLACKBOX,
-    source: source,
-    [PROMISE]: Task.spawn(function* () {
-      yield shouldBlackBox ? client.blackBox() : client.unblackBox();
-      return {
-        isBlackBoxed: shouldBlackBox
-      };
-    })
-  };
-}
-
-/**
- * Toggle the pretty printing of a source's text. All subsequent calls to
- * |getText| will return the pretty-toggled text. Nothing will happen for
- * non-javascript files.
- *
- * @param Object aSource
- *        The source form from the RDP.
- * @returns Promise
- *          A promise that resolves to [aSource, prettyText] or rejects to
- *          [aSource, error].
- */
-function togglePrettyPrint(source) {
-  return (dispatch, getState) => {
-    const sourceClient = getSourceClient(source);
-    const wantPretty = !source.isPrettyPrinted;
-
-    return dispatch({
-      type: constants.TOGGLE_PRETTY_PRINT,
-      source: source,
-      [PROMISE]: Task.spawn(function* () {
-        let response;
-
-        // Only attempt to pretty print JavaScript sources.
-        const sourceText = getSourceText(getState(), source.actor);
-        const contentType = sourceText ? sourceText.contentType : null;
-        if (!SourceUtils.isJavaScript(source.url, contentType)) {
-          throw new Error("Can't prettify non-javascript files.");
-        }
-
-        if (wantPretty) {
-          response = yield sourceClient.prettyPrint(Prefs.editorTabSize);
-        }
-        else {
-          response = yield sourceClient.disablePrettyPrint();
-        }
-
-        // Remove the cached source AST from the Parser, to avoid getting
-        // wrong locations when searching for functions.
-        DebuggerController.Parser.clearSource(source.url);
-
-        return {
-          isPrettyPrinted: wantPretty,
-          text: response.source,
-          contentType: response.contentType
-        };
-      })
-    });
-  };
-}
-
-function loadSourceText(source) {
-  return (dispatch, getState) => {
-    // Fetch the source text only once.
-    let textInfo = getSourceText(getState(), source.actor);
-    if (textInfo) {
-      // It's already loaded or is loading
-      return promise.resolve(textInfo);
-    }
-
-    const sourceClient = getSourceClient(source);
-
-    return dispatch({
-      type: constants.LOAD_SOURCE_TEXT,
-      source: source,
-      [PROMISE]: Task.spawn(function* () {
-        let transportType = gClient.localTransport ? "_LOCAL" : "_REMOTE";
-        let histogramId = "DEVTOOLS_DEBUGGER_DISPLAY_SOURCE" + transportType + "_MS";
-
-        telemetry.start(histogramId, this);
-
-        const response = yield sourceClient.source();
-
-        telemetry.finish(histogramId, this);
-
-        // Automatically pretty print if enabled and the test is
-        // detected to be "minified"
-        if (Prefs.autoPrettyPrint &&
-            !source.isPrettyPrinted &&
-            SourceUtils.isMinified(source.actor, response.source)) {
-          dispatch(togglePrettyPrint(source));
-        }
-
-        return { text: response.source,
-                 contentType: response.contentType };
-      })
-    });
-  };
-}
-
-/**
- * Starts fetching all the sources, silently.
- *
- * @param array aUrls
- *        The urls for the sources to fetch. If fetching a source's text
- *        takes too long, it will be discarded.
- * @return object
- *         A promise that is resolved after source texts have been fetched.
- */
-function getTextForSources(actors) {
-  return (dispatch, getState) => {
-    let deferred = promise.defer();
-    let pending = new Set(actors);
-    let fetched = [];
-
-    // Can't use promise.all, because if one fetch operation is rejected, then
-    // everything is considered rejected, thus no other subsequent source will
-    // be getting fetched. We don't want that. Something like Q's allSettled
-    // would work like a charm here.
-
-    // Try to fetch as many sources as possible.
-    for (let actor of actors) {
-      let source = getSource(getState(), actor);
-      dispatch(loadSourceText(source)).then(({ text, contentType }) => {
-        onFetch([source, text, contentType]);
-      }, err => {
-        onError(source, err);
-      });
-    }
-
-    setTimeout(onTimeout, FETCH_SOURCE_RESPONSE_DELAY);
-
-    /* Called if fetching a source takes too long. */
-    function onTimeout() {
-      pending = new Set();
-      maybeFinish();
-    }
-
-    /* Called if fetching a source finishes successfully. */
-    function onFetch([aSource, aText, aContentType]) {
-      // If fetching the source has previously timed out, discard it this time.
-      if (!pending.has(aSource.actor)) {
-        return;
-      }
-      pending.delete(aSource.actor);
-      fetched.push([aSource.actor, aText, aContentType]);
-      maybeFinish();
-    }
-
-    /* Called if fetching a source failed because of an error. */
-    function onError([aSource, aError]) {
-      pending.delete(aSource.actor);
-      maybeFinish();
-    }
-
-    /* Called every time something interesting happens while fetching sources. */
-    function maybeFinish() {
-      if (pending.size == 0) {
-        // Sort the fetched sources alphabetically by their url.
-        deferred.resolve(fetched.sort(([aFirst], [aSecond]) => aFirst > aSecond));
-      }
-    }
-
-    return deferred.promise;
-  };
-}
-
-module.exports = {
-  newSource,
-  selectSource,
-  loadSources,
-  blackbox,
-  togglePrettyPrint,
-  loadSourceText,
-  getTextForSources
-};
deleted file mode 100644
--- a/devtools/client/debugger/content/constants.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-"use strict";
-
-exports.UPDATE_EVENT_BREAKPOINTS = "UPDATE_EVENT_BREAKPOINTS";
-exports.FETCH_EVENT_LISTENERS = "FETCH_EVENT_LISTENERS";
-
-exports.TOGGLE_PRETTY_PRINT = "TOGGLE_PRETTY_PRINT";
-exports.BLACKBOX = "BLACKBOX";
-
-exports.ADD_BREAKPOINT = "ADD_BREAKPOINT";
-exports.REMOVE_BREAKPOINT = "REMOVE_BREAKPOINT";
-exports.ENABLE_BREAKPOINT = "ENABLE_BREAKPOINT";
-exports.DISABLE_BREAKPOINT = "DISABLE_BREAKPOINT";
-exports.SET_BREAKPOINT_CONDITION = "SET_BREAKPOINT_CONDITION";
-
-exports.ADD_SOURCE = "ADD_SOURCE";
-exports.LOAD_SOURCES = "LOAD_SOURCES";
-exports.LOAD_SOURCE_TEXT = "LOAD_SOURCE_TEXT";
-exports.SELECT_SOURCE = "SELECT_SOURCE";
-exports.UNLOAD = "UNLOAD";
-exports.RELOAD = "RELOAD";
deleted file mode 100644
--- a/devtools/client/debugger/content/globalActions.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-"use strict";
-
-const constants = require("./constants");
-
-// Fired when the page is being unloaded, for example when it's being
-// navigated away from.
-function unload() {
-  return {
-    type: constants.UNLOAD
-  };
-}
-
-module.exports = { unload };
deleted file mode 100644
--- a/devtools/client/debugger/content/moz.build
+++ /dev/null
@@ -1,18 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DIRS += [
-    'actions',
-    'reducers',
-    'tooltip',
-    'views',
-]
-
-DevToolsModules(
-    'constants.js',
-    'globalActions.js',
-    'queries.js',
-    'utils.js'
-)
deleted file mode 100644
--- a/devtools/client/debugger/content/queries.js
+++ /dev/null
@@ -1,70 +0,0 @@
-
-function getSource(state, actor) {
-  return state.sources.sources[actor];
-}
-
-function getSources(state) {
-  return state.sources.sources;
-}
-
-function getSourceCount(state) {
-  return Object.keys(state.sources.sources).length;
-}
-
-function getSourceByURL(state, url) {
-  for (let k in state.sources.sources) {
-    const source = state.sources.sources[k];
-    if (source.url === url) {
-      return source;
-    }
-  }
-}
-
-function getSourceByActor(state, actor) {
-  for (let k in state.sources.sources) {
-    const source = state.sources.sources[k];
-    if (source.actor === actor) {
-      return source;
-    }
-  }
-}
-
-function getSelectedSource(state) {
-  return state.sources.sources[state.sources.selectedSource];
-}
-
-function getSelectedSourceOpts(state) {
-  return state.sources.selectedSourceOpts;
-}
-
-function getSourceText(state, actor) {
-  return state.sources.sourcesText[actor];
-}
-
-function getBreakpoints(state) {
-  return Object.keys(state.breakpoints.breakpoints).map(k => {
-    return state.breakpoints.breakpoints[k];
-  });
-}
-
-function getBreakpoint(state, location) {
-  return state.breakpoints.breakpoints[makeLocationId(location)];
-}
-
-function makeLocationId(location) {
-  return location.actor + ":" + location.line.toString();
-}
-
-module.exports = {
-  getSource,
-  getSources,
-  getSourceCount,
-  getSourceByURL,
-  getSourceByActor,
-  getSelectedSource,
-  getSelectedSourceOpts,
-  getSourceText,
-  getBreakpoint,
-  getBreakpoints,
-  makeLocationId
-};
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/async-requests.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const initialState = [];
-
-function update(state = initialState, action, emitChange) {
-  const { seqId } = action;
-
-  if (action.type === constants.UNLOAD) {
-    return initialState;
-  }
-  else if (seqId) {
-    let newState;
-    if (action.status === "start") {
-      newState = [...state, seqId];
-    }
-    else if (action.status === "error" || action.status === "done") {
-      newState = state.filter(id => id !== seqId);
-    }
-
-    emitChange("open-requests", newState);
-    return newState;
-  }
-
-  return state;
-}
-
-module.exports = update;
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/breakpoints.js
+++ /dev/null
@@ -1,154 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const Immutable = require("devtools/client/shared/vendor/seamless-immutable");
-const { mergeIn, setIn, deleteIn } = require("../utils");
-const { makeLocationId } = require("../queries");
-
-const initialState = Immutable({
-  breakpoints: {}
-});
-
-// Return the first argument that is a string, or null if nothing is a
-// string.
-function firstString(...args) {
-  for (var arg of args) {
-    if (typeof arg === "string") {
-      return arg;
-    }
-  }
-  return null;
-}
-
-function update(state = initialState, action, emitChange) {
-  switch (action.type) {
-    case constants.ADD_BREAKPOINT: {
-      const id = makeLocationId(action.breakpoint.location);
-
-      if (action.status === "start") {
-        const existingBp = state.breakpoints[id];
-        const bp = existingBp || Immutable(action.breakpoint);
-
-        state = setIn(state, ["breakpoints", id], bp.merge({
-          disabled: false,
-          loading: true,
-        // We want to do an OR here, but we can't because we need
-        // empty strings to be truthy, i.e. an empty string is a valid
-        // condition.
-          condition: firstString(action.condition, bp.condition)
-        }));
-
-        emitChange(existingBp ? "breakpoint-enabled" : "breakpoint-added",
-                 state.breakpoints[id]);
-        return state;
-      }
-      else if (action.status === "done") {
-        const { actor, text, isWasm } = action.value;
-        let { actualLocation } = action.value;
-
-      // If the breakpoint moved, update the map
-        if (actualLocation) {
-        // XXX Bug 1227417: The `setBreakpoint` RDP request rdp
-        // request returns an `actualLocation` field that doesn't
-        // conform to the regular { actor, line } location shape, but
-        // it has a `source` field. We should fix that.
-          actualLocation = { actor: actualLocation.source.actor,
-                           line: actualLocation.line };
-
-          state = deleteIn(state, ["breakpoints", id]);
-
-          const movedId = makeLocationId(actualLocation);
-          const currentBp = state.breakpoints[movedId] || Immutable(action.breakpoint);
-          const prevLocation = action.breakpoint.location;
-          const newBp = currentBp.merge({ location: actualLocation });
-          state = setIn(state, ["breakpoints", movedId], newBp);
-
-          emitChange("breakpoint-moved", {
-            breakpoint: newBp,
-            prevLocation: prevLocation
-          });
-        }
-
-        const finalLocation = (
-        actualLocation ? actualLocation : action.breakpoint.location
-      );
-        const finalLocationId = makeLocationId(finalLocation);
-        state = mergeIn(state, ["breakpoints", finalLocationId], {
-          disabled: false,
-          loading: false,
-          actor: actor,
-          isWasm: isWasm,
-          text: text
-        });
-        emitChange("breakpoint-updated", state.breakpoints[finalLocationId]);
-        return state;
-      }
-    else if (action.status === "error") {
-      // Remove the optimistic update
-      emitChange("breakpoint-removed", state.breakpoints[id]);
-      return deleteIn(state, ["breakpoints", id]);
-    }
-      break;
-    }
-
-    case constants.REMOVE_BREAKPOINT: {
-      if (action.status === "done") {
-        const id = makeLocationId(action.breakpoint.location);
-        const bp = state.breakpoints[id];
-
-        if (action.disabled) {
-          state = mergeIn(state, ["breakpoints", id],
-                        { loading: false, disabled: true });
-          emitChange("breakpoint-disabled", state.breakpoints[id]);
-          return state;
-        }
-
-        state = deleteIn(state, ["breakpoints", id]);
-        emitChange("breakpoint-removed", bp);
-        return state;
-      }
-      break;
-    }
-
-    case constants.SET_BREAKPOINT_CONDITION: {
-      const id = makeLocationId(action.breakpoint.location);
-      const bp = state.breakpoints[id];
-      emitChange("breakpoint-condition-updated", bp);
-
-      if (!action.status) {
-      // No status means that it wasn't a remote request. Just update
-      // the condition locally.
-        return mergeIn(state, ["breakpoints", id], {
-          condition: action.condition
-        });
-      }
-      else if (action.status === "start") {
-        return mergeIn(state, ["breakpoints", id], {
-          loading: true,
-          condition: action.condition
-        });
-      }
-    else if (action.status === "done") {
-      return mergeIn(state, ["breakpoints", id], {
-        loading: false,
-        condition: action.condition,
-        // Setting a condition creates a new breakpoint client as of
-        // now, so we need to update the actor
-        actor: action.value.actor
-      });
-    }
-    else if (action.status === "error") {
-      emitChange("breakpoint-removed", bp);
-      return deleteIn(state, ["breakpoints", id]);
-    }
-
-      break;
-    }}
-
-  return state;
-}
-
-module.exports = update;
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/event-listeners.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-
-const FETCH_EVENT_LISTENERS_DELAY = 200; // ms
-
-const initialState = {
-  activeEventNames: [],
-  listeners: [],
-  fetchingListeners: false,
-};
-
-function update(state = initialState, action, emit) {
-  switch (action.type) {
-    case constants.UPDATE_EVENT_BREAKPOINTS:
-      state.activeEventNames = action.eventNames;
-      emit("activeEventNames", state.activeEventNames);
-      break;
-    case constants.FETCH_EVENT_LISTENERS:
-      if (action.status === "begin") {
-        state.fetchingListeners = true;
-      }
-      else if (action.status === "done") {
-        state.fetchingListeners = false;
-        state.listeners = action.listeners;
-        emit("event-listeners", state.listeners);
-      }
-      break;
-  }
-
-  return state;
-}
-
-module.exports = update;
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/* 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/. */
-"use strict";
-
-const eventListeners = require("./event-listeners");
-const sources = require("./sources");
-const breakpoints = require("./breakpoints");
-const asyncRequests = require("./async-requests");
-
-module.exports = {
-  eventListeners,
-  sources,
-  breakpoints,
-  asyncRequests
-};
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/moz.build
+++ /dev/null
@@ -1,12 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DevToolsModules(
-    'async-requests.js',
-    'breakpoints.js',
-    'event-listeners.js',
-    'index.js',
-    'sources.js'
-)
deleted file mode 100644
--- a/devtools/client/debugger/content/reducers/sources.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/* 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/. */
-"use strict";
-
-const constants = require("../constants");
-const Immutable = require("devtools/client/shared/vendor/seamless-immutable");
-const { mergeIn, setIn } = require("../utils");
-
-const initialState = Immutable({
-  sources: {},
-  selectedSource: null,
-  selectedSourceOpts: null,
-  sourcesText: {}
-});
-
-function update(state = initialState, action, emitChange) {
-  switch (action.type) {
-    case constants.ADD_SOURCE:
-      emitChange("source", action.source);
-      return mergeIn(state, ["sources", action.source.actor], action.source);
-
-    case constants.LOAD_SOURCES:
-      if (action.status === "done") {
-        const sources = action.value;
-        if (!sources) {
-          return state;
-        }
-        const sourcesByActor = {};
-        sources.forEach(source => {
-          if (!state.sources[source.actor]) {
-            emitChange("source", source);
-          }
-          sourcesByActor[source.actor] = source;
-        });
-        return mergeIn(state, ["sources"], state.sources.merge(sourcesByActor));
-      }
-      break;
-
-    case constants.SELECT_SOURCE:
-      emitChange("source-selected", action.source);
-      return state.merge({
-        selectedSource: action.source.actor,
-        selectedSourceOpts: action.opts
-      });
-
-    case constants.LOAD_SOURCE_TEXT: {
-      const s = _updateText(state, action);
-      emitChange("source-text-loaded", s.sources[action.source.actor]);
-      return s;
-    }
-
-    case constants.BLACKBOX:
-      if (action.status === "done") {
-        const s = mergeIn(state,
-                        ["sources", action.source.actor, "isBlackBoxed"],
-                        action.value.isBlackBoxed);
-        emitChange("blackboxed", s.sources[action.source.actor]);
-        return s;
-      }
-      break;
-
-    case constants.TOGGLE_PRETTY_PRINT:
-      let s = state;
-      if (action.status === "error") {
-        s = mergeIn(state, ["sourcesText", action.source.actor], {
-          loading: false
-        });
-
-      // If it errored, just display the source as it was before, but
-      // only if there is existing text already. If auto-prettifying
-      // is on, the original text may still be coming in and we don't
-      // have it yet. If we try to set empty text we confuse the
-      // editor because it thinks it's already displaying the source's
-      // text and won't load the text when it actually comes in.
-        if (s.sourcesText[action.source.actor].text != null) {
-          emitChange("prettyprinted", s.sources[action.source.actor]);
-        }
-      }
-      else {
-        s = _updateText(state, action);
-      // Don't do this yet, the progress bar is still imperatively shown
-      // from the source view. We will fix in the next iteration.
-      // emitChange('source-text-loaded', s.sources[action.source.actor]);
-
-        if (action.status === "done") {
-          s = mergeIn(s,
-                    ["sources", action.source.actor, "isPrettyPrinted"],
-                    action.value.isPrettyPrinted);
-          emitChange("prettyprinted", s.sources[action.source.actor]);
-        }
-      }
-      return s;
-
-    case constants.UNLOAD:
-    // Reset the entire state to just the initial state, a blank state
-    // if you will.
-      return initialState;
-  }
-
-  return state;
-}
-
-function _updateText(state, action) {
-  const { source } = action;
-
-  if (action.status === "start") {
-    // Merge this in, don't set it. That way the previous value is
-    // still stored here, and we can retrieve it if whatever we're
-    // doing fails.
-    return mergeIn(state, ["sourcesText", source.actor], {
-      loading: true
-    });
-  }
-  else if (action.status === "error") {
-    return setIn(state, ["sourcesText", source.actor], {
-      error: action.error
-    });
-  }
-  else {
-    return setIn(state, ["sourcesText", source.actor], {
-      text: action.value.text,
-      contentType: action.value.contentType
-    });
-  }
-}
-
-module.exports = update;
deleted file mode 100644
--- a/devtools/client/debugger/content/tooltip/Tooltip.js
+++ /dev/null
@@ -1,411 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const defer = require("devtools/shared/defer");
-const EventEmitter = require("devtools/shared/event-emitter");
-const {KeyCodes} = require("devtools/client/shared/keycodes");
-const {TooltipToggle} = require("devtools/client/shared/widgets/tooltip/TooltipToggle");
-
-const XHTML_NS = "http://www.w3.org/1999/xhtml";
-const ESCAPE_KEYCODE = KeyCodes.DOM_VK_ESCAPE;
-const POPUP_EVENTS = ["shown", "hidden", "showing", "hiding"];
-
-/**
- * Tooltip widget.
- *
- * This widget is intended at any tool that may need to show rich content in the
- * form of floating panels.
- * A common use case is image previewing in the CSS rule view, but more complex
- * use cases may include color pickers, object inspection, etc...
- *
- * Tooltips are based on XUL (namely XUL arrow-type <panel>s), and therefore
- * need a XUL Document to live in.
- * This is pretty much the only requirement they have on their environment.
- *
- * The way to use a tooltip is simply by instantiating a tooltip yourself and
- * attaching some content in it, or using one of the ready-made content types.
- *
- * A convenient `startTogglingOnHover` method may avoid having to register event
- * handlers yourself if the tooltip has to be shown when hovering over a
- * specific element or group of elements (which is usually the most common case)
- */
-
-/**
- * Tooltip class.
- *
- * Basic usage:
- *   let t = new Tooltip(xulDoc);
- *   t.content = someXulContent;
- *   t.show();
- *   t.hide();
- *   t.destroy();
- *
- * Better usage:
- *   let t = new Tooltip(xulDoc);
- *   t.startTogglingOnHover(container, target => {
- *     if (<condition based on target>) {
- *       t.content = el;
- *       return true;
- *     }
- *   });
- *   t.destroy();
- *
- * @param {XULDocument} doc
- *        The XUL document hosting this tooltip
- * @param {Object} options
- *        Optional options that give options to consumers:
- *        - consumeOutsideClick {Boolean} Wether the first click outside of the
- *        tooltip should close the tooltip and be consumed or not.
- *        Defaults to false.
- *        - closeOnKeys {Array} An array of key codes that should close the
- *        tooltip. Defaults to [27] (escape key).
- *        - closeOnEvents [{emitter: {Object}, event: {String},
- *                          useCapture: {Boolean}}]
- *        Provide an optional list of emitter objects and event names here to
- *        trigger the closing of the tooltip when these events are fired by the
- *        emitters. The emitter objects should either implement
- *        on/off(event, cb) or addEventListener/removeEventListener(event, cb).
- *        Defaults to [].
- *        For instance, the following would close the tooltip whenever the
- *        toolbox selects a new tool and when a DOM node gets scrolled:
- *        new Tooltip(doc, {
- *          closeOnEvents: [
- *            {emitter: toolbox, event: "select"},
- *            {emitter: myContainer, event: "scroll", useCapture: true}
- *          ]
- *        });
- *        - noAutoFocus {Boolean} Should the focus automatically go to the panel
- *        when it opens. Defaults to true.
- *
- * Fires these events:
- * - showing : just before the tooltip shows
- * - shown : when the tooltip is shown
- * - hiding : just before the tooltip closes
- * - hidden : when the tooltip gets hidden
- * - keydown : when any key gets pressed, with keyCode
- */
-
-class Tooltip {
-  constructor(doc, {
-  consumeOutsideClick = false,
-  closeOnKeys = [ESCAPE_KEYCODE],
-  noAutoFocus = true,
-  closeOnEvents = [],
-  } = {}) {
-    EventEmitter.decorate(this);
-
-    this.defaultPosition = "before_start";
-    // px
-    this.defaultOffsetX = 0;
-    // px
-    this.defaultOffsetY = 0;
-    // px
-
-    this.doc = doc;
-    this.consumeOutsideClick = consumeOutsideClick;
-    this.closeOnKeys = closeOnKeys;
-    this.noAutoFocus = noAutoFocus;
-    this.closeOnEvents = closeOnEvents;
-
-    this.panel = this._createPanel();
-
-    // Create tooltip toggle helper and decorate the Tooltip instance with
-    // shortcut methods.
-    this._toggle = new TooltipToggle(this);
-    this.startTogglingOnHover = this._toggle.start.bind(this._toggle);
-    this.stopTogglingOnHover = this._toggle.stop.bind(this._toggle);
-
-  // Emit show/hide events when the panel does.
-    for (const eventName of POPUP_EVENTS) {
-      this["_onPopup" + eventName] = (name => {
-        return e => {
-          if (e.target === this.panel) {
-            this.emit(name);
-          }
-        };
-      })(eventName);
-      this.panel.addEventListener("popup" + eventName,
-        this["_onPopup" + eventName]);
-    }
-
-  // Listen to keydown events to close the tooltip if configured to do so
-    const win = this.doc.querySelector("window");
-    this._onKeyDown = event => {
-      if (this.panel.hidden) {
-        return;
-      }
-
-      this.emit("keydown", event.keyCode);
-      if (this.closeOnKeys.includes(event.keyCode) &&
-          this.isShown()) {
-        event.stopPropagation();
-        this.hide();
-      }
-    };
-    win.addEventListener("keydown", this._onKeyDown);
-
-  // Listen to custom emitters' events to close the tooltip
-    this.hide = this.hide.bind(this);
-    for (const {emitter, event, useCapture} of this.closeOnEvents) {
-      for (const add of ["addEventListener", "on"]) {
-        if (add in emitter) {
-          emitter[add](event, this.hide, useCapture);
-          break;
-        }
-      }
-    }
-  }
-
-  /**
-   * Show the tooltip. It might be wise to append some content first if you
-   * don't want the tooltip to be empty. You may access the content of the
-   * tooltip by setting a XUL node to t.content.
-   * @param {node} anchor
-   *        Which node should the tooltip be shown on
-   * @param {string} position [optional]
-   *        Optional tooltip position. Defaults to before_start
-   *        https://developer.mozilla.org/en-US/docs/XUL/PopupGuide/Positioning
-   * @param {number} x, y [optional]
-   *        The left and top offset coordinates, in pixels.
-   */
-  show(anchor,
-    position = this.defaultPosition,
-    x = this.defaultOffsetX,
-    y = this.defaultOffsetY) {
-    this.panel.hidden = false;
-    this.panel.openPopup(anchor, position, x, y);
-  }
-
-  /**
-   * Hide the tooltip
-   */
-  hide() {
-    this.panel.hidden = true;
-    this.panel.hidePopup();
-  }
-
-  isShown() {
-    return this.panel &&
-           this.panel.state !== "closed" &&
-           this.panel.state !== "hiding";
-  }
-
-  setSize(width, height) {
-    this.panel.sizeTo(width, height);
-  }
-
-  /**
-   * Empty the tooltip's content
-   */
-  empty() {
-    while (this.panel.hasChildNodes()) {
-      this.panel.firstChild.remove();
-    }
-  }
-
-  /**
-   * Gets this panel's visibility state.
-   * @return boolean
-   */
-  isHidden() {
-    return this.panel.state == "closed" || this.panel.state == "hiding";
-  }
-
-  /**
-   * Gets if this panel has any child nodes.
-   * @return boolean
-   */
-  isEmpty() {
-    return !this.panel.hasChildNodes();
-  }
-
-  /**
-   * Get rid of references and event listeners
-   */
-  destroy() {
-    this.hide();
-
-    for (const eventName of POPUP_EVENTS) {
-      this.panel.removeEventListener("popup" + eventName,
-        this["_onPopup" + eventName]);
-    }
-
-    const win = this.doc.querySelector("window");
-    win.removeEventListener("keydown", this._onKeyDown);
-
-    for (const {emitter, event, useCapture} of this.closeOnEvents) {
-      for (const remove of ["removeEventListener", "off"]) {
-        if (remove in emitter) {
-          emitter[remove](event, this.hide, useCapture);
-          break;
-        }
-      }
-    }
-
-    this.content = null;
-
-    this._toggle.destroy();
-
-    this.doc = null;
-
-    this.panel.remove();
-    this.panel = null;
-  }
-
-  /**
-   * Returns the outer container node (that includes the arrow etc.). Happens
-   * to be identical to this.panel here, can be different element in other
-   * Tooltip implementations.
-   */
-  get container() {
-    return this.panel;
-  }
-
-  /**
-   * Set the content of this tooltip. Will first empty the tooltip and then
-   * append the new content element.
-   * Consider using one of the set<type>Content() functions instead.
-   * @param {node} content
-   *        A node that can be appended in the tooltip XUL element
-   */
-  set content(content) {
-    if (this.content == content) {
-      return;
-    }
-
-    this.empty();
-    this.panel.removeAttribute("clamped-dimensions");
-    this.panel.removeAttribute("clamped-dimensions-no-min-height");
-    this.panel.removeAttribute("clamped-dimensions-no-max-or-min-height");
-    this.panel.removeAttribute("wide");
-
-    if (content) {
-      this.panel.appendChild(content);
-    }
-  }
-
-  get content() {
-    return this.panel.firstChild;
-  }
-
-  /**
-   * Sets some text as the content of this tooltip.
-   *
-   * @param {array} messages
-   *        A list of text messages.
-   * @param {string} messagesClass [optional]
-   *        A style class for the text messages.
-   * @param {string} containerClass [optional]
-   *        A style class for the text messages container.
-   */
-  setTextContent(
-    {
-      messages,
-      messagesClass,
-      containerClass
-    },
-    extraButtons = []) {
-    messagesClass = messagesClass || "default-tooltip-simple-text-colors";
-    containerClass = containerClass || "default-tooltip-simple-text-colors";
-
-    const vbox = this.doc.createXULElement("vbox");
-    vbox.className = "devtools-tooltip-simple-text-container " + containerClass;
-    vbox.setAttribute("flex", "1");
-
-    for (const text of messages) {
-      const description = this.doc.createXULElement("description");
-      description.setAttribute("flex", "1");
-      description.className = "devtools-tooltip-simple-text " + messagesClass;
-      description.textContent = text;
-      vbox.appendChild(description);
-    }
-
-    for (const { label, className, command } of extraButtons) {
-      const button = this.doc.createXULElement("button");
-      button.className = className;
-      button.setAttribute("label", label);
-      button.addEventListener("command", command);
-      vbox.appendChild(button);
-    }
-
-    this.content = vbox;
-  }
-
-  /**
-   * Load a document into an iframe, and set the iframe
-   * to be the tooltip's content.
-   *
-   * Used by tooltips that want to load their interface
-   * into an iframe from a URL.
-   *
-   * @param {string} width
-   *        Width of the iframe.
-   * @param {string} height
-   *        Height of the iframe.
-   * @param {string} url
-   *        URL of the document to load into the iframe.
-   *
-   * @return {promise} A promise which is resolved with
-   * the iframe.
-   *
-   * This function creates an iframe, loads the specified document
-   * into it, sets the tooltip's content to the iframe, and returns
-   * a promise.
-   *
-   * When the document is loaded, the function gets the content window
-   * and resolves the promise with the content window.
-   */
-  setIFrameContent({width, height}, url) {
-    const def = defer();
-
-    // Create an iframe
-    const iframe = this.doc.createElementNS(XHTML_NS, "iframe");
-    iframe.setAttribute("transparent", true);
-    iframe.setAttribute("width", width);
-    iframe.setAttribute("height", height);
-    iframe.setAttribute("flex", "1");
-    iframe.setAttribute("tooltip", "aHTMLTooltip");
-    iframe.setAttribute("class", "devtools-tooltip-iframe");
-
-    // Wait for the load to initialize the widget
-    function onLoad() {
-      iframe.removeEventListener("load", onLoad, true);
-      def.resolve(iframe);
-    }
-    iframe.addEventListener("load", onLoad, true);
-
-    // load the document from url into the iframe
-    iframe.setAttribute("src", url);
-
-    // Put the iframe in the tooltip
-    this.content = iframe;
-
-    return def.promise;
-  }
-
-  /**
-   * Create the tooltip panel
-   */
-  _createPanel() {
-    const panel = this.doc.createXULElement("panel");
-    panel.setAttribute("hidden", true);
-    panel.setAttribute("ignorekeys", true);
-    panel.setAttribute("animate", false);
-
-    panel.setAttribute("consumeoutsideclicks",
-                       this.consumeOutsideClick);
-    panel.setAttribute("noautofocus", this.noAutoFocus);
-    panel.setAttribute("type", "arrow");
-    panel.setAttribute("level", "top");
-
-    panel.setAttribute("class", "devtools-tooltip theme-tooltip-panel");
-    this.doc.querySelector("window").appendChild(panel);
-
-    return panel;
-  }
-}
-
-module.exports = Tooltip;
deleted file mode 100644
--- a/devtools/client/debugger/content/tooltip/VariableContentHelper.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-
-"use strict";
-
-const ChromeUtils = require("ChromeUtils");
-
-ChromeUtils.defineModuleGetter(this, "VariablesView",
-  "resource://devtools/client/shared/widgets/VariablesView.jsm");
-ChromeUtils.defineModuleGetter(this, "VariablesViewController",
-  "resource://devtools/client/shared/widgets/VariablesViewController.jsm");
-
-/**
- * Fill the tooltip with a variables view, inspecting an object via its
- * corresponding object actor, as specified in the remote debugging protocol.
- *
- * @param {Tooltip} tooltip
- *        The tooltip to use
- * @param {object} objectActor
- *        The value grip for the object actor.
- * @param {object} viewOptions [optional]
- *        Options for the variables view visualization.
- * @param {object} controllerOptions [optional]
- *        Options for the variables view controller.
- * @param {object} relayEvents [optional]
- *        A collection of events to listen on the variables view widget.
- *        For example, { fetched: () => ... }
- * @param {array} extraButtons [optional]
- *        An array of extra buttons to add.  Each element of the array
- *        should be of the form {label, className, command}.
- * @param {Toolbox} toolbox [optional]
- *        Pass the instance of the current toolbox if you want the variables
- *        view widget to allow highlighting and selection of DOM nodes
- */
-
-function setTooltipVariableContent(tooltip, objectActor,
-                                   viewOptions = {}, controllerOptions = {},
-                                   relayEvents = {}, extraButtons = [],
-                                   toolbox = null) {
-  const doc = tooltip.doc;
-  const vbox = doc.createXULElement("vbox");
-  vbox.className = "devtools-tooltip-variables-view-box";
-  vbox.setAttribute("flex", "1");
-
-  const innerbox = doc.createXULElement("vbox");
-  innerbox.className = "devtools-tooltip-variables-view-innerbox";
-  innerbox.setAttribute("flex", "1");
-  vbox.appendChild(innerbox);
-
-  for (const { label, className, command } of extraButtons) {
-    const button = doc.createXULElement("button");
-    button.className = className;
-    button.setAttribute("label", label);
-    button.addEventListener("command", command);
-    vbox.appendChild(button);
-  }
-
-  const widget = new VariablesView(innerbox, viewOptions);
-
-  // If a toolbox was provided, link it to the vview
-  if (toolbox) {
-    widget.toolbox = toolbox;
-  }
-
-  // Analyzing state history isn't useful with transient object inspectors.
-  widget.commitHierarchy = () => {};
-
-  for (const e in relayEvents) {
-    widget.on(e, relayEvents[e]);
-  }
-  VariablesViewController.attach(widget, controllerOptions);
-
-  // Some of the view options are allowed to change between uses.
-  widget.searchPlaceholder = viewOptions.searchPlaceholder;
-  widget.searchEnabled = viewOptions.searchEnabled;
-
-  // Use the object actor's grip to display it as a variable in the widget.
-  // The controller options are allowed to change between uses.
-  widget.controller.setSingleVariable(
-    { objectActor: objectActor }, controllerOptions);
-
-  tooltip.content = vbox;
-  tooltip.panel.setAttribute("clamped-dimensions", "");
-}
-
-exports.setTooltipVariableContent = setTooltipVariableContent;
deleted file mode 100644
--- a/devtools/client/debugger/content/tooltip/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DevToolsModules(
-    'Tooltip.js',
-    'VariableContentHelper.js',
-)
deleted file mode 100644
--- a/devtools/client/debugger/content/tooltip/tooltips-old.css
+++ /dev/null
@@ -1,173 +0,0 @@
-/* vim:set ts=2 sw=2 sts=2 et: */
-/* 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/. */
-
-:root.theme-light {
-  --old-tooltip-simpletext-color: black;
-  --old-tooltip-simpletext-border: #d9e1e8;
-  --old-tooltip-arrow-vertical: url("chrome://devtools/skin/tooltip/arrow-vertical-light.png");
-  --old-tooltip-arrow-horizontal: url("chrome://devtools/skin/tooltip/arrow-horizontal-light.png");
-  --old-tooltip-arrow-vertical-2x: url("chrome://devtools/skin/tooltip/arrow-vertical-light@2x.png");
-  --old-tooltip-arrow-horizontal-2x: url("chrome://devtools/skin/tooltip/arrow-horizontal-light@2x.png");
-  --old-tooltip-arrowcontent-background: rgba(255, 255, 255, .9);
-  --old-tooltip-arrowcontent-border: #d9e1e8;
-}
-
-:root.theme-dark {
-  --old-tooltip-simpletext-color: white;
-  --old-tooltip-simpletext-border: #434850;
-  --old-tooltip-arrow-vertical: url("chrome://devtools/skin/tooltip/arrow-vertical-dark.png");
-  --old-tooltip-arrow-horizontal: url("chrome://devtools/skin/tooltip/arrow-horizontal-dark.png");
-  --old-tooltip-arrow-vertical-2x: url("chrome://devtools/skin/tooltip/arrow-vertical-dark@2x.png");
-  --old-tooltip-arrow-horizontal-2x: url("chrome://devtools/skin/tooltip/arrow-horizontal-dark@2x.png");
-  --old-tooltip-arrowcontent-background: rgba(19, 28, 38, .9);
-  --old-tooltip-arrowcontent-border: #434850;
-}
-
-.devtools-tooltip .panel-arrowcontent {
-  padding: 4px;
-}
-
-.devtools-tooltip .panel-arrowcontainer {
-  /* Reseting the transition used when panels are shown */
-  transition: none;
-  /* Panels slide up/down/left/right when they appear using a transform.
-  Since we want to remove the transition, we don't need to transform anymore
-  plus it can interfeer by causing mouseleave events on the underlying nodes */
-  transform: none;
-}
-
-.devtools-tooltip[clamped-dimensions] {
-  min-height: 100px;
-  max-height: 400px;
-  min-width: 100px;
-  max-width: 400px;
-}
-
-.devtools-tooltip[clamped-dimensions-no-min-height] {
-  min-height: 0;
-  max-height: 400px;
-  min-width: 100px;
-  max-width: 400px;
-}
-
-.devtools-tooltip[clamped-dimensions-no-max-or-min-height] {
-  min-width: 400px;
-  max-width: 400px;
-}
-
-.devtools-tooltip[clamped-dimensions] .panel-arrowcontent,
-.devtools-tooltip[clamped-dimensions-no-min-height] .panel-arrowcontent,
-.devtools-tooltip[clamped-dimensions-no-max-or-min-height] .panel-arrowcontent {
-  overflow: hidden;
-}
-
-.devtools-tooltip[wide] {
-  max-width: 600px;
-}
-
-/* Tooltip: Simple Text */
-
-.devtools-tooltip-simple-text {
-  max-width: 400px;
-  margin: 0 -4px; /* Compensate for the .panel-arrowcontent padding. */
-  padding: 8px 12px;
-  white-space: pre-wrap;
-}
-
-.devtools-tooltip-simple-text:first-child {
-  margin-top: -4px;
-}
-
-.devtools-tooltip-simple-text:last-child {
-  margin-bottom: -4px;
-}
-
-/* Tooltip: Variables View */
-
-.devtools-tooltip-variables-view-box {
-  margin: -4px; /* Compensate for the .panel-arrowcontent padding. */
-}
-
-.devtools-tooltip-variables-view-box .variable-or-property > .title {
-  padding-inline-end: 6px;
-}
-
-.devtools-tooltip-iframe {
-  border: none;
-  background: transparent;
-}
-
-/* Overring panel arrow images to fit with our light and dark themes */
-
-.theme-tooltip-panel .devtools-tooltip-simple-text:last-child {
-  border-bottom: 0;
-}
-
-.theme-tooltip-panel .panel-arrowcontent {
-  padding: 4px;
-  background: var(--old-tooltip-arrowcontent-background);
-  border-radius: 5px;
-  box-shadow: none;
-  border: 3px solid var(--old-tooltip-arrowcontent-border);
-}
-
-/* Overring panel arrow images to fit with our light and dark themes */
-
-.theme-tooltip-panel .panel-arrow {
-  --arrow-margin: -4px;
-}
-
-:root[platform="win"] .theme-tooltip-panel .panel-arrow {
-  --arrow-margin: -7px;
-}
-
-.theme-tooltip-panel .panel-arrow[side="top"],
-.theme-tooltip-panel .panel-arrow[side="bottom"] {
-  list-style-image: var(--old-tooltip-arrow-vertical);
-  /* !important is needed to override the popup.css rules in toolkit/themes */
-  width: 39px !important;
-  height: 16px !important;
-}
-
-.theme-tooltip-panel .panel-arrow[side="left"],
-.theme-tooltip-panel .panel-arrow[side="right"] {
-  list-style-image: var(--old-tooltip-arrow-horizontal);
-  /* !important is needed to override the popup.css rules in toolkit/themes */
-  width: 16px !important;
-  height: 39px !important;
-}
-
-.theme-tooltip-panel .panel-arrow[side="top"] {
-  margin-bottom: var(--arrow-margin);
-}
-
-.theme-tooltip-panel .panel-arrow[side="bottom"] {
-  margin-top: var(--arrow-margin);
-}
-
-.theme-tooltip-panel .panel-arrow[side="left"] {
-  margin-right: var(--arrow-margin);
-}
-
-.theme-tooltip-panel .panel-arrow[side="right"] {
-  margin-left: var(--arrow-margin);
-}
-
-@media (min-resolution: 1.1dppx) {
-  .theme-tooltip-panel .panel-arrow[side="top"],
-  .theme-tooltip-panel .panel-arrow[side="bottom"] {
-    list-style-image: var(--old-tooltip-arrow-vertical-2x);
-  }
-
-  .theme-tooltip-panel .panel-arrow[side="left"],
-  .theme-tooltip-panel .panel-arrow[side="right"] {
-    list-style-image: var(--old-tooltip-arrow-horizontal-2x);
-  }
-}
-
-.theme-tooltip-panel .devtools-tooltip-simple-text {
-  color: var(--old-tooltip-simpletext-color);
-  border-bottom: 1px solid var(--old-tooltip-simpletext-border);
-}
\ No newline at end of file
deleted file mode 100644
--- a/devtools/client/debugger/content/utils.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-"use strict";
-
-const { reportException } = require("devtools/shared/DevToolsUtils");
-const { Task } = require("devtools/shared/task");
-
-function asPaused(client, func) {
-  if (client.state != "paused") {
-    return Task.spawn(function* () {
-      yield client.interrupt();
-      let result;
-
-      try {
-        result = yield func();
-      }
-      catch (e) {
-        // Try to put the debugger back in a working state by resuming
-        // it
-        yield client.resume();
-        throw e;
-      }
-
-      yield client.resume();
-      return result;
-    });
-  } else {
-    return func();
-  }
-}
-
-function handleError(err) {
-  reportException("promise", err.toString());
-}
-
-function onReducerEvents(controller, listeners, thisContext) {
-  Object.keys(listeners).forEach(name => {
-    const listener = listeners[name];
-    controller.onChange(name, payload => {
-      listener.call(thisContext, payload);
-    });
-  });
-}
-
-function _getIn(destObj, path) {
-  return path.reduce(function (acc, name) {
-    return acc[name];
-  }, destObj);
-}
-
-function mergeIn(destObj, path, value) {
-  path = [...path];
-  path.reverse();
-  var obj = path.reduce(function (acc, name) {
-    return { [name]: acc };
-  }, value);
-
-  return destObj.merge(obj, { deep: true });
-}
-
-function setIn(destObj, path, value) {
-  destObj = mergeIn(destObj, path, null);
-  return mergeIn(destObj, path, value);
-}
-
-function updateIn(destObj, path, fn) {
-  return setIn(destObj, path, fn(_getIn(destObj, path)));
-}
-
-function deleteIn(destObj, path) {
-  const objPath = path.slice(0, -1);
-  const propName = path[path.length - 1];
-  const obj = _getIn(destObj, objPath);
-  return setIn(destObj, objPath, obj.without(propName));
-}
-
-module.exports = {
-  asPaused,
-  handleError,
-  onReducerEvents,
-  mergeIn,
-  setIn,
-  updateIn,
-  deleteIn
-};
deleted file mode 100644
--- a/devtools/client/debugger/content/views/event-listeners-view.js
+++ /dev/null
@@ -1,296 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-/* import-globals-from ../../debugger-controller.js */
-
-const actions = require("../actions/event-listeners");
-const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
-const { extend } = require("devtools/shared/extend");
-const { WidgetMethods } = require("devtools/client/shared/widgets/view-helpers");
-const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
-
-/**
- * Functions handling the event listeners UI.
- */
-function EventListenersView(controller) {
-  dumpn("EventListenersView was instantiated");
-
-  this.actions = bindActionCreators(actions, controller.dispatch);
-  this.getState = () => controller.getState().eventListeners;
-
-  this._onCheck = this._onCheck.bind(this);
-  this._onClick = this._onClick.bind(this);
-
-  controller.onChange("event-listeners", this.renderListeners.bind(this));
-}
-
-EventListenersView.prototype = extend(WidgetMethods, {
-  /**
-   * Initialization function, called when the debugger is started.
-   */
-  initialize: function () {
-    dumpn("Initializing the EventListenersView");
-
-    this.widget = new SideMenuWidget(document.getElementById("event-listeners"), {
-      showItemCheckboxes: true,
-      showGroupCheckboxes: true
-    });
-
-    this.emptyText = L10N.getStr("noEventListenersText");
-    this._eventCheckboxTooltip = L10N.getStr("eventCheckboxTooltip");
-    this._onSelectorString = " " + L10N.getStr("eventOnSelector") + " ";
-    this._inSourceString = " " + L10N.getStr("eventInSource") + " ";
-    this._inNativeCodeString = L10N.getStr("eventNative");
-
-    this.widget.addEventListener("check", this._onCheck);
-    this.widget.addEventListener("click", this._onClick);
-  },
-
-  /**
-   * Destruction function, called when the debugger is closed.
-   */
-  destroy: function () {
-    dumpn("Destroying the EventListenersView");
-
-    this.widget.removeEventListener("check", this._onCheck);
-    this.widget.removeEventListener("click", this._onClick);
-  },
-
-  renderListeners: function (listeners) {
-    listeners.forEach(listener => {
-      this.addListener(listener, { staged: true });
-    });
-
-    // Flushes all the prepared events into the event listeners container.
-    this.commit();
-  },
-
-  /**
-   * Adds an event to this event listeners container.
-   *
-   * @param object aListener
-   *        The listener object coming from the active thread.
-   * @param object aOptions [optional]
-   *        Additional options for adding the source. Supported options:
-   *        - staged: true to stage the item to be appended later
-   */
-  addListener: function (aListener, aOptions = {}) {
-    let { node: { selector }, function: { url }, type } = aListener;
-    if (!type) return;
-
-    // Some listener objects may be added from plugins, thus getting
-    // translated to native code.
-    if (!url) {
-      url = this._inNativeCodeString;
-    }
-
-    // If an event item for this listener's url and type was already added,
-    // avoid polluting the view and simply increase the "targets" count.
-    let eventItem = this.getItemForPredicate(aItem =>
-      aItem.attachment.url == url &&
-      aItem.attachment.type == type);
-
-    if (eventItem) {
-      let { selectors, view: { targets } } = eventItem.attachment;
-      if (!selectors.includes(selector)) {
-        selectors.push(selector);
-        targets.setAttribute("value", L10N.getFormatStr("eventNodes", selectors.length));
-      }
-      return;
-    }
-
-    // There's no easy way of grouping event types into higher-level groups,
-    // so we need to do this by hand.
-    let is = (...args) => args.includes(type);
-    let has = str => type.includes(str);
-    let starts = str => type.startsWith(str);
-    let group;
-
-    if (starts("animation")) {
-      group = L10N.getStr("animationEvents");
-    } else if (starts("audio")) {
-      group = L10N.getStr("audioEvents");
-    } else if (is("levelchange")) {
-      group = L10N.getStr("batteryEvents");
-    } else if (is("cut", "copy", "paste")) {
-      group = L10N.getStr("clipboardEvents");
-    } else if (starts("composition")) {
-      group = L10N.getStr("compositionEvents");
-    } else if (starts("device")) {
-      group = L10N.getStr("deviceEvents");
-    } else if (is("fullscreenchange", "fullscreenerror", "orientationchange",
-      "overflow", "resize", "scroll", "underflow", "zoom")) {
-      group = L10N.getStr("displayEvents");
-    } else if (starts("drag") || starts("drop")) {
-      group = L10N.getStr("dragAndDropEvents");
-    } else if (starts("gamepad")) {
-      group = L10N.getStr("gamepadEvents");
-    } else if (is("canplay", "canplaythrough", "durationchange", "emptied",
-      "ended", "loadeddata", "loadedmetadata", "pause", "play", "playing",
-      "ratechange", "seeked", "seeking", "stalled", "suspend", "timeupdate",
-      "volumechange", "waiting")) {
-      group = L10N.getStr("mediaEvents");
-    } else if (is("blocked", "complete", "success", "upgradeneeded", "versionchange")) {
-      group = L10N.getStr("indexedDBEvents");
-    } else if (is("blur", "change", "focus", "focusin", "focusout", "invalid",
-      "reset", "select", "submit")) {
-      group = L10N.getStr("interactionEvents");
-    } else if (starts("key") || is("input")) {
-      group = L10N.getStr("keyboardEvents");
-    } else if (starts("mouse") || has("click") || is("contextmenu", "show", "wheel")) {
-      group = L10N.getStr("mouseEvents");
-    } else if (starts("DOM")) {
-      group = L10N.getStr("mutationEvents");
-    } else if (is("abort", "error", "hashchange", "load", "loadend", "loadstart",
-      "pagehide", "pageshow", "progress", "timeout", "unload", "uploadprogress",
-      "visibilitychange")) {
-      group = L10N.getStr("navigationEvents");
-    } else if (is("pointerlockchange", "pointerlockerror")) {
-      group = L10N.getStr("pointerLockEvents");
-    } else if (is("compassneedscalibration", "userproximity")) {
-      group = L10N.getStr("sensorEvents");
-    } else if (starts("storage")) {
-      group = L10N.getStr("storageEvents");
-    } else if (is("beginEvent", "endEvent", "repeatEvent")) {
-      group = L10N.getStr("timeEvents");
-    } else if (starts("touch")) {
-      group = L10N.getStr("touchEvents");
-    } else {
-      group = L10N.getStr("otherEvents");
-    }
-
-    // Create the element node for the event listener item.
-    const itemView = this._createItemView(type, selector, url);
-
-    // Event breakpoints survive target navigations. Make sure the newly
-    // inserted event item is correctly checked.
-    const activeEventNames = this.getState().activeEventNames;
-    const checkboxState = activeEventNames.includes(type);
-
-    // Append an event listener item to this container.
-    this.push([itemView.container], {
-      staged: aOptions.staged, /* stage the item to be appended later? */
-      attachment: {
-        url: url,
-        type: type,
-        view: itemView,
-        selectors: [selector],
-        group: group,
-        checkboxState: checkboxState,
-        checkboxTooltip: this._eventCheckboxTooltip
-      }
-    });
-  },
-
-  /**
-   * Gets all the event types known to this container.
-   *
-   * @return array
-   *         List of event types, for example ["load", "click"...]
-   */
-  getAllEvents: function () {
-    return this.attachments.map(e => e.type);
-  },
-
-  /**
-   * Gets the checked event types in this container.
-   *
-   * @return array
-   *         List of event types, for example ["load", "click"...]
-   */
-  getCheckedEvents: function () {
-    return this.attachments.filter(e => e.checkboxState).map(e => e.type);
-  },
-
-  /**
-   * Customization function for creating an item's UI.
-   *
-   * @param string aType
-   *        The event type, for example "click".
-   * @param string aSelector
-   *        The target element's selector.
-   * @param string url
-   *        The source url in which the event listener is located.
-   * @return object
-   *         An object containing the event listener view nodes.
-   */
-  _createItemView: function (aType, aSelector, aUrl) {
-    let container = document.createElement("hbox");
-    container.className = "dbg-event-listener";
-
-    let eventType = document.createElement("label");
-    eventType.className = "plain dbg-event-listener-type";
-    eventType.setAttribute("value", aType);
-    container.appendChild(eventType);
-
-    let typeSeparator = document.createElement("label");
-    typeSeparator.className = "plain dbg-event-listener-separator";
-    typeSeparator.setAttribute("value", this._onSelectorString);
-    container.appendChild(typeSeparator);
-
-    let eventTargets = document.createElement("label");
-    eventTargets.className = "plain dbg-event-listener-targets";
-    eventTargets.setAttribute("value", aSelector);
-    container.appendChild(eventTargets);
-
-    let selectorSeparator = document.createElement("label");
-    selectorSeparator.className = "plain dbg-event-listener-separator";
-    selectorSeparator.setAttribute("value", this._inSourceString);
-    container.appendChild(selectorSeparator);
-
-    let eventLocation = document.createElement("label");
-    eventLocation.className = "plain dbg-event-listener-location";
-    eventLocation.setAttribute("value", SourceUtils.getSourceLabel(aUrl));
-    eventLocation.setAttribute("flex", "1");
-    eventLocation.setAttribute("crop", "center");
-    container.appendChild(eventLocation);
-
-    return {
-      container: container,
-      type: eventType,
-      targets: eventTargets,
-      location: eventLocation
-    };
-  },
-
-  /**
-   * The check listener for the event listeners container.
-   */
-  _onCheck: function ({ detail: { description, checked }, target }) {
-    if (description == "item") {
-      this.getItemForElement(target).attachment.checkboxState = checked;
-
-      this.actions.updateEventBreakpoints(this.getCheckedEvents());
-      return;
-    }
-
-    // Check all the event items in this group.
-    this.items
-      .filter(e => e.attachment.group == description)
-      .forEach(e => this.callMethod("checkItem", e.target, checked));
-  },
-
-  /**
-   * The select listener for the event listeners container.
-   */
-  _onClick: function ({ target }) {
-    // Changing the checkbox state is handled by the _onCheck event. Avoid
-    // handling that again in this click event, so pass in "noSiblings"
-    // when retrieving the target's item, to ignore the checkbox.
-    let eventItem = this.getItemForElement(target, { noSiblings: true });
-    if (eventItem) {
-      let newState = eventItem.attachment.checkboxState ^= 1;
-      this.callMethod("checkItem", eventItem.target, newState);
-    }
-  },
-
-  _eventCheckboxTooltip: "",
-  _onSelectorString: "",
-  _inSourceString: "",
-  _inNativeCodeString: ""
-});
-
-module.exports = EventListenersView;
deleted file mode 100644
--- a/devtools/client/debugger/content/views/moz.build
+++ /dev/null
@@ -1,9 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-DevToolsModules(
-    'event-listeners-view.js',
-    'sources-view.js'
-)
deleted file mode 100644
--- a/devtools/client/debugger/content/views/sources-view.js
+++ /dev/null
@@ -1,1374 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-/* import-globals-from ../../debugger-controller.js */
-
-const utils = require("../utils");
-const {
-  getSelectedSource,
-  getSourceByURL,
-  getBreakpoint,
-  getBreakpoints,
-  makeLocationId
-} = require("../queries");
-const actions = Object.assign(
-  {},
-  require("../actions/sources"),
-  require("../actions/breakpoints")
-);
-const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
-const { extend } = require("devtools/shared/extend");
-const {
-  WidgetMethods,
-  setNamedTimeout
-} = require("devtools/client/shared/widgets/view-helpers");
-const { Task } = require("devtools/shared/task");
-const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
-const { gDevTools } = require("devtools/client/framework/devtools");
-const { KeyCodes } = require("devtools/client/shared/keycodes");
-loader.lazyRequireGetter(this, "openContentLink", "devtools/client/shared/link", true);
-
-const NEW_SOURCE_DISPLAY_DELAY = 200; // ms
-const FUNCTION_SEARCH_POPUP_POSITION = "topcenter bottomleft";
-const BREAKPOINT_LINE_TOOLTIP_MAX_LENGTH = 1000; // chars
-const BREAKPOINT_CONDITIONAL_POPUP_POSITION = "before_start";
-const BREAKPOINT_CONDITIONAL_POPUP_OFFSET_X = 7; // px
-const BREAKPOINT_CONDITIONAL_POPUP_OFFSET_Y = -3; // px
-
-/**
- * Functions handling the sources UI.
- */
-function SourcesView(controller, DebuggerView) {
-  dumpn("SourcesView was instantiated");
-
-  utils.onReducerEvents(controller, {
-    "source": this.renderSource,
-    "blackboxed": this.renderBlackBoxed,
-    "prettyprinted": this.updateToolbarButtonsState,
-    "source-selected": this.renderSourceSelected,
-    "breakpoint-updated": bp => this.renderBreakpoint(bp),
-    "breakpoint-enabled": bp => this.renderBreakpoint(bp),
-    "breakpoint-disabled": bp => this.renderBreakpoint(bp),
-    "breakpoint-removed": bp => this.renderBreakpoint(bp, true),
-  }, this);
-
-  this.getState = controller.getState;
-  this.actions = bindActionCreators(actions, controller.dispatch);
-  this.DebuggerView = DebuggerView;
-  this.Parser = DebuggerController.Parser;
-
-  this.togglePrettyPrint = this.togglePrettyPrint.bind(this);
-  this.toggleBlackBoxing = this.toggleBlackBoxing.bind(this);
-  this.toggleBreakpoints = this.toggleBreakpoints.bind(this);
-
-  this._onEditorCursorActivity = this._onEditorCursorActivity.bind(this);
-  this._onMouseDown = this._onMouseDown.bind(this);
-  this._onSourceSelect = this._onSourceSelect.bind(this);
-  this._onStopBlackBoxing = this._onStopBlackBoxing.bind(this);
-  this._onBreakpointRemoved = this._onBreakpointRemoved.bind(this);
-  this._onBreakpointClick = this._onBreakpointClick.bind(this);
-  this._onBreakpointCheckboxClick = this._onBreakpointCheckboxClick.bind(this);
-  this._onConditionalPopupShowing = this._onConditionalPopupShowing.bind(this);
-  this._onConditionalPopupShown = this._onConditionalPopupShown.bind(this);
-  this._onConditionalPopupHiding = this._onConditionalPopupHiding.bind(this);
-  this._onConditionalTextboxKeyPress = this._onConditionalTextboxKeyPress.bind(this);
-  this._onEditorContextMenuOpen = this._onEditorContextMenuOpen.bind(this);
-  this._onCopyUrlCommand = this._onCopyUrlCommand.bind(this);
-  this._onNewTabCommand = this._onNewTabCommand.bind(this);
-  this._onConditionalPopupHidden = this._onConditionalPopupHidden.bind(this);
-}
-
-SourcesView.prototype = extend(WidgetMethods, {
-  /**
-   * Initialization function, called when the debugger is started.
-   */
-  initialize: function (isWorker) {
-    dumpn("Initializing the SourcesView");
-
-    this.widget = new SideMenuWidget(document.getElementById("sources"), {
-      contextMenu: document.getElementById("debuggerSourcesContextMenu"),
-      showArrows: true
-    });
-
-    this._preferredSourceURL = null;
-    this._unnamedSourceIndex = 0;
-    this.emptyText = L10N.getStr("noSourcesText");
-    this._blackBoxCheckboxTooltip = L10N.getStr("blackboxCheckboxTooltip2");
-
-    this._commandset = document.getElementById("debuggerCommands");
-    this._popupset = document.getElementById("debuggerPopupset");
-    this._cmPopup = document.getElementById("sourceEditorContextMenu");
-    this._cbPanel = document.getElementById("conditional-breakpoint-panel");
-    this._cbTextbox = document.getElementById("conditional-breakpoint-panel-textbox");
-    this._blackBoxButton = document.getElementById("black-box");
-    this._stopBlackBoxButton = document.getElementById("black-boxed-message-button");
-    this._prettyPrintButton = document.getElementById("pretty-print");
-    this._toggleBreakpointsButton = document.getElementById("toggle-breakpoints");
-    this._newTabMenuItem = document.getElementById("debugger-sources-context-newtab");
-    this._copyUrlMenuItem = document.getElementById("debugger-sources-context-copyurl");
-
-    this._noResultsFoundToolTip = new Tooltip(document);
-    this._noResultsFoundToolTip.defaultPosition = FUNCTION_SEARCH_POPUP_POSITION;
-
-    // We don't show the pretty print button if debugger a worker
-    // because it simply doesn't work yet. (bug 1273730)
-    if (Prefs.prettyPrintEnabled && !isWorker) {
-      this._prettyPrintButton.removeAttribute("hidden");
-    }
-
-    this._editorContainer = document.getElementById("editor");
-    this._editorContainer.addEventListener("mousedown", this._onMouseDown);
-
-    this.widget.addEventListener("select", this._onSourceSelect);
-
-    this._stopBlackBoxButton.addEventListener("click", this._onStopBlackBoxing);
-    this._cbPanel.addEventListener("popupshowing", this._onConditionalPopupShowing);
-    this._cbPanel.addEventListener("popupshown", this._onConditionalPopupShown);
-    this._cbPanel.addEventListener("popuphiding", this._onConditionalPopupHiding);
-    this._cbPanel.addEventListener("popuphidden", this._onConditionalPopupHidden);
-    this._cbTextbox.addEventListener("keypress", this._onConditionalTextboxKeyPress);
-    this._copyUrlMenuItem.addEventListener("command", this._onCopyUrlCommand);
-    this._newTabMenuItem.addEventListener("command", this._onNewTabCommand);
-
-    this._cbPanel.hidden = true;
-    this.allowFocusOnRightClick = true;
-    this.autoFocusOnSelection = false;
-    this.autoFocusOnFirstItem = false;
-
-    // Sort the contents by the displayed label.
-    this.sortContents((aFirst, aSecond) => {
-      return +(aFirst.attachment.label.toLowerCase() >
-               aSecond.attachment.label.toLowerCase());
-    });
-
-    // Sort known source groups towards the end of the list
-    this.widget.groupSortPredicate = function (a, b) {
-      if ((a in KNOWN_SOURCE_GROUPS) == (b in KNOWN_SOURCE_GROUPS)) {
-        return a.localeCompare(b);
-      }
-      return (a in KNOWN_SOURCE_GROUPS) ? 1 : -1;
-    };
-
-    this.DebuggerView.editor.on("popupOpen", this._onEditorContextMenuOpen);
-
-    this._addCommands();
-  },
-
-  /**
-   * Destruction function, called when the debugger is closed.
-   */
-  destroy: function () {
-    dumpn("Destroying the SourcesView");
-
-    this.widget.removeEventListener("select", this._onSourceSelect);
-    this._stopBlackBoxButton.removeEventListener("click", this._onStopBlackBoxing);
-    this._cbPanel.removeEventListener("popupshowing", this._onConditionalPopupShowing);
-    this._cbPanel.removeEventListener("popupshown", this._onConditionalPopupShown);
-    this._cbPanel.removeEventListener("popuphiding", this._onConditionalPopupHiding);
-    this._cbPanel.removeEventListener("popuphidden", this._onConditionalPopupHidden);
-    this._cbTextbox.removeEventListener("keypress", this._onConditionalTextboxKeyPress);
-    this._copyUrlMenuItem.removeEventListener("command", this._onCopyUrlCommand);
-    this._newTabMenuItem.removeEventListener("command", this._onNewTabCommand);
-    this.DebuggerView.editor.off("popupOpen", this._onEditorContextMenuOpen, false);
-  },
-
-  empty: function () {
-    WidgetMethods.empty.call(this);
-    this._unnamedSourceIndex = 0;
-    this._selectedBreakpoint = null;
-  },
-
-  /**
-   * Add commands that XUL can fire.
-   */
-  _addCommands: function () {
-    XULUtils.addCommands(this._commandset, {
-      addBreakpointCommand: e => this._onCmdAddBreakpoint(e),
-      addConditionalBreakpointCommand: e => this._onCmdAddConditionalBreakpoint(e),
-      blackBoxCommand: () => this.toggleBlackBoxing(),
-      unBlackBoxButton: () => this._onStopBlackBoxing(),
-      prettyPrintCommand: () => this.togglePrettyPrint(),
-      toggleBreakpointsCommand: () =>this.toggleBreakpoints(),
-      nextSourceCommand: () => this.selectNextItem(),
-      prevSourceCommand: () => this.selectPrevItem()
-    });
-  },
-
-  /**
-   * Sets the preferred location to be selected in this sources container.
-   * @param string aUrl
-   */
-  set preferredSource(aUrl) {
-    this._preferredValue = aUrl;
-
-    // Selects the element with the specified value in this sources container,
-    // if already inserted.
-    if (this.containsValue(aUrl)) {
-      this.selectedValue = aUrl;
-    }
-  },
-
-  sourcesDidUpdate: function () {
-    if (!getSelectedSource(this.getState())) {
-      let url = this._preferredSourceURL;
-      let source = url && getSourceByURL(this.getState(), url);
-      if (source) {
-        this.actions.selectSource(source);
-      }
-      else {
-        setNamedTimeout("new-source", NEW_SOURCE_DISPLAY_DELAY, () => {
-          if (!getSelectedSource(this.getState()) && this.itemCount > 0) {
-            this.actions.selectSource(this.getItemAtIndex(0).attachment.source);
-          }
-        });
-      }
-    }
-  },
-
-  renderSource: function (source) {
-    this.addSource(source, { staged: false });
-    for (let bp of getBreakpoints(this.getState())) {
-      if (bp.location.actor === source.actor) {
-        this.renderBreakpoint(bp);
-      }
-    }
-    this.sourcesDidUpdate();
-  },
-
-  /**
-   * Adds a source to this sources container.
-   *
-   * @param object aSource
-   *        The source object coming from the active thread.
-   * @param object aOptions [optional]
-   *        Additional options for adding the source. Supported options:
-   *        - staged: true to stage the item to be appended later
-   */
-  addSource: function (aSource, aOptions = {}) {
-    if (!aSource.url && !aOptions.force) {
-      // We don't show any unnamed eval scripts yet (see bug 1124106)
-      return;
-    }
-
-    let { label, group, unicodeUrl } = this._parseUrl(aSource);
-
-    let contents = document.createElement("label");
-    contents.className = "plain dbg-source-item";
-    contents.setAttribute("value", label);
-    contents.setAttribute("crop", "start");
-    contents.setAttribute("flex", "1");
-    contents.setAttribute("tooltiptext", unicodeUrl);
-
-    if (aSource.introductionType === "wasm") {
-      const wasm = document.createElement("box");
-      wasm.className = "dbg-wasm-item";
-      const icon = document.createElement("box");
-      icon.setAttribute("tooltiptext", L10N.getStr("experimental"));
-      icon.className = "icon";
-      wasm.appendChild(icon);
-      wasm.appendChild(contents);
-
-      contents = wasm;
-    }
-
-    // If the source is blackboxed, apply the appropriate style.
-    if (gThreadClient.source(aSource).isBlackBoxed) {
-      contents.classList.add("black-boxed");
-    }
-
-    // Append a source item to this container.
-    this.push([contents, aSource.actor], {
-      staged: aOptions.staged, /* stage the item to be appended later? */
-      attachment: {
-        label: label,
-        group: group,
-        checkboxState: !aSource.isBlackBoxed,
-        checkboxTooltip: this._blackBoxCheckboxTooltip,
-        source: aSource
-      }
-    });
-  },
-
-  _parseUrl: function (aSource) {
-    let fullUrl = aSource.url;
-    let url, unicodeUrl, label, group;
-
-    if (!fullUrl) {
-      unicodeUrl = "SCRIPT" + this._unnamedSourceIndex++;
-      label = unicodeUrl;
-      group = L10N.getStr("anonymousSourcesLabel");
-    }
-    else {
-      let url = fullUrl.split(" -> ").pop();
-      label = aSource.addonPath ? aSource.addonPath : SourceUtils.getSourceLabel(url);
-      group = aSource.addonID ? aSource.addonID : SourceUtils.getSourceGroup(url);
-      unicodeUrl = NetworkHelper.convertToUnicode(unescape(fullUrl));
-    }
-
-    return {
-      label: label,
-      group: group,
-      unicodeUrl: unicodeUrl
-    };
-  },
-
-  renderBreakpoint: function (breakpoint, removed) {
-    if (removed) {
-      // Be defensive about the breakpoint not existing.
-      if (this._getBreakpoint(breakpoint)) {
-        this._removeBreakpoint(breakpoint);
-      }
-    }
-    else {
-      if (this._getBreakpoint(breakpoint)) {
-        this._updateBreakpointStatus(breakpoint);
-      }
-      else {
-        this._addBreakpoint(breakpoint);
-      }
-    }
-  },
-
-  /**
-   * Adds a breakpoint to this sources container.
-   *
-   * @param object aBreakpointClient
-   *               See Breakpoints.prototype._showBreakpoint
-   * @param object aOptions [optional]
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _addBreakpoint: function (breakpoint, options = {}) {
-    let disabled = breakpoint.disabled;
-    let location = breakpoint.location;
-
-    // Get the source item to which the breakpoint should be attached.
-    let sourceItem = this.getItemByValue(location.actor);
-    if (!sourceItem) {
-      return;
-    }
-
-    // Create the element node and menu popup for the breakpoint item.
-    let breakpointArgs = extend(breakpoint.asMutable(), options);
-    let breakpointView = this._createBreakpointView.call(this, breakpointArgs);
-    let contextMenu = this._createContextMenu.call(this, breakpointArgs);
-
-    // Append a breakpoint child item to the corresponding source item.
-    sourceItem.append(breakpointView.container, {
-      attachment: extend(breakpointArgs, {
-        actor: location.actor,
-        line: location.line,
-        view: breakpointView,
-        popup: contextMenu
-      }),
-      attributes: [
-        ["contextmenu", contextMenu.menupopupId]
-      ],
-      // Make sure that when the breakpoint item is removed, the corresponding
-      // menupopup and commandset are also destroyed.
-      finalize: this._onBreakpointRemoved
-    });
-
-    if (typeof breakpoint.condition === "string") {
-      this.highlightBreakpoint(breakpoint.location, {
-        openPopup: true,
-        noEditorUpdate: true
-      });
-    }
-
-    window.emit(EVENTS.BREAKPOINT_SHOWN_IN_PANE);
-  },
-
-  /**
-   * Removes a breakpoint from this sources container.
-   * It does not also remove the breakpoint from the controller. Be careful.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _removeBreakpoint: function (breakpoint) {
-    // When a parent source item is removed, all the child breakpoint items are
-    // also automagically removed.
-    let sourceItem = this.getItemByValue(breakpoint.location.actor);
-    if (!sourceItem) {
-      return;
-    }
-
-    // Clear the breakpoint view.
-    sourceItem.remove(this._getBreakpoint(breakpoint));
-
-    if (this._selectedBreakpoint &&
-       (queries.makeLocationId(this._selectedBreakpoint.location) ===
-        queries.makeLocationId(breakpoint.location))) {
-      this._selectedBreakpoint = null;
-    }
-
-    window.emit(EVENTS.BREAKPOINT_HIDDEN_IN_PANE);
-  },
-
-  _getBreakpoint: function (bp) {
-    return this.getItemForPredicate(item => {
-      return item.attachment.actor === bp.location.actor &&
-        item.attachment.line === bp.location.line;
-    });
-  },
-
-  /**
-   * Updates a breakpoint.
-   *
-   * @param object breakpoint
-   */
-  _updateBreakpointStatus: function (breakpoint) {
-    let location = breakpoint.location;
-    let breakpointItem = this._getBreakpoint(getBreakpoint(this.getState(), location));
-    if (!breakpointItem) {
-      return promise.reject(new Error("No breakpoint found."));
-    }
-
-    // Breakpoint will now be enabled.
-    let attachment = breakpointItem.attachment;
-
-    // Update the corresponding menu items to reflect the enabled state.
-    let prefix = "bp-cMenu-"; // "breakpoints context menu"
-    let identifier = makeLocationId(location);
-    let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem";
-    let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem";
-    let enableSelf = document.getElementById(enableSelfId);
-    let disableSelf = document.getElementById(disableSelfId);
-
-    if (breakpoint.disabled) {
-      enableSelf.removeAttribute("hidden");
-      disableSelf.setAttribute("hidden", true);
-      attachment.view.checkbox.removeAttribute("checked");
-    }
-    else {
-      enableSelf.setAttribute("hidden", true);
-      disableSelf.removeAttribute("hidden");
-      attachment.view.checkbox.setAttribute("checked", "true");
-
-      // Update the breakpoint toggle button checked state.
-      this._toggleBreakpointsButton.removeAttribute("checked");
-    }
-
-  },
-
-  /**
-   * Highlights a breakpoint in this sources container.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   * @param object aOptions [optional]
-   *        An object containing some of the following boolean properties:
-   *          - openPopup: tells if the expression popup should be shown.
-   *          - noEditorUpdate: tells if you want to skip editor updates.
-   */
-  highlightBreakpoint: function (aLocation, aOptions = {}) {
-    let breakpoint = getBreakpoint(this.getState(), aLocation);
-    if (!breakpoint) {
-      return;
-    }
-
-    // Breakpoint will now be selected.
-    this._selectBreakpoint(breakpoint);
-
-    // Update the editor location if necessary.
-    if (!aOptions.noEditorUpdate) {
-      this.DebuggerView.setEditorLocation(aLocation.actor, aLocation.line, { noDebug: true });
-    }
-
-    // If the breakpoint requires a new conditional expression, display
-    // the panel to input the corresponding expression.
-    if (aOptions.openPopup) {
-      return this._openConditionalPopup();
-    } else {
-      return this._hideConditionalPopup();
-    }
-  },
-
-  /**
-   * Highlight the breakpoint on the current currently focused line/column
-   * if it exists.
-   */
-  highlightBreakpointAtCursor: function () {
-    let actor = this.selectedValue;
-    let line = this.DebuggerView.editor.getCursor().line + 1;
-
-    let location = { actor: actor, line: line };
-    this.highlightBreakpoint(location, { noEditorUpdate: true });
-  },
-
-  /**
-   * Unhighlights the current breakpoint in this sources container.
-   */
-  unhighlightBreakpoint: function () {
-    this._hideConditionalPopup();
-    this._unselectBreakpoint();
-  },
-
-   /**
-    * Display the message thrown on breakpoint condition
-    */
-  showBreakpointConditionThrownMessage: function (aLocation, aMessage = "") {
-    let breakpointItem = this._getBreakpoint(getBreakpoint(this.getState(), aLocation));
-    if (!breakpointItem) {
-      return;
-    }
-    let attachment = breakpointItem.attachment;
-    attachment.view.container.classList.add("dbg-breakpoint-condition-thrown");
-    attachment.view.message.setAttribute("value", aMessage);
-  },
-
-  /**
-   * Update the checked/unchecked and enabled/disabled states of the buttons in
-   * the sources toolbar based on the currently selected source's state.
-   */
-  updateToolbarButtonsState: function (source) {
-    if (source.isBlackBoxed) {
-      this._blackBoxButton.setAttribute("checked", true);
-      this._prettyPrintButton.setAttribute("checked", true);
-    } else {
-      this._blackBoxButton.removeAttribute("checked");
-      this._prettyPrintButton.removeAttribute("checked");
-    }
-
-    if (source.isPrettyPrinted) {
-      this._prettyPrintButton.setAttribute("checked", true);
-    } else {
-      this._prettyPrintButton.removeAttribute("checked");
-    }
-  },
-
-  /**
-   * Toggle the pretty printing of the selected source.
-   */
-  togglePrettyPrint: function () {
-    if (this._prettyPrintButton.hasAttribute("disabled")) {
-      return;
-    }
-
-    this.DebuggerView.showProgressBar();
-    const source = getSelectedSource(this.getState());
-    const sourceClient = gThreadClient.source(source);
-    const shouldPrettyPrint = !source.isPrettyPrinted;
-
-    // This is only here to give immediate feedback,
-    // `renderPrettyPrinted` will set the final status of the buttons
-    if (shouldPrettyPrint) {
-      this._prettyPrintButton.setAttribute("checked", true);
-    } else {
-      this._prettyPrintButton.removeAttribute("checked");
-    }
-
-    this.actions.togglePrettyPrint(source);
-  },
-
-  /**
-   * Toggle the black boxed state of the selected source.
-   */
-  toggleBlackBoxing: Task.async(function* () {
-    const source = getSelectedSource(this.getState());
-    const shouldBlackBox = !source.isBlackBoxed;
-
-    // Be optimistic that the (un-)black boxing will succeed, so
-    // enable/disable the pretty print button and check/uncheck the
-    // black box button immediately.
-    if (shouldBlackBox) {
-      this._prettyPrintButton.setAttribute("disabled", true);
-      this._blackBoxButton.setAttribute("checked", true);
-    } else {
-      this._prettyPrintButton.removeAttribute("disabled");
-      this._blackBoxButton.removeAttribute("checked");
-    }
-
-    this.actions.blackbox(source, shouldBlackBox);
-  }),
-
-  renderBlackBoxed: function (source) {
-    const sourceItem = this.getItemByValue(source.actor);
-    sourceItem.prebuiltNode.classList.toggle(
-      "black-boxed",
-      source.isBlackBoxed
-    );
-
-    if (getSelectedSource(this.getState()).actor === source.actor) {
-      this.updateToolbarButtonsState(source);
-    }
-  },
-
-  /**
-   * Toggles all breakpoints enabled/disabled.
-   */
-  toggleBreakpoints: function () {
-    let breakpoints = getBreakpoints(this.getState());
-    let hasBreakpoints = breakpoints.length > 0;
-    let hasEnabledBreakpoints = breakpoints.some(bp => !bp.disabled);
-
-    if (hasBreakpoints && hasEnabledBreakpoints) {
-      this._toggleBreakpointsButton.setAttribute("checked", true);
-      this._onDisableAll();
-    } else {
-      this._toggleBreakpointsButton.removeAttribute("checked");
-      this._onEnableAll();
-    }
-  },
-
-  hidePrettyPrinting: function () {
-    this._prettyPrintButton.style.display = "none";
-
-    if (this._blackBoxButton.style.display === "none") {
-      let sep = document.querySelector("#sources-toolbar .devtools-separator");
-      sep.style.display = "none";
-    }
-  },
-
-  hideBlackBoxing: function () {
-    this._blackBoxButton.style.display = "none";
-
-    if (this._prettyPrintButton.style.display === "none") {
-      let sep = document.querySelector("#sources-toolbar .devtools-separator");
-      sep.style.display = "none";
-    }
-  },
-
-  getDisplayURL: function (source) {
-    if (!source.url) {
-      return this.getItemByValue(source.actor).attachment.label;
-    }
-    return NetworkHelper.convertToUnicode(unescape(source.url));
-  },
-
-  /**
-   * Marks a breakpoint as selected in this sources container.
-   *
-   * @param object aItem
-   *        The breakpoint item to select.
-   */
-  _selectBreakpoint: function (bp) {
-    if (this._selectedBreakpoint === bp) {
-      return;
-    }
-    this._unselectBreakpoint();
-    this._selectedBreakpoint = bp;
-
-    const item = this._getBreakpoint(bp);
-    item.target.classList.add("selected");
-
-    // Ensure the currently selected breakpoint is visible.
-    this.widget.ensureElementIsVisible(item.target);
-  },
-
-  /**
-   * Marks the current breakpoint as unselected in this sources container.
-   */
-  _unselectBreakpoint: function () {
-    if (!this._selectedBreakpoint) {
-      return;
-    }
-
-    const item = this._getBreakpoint(this._selectedBreakpoint);
-    item.target.classList.remove("selected");
-
-    this._selectedBreakpoint = null;
-  },
-
-  /**
-   * Opens a conditional breakpoint's expression input popup.
-   */
-  _openConditionalPopup: function () {
-    let breakpointItem = this._getBreakpoint(this._selectedBreakpoint);
-    let attachment = breakpointItem.attachment;
-    // Check if this is an enabled conditional breakpoint, and if so,
-    // retrieve the current conditional epression.
-    let bp = getBreakpoint(this.getState(), attachment);
-    let expr = (bp ? (bp.condition || "") : "");
-    let cbPanel = this._cbPanel;
-
-    // Update the conditional expression textbox. If no expression was
-    // previously set, revert to using an empty string by default.
-    this._cbTextbox.value = expr;
-
-    function openPopup() {
-      // Show the conditional expression panel. The popup arrow should be pointing
-      // at the line number node in the breakpoint item view.
-      cbPanel.hidden = false;
-      cbPanel.openPopup(breakpointItem.attachment.view.lineNumber,
-                              BREAKPOINT_CONDITIONAL_POPUP_POSITION,
-                              BREAKPOINT_CONDITIONAL_POPUP_OFFSET_X,
-                              BREAKPOINT_CONDITIONAL_POPUP_OFFSET_Y);
-
-      cbPanel.removeEventListener("popuphidden", openPopup);
-    }
-
-    // Wait until the other cb panel is closed
-    if (!this._cbPanel.hidden) {
-      this._cbPanel.addEventListener("popuphidden", openPopup);
-    } else {
-      openPopup();
-    }
-  },
-
-  /**
-   * Hides a conditional breakpoint's expression input popup.
-   */
-  _hideConditionalPopup: function () {
-    // Sometimes this._cbPanel doesn't have hidePopup method which doesn't
-    // break anything but simply outputs an exception to the console.
-    if (this._cbPanel.hidePopup) {
-      this._cbPanel.hidePopup();
-    }
-  },
-
-  /**
-   * Customization function for creating a breakpoint item's UI.
-   *
-   * @param object aOptions
-   *        A couple of options or flags supported by this operation:
-   *          - location: the breakpoint's source location and line number
-   *          - disabled: the breakpoint's disabled state, boolean
-   *          - text: the breakpoint's line text to be displayed
-   *          - message: thrown string when the breakpoint condition throws
-   * @return object
-   *         An object containing the breakpoint container, checkbox,
-   *         line number and line text nodes.
-   */
-  _createBreakpointView: function (aOptions) {
-    let { location, disabled, text, message, isWasm } = aOptions;
-    let identifier = makeLocationId(location);
-
-    let checkbox = document.createElement("checkbox");
-    if (!disabled) {
-      checkbox.setAttribute("checked", true);
-    }
-    checkbox.className = "dbg-breakpoint-checkbox";
-
-    let lineNumberNode = document.createElement("label");
-    lineNumberNode.className = "plain dbg-breakpoint-line";
-    let lineNumberStr = !isWasm ? location.line.toString() :
-      location.line.toString(16).toUpperCase();
-    lineNumberNode.setAttribute("value", lineNumberStr);
-
-    let lineTextNode = document.createElement("label");
-    lineTextNode.className = "plain dbg-breakpoint-text";
-    lineTextNode.setAttribute("value", text);
-    lineTextNode.setAttribute("crop", "end");
-    lineTextNode.setAttribute("flex", "1");
-
-    let tooltip = text ? text.substr(0, BREAKPOINT_LINE_TOOLTIP_MAX_LENGTH) : "";
-    lineTextNode.setAttribute("tooltiptext", tooltip);
-
-    let thrownNode = document.createElement("label");
-    thrownNode.className = "plain dbg-breakpoint-condition-thrown-message dbg-breakpoint-text";
-    thrownNode.setAttribute("value", message);
-    thrownNode.setAttribute("crop", "end");
-    thrownNode.setAttribute("flex", "1");
-
-    let bpLineContainer = document.createElement("hbox");
-    bpLineContainer.className = "plain dbg-breakpoint-line-container";
-    bpLineContainer.setAttribute("flex", "1");
-
-    bpLineContainer.appendChild(lineNumberNode);
-    bpLineContainer.appendChild(lineTextNode);
-
-    let bpDetailContainer = document.createElement("vbox");
-    bpDetailContainer.className = "plain dbg-breakpoint-detail-container";
-    bpDetailContainer.setAttribute("flex", "1");
-
-    bpDetailContainer.appendChild(bpLineContainer);
-    bpDetailContainer.appendChild(thrownNode);
-
-    let container = document.createElement("hbox");
-    container.id = "breakpoint-" + identifier;
-    container.className = "dbg-breakpoint side-menu-widget-item-other";
-    container.classList.add("devtools-monospace");
-    container.setAttribute("align", "center");
-    container.setAttribute("flex", "1");
-
-    container.addEventListener("click", this._onBreakpointClick);
-    checkbox.addEventListener("click", this._onBreakpointCheckboxClick);
-
-    container.appendChild(checkbox);
-    container.appendChild(bpDetailContainer);
-
-    return {
-      container: container,
-      checkbox: checkbox,
-      lineNumber: lineNumberNode,
-      lineText: lineTextNode,
-      message: thrownNode
-    };
-  },
-
-  /**
-   * Creates a context menu for a breakpoint element.
-   *
-   * @param object aOptions
-   *        A couple of options or flags supported by this operation:
-   *          - location: the breakpoint's source location and line number
-   *          - disabled: the breakpoint's disabled state, boolean
-   * @return object
-   *         An object containing the breakpoint commandset and menu popup ids.
-   */
-  _createContextMenu: function (aOptions) {
-    let { location, disabled } = aOptions;
-    let identifier = makeLocationId(location);
-
-    let commandset = document.createElement("commandset");
-    let menupopup = document.createElement("menupopup");
-    commandset.id = "bp-cSet-" + identifier;
-    menupopup.id = "bp-mPop-" + identifier;
-
-    createMenuItem.call(this, "enableSelf", !disabled);
-    createMenuItem.call(this, "disableSelf", disabled);
-    createMenuItem.call(this, "deleteSelf");
-    createMenuSeparator();
-    createMenuItem.call(this, "setConditional");
-    createMenuSeparator();
-    createMenuItem.call(this, "enableOthers");
-    createMenuItem.call(this, "disableOthers");
-    createMenuItem.call(this, "deleteOthers");
-    createMenuSeparator();
-    createMenuItem.call(this, "enableAll");
-    createMenuItem.call(this, "disableAll");
-    createMenuSeparator();
-    createMenuItem.call(this, "deleteAll");
-
-    this._popupset.appendChild(menupopup);
-    this._commandset.appendChild(commandset);
-
-    return {
-      commandsetId: commandset.id,
-      menupopupId: menupopup.id
-    };
-
-    /**
-     * Creates a menu item specified by a name with the appropriate attributes
-     * (label and handler).
-     *
-     * @param string aName
-     *        A global identifier for the menu item.
-     * @param boolean aHiddenFlag
-     *        True if this menuitem should be hidden.
-     */
-    function createMenuItem(aName, aHiddenFlag) {
-      let menuitem = document.createElement("menuitem");
-      let command = document.createElement("command");
-
-      let prefix = "bp-cMenu-"; // "breakpoints context menu"
-      let commandId = prefix + aName + "-" + identifier + "-command";
-      let menuitemId = prefix + aName + "-" + identifier + "-menuitem";
-
-      let label = L10N.getStr("breakpointMenuItem." + aName);
-      let func = "_on" + aName.charAt(0).toUpperCase() + aName.slice(1);
-
-      command.id = commandId;
-      command.setAttribute("label", label);
-      command.addEventListener("command", () => this[func](location));
-
-      menuitem.id = menuitemId;
-      menuitem.setAttribute("command", commandId);
-      aHiddenFlag && menuitem.setAttribute("hidden", "true");
-
-      commandset.appendChild(command);
-      menupopup.appendChild(menuitem);
-    }
-
-    /**
-     * Creates a simple menu separator element and appends it to the current
-     * menupopup hierarchy.
-     */
-    function createMenuSeparator() {
-      let menuseparator = document.createElement("menuseparator");
-      menupopup.appendChild(menuseparator);
-    }
-  },
-
-  /**
-   * Copy the source url from the currently selected item.
-   */
-  _onCopyUrlCommand: function () {
-    let selected = this.selectedItem && this.selectedItem.attachment;
-    if (!selected) {
-      return;
-    }
-    clipboardHelper.copyString(selected.source.url);
-  },
-
-  /**
-   * Opens selected item source in a new tab.
-   */
-  _onNewTabCommand: function () {
-    let selected = this.selectedItem.attachment;
-    openContentLink(selected.source.url, {
-      relatedToCurrent: true,
-    });
-  },
-
-  /**
-   * Function called each time a breakpoint item is removed.
-   *
-   * @param object aItem
-   *        The corresponding item.
-   */
-  _onBreakpointRemoved: function (aItem) {
-    dumpn("Finalizing breakpoint item: " + aItem.stringify());
-
-    // Destroy the context menu for the breakpoint.
-    let contextMenu = aItem.attachment.popup;
-    document.getElementById(contextMenu.commandsetId).remove();
-    document.getElementById(contextMenu.menupopupId).remove();
-  },
-
-  _onMouseDown: function (e) {
-    this.hideNoResultsTooltip();
-
-    if (!e.metaKey) {
-      return;
-    }
-
-    let editor = this.DebuggerView.editor;
-    let identifier = this._findIdentifier(e.clientX, e.clientY);
-
-    if (!identifier) {
-      return;
-    }
-
-    let foundDefinitions = this._getFunctionDefinitions(identifier);
-
-    if (!foundDefinitions || !foundDefinitions.definitions) {
-      return;
-    }
-
-    this._showFunctionDefinitionResults(identifier, foundDefinitions.definitions, editor);
-  },
-
-  /**
-   * Searches for function definition of a function in a given source file
-   */
-
-  _findDefinition: function (parsedSource, aName) {
-    let functionDefinitions = parsedSource.getNamedFunctionDefinitions(aName);
-
-    let resultList = [];
-
-    if (!functionDefinitions || !functionDefinitions.length || !functionDefinitions[0].length) {
-      return {
-        definitions: resultList
-      };
-    }
-
-    // functionDefinitions is a list with an object full of metadata,
-    // extract the data and use to construct a more useful, less
-    // cluttered, contextual list
-    for (let i = 0; i < functionDefinitions.length; i++) {
-      let functionDefinition = {
-        source: functionDefinitions[i].sourceUrl,
-        startLine: functionDefinitions[i][0].functionLocation.start.line,
-        startColumn: functionDefinitions[i][0].functionLocation.start.column,
-        name: functionDefinitions[i][0].functionName
-      };
-
-      resultList.push(functionDefinition);
-    }
-
-    return {
-      definitions: resultList
-    };
-  },
-
-  /**
-   * Searches for an identifier underneath the specified position in the
-   * source editor.
-   *
-   * @param number x, y
-   *        The left/top coordinates where to look for an identifier.
-   */
-  _findIdentifier: function (x, y) {
-    let parsedSource = SourceUtils.parseSource(this.DebuggerView, this.Parser);
-    let identifierInfo = SourceUtils.findIdentifier(this.DebuggerView.editor, parsedSource, x, y);
-
-    // Not hovering over an identifier
-    if (!identifierInfo) {
-      return;
-    }
-
-    return identifierInfo;
-  },
-
-  /**
-   * The selection listener for the source editor.
-   */
-  _onEditorCursorActivity: function (e) {
-    let editor = this.DebuggerView.editor;
-    let start = editor.getCursor("start").line + 1;
-    let end = editor.getCursor().line + 1;
-    let source = getSelectedSource(this.getState());
-
-    if (source) {
-      let location = { actor: source.actor, line: start };
-      if (getBreakpoint(this.getState(), location) && start == end) {
-        this.highlightBreakpoint(location, { noEditorUpdate: true });
-      } else {
-        this.unhighlightBreakpoint();
-      }
-    }
-  },
-
-  /*
-   * Uses function definition data to perform actions in different
-   * cases of how many locations were found: zero, one, or multiple definitions
-   */
-  _showFunctionDefinitionResults: function (aHoveredFunction, aDefinitionList, aEditor) {
-    let definitions = aDefinitionList;
-    let hoveredFunction = aHoveredFunction;
-
-    // show a popup saying no results were found
-    if (definitions.length == 0) {
-      this._noResultsFoundToolTip.setTextContent({
-        messages: [L10N.getStr("noMatchingStringsText")]
-      });
-
-      this._markedIdentifier = aEditor.markText(
-        { line: hoveredFunction.location.start.line - 1, ch: hoveredFunction.location.start.column },
-        { line: hoveredFunction.location.end.line - 1, ch: hoveredFunction.location.end.column });
-
-      this._noResultsFoundToolTip.show(this._markedIdentifier.anchor);
-
-    } else if (definitions.length == 1) {
-      this.DebuggerView.setEditorLocation(definitions[0].source, definitions[0].startLine);
-    } else {
-      // TODO: multiple definitions found, do something else
-      this.DebuggerView.setEditorLocation(definitions[0].source, definitions[0].startLine);
-    }
-  },
-
-  /**
-   * Hides the tooltip and clear marked text popup.
-   */
-  hideNoResultsTooltip: function () {
-    this._noResultsFoundToolTip.hide();
-    if (this._markedIdentifier) {
-      this._markedIdentifier.clear();
-      this._markedIdentifier = null;
-    }
-  },
-
-  /*
-   * Gets the definition locations from function metadata
-   */
-  _getFunctionDefinitions: function (aIdentifierInfo) {
-    let parsedSource = SourceUtils.parseSource(this.DebuggerView, this.Parser);
-    let definition_info = this._findDefinition(parsedSource, aIdentifierInfo.name);
-
-    // Did not find any definitions for the identifier
-    if (!definition_info) {
-      return;
-    }
-
-    return definition_info;
-  },
-
-  /**
-   * The select listener for the sources container.
-   */
-  _onSourceSelect: function ({ detail: sourceItem }) {
-    if (!sourceItem) {
-      return;
-    }
-
-    const { source } = sourceItem.attachment;
-    this.actions.selectSource(source);
-  },
-
-  renderSourceSelected: function (source) {
-    if (source.url) {
-      this._preferredSourceURL = source.url;
-    }
-    this.updateToolbarButtonsState(source);
-    this._selectItem(this.getItemByValue(source.actor));
-  },
-
-  /**
-   * The click listener for the "stop black boxing" button.
-   */
-  _onStopBlackBoxing: Task.async(function* () {
-    this.actions.blackbox(getSelectedSource(this.getState()), false);
-  }),
-
-  /**
-   * The source editor's contextmenu handler.
-   * - Toggles "Add Conditional Breakpoint" and "Edit Conditional Breakpoint" items
-   */
-  _onEditorContextMenuOpen: function (ev, popup) {
-    let actor = this.selectedValue;
-    let line = this.DebuggerView.editor.getCursor().line + 1;
-    let location = { actor, line };
-
-    let breakpoint = getBreakpoint(this.getState(), location);
-    let addConditionalBreakpointMenuItem = popup.querySelector("#se-dbg-cMenu-addConditionalBreakpoint");
-    let editConditionalBreakpointMenuItem = popup.querySelector("#se-dbg-cMenu-editConditionalBreakpoint");
-
-    if (breakpoint && !!breakpoint.condition) {
-      editConditionalBreakpointMenuItem.removeAttribute("hidden");
-      addConditionalBreakpointMenuItem.setAttribute("hidden", true);
-    }
-    else {
-      addConditionalBreakpointMenuItem.removeAttribute("hidden");
-      editConditionalBreakpointMenuItem.setAttribute("hidden", true);
-    }
-  },
-
-  /**
-   * The click listener for a breakpoint container.
-   */
-  _onBreakpointClick: function (e) {
-    let sourceItem = this.getItemForElement(e.target);
-    let breakpointItem = this.getItemForElement.call(sourceItem, e.target);
-    let attachment = breakpointItem.attachment;
-    let bp = getBreakpoint(this.getState(), attachment);
-    if (bp) {
-      this.highlightBreakpoint(bp.location, {
-        openPopup: bp.condition && e.button == 0
-      });
-    } else {
-      this.highlightBreakpoint(bp.location);
-    }
-  },
-
-  /**
-   * The click listener for a breakpoint checkbox.
-   */
-  _onBreakpointCheckboxClick: function (e) {
-    let sourceItem = this.getItemForElement(e.target);
-    let breakpointItem = this.getItemForElement.call(sourceItem, e.target);
-    let bp = getBreakpoint(this.getState(), breakpointItem.attachment);
-
-    if (bp.disabled) {
-      this.actions.enableBreakpoint(bp.location);
-    }
-    else {
-      this.actions.disableBreakpoint(bp.location);
-    }
-
-    // Don't update the editor location (avoid propagating into _onBreakpointClick).
-    e.preventDefault();
-    e.stopPropagation();
-  },
-
-  /**
-   * The popup showing listener for the breakpoints conditional expression panel.
-   */
-  _onConditionalPopupShowing: function () {
-    this._conditionalPopupVisible = true; // Used in tests.
-  },
-
-  /**
-   * The popup shown listener for the breakpoints conditional expression panel.
-   */
-  _onConditionalPopupShown: function () {
-    this._cbTextbox.focus();
-    this._cbTextbox.select();
-    window.emit(EVENTS.CONDITIONAL_BREAKPOINT_POPUP_SHOWN);
-  },
-
-  /**
-   * The popup hiding listener for the breakpoints conditional expression panel.
-   */
-  _onConditionalPopupHiding: function () {
-    this._conditionalPopupVisible = false; // Used in tests.
-
-    // Check if this is an enabled conditional breakpoint, and if so,
-    // save the current conditional expression.
-    let bp = this._selectedBreakpoint;
-    if (bp) {
-      let condition = this._cbTextbox.value;
-      this.actions.setBreakpointCondition(bp.location, condition);
-    }
-  },
-
-  /**
-   * The popup hidden listener for the breakpoints conditional expression panel.
-   */
-  _onConditionalPopupHidden: function () {
-    this._cbPanel.hidden = true;
-    window.emit(EVENTS.CONDITIONAL_BREAKPOINT_POPUP_HIDDEN);
-  },
-
-  /**
-   * The keypress listener for the breakpoints conditional expression textbox.
-   */
-  _onConditionalTextboxKeyPress: function (e) {
-    if (e.keyCode == KeyCodes.DOM_VK_RETURN) {
-      this._hideConditionalPopup();
-    }
-  },
-
-  /**
-   * Called when the add breakpoint key sequence was pressed.
-   */
-  _onCmdAddBreakpoint: function (e) {
-    let actor = this.selectedValue;
-    let line = (this.DebuggerView.clickedLine ?
-                this.DebuggerView.clickedLine + 1 :
-                this.DebuggerView.editor.getCursor().line + 1);
-    let location = { actor, line };
-    let bp = getBreakpoint(this.getState(), location);
-
-    // If a breakpoint already existed, remove it now.
-    if (bp) {
-      this.actions.removeBreakpoint(bp.location);
-    }
-    // No breakpoint existed at the required location, add one now.
-    else {
-      this.actions.addBreakpoint(location);
-    }
-  },
-
-  /**
-   * Called when the add conditional breakpoint key sequence was pressed.
-   */
-  _onCmdAddConditionalBreakpoint: function (e) {
-    let actor = this.selectedValue;
-    let line = (this.DebuggerView.clickedLine ?
-                this.DebuggerView.clickedLine + 1 :
-                this.DebuggerView.editor.getCursor().line + 1);
-
-    let location = { actor, line };
-    let bp = getBreakpoint(this.getState(), location);
-
-    // If a breakpoint already existed or wasn't a conditional, morph it now.
-    if (bp) {
-      this.highlightBreakpoint(bp.location, { openPopup: true });
-    }
-    // No breakpoint existed at the required location, add one now.
-    else {
-      this.actions.addBreakpoint(location, "");
-    }
-  },
-
-  getOtherBreakpoints: function (location) {
-    const bps = getBreakpoints(this.getState());
-    if (location) {
-      return bps.filter(bp => {
-        return (bp.location.actor !== location.actor ||
-                bp.location.line !== location.line);
-      });
-    }
-    return bps;
-  },
-
-  /**
-   * Function invoked on the "setConditional" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onSetConditional: function (aLocation) {
-    // Highlight the breakpoint and show a conditional expression popup.
-    this.highlightBreakpoint(aLocation, { openPopup: true });
-  },
-
-  /**
-   * Function invoked on the "enableSelf" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onEnableSelf: function (aLocation) {
-    // Enable the breakpoint, in this container and the controller store.
-    this.actions.enableBreakpoint(aLocation);
-  },
-
-  /**
-   * Function invoked on the "disableSelf" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onDisableSelf: function (aLocation) {
-    const bp = getBreakpoint(this.getState(), aLocation);
-    if (!bp.disabled) {
-      this.actions.disableBreakpoint(aLocation);
-    }
-  },
-
-  /**
-   * Function invoked on the "deleteSelf" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onDeleteSelf: function (aLocation) {
-    this.actions.removeBreakpoint(aLocation);
-  },
-
-  /**
-   * Function invoked on the "enableOthers" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onEnableOthers: function (aLocation) {
-    let other = this.getOtherBreakpoints(aLocation);
-    // TODO(jwl): batch these and interrupt the thread for all of them
-    other.forEach(bp => this._onEnableSelf(bp.location));
-  },
-
-  /**
-   * Function invoked on the "disableOthers" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onDisableOthers: function (aLocation) {
-    let other = this.getOtherBreakpoints(aLocation);
-    other.forEach(bp => this._onDisableSelf(bp.location));
-  },
-
-  /**
-   * Function invoked on the "deleteOthers" menuitem command.
-   *
-   * @param object aLocation
-   *        @see DebuggerController.Breakpoints.addBreakpoint
-   */
-  _onDeleteOthers: function (aLocation) {
-    let other = this.getOtherBreakpoints(aLocation);
-    other.forEach(bp => this._onDeleteSelf(bp.location));
-  },
-
-  /**
-   * Function invoked on the "enableAll" menuitem command.
-   */
-  _onEnableAll: function () {
-    this._onEnableOthers(undefined);
-  },
-
-  /**
-   * Function invoked on the "disableAll" menuitem command.
-   */
-  _onDisableAll: function () {
-    this._onDisableOthers(undefined);
-  },
-
-  /**
-   * Function invoked on the "deleteAll" menuitem command.
-   */
-  _onDeleteAll: function () {
-    this._onDeleteOthers(undefined);
-  },
-
-  _commandset: null,
-  _popupset: null,
-  _cmPopup: null,
-  _cbPanel: null,
-  _cbTextbox: null,
-  _selectedBreakpointItem: null,
-  _conditionalPopupVisible: false,
-  _noResultsFoundToolTip: null,
-  _markedIdentifier: null,
-  _selectedBreakpoint: null,
-  _conditionalPopupVisible: false
-});
-
-module.exports = SourcesView;
deleted file mode 100644
--- a/devtools/client/debugger/debugger-controller.js
+++ /dev/null
@@ -1,1311 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-"use strict";
-
-const DBG_STRINGS_URI = "devtools/client/locales/debugger.properties";
-const NEW_SOURCE_IGNORED_URLS = ["debugger eval code", "XStringBundle"];
-const NEW_SOURCE_DISPLAY_DELAY = 200; // ms
-const FETCH_SOURCE_RESPONSE_DELAY = 200; // ms
-const FRAME_STEP_CLEAR_DELAY = 100; // ms
-const CALL_STACK_PAGE_SIZE = 25; // frames
-
-// The panel's window global is an EventEmitter firing the following events:
-const EVENTS = {
-  // When the debugger's source editor instance finishes loading or unloading.
-  EDITOR_LOADED: "Debugger:EditorLoaded",
-  EDITOR_UNLOADED: "Debugger:EditorUnloaded",
-
-  // When new sources are received from the debugger server.
-  NEW_SOURCE: "Debugger:NewSource",
-  SOURCES_ADDED: "Debugger:SourcesAdded",
-
-  // When a source is shown in the source editor.
-  SOURCE_SHOWN: "Debugger:EditorSourceShown",
-  SOURCE_ERROR_SHOWN: "Debugger:EditorSourceErrorShown",
-
-  // When the editor has shown a source and set the line / column position
-  EDITOR_LOCATION_SET: "Debugger:EditorLocationSet",
-
-  // When scopes, variables, properties and watch expressions are fetched and
-  // displayed in the variables view.
-  FETCHED_SCOPES: "Debugger:FetchedScopes",
-  FETCHED_VARIABLES: "Debugger:FetchedVariables",
-  FETCHED_PROPERTIES: "Debugger:FetchedProperties",
-  FETCHED_BUBBLE_PROPERTIES: "Debugger:FetchedBubbleProperties",
-  FETCHED_WATCH_EXPRESSIONS: "Debugger:FetchedWatchExpressions",
-
-  // When a breakpoint has been added or removed on the debugger server.
-  BREAKPOINT_ADDED: "Debugger:BreakpointAdded",
-  BREAKPOINT_REMOVED: "Debugger:BreakpointRemoved",
-  BREAKPOINT_CLICKED: "Debugger:BreakpointClicked",
-
-  // When a breakpoint has been shown or hidden in the source editor
-  // or the pane.
-  BREAKPOINT_SHOWN_IN_EDITOR: "Debugger:BreakpointShownInEditor",
-  BREAKPOINT_SHOWN_IN_PANE: "Debugger:BreakpointShownInPane",
-  BREAKPOINT_HIDDEN_IN_EDITOR: "Debugger:BreakpointHiddenInEditor",
-  BREAKPOINT_HIDDEN_IN_PANE: "Debugger:BreakpointHiddenInPane",
-
-  // When a conditional breakpoint's popup is shown/hidden.
-  CONDITIONAL_BREAKPOINT_POPUP_SHOWN: "Debugger:ConditionalBreakpointPopupShown",
-  CONDITIONAL_BREAKPOINT_POPUP_HIDDEN: "Debugger:ConditionalBreakpointPopupHidden",
-
-  // When event listeners are fetched or event breakpoints are updated.
-  EVENT_LISTENERS_FETCHED: "Debugger:EventListenersFetched",
-  EVENT_BREAKPOINTS_UPDATED: "Debugger:EventBreakpointsUpdated",
-
-  // When a file search was performed.
-  FILE_SEARCH_MATCH_FOUND: "Debugger:FileSearch:MatchFound",
-  FILE_SEARCH_MATCH_NOT_FOUND: "Debugger:FileSearch:MatchNotFound",
-
-  // When a function search was performed.
-  FUNCTION_SEARCH_MATCH_FOUND: "Debugger:FunctionSearch:MatchFound",
-  FUNCTION_SEARCH_MATCH_NOT_FOUND: "Debugger:FunctionSearch:MatchNotFound",
-
-  // When a global text search was performed.
-  GLOBAL_SEARCH_MATCH_FOUND: "Debugger:GlobalSearch:MatchFound",
-  GLOBAL_SEARCH_MATCH_NOT_FOUND: "Debugger:GlobalSearch:MatchNotFound",
-
-  // After the the StackFrames object has been filled with frames
-  AFTER_FRAMES_REFILLED: "Debugger:AfterFramesRefilled",
-
-  // After the stackframes are cleared and debugger won't pause anymore.
-  AFTER_FRAMES_CLEARED: "Debugger:AfterFramesCleared",
-
-  // When the options popup is showing or hiding.
-  OPTIONS_POPUP_SHOWING: "Debugger:OptionsPopupShowing",
-  OPTIONS_POPUP_HIDDEN: "Debugger:OptionsPopupHidden",
-
-  // When the widgets layout has been changed.
-  LAYOUT_CHANGED: "Debugger:LayoutChanged",
-
-  // When a worker has been selected.
-  WORKER_SELECTED: "Debugger::WorkerSelected"
-};
-
-// Descriptions for what a stack frame represents after the debugger pauses.
-const FRAME_TYPE = {
-  NORMAL: 0,
-  CONDITIONAL_BREAKPOINT_EVAL: 1,
-  WATCH_EXPRESSIONS_EVAL: 2,
-  PUBLIC_CLIENT_EVAL: 3
-};
-
-const { BrowserLoader } = ChromeUtils.import("resource://devtools/client/shared/browser-loader.js", {});
-const { require } = BrowserLoader({
-  baseURI: "resource://devtools/client/debugger/",
-  window,
-});
-const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineConstant(this, "require", require);
-const { SimpleListWidget } = require("resource://devtools/client/shared/widgets/SimpleListWidget.jsm");
-const { BreadcrumbsWidget } = require("resource://devtools/client/shared/widgets/BreadcrumbsWidget.jsm");
-const { SideMenuWidget } = require("resource://devtools/client/shared/widgets/SideMenuWidget.jsm");
-const { VariablesView } = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
-const { VariablesViewController, StackFrameUtils } = require("resource://devtools/client/shared/widgets/VariablesViewController.jsm");
-const EventEmitter = require("devtools/shared/event-emitter");
-const { extend } = require("devtools/shared/extend");
-const { gDevTools } = require("devtools/client/framework/devtools");
-const { ViewHelpers, WidgetMethods, setNamedTimeout,
-        clearNamedTimeout } = require("devtools/client/shared/widgets/view-helpers");
-
-// Use privileged promise in panel documents to prevent having them to freeze
-// during toolbox destruction. See bug 1402779.
-const Promise = require("Promise");
-
-// React
-const React = require("devtools/client/shared/vendor/react");
-const ReactDOM = require("devtools/client/shared/vendor/react-dom");
-const { Provider } = require("devtools/client/shared/vendor/react-redux");
-
-// Used to create the Redux store
-const createStore = require("devtools/client/shared/redux/create-store")({
-  getTargetClient: () => DebuggerController.client,
-  log: false
-});
-const {
-  makeStateBroadcaster,
-  enhanceStoreWithBroadcaster,
-  combineBroadcastingReducers
-} = require("devtools/client/shared/redux/non-react-subscriber");
-const { bindActionCreators } = require("devtools/client/shared/vendor/redux");
-const reducers = require("./content/reducers/index");
-const { onReducerEvents } = require("./content/utils");
-
-const waitUntilService = require("devtools/client/shared/redux/middleware/wait-service");
-var services = {
-  WAIT_UNTIL: waitUntilService.NAME
-};
-
-var Services = require("Services");
-var {TargetFactory} = require("devtools/client/framework/target");
-var {Toolbox} = require("devtools/client/framework/toolbox");
-var DevToolsUtils = require("devtools/shared/DevToolsUtils");
-var promise = require("devtools/shared/deprecated-sync-thenables");
-var Editor = require("devtools/client/sourceeditor/editor");
-var DebuggerEditor = require("devtools/client/sourceeditor/debugger");
-var Tooltip = require("./content/tooltip/Tooltip");
-var FastListWidget = require("devtools/client/shared/widgets/FastListWidget");
-var {LocalizationHelper, ELLIPSIS} = require("devtools/shared/l10n");
-var {PrefsHelper} = require("devtools/client/shared/prefs");
-var {Task} = require("devtools/shared/task");
-
-XPCOMUtils.defineConstant(this, "EVENTS", EVENTS);
-
-ChromeUtils.defineModuleGetter(this, "Parser",
-  "resource://devtools/shared/Parser.jsm");
-
-ChromeUtils.defineModuleGetter(this, "ShortcutUtils",
-  "resource://gre/modules/ShortcutUtils.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "clipboardHelper",
-  "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
-
-Object.defineProperty(this, "NetworkHelper", {
-  get: function () {
-    return require("devtools/shared/webconsole/network-helper");
-  },
-  configurable: true,
-  enumerable: true
-});
-
-/**
- * Localization convenience methods.
- */
-var L10N = new LocalizationHelper(DBG_STRINGS_URI);
-
-/**
- * Object defining the debugger controller components.
- */
-var DebuggerController = {
-  /**
-   * Initializes the debugger controller.
-   */
-  initialize: function () {
-    dumpn("Initializing the DebuggerController");
-
-    this.startupDebugger = this.startupDebugger.bind(this);
-    this.shutdownDebugger = this.shutdownDebugger.bind(this);
-    this._onNavigate = this._onNavigate.bind(this);
-    this._onWillNavigate = this._onWillNavigate.bind(this);
-    this._onTabDetached = this._onTabDetached.bind(this);
-
-    const broadcaster = makeStateBroadcaster(() => !!this.activeThread);
-    const reducer = combineBroadcastingReducers(
-      reducers,
-      broadcaster.emitChange
-    );
-    // TODO: Bug 1228867, clean this up and probably abstract it out
-    // better.
-    //
-    // We only want to process async event that are appropriate for
-    // this page. The devtools are open across page reloads, so async
-    // requests from the last page might bleed through if reloading
-    // fast enough. We check to make sure the async action is part of
-    // a current request, and ignore it if not.
-    let store = createStore((state, action) => {
-      if (action.seqId &&
-         (action.status === "done" || action.status === "error") &&
-         state && !state.asyncRequests.includes(action.seqId)) {
-        return state;
-      }
-      return reducer(state, action);
-    });
-    store = enhanceStoreWithBroadcaster(store, broadcaster);
-
-    // This controller right now acts as the store that's globally
-    // available, so just copy the Redux API onto it.
-    Object.keys(store).forEach(name => {
-      this[name] = store[name];
-    });
-  },
-
-  /**
-   * Initializes the view.
-   *
-   * @return object
-   *         A promise that is resolved when the debugger finishes startup.
-   */
-  startupDebugger: Task.async(function* () {
-    if (this._startup) {
-      return;
-    }
-
-    yield DebuggerView.initialize(this._target.isWorkerTarget);
-    this._startup = true;
-  }),
-
-  /**
-   * Destroys the view and disconnects the debugger client from the server.
-   *
-   * @return object
-   *         A promise that is resolved when the debugger finishes shutdown.
-   */
-  shutdownDebugger: Task.async(function* () {
-    if (this._shutdown) {
-      return;
-    }
-
-    DebuggerView.destroy();
-    this.StackFrames.disconnect();
-    this.ThreadState.disconnect();
-    if (this._target.isBrowsingContext) {
-      this.Workers.disconnect();
-    }
-
-    this.disconnect();
-
-    this._shutdown = true;
-  }),
-
-  /**
-   * Initiates remote debugging based on the current target, wiring event
-   * handlers as necessary.
-   *
-   * @return object
-   *         A promise that is resolved when the debugger finishes connecting.
-   */
-  connect: Task.async(function* () {
-    let target = this._target;
-
-    let { client } = target;
-    target.on("close", this._onTabDetached);
-    target.on("navigate", this._onNavigate);
-    target.on("will-navigate", this._onWillNavigate);
-    this.client = client;
-    this.activeThread = this._toolbox.threadClient;
-
-    let wasmBinarySource = !!this.client.mainRoot.traits.wasmBinarySource;
-
-    // Disable asm.js so that we can set breakpoints and other things
-    // on asm.js scripts. For WebAssembly modules allow using of binary
-    // source if supported.
-    yield this.reconfigureThread({ observeAsmJS: true, wasmBinarySource, });
-    yield this.connectThread();
-
-    // We need to call this to sync the state of the resume
-    // button in the toolbar with the state of the thread.
-    this.ThreadState._update();
-
-    this._hideUnsupportedFeatures();
-  }),
-
-  connectThread: function () {
-    const { newSource, fetchEventListeners } = bindActionCreators(actions, this.dispatch);
-
-    this.activeThread.addListener("newSource", (event, packet) => {
-      newSource(packet.source);
-
-      // Make sure the events listeners are up to date.
-      if (DebuggerView.instrumentsPaneTab == "events-tab") {
-        fetchEventListeners();
-      }
-    });
-
-    if (this._target.isBrowsingContext) {
-      this.Workers.connect();
-    }
-    this.ThreadState.connect();
-    this.StackFrames.connect();
-
-    // Load all of the sources. Note that the server will actually
-    // emit individual `newSource` notifications, which trigger
-    // separate actions, so this won't do anything other than force
-    // the server to traverse sources.
-    this.dispatch(actions.loadSources()).then(() => {
-      // If the engine is already paused, update the UI to represent the
-      // paused state
-      if (this.activeThread) {
-        const pausedPacket = this.activeThread.getLastPausePacket();
-        DebuggerView.Toolbar.toggleResumeButtonState(
-          this.activeThread.state,
-          !!pausedPacket
-        );
-        if (pausedPacket) {
-          this.StackFrames._onPaused("paused", pausedPacket);
-        }
-      }
-    });
-  },
-
-  /**
-   * Disconnects the debugger client and removes event handlers as necessary.
-   */
-  disconnect: function () {
-    // Return early if the client didn't even have a chance to instantiate.
-    if (!this.client) {
-      return;
-    }
-
-    this.activeThread.removeListener("newSource");
-    this.activeThread.removeListener("blackboxchange");
-
-    this._connected = false;
-    this.client = null;
-    this.activeThread = null;
-  },
-
-  _hideUnsupportedFeatures: function () {
-    if (this.client.mainRoot.traits.noPrettyPrinting) {
-      DebuggerView.Sources.hidePrettyPrinting();
-    }
-
-    if (this.client.mainRoot.traits.noBlackBoxing) {
-      DebuggerView.Sources.hideBlackBoxing();
-    }
-  },
-
-  _onWillNavigate: function (opts = {}) {
-    // Reset UI.
-    DebuggerView.handleTabNavigation();
-    if (!opts.noUnload) {
-      this.dispatch(actions.unload());
-    }
-
-    // Discard all the cached parsed sources *before* the target
-    // starts navigating. Sources may be fetched during navigation, in
-    // which case we don't want to hang on to the old source contents.
-    DebuggerController.Parser.clearCache();
-    SourceUtils.clearCache();
-
-    // Prevent performing any actions that were scheduled before
-    // navigation.
-    clearNamedTimeout("new-source");
-    clearNamedTimeout("event-breakpoints-update");
-    clearNamedTimeout("event-listeners-fetch");
-  },
-
-  _onNavigate: function () {
-    this.ThreadState.handleTabNavigation();
-    this.StackFrames.handleTabNavigation();
-  },
-
-  /**
-   * Called when the debugged tab is closed.
-   */
-  _onTabDetached: function () {
-    this.shutdownDebugger();
-  },
-
-  /**
-   * Warn if resuming execution produced a wrongOrder error.
-   */
-  _ensureResumptionOrder: function (aResponse) {
-    if (aResponse.error == "wrongOrder") {
-      DebuggerView.Toolbar.showResumeWarning(aResponse.lastPausedUrl);
-    }
-  },
-
-  /**
-   * Detach and reattach to the thread actor with useSourceMaps true, blow
-   * away old sources and get them again.
-   */
-  reconfigureThread: function (opts) {
-    const deferred = promise.defer();
-    this.activeThread.reconfigure(
-      opts,
-      aResponse => {
-        if (aResponse.error) {
-          deferred.reject(aResponse.error);
-          return;
-        }
-
-        if (("useSourceMaps" in opts) || ("autoBlackBox" in opts)) {
-          // Reset the view and fetch all the sources again.
-          DebuggerView.handleTabNavigation();
-          this.dispatch(actions.unload());
-          this.dispatch(actions.loadSources());
-
-          // Update the stack frame list.
-          if (this.activeThread.paused) {
-            this.activeThread._clearFrames();
-            this.activeThread.fillFrames(CALL_STACK_PAGE_SIZE);
-          }
-        }
-
-        deferred.resolve();
-      }
-    );
-    return deferred.promise;
-  },
-
-  waitForSourcesLoaded: function () {
-    const deferred = promise.defer();
-    this.dispatch({
-      type: services.WAIT_UNTIL,
-      predicate: action => (action.type === constants.LOAD_SOURCES &&
-                            action.status === "done"),
-      run: deferred.resolve
-    });
-    return deferred.promise;
-  },
-
-  waitForSourceShown: function (name) {
-    const deferred = promise.defer();
-    window.on(EVENTS.SOURCE_SHOWN, function onShown(source) {
-      if (source.url.includes(name)) {
-        window.off(EVENTS.SOURCE_SHOWN, onShown);
-        deferred.resolve();
-      }
-    });
-    return deferred.promise;
-  },
-
-  _startup: false,
-  _shutdown: false,
-  _connected: false,
-  client: null,
-  activeThread: null
-};
-
-function Workers() {
-  this._workerForms = Object.create(null);
-  this._onWorkerListChanged = this._onWorkerListChanged.bind(this);
-  this._onWorkerSelect = this._onWorkerSelect.bind(this);
-}
-
-Workers.prototype = {
-  get _targetFront() {
-    return DebuggerController._target.activeTab;
-  },
-
-  connect: function () {
-    if (!Prefs.workersEnabled) {
-      return;
-    }
-
-    this._updateWorkerList();
-
-    // `_targetFront` can be BrowsingContextTargetFront/WorkerTargetFront (protocol.js
-    // front) or DebuggerClient (old fashion client)
-    if (typeof(this._targetFront.on) == "function") {
-      this._targetFront.on("workerListChanged", this._onWorkerListChanged);
-    } else {
-      this._targetFront.addListener("workerListChanged", this._onWorkerListChanged);
-    }
-  },
-
-  disconnect: function () {
-    if (typeof(this._targetFront.on) == "function") {
-      this._targetFront.off("workerListChanged", this._onWorkerListChanged);
-    } else {
-      this._targetFront.removeListener("workerListChanged", this._onWorkerListChanged);
-    }
-  },
-
-  _updateWorkerList: function () {
-    if (!this._targetFront.listWorkers) {
-      return;
-    }
-
-    this._targetFront.listWorkers().then((response) => {
-      let workerForms = Object.create(null);
-      for (let worker of response.workers) {
-        workerForms[worker.actor] = worker;
-      }
-
-      for (let workerTargetActor in this._workerForms) {
-        if (!(workerTargetActor in workerForms)) {
-          DebuggerView.Workers.removeWorker(this._workerForms[workerTargetActor]);
-          delete this._workerForms[workerTargetActor];
-        }
-      }
-
-      for (let workerTargetActor in workerForms) {
-        if (!(workerTargetActor in this._workerForms)) {
-          let workerForm = workerForms[workerTargetActor];
-          this._workerForms[workerTargetActor] = workerForm;
-          DebuggerView.Workers.addWorker(workerForm);
-        }
-      }
-    });
-  },
-
-  _onWorkerListChanged: function () {
-    this._updateWorkerList();
-  },
-
-  _onWorkerSelect: function (workerForm) {
-    DebuggerController.client.attachWorker(workerForm.actor).then(([response, workerTargetFront]) => {
-      let toolbox = gDevTools.showToolbox(TargetFactory.forWorker(workerTargetFront),
-                                          "jsdebugger", Toolbox.HostType.WINDOW);
-      window.emit(EVENTS.WORKER_SELECTED, toolbox);
-    });
-  }
-};
-
-/**
- * ThreadState keeps the UI up to date with the state of the
- * thread (paused/attached/etc.).
- */
-function ThreadState() {
-  this._update = this._update.bind(this);
-  this.interruptedByResumeButton = false;
-}
-
-ThreadState.prototype = {
-  get activeThread() {
-    return DebuggerController.activeThread;
-  },
-
-  /**
-   * Connect to the current thread client.
-   */
-  connect: function () {
-    dumpn("ThreadState is connecting...");
-    this.activeThread.addListener("paused", this._update);
-    this.activeThread.addListener("resumed", this._update);
-  },
-
-  /**
-   * Disconnect from the client.
-   */
-  disconnect: function () {
-    if (!this.activeThread) {
-      return;
-    }
-    dumpn("ThreadState is disconnecting...");
-    this.activeThread.removeListener("paused", this._update);
-    this.activeThread.removeListener("resumed", this._update);
-  },
-
-  /**
-   * Handles any initialization on a tab navigation event issued by the client.
-   */
-  handleTabNavigation: function () {
-    if (!this.activeThread) {
-      return;
-    }
-    dumpn("Handling tab navigation in the ThreadState");
-    this._update();
-  },
-
-  /**
-   * Update the UI after a thread state change.
-   */
-  _update: function (aEvent, aPacket) {
-    if (aEvent == "paused") {
-      if (aPacket.why.type == "interrupted" &&
-          this.interruptedByResumeButton) {
-        // Interrupt requests suppressed by default, but if this is an
-        // explicit interrupt by the pause button we want to emit it.
-        gTarget.emit("thread-paused", aPacket);
-      } else if (aPacket.why.type == "breakpointConditionThrown" && aPacket.why.message) {
-        let where = aPacket.frame.where;
-        let aLocation = {
-          line: where.line,
-          column: where.column,
-          actor: where.source ? where.source.actor : null
-        };
-        DebuggerView.Sources.showBreakpointConditionThrownMessage(
-          aLocation,
-          aPacket.why.message
-        );
-      }
-    }
-
-    this.interruptedByResumeButton = false;
-    DebuggerView.Toolbar.toggleResumeButtonState(
-      this.activeThread.state,
-      aPacket ? aPacket.frame : false
-    );
-  }
-};
-
-/**
- * Keeps the stack frame list up-to-date, using the thread client's
- * stack frame cache.
- */
-function StackFrames() {
-  this._onPaused = this._onPaused.bind(this);
-  this._onResumed = this._onResumed.bind(this);
-  this._onFrames = this._onFrames.bind(this);
-  this._onFramesCleared = this._onFramesCleared.bind(this);
-  this._onBlackBoxChange = this._onBlackBoxChange.bind(this);
-  this._onPrettyPrintChange = this._onPrettyPrintChange.bind(this);
-  this._afterFramesCleared = this._afterFramesCleared.bind(this);
-  this.evaluate = this.evaluate.bind(this);
-}
-
-StackFrames.prototype = {
-  get activeThread() {
-    return DebuggerController.activeThread;
-  },
-
-  currentFrameDepth: -1,
-  _currentFrameDescription: FRAME_TYPE.NORMAL,
-  _syncedWatchExpressions: null,
-  _currentWatchExpressions: null,
-  _currentBreakpointLocation: null,
-  _currentEvaluation: null,
-  _currentException: null,
-  _currentReturnedValue: null,
-
-  /**
-   * Connect to the current thread client.
-   */
-  connect: function () {
-    dumpn("StackFrames is connecting...");
-    this.activeThread.addListener("paused", this._onPaused);
-    this.activeThread.addListener("resumed", this._onResumed);
-    this.activeThread.addListener("framesadded", this._onFrames);
-    this.activeThread.addListener("framescleared", this._onFramesCleared);
-    this.activeThread.addListener("blackboxchange", this._onBlackBoxChange);
-    this.activeThread.addListener("prettyprintchange", this._onPrettyPrintChange);
-    this.handleTabNavigation();
-  },
-
-  /**
-   * Disconnect from the client.
-   */
-  disconnect: function () {
-    if (!this.activeThread) {
-      return;
-    }
-    dumpn("StackFrames is disconnecting...");
-    this.activeThread.removeListener("paused", this._onPaused);
-    this.activeThread.removeListener("resumed", this._onResumed);
-    this.activeThread.removeListener("framesadded", this._onFrames);
-    this.activeThread.removeListener("framescleared", this._onFramesCleared);
-    this.activeThread.removeListener("blackboxchange", this._onBlackBoxChange);
-    this.activeThread.removeListener("prettyprintchange", this._onPrettyPrintChange);
-    clearNamedTimeout("frames-cleared");
-  },
-
-  /**
-   * Handles any initialization on a tab navigation event issued by the client.
-   */
-  handleTabNavigation: function () {
-    dumpn("Handling tab navigation in the StackFrames");
-    // Nothing to do here yet.
-  },
-
-  /**
-   * Handler for the thread client's paused notification.
-   *
-   * @param string aEvent
-   *        The name of the notification ("paused" in this case).
-   * @param object aPacket
-   *        The response packet.
-   */
-  _onPaused: function (aEvent, aPacket) {
-    switch (aPacket.why.type) {
-      // If paused by a breakpoint, store the breakpoint location.
-      case "breakpoint":
-        this._currentBreakpointLocation = aPacket.frame.where;
-        break;
-      case "breakpointConditionThrown":
-        this._currentBreakpointLocation = aPacket.frame.where;
-        this._conditionThrowMessage = aPacket.why.message;
-        break;
-      // If paused by a client evaluation, store the evaluated value.
-      case "clientEvaluated":
-        this._currentEvaluation = aPacket.why.frameFinished;
-        break;
-      // If paused by an exception, store the exception value.
-      case "exception":
-        this._currentException = aPacket.why.exception;
-        break;
-      // If paused while stepping out of a frame, store the returned value or
-      // thrown exception.
-      case "resumeLimit":
-        if (!aPacket.why.frameFinished) {
-          break;
-        } else if (aPacket.why.frameFinished.throw) {
-          this._currentException = aPacket.why.frameFinished.throw;
-        } else if (aPacket.why.frameFinished.return) {
-          this._currentReturnedValue = aPacket.why.frameFinished.return;
-        }
-        break;
-      // If paused by an explicit interrupt, which are generated by the slow
-      // script dialog and internal events such as setting breakpoints, ignore
-      // the event to avoid UI flicker.
-      case "interrupted":
-        if (!aPacket.why.onNext) {
-          return;
-        }
-        break;
-    }
-
-    this.activeThread.fillFrames(CALL_STACK_PAGE_SIZE);
-    // Focus the editor, but don't steal focus from the split console.
-    if (!DebuggerController._toolbox.isSplitConsoleFocused()) {
-      DebuggerView.editor.focus();
-    }
-  },
-
-  /**
-   * Handler for the thread client's resumed notification.
-   */
-  _onResumed: function () {
-    // Prepare the watch expression evaluation string for the next pause.
-    if (this._currentFrameDescription != FRAME_TYPE.WATCH_EXPRESSIONS_EVAL) {
-      this._currentWatchExpressions = this._syncedWatchExpressions;
-    }
-  },
-
-  /**
-   * Handler for the thread client's framesadded notification.
-   */
-  _onFrames: Task.async(function* () {
-    // Ignore useless notifications.
-    if (!this.activeThread || !this.activeThread.cachedFrames.length) {
-      return;
-    }
-    if (this._currentFrameDescription != FRAME_TYPE.NORMAL &&
-        this._currentFrameDescription != FRAME_TYPE.PUBLIC_CLIENT_EVAL) {
-      return;
-    }
-
-    // TODO: remove all of this deprecated code: Bug 990137.
-    yield this._handleConditionalBreakpoint();
-
-    // TODO: handle all of this server-side: Bug 832470, comment 14.
-    yield this._handleWatchExpressions();
-
-    // Make sure the debugger view panes are visible, then refill the frames.
-    DebuggerView.showInstrumentsPane();
-    this._refillFrames();
-
-    // No additional processing is necessary for this stack frame.
-    if (this._currentFrameDescription != FRAME_TYPE.NORMAL) {
-      this._currentFrameDescription = FRAME_TYPE.NORMAL;
-    }
-  }),
-
-  /**
-   * Fill the StackFrames view with the frames we have in the cache, compressing
-   * frames which have black boxed sources into single frames.
-   */
-  _refillFrames: function () {
-    // Make sure all the previous stackframes are removed before re-adding them.
-    DebuggerView.StackFrames.empty();
-
-    for (let frame of this.activeThread.cachedFrames) {
-      let { depth, source, where: { line, column } } = frame;
-
-      let isBlackBoxed = source ? this.activeThread.source(source).isBlackBoxed : false;
-      DebuggerView.StackFrames.addFrame(frame, line, column, depth, isBlackBoxed);
-    }
-
-    DebuggerView.StackFrames.selectedDepth = Math.max(this.currentFrameDepth, 0);
-    DebuggerView.StackFrames.dirty = this.activeThread.moreFrames;
-
-    DebuggerView.StackFrames.addCopyContextMenu();
-
-    window.emit(EVENTS.AFTER_FRAMES_REFILLED);
-  },
-
-  /**
-   * Handler for the thread client's framescleared notification.
-   */
-  _onFramesCleared: function () {
-    switch (this._currentFrameDescription) {
-      case FRAME_TYPE.NORMAL:
-        this._currentEvaluation = null;
-        this._currentException = null;
-        this._currentReturnedValue = null;
-        break;
-      case FRAME_TYPE.CONDITIONAL_BREAKPOINT_EVAL:
-        this._currentBreakpointLocation = null;
-        break;
-      case FRAME_TYPE.WATCH_EXPRESSIONS_EVAL:
-        this._currentWatchExpressions = null;
-        break;
-    }
-
-    // After each frame step (in, over, out), framescleared is fired, which
-    // forces the UI to be emptied and rebuilt on framesadded. Most of the times
-    // this is not necessary, and will result in a brief redraw flicker.
-    // To avoid it, invalidate the UI only after a short time if necessary.
-    setNamedTimeout("frames-cleared", FRAME_STEP_CLEAR_DELAY, this._afterFramesCleared);
-  },
-
-  /**
-   * Handler for the debugger's blackboxchange notification.
-   */
-  _onBlackBoxChange: function () {
-    if (this.activeThread.state == "paused") {
-      // Hack to avoid selecting the topmost frame after blackboxing a source.
-      this.currentFrameDepth = NaN;
-      this._refillFrames();
-    }
-  },
-
-  /**
-   * Handler for the debugger's prettyprintchange notification.
-   */
-  _onPrettyPrintChange: function () {
-    if (this.activeThread.state != "paused") {
-      return;
-    }
-    // Makes sure the selected source remains selected
-    // after the fillFrames is called.
-    const source = DebuggerView.Sources.selectedValue;
-
-    this.activeThread.fillFrames(CALL_STACK_PAGE_SIZE, () => {
-      DebuggerView.Sources.selectedValue = source;
-    });
-  },
-
-  /**
-   * Called soon after the thread client's framescleared notification.
-   */
-  _afterFramesCleared: function () {
-    // Ignore useless notifications.
-    if (this.activeThread.cachedFrames.length) {
-      return;
-    }
-    DebuggerView.editor.clearDebugLocation();
-    DebuggerView.StackFrames.empty();
-    DebuggerView.Sources.unhighlightBreakpoint();
-    DebuggerView.WatchExpressions.toggleContents(true);
-    DebuggerView.Variables.empty(0);
-
-    window.emit(EVENTS.AFTER_FRAMES_CLEARED);
-  },
-
-  /**
-   * Marks the stack frame at the specified depth as selected and updates the
-   * properties view with the stack frame's data.
-   *
-   * @param number aDepth
-   *        The depth of the frame in the stack.
-   */
-  selectFrame: function (aDepth) {
-    // Make sure the frame at the specified depth exists first.
-    let frame = this.activeThread.cachedFrames[this.currentFrameDepth = aDepth];
-    if (!frame) {
-      return;
-    }
-
-    // Check if the frame does not represent the evaluation of debuggee code.
-    let { environment, where, source } = frame;
-    if (!environment) {
-      return;
-    }
-
-    // Don't change the editor's location if the execution was paused by a
-    // public client evaluation. This is useful for adding overlays on
-    // top of the editor, like a variable inspection popup.
-    let isClientEval = this._currentFrameDescription == FRAME_TYPE.PUBLIC_CLIENT_EVAL;
-    let isPopupShown = DebuggerView.VariableBubble.contentsShown();
-    if (!isClientEval && !isPopupShown) {
-      // Move the editor's caret to the proper url and line.
-      DebuggerView.setEditorLocation(source.actor, where.line);
-    } else {
-      // Highlight the line where the execution is paused in the editor.
-      DebuggerView.setEditorLocation(source.actor, where.line, { noCaret: true });
-    }
-
-    // Highlight the breakpoint at the line and column if it exists.
-    DebuggerView.Sources.highlightBreakpointAtCursor();
-
-    // Don't display the watch expressions textbox inputs in the pane.
-    DebuggerView.WatchExpressions.toggleContents(false);
-
-    // Start recording any added variables or properties in any scope and
-    // clear existing scopes to create each one dynamically.
-    DebuggerView.Variables.empty();
-
-    // If watch expressions evaluation results are available, create a scope
-    // to contain all the values.
-    if (this._syncedWatchExpressions && aDepth == 0) {
-      let label = L10N.getStr("watchExpressionsScopeLabel");
-      let scope = DebuggerView.Variables.addScope(label,
-        "variables-view-watch-expressions");
-
-      // Customize the scope for holding watch expressions evaluations.
-      scope.descriptorTooltip = false;
-      scope.contextMenuId = "debuggerWatchExpressionsContextMenu";
-      scope.separatorStr = L10N.getStr("watchExpressionsSeparatorLabel2");
-      scope.switch = DebuggerView.WatchExpressions.switchExpression;
-      scope.delete = DebuggerView.WatchExpressions.deleteExpression;
-
-      // The evaluation hasn't thrown, so fetch and add the returned results.
-      this._fetchWatchExpressions(scope, this._currentEvaluation.return);
-
-      // The watch expressions scope is always automatically expanded.
-      scope.expand();
-    }
-
-    do {
-      // Create a scope to contain all the inspected variables in the
-      // current environment.
-      let label = StackFrameUtils.getScopeLabel(environment);
-      let scope = DebuggerView.Variables.addScope(label);
-      let innermost = environment == frame.environment;
-
-      // Handle special additions to the innermost scope.
-      if (innermost) {
-        this._insertScopeFrameReferences(scope, frame);
-      }
-
-      // Handle the expansion of the scope, lazily populating it with the
-      // variables in the current environment.
-      DebuggerView.Variables.controller.addExpander(scope, environment);
-
-      // The innermost scope is always automatically expanded, because it
-      // contains the variables in the current stack frame which are likely to
-      // be inspected. The previously expanded scopes are also reexpanded here.
-      if (innermost || DebuggerView.Variables.wasExpanded(scope)) {
-        scope.expand();
-      }
-    } while ((environment = environment.parent));
-
-    // Signal that scope environments have been shown.
-    window.emit(EVENTS.FETCHED_SCOPES);
-  },
-
-  /**
-   * Loads more stack frames from the debugger server cache.
-   */
-  addMoreFrames: function () {
-    this.activeThread.fillFrames(
-      this.activeThread.cachedFrames.length + CALL_STACK_PAGE_SIZE);
-  },
-
-  /**
-   * Evaluate an expression in the context of the selected frame.
-   *
-   * @param string expression
-   *        The expression to evaluate.
-   * @param object options [optional]
-   *        Additional options for this client evaluation:
-   *          - depth: the frame depth used for evaluation, 0 being the topmost.
-   *          - meta: some meta-description for what this evaluation represents.
-   * @return object
-   *         A promise that is resolved when the evaluation finishes,
-   *         or rejected if there was no stack frame available or some
-   *         other error occurred.
-   */
-  evaluate: async function (expression, options = {}) {
-    let depth = "depth" in options
-      ? options.depth
-      : this.currentFrameDepth;
-    let frame = this.activeThread.cachedFrames[depth];
-    if (frame == null) {
-      throw new Error("No stack frame available.");
-    }
-
-    const onThreadPaused = this.activeThread.addOneTimeListener("paused");
-
-    let meta = "meta" in options
-      ? options.meta
-      : FRAME_TYPE.PUBLIC_CLIENT_EVAL;
-    this._currentFrameDescription = meta;
-    this.activeThread.eval(frame.actor, expression);
-
-    const packet = await onThreadPaused;
-
-    let { type, frameFinished } = packet.why;
-    if (type !== "clientEvaluated") {
-      throw new Error("Active thread paused unexpectedly.");
-    }
-
-    return frameFinished;
-  },
-
-  /**
-   * Add nodes for special frame references in the innermost scope.
-   *
-   * @param Scope aScope
-   *        The scope where the references will be placed into.
-   * @param object aFrame
-   *        The frame to get some references from.
-   */
-  _insertScopeFrameReferences: function (aScope, aFrame) {
-    // Add any thrown exception.
-    if (this._currentException) {
-      let excRef = aScope.addItem("<exception>", { value: this._currentException },
-                                  { internalItem: true });
-      DebuggerView.Variables.controller.addExpander(excRef, this._currentException);
-    }
-    // Add any returned value.
-    if (this._currentReturnedValue) {
-      let retRef = aScope.addItem("<return>",
-                                  { value: this._currentReturnedValue },
-                                  { internalItem: true });
-      DebuggerView.Variables.controller.addExpander(retRef, this._currentReturnedValue);
-    }
-    // Add "this".
-    if (aFrame.this) {
-      let thisRef = aScope.addItem("this", { value: aFrame.this });
-      DebuggerView.Variables.controller.addExpander(thisRef, aFrame.this);
-    }
-  },
-
-  /**
-   * Handles conditional breakpoints when the debugger pauses and the
-   * stackframes are received.
-   *
-   * We moved conditional breakpoint handling to the server, but
-   * need to support it in the client for a while until most of the
-   * server code in production is updated with it.
-   * TODO: remove all of this deprecated code: Bug 990137.
-   *
-   * @return object
-   *         A promise that is resolved after a potential breakpoint's
-   *         conditional expression is evaluated. If there's no breakpoint
-   *         where the debugger is paused, the promise is resolved immediately.
-   */
-  _handleConditionalBreakpoint: Task.async(function* () {
-    if (gClient.mainRoot.traits.conditionalBreakpoints) {
-      return;
-    }
-    let breakLocation = this._currentBreakpointLocation;
-    if (!breakLocation) {
-      return;
-    }
-
-    let bp = queries.getBreakpoint(DebuggerController.getState(), {
-      actor: breakLocation.source.actor,
-      line: breakLocation.line
-    });
-    let conditionalExpression = bp.condition;
-    if (!conditionalExpression) {
-      return;
-    }
-
-    // Evaluating the current breakpoint's conditional expression will
-    // cause the stack frames to be cleared and active thread to pause,
-    // sending a 'clientEvaluated' packed and adding the frames again.
-    let evaluationOptions = { depth: 0, meta: FRAME_TYPE.CONDITIONAL_BREAKPOINT_EVAL };
-    yield this.evaluate(conditionalExpression, evaluationOptions);
-    this._currentFrameDescription = FRAME_TYPE.NORMAL;
-
-    // If the breakpoint's conditional expression evaluation is falsy
-    // and there is no exception, automatically resume execution.
-    if (!this._currentEvaluation.throw &&
-        VariablesView.isFalsy({ value: this._currentEvaluation.return })) {
-      this.activeThread.resume(DebuggerController._ensureResumptionOrder);
-    }
-  }),
-
-  /**
-   * Handles watch expressions when the debugger pauses and the stackframes
-   * are received.
-   *
-   * @return object
-   *         A promise that is resolved after the potential watch expressions
-   *         are evaluated. If there are no watch expressions where the debugger
-   *         is paused, the promise is resolved immediately.
-   */
-  _handleWatchExpressions: Task.async(function* () {
-    // Ignore useless notifications.
-    if (!this.activeThread || !this.activeThread.cachedFrames.length) {
-      return;
-    }
-
-    let watchExpressions = this._currentWatchExpressions;
-    if (!watchExpressions) {
-      return;
-    }
-
-    // Evaluation causes the stack frames to be cleared and active thread to
-    // pause, sending a 'clientEvaluated' packet and adding the frames again.
-    let evaluationOptions = { depth: 0, meta: FRAME_TYPE.WATCH_EXPRESSIONS_EVAL };
-    yield this.evaluate(watchExpressions, evaluationOptions);
-    this._currentFrameDescription = FRAME_TYPE.NORMAL;
-
-    // If an error was thrown during the evaluation of the watch expressions
-    // or the evaluation was terminated from the slow script dialog, then at
-    // least one expression evaluation could not be performed. So remove the
-    // most recent watch expression and try again.
-    if (this._currentEvaluation.throw || this._currentEvaluation.terminated) {
-      DebuggerView.WatchExpressions.removeAt(0);
-      yield DebuggerController.StackFrames.syncWatchExpressions();
-    }
-  }),
-
-  /**
-   * Adds the watch expressions evaluation results to a scope in the view.
-   *
-   * @param Scope aScope
-   *        The scope where the watch expressions will be placed into.
-   * @param object aExp
-   *        The grip of the evaluation results.
-   */
-  _fetchWatchExpressions: function (aScope, aExp) {
-    // Fetch the expressions only once.
-    if (aScope._fetched) {
-      return;
-    }
-    aScope._fetched = true;
-
-    // Add nodes for every watch expression in scope.
-    this.activeThread.pauseGrip(aExp).getPrototypeAndProperties(aResponse => {
-      let ownProperties = aResponse.ownProperties;
-      let totalExpressions = DebuggerView.WatchExpressions.itemCount;
-
-      for (let i = 0; i < totalExpressions; i++) {
-        let name = DebuggerView.WatchExpressions.getString(i);
-        let expVal = ownProperties[i].value;
-        let expRef = aScope.addItem(name, ownProperties[i]);
-        DebuggerView.Variables.controller.addExpander(expRef, expVal);
-
-        // Revert some of the custom watch expressions scope presentation flags,
-        // so that they don't propagate to child items.
-        expRef.switch = null;
-        expRef.delete = null;
-        expRef.descriptorTooltip = true;
-        expRef.separatorStr = L10N.getStr("variablesSeparatorLabel");
-      }
-
-      // Signal that watch expressions have been fetched.
-      window.emit(EVENTS.FETCHED_WATCH_EXPRESSIONS);
-    });
-  },
-
-  /**
-   * Updates a list of watch expressions to evaluate on each pause.
-   * TODO: handle all of this server-side: Bug 832470, comment 14.
-   */
-  syncWatchExpressions: function () {
-    let list = DebuggerView.WatchExpressions.getAllStrings();
-
-    // Sanity check all watch expressions before syncing them. To avoid
-    // having the whole watch expressions array throw because of a single
-    // faulty expression, simply convert it to a string describing the error.
-    // There's no other information necessary t