Bug 1383006 - remove devtools shim for services.js;r=tromey
authorJulian Descottes <jdescottes@mozilla.com>
Fri, 21 Jul 2017 12:27:27 +0200
changeset 421733 4a36a9d7e962b66b3b6c2d1b3fc589c47f80840f
parent 421732 066eae36888cef0bd09ec6ea20e352652257ca39
child 421734 14eb6424b03d36ccb2d4c2bd99893706e7a81d9b
push id1517
push userjlorenzo@mozilla.com
push dateThu, 14 Sep 2017 16:50:54 +0000
treeherdermozilla-release@3b41fd564418 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerstromey
bugs1383006
milestone56.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 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>