Bug 1250430 - Remove SrcDir loader support from devtools. r=jryans
authorAlexandre Poirot <poirot.alex@gmail.com>
Sat, 27 Feb 2016 04:51:11 -0800
changeset 324012 49253a251d3e6b783e7d985a81b669e2eeb31c97
parent 324011 93f0d5522db1bcdb8a7c839930025a2d2f37b443
child 324013 c71cf2cec67dd2bc97b0a7091544e6679faa438d
push id1128
push userjlund@mozilla.com
push dateWed, 01 Jun 2016 01:31:59 +0000
treeherdermozilla-release@fe0d30de989d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjryans
bugs1250430
milestone47.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 1250430 - Remove SrcDir loader support from devtools. r=jryans
devtools/client/framework/toolbox.js
devtools/client/framework/toolbox.xul
devtools/client/locales/en-US/webide.dtd
devtools/client/webide/content/webide.js
devtools/client/webide/content/webide.xul
devtools/shared/Loader.jsm
devtools/shared/gcli/commands/index.js
devtools/shared/gcli/commands/moz.build
devtools/shared/gcli/commands/tools.js
devtools/shared/shims/Loader.jsm
devtools/shared/tests/mochitest/chrome.ini
devtools/shared/tests/mochitest/test_loader_paths.html
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -558,21 +558,16 @@ Toolbox.prototype = {
     prevKey.addEventListener("command", this.selectPreviousTool.bind(this), true);
 
     let minimizeKey = this.doc.getElementById("toolbox-minimize-key");
     minimizeKey.addEventListener("command", this._toggleMinimizeMode, true);
 
     let toggleKey = this.doc.getElementById("toolbox-toggle-host-key");
     toggleKey.addEventListener("command", this.switchToPreviousHost.bind(this), true);
 
-    if (Services.prefs.prefHasUserValue("devtools.loader.srcdir")) {
-      let reloadKey = this.doc.getElementById("tools-reload-key");
-      reloadKey.addEventListener("command", this.reload.bind(this), true);
-    }
-
     // Split console uses keypress instead of command so the event can be
     // cancelled with stopPropagation on the keypress, and not preventDefault.
     this.doc.addEventListener("keypress", this._splitConsoleOnKeypress, false);
 
     this.doc.addEventListener("focus", this._onFocus, true);
   },
 
   _registerOverlays: function() {
@@ -1697,21 +1692,16 @@ Toolbox.prototype = {
     }
 
     // clean up the toolbox if its window is closed
     let newHost = new Hosts[hostType](this.target.tab, options);
     newHost.on("window-closed", this.destroy);
     return newHost;
   },
 
-  reload: function () {
-    const {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-    devtools.reload(true);
-  },
-
   /**
    * Switch to the last used host for the toolbox UI.
    * This is determined by the devtools.toolbox.previousHost pref.
    */
   switchToPreviousHost: function() {
     let hostType = Services.prefs.getCharPref(this._prefs.PREVIOUS_HOST);
 
     // Handle the case where the previous host happens to match the current
--- a/devtools/client/framework/toolbox.xul
+++ b/devtools/client/framework/toolbox.xul
@@ -89,20 +89,16 @@
     <key id="toolbox-minimize-key"
          key="&toolboxToggleMinimize.key;"
          oncommand="void(0);"
          modifiers="shift, accel"/>
     <key id="toolbox-toggle-host-key"
          key="&toolboxToggle.key;"
          oncommand="void(0);"
          modifiers="accel shift"/>
-    <key id="tools-reload-key"
-         key="&toolboxReload.key;"
-         oncommand="void(0);"
-         modifiers="accel alt"/>
   </keyset>
 
   <popupset>
     <menupopup id="toolbox-textbox-context-popup">
       <menuitem id="cMenu_undo"/>
       <menuseparator/>
       <menuitem id="cMenu_cut"/>
       <menuitem id="cMenu_copy"/>
--- a/devtools/client/locales/en-US/webide.dtd
+++ b/devtools/client/locales/en-US/webide.dtd
@@ -70,19 +70,16 @@
 <!ENTITY key_toggleToolbox "VK_F12">
 <!-- toggle sidebar -->
 <!ENTITY key_toggleEditor "B">
 <!-- zoom -->
 <!ENTITY key_zoomin "+">
 <!ENTITY key_zoomin2 "=">
 <!ENTITY key_zoomout "-">
 <!ENTITY key_resetzoom "0">
-<!-- reload WebIDE and devtools from local checkout -->
-<!-- this binding is with accel+alt, whereas all others are just accel -->
-<!ENTITY key_reload_devtools "R">
 
 <!ENTITY projectPanel_myProjects "My Projects">
 <!ENTITY projectPanel_runtimeApps "Runtime Apps">
 <!ENTITY projectPanel_tabs "Tabs">
 <!ENTITY runtimePanel_usb "USB Devices">
 <!ENTITY runtimePanel_wifi "Wi-Fi Devices">
 <!ENTITY runtimePanel_simulator "Simulators">
 <!ENTITY runtimePanel_other "Other">
--- a/devtools/client/webide/content/webide.js
+++ b/devtools/client/webide/content/webide.js
@@ -1150,17 +1150,10 @@ var Cmds = {
       UI.contentViewer.fullZoom -= 0.1;
       Services.prefs.setCharPref("devtools.webide.zoom", UI.contentViewer.fullZoom);
     }
   },
 
   resetZoom: function() {
     UI.contentViewer.fullZoom = 1;
     Services.prefs.setCharPref("devtools.webide.zoom", 1);
-  },
-
-  reloadDevtools: function(event) {
-    if (Services.prefs.prefHasUserValue("devtools.loader.srcdir")) {
-      let {devtools} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-      devtools.reload();
-    }
   }
 };
