Bug 1383006 - remove devtools shim for services.js;r=tromey draft
authorJulian Descottes <jdescottes@mozilla.com>
Fri, 21 Jul 2017 12:27:27 +0200
changeset 613091 98a0506be5df5be56ef03f98162effbf0b1142fb
parent 612696 7d2e89fb92331d7e4296391213c1e63db628e046
child 638612 cb8c935c5509fc69379d03efcfecab5ba14186b1
push id69727
push userjdescottes@mozilla.com
push dateFri, 21 Jul 2017 15:37:31 +0000
reviewerstromey
bugs1383006
milestone56.0a1
Bug 1383006 - remove devtools shim for services.js;r=tromey The services.js shim has been moved to devtools-core repo on GitHub and should be removed from mozilla central. MozReview-Commit-ID: 3uolLWuU6Lh
devtools/client/shared/moz.build
devtools/client/shared/shim/Services.js
devtools/client/shared/shim/moz.build
devtools/client/shared/shim/test/.eslintrc.js
devtools/client/shared/shim/test/file_service_wm.html
devtools/client/shared/shim/test/mochitest.ini
devtools/client/shared/shim/test/prefs-wrapper.js
devtools/client/shared/shim/test/test_service_appinfo.html
devtools/client/shared/shim/test/test_service_focus.html
devtools/client/shared/shim/test/test_service_prefs.html
devtools/client/shared/shim/test/test_service_prefs_defaults.html
devtools/client/shared/shim/test/test_service_wm.html
--- a/devtools/client/shared/moz.build
+++ b/devtools/client/shared/moz.build
@@ -5,17 +5,16 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 BROWSER_CHROME_MANIFESTS += ['test/browser.ini']
 XPCSHELL_TESTS_MANIFESTS += ['test/unit/xpcshell.ini']
 
 DIRS += [
     'components',
     'redux',
-    'shim',
     'source-map',
     'vendor',
     'widgets',
 ]
 
 DevToolsModules(
     'AppCacheUtils.jsm',
     'autocomplete-popup.js',
deleted file mode 100644
--- a/devtools/client/shared/shim/Services.js
+++ /dev/null
@@ -1,658 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set 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";
-
-/* globals localStorage, window, document, NodeFilter */
-
-// Some constants from nsIPrefBranch.idl.
-const PREF_INVALID = 0;
-const PREF_STRING = 32;
-const PREF_INT = 64;
-const PREF_BOOL = 128;
-const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
-
-// We prefix all our local storage items with this.
-const PREFIX = "Services.prefs:";
-
-/**
- * Create a new preference branch.  This object conforms largely to
- * nsIPrefBranch and nsIPrefService, though it only implements the
- * subset needed by devtools.  A preference branch can hold child
- * preferences while also holding a preference value itself.
- *
- * @param {PrefBranch} parent the parent branch, or null for the root
- *        branch.
- * @param {String} name the base name of this branch
- * @param {String} fullName the fully-qualified name of this branch
- */
-function PrefBranch(parent, name, fullName) {
-  this._parent = parent;
-  this._name = name;
-  this._fullName = fullName;
-  this._observers = {};
-  this._children = {};
-
-  // Properties used when this branch has a value as well.
-  this._defaultValue = null;
-  this._hasUserValue = false;
-  this._userValue = null;
-  this._type = PREF_INVALID;
-}
-
-PrefBranch.prototype = {
-  PREF_INVALID: PREF_INVALID,
-  PREF_STRING: PREF_STRING,
-  PREF_INT: PREF_INT,
-  PREF_BOOL: PREF_BOOL,
-
-  /** @see nsIPrefBranch.root.  */
-  get root() {
-    return this._fullName;
-  },
-
-  /** @see nsIPrefBranch.getPrefType.  */
-  getPrefType: function (prefName) {
-    return this._findPref(prefName)._type;
-  },
-
-  /** @see nsIPrefBranch.getBoolPref.  */
-  getBoolPref: function (prefName, defaultValue) {
-    try {
-      let thePref = this._findPref(prefName);
-      if (thePref._type !== PREF_BOOL) {
-        throw new Error(`${prefName} does not have bool type`);
-      }
-      return thePref._get();
-    } catch (e) {
-      if (typeof defaultValue !== "undefined") {
-        return defaultValue;
-      }
-      throw e;
-    }
-  },
-
-  /** @see nsIPrefBranch.setBoolPref.  */
-  setBoolPref: function (prefName, value) {
-    if (typeof value !== "boolean") {
-      throw new Error("non-bool passed to setBoolPref");
-    }
-    let thePref = this._findOrCreatePref(prefName, value, true, value);
-    if (thePref._type !== PREF_BOOL) {
-      throw new Error(`${prefName} does not have bool type`);
-    }
-    thePref._set(value);
-  },
-
-  /** @see nsIPrefBranch.getCharPref.  */
-  getCharPref: function (prefName, defaultValue) {
-    try {
-      let thePref = this._findPref(prefName);
-      if (thePref._type !== PREF_STRING) {
-        throw new Error(`${prefName} does not have string type`);
-      }
-      return thePref._get();
-    } catch (e) {
-      if (typeof defaultValue !== "undefined") {
-        return defaultValue;
-      }
-      throw e;
-    }
-  },
-
-  /** @see nsIPrefBranch.setCharPref.  */
-  setCharPref: function (prefName, value) {
-    if (typeof value !== "string") {
-      throw new Error("non-string passed to setCharPref");
-    }
-    let thePref = this._findOrCreatePref(prefName, value, true, value);
-    if (thePref._type !== PREF_STRING) {
-      throw new Error(`${prefName} does not have string type`);
-    }
-    thePref._set(value);
-  },
-
-  /** @see nsIPrefBranch.getIntPref.  */
-  getIntPref: function (prefName, defaultValue) {
-    try {
-      let thePref = this._findPref(prefName);
-      if (thePref._type !== PREF_INT) {
-        throw new Error(`${prefName} does not have int type`);
-      }
-      return thePref._get();
-    } catch (e) {
-      if (typeof defaultValue !== "undefined") {
-        return defaultValue;
-      }
-      throw e;
-    }
-  },
-
-  /** @see nsIPrefBranch.setIntPref.  */
-  setIntPref: function (prefName, value) {
-    if (typeof value !== "number") {
-      throw new Error("non-number passed to setIntPref");
-    }
-    let thePref = this._findOrCreatePref(prefName, value, true, value);
-    if (thePref._type !== PREF_INT) {
-      throw new Error(`${prefName} does not have int type`);
-    }
-    thePref._set(value);
-  },
-
-  /** @see nsIPrefBranch.clearUserPref */
-  clearUserPref: function (prefName) {
-    let thePref = this._findPref(prefName);
-    thePref._clearUserValue();
-  },
-
-  /** @see nsIPrefBranch.prefHasUserValue */
-  prefHasUserValue: function (prefName) {
-    let thePref = this._findPref(prefName);
-    return thePref._hasUserValue;
-  },
-
-  /** @see nsIPrefBranch.addObserver */
-  addObserver: function (domain, observer, holdWeak) {
-    if (holdWeak) {
-      throw new Error("shim prefs only supports strong observers");
-    }
-
-    if (!(domain in this._observers)) {
-      this._observers[domain] = [];
-    }
-    this._observers[domain].push(observer);
-  },
-
-  /** @see nsIPrefBranch.removeObserver */
-  removeObserver: function (domain, observer) {
-    if (!(domain in this._observers)) {
-      return;
-    }
-    let index = this._observers[domain].indexOf(observer);
-    if (index >= 0) {
-      this._observers[domain].splice(index, 1);
-    }
-  },
-
-  /** @see nsIPrefService.savePrefFile */
-  savePrefFile: function (file) {
-    if (file) {
-      throw new Error("shim prefs only supports null file in savePrefFile");
-    }
-    // Nothing to do - this implementation always writes back.
-  },
-
-  /** @see nsIPrefService.getBranch */
-  getBranch: function (prefRoot) {
-    if (!prefRoot) {
-      return this;
-    }
-    if (prefRoot.endsWith(".")) {
-      prefRoot = prefRoot.slice(0, -1);
-    }
-    // This is a bit weird since it could erroneously return a pref,
-    // not a pref branch.
-    return this._findPref(prefRoot);
-  },
-
-  /**
-   * Return this preference's current value.
-   *
-   * @return {Any} The current value of this preference.  This may
-   *         return a string, a number, or a boolean depending on the
-   *         preference's type.
-   */
-  _get: function () {
-    if (this._hasUserValue) {
-      return this._userValue;
-    }
-    return this._defaultValue;
-  },
-
-  /**
-   * Set the preference's value.  The new value is assumed to be a
-   * user value.  After setting the value, this function emits a
-   * change notification.
-   *
-   * @param {Any} value the new value
-   */
-  _set: function (value) {
-    if (!this._hasUserValue || value !== this._userValue) {
-      this._userValue = value;
-      this._hasUserValue = true;
-      this._saveAndNotify();
-    }
-  },
-
-  /**
-   * Set the default value for this preference, and emit a
-   * notification if this results in a visible change.
-   *
-   * @param {Any} value the new default value
-   */
-  _setDefault: function (value) {
-    if (this._defaultValue !== value) {
-      this._defaultValue = value;
-      if (!this._hasUserValue) {
-        this._saveAndNotify();
-      }
-    }
-  },
-
-  /**
-   * If this preference has a user value, clear it.  If a change was
-   * made, emit a change notification.
-   */
-  _clearUserValue: function () {
-    if (this._hasUserValue) {
-      this._userValue = null;
-      this._hasUserValue = false;
-      this._saveAndNotify();
-    }
-  },
-
-  /**
-   * Helper function to write the preference's value to local storage
-   * and then emit a change notification.
-   */
-  _saveAndNotify: function () {
-    let store = {
-      type: this._type,
-      defaultValue: this._defaultValue,
-      hasUserValue: this._hasUserValue,
-      userValue: this._userValue,
-    };
-
-    localStorage.setItem(PREFIX + this._fullName, JSON.stringify(store));
-    this._parent._notify(this._name);
-  },
-
-  /**
-   * Change this preference's value without writing it back to local
-   * storage.  This is used to handle changes to local storage that
-   * were made externally.
-   *
-   * @param {Number} type one of the PREF_* values
-   * @param {Any} userValue the user value to use if the pref does not exist
-   * @param {Any} defaultValue the default value to use if the pref
-   *        does not exist
-   * @param {Boolean} hasUserValue if a new pref is created, whether
-   *        the default value is also a user value
-   * @param {Object} store the new value of the preference.  It should
-   *        be of the form {type, defaultValue, hasUserValue, userValue};
-   *        where |type| is one of the PREF_* type constants; |defaultValue|
-   *        and |userValue| are the default and user values, respectively;
-   *        and |hasUserValue| is a boolean indicating whether the user value
-   *        is valid
-   */
-  _storageUpdated: function (type, userValue, hasUserValue, defaultValue) {
-    this._type = type;
-    this._defaultValue = defaultValue;
-    this._hasUserValue = hasUserValue;
-    this._userValue = userValue;
-    // There's no need to write this back to local storage, since it
-    // came from there; and this avoids infinite event loops.
-    this._parent._notify(this._name);
-  },
-
-  /**
-   * Helper function to find either a Preference or PrefBranch object
-   * given its name.  If the name is not found, throws an exception.
-   *
-   * @param {String} prefName the fully-qualified preference name
-   * @return {Object} Either a Preference or PrefBranch object
-   */
-  _findPref: function (prefName) {
-    let branchNames = prefName.split(".");
-    let branch = this;
-
-    for (let branchName of branchNames) {
-      branch = branch._children[branchName];
-      if (!branch) {
-        throw new Error("could not find pref branch " + prefName);
-      }
-    }
-
-    return branch;
-  },
-
-  /**
-   * Helper function to notify any observers when a preference has
-   * changed.  This will also notify the parent branch for further
-   * reporting.
-   *
-   * @param {String} relativeName the name of the updated pref,
-   *        relative to this branch
-   */
-  _notify: function (relativeName) {
-    for (let domain in this._observers) {
-      if (relativeName === domain || domain === "" ||
-          (domain.endsWith(".") && relativeName.startsWith(domain))) {
-        // Allow mutation while walking.
-        let localList = this._observers[domain].slice();
-        for (let observer of localList) {
-          try {
-            if ("observe" in observer) {
-              observer.observe(this, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID,
-                               relativeName);
-            } else {
-              // Function-style observer -- these aren't mentioned in
-              // the IDL, but they're accepted and devtools uses them.
-              observer(this, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, relativeName);
-            }
-          } catch (e) {
-            console.error(e);
-          }
-        }
-      }
-    }
-
-    if (this._parent) {
-      this._parent._notify(this._name + "." + relativeName);
-    }
-  },
-
-  /**
-   * Helper function to create a branch given an array of branch names
-   * representing the path of the new branch.
-   *
-   * @param {Array} branchList an array of strings, one per component
-   *        of the branch to be created
-   * @return {PrefBranch} the new branch
-   */
-  _createBranch: function (branchList) {
-    let parent = this;
-    for (let branch of branchList) {
-      if (!parent._children[branch]) {
-        let isParentRoot = !parent._parent;
-
-        let branchName = (isParentRoot ? "" : parent.root + ".") + branch;
-        parent._children[branch] = new PrefBranch(parent, branch, branchName);
-      }
-      parent = parent._children[branch];
-    }
-    return parent;
-  },
-
-  /**
-   * Create a new preference.  The new preference is assumed to be in
-   * local storage already, and the new value is taken from there.
-   *
-   * @param {String} keyName the full-qualified name of the preference.
-   *        This is also the name of the key in local storage.
-   * @param {Any} userValue the user value to use if the pref does not exist
-   * @param {Boolean} hasUserValue if a new pref is created, whether
-   *        the default value is also a user value
-   * @param {Any} defaultValue the default value to use if the pref
-   *        does not exist
-   * @param {Boolean} init if true, then this call is initialization
-   *        from local storage and should override the default prefs
-   */
-  _findOrCreatePref: function (keyName, userValue, hasUserValue, defaultValue,
-                               init = false) {
-    let branch = this._createBranch(keyName.split("."));
-
-    if (hasUserValue && typeof (userValue) !== typeof (defaultValue)) {
-      throw new Error("inconsistent values when creating " + keyName);
-    }
-
-    let type;
-    switch (typeof (defaultValue)) {
-      case "boolean":
-        type = PREF_BOOL;
-        break;
-      case "number":
-        type = PREF_INT;
-        break;
-      case "string":
-        type = PREF_STRING;
-        break;
-      default:
-        throw new Error("unhandled argument type: " + typeof (defaultValue));
-    }
-
-    if (init || branch._type === PREF_INVALID) {
-      branch._storageUpdated(type, userValue, hasUserValue, defaultValue);
-    } else if (branch._type !== type) {
-      throw new Error("attempt to change type of pref " + keyName);
-    }
-
-    return branch;
-  },
-
-  /**
-   * Helper function that is called when local storage changes.  This
-   * updates the preferences and notifies pref observers as needed.
-   *
-   * @param {StorageEvent} event the event representing the local
-   *        storage change
-   */
-  _onStorageChange: function (event) {
-    if (event.storageArea !== localStorage) {
-      return;
-    }
-    // Ignore delete events.  Not clear what's correct.
-    if (event.key === null || event.newValue === null) {
-      return;
-    }
-
-    let {type, userValue, hasUserValue, defaultValue} =
-        JSON.parse(event.newValue);
-    if (event.oldValue === null) {
-      this._findOrCreatePref(event.key, userValue, hasUserValue, defaultValue);
-    } else {
-      let thePref = this._findPref(event.key);
-      thePref._storageUpdated(type, userValue, hasUserValue, defaultValue);
-    }
-  },
-
-  /**
-   * Helper function to initialize the root PrefBranch.
-   */
-  _initializeRoot: function () {
-    if (Services._defaultPrefsEnabled) {
-      /* eslint-disable no-eval */
-      let devtools = require("raw!prefs!devtools/client/preferences/devtools");
-      eval(devtools);
-      const dbg = require("raw!prefs!devtools/client/preferences/debugger");
-      eval(dbg);
-      let all = require("raw!prefs!modules/libpref/init/all");
-      eval(all);
-      /* eslint-enable no-eval */
-    }
-
-    // Read the prefs from local storage and create the local
-    // representations.
-    for (let i = 0; i < localStorage.length; ++i) {
-      let keyName = localStorage.key(i);
-      if (keyName.startsWith(PREFIX)) {
-        let {userValue, hasUserValue, defaultValue} =
-            JSON.parse(localStorage.getItem(keyName));
-        this._findOrCreatePref(keyName.slice(PREFIX.length), userValue,
-                               hasUserValue, defaultValue, true);
-      }
-    }
-
-    this._onStorageChange = this._onStorageChange.bind(this);
-    window.addEventListener("storage", this._onStorageChange);
-  },
-};
-
-const Services = {
-  _prefs: null,
-
-  // For use by tests.  If set to false before Services.prefs is used,
-  // this will disable the reading of the default prefs.
-  _defaultPrefsEnabled: true,
-
-  /**
-   * An implementation of nsIPrefService that is based on local
-   * storage.  Only the subset of nsIPrefService that is actually used
-   * by devtools is implemented here.  This is lazily instantiated so
-   * that the tests have a chance to disable the loading of default
-   * prefs.
-   */
-  get prefs() {
-    if (!this._prefs) {
-      this._prefs = new PrefBranch(null, "", "");
-      this._prefs._initializeRoot();
-    }
-    return this._prefs;
-  },
-
-  /**
-   * An implementation of Services.appinfo that holds just the
-   * properties needed by devtools.
-   */
-  appinfo: {
-    get OS() {
-      const os = window.navigator.userAgent;
-      if (os) {
-        if (os.includes("Linux")) {
-          return "Linux";
-        } else if (os.includes("Windows")) {
-          return "WINNT";
-        } else if (os.includes("Mac")) {
-          return "Darwin";
-        }
-      }
-      return "Unknown";
-    },
-
-    // It's fine for this to be an approximation.
-    get name() {
-      return window.navigator.userAgent;
-    },
-
-    // It's fine for this to be an approximation.
-    get version() {
-      return window.navigator.appVersion;
-    },
-
-    // This is only used by telemetry, which is disabled for the
-    // content case.  So, being totally wrong is ok.
-    get is64Bit() {
-      return true;
-    },
-  },
-
-  /**
-   * A no-op implementation of Services.telemetry.  This supports just
-   * the subset of Services.telemetry that is used by devtools.
-   */
-  telemetry: {
-    getHistogramById: function (name) {
-      return {
-        add: () => {}
-      };
-    },
-
-    getKeyedHistogramById: function (name) {
-      return {
-        add: () => {}
-      };
-    },
-  },
-
-  /**
-   * An implementation of Services.focus that holds just the
-   * properties and methods needed by devtools.
-   * @see nsIFocusManager.idl for details.
-   */
-  focus: {
-    // These values match nsIFocusManager in order to make testing a
-    // bit simpler.
-    MOVEFOCUS_FORWARD: 1,
-    MOVEFOCUS_BACKWARD: 2,
-
-    get focusedElement() {
-      if (!document.hasFocus()) {
-        return null;
-      }
-      return document.activeElement;
-    },
-
-    moveFocus: function (window, startElement, type, flags) {
-      if (flags !== 0) {
-        throw new Error("shim Services.focus.moveFocus only accepts flags===0");
-      }
-      if (type !== Services.focus.MOVEFOCUS_FORWARD
-          && type !== Services.focus.MOVEFOCUS_BACKWARD) {
-        throw new Error("shim Services.focus.moveFocus only supports " +
-                        " MOVEFOCUS_FORWARD and MOVEFOCUS_BACKWARD");
-      }
-
-      if (!startElement) {
-        startElement = document.activeElement || document;
-      }
-
-      let iter = document.createTreeWalker(document, NodeFilter.SHOW_ELEMENT, {
-        acceptNode: function (node) {
-          let tabIndex = node.getAttribute("tabindex");
-          if (tabIndex === "-1") {
-            return NodeFilter.FILTER_SKIP;
-          }
-          node.focus();
-          if (document.activeElement == node) {
-            return NodeFilter.FILTER_ACCEPT;
-          }
-          return NodeFilter.FILTER_SKIP;
-        }
-      });
-
-      iter.currentNode = startElement;
-
-      // Sets the focus via side effect in the filter.
-      if (type === Services.focus.MOVEFOCUS_FORWARD) {
-        iter.nextNode();
-      } else {
-        iter.previousNode();
-      }
-    },
-  },
-
-  /**
-   * An implementation of Services.wm that provides a shim for
-   * getMostRecentWindow.
-   */
-  wm: {
-    getMostRecentWindow: function () {
-      // Having the returned object implement openUILinkIn is
-      // sufficient for our purposes.
-      return {
-        openUILinkIn: function (url) {
-          window.open(url, "_blank");
-        },
-      };
-    },
-  },
-
-  /**
-   * Shims for Services.obs.add/removeObserver.
-   */
-  obs: {
-    addObserver: () => {},
-    removeObserver: () => {},
-  },
-};
-
-/**
- * Create a new preference.  This is used during startup (see
- * devtools/client/preferences/devtools.js) to install the
- * default preferences.
- *
- * @param {String} name the name of the preference
- * @param {Any} value the default value of the preference
- */
-function pref(name, value) {
-  let thePref = Services.prefs._findOrCreatePref(name, value, true, value);
-  thePref._setDefault(value);
-}
-
-module.exports = Services;
-// This is exported to silence eslint.
-exports.pref = pref;
deleted file mode 100644
--- a/devtools/client/shared/shim/moz.build
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# 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(
-    'Services.js',
-)
-
-MOCHITEST_MANIFESTS += [
-    'test/mochitest.ini',
-]
deleted file mode 100644
--- a/devtools/client/shared/shim/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
--- a/devtools/client/shared/shim/test/file_service_wm.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-<script>
-// Silence eslint complaint about the onload below.
-/* eslint-disable no-unused-vars */
-
-"use strict";
-
-function load() {
-  (window.opener || window.parent).hurray();
-  window.close();
-}
-</script>
-</head>
-
-<body onload='load()'>
-</body>
-
-</html>
deleted file mode 100644
--- a/devtools/client/shared/shim/test/mochitest.ini
+++ /dev/null
@@ -1,10 +0,0 @@
-[DEFAULT]
-support-files =
-  file_service_wm.html
-  prefs-wrapper.js
-
-[test_service_appinfo.html]
-[test_service_focus.html]
-[test_service_prefs.html]
-[test_service_prefs_defaults.html]
-[test_service_wm.html]
deleted file mode 100644
--- a/devtools/client/shared/shim/test/prefs-wrapper.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set 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/. */
-
-// A wrapper for Services.prefs that compares our shim content
-// implementation with the real service.
-
-// We assume we're loaded in a global where Services was already loaded.
-/* globals isDeeply, Services */
-
-"use strict";
-
-function setMethod(methodName, prefName, value) {
-  let savedException;
-  let prefThrew = false;
-  try {
-    Services.prefs[methodName](prefName, value);
-  } catch (e) {
-    prefThrew = true;
-    savedException = e;
-  }
-
-  let realThrew = false;
-  try {
-    SpecialPowers[methodName](prefName, value);
-  } catch (e) {
-    realThrew = true;
-    savedException = e;
-  }
-
-  is(prefThrew, realThrew, methodName + " [throw check]");
-  if (prefThrew || realThrew) {
-    throw savedException;
-  }
-}
-
-function getMethod(methodName, prefName) {
-  let prefThrew = false;
-  let prefValue = undefined;
-  let savedException;
-  try {
-    prefValue = Services.prefs[methodName](prefName);
-  } catch (e) {
-    prefThrew = true;
-    savedException = e;
-  }
-
-  let realValue = undefined;
-  let realThrew = false;
-  try {
-    realValue = SpecialPowers[methodName](prefName);
-  } catch (e) {
-    realThrew = true;
-    savedException = e;
-  }
-
-  is(prefThrew, realThrew, methodName + " [throw check]");
-  isDeeply(prefValue, realValue, methodName + " [equality]");
-  if (prefThrew || realThrew) {
-    throw savedException;
-  }
-
-  return prefValue;
-}
-
-var WrappedPrefs = {};
-
-for (let method of ["getPrefType", "getBoolPref", "getCharPref", "getIntPref",
-                    "clearUserPref"]) {
-  WrappedPrefs[method] = getMethod.bind(null, method);
-}
-
-for (let method of ["setBoolPref", "setCharPref", "setIntPref"]) {
-  WrappedPrefs[method] = setMethod.bind(null, method);
-}
-
-// Silence eslint.
-exports.WrappedPrefs = WrappedPrefs;
deleted file mode 100644
--- a/devtools/client/shared/shim/test/test_service_appinfo.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1265802
--->
-<head>
-  <title>Test for Bug 1265802 - replace Services.appinfo</title>
-  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css"
-        href="chrome://mochikit/content/tests/SimpleTest/test.css">
-
-  <script type="application/javascript">
-  "use strict";
-  var exports = {}
-  var module = {exports};
-  </script>
-
-  <script type="application/javascript"
-	  src="resource://devtools/client/shared/shim/Services.js"></script>
-</head>
-<body>
-<script type="application/javascript">
-"use strict";
-
-is(Services.appinfo.OS, SpecialPowers.Services.appinfo.OS,
-   "check that Services.appinfo.OS shim matches platform");
-</script>
-</body>
deleted file mode 100644
--- a/devtools/client/shared/shim/test/test_service_focus.html
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1278473
--->
-<head>
-  <title>Test for Bug 1278473 - replace Services.focus</title>
-  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css"
-        href="chrome://mochikit/content/tests/SimpleTest/test.css">
-
-  <script type="application/javascript">
-  "use strict";
-  var exports = {}
-  var module = {exports};
-  </script>
-
-  <script type="application/javascript"
-	  src="resource://devtools/client/shared/shim/Services.js"></script>
-</head>
-<body>
-  <span>
-    <span id="start" testvalue="0" tabindex="0"> </span>
-    <label>
-      <input testvalue="1" type="radio">Hi</input>
-    </label>
-    <label>
-      <input type="radio" tabindex="-1">Bye</input>
-    </label>
-    <label style="display: none">
-      <input id="button3" type="radio" tabindex="-1">Invisible</input>
-    </label>
-    <input id="button4" type="radio" disabled="true">Disabled</input>
-    <span testvalue="2" tabindex="0"> </span>
-  </span>
-
-<script type="application/javascript">
-  "use strict";
-
-  // The test assumes these are identical, so assert it here.
-  is(Services.focus.MOVEFOCUS_BACKWARD, SpecialPowers.Services.focus.MOVEFOCUS_BACKWARD,
-     "check MOVEFOCUS_BACKWARD");
-  is(Services.focus.MOVEFOCUS_FORWARD, SpecialPowers.Services.focus.MOVEFOCUS_FORWARD,
-     "check MOVEFOCUS_FORWARD");
-
-  function moveFocus(element, type, expect) {
-    let current = document.activeElement;
-    const suffix = "(type=" + type + ", to=" + expect + ")";
-
-    // First try with the platform implementation.
-    SpecialPowers.Services.focus.moveFocus(window, element, type, 0);
-    is(document.activeElement.getAttribute("testvalue"), expect,
-       "platform moveFocus " + suffix);
-
-    // Reset the focus and try again with the shim.
-    current.focus();
-    is(document.activeElement, current, "reset " + suffix);
-
-    Services.focus.moveFocus(window, element, type, 0);
-    is(document.activeElement.getAttribute("testvalue"), expect,
-       "shim moveFocus " + suffix);
-  }
-
-  let start = document.querySelector("#start");
-  start.focus();
-  is(document.activeElement.getAttribute("testvalue"), "0", "initial focus");
-
-  moveFocus(null, Services.focus.MOVEFOCUS_FORWARD, "1");
-  moveFocus(null, Services.focus.MOVEFOCUS_FORWARD, "2");
-  let end = document.activeElement;
-  moveFocus(null, Services.focus.MOVEFOCUS_BACKWARD, "1");
-  moveFocus(null, Services.focus.MOVEFOCUS_BACKWARD, "0");
-
-  moveFocus(start, Services.focus.MOVEFOCUS_FORWARD, "1");
-  moveFocus(end, Services.focus.MOVEFOCUS_BACKWARD, "1");
-</script>
-</body>
deleted file mode 100644
--- a/devtools/client/shared/shim/test/test_service_prefs.html
+++ /dev/null
@@ -1,265 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1265808
--->
-<head>
-  <title>Test for Bug 1265808 - replace Services.prefs</title>
-  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css"
-        href="chrome://mochikit/content/tests/SimpleTest/test.css">
-
-<script type="application/javascript">
-"use strict";
-var exports = {}
-var module = {exports};
-
- // Add some starter prefs.
-localStorage.setItem("Services.prefs:devtools.branch1.somebool", JSON.stringify({
-  // bool
-  type: 128,
-  defaultValue: false,
-  hasUserValue: false,
-  userValue: false
-}));
-
-localStorage.setItem("Services.prefs:devtools.branch1.somestring", JSON.stringify({
-  // string
-  type: 32,
-  defaultValue: "dinosaurs",
-  hasUserValue: true,
-  userValue: "elephants"
-}));
-
-localStorage.setItem("Services.prefs:devtools.branch2.someint", JSON.stringify({
-  // string
-  type: 64,
-  defaultValue: -16,
-  hasUserValue: false,
-  userValue: null
-}));
-
-</script>
-
-  <script type="application/javascript"
-	  src="prefs-wrapper.js"></script>
-  <script type="application/javascript"
-	  src="resource://devtools/client/shared/shim/Services.js"></script>
-</head>
-<body>
-<script type="application/javascript">
-"use strict";
-
-function do_tests() {
-  // We can't load the defaults in this context.
-  Services._defaultPrefsEnabled = false;
-
-  is(Services.prefs.getBoolPref("devtools.branch1.somebool"), false,
-    "bool pref value");
-  Services.prefs.setBoolPref("devtools.branch1.somebool", true);
-  is(Services.prefs.getBoolPref("devtools.branch1.somebool"), true,
-    "bool pref value after setting");
-
-  let threw;
-
-  try {
-    threw = false;
-    WrappedPrefs.getIntPref("devtools.branch1.somebool");
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for bool pref");
-
-  try {
-    threw = false;
-    Services.prefs.setIntPref("devtools.branch1.somebool", 27);
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for setting bool pref");
-
-  try {
-    threw = false;
-    Services.prefs.setBoolPref("devtools.branch1.somebool", 27);
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "setting bool pref to wrong type");
-
-  try {
-    threw = false;
-    Services.prefs.getCharPref("devtools.branch2.someint");
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for int pref");
-
-  try {
-    threw = false;
-    Services.prefs.setCharPref("devtools.branch2.someint", "whatever");
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for setting int pref");
-
-  try {
-    threw = false;
-    Services.prefs.setIntPref("devtools.branch2.someint", "whatever");
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "setting int pref to wrong type");
-
-  try {
-    threw = false;
-    Services.prefs.getBoolPref("devtools.branch1.somestring");
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for char pref");
-
-  try {
-    threw = false;
-    Services.prefs.setBoolPref("devtools.branch1.somestring", true);
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "type-checking for setting char pref");
-
-  try {
-    threw = false;
-    Services.prefs.setCharPref("devtools.branch1.somestring", true);
-  } catch (e) {
-    threw = true;
-  }
-  ok(threw, "setting char pref to wrong type");
-
-  is(Services.prefs.getPrefType("devtools.branch1.somebool"),
-    Services.prefs.PREF_BOOL, "type of bool pref");
-  is(Services.prefs.getPrefType("devtools.branch2.someint"),
-    Services.prefs.PREF_INT, "type of int pref");
-  is(Services.prefs.getPrefType("devtools.branch1.somestring"),
-    Services.prefs.PREF_STRING, "type of string pref");
-
-  WrappedPrefs.setBoolPref("devtools.branch1.somebool", true);
-  ok(WrappedPrefs.getBoolPref("devtools.branch1.somebool"), "set bool pref");
-  WrappedPrefs.setIntPref("devtools.branch2.someint", -93);
-  is(WrappedPrefs.getIntPref("devtools.branch2.someint"), -93, "set int pref");
-  WrappedPrefs.setCharPref("devtools.branch1.somestring", "hello");
-  is(WrappedPrefs.getCharPref("devtools.branch1.somestring"), "hello",
-    "set string pref");
-
-  Services.prefs.clearUserPref("devtools.branch1.somestring");
-  is(Services.prefs.getCharPref("devtools.branch1.somestring"), "dinosaurs",
-    "clear string pref");
-
-  ok(Services.prefs.prefHasUserValue("devtools.branch1.somebool"),
-    "bool pref has user value");
-  ok(!Services.prefs.prefHasUserValue("devtools.branch1.somestring"),
-    "string pref does not have user value");
-
-
-  Services.prefs.savePrefFile(null);
-  ok(true, "saved pref file without error");
-
-
-  let branch0 = Services.prefs.getBranch(null);
-  let branch1 = Services.prefs.getBranch("devtools.branch1.");
-
-  branch1.setCharPref("somestring", "octopus");
-  Services.prefs.setCharPref("devtools.branch1.somestring", "octopus");
-  is(Services.prefs.getCharPref("devtools.branch1.somestring"), "octopus",
-    "set correctly via branch");
-  is(branch0.getCharPref("devtools.branch1.somestring"), "octopus",
-    "get via base branch");
-  is(branch1.getCharPref("somestring"), "octopus", "get via branch");
-
-
-  let notifications = {};
-  let clearNotificationList = () => { notifications = {}; }
-  let observer = {
-    observe: function (subject, topic, data) {
-      notifications[data] = true;
-    }
-  };
-
-  branch0.addObserver("devtools.branch1", null, null);
-  branch0.addObserver("devtools.branch1.", observer);
-  branch1.addObserver("", observer);
-
-  Services.prefs.setCharPref("devtools.branch1.somestring", "elf owl");
-  isDeeply(notifications, {
-    "devtools.branch1.somestring": true,
-    "somestring": true
-  }, "notifications sent to two listeners");
-
-  clearNotificationList();
-  Services.prefs.setIntPref("devtools.branch2.someint", 1729);
-  isDeeply(notifications, {}, "no notifications sent");
-
-  clearNotificationList();
-  branch0.removeObserver("devtools.branch1.", observer);
-  Services.prefs.setCharPref("devtools.branch1.somestring", "tapir");
-  isDeeply(notifications, {
-    "somestring": true
-  }, "removeObserver worked");
-
-  clearNotificationList();
-  branch0.addObserver("devtools.branch1.somestring", observer);
-  Services.prefs.setCharPref("devtools.branch1.somestring", "northern shoveler");
-  isDeeply(notifications, {
-    "devtools.branch1.somestring": true,
-    "somestring": true
-  }, "notifications sent to two listeners");
-  branch0.removeObserver("devtools.branch1.somestring", observer);
-
-  // Make sure we update if the pref change comes from somewhere else.
-  clearNotificationList();
-  pref("devtools.branch1.someotherstring", "lazuli bunting");
-  isDeeply(notifications, {
-    "someotherstring": true
-  }, "pref worked");
-
-  // Regression test for bug 1296427.
-  pref("devtools.hud.loglimit", 1000);
-  pref("devtools.hud.loglimit.network", 1000);
-
-  // Regression test for bug 1319150.
-  let seen = false;
-  let fnObserver = () => { seen = true; };
-  branch0.addObserver("devtools.branch1.somestring", fnObserver);
-  Services.prefs.setCharPref("devtools.branch1.somestring", "common merganser");
-  ok(seen, "function-style observer was called");
-  branch0.removeObserver("devtools.branch1.somestring", fnObserver);
-
-  // Check support for default values
-  let intPrefWithDefault =
-      Services.prefs.getIntPref("devtools.branch1.missing", 1);
-  is(intPrefWithDefault, 1, "default value returned for missing int pref");
-
-  let charPrefWithDefault =
-      Services.prefs.getCharPref("devtools.branch1.missing", "test");
-  is(charPrefWithDefault, "test", "default value returned for missing char pref");
-
-  let boolPrefWithDefault =
-      Services.prefs.getBoolPref("devtools.branch1.missing", true);
-  ok(boolPrefWithDefault, "default value returned for missing bool pref");
-
-  // Clean up.
-  localStorage.clear();
-
-  SimpleTest.finish();
-}
-
-SimpleTest.waitForExplicitFinish();
-SpecialPowers.pushPrefEnv(
-  {"set": [
-    ["devtools.branch1.somestring", "elephants"],
-    ["devtools.branch1.somebool", false],
-    ["devtools.branch2.someint", "-16"],
-  ]},
-  do_tests);
-
-</script>
-</body>
deleted file mode 100644
--- a/devtools/client/shared/shim/test/test_service_prefs_defaults.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1309384
--->
-<head>
-  <title>Test for Bug 1309384 - Services.prefs replacement defaults handling</title>
-  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css"
-        href="chrome://mochikit/content/tests/SimpleTest/test.css">
-
-<script type="application/javascript">
-"use strict";
-var exports = {}
-var module = {exports};
-
-// Allow one require("raw!prefs...") to return some defaults, with the
-// others being ignored.
-var firstTime = true;
-function require(something) {
-  if (!something.startsWith("raw!prefs!")) {
-    throw new Error("whoops");
-  }
-  if (!firstTime) {
-    return "";
-  }
-  firstTime = false;
-  return "pref('pref1', 'pref1default');\n" +
-    "pref('pref2', 'pref2default');\n" +
-    "pref('pref2.sub1', 'pref2sub1default');\n" +
-    "pref('pref3', 'pref3default');\n";
-}
-
-// Pretend that one of the prefs was modifed by the user in an earlier session.
-localStorage.setItem("Services.prefs:pref3", JSON.stringify({
-  // string
-  type: 32,
-  defaultValue: "pref3default",
-  hasUserValue: true,
-  userValue: "glass winged butterfly"
-}));
-
-</script>
-
-  <script type="application/javascript"
-	  src="resource://devtools/client/shared/shim/Services.js"></script>
-</head>
-<body>
-<script type="application/javascript">
-"use strict";
-
-is(Services.prefs.getCharPref("pref1"), "pref1default", "pref1 value");
-is(Services.prefs.getCharPref("pref2"), "pref2default", "pref2 value");
-is(Services.prefs.getCharPref("pref2.sub1"), "pref2sub1default", "pref2 sub1 value");
-is(Services.prefs.getCharPref("pref3"), "glass winged butterfly", "pref3 value");
-
-// Only pref3 should be in local storage at this point.
-is(localStorage.length, 1, "local storage is correct");
-
-// Check that a default pref can be overridden properly.
-Services.prefs.setCharPref("pref2", "pref2override");
-is(localStorage.length, 2, "local storage was updated");
-
-// Check that a child preference can be overridden.
-Services.prefs.setCharPref("pref2.sub1", "pref2sub1override");
-is(localStorage.length, 3, "local storage was updated");
-
-// Workaround to reset the prefs helper and force it to read defaults & overrides again.
-Services._prefs = null;
-is(Services.prefs.getCharPref("pref2"), "pref2override", "pref2 value overridden");
-is(Services.prefs.getCharPref("pref2.sub1"), "pref2sub1override",
-  "pref2 value overridden");
-
-// Clean up.
-localStorage.clear();
-
-</script>
-</body>
deleted file mode 100644
--- a/devtools/client/shared/shim/test/test_service_wm.html
+++ /dev/null
@@ -1,36 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=1310279
--->
-<head>
-  <title>Test for Bug 1310279 - replace Services.wm</title>
-  <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css"
-        href="chrome://mochikit/content/tests/SimpleTest/test.css">
-
-  <script type="application/javascript">
-  "use strict";
-  var exports = {}
-  var module = {exports};
-  </script>
-
-  <script type="application/javascript"
-	  src="resource://devtools/client/shared/shim/Services.js"></script>
-</head>
-<body>
-
-<script type="application/javascript">
-  "use strict";
-
-  function hurray(window) {
-    ok(true, "window loaded");
-    SimpleTest.finish();
-  }
-
-  SimpleTest.waitForExplicitFinish();
-  Services.wm.getMostRecentWindow().openUILinkIn("file_service_wm.html");
-
-</script>
-</body>