Bug 1403944 - Remove Web Audio Editor front and panel; r=vporof
☠☠ backed out by 75b49fcc2743 ☠ ☠
authoryulia <ystartsev@mozilla.com>
Tue, 12 Mar 2019 14:50:18 +0000
changeset 521536 f1003c2742c2
parent 521535 06a583daf142
child 521537 c8fcdc7c2e0b
push id10867
push userdvarga@mozilla.com
push dateThu, 14 Mar 2019 15:20:45 +0000
treeherdermozilla-beta@abad13547875 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersvporof
bugs1403944
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1403944 - Remove Web Audio Editor front and panel; r=vporof Differential Revision: https://phabricator.services.mozilla.com/D19527
devtools/.eslintrc.js
devtools/client/debugger/new/src/client/firefox/types.js
devtools/client/definitions.js
devtools/client/framework/test/browser_target_support.js
devtools/client/jar.mn
devtools/client/locales/en-US/webaudioeditor.dtd
devtools/client/locales/en-US/webaudioeditor.properties
devtools/client/moz.build
devtools/client/preferences/devtools-client.js
devtools/client/shared/test/browser.ini
devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js
devtools/client/themes/images/filters.svg
devtools/client/themes/images/power.svg
devtools/client/themes/webaudioeditor.css
devtools/client/webaudioeditor/controller.js
devtools/client/webaudioeditor/includes.js
devtools/client/webaudioeditor/index.xul
devtools/client/webaudioeditor/models.js
devtools/client/webaudioeditor/moz.build
devtools/client/webaudioeditor/panel.js
devtools/client/webaudioeditor/test/.eslintrc.js
devtools/client/webaudioeditor/test/440hz_sine.ogg
devtools/client/webaudioeditor/test/browser.ini
devtools/client/webaudioeditor/test/browser_audionode-actor-add-automation-event.js
devtools/client/webaudioeditor/test/browser_audionode-actor-bypass.js
devtools/client/webaudioeditor/test/browser_audionode-actor-bypassable.js
devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js
devtools/client/webaudioeditor/test/browser_audionode-actor-connectparam.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-01.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-02.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-03.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-param-flags.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-params-01.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-params-02.js
devtools/client/webaudioeditor/test/browser_audionode-actor-get-set-param.js
devtools/client/webaudioeditor/test/browser_audionode-actor-source.js
devtools/client/webaudioeditor/test/browser_audionode-actor-type.js
devtools/client/webaudioeditor/test/browser_callwatcher-01.js
devtools/client/webaudioeditor/test/browser_callwatcher-02.js
devtools/client/webaudioeditor/test/browser_wa_automation-view-01.js
devtools/client/webaudioeditor/test/browser_wa_automation-view-02.js
devtools/client/webaudioeditor/test/browser_wa_controller-01.js
devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js
devtools/client/webaudioeditor/test/browser_wa_first-run.js
devtools/client/webaudioeditor/test/browser_wa_graph-click.js
devtools/client/webaudioeditor/test/browser_wa_graph-markers.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-01.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-02.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-03.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-04.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-05.js
devtools/client/webaudioeditor/test/browser_wa_graph-render-06.js
devtools/client/webaudioeditor/test/browser_wa_graph-selected.js
devtools/client/webaudioeditor/test/browser_wa_graph-zoom.js
devtools/client/webaudioeditor/test/browser_wa_inspector-bypass-01.js
devtools/client/webaudioeditor/test/browser_wa_inspector-toggle.js
devtools/client/webaudioeditor/test/browser_wa_inspector-width.js
devtools/client/webaudioeditor/test/browser_wa_inspector.js
devtools/client/webaudioeditor/test/browser_wa_navigate.js
devtools/client/webaudioeditor/test/browser_wa_properties-view-edit-01.js
devtools/client/webaudioeditor/test/browser_wa_properties-view-edit-02.js
devtools/client/webaudioeditor/test/browser_wa_properties-view-media-nodes.js
devtools/client/webaudioeditor/test/browser_wa_properties-view-params-objects.js
devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js
devtools/client/webaudioeditor/test/browser_wa_properties-view.js
devtools/client/webaudioeditor/test/browser_wa_reset-01.js
devtools/client/webaudioeditor/test/browser_wa_reset-02.js
devtools/client/webaudioeditor/test/browser_wa_reset-03.js
devtools/client/webaudioeditor/test/browser_wa_reset-04.js
devtools/client/webaudioeditor/test/browser_webaudio-actor-automation-event.js
devtools/client/webaudioeditor/test/browser_webaudio-actor-connect-param.js
devtools/client/webaudioeditor/test/browser_webaudio-actor-destroy-node.js
devtools/client/webaudioeditor/test/browser_webaudio-actor-simple.js
devtools/client/webaudioeditor/test/doc_automation.html
devtools/client/webaudioeditor/test/doc_buffer-and-array.html
devtools/client/webaudioeditor/test/doc_bug_1112378.html
devtools/client/webaudioeditor/test/doc_bug_1125817.html
devtools/client/webaudioeditor/test/doc_bug_1130901.html
devtools/client/webaudioeditor/test/doc_bug_1141261.html
devtools/client/webaudioeditor/test/doc_complex-context.html
devtools/client/webaudioeditor/test/doc_connect-multi-param.html
devtools/client/webaudioeditor/test/doc_connect-param.html
devtools/client/webaudioeditor/test/doc_destroy-nodes.html
devtools/client/webaudioeditor/test/doc_iframe-context.html
devtools/client/webaudioeditor/test/doc_media-node-creation.html
devtools/client/webaudioeditor/test/doc_simple-context.html
devtools/client/webaudioeditor/test/doc_simple-node-creation.html
devtools/client/webaudioeditor/test/head.js
devtools/client/webaudioeditor/views/automation.js
devtools/client/webaudioeditor/views/context.js
devtools/client/webaudioeditor/views/inspector.js
devtools/client/webaudioeditor/views/properties.js
devtools/client/webaudioeditor/views/utils.js
devtools/shared/fronts/moz.build
devtools/shared/fronts/webaudio.js
devtools/shared/specs/index.js
--- a/devtools/.eslintrc.js
+++ b/devtools/.eslintrc.js
@@ -102,19 +102,16 @@ module.exports = {
       "client/scratchpad/**",
       "client/webide/**",
     ],
     "rules": {
       "strict": "off",
     }
   }, {
     "files": [
-      // Note: Bug 1403944 may be removing webaudioeditor, check before
-      // doing more work on enabling these rules.
-      "client/webaudioeditor/**",
     ],
     "rules": {
       "consistent-return": "off",
       "max-len": "off",
       "mozilla/no-aArgs": "off",
       "mozilla/var-only-at-top-level": "off",
       "no-redeclare": "off",
       "no-return-assign": "off",
--- a/devtools/client/debugger/new/src/client/firefox/types.js
+++ b/devtools/client/debugger/new/src/client/firefox/types.js
@@ -178,17 +178,16 @@ export type TabPayload = {
   reflowActor: ActorId,
   storageActor: ActorId,
   styleEditorActor: ActorId,
   styleSheetsActor: ActorId,
   timelineActor: ActorId,
   title: string,
   url: URL,
   webExtensionInspectedWindowActor: ActorId,
-  webaudioActor: ActorId,
   webglActor: ActorId
 };
 
 /**
  * Actions
  * @memberof firefox
  * @static
  */
--- a/devtools/client/definitions.js
+++ b/devtools/client/definitions.js
@@ -8,17 +8,16 @@ const Services = require("Services");
 const osString = Services.appinfo.OS;
 
 // Panels
 loader.lazyGetter(this, "OptionsPanel", () => require("devtools/client/framework/toolbox-options").OptionsPanel);
 loader.lazyGetter(this, "InspectorPanel", () => require("devtools/client/inspector/panel").InspectorPanel);
 loader.lazyGetter(this, "WebConsolePanel", () => require("devtools/client/webconsole/panel").WebConsolePanel);
 loader.lazyGetter(this, "NewDebuggerPanel", () => require("devtools/client/debugger/new/panel").DebuggerPanel);
 loader.lazyGetter(this, "StyleEditorPanel", () => require("devtools/client/styleeditor/panel").StyleEditorPanel);
-loader.lazyGetter(this, "WebAudioEditorPanel", () => require("devtools/client/webaudioeditor/panel").WebAudioEditorPanel);
 loader.lazyGetter(this, "MemoryPanel", () => require("devtools/client/memory/panel").MemoryPanel);
 loader.lazyGetter(this, "PerformancePanel", () => require("devtools/client/performance/panel").PerformancePanel);
 loader.lazyGetter(this, "NewPerformancePanel", () => require("devtools/client/performance-new/panel").PerformancePanel);
 loader.lazyGetter(this, "NetMonitorPanel", () => require("devtools/client/netmonitor/panel").NetMonitorPanel);
 loader.lazyGetter(this, "StoragePanel", () => require("devtools/client/storage/panel").StoragePanel);
 loader.lazyGetter(this, "ScratchpadPanel", () => require("devtools/client/scratchpad/panel").ScratchpadPanel);
 loader.lazyGetter(this, "DomPanel", () => require("devtools/client/dom/panel").DomPanel);
 loader.lazyGetter(this, "AccessibilityPanel", () => require("devtools/client/accessibility/panel").AccessibilityPanel);
@@ -288,37 +287,16 @@ Tools.storage = {
            (target.hasActor("storage") && target.getTrait("storageInspector"));
   },
 
   build: function(iframeWindow, toolbox) {
     return new StoragePanel(iframeWindow, toolbox);
   },
 };
 
-Tools.webAudioEditor = {
-  id: "webaudioeditor",
-  deprecated: true,
-  deprecationURL: DEPRECATION_URL,
-  ordinal: 11,
-  visibilityswitch: "devtools.webaudioeditor.enabled",
-  icon: "chrome://devtools/skin/images/tool-webaudio.svg",
-  url: "chrome://devtools/content/webaudioeditor/index.xul",
-  label: l10n("ToolboxWebAudioEditor1.label"),
-  panelLabel: l10n("ToolboxWebAudioEditor1.panelLabel"),
-  tooltip: l10n("ToolboxWebAudioEditor1.tooltip"),
-
-  isTargetSupported: function(target) {
-    return !target.chrome && target.hasActor("webaudio");
-  },
-
-  build: function(iframeWindow, toolbox) {
-    return new WebAudioEditorPanel(iframeWindow, toolbox);
-  },
-};
-
 Tools.scratchpad = {
   id: "scratchpad",
   ordinal: 12,
   visibilityswitch: "devtools.scratchpad.enabled",
   icon: "chrome://devtools/skin/images/tool-scratchpad.svg",
   url: "chrome://devtools/content/scratchpad/index.xul",
   label: l10n("scratchpad.label"),
   panelLabel: l10n("scratchpad.panelLabel"),
@@ -409,17 +387,16 @@ Tools.application = {
 };
 
 var defaultTools = [
   Tools.options,
   Tools.webConsole,
   Tools.inspector,
   Tools.jsdebugger,
   Tools.styleEditor,
-  Tools.webAudioEditor,
   Tools.performance,
   Tools.netMonitor,
   Tools.storage,
   Tools.scratchpad,
   Tools.memory,
   Tools.dom,
   Tools.accessibility,
   Tools.application,
--- a/devtools/client/framework/test/browser_target_support.js
+++ b/devtools/client/framework/test/browser_target_support.js
@@ -5,36 +5,36 @@
 
 // Test support methods on Target, such as `hasActor`, `getActorDescription`,
 // `actorHasMethod` and `getTrait`.
 
 async function testTarget(client, target) {
   await target.attach();
 
   is(target.hasActor("inspector"), true, "target.hasActor() true when actor exists.");
-  is(target.hasActor("webaudio"), true, "target.hasActor() true when actor exists.");
+  is(target.hasActor("storage"), true, "target.hasActor() true when actor exists.");
   is(target.hasActor("notreal"), false, "target.hasActor() false when actor does not exist.");
   // Create a front to ensure the actor is loaded
-  await target.getFront("webaudio");
+  await target.getFront("storage");
 
-  let desc = await target.getActorDescription("webaudio");
-  is(desc.typeName, "webaudio",
+  let desc = await target.getActorDescription("storage");
+  is(desc.typeName, "storage",
     "target.getActorDescription() returns definition data for corresponding actor");
   is(desc.events["start-context"].type, "startContext",
     "target.getActorDescription() returns event data for corresponding actor");
 
   desc = await target.getActorDescription("nope");
   is(desc, undefined, "target.getActorDescription() returns undefined for non-existing actor");
   desc = await target.getActorDescription();
   is(desc, undefined, "target.getActorDescription() returns undefined for undefined actor");
 
-  let hasMethod = await target.actorHasMethod("audionode", "getType");
+  let hasMethod = await target.actorHasMethod("localStorage", "getType");
   is(hasMethod, true,
     "target.actorHasMethod() returns true for existing actor with method");
-  hasMethod = await target.actorHasMethod("audionode", "nope");
+  hasMethod = await target.actorHasMethod("localStorage", "nope");
   is(hasMethod, false,
     "target.actorHasMethod() returns false for existing actor with no method");
   hasMethod = await target.actorHasMethod("nope", "nope");
   is(hasMethod, false,
     "target.actorHasMethod() returns false for non-existing actor with no method");
   hasMethod = await target.actorHasMethod();
   is(hasMethod, false,
     "target.actorHasMethod() returns false for undefined params");
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -18,25 +18,16 @@ devtools.jar:
     content/shared/sourceeditor/codemirror/addon/dialog/dialog.css (shared/sourceeditor/codemirror/addon/dialog/dialog.css)
     content/shared/sourceeditor/codemirror/addon/hint/show-hint.js (shared/sourceeditor/codemirror/addon/hint/show-hint.js)
     content/shared/sourceeditor/codemirror/addon/tern/tern.js (shared/sourceeditor/codemirror/addon/tern/tern.js)
     content/shared/sourceeditor/codemirror/codemirror.bundle.js (shared/sourceeditor/codemirror/codemirror.bundle.js)
     content/shared/sourceeditor/codemirror/lib/codemirror.css (shared/sourceeditor/codemirror/lib/codemirror.css)
     content/shared/sourceeditor/codemirror/mozilla.css (shared/sourceeditor/codemirror/mozilla.css)
     content/shared/sourceeditor/codemirror/cmiframe.html (shared/sourceeditor/codemirror/cmiframe.html)
     content/debugger/new/index.html (debugger/new/index.html)
-    content/webaudioeditor/index.xul (webaudioeditor/index.xul)
-    content/webaudioeditor/includes.js (webaudioeditor/includes.js)
-    content/webaudioeditor/models.js (webaudioeditor/models.js)
-    content/webaudioeditor/controller.js (webaudioeditor/controller.js)
-    content/webaudioeditor/views/utils.js (webaudioeditor/views/utils.js)
-    content/webaudioeditor/views/context.js (webaudioeditor/views/context.js)
-    content/webaudioeditor/views/inspector.js (webaudioeditor/views/inspector.js)
-    content/webaudioeditor/views/properties.js (webaudioeditor/views/properties.js)
-    content/webaudioeditor/views/automation.js (webaudioeditor/views/automation.js)
     content/performance/index.xul (performance/index.xul)
     content/performance-new/index.xhtml (performance-new/index.xhtml)
     content/performance-new/frame-script.js (performance-new/frame-script.js)
     content/memory/index.xhtml (memory/index.xhtml)
     content/framework/toolbox-window.xul (framework/toolbox-window.xul)
     content/framework/toolbox-options.xhtml (framework/toolbox-options.xhtml)
     content/framework/toolbox.xul (framework/toolbox.xul)
     content/framework/toolbox-init.js (framework/toolbox-init.js)
@@ -131,17 +122,16 @@ devtools.jar:
     skin/animation.css (themes/animation.css)
     skin/perf.css (themes/perf.css)
     skin/performance.css (themes/performance.css)
     skin/memory.css (themes/memory.css)
     skin/scratchpad.css (themes/scratchpad.css)
     skin/storage.css (themes/storage.css)
     skin/splitview.css (themes/splitview.css)
     skin/styleeditor.css (themes/styleeditor.css)
-    skin/webaudioeditor.css (themes/webaudioeditor.css)
     skin/components-frame.css (themes/components-frame.css)
     skin/components-h-split-box.css (themes/components-h-split-box.css)
     skin/jit-optimizations.css (themes/jit-optimizations.css)
     skin/images/filter.svg (themes/images/filter.svg)
     skin/images/filter-small.svg (themes/images/filter-small.svg)
     skin/images/search.svg (themes/images/search.svg)
     skin/images/item-toggle.svg (themes/images/item-toggle.svg)
     skin/images/item-arrow-dark-rtl.svg (themes/images/item-arrow-dark-rtl.svg)
@@ -178,17 +168,16 @@ devtools.jar:
     skin/images/tool-webconsole.svg (themes/images/tool-webconsole.svg)
     skin/images/tool-debugger.svg (themes/images/tool-debugger.svg)
     skin/images/tool-inspector.svg (themes/images/tool-inspector.svg)
     skin/images/tool-styleeditor.svg (themes/images/tool-styleeditor.svg)
     skin/images/tool-storage.svg (themes/images/tool-storage.svg)
     skin/images/tool-profiler.svg (themes/images/tool-profiler.svg)
     skin/images/tool-network.svg (themes/images/tool-network.svg)
     skin/images/tool-scratchpad.svg (themes/images/tool-scratchpad.svg)
-    skin/images/tool-webaudio.svg (themes/images/tool-webaudio.svg)
     skin/images/tool-memory.svg (themes/images/tool-memory.svg)
     skin/images/tool-dom.svg (themes/images/tool-dom.svg)
     skin/images/tool-accessibility.svg (themes/images/tool-accessibility.svg)
     skin/images/tool-application.svg (themes/images/tool-application.svg)
     skin/images/close.svg (themes/images/close.svg)
     skin/images/clear.svg (themes/images/clear.svg)
     skin/images/close-3-pane.svg (themes/images/close-3-pane.svg)
     skin/images/open-3-pane.svg (themes/images/open-3-pane.svg)
deleted file mode 100644
--- a/devtools/client/locales/en-US/webaudioeditor.dtd
+++ /dev/null
@@ -1,53 +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/. -->
-
-<!-- LOCALIZATION NOTE : FILE This file contains the Debugger strings -->
-<!-- LOCALIZATION NOTE : FILE Do not translate commandkey -->
-
-<!-- LOCALIZATION NOTE : FILE The correct localization of this file might be to
-  - keep it in English, or another language commonly spoken among web developers.
-  - You want to make that choice consistent across the developer tools.
-  - A good criteria is the language in which you'd find the best
-  - documentation on web development on the web. -->
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.reloadNotice1): This is the label shown
-  -  on the button that triggers a page refresh. -->
-<!ENTITY webAudioEditorUI.reloadNotice1   "Reload">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.reloadNotice2): This is the label shown
-  -  along with the button that triggers a page refresh. -->
-<!ENTITY webAudioEditorUI.reloadNotice2   "the page to view and edit the audio context.">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.emptyNotice): This is the label shown
-  -  while the page is refreshing and the tool waits for a audio context. -->
-<!ENTITY webAudioEditorUI.emptyNotice     "Waiting for an audio context to be created…">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.tab.properties2): This is the label shown
-  -  for the properties tab view. -->
-<!ENTITY webAudioEditorUI.tab.properties2 "Properties">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.tab.automation): This is the label shown
-  -  for the automation tab view. -->
-<!ENTITY webAudioEditorUI.tab.automation  "Automation">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.inspectorTitle): This is the title for the
-  -  AudioNode inspector view. -->
-<!ENTITY webAudioEditorUI.inspectorTitle  "AudioNode Inspector">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.inspectorEmpty): This is the title for the
-  -  AudioNode inspector view empty message. -->
-<!ENTITY webAudioEditorUI.inspectorEmpty  "No AudioNode selected.">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.propertiesEmpty): This is the title for the
-  -  AudioNode inspector view properties tab empty message. -->
-<!ENTITY webAudioEditorUI.propertiesEmpty "Node does not have any properties.">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.automationEmpty): This is the title for the
-  -  AudioNode inspector view automation tab empty message. -->
-<!ENTITY webAudioEditorUI.automationEmpty "Node does not have any AudioParams.">
-
-<!-- LOCALIZATION NOTE (webAudioEditorUI.automationNoEvents): This is the title for the
-  -  AudioNode inspector view automation tab message when there are no automation
-  -  events. -->
-<!ENTITY webAudioEditorUI.automationNoEvents "AudioParam does not have any automation events.">
deleted file mode 100644
--- a/devtools/client/locales/en-US/webaudioeditor.properties
+++ /dev/null
@@ -1,20 +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/.
-
-# LOCALIZATION NOTE These strings are used inside the Web Audio tool
-# which is available in the developer tools' toolbox, once
-# enabled in the developer tools' preference "Web Audio".
-# The correct localization of this file might be to keep it in
-# English, or another language commonly spoken among web developers.
-# You want to make that choice consistent across the developer tools.
-# A good criteria is the language in which you'd find the best
-# documentation on web development on the web.
-
-# LOCALIZATION NOTE (collapseInspector): This is the tooltip for the button
-# that collapses the inspector in the web audio tool UI.
-collapseInspector=Collapse inspector
-
-# LOCALIZATION NOTE (expandInspector): This is the tooltip for the button
-# that expands the inspector in the web audio tool UI.
-expandInspector=Expand inspector
--- a/devtools/client/moz.build
+++ b/devtools/client/moz.build
@@ -23,17 +23,16 @@ DIRS += [
     'performance-new',
     'preferences',
     'responsive.html',
     'scratchpad',
     'shared',
     'storage',
     'styleeditor',
     'themes',
-    'webaudioeditor',
     'webconsole',
     'webide',
     'webreplay',
 ]
 
 JAR_MANIFESTS += ['jar.mn']
 
 DevToolsModules(
--- a/devtools/client/preferences/devtools-client.js
+++ b/devtools/client/preferences/devtools-client.js
@@ -224,31 +224,25 @@ pref("devtools.styleeditor.showMediaSide
 pref("devtools.styleeditor.mediaSidebarWidth", 238);
 pref("devtools.styleeditor.navSidebarWidth", 245);
 pref("devtools.styleeditor.transitions", true);
 
 // Screenshot Option Settings.
 pref("devtools.screenshot.clipboard.enabled", false);
 pref("devtools.screenshot.audio.enabled", true);
 
-// Enable the Web Audio Editor
-pref("devtools.webaudioeditor.enabled", false);
-
 // Enable Scratchpad
 pref("devtools.scratchpad.enabled", false);
 
 // Make sure the DOM panel is hidden by default
 pref("devtools.dom.enabled", false);
 
 // Enable the Accessibility panel.
 pref("devtools.accessibility.enabled", true);
 
-// Web Audio Editor Inspector Width should be a preference
-pref("devtools.webaudioeditor.inspectorWidth", 300);
-
 // Web console filters
 pref("devtools.webconsole.filter.error", true);
 pref("devtools.webconsole.filter.warn", true);
 pref("devtools.webconsole.filter.info", true);
 pref("devtools.webconsole.filter.log", true);
 pref("devtools.webconsole.filter.debug", true);
 pref("devtools.webconsole.filter.css", false);
 pref("devtools.webconsole.filter.net", false);
--- a/devtools/client/shared/test/browser.ini
+++ b/devtools/client/shared/test/browser.ini
@@ -217,17 +217,16 @@ skip-if = !e10s || os == "win" # RDM onl
 [browser_telemetry_toolbox.js]
 [browser_telemetry_toolboxtabs_inspector.js]
 [browser_telemetry_toolboxtabs_jsdebugger.js]
 [browser_telemetry_toolboxtabs_jsprofiler.js]
 [browser_telemetry_toolboxtabs_netmonitor.js]
 [browser_telemetry_toolboxtabs_options.js]
 [browser_telemetry_toolboxtabs_storage.js]
 [browser_telemetry_toolboxtabs_styleeditor.js]
-[browser_telemetry_toolboxtabs_webaudioeditor.js]
 [browser_telemetry_toolboxtabs_webconsole.js]
 [browser_treeWidget_basic.js]
 [browser_treeWidget_keyboard_interaction.js]
 [browser_treeWidget_mouse_interaction.js]
 [browser_devices.js]
 skip-if = verify
 [browser_theme_switching.js]
 [browser_dbg_listaddons.js]
deleted file mode 100644
--- a/devtools/client/shared/test/browser_telemetry_toolboxtabs_webaudioeditor.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-const TEST_URI = "data:text/html;charset=utf-8," +
-  "<p>browser_telemetry_toolboxtabs_webaudioeditor.js</p>";
-
-// Because we need to gather stats for the period of time that a tool has been
-// opened we make use of setTimeout() to create tool active times.
-const TOOL_DELAY = 200;
-
-add_task(async function() {
-  info("Activating the webaudioeditor");
-  const originalPref = Services.prefs.getBoolPref("devtools.webaudioeditor.enabled");
-  Services.prefs.setBoolPref("devtools.webaudioeditor.enabled", true);
-
-  await addTab(TEST_URI);
-  startTelemetry();
-
-  await openAndCloseToolbox(2, TOOL_DELAY, "webaudioeditor");
-  checkResults();
-
-  gBrowser.removeCurrentTab();
-
-  info("De-activating the webaudioeditor");
-  Services.prefs.setBoolPref("devtools.webaudioeditor.enabled", originalPref);
-});
-
-function checkResults() {
-  // For help generating these tests use generateTelemetryTests("DEVTOOLS_WEBAUDIOEDITOR")
-  // here.
-  checkTelemetry("DEVTOOLS_WEBAUDIOEDITOR_OPENED_COUNT", "", {0: 2, 1: 0}, "array");
-  checkTelemetry("DEVTOOLS_WEBAUDIOEDITOR_TIME_ACTIVE_SECONDS", "", null, "hasentries");
-}
deleted file mode 100644
--- a/devtools/client/themes/images/filters.svg
+++ /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/. -->
-
-<svg height="0" xmlns="http://www.w3.org/2000/svg">
-  <!-- Web Audio Gradients -->
-  <linearGradient id="bypass-light" x1="8%" y1="10%" x2="16%" y2="16%" spreadMethod="repeat">
-    <stop offset="0%" stop-color="#dde1e4a0"/> <!-- theme-splitter-color (0.5 opacity) -->
-    <stop offset="50%" stop-color="transparent"/>
-  </linearGradient>
-
-  <linearGradient id="bypass-dark" x1="8%" y1="10%" x2="16%" y2="16%" spreadMethod="repeat">
-    <stop offset="0%" stop-color="#454d5d"/> <!-- theme-splitter-color -->
-    <stop offset="50%" stop-color="transparent"/>
-  </linearGradient>
-</svg>
deleted file mode 100644
--- a/devtools/client/themes/images/power.svg
+++ /dev/null
@@ -1,7 +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/. -->
-<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="context-fill #0b0b0b">
-  <path d="M8 14.5a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zm0-1a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9z"/>
-  <path d="M8.5 7.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 0 1 0z"/>
-</svg>
deleted file mode 100644
--- a/devtools/client/themes/webaudioeditor.css
+++ /dev/null
@@ -1,192 +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/. */
-
-/* Reload and waiting notices */
-.notice-container {
-  margin-top: -50vh;
-  color: var(--theme-body-color-alt);
-}
-
-#reload-notice {
-  font-size: 120%;
-}
-
-#waiting-notice {
-  font-size: 110%;
-}
-
-/* Context Graph */
-svg {
-  overflow: hidden;
-  -moz-box-flex: 1;
-  --arrow-color: var(--theme-splitter-color);
-  --text-color: var(--theme-body-color);
-}
-
-.theme-dark svg {
-  --arrow-color: var(--theme-body-color-alt);
-}
-
-/* Edges in graph */
-.edgePath path {
-  stroke-width: 1px;
-  stroke: var(--arrow-color);
-  fill: none;
-}
-svg #arrowhead {
-  /* !important is needed to override inline style */
-  fill: var(--arrow-color) !important;
-}
-
-/* AudioParam connection edges */
-g.edgePath.param-connection path {
-  stroke-dasharray: 5,5;
-  stroke: var(--arrow-colo);
-}
-
-/* Labels in AudioParam connection should have background that match
- * the main background so there's whitespace around the label, on top of the
- * dotted lines. */
-g.edgeLabel rect {
-  fill: var(--theme-body-background);
-}
-g.edgeLabel tspan {
-  fill: var(--text-color);
-}
-
-/* Audio Nodes */
-.nodes rect {
-  stroke-width: 1px;
-  cursor: pointer;
-  stroke: var(--theme-splitter-color);
-  fill: var(--theme-toolbar-background);
-}
-
-/**
- * Bypassed Nodes
- */
-
-.theme-light .nodes g.bypassed rect {
-  fill: url(chrome://devtools/skin/images/filters.svg#bypass-light);
-}
-
-.theme-dark .nodes g.bypassed rect {
-  fill: url(chrome://devtools/skin/images/filters.svg#bypass-dark);
-}
-
-.nodes g.bypassed.selected rect {
-  stroke: var(--theme-selection-background);
-}
-
-.nodes g.bypassed text {
-  opacity: 0.6;
-}
-
-/**
- * Selected Nodes
- */
-.nodes g.selected rect {
-  fill: var(--theme-selection-background);
-}
-
-/* Don't style bypassed nodes text differently because it'd be illegible in light-theme */
-g.selected:not(.bypassed) text {
-  fill: var(--theme-selection-color);
-}
-
-
-/* Text in nodes and edges */
-text {
-  cursor: default; /* override the "text" cursor */
-  fill: var(--text-color);
-  font-size: 1.25em;
-  /* Make sure text stays inside its container in RTL locales */
-  direction: ltr;
-}
-
-.nodes text {
-  cursor: pointer;
-}
-
-/**
- * Inspector Styles
- */
-
-/* hide the variables view scope title as its redundant,
- * because there's only one scope displayed. */
-.variables-view-scope > .title {
-  display: none;
-}
-
-#web-audio-inspector-title {
-  margin: 6px;
-}
-
-.web-audio-inspector .error {
-  background-image: url(chrome://devtools/skin/images/alert.svg);
-  background-size: 12px 12px;
-  -moz-context-properties: fill;
-  fill: var(--yellow-60);
-  -moz-appearance: none;
-  opacity: 0;
-  transition: opacity .5s ease-out 0s;
-}
-
-#inspector-pane-toggle {
-  background: none;
-  box-shadow: none;
-  border: none;
-  list-style-image: url(chrome://devtools/skin/images/pane-collapse.svg);
-}
-
-#inspector-pane-toggle > .toolbarbutton-icon {
-  width: 16px;
-  height: 16px;
-}
-
-#inspector-pane-toggle.pane-collapsed {
-  list-style-image: url(chrome://devtools/skin/images/pane-expand.svg);
-}
-
-/**
- * Automation Styles
- */
-
-#automation-param-toolbar .automation-param-button[selected] {
-  color: var(--theme-selection-color);
-  background-color: var(--theme-selection-background);
-}
-
-#automation-graph {
-  overflow: hidden;
-  -moz-box-flex: 1;
-}
-
-/**
- * Inspector toolbar
- */
-
-#audio-node-toolbar .bypass {
-  list-style-image: url(images/power.svg);
-}
-
-/**
- * Responsive Styles
- * `.devtools-responsive-container` takes care of most of
- * the changing of host types.
- */
-@media (max-width: 700px) {
-  /**
-   * Override the inspector toggle so it's always open
-   * in the portrait view, with the toggle button hidden.
-   */
-  #inspector-pane-toggle {
-    display: none;
-  }
-
-  #web-audio-inspector {
-    margin-left: 0px !important;
-    margin-right: 0px !important;
-  }
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/controller.js
+++ /dev/null
@@ -1,226 +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/. */
-
-const {PrefObserver} = require("devtools/client/shared/prefs");
-
-/**
- * A collection of `AudioNodeModel`s used throughout the editor
- * to keep track of audio nodes within the audio context.
- */
-var gAudioNodes = new AudioNodesCollection();
-
-/**
- * Initializes the web audio editor views
- */
-function startupWebAudioEditor() {
-  return all([
-    WebAudioEditorController.initialize(),
-    ContextView.initialize(),
-    InspectorView.initialize(),
-    PropertiesView.initialize(),
-    AutomationView.initialize(),
-  ]);
-}
-
-/**
- * Destroys the web audio editor controller and views.
- */
-function shutdownWebAudioEditor() {
-  return all([
-    WebAudioEditorController.destroy(),
-    ContextView.destroy(),
-    InspectorView.destroy(),
-    PropertiesView.destroy(),
-    AutomationView.destroy(),
-  ]);
-}
-
-/**
- * Functions handling target-related lifetime events.
- */
-var WebAudioEditorController = {
-  /**
-   * Listen for events emitted by the current tab target.
-   */
-  async initialize() {
-    this._onTabWillNavigate = this._onTabWillNavigate.bind(this);
-    this._onThemeChange = this._onThemeChange.bind(this);
-
-    gTarget.on("will-navigate", this._onTabWillNavigate);
-    gFront.on("start-context", this._onStartContext);
-    gFront.on("create-node", this._onCreateNode);
-    gFront.on("connect-node", this._onConnectNode);
-    gFront.on("connect-param", this._onConnectParam);
-    gFront.on("disconnect-node", this._onDisconnectNode);
-    gFront.on("change-param", this._onChangeParam);
-    gFront.on("destroy-node", this._onDestroyNode);
-
-    // Hook into theme change so we can change
-    // the graph's marker styling, since we can't do this
-    // with CSS
-
-    this._prefObserver = new PrefObserver("");
-    this._prefObserver.on("devtools.theme", this._onThemeChange);
-
-    // Store the AudioNode definitions from the WebAudioFront, if the method exists.
-    // If not, get the JSON directly. Using the actor method is preferable so the client
-    // knows exactly what methods are supported on the server.
-    const actorHasDefinition = await gTarget.actorHasMethod("webaudio", "getDefinition");
-    if (actorHasDefinition) {
-      AUDIO_NODE_DEFINITION = await gFront.getDefinition();
-    } else {
-      AUDIO_NODE_DEFINITION = require("devtools/server/actors/utils/audionodes.json");
-    }
-
-    // Make sure the backend is prepared to handle audio contexts.
-    // Since actors are created lazily on the first request to them, we need to send an
-    // early request to ensure the CallWatcherActor is running and watching for new window
-    // globals.
-    gFront.setup({ reload: false });
-  },
-
-  /**
-   * Remove events emitted by the current tab target.
-   */
-  destroy: function() {
-    gTarget.off("will-navigate", this._onTabWillNavigate);
-    gFront.off("start-context", this._onStartContext);
-    gFront.off("create-node", this._onCreateNode);
-    gFront.off("connect-node", this._onConnectNode);
-    gFront.off("connect-param", this._onConnectParam);
-    gFront.off("disconnect-node", this._onDisconnectNode);
-    gFront.off("change-param", this._onChangeParam);
-    gFront.off("destroy-node", this._onDestroyNode);
-    this._prefObserver.off("devtools.theme", this._onThemeChange);
-    this._prefObserver.destroy();
-  },
-
-  /**
-   * Called when page is reloaded to show the reload notice and waiting
-   * for an audio context notice.
-   */
-  reset: function() {
-    $("#content").hidden = true;
-    ContextView.resetUI();
-    InspectorView.resetUI();
-    PropertiesView.resetUI();
-  },
-
-  // Since node events (create, disconnect, connect) are all async,
-  // we have to make sure to wait that the node has finished creating
-  // before performing an operation on it.
-  getNode: async function(nodeActor) {
-    const id = nodeActor.actorID;
-    let node = gAudioNodes.get(id);
-
-    if (!node) {
-      const { resolve, promise } = defer();
-      gAudioNodes.on("add", function createNodeListener(createdNode) {
-        if (createdNode.id === id) {
-          gAudioNodes.off("add", createNodeListener);
-          resolve(createdNode);
-        }
-      });
-      node = await promise;
-    }
-    return node;
-  },
-
-  /**
-   * Fired when the devtools theme changes (light, dark, etc.)
-   * so that the graph can update marker styling, as that
-   * cannot currently be done with CSS.
-   */
-  _onThemeChange: function() {
-    const newValue = Services.prefs.getCharPref("devtools.theme");
-    window.emit(EVENTS.THEME_CHANGE, newValue);
-  },
-
-  /**
-   * Called for each location change in the debugged tab.
-   */
-  _onTabWillNavigate: function({isFrameSwitching}) {
-    // Clear out current UI.
-    this.reset();
-
-    // When switching to an iframe, ensure displaying the reload button.
-    // As the document has already been loaded without being hooked.
-    if (isFrameSwitching) {
-      $("#reload-notice").hidden = false;
-      $("#waiting-notice").hidden = true;
-    } else {
-      // Otherwise, we are loading a new top level document,
-      // so we don't need to reload anymore and should receive
-      // new node events.
-      $("#reload-notice").hidden = true;
-      $("#waiting-notice").hidden = false;
-    }
-
-    // Clear out stored audio nodes
-    gAudioNodes.reset();
-
-    window.emit(EVENTS.UI_RESET);
-  },
-
-  /**
-   * Called after the first audio node is created in an audio context,
-   * signaling that the audio context is being used.
-   */
-  _onStartContext: function() {
-    $("#reload-notice").hidden = true;
-    $("#waiting-notice").hidden = true;
-    $("#content").hidden = false;
-    window.emit(EVENTS.START_CONTEXT);
-  },
-
-  /**
-   * Called when a new node is created. Creates an `AudioNodeView` instance
-   * for tracking throughout the editor.
-   */
-  _onCreateNode: function(nodeActor) {
-    gAudioNodes.add(nodeActor);
-  },
-
-  /**
-   * Called on `destroy-node` when an AudioNode is GC'd. Removes
-   * from the AudioNode array and fires an event indicating the removal.
-   */
-  _onDestroyNode: function(nodeActor) {
-    gAudioNodes.remove(gAudioNodes.get(nodeActor.actorID));
-  },
-
-  /**
-   * Called when a node is connected to another node.
-   */
-  async _onConnectNode({ source: sourceActor, dest: destActor }) {
-    const source = await WebAudioEditorController.getNode(sourceActor);
-    const dest = await WebAudioEditorController.getNode(destActor);
-    source.connect(dest);
-  },
-
-  /**
-   * Called when a node is conneceted to another node's AudioParam.
-   */
-  async _onConnectParam({ source: sourceActor, dest: destActor, param }) {
-    const source = await WebAudioEditorController.getNode(sourceActor);
-    const dest = await WebAudioEditorController.getNode(destActor);
-    source.connect(dest, param);
-  },
-
-  /**
-   * Called when a node is disconnected.
-   */
-  async _onDisconnectNode(nodeActor) {
-    const node = await WebAudioEditorController.getNode(nodeActor);
-    node.disconnect();
-  },
-
-  /**
-   * Called when a node param is changed.
-   */
-  async _onChangeParam({ actor, param, value }) {
-    const node = await WebAudioEditorController.getNode(actor);
-    window.emit(EVENTS.CHANGE_PARAM, node, param, value);
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/includes.js
+++ /dev/null
@@ -1,113 +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 { loader, require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm");
-const { XPCOMUtils } = require("resource://gre/modules/XPCOMUtils.jsm");
-const EventEmitter = require("devtools/shared/event-emitter");
-const DevToolsUtils = require("devtools/shared/DevToolsUtils");
-const Services = require("Services");
-const { gDevTools } = require("devtools/client/framework/devtools");
-const { LocalizationHelper } = require("devtools/shared/l10n");
-const { ViewHelpers } = 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");
-
-const STRINGS_URI = "devtools/client/locales/webaudioeditor.properties";
-const L10N = new LocalizationHelper(STRINGS_URI);
-
-loader.lazyRequireGetter(this, "LineGraphWidget",
-  "devtools/client/shared/widgets/LineGraphWidget");
-
-// `AUDIO_NODE_DEFINITION` defined in the controller's initialization,
-// which describes all the properties of an AudioNode
-var AUDIO_NODE_DEFINITION;
-
-// Override DOM promises with Promise.jsm helpers
-const { defer, all } = require("promise");
-
-/* Events fired on `window` to indicate state or actions*/
-const EVENTS = {
-  // Fired when the first AudioNode has been created, signifying
-  // that the AudioContext is being used and should be tracked via the editor.
-  START_CONTEXT: "WebAudioEditor:StartContext",
-
-  // When the devtools theme changes.
-  THEME_CHANGE: "WebAudioEditor:ThemeChange",
-
-  // When the UI is reset from tab navigation.
-  UI_RESET: "WebAudioEditor:UIReset",
-
-  // When a param has been changed via the UI and successfully
-  // pushed via the actor to the raw audio node.
-  UI_SET_PARAM: "WebAudioEditor:UISetParam",
-
-  // When a node is to be set in the InspectorView.
-  UI_SELECT_NODE: "WebAudioEditor:UISelectNode",
-
-  // When the inspector is finished setting a new node.
-  UI_INSPECTOR_NODE_SET: "WebAudioEditor:UIInspectorNodeSet",
-
-  // When the inspector is finished rendering in or out of view.
-  UI_INSPECTOR_TOGGLED: "WebAudioEditor:UIInspectorToggled",
-
-  // When an audio node is finished loading in the Properties tab.
-  UI_PROPERTIES_TAB_RENDERED: "WebAudioEditor:UIPropertiesTabRendered",
-
-  // When an audio node is finished loading in the Automation tab.
-  UI_AUTOMATION_TAB_RENDERED: "WebAudioEditor:UIAutomationTabRendered",
-
-  // When the Audio Context graph finishes rendering.
-  // Is called with two arguments, first representing number of nodes
-  // rendered, second being the number of edge connections rendering (not counting
-  // param edges), followed by the count of the param edges rendered.
-  UI_GRAPH_RENDERED: "WebAudioEditor:UIGraphRendered",
-
-  // Called when the inspector splitter is moved and resized.
-  UI_INSPECTOR_RESIZE: "WebAudioEditor:UIInspectorResize",
-};
-XPCOMUtils.defineConstant(this, "EVENTS", EVENTS);
-
-/**
- * The current target and the Web Audio Editor front, set by this tool's host.
- */
-var gToolbox, gTarget, gFront;
-
-/**
- * Convenient way of emitting events from the panel window.
- */
-EventEmitter.decorate(this);
-
-/**
- * DOM query helper.
- */
-function $(selector, target = document) {
-  return target.querySelector(selector);
-}
-function $$(selector, target = document) {
-  return target.querySelectorAll(selector);
-}
-
-/**
- * Takes an iterable collection, and a hash. Return the first
- * object in the collection that matches the values in the hash.
- * From Backbone.Collection#findWhere
- * http://backbonejs.org/#Collection-findWhere
- */
-function findWhere(collection, attrs) {
-  const keys = Object.keys(attrs);
-  for (const model of collection) {
-    if (keys.every(key => model[key] === attrs[key])) {
-      return model;
-    }
-  }
-  return void 0;
-}
-
-function mixin(source, ...args) {
-  args.forEach(obj => Object.keys(obj).forEach(prop => source[prop] = obj[prop]));
-  return source;
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/index.xul
+++ /dev/null
@@ -1,141 +0,0 @@
-<?xml version="1.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/. -->
-<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://devtools/content/shared/widgets/widgets.css" type="text/css"?>
-<?xml-stylesheet href="chrome://devtools/skin/widgets.css" type="text/css"?>
-<?xml-stylesheet href="chrome://devtools/skin/webaudioeditor.css" type="text/css"?>
-<!DOCTYPE window [
-  <!ENTITY % debuggerDTD SYSTEM "chrome://devtools/locale/webaudioeditor.dtd">
-  %debuggerDTD;
-]>
-
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://devtools/content/shared/theme-switching.js"/>
-
-  <script type="application/javascript" src="chrome://devtools/content/shared/vendor/d3.js"/>
-  <script type="application/javascript" src="chrome://devtools/content/shared/vendor/dagre-d3.js"/>
-  <script type="application/javascript" src="includes.js"/>
-  <script type="application/javascript" src="models.js"/>
-  <script type="application/javascript" src="controller.js"/>
-  <script type="application/javascript" src="views/utils.js"/>
-  <script type="application/javascript" src="views/context.js"/>
-  <script type="application/javascript" src="views/inspector.js"/>
-  <script type="application/javascript" src="views/properties.js"/>
-  <script type="application/javascript" src="views/automation.js"/>
-
-  <vbox class="theme-body" flex="1">
-    <hbox id="reload-notice"
-          class="notice-container"
-          align="center"
-          pack="center"
-          flex="1">
-      <button id="requests-menu-reload-notice-button"
-              class="devtools-toolbarbutton"
-              standalone="true"
-              label="&webAudioEditorUI.reloadNotice1;"
-              oncommand="gFront.setup({ reload: true });"/>
-      <label id="requests-menu-reload-notice-label"
-             class="plain"
-             value="&webAudioEditorUI.reloadNotice2;"/>
-    </hbox>
-    <hbox id="waiting-notice"
-          class="notice-container devtools-throbber"
-          align="center"
-          pack="center"
-          flex="1"
-          hidden="true">
-      <label id="requests-menu-waiting-notice-label"
-             class="plain"
-             value="&webAudioEditorUI.emptyNotice;"/>
-    </hbox>
-
-    <vbox id="content"
-         flex="1"
-         hidden="true">
-      <toolbar id="web-audio-toolbar" class="devtools-toolbar">
-        <spacer flex="1"></spacer>
-        <toolbarbutton id="inspector-pane-toggle" class="devtools-toolbarbutton"
-                       tabindex="0"/>
-      </toolbar>
-      <splitter class="devtools-horizontal-splitter"/>
-      <box id="web-audio-content-pane"
-           class="devtools-responsive-container"
-           flex="1">
-        <hbox flex="1">
-          <box id="web-audio-graph" flex="1">
-            <vbox flex="1">
-              <svg id="graph-svg"
-                  xmlns="http://www.w3.org/2000/svg"
-                  xmlns:xlink="http://www.w3.org/1999/xlink">
-                <g id="graph-target" transform="translate(20,20)"/>
-              </svg>
-            </vbox>
-          </box>
-        </hbox>
-        <splitter id="inspector-splitter" class="devtools-side-splitter"/>
-        <vbox id="web-audio-inspector" hidden="true">
-          <deck id="web-audio-editor-details-pane" flex="1">
-            <vbox id="web-audio-editor-details-pane-empty" flex="1">
-              <label value="&webAudioEditorUI.inspectorEmpty;"></label>
-            </vbox>
-            <tabbox id="web-audio-editor-tabs"
-                    class="devtools-sidebar-tabs"
-                    handleCtrlTab="false">
-              <toolbar id="audio-node-toolbar" class="devtools-toolbar">
-                <hbox class="devtools-toolbarbutton-group">
-                  <toolbarbutton class="bypass devtools-toolbarbutton"
-                                 data-command="bypass"
-                                 tabindex="0"/>
-                </hbox>
-              </toolbar>
-              <tabs>
-                <tab id="properties-tab"
-                     label="&webAudioEditorUI.tab.properties2;"/>
-                <!-- bug 1134036
-                <tab id="automation-tab"
-                     label="&webAudioEditorUI.tab.automation;"/>
-                -->
-              </tabs>
-              <tabpanels flex="1">
-                <!-- Properties Panel -->
-                <tabpanel id="properties-tabpanel"
-                          class="tabpanel-content">
-                  <vbox id="properties-content" flex="1" hidden="true">
-                  </vbox>
-                  <vbox id="properties-empty" flex="1" hidden="true">
-                    <label value="&webAudioEditorUI.propertiesEmpty;"></label>
-                  </vbox>
-                </tabpanel>
-
-                <!-- Automation Panel -->
-                <tabpanel id="automation-tabpanel"
-                          class="tabpanel-content">
-                  <vbox id="automation-content" flex="1" hidden="true">
-                    <toolbar id="automation-param-toolbar" class="devtools-toolbar">
-                      <hbox id="automation-param-toolbar-buttons" class="devtools-toolbarbutton-group">
-                      </hbox>
-                    </toolbar>
-                    <box id="automation-graph-container" flex="1">
-                      <canvas id="automation-graph"></canvas>
-                    </box>
-                    <vbox id="automation-no-events" flex="1" hidden="true">
-                      <label value="&webAudioEditorUI.automationNoEvents;"></label>
-                    </vbox>
-                  </vbox>
-                  <vbox id="automation-empty" flex="1" hidden="true">
-                    <label value="&webAudioEditorUI.automationEmpty;"></label>
-                  </vbox>
-                </tabpanel>
-              </tabpanels>
-            </tabbox>
-          </deck>
-        </vbox>
-      </box>
-    </vbox>
-  </vbox>
-
-</window>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/models.js
+++ /dev/null
@@ -1,287 +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";
-
-/**
- * Representational wrapper around AudioNodeActors. Adding and destroying
- * AudioNodes should be performed through the AudioNodes collection.
- *
- * Events:
- * - `connect`: node, destinationNode, parameter
- * - `disconnect`: node
- */
-class AudioNodeModel extends EventEmitter {
-  constructor(actor) {
-    super();
-
-    // Will be added via AudioNodes `add`
-    this.collection = null;
-
-    this.actor = actor;
-    this.id = actor.actorID;
-    this.type = actor.type;
-    this.bypassable = actor.bypassable;
-    this._bypassed = false;
-    this.connections = [];
-  }
-
-  /**
-   * Stores connection data inside this instance of this audio node connecting
-   * to another node (destination). If connecting to another node's AudioParam,
-   * the second argument (param) must be populated with a string.
-   *
-   * Connecting nodes is idempotent. Upon new connection, emits "connect" event.
-   *
-   * @param AudioNodeModel destination
-   * @param String param
-   */
-  connect(destination, param) {
-    const edge = findWhere(this.connections, { destination: destination.id, param: param });
-
-    if (!edge) {
-      this.connections.push({ source: this.id, destination: destination.id, param: param });
-      EventEmitter.emit(this, "connect", this, destination, param);
-    }
-  }
-
-  /**
-   * Clears out all internal connection data. Emits "disconnect" event.
-   */
-  disconnect() {
-    this.connections.length = 0;
-    EventEmitter.emit(this, "disconnect", this);
-  }
-
-  /**
-   * Gets the bypass status of the audio node.
-   *
-   * @return Boolean
-   */
-  isBypassed() {
-    return this._bypassed;
-  }
-
-  /**
-   * Sets the bypass value of an AudioNode.
-   *
-   * @param Boolean enable
-   * @return Promise
-   */
-  bypass(enable) {
-    this._bypassed = enable;
-    return this.actor.bypass(enable).then(() => EventEmitter.emit(this, "bypass", this, enable));
-  }
-
-  /**
-   * Returns a promise that resolves to an array of objects containing
-   * both a `param` name property and a `value` property.
-   *
-   * @return Promise->Object
-   */
-  getParams() {
-    return this.actor.getParams();
-  }
-
-  /**
-   * Returns a promise that resolves to an object containing an
-   * array of event information and an array of automation data.
-   *
-   * @param String paramName
-   * @return Promise->Array
-   */
-  getAutomationData(paramName) {
-    return this.actor.getAutomationData(paramName);
-  }
-
-  /**
-   * Takes a `dagreD3.Digraph` object and adds this node to
-   * the graph to be rendered.
-   *
-   * @param dagreD3.Digraph
-   */
-  addToGraph(graph) {
-    graph.addNode(this.id, {
-      type: this.type,
-      label: this.type.replace(/Node$/, ""),
-      id: this.id,
-      bypassed: this._bypassed,
-    });
-  }
-
-  /**
-   * Takes a `dagreD3.Digraph` object and adds edges to
-   * the graph to be rendered. Separate from `addToGraph`,
-   * as while we depend on D3/Dagre's constraints, we cannot
-   * add edges for nodes that have not yet been added to the graph.
-   *
-   * @param dagreD3.Digraph
-   */
-  addEdgesToGraph(graph) {
-    for (const edge of this.connections) {
-      const options = {
-        source: this.id,
-        target: edge.destination,
-      };
-
-      // Only add `label` if `param` specified, as this is an AudioParam
-      // connection then. `label` adds the magic to render with dagre-d3,
-      // and `param` is just more explicitly the param, ignoring
-      // implementation details.
-      if (edge.param) {
-        options.label = options.param = edge.param;
-      }
-
-      graph.addEdge(null, this.id, edge.destination, options);
-    }
-  }
-
-  toString() {
-    return "[object AudioNodeModel]";
-  }
-}
-
-/**
- * Constructor for a Collection of `AudioNodeModel` models.
- *
- * Events:
- * - `add`: node
- * - `remove`: node
- * - `connect`: node, destinationNode, parameter
- * - `disconnect`: node
- */
-class AudioNodesCollection extends EventEmitter {
-  constructor() {
-    super();
-
-    this.model = AudioNodeModel;
-    this.models = new Set();
-    this._onModelEvent = this._onModelEvent.bind(this);
-  }
-
-  /**
-   * Iterates over all models within the collection, calling `fn` with the
-   * model as the first argument.
-   *
-   * @param Function fn
-   */
-  forEach(fn) {
-    this.models.forEach(fn);
-  }
-
-  /**
-   * Creates a new AudioNodeModel, passing through arguments into the AudioNodeModel
-   * constructor, and adds the model to the internal collection store of this
-   * instance.
-   *
-   * Emits "add" event on instance when completed.
-   *
-   * @param Object obj
-   * @return AudioNodeModel
-   */
-  add(obj) {
-    // eslint-disable-next-line new-cap
-    const node = new this.model(obj);
-    node.collection = this;
-
-    this.models.add(node);
-
-    node.on("*", this._onModelEvent);
-    EventEmitter.emit(this, "add", node);
-    return node;
-  }
-
-  /**
-   * Removes an AudioNodeModel from the internal collection. Calls `delete` method
-   * on the model, and emits "remove" on this instance.
-   *
-   * @param AudioNodeModel node
-   */
-  remove(node) {
-    this.models.delete(node);
-    EventEmitter.emit(this, "remove", node);
-  }
-
-  /**
-   * Empties out the internal collection of all AudioNodeModels.
-   */
-  reset() {
-    this.models.clear();
-  }
-
-  /**
-   * Takes an `id` from an AudioNodeModel and returns the corresponding
-   * AudioNodeModel within the collection that matches that id. Returns `null`
-   * if not found.
-   *
-   * @param Number id
-   * @return AudioNodeModel|null
-   */
-  get(id) {
-    return findWhere(this.models, { id: id });
-  }
-
-  /**
-   * Returns the count for how many models are a part of this collection.
-   *
-   * @return Number
-   */
-  get length() {
-    return this.models.size;
-  }
-
-  /**
-   * Returns detailed information about the collection. used during tests
-   * to query state. Returns an object with information on node count,
-   * how many edges are within the data graph, as well as how many of those edges
-   * are for AudioParams.
-   *
-   * @return Object
-   */
-  getInfo() {
-    const info = {
-      nodes: this.length,
-      edges: 0,
-      paramEdges: 0,
-    };
-
-    this.models.forEach(node => {
-      const paramEdgeCount = node.connections.filter(edge => edge.param).length;
-      info.edges += node.connections.length - paramEdgeCount;
-      info.paramEdges += paramEdgeCount;
-    });
-    return info;
-  }
-
-  /**
-   * Adds all nodes within the collection to the passed in graph,
-   * as well as their corresponding edges.
-   *
-   * @param dagreD3.Digraph
-   */
-  populateGraph(graph) {
-    this.models.forEach(node => node.addToGraph(graph));
-    this.models.forEach(node => node.addEdgesToGraph(graph));
-  }
-
-  /**
-   * Called when a stored model emits any event. Used to manage
-   * event propagation, or listening to model events to react, like
-   * removing a model from the collection when it's destroyed.
-   */
-  _onModelEvent(eventName, node, ...args) {
-    if (eventName === "remove") {
-      // If a `remove` event from the model, remove it
-      // from the collection, and let the method handle the emitting on
-      // the collection
-      this.remove(node);
-    } else {
-      // Pipe the event to the collection
-      EventEmitter.emit(this, eventName, node, ...args);
-    }
-  }
-
-  toString() {
-    return "[object AudioNodeCollection]";
-  }
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/moz.build
+++ /dev/null
@@ -1,13 +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(
-    'panel.js'
-)
-
-BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
-
-with Files('**'):
-    BUG_COMPONENT = ('DevTools', 'Web Audio Editor')
deleted file mode 100644
--- a/devtools/client/webaudioeditor/panel.js
+++ /dev/null
@@ -1,54 +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 { Cc, Ci, Cu, Cr } = require("chrome");
-const EventEmitter = require("devtools/shared/event-emitter");
-const { WebAudioFront } = require("devtools/shared/fronts/webaudio");
-
-function WebAudioEditorPanel(iframeWindow, toolbox) {
-  this.panelWin = iframeWindow;
-  this._toolbox = toolbox;
-  this._destroyer = null;
-
-  EventEmitter.decorate(this);
-}
-
-exports.WebAudioEditorPanel = WebAudioEditorPanel;
-
-WebAudioEditorPanel.prototype = {
-  open: async function() {
-    this.panelWin.gToolbox = this._toolbox;
-    this.panelWin.gTarget = this.target;
-
-    this.panelWin.gFront = await this.target.getFront("webaudio");
-
-    await this.panelWin.startupWebAudioEditor();
-
-    this.isReady = true;
-    this.emit("ready");
-    return this;
-  },
-
-  // DevToolPanel API
-
-  get target() {
-    return this._toolbox.target;
-  },
-
-  destroy: function() {
-    // Make sure this panel is not already destroyed.
-    if (this._destroyer) {
-      return this._destroyer;
-    }
-
-    return this._destroyer = this.panelWin.shutdownWebAudioEditor().then(() => {
-      // Destroy front to ensure packet handler is removed from client
-      this.panelWin.gFront.destroy();
-      this.emit("destroyed");
-    });
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/.eslintrc.js
+++ /dev/null
@@ -1,6 +0,0 @@
-"use strict";
-
-module.exports = {
-  // Extend from the shared list of defined globals for mochitests.
-  "extends": "../../../.eslintrc.mochitests.js"
-};
deleted file mode 100644
index bd84564e2cd30d4bdceb85d6b9d9036257d38f69..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser.ini
+++ /dev/null
@@ -1,87 +0,0 @@
-[DEFAULT]
-tags = devtools
-subsuite = devtools
-support-files =
-  doc_simple-context.html
-  doc_complex-context.html
-  doc_simple-node-creation.html
-  doc_buffer-and-array.html
-  doc_media-node-creation.html
-  doc_destroy-nodes.html
-  doc_connect-param.html
-  doc_connect-multi-param.html
-  doc_iframe-context.html
-  doc_automation.html
-  doc_bug_1112378.html
-  doc_bug_1125817.html
-  doc_bug_1130901.html
-  doc_bug_1141261.html
-  440hz_sine.ogg
-  head.js
-  !/devtools/client/shared/test/frame-script-utils.js
-  !/devtools/client/shared/test/shared-head.js
-  !/devtools/client/shared/test/telemetry-test-helpers.js
-
-[browser_audionode-actor-get-param-flags.js]
-[browser_audionode-actor-get-params-01.js]
-[browser_audionode-actor-get-params-02.js]
-[browser_audionode-actor-get-set-param.js]
-[browser_audionode-actor-type.js]
-[browser_audionode-actor-source.js]
-[browser_audionode-actor-bypass.js]
-[browser_audionode-actor-bypassable.js]
-[browser_audionode-actor-connectnode-disconnect.js]
-[browser_audionode-actor-connectparam.js]
-skip-if = true # bug 1092571
-[browser_audionode-actor-add-automation-event.js]
-disabled=bug 1134036
-[browser_audionode-actor-get-automation-data-01.js]
-disabled=bug 1134036
-[browser_audionode-actor-get-automation-data-02.js]
-disabled=bug 1134036
-[browser_audionode-actor-get-automation-data-03.js]
-disabled=bug 1134036
-[browser_callwatcher-01.js]
-[browser_callwatcher-02.js]
-[browser_webaudio-actor-simple.js]
-[browser_webaudio-actor-destroy-node.js]
-[browser_webaudio-actor-connect-param.js]
-[browser_webaudio-actor-automation-event.js]
-disabled=bug 1134036
-
-[browser_wa_automation-view-01.js]
-disabled=bug 1134036
-[browser_wa_automation-view-02.js]
-disabled=bug 1134036
-[browser_wa_controller-01.js]
-[browser_wa_destroy-node-01.js]
-[browser_wa_first-run.js]
-[browser_wa_graph-click.js]
-[browser_wa_graph-markers.js]
-[browser_wa_graph-render-01.js]
-[browser_wa_graph-render-02.js]
-[browser_wa_graph-render-03.js]
-[browser_wa_graph-render-04.js]
-[browser_wa_graph-render-05.js]
-skip-if = true # bug 1092571
-[browser_wa_graph-render-06.js]
-[browser_wa_graph-selected.js]
-[browser_wa_graph-zoom.js]
-[browser_wa_inspector.js]
-[browser_wa_inspector-toggle.js]
-[browser_wa_inspector-width.js]
-[browser_wa_inspector-bypass-01.js]
-[browser_wa_navigate.js]
-[browser_wa_properties-view.js]
-[browser_wa_properties-view-edit-01.js]
-skip-if = true # bug 1010423
-[browser_wa_properties-view-edit-02.js]
-skip-if = true # bug 1010423
-[browser_wa_properties-view-media-nodes.js]
-skip-if = os == 'mac' # bug 1216542
-[browser_wa_properties-view-params.js]
-[browser_wa_properties-view-params-objects.js]
-[browser_wa_reset-01.js]
-[browser_wa_reset-02.js]
-[browser_wa_reset-03.js]
-[browser_wa_reset-04.js]
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-add-automation-event.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#addAutomationEvent();
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-  let count = 0;
-  const counter = () => count++;
-  front.on("automation-event", counter);
-
-  const t0 = 0, t1 = 0.1, t2 = 0.2, t3 = 0.3, t4 = 0.4, t5 = 0.6, t6 = 0.7, t7 = 1;
-  const curve = [-1, 0, 1];
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.2, t0]);
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.3, t1]);
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.4, t2]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [1, t3]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [0.15, t4]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [0.75, t5]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [0.5, t6]);
-  await oscNode.addAutomationEvent("frequency", "setValueCurveAtTime", [curve, t7, t7 - t6]);
-  await oscNode.addAutomationEvent("frequency", "setTargetAtTime", [20, 2, 5]);
-
-  ok(true, "successfully set automation events for valid automation events");
-
-  try {
-    await oscNode.addAutomationEvent("frequency", "notAMethod", 20, 2, 5);
-    ok(false, "non-automation methods should not be successful");
-  } catch (e) {
-    ok(/invalid/.test(e.message), "AudioNode:addAutomationEvent fails for invalid automation methods");
-  }
-
-  try {
-    await oscNode.addAutomationEvent("invalidparam", "setValueAtTime", 0.2, t0);
-    ok(false, "automating non-AudioParams should not be successful");
-  } catch (e) {
-    ok(/invalid/.test(e.message), "AudioNode:addAutomationEvent fails for a non AudioParam");
-  }
-
-  front.off("automation-event", counter);
-
-  is(count, 9,
-    "when calling `addAutomationEvent`, the WebAudioActor should still fire `automation-event`.");
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-bypass.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#bypass(), AudioNode#isBypassed()
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-
-  is((await gainNode.isBypassed()), false, "Nodes start off unbypassed.");
-
-  info("Calling node#bypass(true)");
-  let isBypassed = await gainNode.bypass(true);
-
-  is(isBypassed, true, "node.bypass(true) resolves to true");
-  is((await gainNode.isBypassed()), true, "Node is now bypassed.");
-
-  info("Calling node#bypass(false)");
-  isBypassed = await gainNode.bypass(false);
-
-  is(isBypassed, false, "node.bypass(false) resolves to false");
-  is((await gainNode.isBypassed()), false, "Node back to being unbypassed.");
-
-  info("Calling node#bypass(true) on unbypassable node");
-  isBypassed = await destNode.bypass(true);
-
-  is(isBypassed, false, "node.bypass(true) resolves to false for unbypassable node");
-  is((await gainNode.isBypassed()), false, "Unbypassable node is unaffect");
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-bypassable.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#bypassable
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 14),
-  ]);
-
-  const actualBypassability = nodes.map(node => node.bypassable);
-  const expectedBypassability = [
-    false, // AudioDestinationNode
-    true, // AudioBufferSourceNode
-    true, // ScriptProcessorNode
-    true, // AnalyserNode
-    true, // GainNode
-    true, // DelayNode
-    true, // BiquadFilterNode
-    true, // WaveShaperNode
-    true, // PannerNode
-    true, // ConvolverNode
-    false, // ChannelSplitterNode
-    false, // ChannelMergerNode
-    true, // DynamicsCompressNode
-    true, // OscillatorNode
-  ];
-
-  expectedBypassability.forEach((bypassable, i) => {
-    is(actualBypassability[i], bypassable, `${nodes[i].type} has correct ".bypassable" status`);
-  });
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-connectnode-disconnect.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that AudioNodeActor#connectNode() and AudioNodeActor#disconnect() work.
- * Uses the editor front as the actors do not retain connect state.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [dest, osc, gain] = actors;
-
-  info("Disconnecting oscillator...");
-  osc.disconnect();
-  await Promise.all([
-    waitForGraphRendered(panelWin, 3, 1),
-    once(gAudioNodes, "disconnect"),
-  ]);
-  ok(true, "Oscillator disconnected, event emitted.");
-
-  info("Reconnecting oscillator...");
-  osc.connectNode(gain);
-  await Promise.all([
-    waitForGraphRendered(panelWin, 3, 2),
-    once(gAudioNodes, "connect"),
-  ]);
-  ok(true, "Oscillator reconnected.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-connectparam.js
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that AudioNodeActor#connectParam() work.
- * Uses the editor front as the actors do not retain connect state.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [dest, osc, gain] = actors;
-
-  await osc.disconnect();
-
-  osc.connectParam(gain, "gain");
-  await Promise.all([
-    waitForGraphRendered(panelWin, 3, 1, 1),
-    once(gAudioNodes, "connect"),
-  ]);
-  ok(true, "Oscillator connect to Gain's Gain AudioParam, event emitted.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-01.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#addAutomationEvent() checking automation values, also using
- * a curve as the last event to check duration spread.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-
-  const t0 = 0, t1 = 0.1, t2 = 0.2, t3 = 0.3, t4 = 0.4, t5 = 0.6, t6 = 0.7, t7 = 1;
-  const curve = [-1, 0, 1];
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.2, t0]);
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.3, t1]);
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [0.4, t2]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [1, t3]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [0.15, t4]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [0.75, t5]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [0.05, t6]);
-  // End with a curve here so we can get proper results on the last event (which takes into account
-  // duration)
-  await oscNode.addAutomationEvent("frequency", "setValueCurveAtTime", [curve, t6, t7 - t6]);
-
-  const { events, values } = await oscNode.getAutomationData("frequency");
-
-  is(events.length, 8, "8 recorded events returned.");
-  is(values.length, 2000, "2000 value points returned.");
-
-  checkAutomationValue(values, 0.05, 0.2);
-  checkAutomationValue(values, 0.1, 0.3);
-  checkAutomationValue(values, 0.15, 0.3);
-  checkAutomationValue(values, 0.2, 0.4);
-  checkAutomationValue(values, 0.25, 0.7);
-  checkAutomationValue(values, 0.3, 1);
-  checkAutomationValue(values, 0.35, 0.575);
-  checkAutomationValue(values, 0.4, 0.15);
-  checkAutomationValue(values, 0.45, 0.15 * Math.pow(0.75 / 0.15, 0.05 / 0.2));
-  checkAutomationValue(values, 0.5, 0.15 * Math.pow(0.75 / 0.15, 0.5));
-  checkAutomationValue(values, 0.55, 0.15 * Math.pow(0.75 / 0.15, 0.15 / 0.2));
-  checkAutomationValue(values, 0.6, 0.75);
-  checkAutomationValue(values, 0.65, 0.75 * Math.pow(0.05 / 0.75, 0.5));
-  checkAutomationValue(values, 0.705, -1); // Increase this time a bit to prevent off by the previous exponential amount
-  checkAutomationValue(values, 0.8, 0);
-  checkAutomationValue(values, 0.9, 1);
-  checkAutomationValue(values, 1, 1);
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-02.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#addAutomationEvent() when automation series ends with
- * `setTargetAtTime`, which approaches its target to infinity.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [300, 0.1]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [500, 0.4]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [200, 0.6]);
-  // End with a setTargetAtTime event, as the target approaches infinity, which will
-  // give us more points to render than the default 2000
-  await oscNode.addAutomationEvent("frequency", "setTargetAtTime", [1000, 2, 0.5]);
-
-  var { events, values } = await oscNode.getAutomationData("frequency");
-
-  is(events.length, 4, "4 recorded events returned.");
-  is(values.length, 4000, "4000 value points returned when ending with exponentiall approaching automator.");
-
-  checkAutomationValue(values, 2.01, 215.055);
-  checkAutomationValue(values, 2.1, 345.930);
-  checkAutomationValue(values, 3, 891.601);
-  checkAutomationValue(values, 5, 998.01);
-
-  // Refetch the automation data to ensure it recalculates correctly (bug 1118071)
-  var { events, values } = await oscNode.getAutomationData("frequency");
-
-  checkAutomationValue(values, 2.01, 215.055);
-  checkAutomationValue(values, 2.1, 345.930);
-  checkAutomationValue(values, 3, 891.601);
-  checkAutomationValue(values, 5, 998.01);
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-automation-data-03.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test that `cancelScheduledEvents` clears out events on and after
- * its argument.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [300, 0]);
-  await oscNode.addAutomationEvent("frequency", "linearRampToValueAtTime", [500, 0.9]);
-  await oscNode.addAutomationEvent("frequency", "setValueAtTime", [700, 1]);
-  await oscNode.addAutomationEvent("frequency", "exponentialRampToValueAtTime", [1000, 2]);
-  await oscNode.addAutomationEvent("frequency", "cancelScheduledValues", [1]);
-
-  var { events, values } = await oscNode.getAutomationData("frequency");
-
-  is(events.length, 2, "2 recorded events returned.");
-  is(values.length, 2000, "2000 value points returned");
-
-  checkAutomationValue(values, 0, 300);
-  checkAutomationValue(values, 0.5, 411.15);
-  checkAutomationValue(values, 0.9, 499.9);
-  checkAutomationValue(values, 1, 499.9);
-  checkAutomationValue(values, 2, 499.9);
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-param-flags.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#getParamFlags()
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 15),
-  ]);
-
-  const allNodeParams = await Promise.all(nodes.map(node => node.getParams()));
-  const nodeTypes = [
-    "AudioDestinationNode",
-    "AudioBufferSourceNode", "ScriptProcessorNode", "AnalyserNode", "GainNode",
-    "DelayNode", "BiquadFilterNode", "WaveShaperNode", "PannerNode", "ConvolverNode",
-    "ChannelSplitterNode", "ChannelMergerNode", "DynamicsCompressorNode", "OscillatorNode",
-    "StereoPannerNode",
-  ];
-
-  // For some reason nodeTypes.forEach and params.forEach fail here so we use
-  // simple for loops.
-  for (let i = 0; i < nodeTypes.length; i++) {
-    const type = nodeTypes[i];
-    const params = allNodeParams[i];
-
-    for (const {param, value, flags} of params) {
-      const testFlags = await nodes[i].getParamFlags(param);
-      ok(typeof testFlags === "object", type + " has flags from #getParamFlags(" + param + ")");
-
-      if (param === "buffer") {
-        is(flags.Buffer, true, "`buffer` params have Buffer flag");
-      } else if (param === "bufferSize" || param === "frequencyBinCount") {
-        is(flags.readonly, true, param + " is readonly");
-      } else if (param === "curve") {
-        is(flags.Float32Array, true, "`curve` param has Float32Array flag");
-      }
-    }
-  }
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-params-01.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#getParams()
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 15),
-  ]);
-
-  await loadFrameScriptUtils();
-
-  const allNodeParams = await Promise.all(nodes.map(node => node.getParams()));
-  const nodeTypes = [
-    "AudioDestinationNode",
-    "AudioBufferSourceNode", "ScriptProcessorNode", "AnalyserNode", "GainNode",
-    "DelayNode", "BiquadFilterNode", "WaveShaperNode", "PannerNode", "ConvolverNode",
-    "ChannelSplitterNode", "ChannelMergerNode", "DynamicsCompressorNode", "OscillatorNode",
-    "StereoPannerNode",
-  ];
-
-  const defaults = await Promise.all(nodeTypes.map(type => nodeDefaultValues(type)));
-
-  nodeTypes.map((type, i) => {
-    const params = allNodeParams[i];
-
-    params.forEach(({param, value, flags}) => {
-      ok(param in defaults[i], "expected parameter for " + type);
-
-      ok(typeof flags === "object", type + " has a flags object");
-
-      if (param === "buffer") {
-        is(flags.Buffer, true, "`buffer` params have Buffer flag");
-      } else if (param === "bufferSize" || param === "frequencyBinCount") {
-        is(flags.readonly, true, param + " is readonly");
-      } else if (param === "curve") {
-        is(flags.Float32Array, true, "`curve` param has Float32Array flag");
-      }
-    });
-  });
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-params-02.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that default properties are returned with the correct type
- * from the AudioNode actors.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 15),
-  ]);
-
-  await loadFrameScriptUtils();
-
-  const allParams = await Promise.all(nodes.map(node => node.getParams()));
-  const types = [
-    "AudioDestinationNode", "AudioBufferSourceNode", "ScriptProcessorNode",
-    "AnalyserNode", "GainNode", "DelayNode", "BiquadFilterNode", "WaveShaperNode",
-    "PannerNode", "ConvolverNode", "ChannelSplitterNode", "ChannelMergerNode",
-    "DynamicsCompressorNode", "OscillatorNode", "StereoPannerNode",
-  ];
-
-  const defaults = await Promise.all(types.map(type => nodeDefaultValues(type)));
-
-  info(JSON.stringify(defaults));
-
-  allParams.forEach((params, i) => {
-    compare(params, defaults[i], types[i]);
-  });
-
-  await removeTab(target.tab);
-});
-
-function compare(actual, expected, type) {
-  actual.forEach(({ value, param }) => {
-    value = getGripValue(value);
-    if (typeof expected[param] === "function") {
-      ok(expected[param](value), type + " has a passing value for " + param);
-    } else {
-      is(value, expected[param], type + " has correct default value and type for " + param);
-    }
-  });
-
-  info(Object.keys(expected).join(",") + " - " + JSON.stringify(expected));
-
-  is(actual.length, Object.keys(expected).length,
-    type + " has correct amount of properties.");
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-get-set-param.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#getParam() / AudioNode#setParam()
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, [destNode, oscNode, gainNode]] = await Promise.all([
-    front.setup({ reload: true }),
-    get3(front, "create-node"),
-  ]);
-
-  let freq = await oscNode.getParam("frequency");
-  info(typeof freq);
-  is(freq, 440, "AudioNode:getParam correctly fetches AudioParam");
-
-  let type = await oscNode.getParam("type");
-  is(type, "sine", "AudioNode:getParam correctly fetches non-AudioParam");
-
-  type = await oscNode.getParam("not-a-valid-param");
-  ok(type.type === "undefined",
-    "AudioNode:getParam correctly returns a grip value for `undefined` for an invalid param.");
-
-  let resSuccess = await oscNode.setParam("frequency", 220);
-  freq = await oscNode.getParam("frequency");
-  is(freq, 220, "AudioNode:setParam correctly sets a `number` AudioParam");
-  is(resSuccess, undefined, "AudioNode:setParam returns undefined for correctly set AudioParam");
-
-  resSuccess = await oscNode.setParam("type", "square");
-  type = await oscNode.getParam("type");
-  is(type, "square", "AudioNode:setParam correctly sets a `string` non-AudioParam");
-  is(resSuccess, undefined, "AudioNode:setParam returns undefined for correctly set AudioParam");
-
-  try {
-    await oscNode.setParam("frequency", "hello");
-    ok(false, "setParam with invalid types should throw");
-  } catch (e) {
-    ok(/is not a finite floating-point/.test(e.message), "AudioNode:setParam returns error with correct message when attempting an invalid assignment");
-    is(e.type, "TypeError", "AudioNode:setParam returns error with correct type when attempting an invalid assignment");
-    freq = await oscNode.getParam("frequency");
-    is(freq, 220, "AudioNode:setParam does not modify value when an error occurs");
-  }
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-source.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#source
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 14),
-  ]);
-
-  const actualTypes = nodes.map(node => node.type);
-  const isSourceResult = nodes.map(node => node.source);
-
-  actualTypes.forEach((type, i) => {
-    const shouldBeSource = type === "AudioBufferSourceNode" || type === "OscillatorNode";
-    if (shouldBeSource) {
-      is(isSourceResult[i], true, type + "'s `source` is `true`");
-    } else {
-      is(isSourceResult[i], false, type + "'s `source` is `false`");
-    }
-  });
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_audionode-actor-type.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test AudioNode#type
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_NODES_URL);
-  const [_, nodes] = await Promise.all([
-    front.setup({ reload: true }),
-    getN(front, "create-node", 14),
-  ]);
-
-  const actualTypes = nodes.map(node => node.type);
-  const expectedTypes = [
-    "AudioDestinationNode",
-    "AudioBufferSourceNode", "ScriptProcessorNode", "AnalyserNode", "GainNode",
-    "DelayNode", "BiquadFilterNode", "WaveShaperNode", "PannerNode", "ConvolverNode",
-    "ChannelSplitterNode", "ChannelMergerNode", "DynamicsCompressorNode", "OscillatorNode",
-  ];
-
-  expectedTypes.forEach((type, i) => {
-    is(actualTypes[i], type, type + " successfully created with correct type");
-  });
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_callwatcher-01.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Bug 1130901
- * Tests to ensure that calling call/apply on methods wrapped
- * via CallWatcher do not throw a security permissions error:
- * "Error: Permission denied to access property 'call'"
- */
-
-const BUG_1130901_URL = EXAMPLE_URL + "doc_bug_1130901.html";
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(BUG_1130901_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const rendered = waitForGraphRendered(panelWin, 3, 0);
-  reload(target);
-  await rendered;
-
-  ok(true, "Successfully created a node from AudioContext via `call`.");
-  ok(true, "Successfully created a node from AudioContext via `apply`.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_callwatcher-02.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Bug 1112378
- * Tests to ensure that errors called on wrapped functions via call-watcher
- * correctly looks like the error comes from the content, not from within the devtools.
- */
-
-const BUG_1112378_URL = EXAMPLE_URL + "doc_bug_1112378.html";
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(BUG_1112378_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  loadFrameScriptUtils();
-
-  const rendered = waitForGraphRendered(panelWin, 2, 0);
-  reload(target);
-  await rendered;
-
-  let error = await evalInDebuggee("throwError()");
-  is(error.lineNumber, 21, "error has correct lineNumber");
-  is(error.columnNumber, 18, "error has correct columnNumber");
-  is(error.name, "TypeError", "error has correct name");
-  is(error.message, "Argument 1 is not valid for any of the 2-argument overloads of AudioNode.connect.", "error has correct message");
-  is(error.stringified, "TypeError: Argument 1 is not valid for any of the 2-argument overloads of AudioNode.connect.", "error is stringified correctly");
-  is(error.instanceof, true, "error is correctly an instanceof TypeError");
-  is(error.fileName, "http://example.com/browser/devtools/client/webaudioeditor/test/doc_bug_1112378.html", "error has correct fileName");
-
-  error = await evalInDebuggee("throwDOMException()");
-  is(error.lineNumber, 37, "exception has correct lineNumber");
-  is(error.columnNumber, 0, "exception has correct columnNumber");
-  is(error.code, 9, "exception has correct code");
-  is(error.result, 2152923145, "exception has correct result");
-  is(error.name, "NotSupportedError", "exception has correct name");
-  is(error.message, "Operation is not supported", "exception has correct message");
-  is(error.stringified, "NotSupportedError: Operation is not supported", "exception is stringified correctly");
-  is(error.instanceof, true, "exception is correctly an instance of DOMException");
-  is(error.filename, "http://example.com/browser/devtools/client/webaudioeditor/test/doc_bug_1112378.html", "exception has correct filename");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_automation-view-01.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that automation view shows the correct view depending on if events
- * or params exist.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(AUTOMATION_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  const $tabbox = $("#web-audio-editor-tabs");
-
-  // Oscillator node
-  click(panelWin, findGraphNode(panelWin, nodeIds[1]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  $tabbox.selectedIndex = 1;
-
-  ok(isVisible($("#automation-graph-container")), "graph container should be visible");
-  ok(isVisible($("#automation-content")), "automation content should be visible");
-  ok(!isVisible($("#automation-no-events")), "no-events panel should not be visible");
-  ok(!isVisible($("#automation-empty")), "empty panel should not be visible");
-
-  // Gain node
-  click(panelWin, findGraphNode(panelWin, nodeIds[2]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  $tabbox.selectedIndex = 1;
-
-  ok(!isVisible($("#automation-graph-container")), "graph container should not be visible");
-  ok(isVisible($("#automation-content")), "automation content should be visible");
-  ok(isVisible($("#automation-no-events")), "no-events panel should be visible");
-  ok(!isVisible($("#automation-empty")), "empty panel should not be visible");
-
-  // destination node
-  click(panelWin, findGraphNode(panelWin, nodeIds[0]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  $tabbox.selectedIndex = 1;
-
-  ok(!isVisible($("#automation-graph-container")), "graph container should not be visible");
-  ok(!isVisible($("#automation-content")), "automation content should not be visible");
-  ok(!isVisible($("#automation-no-events")), "no-events panel should not be visible");
-  ok(isVisible($("#automation-empty")), "empty panel should be visible");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_automation-view-02.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that automation view selects the first parameter by default and
- * switching between AudioParam rerenders the graph.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(AUTOMATION_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, AutomationView } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  // Oscillator node
-  click(panelWin, findGraphNode(panelWin, nodeIds[1]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  click(panelWin, $("#automation-tab"));
-
-  ok(AutomationView._selectedParamName, "frequency",
-    "AutomatioView is set on 'frequency'");
-  ok($(".automation-param-button[data-param='frequency']").getAttribute("selected"),
-    "frequency param should be selected on load");
-  ok(!$(".automation-param-button[data-param='detune']").getAttribute("selected"),
-    "detune param should not be selected on load");
-  ok(isVisible($("#automation-content")), "automation content should be visible");
-  ok(isVisible($("#automation-graph-container")), "graph container should be visible");
-  ok(!isVisible($("#automation-no-events")), "no-events panel should not be visible");
-
-  click(panelWin, $(".automation-param-button[data-param='detune']"));
-  await once(panelWin, EVENTS.UI_AUTOMATION_TAB_RENDERED);
-
-  ok(true, "automation tab rerendered");
-
-  ok(AutomationView._selectedParamName, "detune",
-    "AutomatioView is set on 'detune'");
-  ok(!$(".automation-param-button[data-param='frequency']").getAttribute("selected"),
-    "frequency param should not be selected after clicking detune");
-  ok($(".automation-param-button[data-param='detune']").getAttribute("selected"),
-    "detune param should be selected after clicking detune");
-  ok(isVisible($("#automation-content")), "automation content should be visible");
-  ok(!isVisible($("#automation-graph-container")), "graph container should not be visible");
-  ok(isVisible($("#automation-no-events")), "no-events panel should be visible");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_controller-01.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Bug 1125817
- * Tests to ensure that disconnecting a node immediately
- * after creating it does not fail.
- */
-
-const BUG_1125817_URL = EXAMPLE_URL + "doc_bug_1125817.html";
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(BUG_1125817_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const events = Promise.all([
-    once(gAudioNodes, "add", 2),
-    once(gAudioNodes, "disconnect"),
-    waitForGraphRendered(panelWin, 2, 0),
-  ]);
-  reload(target);
-  await events;
-
-  ok(true, "Successfully disconnected a just-created node.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_destroy-node-01.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the destruction node event is fired and that the nodes are no
- * longer stored internally in the tool, that the graph is updated properly, and
- * that selecting a soon-to-be dead node clears the inspector.
- *
- * All done in one test since this test takes a few seconds to clear GC.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(DESTROY_NODES_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, gAudioNodes } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getNSpread(gAudioNodes, "add", 13),
-    waitForGraphRendered(panelWin, 13, 2),
-  ]);
-  reload(target);
-  const [created] = await events;
-
-  // Flatten arrays of event arguments and take the first (AudioNodeModel)
-  // and get its ID.
-  const actorIDs = created.map(ev => ev[0].id);
-
-  // Click a soon-to-be dead buffer node
-  await clickGraphNode(panelWin, actorIDs[5]);
-
-  const destroyed = getN(gAudioNodes, "remove", 10);
-
-  // Force a CC in the child process to collect the orphaned nodes.
-  forceNodeCollection();
-
-  // Wait for destruction and graph to re-render
-  await Promise.all([destroyed, waitForGraphRendered(panelWin, 3, 2)]);
-
-  // Test internal storage
-  is(panelWin.gAudioNodes.length, 3, "All nodes should be GC'd except one gain, osc and dest node.");
-
-  // Test graph rendering
-  ok(findGraphNode(panelWin, actorIDs[0]), "dest should be in graph");
-  ok(findGraphNode(panelWin, actorIDs[1]), "osc should be in graph");
-  ok(findGraphNode(panelWin, actorIDs[2]), "gain should be in graph");
-
-  const { nodes, edges } = countGraphObjects(panelWin);
-
-  is(nodes, 3, "Only 3 nodes rendered in graph.");
-  is(edges, 2, "Only 2 edges rendered in graph.");
-
-  // Test that the inspector reset to no node selected
-  ok(isVisible($("#web-audio-editor-details-pane-empty")),
-    "InspectorView empty message should show if the currently selected node gets collected.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_first-run.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the reloading/onContentLoaded hooks work.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { gFront, $ } = panel.panelWin;
-
-  is($("#reload-notice").hidden, false,
-    "The 'reload this page' notice should initially be visible.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should initially be hidden.");
-  is($("#content").hidden, true,
-    "The tool's content should initially be hidden.");
-
-  const navigating = once(target, "will-navigate");
-  const started = once(gFront, "start-context");
-
-  reload(target);
-
-  await navigating;
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden when navigating.");
-  is($("#waiting-notice").hidden, false,
-    "The 'waiting for an audio context' notice should be visible when navigating.");
-  is($("#content").hidden, true,
-    "The tool's content should still be hidden.");
-
-  await started;
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden after context found.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be hidden after context found.");
-  is($("#content").hidden, false,
-    "The tool's content should not be hidden anymore.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-click.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the clicking on a node in the GraphView opens and sets
- * the correct node in the InspectorView
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(COMPLEX_CONTEXT_URL);
-  const panelWin = panel.panelWin;
-  const { gFront, $, $$, InspectorView } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 8),
-    waitForGraphRendered(panel.panelWin, 8, 8),
-  ]);
-  reload(target);
-  const [actors, _] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  ok(!InspectorView.isVisible(), "InspectorView hidden on start.");
-
-  await clickGraphNode(panelWin, nodeIds[1], true);
-
-  ok(InspectorView.isVisible(), "InspectorView visible after selecting a node.");
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[1], "InspectorView has correct node set.");
-
-  await clickGraphNode(panelWin, nodeIds[2]);
-
-  ok(InspectorView.isVisible(), "InspectorView still visible after selecting another node.");
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[2], "InspectorView has correct node set on second node.");
-
-  await clickGraphNode(panelWin, nodeIds[2]);
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[2], "Clicking the same node again works (idempotent).");
-
-  await clickGraphNode(panelWin, $("rect", findGraphNode(panelWin, nodeIds[3])));
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[3], "Clicking on a <rect> works as expected.");
-
-  await clickGraphNode(panelWin, $("tspan", findGraphNode(panelWin, nodeIds[4])));
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[4], "Clicking on a <tspan> works as expected.");
-
-  ok(InspectorView.isVisible(),
-    "InspectorView still visible after several nodes have been clicked.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-markers.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the SVG marker styling is updated when devtools theme changes.
- */
-
-const { setTheme } = require("devtools/client/shared/theme");
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, MARKER_STYLING } = panelWin;
-
-  const currentTheme = Services.prefs.getCharPref("devtools.theme");
-
-  ok(MARKER_STYLING.light, "Marker styling exists for light theme.");
-  ok(MARKER_STYLING.dark, "Marker styling exists for dark theme.");
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-
-  is(getFill($("#arrowhead")), MARKER_STYLING[currentTheme],
-    "marker initially matches theme.");
-
-  // Switch to light
-  setTheme("light");
-  is(getFill($("#arrowhead")), MARKER_STYLING.light,
-    "marker styling matches light theme on change.");
-
-  // Switch to dark
-  setTheme("dark");
-  is(getFill($("#arrowhead")), MARKER_STYLING.dark,
-    "marker styling matches dark theme on change.");
-
-  // Switch to dark again
-  setTheme("dark");
-  is(getFill($("#arrowhead")), MARKER_STYLING.dark,
-    "marker styling remains dark.");
-
-  // Switch to back to light again
-  setTheme("light");
-  is(getFill($("#arrowhead")), MARKER_STYLING.light,
-    "marker styling switches back to light once again.");
-
-  await teardown(target);
-});
-
-/**
- * Returns a hex value found in styling for an element. So parses
- * <marker style="fill: #abcdef"> and returns "#abcdef"
- */
-function getFill(el) {
-  return el.getAttribute("style").match(/(#.*)$/)[1];
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-01.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that SVG nodes and edges were created for the Graph View.
- */
-
-var connectCount = 0;
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  gAudioNodes.on("connect", onConnectNode);
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [destId, oscId, gainId] = actors.map(actor => actor.actorID);
-
-  ok(findGraphNode(panelWin, oscId).classList.contains("type-OscillatorNode"), "found OscillatorNode with class");
-  ok(findGraphNode(panelWin, gainId).classList.contains("type-GainNode"), "found GainNode with class");
-  ok(findGraphNode(panelWin, destId).classList.contains("type-AudioDestinationNode"), "found AudioDestinationNode with class");
-  is(findGraphEdge(panelWin, oscId, gainId).toString(), "[object SVGGElement]", "found edge for osc -> gain");
-  is(findGraphEdge(panelWin, gainId, destId).toString(), "[object SVGGElement]", "found edge for gain -> dest");
-
-  await wait(1000);
-
-  is(connectCount, 2, "Only two node connect events should be fired.");
-
-  gAudioNodes.off("connect", onConnectNode);
-
-  await teardown(target);
-});
-
-function onConnectNode() {
-  ++connectCount;
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-02.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests more edge rendering for complex graphs.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(COMPLEX_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$ } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 8),
-    waitForGraphRendered(panelWin, 8, 8),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIDs = actors.map(actor => actor.actorID);
-
-  const types = ["AudioDestinationNode", "OscillatorNode", "GainNode", "ScriptProcessorNode",
-                 "OscillatorNode", "GainNode", "AudioBufferSourceNode", "BiquadFilterNode"];
-
-  types.forEach((type, i) => {
-    ok(findGraphNode(panelWin, nodeIDs[i]).classList.contains("type-" + type), "found " + type + " with class");
-  });
-
-  const edges = [
-    [1, 2, "osc1 -> gain1"],
-    [1, 3, "osc1 -> proc"],
-    [2, 0, "gain1 -> dest"],
-    [4, 5, "osc2 -> gain2"],
-    [5, 0, "gain2 -> dest"],
-    [6, 7, "buf -> filter"],
-    [4, 7, "osc2 -> filter"],
-    [7, 0, "filter -> dest"],
-  ];
-
-  edges.forEach(([source, target, msg], i) => {
-    is(findGraphEdge(panelWin, nodeIDs[source], nodeIDs[target]).toString(), "[object SVGGElement]",
-      "found edge for " + msg);
-  });
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-03.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests to ensure that selected nodes stay selected on graph redraw.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 3),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [dest, osc, gain] = actors;
-
-  await clickGraphNode(panelWin, gain.actorID);
-  ok(findGraphNode(panelWin, gain.actorID).classList.contains("selected"),
-    "Node selected once.");
-
-  // Disconnect a node to trigger a rerender
-  osc.disconnect();
-
-  await once(panelWin, EVENTS.UI_GRAPH_RENDERED);
-
-  ok(findGraphNode(panelWin, gain.actorID).classList.contains("selected"),
-    "Node still selected after rerender.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-04.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests audio param connection rendering.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(CONNECT_MULTI_PARAM_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 5),
-    waitForGraphRendered(panelWin, 5, 2, 3),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIDs = actors.map(actor => actor.actorID);
-
-  const [, carrier, gain, mod1, mod2] = nodeIDs;
-
-  const edges = [
-    [mod1, gain, "gain", "mod1 -> gain[gain]"],
-    [mod2, carrier, "frequency", "mod2 -> carrier[frequency]"],
-    [mod2, carrier, "detune", "mod2 -> carrier[detune]"],
-  ];
-
-  edges.forEach(([source, target, param, msg], i) => {
-    const edge = findGraphEdge(panelWin, source, target, param);
-    ok(edge.classList.contains("param-connection"), "edge is classified as a param-connection");
-  });
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-05.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests to ensure that param connections trigger graph redraws
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 3),
-    waitForGraphRendered(panelWin, 3, 2, 0),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [dest, osc, gain] = actors;
-
-  await osc.disconnect();
-
-  osc.connectParam(gain, "gain");
-  await waitForGraphRendered(panelWin, 3, 1, 1);
-  ok(true, "Graph re-rendered upon param connection");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-render-06.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests to ensure that param connections trigger graph redraws
- */
-
-const BUG_1141261_URL = EXAMPLE_URL + "doc_bug_1141261.html";
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(BUG_1141261_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 3),
-    waitForGraphRendered(panelWin, 3, 1, 0),
-  ]);
-  reload(target);
-  await events;
-
-  ok(true, "Graph correctly shows gain node as disconnected");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-selected.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that SVG nodes and edges were created for the Graph View.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const [destId, oscId, gainId] = actors.map(actor => actor.actorID);
-
-  ok(!findGraphNode(panelWin, destId).classList.contains("selected"),
-    "No nodes selected on start. (destination)");
-  ok(!findGraphNode(panelWin, oscId).classList.contains("selected"),
-    "No nodes selected on start. (oscillator)");
-  ok(!findGraphNode(panelWin, gainId).classList.contains("selected"),
-    "No nodes selected on start. (gain)");
-
-  await clickGraphNode(panelWin, oscId);
-
-  ok(findGraphNode(panelWin, oscId).classList.contains("selected"),
-    "Selected node has class 'selected'.");
-  ok(!findGraphNode(panelWin, destId).classList.contains("selected"),
-    "Non-selected nodes do not have class 'selected'.");
-  ok(!findGraphNode(panelWin, gainId).classList.contains("selected"),
-    "Non-selected nodes do not have class 'selected'.");
-
-  await clickGraphNode(panelWin, gainId);
-
-  ok(!findGraphNode(panelWin, oscId).classList.contains("selected"),
-    "Previously selected node no longer has class 'selected'.");
-  ok(!findGraphNode(panelWin, destId).classList.contains("selected"),
-    "Non-selected nodes do not have class 'selected'.");
-  ok(findGraphNode(panelWin, gainId).classList.contains("selected"),
-    "Newly selected node now has class 'selected'.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_graph-zoom.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the graph's scale and position is reset on a page reload.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, ContextView } = panelWin;
-
-  const started = once(gFront, "start-context");
-
-  await Promise.all([
-    waitForGraphRendered(panelWin, 3, 2),
-    reload(target),
-  ]);
-
-  is(ContextView.getCurrentScale(), 1, "Default graph scale is 1.");
-  is(ContextView.getCurrentTranslation()[0], 20, "Default x-translation is 20.");
-  is(ContextView.getCurrentTranslation()[1], 20, "Default y-translation is 20.");
-
-  // Change both attribute and D3's internal store
-  panelWin.d3.select("#graph-target").attr("transform", "translate([100, 400]) scale(10)");
-  ContextView._zoomBinding.scale(10);
-  ContextView._zoomBinding.translate([100, 400]);
-
-  is(ContextView.getCurrentScale(), 10, "After zoom, scale is 10.");
-  is(ContextView.getCurrentTranslation()[0], 100, "After zoom, x-translation is 100.");
-  is(ContextView.getCurrentTranslation()[1], 400, "After zoom, y-translation is 400.");
-
-  await Promise.all([
-    waitForGraphRendered(panelWin, 3, 2),
-    reload(target),
-  ]);
-
-  is(ContextView.getCurrentScale(), 1, "After refresh, graph scale is 1.");
-  is(ContextView.getCurrentTranslation()[0], 20, "After refresh, x-translation is 20.");
-  is(ContextView.getCurrentTranslation()[1], 20, "After refresh, y-translation is 20.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_inspector-bypass-01.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that nodes are correctly bypassed when bypassing.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, gAudioNodes } = panelWin;
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  // Wait for the node to be set as well as the inspector to come fully into the view
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[1]), true);
-
-  const $bypass = $("toolbarbutton.bypass");
-
-  is((await actors[1].isBypassed()), false, "AudioNodeActor is not bypassed by default.");
-  is($bypass.checked, true, "Button is 'on' for normal nodes");
-  is($bypass.disabled, false, "Bypass button is not disabled for normal nodes");
-
-  command($bypass);
-  await once(gAudioNodes, "bypass");
-
-  is((await actors[1].isBypassed()), true, "AudioNodeActor is bypassed.");
-  is($bypass.checked, false, "Button is 'off' when clicked");
-  is($bypass.disabled, false, "Bypass button is not disabled after click");
-  ok(findGraphNode(panelWin, nodeIds[1]).classList.contains("bypassed"),
-    "AudioNode has 'bypassed' class.");
-
-  command($bypass);
-  await once(gAudioNodes, "bypass");
-
-  is((await actors[1].isBypassed()), false, "AudioNodeActor is no longer bypassed.");
-  is($bypass.checked, true, "Button is back on when clicked");
-  is($bypass.disabled, false, "Bypass button is not disabled after click");
-  ok(!findGraphNode(panelWin, nodeIds[1]).classList.contains("bypassed"),
-    "AudioNode no longer has 'bypassed' class.");
-
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[0]));
-
-  is((await actors[0].isBypassed()), false, "Unbypassable AudioNodeActor is not bypassed.");
-  is($bypass.checked, false, "Button is 'off' for unbypassable nodes");
-  is($bypass.disabled, true, "Bypass button is disabled for unbypassable nodes");
-
-  command($bypass);
-  is((await actors[0].isBypassed()), false,
-    "Clicking button on unbypassable node does not change bypass state on actor.");
-  is($bypass.checked, false, "Button is still 'off' for unbypassable nodes");
-  is($bypass.disabled, true, "Bypass button is still disabled for unbypassable nodes");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_inspector-toggle.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that the inspector toggle button shows and hides
- * the inspector panel as intended.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, InspectorView } = panelWin;
-  const gVars = InspectorView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  ok(!InspectorView.isVisible(), "InspectorView hidden on start.");
-
-  // Open inspector pane
-  $("#inspector-pane-toggle").click();
-  await once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED);
-
-  ok(InspectorView.isVisible(), "InspectorView shown after toggling.");
-
-  ok(isVisible($("#web-audio-editor-details-pane-empty")),
-    "InspectorView empty message should still be visible.");
-  ok(!isVisible($("#web-audio-editor-tabs")),
-    "InspectorView tabs view should still be hidden.");
-
-  // Close inspector pane
-  $("#inspector-pane-toggle").click();
-  await once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED);
-
-  ok(!InspectorView.isVisible(), "InspectorView back to being hidden.");
-
-  // Open again to test node loading while open
-  $("#inspector-pane-toggle").click();
-  await once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED);
-
-  ok(InspectorView.isVisible(), "InspectorView being shown.");
-  ok(!isVisible($("#web-audio-editor-tabs")),
-    "InspectorView tabs are still hidden.");
-
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[1]));
-
-  ok(!isVisible($("#web-audio-editor-details-pane-empty")),
-    "Empty message hides even when loading node while open.");
-  ok(isVisible($("#web-audio-editor-tabs")),
-    "Switches to tab view when loading node while open.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_inspector-width.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test that the WebAudioInspector's Width is saved as
- * a preference
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, InspectorView } = panelWin;
-  const gVars = InspectorView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  let events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  let [actors] = await events;
-  let nodeIds = actors.map(actor => actor.actorID);
-
-  ok(!InspectorView.isVisible(), "InspectorView hidden on start.");
-
-  // Open inspector pane
-  $("#inspector-pane-toggle").click();
-  await once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED);
-
-  const newInspectorWidth = 500;
-
-  // Setting width to new_inspector_width
-  $("#web-audio-inspector").setAttribute("width", newInspectorWidth);
-
-  // Width should be 500 after reloading
-  events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  [actors] = await events;
-  nodeIds = actors.map(actor => actor.actorID);
-
-  // Open inspector pane
-  $("#inspector-pane-toggle").click();
-  await once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED);
-
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[1]));
-
-  // Getting the width of the audio inspector
-  const width = $("#web-audio-inspector").getAttribute("width");
-
-  is(width, newInspectorWidth, "WebAudioEditor's Inspector width should be saved as a preference");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_inspector.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that inspector view opens on graph node click, and
- * loads the correct node inside the inspector.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, InspectorView } = panelWin;
-  const gVars = InspectorView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  ok(!InspectorView.isVisible(), "InspectorView hidden on start.");
-  ok(isVisible($("#web-audio-editor-details-pane-empty")),
-    "InspectorView empty message should show when no node's selected.");
-  ok(!isVisible($("#web-audio-editor-tabs")),
-    "InspectorView tabs view should be hidden when no node's selected.");
-
-  // Wait for the node to be set as well as the inspector to come fully into the view
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[1]), true);
-
-  ok(InspectorView.isVisible(), "InspectorView shown once node selected.");
-  ok(!isVisible($("#web-audio-editor-details-pane-empty")),
-    "InspectorView empty message hidden when node selected.");
-  ok(isVisible($("#web-audio-editor-tabs")),
-    "InspectorView tabs view visible when node selected.");
-
-  is($("#web-audio-editor-tabs").selectedIndex, 0,
-    "default tab selected should be the parameters tab.");
-
-  await clickGraphNode(panelWin, findGraphNode(panelWin, nodeIds[2]));
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_navigate.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests naviating from a page to another will repopulate
- * the audio graph if both pages have an AudioContext.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $ } = panelWin;
-
-  let events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  await events;
-
-  var { nodes, edges } = countGraphObjects(panelWin);
-  is(nodes, 3, "should only be 3 nodes.");
-  is(edges, 2, "should only be 2 edges.");
-
-  events = Promise.all([
-    getN(gFront, "create-node", 15),
-    waitForGraphRendered(panelWin, 15, 0),
-  ]);
-  navigate(target, SIMPLE_NODES_URL);
-  await events;
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden after context found after navigation.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be hidden after context found after navigation.");
-  is($("#content").hidden, false,
-    "The tool's content should reappear without closing and reopening the toolbox.");
-
-  var { nodes, edges } = countGraphObjects(panelWin);
-  is(nodes, 15, "after navigation, should have 15 nodes");
-  is(edges, 0, "after navigation, should have 0 edges.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view-edit-01.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that properties are updated when modifying the VariablesView.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[1]));
-  // Wait for the node to be set as well as the inspector to come fully into the view
-  await Promise.all([
-    waitForInspectorRender(panelWin, EVENTS),
-    once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED),
-  ]);
-
-  const setAndCheck = setAndCheckVariable(panelWin, gVars);
-
-  checkVariableView(gVars, 0, {
-    "type": "sine",
-    "frequency": 440,
-    "detune": 0,
-  }, "default loaded string");
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[2]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  checkVariableView(gVars, 0, {
-    "gain": 0,
-  }, "default loaded number");
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[1]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  await setAndCheck(0, "type", "square", "square", "sets string as string");
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[2]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  await setAndCheck(0, "gain", "0.005", 0.005, "sets number as number");
-  await setAndCheck(0, "gain", "0.1", 0.1, "sets float as float");
-  await setAndCheck(0, "gain", ".2", 0.2, "sets float without leading zero as float");
-
-  await teardown(target);
-});
-
-function setAndCheckVariable(panelWin, gVars) {
-  return async function(varNum, prop, value, expected, desc) {
-    await modifyVariableView(panelWin, gVars, varNum, prop, value);
-    var props = {};
-    props[prop] = expected;
-    checkVariableView(gVars, varNum, props, desc);
-  };
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view-edit-02.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that properties are not updated when modifying the VariablesView.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(COMPLEX_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 8),
-    waitForGraphRendered(panelWin, 8, 8),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[3]));
-  // Wait for the node to be set as well as the inspector to come fully into the view
-  await Promise.all([
-    waitForInspectorRender(panelWin, EVENTS),
-    once(panelWin, EVENTS.UI_INSPECTOR_TOGGLED),
-  ]);
-
-  const errorEvent = once(panelWin, EVENTS.UI_SET_PARAM_ERROR);
-
-  try {
-    await modifyVariableView(panelWin, gVars, 0, "bufferSize", 2048);
-  } catch (e) {
-    // we except modifyVariableView to fail here, because bufferSize is not writable
-  }
-
-  await errorEvent;
-
-  checkVariableView(gVars, 0, {bufferSize: 4096}, "check that unwritable variable is not updated");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view-media-nodes.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that params view correctly displays all properties for nodes
- * correctly, with default values and correct types.
- */
-
-var MEDIA_PERMISSION = "media.navigator.permission.disabled";
-
-function waitForDeviceClosed() {
-  info("Checking that getUserMedia streams are no longer in use.");
-
-  const temp = {};
-  ChromeUtils.import("resource:///modules/webrtcUI.jsm", temp);
-  const webrtcUI = temp.webrtcUI;
-
-  if (!webrtcUI.showGlobalIndicator) {
-    return Promise.resolve();
-  }
-
-  return new Promise((resolve, reject) => {
-    const message = "webrtc:UpdateGlobalIndicators";
-    Services.ppmm.addMessageListener(message, function listener(aMessage) {
-      info("Received " + message + " message");
-      if (!aMessage.data.showGlobalIndicator) {
-        Services.ppmm.removeMessageListener(message, listener);
-        resolve();
-      }
-    });
-  });
-}
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(MEDIA_NODES_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  // Auto enable getUserMedia
-  const mediaPermissionPref = Services.prefs.getBoolPref(MEDIA_PERMISSION);
-  Services.prefs.setBoolPref(MEDIA_PERMISSION, true);
-
-  await loadFrameScriptUtils();
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 4),
-    waitForGraphRendered(panelWin, 4, 0),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  const types = [
-    "AudioDestinationNode", "MediaElementAudioSourceNode",
-    "MediaStreamAudioSourceNode", "MediaStreamAudioDestinationNode",
-  ];
-
-  const defaults = await Promise.all(types.map(type => nodeDefaultValues(type)));
-
-  for (let i = 0; i < types.length; i++) {
-    click(panelWin, findGraphNode(panelWin, nodeIds[i]));
-    await waitForInspectorRender(panelWin, EVENTS);
-    checkVariableView(gVars, 0, defaults[i], types[i]);
-  }
-
-  // Reset permissions on getUserMedia
-  Services.prefs.setBoolPref(MEDIA_PERMISSION, mediaPermissionPref);
-
-  await teardown(target);
-
-  await waitForDeviceClosed();
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view-params-objects.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that params view correctly displays non-primitive properties
- * like AudioBuffer and Float32Array in properties of AudioNodes.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(BUFFER_AND_ARRAY_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 3),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[2]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  checkVariableView(gVars, 0, {
-    "curve": "Float32Array",
-  }, "WaveShaper's `curve` is listed as an `Float32Array`.");
-
-  let aVar = gVars.getScopeAtIndex(0).get("curve");
-  let state = aVar.target.querySelector(".theme-twisty").hasAttribute("invisible");
-  ok(state, "Float32Array property should not have a dropdown.");
-
-  click(panelWin, findGraphNode(panelWin, nodeIds[1]));
-  await waitForInspectorRender(panelWin, EVENTS);
-  checkVariableView(gVars, 0, {
-    "buffer": "AudioBuffer",
-  }, "AudioBufferSourceNode's `buffer` is listed as an `AudioBuffer`.");
-
-  aVar = gVars.getScopeAtIndex(0).get("buffer");
-  state = aVar.target.querySelector(".theme-twisty").hasAttribute("invisible");
-  ok(state, "AudioBuffer property should not have a dropdown.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view-params.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that params view correctly displays all properties for nodes
- * correctly, with default values and correct types.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_NODES_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  await loadFrameScriptUtils();
-
-  const events = Promise.all([
-    getN(gFront, "create-node", 15),
-    waitForGraphRendered(panelWin, 15, 0),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  const types = [
-    "AudioDestinationNode", "AudioBufferSourceNode", "ScriptProcessorNode",
-    "AnalyserNode", "GainNode", "DelayNode", "BiquadFilterNode", "WaveShaperNode",
-    "PannerNode", "ConvolverNode", "ChannelSplitterNode", "ChannelMergerNode",
-    "DynamicsCompressorNode", "OscillatorNode",
-  ];
-
-  const defaults = await Promise.all(types.map(type => nodeDefaultValues(type)));
-
-  for (let i = 0; i < types.length; i++) {
-    click(panelWin, findGraphNode(panelWin, nodeIds[i]));
-    await waitForInspectorRender(panelWin, EVENTS);
-    checkVariableView(gVars, 0, defaults[i], types[i]);
-  }
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_properties-view.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that params view shows params when they exist, and are hidden otherwise.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, $$, EVENTS, PropertiesView } = panelWin;
-  const gVars = PropertiesView._propsView;
-
-  const started = once(gFront, "start-context");
-
-  const events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  const [actors] = await events;
-  const nodeIds = actors.map(actor => actor.actorID);
-
-  // Gain node
-  click(panelWin, findGraphNode(panelWin, nodeIds[2]));
-  await waitForInspectorRender(panelWin, EVENTS);
-
-  ok(isVisible($("#properties-content")), "Parameters shown when they exist.");
-  ok(!isVisible($("#properties-empty")),
-    "Empty message hidden when AudioParams exist.");
-
-  // Destination node
-  click(panelWin, findGraphNode(panelWin, nodeIds[0]));
-  await waitForInspectorRender(panelWin, EVENTS);
-
-  ok(!isVisible($("#properties-content")),
-    "Parameters hidden when they don't exist.");
-  ok(isVisible($("#properties-empty")),
-    "Empty message shown when no AudioParams exist.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_reset-01.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that reloading a tab will properly listen for the `start-context`
- * event and reshow the tools after reloading.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { gFront, $ } = panel.panelWin;
-
-  is($("#reload-notice").hidden, false,
-    "The 'reload this page' notice should initially be visible.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should initially be hidden.");
-  is($("#content").hidden, true,
-    "The tool's content should initially be hidden.");
-
-  let navigating = once(target, "will-navigate");
-  let started = once(gFront, "start-context");
-
-  reload(target);
-
-  await navigating;
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden when navigating.");
-  is($("#waiting-notice").hidden, false,
-    "The 'waiting for an audio context' notice should be visible when navigating.");
-  is($("#content").hidden, true,
-    "The tool's content should still be hidden.");
-
-  await started;
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden after context found.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be hidden after context found.");
-  is($("#content").hidden, false,
-    "The tool's content should not be hidden anymore.");
-
-  navigating = once(target, "will-navigate");
-  started = once(gFront, "start-context");
-
-  reload(target);
-
-  await Promise.all([navigating, started]);
-  const rendered = waitForGraphRendered(panel.panelWin, 3, 2);
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden after context found after reload.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be hidden after context found after reload.");
-  is($("#content").hidden, false,
-    "The tool's content should reappear without closing and reopening the toolbox.");
-
-  await rendered;
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_reset-02.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests reloading a tab with the tools open properly cleans up
- * the graph.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $ } = panelWin;
-
-  let events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  await events;
-
-  let { nodes, edges } = countGraphObjects(panelWin);
-  is(nodes, 3, "should only be 3 nodes.");
-  is(edges, 2, "should only be 2 edges.");
-
-  events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  await events;
-
-  ({ nodes, edges } = countGraphObjects(panelWin));
-  is(nodes, 3, "after reload, should only be 3 nodes.");
-  is(edges, 2, "after reload, should only be 2 edges.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_reset-03.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests reloading a tab with the tools open properly cleans up
- * the inspector and selected node.
- */
-
-add_task(async function() {
-  const { target, panel } = await initWebAudioEditor(SIMPLE_CONTEXT_URL);
-  const { panelWin } = panel;
-  const { gFront, $, InspectorView } = panelWin;
-
-  let events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  let [actors] = await events;
-  let nodeIds = actors.map(actor => actor.actorID);
-
-  await clickGraphNode(panelWin, nodeIds[1], true);
-  ok(InspectorView.isVisible(), "InspectorView visible after selecting a node.");
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[1], "InspectorView has correct node set.");
-
-  /**
-   * Reload
-   */
-
-  events = Promise.all([
-    get3(gFront, "create-node"),
-    waitForGraphRendered(panelWin, 3, 2),
-  ]);
-  reload(target);
-  [actors] = await events;
-  nodeIds = actors.map(actor => actor.actorID);
-
-  ok(!InspectorView.isVisible(), "InspectorView hidden on start.");
-  is(InspectorView.getCurrentAudioNode(), null,
-    "InspectorView has no current node set on reset.");
-
-  await clickGraphNode(panelWin, nodeIds[2], true);
-  ok(InspectorView.isVisible(),
-    "InspectorView visible after selecting a node after a reset.");
-  is(InspectorView.getCurrentAudioNode().id, nodeIds[2], "InspectorView has correct node set upon clicking graph node after a reset.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_wa_reset-04.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that switching to an iframe works fine.
- */
-
-add_task(async function() {
-  Services.prefs.setBoolPref("devtools.command-button-frames.enabled", true);
-
-  const { target, panel, toolbox } = await initWebAudioEditor(IFRAME_CONTEXT_URL);
-  const { gFront, $ } = panel.panelWin;
-
-  is($("#reload-notice").hidden, false,
-    "The 'reload this page' notice should initially be visible.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should initially be hidden.");
-  is($("#content").hidden, true,
-    "The tool's content should initially be hidden.");
-
-  const btn = toolbox.doc.getElementById("command-button-frames");
-  ok(!btn.firstChild, "The frame list button has no children");
-
-  // Open frame menu and wait till it's available on the screen.
-  const framePanel = toolbox.doc.getElementById("command-button-frames-panel");
-  btn.click();
-  ok(framePanel, "popup panel has created.");
-  await waitUntil(() => framePanel.classList.contains("tooltip-visible"));
-
-  const menuList = toolbox.doc.getElementById("toolbox-frame-menu");
-  const buttonNodeList = menuList.querySelectorAll(".command");
-  is(buttonNodeList.length, 2, "We have both frames in the list");
-
-  // Select the iframe
-  buttonNodeList[1].click();
-
-  let navigating = once(target, "will-navigate");
-
-  await navigating;
-
-  is($("#reload-notice").hidden, false,
-    "The 'reload this page' notice should still be visible when switching to a frame.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be kept hidden when switching to a frame.");
-  is($("#content").hidden, true,
-    "The tool's content should still be hidden.");
-
-  navigating = once(target, "will-navigate");
-  const started = once(gFront, "start-context");
-
-  reload(target);
-
-  await Promise.all([navigating, started]);
-
-  is($("#reload-notice").hidden, true,
-    "The 'reload this page' notice should be hidden after reloading the frame.");
-  is($("#waiting-notice").hidden, true,
-    "The 'waiting for an audio context' notice should be hidden after reloading the frame.");
-  is($("#content").hidden, false,
-    "The tool's content should appear after reload.");
-
-  await teardown(target);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_webaudio-actor-automation-event.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test that the WebAudioActor receives and emits the `automation-event` events
- * with correct arguments from the content.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(AUTOMATION_URL);
-  const events = [];
-
-  const expected = [
-    ["setValueAtTime", 0.2, 0],
-    ["linearRampToValueAtTime", 1, 0.3],
-    ["exponentialRampToValueAtTime", 0.75, 0.6],
-    ["setValueCurveAtTime", [-1, 0, 1], 0.7, 0.3],
-  ];
-
-  front.on("automation-event", onAutomationEvent);
-
-  const [_, __, [destNode, oscNode, gainNode], [connect1, connect2]] = await Promise.all([
-    front.setup({ reload: true }),
-    once(front, "start-context"),
-    get3(front, "create-node"),
-    get2(front, "connect-node"),
-  ]);
-
-  is(events.length, 4, "correct number of events fired");
-
-  function onAutomationEvent(e) {
-    const { eventName, paramName, args } = e;
-    const exp = expected[events.length];
-
-    is(eventName, exp[0], "correct eventName in event");
-    is(paramName, "frequency", "correct paramName in event");
-    is(args.length, exp.length - 1, "correct length in args");
-
-    args.forEach((a, i) => {
-      // In the case of an array
-      if (typeof a === "object") {
-        a.forEach((f, j) => is(f, exp[i + 1][j], `correct argument in Float32Array: ${f}`));
-      } else {
-        is(a, exp[i + 1], `correct ${i + 1}th argument in args: ${a}`);
-      }
-    });
-    events.push([eventName].concat(args));
-  }
-
-  front.off("automation-event", onAutomationEvent);
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_webaudio-actor-connect-param.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test the `connect-param` event on the web audio actor.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(CONNECT_PARAM_URL);
-  const [, , [destNode, carrierNode, modNode, gainNode], , connectParam] = await Promise.all([
-    front.setup({ reload: true }),
-    once(front, "start-context"),
-    getN(front, "create-node", 4),
-    get2(front, "connect-node"),
-    once(front, "connect-param"),
-  ]);
-
-  info(connectParam);
-
-  is(connectParam.source.actorID, modNode.actorID, "`connect-param` has correct actor for `source`");
-  is(connectParam.dest.actorID, gainNode.actorID, "`connect-param` has correct actor for `dest`");
-  is(connectParam.param, "gain", "`connect-param` has correct parameter name for `param`");
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_webaudio-actor-destroy-node.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test `destroy-node` event on WebAudioActor.
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(DESTROY_NODES_URL);
-
-  const [, , created] = await Promise.all([
-    front.setup({ reload: true }),
-    once(front, "start-context"),
-    // Should create dest, gain, and oscillator node and 10
-    // disposable buffer nodes
-    getN(front, "create-node", 13),
-  ]);
-
-  const waitUntilDestroyed = getN(front, "destroy-node", 10);
-
-  // Force CC so we can ensure it's run to clear out dead AudioNodes
-  forceNodeCollection();
-
-  const destroyed = await waitUntilDestroyed;
-
-  destroyed.forEach((node, i) => {
-    is(node.type, "AudioBufferSourceNode", "Only buffer nodes are destroyed");
-    ok(actorIsInList(created, destroyed[i]),
-      "`destroy-node` called only on AudioNodes in current document.");
-  });
-
-  await removeTab(target.tab);
-});
-
-function actorIsInList(list, actor) {
-  for (let i = 0; i < list.length; i++) {
-    if (list[i].actorID === actor.actorID) {
-      return list[i];
-    }
-  }
-  return null;
-}
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/browser_webaudio-actor-simple.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Test basic communication of Web Audio actor
- */
-
-add_task(async function() {
-  const { target, front } = await initBackend(SIMPLE_CONTEXT_URL);
-  const [_, __, [destNode, oscNode, gainNode], [connect1, connect2]] = await Promise.all([
-    front.setup({ reload: true }),
-    once(front, "start-context"),
-    get3(front, "create-node"),
-    get2(front, "connect-node"),
-  ]);
-
-  is(destNode.type, "AudioDestinationNode", "WebAudioActor:create-node returns AudioNodeActor for AudioDestination");
-  is(oscNode.type, "OscillatorNode", "WebAudioActor:create-node returns AudioNodeActor");
-  is(gainNode.type, "GainNode", "WebAudioActor:create-node returns AudioNodeActor");
-
-  let { source, dest } = connect1;
-  is(source.actorID, oscNode.actorID, "WebAudioActor:connect-node returns correct actor with ID on source (osc->gain)");
-  is(dest.actorID, gainNode.actorID, "WebAudioActor:connect-node returns correct actor with ID on dest (osc->gain)");
-
-  ({ source, dest } = connect2);
-  is(source.actorID, gainNode.actorID, "WebAudioActor:connect-node returns correct actor with ID on source (gain->dest)");
-  is(dest.actorID, destNode.actorID, "WebAudioActor:connect-node returns correct actor with ID on dest (gain->dest)");
-
-  await removeTab(target.tab);
-});
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_automation.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const osc = ctx.createOscillator();
-      const gain = ctx.createGain();
-      gain.gain.value = 0;
-      osc.frequency.setValueAtTime(0.2, 0);
-      osc.frequency.linearRampToValueAtTime(1, 0.3);
-      osc.frequency.exponentialRampToValueAtTime(0.75, 0.6);
-      osc.frequency.setValueCurveAtTime(new Float32Array([-1, 0, 1]), 0.7, 0.3);
-      osc.connect(gain);
-      gain.connect(ctx.destination);
-      osc.start(0);
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_buffer-and-array.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const audioURL = "http://example.com/browser/devtools/client/webaudioeditor/test/440hz_sine.ogg";
-
-      const ctx = new AudioContext();
-      const bufferNode = ctx.createBufferSource();
-      const shaperNode = ctx.createWaveShaper();
-      shaperNode.curve = generateWaveShapingCurve();
-
-      const xhr = getBuffer(audioURL, () => {
-        ctx.decodeAudioData(xhr.response, (buffer) => {
-          bufferNode.buffer = buffer;
-          bufferNode.connect(shaperNode);
-          shaperNode.connect(ctx.destination);
-        });
-      });
-
-      function generateWaveShapingCurve() {
-        const frames = 65536;
-        const curve = new Float32Array(frames);
-        const n = frames;
-        const n2 = n / 2;
-
-        for (let i = 0; i < n; ++i) {
-          const x = (i - n2) / n2;
-          const y = Math.atan(5 * x) / (0.5 * Math.PI);
-        }
-
-        return curve;
-      }
-
-      function getBuffer(url, callback) {
-        const xhr = new XMLHttpRequest();
-        xhr.open("GET", url, true);
-        xhr.responseType = "arraybuffer";
-        xhr.onload = callback;
-        xhr.send();
-        return xhr;
-      }
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_bug_1112378.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const panner = ctx.createStereoPanner();
-
-      function throwError() {
-        try {
-          panner.connect({});
-        } catch (e) {
-          return {
-            lineNumber: e.lineNumber,
-            fileName: e.fileName,
-            columnNumber: e.columnNumber,
-            message: e.message,
-            instanceof: e instanceof TypeError,
-            stringified: e.toString(),
-            name: e.name,
-          };
-        }
-      }
-
-      function throwDOMException() {
-        try {
-          panner.channelCount = 3;
-        } catch (e) {
-          return {
-            lineNumber: e.lineNumber,
-            columnNumber: e.columnNumber,
-            filename: e.filename,
-            message: e.message,
-            code: e.code,
-            result: e.result,
-            instanceof: e instanceof DOMException,
-            stringified: e.toString(),
-            name: e.name,
-          };
-        }
-      }
-
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_bug_1125817.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const osc = ctx.createOscillator();
-      osc.frequency.value = 200;
-      osc.disconnect();
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_bug_1130901.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      ctx.createOscillator.call(ctx);
-      ctx.createGain.apply(ctx, []);
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_bug_1141261.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const osc = ctx.createOscillator();
-      const gain = ctx.createGain();
-      osc.connect(gain);
-      gain.connect(ctx.destination);
-      gain.disconnect();
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_complex-context.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-/*
-         ↱   proc
-  osc    →   gain   →
-  osc    →   gain   →  destination
-  buffer →↳  filter →
-*/
-      const ctx = new AudioContext();
-      const osc1 = ctx.createOscillator();
-      const gain1 = ctx.createGain();
-      const proc = ctx.createScriptProcessor();
-      osc1.connect(gain1);
-      osc1.connect(proc);
-      gain1.connect(ctx.destination);
-
-      const osc2 = ctx.createOscillator();
-      const gain2 = ctx.createGain();
-      osc2.connect(gain2);
-      gain2.connect(ctx.destination);
-
-      const buf = ctx.createBufferSource();
-      const filter = ctx.createBiquadFilter();
-      buf.connect(filter);
-      osc2.connect(filter);
-      filter.connect(ctx.destination);
-
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_connect-multi-param.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const carrier = ctx.createOscillator();
-      const gain = ctx.createGain();
-      const modulator = ctx.createOscillator();
-      const modulator2 = ctx.createOscillator();
-      carrier.connect(gain);
-      gain.connect(ctx.destination);
-      modulator.connect(gain.gain);
-      modulator2.connect(carrier.frequency);
-      modulator2.connect(carrier.detune);
-      modulator.start(0);
-      modulator2.start(0);
-      carrier.start(0);
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_connect-param.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const carrier = ctx.createOscillator();
-      const modulator = ctx.createOscillator();
-      const gain = ctx.createGain();
-      carrier.connect(gain);
-      gain.connect(ctx.destination);
-      modulator.connect(gain.gain);
-      modulator.start(0);
-      carrier.start(0);
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_destroy-nodes.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-      // Keep the nodes we want to GC alive until we are ready for them to
-      // be collected. We will zero this reference by force from the devtools
-      // side.
-      var keepAlive = [];
-      (function() {
-        const ctx = new AudioContext();
-        const osc = ctx.createOscillator();
-        const gain = ctx.createGain();
-
-        for (let i = 0; i < 10; i++) {
-          keepAlive.push(ctx.createBufferSource());
-        }
-
-        osc.connect(gain);
-        gain.connect(ctx.destination);
-        gain.gain.value = 0;
-        osc.start();
-      })();
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_iframe-context.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page with an iframe</title>
-  </head>
-
-  <body>
-    <iframe id="frame" src="doc_simple-context.html" />
-  </body>
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_media-node-creation.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const audio = new Audio();
-      let meNode, msNode, mdNode;
-      navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia;
-
-      navigator.getUserMedia({ audio: true, fake: true }, stream => {
-        meNode = ctx.createMediaElementSource(audio);
-        msNode = ctx.createMediaStreamSource(stream);
-        mdNode = ctx.createMediaStreamDestination();
-      }, () => {});
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_simple-context.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const osc = ctx.createOscillator();
-      const gain = ctx.createGain();
-      gain.gain.value = 0;
-
-      // Connect multiple times to test that it's disregarded.
-      osc.connect(gain);
-      gain.connect(ctx.destination);
-      gain.connect(ctx.destination);
-      gain.connect(ctx.destination);
-      gain.connect(ctx.destination);
-      gain.connect(ctx.destination);
-      gain.connect(ctx.destination);
-      osc.start(0);
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/doc_simple-node-creation.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!-- Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/ -->
-<!doctype html>
-
-<html>
-  <head>
-    <meta charset="utf-8"/>
-    <title>Web Audio Editor test page</title>
-  </head>
-
-  <body>
-
-    <script type="text/javascript">
-      "use strict";
-
-      const ctx = new AudioContext();
-      const NODE_CREATION_METHODS = [
-          "createBufferSource", "createScriptProcessor", "createAnalyser",
-          "createGain", "createDelay", "createBiquadFilter", "createWaveShaper",
-          "createPanner", "createConvolver", "createChannelSplitter", "createChannelMerger",
-          "createDynamicsCompressor", "createOscillator", "createStereoPanner",
-      ];
-      const nodes = NODE_CREATION_METHODS.map(method => ctx[method]());
-
-    </script>
-  </body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/webaudioeditor/test/head.js
+++ /dev/null
@@ -1,440 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/* eslint no-unused-vars: [2, {"vars": "local"}] */
-/* import-globals-from ../../shared/test/shared-head.js */
-
-"use strict";
-
-// Load the shared-head file first.
-Services.scriptloader.loadSubScript(
-  "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js",
-  this);
-
-var { DebuggerServer } = require("devtools/server/main");
-var { generateUUID } = Cc["@mozilla.org/uuid-generator;1"].getService(Ci.nsIUUIDGenerator);
-
-var { WebAudioFront } = require("devtools/shared/fronts/webaudio");
-var audioNodes = require("devtools/server/actors/utils/audionodes.json");
-
-const EXAMPLE_URL = "http://example.com/browser/devtools/client/webaudioeditor/test/";
-const SIMPLE_CONTEXT_URL = EXAMPLE_URL + "doc_simple-context.html";
-const COMPLEX_CONTEXT_URL = EXAMPLE_URL + "doc_complex-context.html";
-const SIMPLE_NODES_URL = EXAMPLE_URL + "doc_simple-node-creation.html";
-const MEDIA_NODES_URL = EXAMPLE_URL + "doc_media-node-creation.html";
-const BUFFER_AND_ARRAY_URL = EXAMPLE_URL + "doc_buffer-and-array.html";
-const DESTROY_NODES_URL = EXAMPLE_URL + "doc_destroy-nodes.html";
-const CONNECT_PARAM_URL = EXAMPLE_URL + "doc_connect-param.html";
-const CONNECT_MULTI_PARAM_URL = EXAMPLE_URL + "doc_connect-multi-param.html";
-const IFRAME_CONTEXT_URL = EXAMPLE_URL + "doc_iframe-context.html";
-const AUTOMATION_URL = EXAMPLE_URL + "doc_automation.html";
-
-// Enable logging for all the tests. Both the debugger server and frontend will
-// be affected by this pref.
-var gEnableLogging = Services.prefs.getBoolPref("devtools.debugger.log");
-Services.prefs.setBoolPref("devtools.debugger.log", false);
-
-var gToolEnabled = Services.prefs.getBoolPref("devtools.webaudioeditor.enabled");
-
-registerCleanupFunction(() => {
-  Services.prefs.setBoolPref("devtools.debugger.log", gEnableLogging);
-  Services.prefs.setBoolPref("devtools.webaudioeditor.enabled", gToolEnabled);
-  Cu.forceGC();
-});
-
-function reload(aTarget, aWaitForTargetEvent = "navigate") {
-  aTarget.reload();
-  return once(aTarget, aWaitForTargetEvent);
-}
-
-function navigate(aTarget, aUrl, aWaitForTargetEvent = "navigate") {
-  executeSoon(() => aTarget.navigateTo({ url: aUrl }));
-  return once(aTarget, aWaitForTargetEvent);
-}
-
-/**
- * Adds a new tab, and instantiate a WebAudiFront object.
- * This requires calling removeTab before the test ends.
- */
-function initBackend(aUrl) {
-  info("Initializing a web audio editor front.");
-
-  DebuggerServer.init();
-  DebuggerServer.registerAllActors();
-
-  return (async function() {
-    const tab = await addTab(aUrl);
-    const target = await TargetFactory.forTab(tab);
-
-    await target.attach();
-
-    const front = await target.getFront("webaudio");
-    return { target, front };
-  })();
-}
-
-/**
- * Adds a new tab, and open the toolbox for that tab, selecting the audio editor
- * panel.
- * This requires calling teardown before the test ends.
- */
-function initWebAudioEditor(aUrl) {
-  info("Initializing a web audio editor pane.");
-
-  return (async function() {
-    const tab = await addTab(aUrl);
-    const target = await TargetFactory.forTab(tab);
-
-    Services.prefs.setBoolPref("devtools.webaudioeditor.enabled", true);
-    const toolbox = await gDevTools.showToolbox(target, "webaudioeditor");
-    const panel = toolbox.getCurrentPanel();
-    return { target, panel, toolbox };
-  })();
-}
-
-/**
- * Close the toolbox, destroying all panels, and remove the added test tabs.
- */
-function teardown(aTarget) {
-  info("Destroying the web audio editor.");
-
-  return gDevTools.closeToolbox(aTarget).then(() => {
-    while (gBrowser.tabs.length > 1) {
-      gBrowser.removeCurrentTab();
-    }
-  });
-}
-
-// Due to web audio will fire most events synchronously back-to-back,
-// and we can't yield them in a chain without missing actors, this allows
-// us to listen for `n` events and return a promise resolving to them.
-//
-// Takes a `front` object that is an event emitter, the number of
-// programs that should be listened to and waited on, and an optional
-// `onAdd` function that calls with the entire actors array on program link
-function getN(front, eventName, count, spread) {
-  const actors = [];
-  info(`Waiting for ${count} ${eventName} events`);
-
-  return new Promise((resolve) => {
-    front.on(eventName, function onEvent(...args) {
-      const actor = args[0];
-      if (actors.length !== count) {
-        actors.push(spread ? args : actor);
-      }
-      info(`Got ${actors.length} / ${count} ${eventName} events`);
-      if (actors.length === count) {
-        front.off(eventName, onEvent);
-        resolve(actors);
-      }
-    });
-  });
-}
-
-function get(front, eventName) {
-  return getN(front, eventName, 1);
-}
-function get2(front, eventName) {
-  return getN(front, eventName, 2);
-}
-function get3(front, eventName) {
-  return getN(front, eventName, 3);
-}
-function getSpread(front, eventName) {
-  return getN(front, eventName, 1, true);
-}
-function get2Spread(front, eventName) {
-  return getN(front, eventName, 2, true);
-}
-function get3Spread(front, eventName) {
-  return getN(front, eventName, 3, true);
-}
-function getNSpread(front, eventName, count) {
-  return getN(front, eventName, count, true);
-}
-
-/**
- * Waits for the UI_GRAPH_RENDERED event to fire, but only
- * resolves when the graph was rendered with the correct count of
- * nodes and edges.
- */
-function waitForGraphRendered(front, nodeCount, edgeCount, paramEdgeCount) {
-  const eventName = front.EVENTS.UI_GRAPH_RENDERED;
-  info(`Wait for graph rendered with ${nodeCount} nodes, ${edgeCount} edges`);
-
-  return new Promise((resolve) => {
-    front.on(eventName, function onGraphRendered(nodes, edges, pEdges) {
-      const paramEdgesDone = paramEdgeCount != null ? paramEdgeCount === pEdges : true;
-      info(`Got graph rendered with ${nodes} / ${nodeCount} nodes, ` +
-           `${edges} / ${edgeCount} edges`);
-      if (nodes === nodeCount && edges === edgeCount && paramEdgesDone) {
-        front.off(eventName, onGraphRendered);
-        resolve();
-      }
-    });
-  });
-}
-
-function checkVariableView(view, index, hash, description = "") {
-  info("Checking Variable View");
-  const scope = view.getScopeAtIndex(index);
-  const variables = Object.keys(hash);
-
-  // If node shouldn't display any properties, ensure that the 'empty' message is
-  // visible
-  if (!variables.length) {
-    ok(isVisible(scope.window.$("#properties-empty")),
-      description + " should show the empty properties tab.");
-    return;
-  }
-
-  // Otherwise, iterate over expected properties
-  variables.forEach(variable => {
-    const aVar = scope.get(variable);
-    is(aVar.target.querySelector(".name").getAttribute("value"), variable,
-      "Correct property name for " + variable);
-    let value = aVar.target.querySelector(".value").getAttribute("value");
-
-    // Cast value with JSON.parse if possible;
-    // will fail when displaying Object types like "ArrayBuffer"
-    // and "Float32Array", but will match the original value.
-    try {
-      value = JSON.parse(value);
-    } catch (e) {}
-    if (typeof hash[variable] === "function") {
-      ok(hash[variable](value),
-        "Passing property value of " + value + " for " + variable + " " + description);
-    } else {
-      is(value, hash[variable],
-        "Correct property value of " + hash[variable] + " for " + variable + " " + description);
-    }
-  });
-}
-
-function modifyVariableView(win, view, index, prop, value) {
-  const scope = view.getScopeAtIndex(index);
-  const aVar = scope.get(prop);
-  scope.expand();
-
-  return new Promise((resolve, reject) => {
-    const onParamSetSuccess = () => {
-      win.off(win.EVENTS.UI_SET_PARAM_ERROR, onParamSetError);
-      resolve();
-    };
-
-    const onParamSetError = () => {
-      win.off(win.EVENTS.UI_SET_PARAM, onParamSetSuccess);
-      reject();
-    };
-    win.once(win.EVENTS.UI_SET_PARAM, onParamSetSuccess);
-    win.once(win.EVENTS.UI_SET_PARAM_ERROR, onParamSetError);
-
-    // Focus and select the variable to begin editing
-    win.focus();
-    aVar.focus();
-    EventUtils.sendKey("RETURN", win);
-
-    // Must wait for the scope DOM to be available to receive
-    // events
-    executeSoon(() => {
-      info("Setting " + value + " for " + prop + "....");
-      for (const c of (value + "")) {
-        EventUtils.synthesizeKey(c, {}, win);
-      }
-      EventUtils.sendKey("RETURN", win);
-    });
-  });
-}
-
-function findGraphEdge(win, source, target, param) {
-  let selector = ".edgePaths .edgePath[data-source='" + source + "'][data-target='" + target + "']";
-  if (param) {
-    selector += "[data-param='" + param + "']";
-  }
-  return win.document.querySelector(selector);
-}
-
-function findGraphNode(win, node) {
-  const selector = ".nodes > g[data-id='" + node + "']";
-  return win.document.querySelector(selector);
-}
-
-function click(win, element) {
-  EventUtils.sendMouseEvent({ type: "click" }, element, win);
-}
-
-function mouseOver(win, element) {
-  EventUtils.sendMouseEvent({ type: "mouseover" }, element, win);
-}
-
-function command(button) {
-  const ev = button.ownerDocument.createEvent("XULCommandEvent");
-  ev.initCommandEvent("command", true, true, button.ownerDocument.defaultView, 0, false, false, false, false, null, 0);
-  button.dispatchEvent(ev);
-}
-
-function isVisible(element) {
-  return !element.getAttribute("hidden");
-}
-
-/**
- * Clicks a graph node based on actorID or passing in an element.
- * Returns a promise that resolves once UI_INSPECTOR_NODE_SET is fired and
- * the tabs have rendered, completing all RDP requests for the node.
- */
-function clickGraphNode(panelWin, el, waitForToggle = false) {
-  const promises = [
-    once(panelWin, panelWin.EVENTS.UI_INSPECTOR_NODE_SET),
-    once(panelWin, panelWin.EVENTS.UI_PROPERTIES_TAB_RENDERED),
-    once(panelWin, panelWin.EVENTS.UI_AUTOMATION_TAB_RENDERED),
-  ];
-
-  if (waitForToggle) {
-    promises.push(once(panelWin, panelWin.EVENTS.UI_INSPECTOR_TOGGLED));
-  }
-
-  // Use `el` as the element if it is one, otherwise
-  // assume it's an ID and find the related graph node
-  const element = el.tagName ? el : findGraphNode(panelWin, el);
-  click(panelWin, element);
-
-  return Promise.all(promises);
-}
-
-/**
- * Returns the primitive value of a grip's value, or the
- * original form that the string grip.type comes from.
- */
-function getGripValue(value) {
-  if (~["boolean", "string", "number"].indexOf(typeof value)) {
-    return value;
-  }
-
-  switch (value.type) {
-    case "undefined": return undefined;
-    case "Infinity": return Infinity;
-    case "-Infinity": return -Infinity;
-    case "NaN": return NaN;
-    case "-0": return -0;
-    case "null": return null;
-    default: return value;
-  }
-}
-
-/**
- * Counts how many nodes and edges are currently in the graph.
- */
-function countGraphObjects(win) {
-  return {
-    nodes: win.document.querySelectorAll(".nodes > .audionode").length,
-    edges: win.document.querySelectorAll(".edgePaths > .edgePath").length,
-  };
-}
-
-/**
-* Forces cycle collection and GC, used in AudioNode destruction tests.
-*/
-function forceNodeCollection() {
-  ContentTask.spawn(gBrowser.selectedBrowser, {}, async function() {
-    // Kill the reference keeping stuff alive.
-    content.wrappedJSObject.keepAlive = null;
-
-    // Collect the now-deceased nodes.
-    Cu.forceGC();
-    Cu.forceCC();
-    Cu.forceGC();
-    Cu.forceCC();
-  });
-}
-
-/**
- * Takes a `values` array of automation value entries,
- * looking for the value at `time` seconds, checking
- * to see if the value is close to `expected`.
- */
-function checkAutomationValue(values, time, expected) {
-  // Remain flexible on values as we can approximate points
-  const EPSILON = 0.01;
-
-  const value = getValueAt(values, time);
-  ok(Math.abs(value - expected) < EPSILON, "Timeline value at " + time + " with value " + value + " should have value very close to " + expected);
-
-  /**
-   * Entries are ordered in `values` according to time, so if we can't find an exact point
-   * on a time of interest, return the point in between the threshold. This should
-   * get us a very close value.
-   */
-  function getValueAt(values, time) {
-    for (let i = 0; i < values.length; i++) {
-      if (values[i].delta === time) {
-        return values[i].value;
-      }
-      if (values[i].delta > time) {
-        return (values[i - 1].value + values[i].value) / 2;
-      }
-    }
-    return values[values.length - 1].value;
-  }
-}
-
-/**
- * Wait for all inspector tabs to complete rendering.
- */
-function waitForInspectorRender(panelWin, EVENTS) {
-  return Promise.all([
-    once(panelWin, EVENTS.UI_PROPERTIES_TAB_RENDERED),
-    once(panelWin, EVENTS.UI_AUTOMATION_TAB_RENDERED),
-  ]);
-}
-
-/**
- * Takes an AudioNode type and returns it's properties (from audionode.json)
- * as keys and their default values as keys
- */
-function nodeDefaultValues(nodeName) {
-  const fn = NODE_CONSTRUCTORS[nodeName];
-
-  if (typeof fn === "undefined") {
-    return {};
-  }
-
-  const init = nodeName === "AudioDestinationNode" ? "destination" : `create${fn}()`;
-
-  const definition = JSON.stringify(audioNodes[nodeName].properties);
-
-  const evalNode = evalInDebuggee(`
-    let ins = (new AudioContext()).${init};
-    let props = ${definition};
-    let answer = {};
-
-    for(let k in props) {
-      if (props[k].param) {
-        answer[k] = ins[k].defaultValue;
-      } else if (typeof ins[k] === "object" && ins[k] !== null) {
-        answer[k] = ins[k].toString().slice(8, -1);
-      } else {
-        answer[k] = ins[k];
-      }
-    }
-    answer;`);
-
-  return evalNode;
-}
-
-const NODE_CONSTRUCTORS = {
-  "MediaStreamAudioDestinationNode": "MediaStreamDestination",
-  "AudioBufferSourceNode": "BufferSource",
-  "ScriptProcessorNode": "ScriptProcessor",
-  "AnalyserNode": "Analyser",
-  "GainNode": "Gain",
-  "DelayNode": "Delay",
-  "BiquadFilterNode": "BiquadFilter",
-  "WaveShaperNode": "WaveShaper",
-  "PannerNode": "Panner",
-  "ConvolverNode": "Convolver",
-  "ChannelSplitterNode": "ChannelSplitter",
-  "ChannelMergerNode": "ChannelMerger",
-  "DynamicsCompressorNode": "DynamicsCompressor",
-  "OscillatorNode": "Oscillator",
-  "StereoPannerNode": "StereoPanner",
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/views/automation.js
+++ /dev/null
@@ -1,159 +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";
-
-/**
- * Functions handling the audio node inspector UI.
- */
-
-var AutomationView = {
-
-  /**
-   * Initialization function called when the tool starts up.
-   */
-  initialize: function() {
-    this._buttons = $("#automation-param-toolbar-buttons");
-    this.graph = new LineGraphWidget($("#automation-graph"), { avg: false });
-    this.graph.selectionEnabled = false;
-
-    this._onButtonClick = this._onButtonClick.bind(this);
-    this._onNodeSet = this._onNodeSet.bind(this);
-    this._onResize = this._onResize.bind(this);
-
-    this._buttons.addEventListener("click", this._onButtonClick);
-    window.on(EVENTS.UI_INSPECTOR_RESIZE, this._onResize);
-    window.on(EVENTS.UI_INSPECTOR_NODE_SET, this._onNodeSet);
-  },
-
-  /**
-   * Destruction function called when the tool cleans up.
-   */
-  destroy: function() {
-    this._buttons.removeEventListener("click", this._onButtonClick);
-    window.off(EVENTS.UI_INSPECTOR_RESIZE, this._onResize);
-    window.off(EVENTS.UI_INSPECTOR_NODE_SET, this._onNodeSet);
-  },
-
-  /**
-   * Empties out the props view.
-   */
-  resetUI: function() {
-    this._currentNode = null;
-  },
-
-  /**
-   * On a new node selection, create the Automation panel for
-   * that specific node.
-   */
-  async build() {
-    const node = this._currentNode;
-
-    const props = await node.getParams();
-    const params = props.filter(({ flags }) => flags && flags.param);
-
-    this._createParamButtons(params);
-
-    this._selectedParamName = params[0] ? params[0].param : null;
-    this.render();
-  },
-
-  /**
-   * Renders the graph for specified `paramName`. Called when
-   * the parameter view is changed, or when new param data events
-   * are fired for the currently specified param.
-   */
-  async render() {
-    const node = this._currentNode;
-    const paramName = this._selectedParamName;
-    // Escape if either node or parameter name does not exist.
-    if (!node || !paramName) {
-      this._setState("no-params");
-      window.emit(EVENTS.UI_AUTOMATION_TAB_RENDERED, null);
-      return;
-    }
-
-    const { values, events } = await node.getAutomationData(paramName);
-    this._setState(events.length ? "show" : "no-events");
-    await this.graph.setDataWhenReady(values);
-    window.emit(EVENTS.UI_AUTOMATION_TAB_RENDERED, node.id);
-  },
-
-  /**
-   * Create the buttons for each AudioParam, that when clicked,
-   * render the graph for that AudioParam.
-   */
-  _createParamButtons: function(params) {
-    this._buttons.innerHTML = "";
-    params.forEach((param, i) => {
-      const button = document.createXULElement("toolbarbutton");
-      button.setAttribute("class", "devtools-toolbarbutton automation-param-button");
-      button.setAttribute("data-param", param.param);
-      // Set label to the parameter name, should not be L10N'd
-      button.setAttribute("label", param.param);
-
-      // If first button, set to 'selected' for styling
-      if (i === 0) {
-        button.setAttribute("selected", true);
-      }
-
-      this._buttons.appendChild(button);
-    });
-  },
-
-  /**
-   * Internally sets the current audio node and rebuilds appropriate
-   * views.
-   */
-  _setAudioNode: function(node) {
-    this._currentNode = node;
-    if (this._currentNode) {
-      this.build();
-    }
-  },
-
-  /**
-   * Toggles the subviews to display messages whether or not
-   * the audio node has no AudioParams, no automation events, or
-   * shows the graph.
-   */
-  _setState: function(state) {
-    const contentView = $("#automation-content");
-    const emptyView = $("#automation-empty");
-
-    const graphView = $("#automation-graph-container");
-    const noEventsView = $("#automation-no-events");
-
-    contentView.hidden = state === "no-params";
-    emptyView.hidden = state !== "no-params";
-
-    graphView.hidden = state !== "show";
-    noEventsView.hidden = state !== "no-events";
-  },
-
-  /**
-   * Event handlers
-   */
-
-  _onButtonClick: function(e) {
-    Array.forEach($$(".automation-param-button"), $btn => $btn.removeAttribute("selected"));
-    const paramName = e.target.getAttribute("data-param");
-    e.target.setAttribute("selected", true);
-    this._selectedParamName = paramName;
-    this.render();
-  },
-
-  /**
-   * Called when the inspector is resized.
-   */
-  _onResize: function() {
-    this.graph.refresh();
-  },
-
-  /**
-   * Called when the inspector view determines a node is selected.
-   */
-  _onNodeSet: function(id) {
-    this._setAudioNode(id != null ? gAudioNodes.get(id) : null);
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/views/context.js
+++ /dev/null
@@ -1,315 +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 ../includes.js */
-
-const { debounce } = require("devtools/shared/debounce");
-const flags = require("devtools/shared/flags");
-
-// Globals for d3 stuff
-// Default properties of the graph on rerender
-const GRAPH_DEFAULTS = {
-  translate: [20, 20],
-  scale: 1,
-};
-
-// Sizes of SVG arrows in graph
-const ARROW_HEIGHT = 5;
-const ARROW_WIDTH = 8;
-
-// Styles for markers as they cannot be done with CSS.
-const MARKER_STYLING = {
-  light: "#AAA",
-  dark: "#CED3D9",
-};
-Object.defineProperty(this, "MARKER_STYLING", {
-  value: MARKER_STYLING,
-  enumerable: true,
-  writable: false,
-});
-
-const GRAPH_DEBOUNCE_TIMER = 100;
-
-// `gAudioNodes` events that should require the graph
-// to redraw
-const GRAPH_REDRAW_EVENTS = ["add", "connect", "disconnect", "remove"];
-
-/**
- * Functions handling the graph UI.
- */
-var ContextView = {
-  /**
-   * Initialization function, called when the tool is started.
-   */
-  initialize: function() {
-    this._onGraphClick = this._onGraphClick.bind(this);
-    this._onThemeChange = this._onThemeChange.bind(this);
-    this._onStartContext = this._onStartContext.bind(this);
-    this._onEvent = this._onEvent.bind(this);
-
-    this.draw = debounce(this.draw.bind(this), GRAPH_DEBOUNCE_TIMER);
-    $("#graph-target").addEventListener("click", this._onGraphClick);
-
-    window.on(EVENTS.THEME_CHANGE, this._onThemeChange);
-    window.on(EVENTS.START_CONTEXT, this._onStartContext);
-    gAudioNodes.on("*", this._onEvent);
-  },
-
-  /**
-   * Destruction function, called when the tool is closed.
-   */
-  destroy: function() {
-    // If the graph was rendered at all, then the handler
-    // for zooming in will be set. We must remove it to prevent leaks.
-    if (this._zoomBinding) {
-      this._zoomBinding.on("zoom", null);
-    }
-    $("#graph-target").removeEventListener("click", this._onGraphClick);
-
-    window.off(EVENTS.THEME_CHANGE, this._onThemeChange);
-    window.off(EVENTS.START_CONTEXT, this._onStartContext);
-    gAudioNodes.off("*", this._onEvent);
-  },
-
-  /**
-   * Called when a page is reloaded and waiting for a "start-context" event
-   * and clears out old content
-   */
-  resetUI: function() {
-    this.clearGraph();
-    this.resetGraphTransform();
-  },
-
-  /**
-   * Clears out the rendered graph, called when resetting the SVG elements to draw again,
-   * or when resetting the entire UI tool
-   */
-  clearGraph: function() {
-    $("#graph-target").innerHTML = "";
-  },
-
-  /**
-   * Moves the graph back to its original scale and translation.
-   */
-  resetGraphTransform: function() {
-    // Only reset if the graph was ever drawn.
-    if (this._zoomBinding) {
-      const { translate, scale } = GRAPH_DEFAULTS;
-      // Must set the `zoomBinding` so the next `zoom` event is in sync with
-      // where the graph is visually (set by the `transform` attribute).
-      this._zoomBinding.scale(scale);
-      this._zoomBinding.translate(translate);
-      d3.select("#graph-target")
-        .attr("transform", "translate(" + translate + ") scale(" + scale + ")");
-    }
-  },
-
-  getCurrentScale: function() {
-    return this._zoomBinding ? this._zoomBinding.scale() : null;
-  },
-
-  getCurrentTranslation: function() {
-    return this._zoomBinding ? this._zoomBinding.translate() : null;
-  },
-
-  /**
-   * Makes the corresponding graph node appear "focused", removing
-   * focused styles from all other nodes. If no `actorID` specified,
-   * make all nodes appear unselected.
-   */
-  focusNode: function(actorID) {
-    // Remove class "selected" from all nodes
-    Array.forEach($$(".nodes > g"), $node => $node.classList.remove("selected"));
-    // Add to "selected"
-    if (actorID) {
-      this._getNodeByID(actorID).classList.add("selected");
-    }
-  },
-
-  /**
-   * Takes an actorID and returns the corresponding DOM SVG element in the graph
-   */
-  _getNodeByID: function(actorID) {
-    return $(".nodes > g[data-id='" + actorID + "']");
-  },
-
-  /**
-   * Sets the appropriate class on an SVG node when its bypass
-   * status is toggled.
-   */
-  _bypassNode: function(node, enabled) {
-    const el = this._getNodeByID(node.id);
-    el.classList[enabled ? "add" : "remove"]("bypassed");
-  },
-
-  /**
-   * This method renders the nodes currently available in `gAudioNodes` and is
-   * throttled to be called at most every `GRAPH_DEBOUNCE_TIMER` milliseconds.
-   * It's called whenever the audio context routing changes, after being debounced.
-   */
-  draw: function() {
-    // Clear out previous SVG information
-    this.clearGraph();
-
-    const graph = new dagreD3.Digraph();
-    const renderer = new dagreD3.Renderer();
-    gAudioNodes.populateGraph(graph);
-
-    // Post-render manipulation of the nodes
-    const oldDrawNodes = renderer.drawNodes();
-    renderer.drawNodes(function(graph, root) {
-      const svgNodes = oldDrawNodes(graph, root);
-      svgNodes.each(function(n) {
-        const node = graph.node(n);
-        const classString = "audionode type-" + node.type + (node.bypassed ? " bypassed" : "");
-        this.setAttribute("class", classString);
-        this.setAttribute("data-id", node.id);
-        this.setAttribute("data-type", node.type);
-      });
-      return svgNodes;
-    });
-
-    // Post-render manipulation of edges
-    const oldDrawEdgePaths = renderer.drawEdgePaths();
-    const defaultClasses = "edgePath enter";
-
-    renderer.drawEdgePaths(function(graph, root) {
-      const svgEdges = oldDrawEdgePaths(graph, root);
-      svgEdges.each(function(e) {
-        const edge = graph.edge(e);
-
-        // We have to manually specify the default classes on the edges
-        // as to not overwrite them
-        const edgeClass = defaultClasses + (edge.param ? (" param-connection " + edge.param) : "");
-
-        this.setAttribute("data-source", edge.source);
-        this.setAttribute("data-target", edge.target);
-        this.setAttribute("data-param", edge.param ? edge.param : null);
-        this.setAttribute("class", edgeClass);
-      });
-
-      return svgEdges;
-    });
-
-    // Override Dagre-d3's post render function by passing in our own.
-    // This way we can leave styles out of it.
-    renderer.postRender((graph, root) => {
-      // We have to manually set the marker styling since we cannot
-      // do this currently with CSS, although it is in spec for SVG2
-      // https://svgwg.org/svg2-draft/painting.html#VertexMarkerProperties
-      // For now, manually set it on creation, and the `_onThemeChange`
-      // function will fire when the devtools theme changes to update the
-      // styling manually.
-      const theme = Services.prefs.getCharPref("devtools.theme");
-      const markerColor = MARKER_STYLING[theme];
-      if (graph.isDirected() && root.select("#arrowhead").empty()) {
-        root
-          .append("svg:defs")
-          .append("svg:marker")
-          .attr("id", "arrowhead")
-          .attr("viewBox", "0 0 10 10")
-          .attr("refX", ARROW_WIDTH)
-          .attr("refY", ARROW_HEIGHT)
-          .attr("markerUnits", "strokeWidth")
-          .attr("markerWidth", ARROW_WIDTH)
-          .attr("markerHeight", ARROW_HEIGHT)
-          .attr("orient", "auto")
-          .attr("style", "fill: " + markerColor)
-          .append("svg:path")
-          .attr("d", "M 0 0 L 10 5 L 0 10 z");
-      }
-
-      // Reselect the previously selected audio node
-      const currentNode = InspectorView.getCurrentAudioNode();
-      if (currentNode) {
-        this.focusNode(currentNode.id);
-      }
-
-      // Fire an event upon completed rendering, with extra information
-      // if in testing mode only.
-      let info = {};
-      if (flags.testing) {
-        info = gAudioNodes.getInfo();
-      }
-      window.emit(EVENTS.UI_GRAPH_RENDERED, info.nodes, info.edges, info.paramEdges);
-    });
-
-    const layout = dagreD3.layout().rankDir("LR");
-    renderer.layout(layout).run(graph, d3.select("#graph-target"));
-
-    // Handle the sliding and zooming of the graph,
-    // store as `this._zoomBinding` so we can unbind during destruction
-    if (!this._zoomBinding) {
-      this._zoomBinding = d3.behavior.zoom().on("zoom", function() {
-        var ev = d3.event;
-        d3.select("#graph-target")
-          .attr("transform", "translate(" + ev.translate + ") scale(" + ev.scale + ")");
-      });
-      d3.select("svg").call(this._zoomBinding);
-
-      // Set initial translation and scale -- this puts D3's awareness of
-      // the graph in sync with what the user sees originally.
-      this.resetGraphTransform();
-    }
-  },
-
-  /**
-   * Event handlers
-   */
-
-  /**
-   * Called once "start-context" is fired, indicating that there is an audio
-   * context being created to view so render the graph.
-   */
-  _onStartContext: function() {
-    this.draw();
-  },
-
-  /**
-   * Called when `gAudioNodes` fires an event -- most events (listed
-   * in GRAPH_REDRAW_EVENTS) qualify as a redraw event.
-   */
-  _onEvent: function(eventName, ...args) {
-    // If bypassing, just toggle the class on the SVG node
-    // rather than rerendering everything
-    if (eventName === "bypass") {
-      this._bypassNode.apply(this, args);
-    }
-    if (~GRAPH_REDRAW_EVENTS.indexOf(eventName)) {
-      this.draw();
-    }
-  },
-
-  /**
-   * Fired when the devtools theme changes.
-   */
-  _onThemeChange: function(theme) {
-    const markerColor = MARKER_STYLING[theme];
-    const marker = $("#arrowhead");
-    if (marker) {
-      marker.setAttribute("style", "fill: " + markerColor);
-    }
-  },
-
-  /**
-   * Fired when a click occurs in the graph.
-   *
-   * @param Event e
-   *        Click event.
-   */
-  _onGraphClick: function(e) {
-    const node = findGraphNodeParent(e.target);
-    // If node not found (clicking outside of an audio node in the graph),
-    // then ignore this event
-    if (!node) {
-      return;
-    }
-
-    const id = node.getAttribute("data-id");
-
-    this.focusNode(id);
-    window.emit(EVENTS.UI_SELECT_NODE, id);
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/views/inspector.js
+++ /dev/null
@@ -1,188 +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 ../includes.js */
-
-const MIN_INSPECTOR_WIDTH = 300;
-
-// Strings for rendering
-const EXPAND_INSPECTOR_STRING = L10N.getStr("expandInspector");
-const COLLAPSE_INSPECTOR_STRING = L10N.getStr("collapseInspector");
-
-/**
- * Functions handling the audio node inspector UI.
- */
-
-var InspectorView = {
-  _currentNode: null,
-
-  // Set up config for view toggling
-  _collapseString: COLLAPSE_INSPECTOR_STRING,
-  _expandString: EXPAND_INSPECTOR_STRING,
-  _toggleEvent: EVENTS.UI_INSPECTOR_TOGGLED,
-  _animated: true,
-  _delayed: true,
-
-  /**
-   * Initialization function called when the tool starts up.
-   */
-  initialize: function() {
-    // Set up view controller
-    this.el = $("#web-audio-inspector");
-    this.splitter = $("#inspector-splitter");
-    this.el.setAttribute("width", Services.prefs.getIntPref("devtools.webaudioeditor.inspectorWidth"));
-    this.button = $("#inspector-pane-toggle");
-    mixin(this, ToggleMixin);
-    this.bindToggle();
-
-    // Hide inspector view on startup
-    this.hideImmediately();
-
-    this._onNodeSelect = this._onNodeSelect.bind(this);
-    this._onDestroyNode = this._onDestroyNode.bind(this);
-    this._onResize = this._onResize.bind(this);
-    this._onCommandClick = this._onCommandClick.bind(this);
-
-    this.splitter.addEventListener("mouseup", this._onResize);
-    for (const $el of $$("#audio-node-toolbar toolbarbutton")) {
-      $el.addEventListener("command", this._onCommandClick);
-    }
-    window.on(EVENTS.UI_SELECT_NODE, this._onNodeSelect);
-    gAudioNodes.on("remove", this._onDestroyNode);
-  },
-
-  /**
-   * Destruction function called when the tool cleans up.
-   */
-  destroy: function() {
-    this.unbindToggle();
-    this.splitter.removeEventListener("mouseup", this._onResize);
-
-    $("#audio-node-toolbar toolbarbutton").removeEventListener("command", this._onCommandClick);
-    for (const $el of $$("#audio-node-toolbar toolbarbutton")) {
-      $el.removeEventListener("command", this._onCommandClick);
-    }
-    window.off(EVENTS.UI_SELECT_NODE, this._onNodeSelect);
-    gAudioNodes.off("remove", this._onDestroyNode);
-
-    this.el = null;
-    this.button = null;
-    this.splitter = null;
-  },
-
-  /**
-   * Takes a AudioNodeView `node` and sets it as the current
-   * node and scaffolds the inspector view based off of the new node.
-   */
-  async setCurrentAudioNode(node) {
-    this._currentNode = node || null;
-
-    // If no node selected, set the inspector back to "no AudioNode selected"
-    // view.
-    if (!node) {
-      $("#web-audio-editor-details-pane-empty").removeAttribute("hidden");
-      $("#web-audio-editor-tabs").setAttribute("hidden", "true");
-      window.emit(EVENTS.UI_INSPECTOR_NODE_SET, null);
-    } else {
-      // Otherwise load up the tabs view and hide the empty placeholder
-      $("#web-audio-editor-details-pane-empty").setAttribute("hidden", "true");
-      $("#web-audio-editor-tabs").removeAttribute("hidden");
-      this._buildToolbar();
-      window.emit(EVENTS.UI_INSPECTOR_NODE_SET, this._currentNode.id);
-    }
-  },
-
-  /**
-   * Returns the current AudioNodeView.
-   */
-  getCurrentAudioNode: function() {
-    return this._currentNode;
-  },
-
-  /**
-   * Empties out the props view.
-   */
-  resetUI: function() {
-    // Set current node to empty to load empty view
-    this.setCurrentAudioNode();
-
-    // Reset AudioNode inspector and hide
-    this.hideImmediately();
-  },
-
-  _buildToolbar: function() {
-    const node = this.getCurrentAudioNode();
-
-    const bypassable = node.bypassable;
-    const bypassed = node.isBypassed();
-    const button = $("#audio-node-toolbar .bypass");
-
-    if (!bypassable) {
-      button.setAttribute("disabled", true);
-    } else {
-      button.removeAttribute("disabled");
-    }
-
-    if (!bypassable || bypassed) {
-      button.removeAttribute("checked");
-    } else {
-      button.setAttribute("checked", true);
-    }
-  },
-
-  /**
-   * Event handlers
-   */
-
-  /**
-   * Called on EVENTS.UI_SELECT_NODE, and takes an actorID `id`
-   * and calls `setCurrentAudioNode` to scaffold the inspector view.
-   */
-  _onNodeSelect: function(id) {
-    this.setCurrentAudioNode(gAudioNodes.get(id));
-
-    // Ensure inspector is visible when selecting a new node
-    this.show();
-  },
-
-  _onResize: function() {
-    if (this.el.getAttribute("width") < MIN_INSPECTOR_WIDTH) {
-      this.el.setAttribute("width", MIN_INSPECTOR_WIDTH);
-    }
-    Services.prefs.setIntPref("devtools.webaudioeditor.inspectorWidth", this.el.getAttribute("width"));
-    window.emit(EVENTS.UI_INSPECTOR_RESIZE);
-  },
-
-  /**
-   * Called when `DESTROY_NODE` is fired to remove the node from props view if
-   * it's currently selected.
-   */
-  _onDestroyNode: function(node) {
-    if (this._currentNode && this._currentNode.id === node.id) {
-      this.setCurrentAudioNode(null);
-    }
-  },
-
-  _onCommandClick: function(e) {
-    const node = this.getCurrentAudioNode();
-    const button = e.target;
-    const command = button.getAttribute("data-command");
-    const checked = button.getAttribute("checked");
-
-    if (button.getAttribute("disabled")) {
-      return;
-    }
-
-    if (command === "bypass") {
-      if (checked) {
-        button.removeAttribute("checked");
-        node.bypass(true);
-      } else {
-        button.setAttribute("checked", true);
-        node.bypass(false);
-      }
-    }
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/views/properties.js
+++ /dev/null
@@ -1,162 +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 { VariablesView } = require("resource://devtools/client/shared/widgets/VariablesView.jsm");
-
-const GENERIC_VARIABLES_VIEW_SETTINGS = {
-  searchEnabled: false,
-  editableValueTooltip: "",
-  editableNameTooltip: "",
-  preventDisableOnChange: true,
-  preventDescriptorModifiers: false,
-  eval: () => {},
-};
-
-/**
- * Functions handling the audio node inspector UI.
- */
-
-var PropertiesView = {
-
-  /**
-   * Initialization function called when the tool starts up.
-   */
-  initialize: function() {
-    this._onEval = this._onEval.bind(this);
-    this._onNodeSet = this._onNodeSet.bind(this);
-
-    window.on(EVENTS.UI_INSPECTOR_NODE_SET, this._onNodeSet);
-    this._propsView = new VariablesView($("#properties-content"), GENERIC_VARIABLES_VIEW_SETTINGS);
-    this._propsView.eval = this._onEval;
-  },
-
-  /**
-   * Destruction function called when the tool cleans up.
-   */
-  destroy: function() {
-    window.off(EVENTS.UI_INSPECTOR_NODE_SET, this._onNodeSet);
-    this._propsView = null;
-  },
-
-  /**
-   * Empties out the props view.
-   */
-  resetUI: function() {
-    this._propsView.empty();
-    this._currentNode = null;
-  },
-
-  /**
-   * Internally sets the current audio node and rebuilds appropriate
-   * views.
-   */
-  _setAudioNode: function(node) {
-    this._currentNode = node;
-    if (this._currentNode) {
-      this._buildPropertiesView();
-    }
-  },
-
-  /**
-   * Reconstructs the `Properties` tab in the inspector
-   * with the `this._currentNode` as it's source.
-   */
-  async _buildPropertiesView() {
-    const propsView = this._propsView;
-    const node = this._currentNode;
-    propsView.empty();
-
-    const audioParamsScope = propsView.addScope("AudioParams");
-    const props = await node.getParams();
-
-    // Disable AudioParams VariableView expansion
-    // when there are no props i.e. AudioDestinationNode
-    this._togglePropertiesView(!!props.length);
-
-    props.forEach(({ param, value, flags }) => {
-      const descriptor = {
-        value: value,
-        writable: !flags || !flags.readonly,
-      };
-      const item = audioParamsScope.addItem(param, descriptor);
-
-      // No items should currently display a dropdown
-      item.twisty = false;
-    });
-
-    audioParamsScope.expanded = true;
-
-    window.emit(EVENTS.UI_PROPERTIES_TAB_RENDERED, node.id);
-  },
-
-  /**
-   * Toggles the display of the "empty" properties view when
-   * node has no properties to display.
-   */
-  _togglePropertiesView: function(show) {
-    const propsView = $("#properties-content");
-    const emptyView = $("#properties-empty");
-    (show ? propsView : emptyView).removeAttribute("hidden");
-    (show ? emptyView : propsView).setAttribute("hidden", "true");
-  },
-
-  /**
-   * Returns the scope for AudioParams in the
-   * VariablesView.
-   *
-   * @return Scope
-   */
-  _getAudioPropertiesScope: function() {
-    return this._propsView.getScopeAtIndex(0);
-  },
-
-  /**
-   * Event handlers
-   */
-
-  /**
-   * Called when the inspector view determines a node is selected.
-   */
-  _onNodeSet: function(id) {
-    this._setAudioNode(gAudioNodes.get(id));
-  },
-
-  /**
-   * Executed when an audio prop is changed in the UI.
-   */
-  async _onEval(variable, value) {
-    const ownerScope = variable.ownerView;
-    const node = this._currentNode;
-    const propName = variable.name;
-    let error;
-
-    if (!variable._initialDescriptor.writable) {
-      error = new Error("Variable " + propName + " is not writable.");
-    } else {
-      // Cast value to proper type
-      try {
-        const number = parseFloat(value);
-        if (!isNaN(number)) {
-          value = number;
-        } else {
-          value = JSON.parse(value);
-        }
-        error = await node.actor.setParam(propName, value);
-      } catch (e) {
-        error = e;
-      }
-    }
-
-    // TODO figure out how to handle and display set prop errors
-    // and enable `test/brorwser_wa_properties-view-edit.js`
-    // Bug 994258
-    if (!error) {
-      ownerScope.get(propName).setGrip(value);
-      window.emit(EVENTS.UI_SET_PARAM, node.id, propName, value);
-    } else {
-      window.emit(EVENTS.UI_SET_PARAM_ERROR, node.id, propName, value);
-    }
-  },
-};
deleted file mode 100644
--- a/devtools/client/webaudioeditor/views/utils.js
+++ /dev/null
@@ -1,103 +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";
-
-/**
- * Takes an element in an SVG graph and iterates over
- * ancestors until it finds the graph node container. If not found,
- * returns null.
- */
-
-function findGraphNodeParent(el) {
-  // Some targets may not contain `classList` property
-  if (!el.classList) {
-    return null;
-  }
-
-  while (!el.classList.contains("nodes")) {
-    if (el.classList.contains("audionode")) {
-      return el;
-    }
-    el = el.parentNode;
-  }
-  return null;
-}
-
-/**
- * Object for use with `mix` into a view.
- * Must have the following properties defined on the view:
- * - `el`
- * - `button`
- * - `_collapseString`
- * - `_expandString`
- * - `_toggleEvent`
- *
- * Optional properties on the view can be defined to specify default
- * visibility options.
- * - `_animated`
- * - `_delayed`
- */
-var ToggleMixin = {
-
-  bindToggle: function() {
-    this._onToggle = this._onToggle.bind(this);
-    this.button.addEventListener("mousedown", this._onToggle);
-  },
-
-  unbindToggle: function() {
-    this.button.removeEventListener("mousedown", this._onToggle);
-  },
-
-  show: function() {
-    this._viewController({ visible: true });
-  },
-
-  hide: function() {
-    this._viewController({ visible: false });
-  },
-
-  hideImmediately: function() {
-    this._viewController({ visible: false, delayed: false, animated: false });
-  },
-
-  /**
-   * Returns a boolean indicating whether or not the view.
-   * is currently being shown.
-   */
-  isVisible: function() {
-    return !this.el.classList.contains("pane-collapsed");
-  },
-
-  /**
-   * Toggles the visibility of the view.
-   *
-   * @param object visible
-   *        - visible: boolean indicating whether the panel should be shown or not
-   *        - animated: boolean indiciating whether the pane should be animated
-   *        - delayed: boolean indicating whether the pane's opening should wait
-   *                   a few cycles or not
-   */
-  _viewController: function({ visible, animated, delayed }) {
-    const flags = {
-      visible: visible,
-      animated: animated != null ? animated : !!this._animated,
-      delayed: delayed != null ? delayed : !!this._delayed,
-      callback: () => window.emit(this._toggleEvent, visible),
-    };
-
-    ViewHelpers.togglePane(flags, this.el);
-
-    if (flags.visible) {
-      this.button.classList.remove("pane-collapsed");
-      this.button.setAttribute("tooltiptext", this._collapseString);
-    } else {
-      this.button.classList.add("pane-collapsed");
-      this.button.setAttribute("tooltiptext", this._expandString);
-    }
-  },
-
-  _onToggle: function() {
-    this._viewController({ visible: !this.isVisible() });
-  },
-};
--- a/devtools/shared/fronts/moz.build
+++ b/devtools/shared/fronts/moz.build
@@ -34,11 +34,10 @@ DevToolsModules(
     'promises.js',
     'reflow.js',
     'root.js',
     'screenshot.js',
     'storage.js',
     'string.js',
     'styles.js',
     'stylesheets.js',
-    'webaudio.js',
     'webconsole.js',
 )
deleted file mode 100644
--- a/devtools/shared/fronts/webaudio.js
+++ /dev/null
@@ -1,76 +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 {
-  audionodeSpec,
-  webAudioSpec,
-  AUTOMATION_METHODS,
-  NODE_CREATION_METHODS,
-  NODE_ROUTING_METHODS,
-} = require("devtools/shared/specs/webaudio");
-const { FrontClassWithSpec, registerFront } = require("devtools/shared/protocol");
-loader.lazyRequireGetter(this, "AUDIO_NODE_DEFINITION",
-  "devtools/server/actors/utils/audionodes.json");
-
-/**
- * The corresponding Front object for the AudioNodeActor.
- *
- * @attribute {String} type
- *            The type of audio node, like "OscillatorNode", "MediaElementAudioSourceNode"
- * @attribute {Boolean} source
- *            Boolean indicating if the node is a source node, like BufferSourceNode,
- *            MediaElementAudioSourceNode, OscillatorNode, etc.
- * @attribute {Boolean} bypassable
- *            Boolean indicating if the audio node is bypassable (splitter,
- *            merger and destination nodes, for example, are not)
- */
-class AudioNodeFront extends FrontClassWithSpec(audionodeSpec) {
-  form(form) {
-    this.actorID = form.actor;
-    this.type = form.type;
-    this.source = form.source;
-    this.bypassable = form.bypassable;
-  }
-}
-
-exports.AudioNodeFront = AudioNodeFront;
-registerFront(AudioNodeFront);
-
-/**
- * The corresponding Front object for the WebAudioActor.
- */
-class WebAudioFront extends FrontClassWithSpec(webAudioSpec) {
-  constructor(client) {
-    super(client);
-
-    this.before("create-node", this._onCreateNode.bind(this));
-
-    // Attribute name from which to retrieve the actorID out of the target actor's form
-    this.formAttributeName = "webaudioActor";
-  }
-
-  /**
-   * If connecting to older geckos (<Fx43), where audio node actor's do not
-   * contain `type`, `source` and `bypassable` properties, fetch
-   * them manually here.
-   */
-  _onCreateNode(audionode) {
-    if (!audionode.type) {
-      return audionode.getType().then(type => {
-        audionode.type = type;
-        audionode.source = !!AUDIO_NODE_DEFINITION[type].source;
-        audionode.bypassable = !AUDIO_NODE_DEFINITION[type].unbypassable;
-      });
-    }
-    return null;
-  }
-}
-
-WebAudioFront.AUTOMATION_METHODS = new Set(AUTOMATION_METHODS);
-WebAudioFront.NODE_CREATION_METHODS = new Set(NODE_CREATION_METHODS);
-WebAudioFront.NODE_ROUTING_METHODS = new Set(NODE_ROUTING_METHODS);
-
-exports.WebAudioFront = WebAudioFront;
-registerFront(WebAudioFront);
--- a/devtools/shared/specs/index.js
+++ b/devtools/shared/specs/index.js
@@ -261,17 +261,17 @@ const Types = exports.__TypesForTests = 
   {
     types: ["workerTarget"],
     spec: "devtools/shared/specs/targets/worker",
     front: "devtools/shared/fronts/targets/worker",
   },
   {
     types: ["audionode", "webaudio"],
     spec: "devtools/shared/specs/webaudio",
-    front: "devtools/shared/fronts/webaudio",
+    front: null,
   },
   {
     types: ["console"],
     spec: "devtools/shared/specs/webconsole",
     front: "devtools/shared/fronts/webconsole",
   },
   {
     types: ["pushSubscription"],