--- a/devtools/client/webide/content/webide.xul
+++ b/devtools/client/webide/content/webide.xul
@@ -53,17 +53,16 @@
       <command id="cmd_showPrefs" oncommand="Cmds.showPrefs()"/>
       <command id="cmd_showTroubleShooting" oncommand="Cmds.showTroubleShooting()"/>
       <command id="cmd_play" oncommand="Cmds.play()"/>
       <command id="cmd_stop" oncommand="Cmds.stop()" label="&projectMenu_stop_label;"/>
       <command id="cmd_toggleToolbox" oncommand="Cmds.toggleToolbox()"/>
       <command id="cmd_zoomin" label="&viewMenu_zoomin_label;" oncommand="Cmds.zoomIn()"/>
       <command id="cmd_zoomout" label="&viewMenu_zoomout_label;" oncommand="Cmds.zoomOut()"/>
       <command id="cmd_resetzoom" label="&viewMenu_resetzoom_label;" oncommand="Cmds.resetZoom()"/>
-      <command id="cmd_reload_devtools" oncommand="Cmds.reloadDevtools()"/>
     </commandset>
   </commandset>
 
   <menubar id="main-menubar">
     <menu id="menu-project" label="&projectMenu_label;" accesskey="&projectMenu_accesskey;">
       <menupopup id="menu-project-popup">
         <menuitem command="cmd_newApp" accesskey="&projectMenu_newApp_accesskey;"/>
         <menuitem command="cmd_importPackagedApp" accesskey="&projectMenu_importPackagedApp_accesskey;"/>
@@ -111,17 +110,16 @@
     <key key="&key_showProjectPanel;" id="key_showProjectPanel" command="cmd_showProjectPanel" modifiers="accel"/>
     <key key="&key_play;" id="key_play" command="cmd_play" modifiers="accel"/>
     <key key="&key_toggleEditor;" id="key_toggleEditor" command="cmd_toggleEditor" modifiers="accel"/>
     <key keycode="&key_toggleToolbox;" id="key_toggleToolbox" command="cmd_toggleToolbox"/>
     <key key="&key_zoomin;" id="key_zoomin" command="cmd_zoomin" modifiers="accel"/>
     <key key="&key_zoomin2;" id="key_zoomin2" command="cmd_zoomin" modifiers="accel"/>
     <key key="&key_zoomout;" id="key_zoomout" command="cmd_zoomout" modifiers="accel"/>
     <key key="&key_resetzoom;" id="key_resetzoom" command="cmd_resetzoom" modifiers="accel"/>
-    <key key="&key_reload_devtools;" id="key_reload_devtools" command="cmd_reload_devtools" modifiers="accel alt"/>
   </keyset>
 
   <tooltip id="aHTMLTooltip" page="true"/>
 
   <toolbar id="main-toolbar">
 
     <vbox flex="1">
       <hbox id="action-buttons-container" class="busy">
--- a/devtools/shared/Loader.jsm
+++ b/devtools/shared/Loader.jsm
@@ -17,17 +17,17 @@ Cu.import("resource://gre/modules/Servic
 XPCOMUtils.defineLazyModuleGetter(this, "NetUtil", "resource://gre/modules/NetUtil.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "FileUtils", "resource://gre/modules/FileUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
 
 var { Loader } = Cu.import("resource://gre/modules/commonjs/toolkit/loader.js", {});
 var promise = Cu.import("resource://gre/modules/Promise.jsm", {}).Promise;
 
 this.EXPORTED_SYMBOLS = ["DevToolsLoader", "devtools", "BuiltinProvider",
-                         "SrcdirProvider", "require", "loader"];
+                         "require", "loader"];
 
 /**
  * Providers are different strategies for loading the devtools.
  */
 
 var loaderModules = {
   "Services": Object.create(Services),
   "toolkit/loader": Loader,
@@ -83,18 +83,16 @@ var sharedGlobalBlocklist = ["sdk/indexe
  */
 function BuiltinProvider() {}
 BuiltinProvider.prototype = {
   load: function() {
     this.loader = new Loader.Loader({
       id: "fx-devtools",
       modules: loaderModules,
       paths: {
-        // When you add a line to this mapping, don't forget to make a
-        // corresponding addition to the SrcdirProvider mapping below as well.
         // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
         "": "resource://gre/modules/commonjs/",
         // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
         "devtools": "resource://devtools",
         // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
         "gcli": "resource://devtools/shared/gcli/source/lib/gcli",
         // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
         "promise": "resource://gre/modules/Promise-backend.js",
@@ -119,135 +117,16 @@ BuiltinProvider.prototype = {
   },
 
   unload: function(reason) {
     Loader.unload(this.loader, reason);
     delete this.loader;
   },
 };
 
-/**
- * Used when the tools should be loaded from a mozilla-central checkout.  In
- * addition to different paths, it needs to write chrome.manifest files to
- * override chrome urls from the builtin tools.
- */
-function SrcdirProvider() {}
-SrcdirProvider.prototype = {
-  fileURI: function(path) {
-    let file = new FileUtils.File(path);
-    return Services.io.newFileURI(file).spec;
-  },
-
-  load: function() {
-    let srcDir = Services.prefs.getComplexValue("devtools.loader.srcdir",
-                                                Ci.nsISupportsString);
-    srcDir = OS.Path.normalize(srcDir.data.trim());
-    let devtoolsDir = OS.Path.join(srcDir, "devtools");
-    let sharedDir = OS.Path.join(devtoolsDir, "shared");
-    let modulesDir = OS.Path.join(srcDir, "toolkit", "modules");
-    let devtoolsURI = this.fileURI(devtoolsDir);
-    let gcliURI = this.fileURI(OS.Path.join(sharedDir,
-                                            "gcli", "source", "lib", "gcli"));
-    let promiseURI = this.fileURI(OS.Path.join(modulesDir,
-                                               "Promise-backend.js"));
-    let acornURI = this.fileURI(OS.Path.join(sharedDir, "acorn"));
-    let acornWalkURI = OS.Path.join(acornURI, "walk.js");
-    let sourceMapURI = this.fileURI(OS.Path.join(sharedDir,
-                                                 "sourcemap", "source-map.js"));
-    this.loader = new Loader.Loader({
-      id: "fx-devtools",
-      modules: loaderModules,
-      paths: {
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "": "resource://gre/modules/commonjs/",
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "devtools": devtoolsURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "gcli": gcliURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "promise": promiseURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "acorn": acornURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "acorn/util/walk": acornWalkURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-        "source-map": sourceMapURI,
-        // ⚠ DISCUSSION ON DEV-DEVELOPER-TOOLS REQUIRED BEFORE MODIFYING ⚠
-      },
-      globals: this.globals,
-      invisibleToDebugger: this.invisibleToDebugger,
-      sharedGlobal: true,
-      sharedGlobalBlocklist,
-    });
-
-    return this._writeManifest(srcDir).then(null, Cu.reportError);
-  },
-
-  unload: function(reason) {
-    Loader.unload(this.loader, reason);
-    delete this.loader;
-  },
-
-  _readFile: function(filename) {
-    let deferred = promise.defer();
-    let file = new FileUtils.File(filename);
-    NetUtil.asyncFetch({
-      uri: NetUtil.newURI(file),
-      loadUsingSystemPrincipal: true
-    }, (inputStream, status) => {
-        if (!Components.isSuccessCode(status)) {
-          deferred.reject(new Error("Couldn't load manifest: " + filename + "\n"));
-          return;
-        }
-        var data = NetUtil.readInputStreamToString(inputStream, inputStream.available());
-        deferred.resolve(data);
-      });
-
-    return deferred.promise;
-  },
-
-  _writeFile: function(filename, data) {
-    let promise = OS.File.writeAtomic(filename, data, {encoding: "utf-8"});
-    return promise.then(null, (ex) => new Error("Couldn't write manifest: " + ex + "\n"));
-  },
-
-  _writeManifest: function(srcDir) {
-    let clientDir = OS.Path.join(srcDir, "devtools", "client");
-    return this._readFile(OS.Path.join(clientDir, "jar.mn")).then((data) => {
-      // The file data is contained within inputStream.
-      // You can read it into a string with
-      let entries = [];
-      let lines = data.split(/\n/);
-      let preprocessed = /^\s*\*/;
-      let contentEntry = /^\s+content\/(\S+)\s+\((\S+)\)/;
-      for (let line of lines) {
-        if (preprocessed.test(line)) {
-          dump("Unable to override preprocessed file: " + line + "\n");
-          continue;
-        }
-        let match = contentEntry.exec(line);
-        if (match) {
-          let pathComponents = match[2].split("/");
-          pathComponents.unshift(clientDir);
-          let path = OS.Path.join.apply(OS.Path, pathComponents);
-          let uri = this.fileURI(path);
-          let chromeURI = "chrome://devtools/content/" + match[1];
-          let entry = "override " + chromeURI + "\t" + uri;
-          entries.push(entry);
-        }
-      }
-      return this._writeFile(OS.Path.join(clientDir, "chrome.manifest"),
-                             entries.join("\n"));
-    }).then(() => {
-      let clientDirFile = new FileUtils.File(clientDir);
-      Components.manager.addBootstrappedManifestLocation(clientDirFile);
-    });
-  }
-};
-
 var gNextLoaderID = 0;
 
 /**
  * The main devtools API.
  * In addition to a few loader-related details, this object will also include all
  * exports from the main module.  The standard instance of this loader is
  * exported as |devtools| below, but if a fresh copy of the loader is needed,
  * then a new one can also be created.
@@ -259,17 +138,17 @@ this.DevToolsLoader = function DevToolsL
   this.lazyServiceGetter = XPCOMUtils.defineLazyServiceGetter.bind(XPCOMUtils);
   this.lazyRequireGetter = this.lazyRequireGetter.bind(this);
   this.main = this.main.bind(this);
 };
 
 DevToolsLoader.prototype = {
   get provider() {
     if (!this._provider) {
-      this._chooseProvider();
+      this._loadProvider();
     }
     return this._provider;
   },
 
   _provider: null,
 
   get id() {
     if (this._id) {
@@ -281,17 +160,17 @@ DevToolsLoader.prototype = {
 
   /**
    * A dummy version of require, in case a provider hasn't been chosen yet when
    * this is first called.  This will then be replaced by the real version.
    * @see setProvider
    */
   require: function() {
     if (!this._provider) {
-      this._chooseProvider();
+      this._loadProvider();
     }
     return this.require.apply(this, arguments);
   },
 
   /**
    * Define a getter property on the given object that requires the given
    * module. This enables delaying importing modules until the module is
    * actually used.
@@ -426,36 +305,32 @@ DevToolsLoader.prototype = {
     if (this._mainid) {
       this.main(this._mainid);
     }
   },
 
   /**
    * Choose a default tools provider based on the preferences.
    */
-  _chooseProvider: function() {
-    if (Services.prefs.prefHasUserValue("devtools.loader.srcdir")) {
-      this.setProvider(new SrcdirProvider());
-    } else {
-      this.setProvider(new BuiltinProvider());
-    }
+  _loadProvider: function() {
+    this.setProvider(new BuiltinProvider());
   },
 
   /**
    * Reload the current provider.
    */
   reload: function() {
     var events = this.require("sdk/system/events");
     events.emit("startupcache-invalidate", {});
     events.emit("devtools-unloaded", {});
 
     this._provider.unload("reload");
     delete this._provider;
     delete this._mainid;
-    this._chooseProvider();
+    this._loadProvider();
     this.main("devtools/client/main");
   },
 
   /**
    * Sets whether the compartments loaded by this instance should be invisible
    * to the debugger.  Invisibility is needed for loaders that support debugging
    * of chrome code.  This is true of remote target environments, like Fennec or
    * B2G.  It is not the default case for desktop Firefox because we offer the
--- a/devtools/shared/gcli/commands/index.js
+++ b/devtools/shared/gcli/commands/index.js
@@ -70,17 +70,16 @@ exports.devtoolsModules = [
   "devtools/shared/gcli/commands/media",
   "devtools/shared/gcli/commands/pagemod",
   "devtools/shared/gcli/commands/paintflashing",
   "devtools/shared/gcli/commands/qsa",
   "devtools/shared/gcli/commands/restart",
   "devtools/shared/gcli/commands/rulers",
   "devtools/shared/gcli/commands/screenshot",
   "devtools/shared/gcli/commands/security",
-  "devtools/shared/gcli/commands/tools",
 ];
 
 /**
  * Register commands from tools with 'command: [ "some/module" ]' definitions.
  * The map/reduce incantation squashes the array of arrays to a single array.
  */
 try {
   const defaultTools = require("devtools/client/definitions").defaultTools;
--- a/devtools/shared/gcli/commands/moz.build
+++ b/devtools/shared/gcli/commands/moz.build
@@ -22,10 +22,9 @@ DevToolsModules(
     'media.js',
     'pagemod.js',
     'paintflashing.js',
     'qsa.js',
     'restart.js',
     'rulers.js',
     'screenshot.js',
     'security.js',
-    'tools.js',
 )
deleted file mode 100644
--- a/devtools/shared/gcli/commands/tools.js
+++ /dev/null
@@ -1,99 +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 { Cc, Ci, Cu } = require("chrome");
-const Services = require("Services");
-const { OS } = require("resource://gre/modules/osfile.jsm");
-const { devtools } = require("resource://devtools/shared/Loader.jsm");
-const gcli = require("gcli/index");
-const l10n = require("gcli/l10n");
-
-const BRAND_SHORT_NAME = Cc["@mozilla.org/intl/stringbundle;1"]
-                           .getService(Ci.nsIStringBundleService)
-                           .createBundle("chrome://branding/locale/brand.properties")
-                           .GetStringFromName("brandShortName");
-
-exports.items = [
-  {
-    name: "tools",
-    description: l10n.lookupFormat("toolsDesc2", [ BRAND_SHORT_NAME ]),
-    manual: l10n.lookupFormat("toolsManual2", [ BRAND_SHORT_NAME ]),
-    get hidden() {
-      return gcli.hiddenByChromePref();
-    }
-  },
-  {
-    item: "command",
-    runAt: "client",
-    name: "tools srcdir",
-    description: l10n.lookup("toolsSrcdirDesc"),
-    manual: l10n.lookupFormat("toolsSrcdirManual2", [ BRAND_SHORT_NAME ]),
-    get hidden() {
-      return gcli.hiddenByChromePref();
-    },
-    params: [
-      {
-        name: "srcdir",
-        type: "string" /* {
-          name: "file",
-          filetype: "directory",
-          existing: "yes"
-        } */,
-        description: l10n.lookup("toolsSrcdirDir")
-      }
-    ],
-    returnType: "string",
-    exec: function(args, context) {
-      let clobber = OS.Path.join(args.srcdir, "CLOBBER");
-      return OS.File.exists(clobber).then(function(exists) {
-        if (exists) {
-          let str = Cc["@mozilla.org/supports-string;1"]
-                      .createInstance(Ci.nsISupportsString);
-          str.data = args.srcdir;
-          Services.prefs.setComplexValue("devtools.loader.srcdir",
-                                         Ci.nsISupportsString, str);
-          devtools.reload();
-
-          return l10n.lookupFormat("toolsSrcdirReloaded2", [ args.srcdir ]);
-        }
-
-        return l10n.lookupFormat("toolsSrcdirNotFound2", [ args.srcdir ]);
-      });
-    }
-  },
-  {
-    item: "command",
-    runAt: "client",
-    name: "tools builtin",
-    description: l10n.lookup("toolsBuiltinDesc"),
-    manual: l10n.lookup("toolsBuiltinManual"),
-    get hidden() {
-      return gcli.hiddenByChromePref();
-    },
-    returnType: "string",
-    exec: function(args, context) {
-      Services.prefs.clearUserPref("devtools.loader.srcdir");
-      devtools.reload();
-      return l10n.lookup("toolsBuiltinReloaded");
-    }
-  },
-  {
-    item: "command",
-    runAt: "client",
-    name: "tools reload",
-    description: l10n.lookup("toolsReloadDesc"),
-    get hidden() {
-      return gcli.hiddenByChromePref() ||
-             !Services.prefs.prefHasUserValue("devtools.loader.srcdir");
-    },
-
-    returnType: "string",
-    exec: function(args, context) {
-      devtools.reload();
-      return l10n.lookup("toolsReloaded2");
-    }
-  }
-];
--- a/devtools/shared/shims/Loader.jsm
+++ b/devtools/shared/shims/Loader.jsm
@@ -21,17 +21,16 @@ if (Services.prefs.getBoolPref(WARNING_P
                      "Loader.jsm\") to load this module.",
                      "https://bugzil.la/912121");
 }
 
 this.EXPORTED_SYMBOLS = [
   "DevToolsLoader",
   "devtools",
   "BuiltinProvider",
-  "SrcdirProvider",
   "require",
   "loader"
 ];
 
 const module =
   Cu.import("resource://devtools/shared/Loader.jsm", {});
 
 for (let symbol of this.EXPORTED_SYMBOLS) {
--- a/devtools/shared/tests/mochitest/chrome.ini
+++ b/devtools/shared/tests/mochitest/chrome.ini
@@ -1,8 +1,7 @@
 [DEFAULT]
 tags = devtools
 skip-if = buildapp == 'b2g' || os == 'android'
 
 [test_eventemitter_basic.html]
 [test_devtools_extensions.html]
 skip-if = os == 'linux' && debug # Bug 1205739
-[test_loader_paths.html]
deleted file mode 100644
--- a/devtools/shared/tests/mochitest/test_loader_paths.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<!--
-  Any copyright is dedicated to the Public Domain.
-  http://creativecommons.org/publicdomain/zero/1.0/
--->
-
-<html>
-
-  <head>
-    <meta charset="utf8">
-    <title></title>
-
-    <script type="application/javascript"
-            src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-    <link rel="stylesheet" type="text/css"
-          href="chrome://mochikit/content/tests/SimpleTest/test.css">
-  </head>
-
-  <body>
-
-    <script type="application/javascript;version=1.8">
-      const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
-
-      const { Services } = Cu.import("resource://gre/modules/Services.jsm", {});
-
-      const SRCDIR_PREF = "devtools.loader.srcdir";
-      let srcDir = Cc["@mozilla.org/file/directory_service;1"]
-                   .getService(Components.interfaces.nsIProperties)
-                   .get("CurWorkD", Components.interfaces.nsIFile).path;
-
-      let srcDirStr = Cc["@mozilla.org/supports-string;1"]
-                      .createInstance(Ci.nsISupportsString);
-      srcDirStr.data = srcDir;
-      Services.prefs.setComplexValue(SRCDIR_PREF, Ci.nsISupportsString,
-                                     srcDirStr);
-
-      const { BuiltinProvider, SrcdirProvider } =
-        Cu.import("resource://devtools/shared/Loader.jsm", {});
-
-      let builtin = new BuiltinProvider();
-      builtin.load();
-      let srcdir = new SrcdirProvider();
-      srcdir.load();
-
-      is(builtin.loader.mapping.length,
-         srcdir.loader.mapping.length + 1,
-         "The built-in loader has one additional mappings.");
-
-      Services.prefs.clearUserPref(SRCDIR_PREF);
-    </script>
-  </body>
-</html>