# HG changeset patch
# User Matt A. Tobin <email@mattatobin.com>
# Date 1735689600 0
Bug XXXXXXX - Build DOM Inspector as an integrated SeaMonkey component.

diff --git a/suite/components/inspector/DOMiInspectElement.jsm b/suite/components/inspector/DOMiInspectElement.jsm
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/DOMiInspectElement.jsm
@@ -0,0 +1,106 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+var EXPORTED_SYMBOLS = ["DOMiInspectElement"];
+
+ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+var DOMiInspectElement = {
+  handleEvent: function(e) {
+    // Shift + right click.
+    if (!e.shiftKey || e.button != 2) {
+      return;
+    }
+
+    try {
+      e.stopPropagation();
+      e.preventDefault();
+    } catch (ex) {}
+
+    if (e.type != "click") {
+      return;
+    }
+
+    let elem = e.originalTarget;
+    let shadowElem = e.target;
+    let win = e.currentTarget;
+    this.inspect(win, elem, shadowElem);
+  },
+  inspect: function(win, elem, shadowElem) {
+    win.openDialog("chrome://inspector/content/", "_blank",
+                   "chrome, all, dialog=no", elem);
+    this.closePopup(elem, win);
+  },
+  closePopup: function (elem, win) {
+    var parent = elem.parentNode;
+    var list = [];
+
+    while (parent != win && parent != null) {
+      if (parent.localName == "menupopup" || parent.localName == "popup") {
+        list.push(parent);
+      }
+      parent = parent.parentNode;
+    }
+
+    var len = list.length;
+
+    if (!len) {
+      return;
+    }
+
+    list[len - 1].hidePopup();
+  },
+  aListener: {
+    onOpenWindow: function (aWindow) {
+      var win = aWindow.docShell.QueryInterface(Ci.nsIInterfaceRequestor)
+                                .getInterface(Ci.nsIDOMWindow);
+
+      win.addEventListener("load", function _inspect() {
+        this.removeEventListener("load", _inspect, false);
+        win.addEventListener("click", DOMiInspectElement, true);
+
+        if (Services.appinfo.OS == "WINNT") {
+          return;
+        }
+
+        win.addEventListener("mouseup", DOMiInspectElement, false);
+        win.addEventListener("contextmenu", DOMiInspectElement, true);
+      }, false);
+    },
+    onCloseWindow: function (aWindow) {},
+    onWindowTitleChange: function (aWindow, aTitle) {},
+  },
+  init: function() {
+     Services.wm.addListener(this.aListener);
+    var cw =  Services.ww.getWindowEnumerator();
+
+    while (cw.hasMoreElements()) {
+      var win = cw.getNext().QueryInterface(Ci.nsIDOMWindow);
+      win.addEventListener("click", DOMiInspectElement, true);
+
+      if (Services.appinfo.OS == "WINNT") {
+        continue;
+      }
+
+      win.addEventListener("mouseup", DOMiInspectElement, false);
+      win.addEventListener("contextmenu", DOMiInspectElement, true);
+    }
+  },
+  uninit: function() {
+    Services.wm.removeListener(this.aListener);
+    var cw =  Services.ww.getWindowEnumerator();
+
+    while (cw.hasMoreElements()) {
+      var win = cw.getNext().QueryInterface(Ci.nsIDOMWindow);
+      win.removeEventListener("click", DOMiInspectElement, true);
+
+      if (Services.appinfo.OS == "WINNT") {
+        continue;
+      }
+
+      win.removeEventListener("mouseup", DOMiInspectElement, false);
+      win.removeEventListener("contextmenu", DOMiInspectElement, true);
+    }
+  }
+}
\ No newline at end of file
diff --git a/suite/components/inspector/InspectorComponents.manifest b/suite/components/inspector/InspectorComponents.manifest
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/InspectorComponents.manifest
@@ -0,0 +1,7 @@
+category app-startup DOMInspectorStartup service,@mozilla.org/domi/startup;1
+component {4788f52a-0fbb-494c-8ffd-25e0ff39d80d} inspector-startup.js
+contract @mozilla.org/domi/startup;1 {4788f52a-0fbb-494c-8ffd-25e0ff39d80d}
+
+category command-line-handler m-inspector @mozilla.org/commandlinehandler/general-startup;1?type=inspector
+component {38293526-6b13-4d4f-a075-71939435b408} inspector-cmdline.js
+contract @mozilla.org/commandlinehandler/general-startup;1?type=inspector {38293526-6b13-4d4f-a075-71939435b408}
diff --git a/suite/components/inspector/content/Flasher.js b/suite/components/inspector/content/Flasher.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/Flasher.js
@@ -0,0 +1,268 @@
+/* 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/. */
+
+/***************************************************************
+* Flasher ---------------------------------------------------
+*   Object for controlling a timed flashing animation which
+*   paints a border around an element.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+****************************************************************/
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+//////////// global variables /////////////////////
+
+//////////// global constants ////////////////////
+
+const isGecko58plus = Services.vc.compare(Services.appinfo.platformVersion, "58.0a1") >= 0;
+
+const HIGHLIGHTED_PSEUDO_CLASS = isGecko58plus? ":target" : ":-moz-devtools-highlighted";
+const INVERT = "filter: url(\"data:image/svg+xml;charset=utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='invert'><feColorMatrix in='SourceGraphic' type='matrix' values='-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0'/></filter></svg>%23invert\") !important; "
+
+////////////////////////////////////////////////////////////////////////////
+//// class Flasher
+
+function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert)
+{
+  document.querySelector(HIGHLIGHTED_PSEUDO_CLASS);
+  this.mIOService = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
+  this.mShell = this.mDOMUtils;
+  this.color = aColor;
+  this.thickness = aThickness;
+  this.invert = aInvert;
+  this.duration = aDuration;
+  this.speed = aSpeed;
+}
+
+Flasher.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mFlashTimeout: null,
+  mElement: null,
+  mRegistryId: null,
+  mFlashes: 0,
+  mStartTime: 0,
+  mDOMUtils: null,
+  mWinUtils: null,
+  mStyleURI: null,
+  mColor: "#000000",
+  mInvert: false,
+  mThickness: 0,
+  mDuration: 0,
+  mSpeed: 0,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Properties
+
+  get flashing() { return this.mFlashTimeout != null; },
+
+  get element() { return this.mElement; },
+  set element(val)
+  {
+    if (val && val.nodeType == Node.ELEMENT_NODE) {
+      this.mElement = val;
+      this.mShell.scrollElementIntoView(val);
+      this.mWinUtils = val.ownerDocument.defaultView
+                          .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+                          .getInterface(Components.interfaces.nsIDOMWindowUtils);
+    } else {
+      throw "Invalid node type.";
+    }
+  },
+
+  get color() { return this.mColor; },
+  set color(aVal)
+  {
+    var spacer = document.createElement("spacer");
+    spacer.style.color = aVal;
+    if (spacer.style.color) {
+      this.mStyleURI = null;
+      this.mColor = aVal;
+    }
+    return aVal;
+  },
+
+  get thickness() { return this.mThickness | 0; },
+  set thickness(aVal) { this.mStyleURI = null; return this.mThickness = aVal; },
+
+  get duration() { return this.mDuration; },
+  set duration(aVal) { this.mDuration = aVal; },
+
+  get speed() { return this.mSpeed; },
+  set speed(aVal) { this.mSpeed = aVal; },
+
+  get invert() { return !!this.mInvert; },
+  set invert(aVal) { this.mStyleURI = null; return this.mInvert = aVal; },
+
+  // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+  // :::::::::::::::::::: Methods ::::::::::::::::::::::::::::
+  // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
+
+  start: function(aDuration, aSpeed, aHold)
+  {
+    if (!this.mStyleURI) {
+      var styleURI = "data:text/css;charset=utf-8," + HIGHLIGHTED_PSEUDO_CLASS +
+                     " { outline: " + this.thickness + "px solid " +
+                     encodeURIComponent(this.color) +
+                     " !important; outline-offset: " + -this.thickness +
+                     "px !important; " + (this.invert ? INVERT : "") + "}";
+      this.mStyleURI = this.mIOService.newURI(styleURI, null, null);
+    }
+
+    this.mWinUtils.loadSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET);
+    this.mUDuration = aDuration ? aDuration * 1000 : this.mDuration;
+    this.mUSpeed = aSpeed ? aSpeed : this.mSpeed;
+    this.mHold = aHold;
+    this.mFlashes = 0;
+    this.mStartTime = Date.now();
+    this.doFlash();
+  },
+
+  doFlash: function()
+  {
+    if (this.mHold || this.mFlashes & 1) {
+      this.paintOn();
+    } else {
+      this.paintOff();
+    }
+    this.mFlashes++;
+
+    if (this.mUDuration < 0 || Date.now() - this.mStartTime < this.mUDuration) {
+      this.mFlashTimeout = window.setTimeout(this.timeout, this.mUSpeed, this);
+    } else {
+      this.stop();
+    }
+  },
+
+  timeout: function(self)
+  {
+    self.doFlash();
+  },
+
+  stop: function()
+  {
+    if (this.flashing) {
+      this.mWinUtils.removeSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET);
+      window.clearTimeout(this.mFlashTimeout);
+      this.mFlashTimeout = null;
+      this.paintOff();
+    }
+  },
+
+  paintOn: function()
+  {
+    this.mDOMUtils.addPseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS);
+  },
+
+  paintOff: function()
+  {
+    this.mDOMUtils.removePseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS);
+  }
+
+};
+
+////////////////////////////////////////////////////////////////////////////////
+//// DOMIFlasher
+
+/**
+ * The special version of the flasher operating with DOM Inspector flasher
+ * preferences.
+ */
+function DOMIFlasher()
+{
+  this.init();
+}
+
+DOMIFlasher.prototype =
+{
+  //////////////////////////////////////////////////////////////////////////////
+  //// Public
+
+  get flashOnSelect() { return PrefUtils.getPref("inspector.blink.on"); },
+  set flashOnSelect(aVal) { PrefUtils.setPref("inspector.blink.on", aVal); },
+
+  get color() { return PrefUtils.getPref("inspector.blink.border-color"); },
+  set color(aVal) { PrefUtils.setPref("inspector.blink.border-color", aVal); },
+
+  get thickness() { return PrefUtils.getPref("inspector.blink.border-width"); },
+  set thickness(aVal) { PrefUtils.setPref("inspector.blink.border-width", aVal); },
+
+  get duration() { return PrefUtils.getPref("inspector.blink.duration"); },
+  set duration(aVal) { PrefUtils.setPref("inspector.blink.duration", aVal); },
+
+  get speed() { return PrefUtils.getPref("inspector.blink.speed"); },
+  set speed(aVal) { PrefUtils.setPref("inspector.blink.speed", aVal); },
+
+  get invert() { return PrefUtils.getPref("inspector.blink.invert"); },
+  set invert(aVal) { PrefUtils.setPref("inspector.blink.invert", aVal); },
+
+  flashElement: function DOMIFlasher_flashElement(aElement)
+  {
+    if (this.mFlasher.flashing)
+      this.mFlasher.stop();
+
+    this.mFlasher.element = aElement;
+    this.mFlasher.start();
+  },
+
+  flashElementOnSelect: function DOMIFlasher_flashElementOnSelect(aElement)
+  {
+    if (this.flashOnSelect) {
+      this.flashElement(aElement);
+    }
+  },
+
+  destroy: function DOMIFlasher_destroy()
+  {
+    PrefUtils.removeObserver("inspector.blink.", this);
+  },
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// Private
+
+  init: function DOMIFlasher_init()
+  {
+    this.mFlasher = new Flasher(this.color, this.thickness, this.duration,
+                                this.speed, this.invert);
+
+    PrefUtils.addObserver("inspector.blink.", this);
+
+    this.updateFlashOnSelectCommand();
+  },
+
+  updateFlashOnSelectCommand: function DOMIFlasher_updateFlashOnSelectCommand()
+  {
+    var cmdEl = document.getElementById("cmdFlashOnSelect");
+    if (this.flashOnSelect) {
+      cmdEl.setAttribute("checked", "true");
+    } else {
+      cmdEl.removeAttribute("checked");
+    }
+  },
+
+  observe: function DOMIFlasher_observe(aSubject, aTopic, aData)
+  {
+    if (aData == "inspector.blink.on") {
+      this.updateFlashOnSelectCommand();
+      return;
+    }
+
+    var value = PrefUtils.getPref(aData);
+
+    if (aData == "inspector.blink.border-color") {
+      this.mFlasher.color = value;
+    } else if (aData == "inspector.blink.border-width") {
+      this.mFlasher.thickness = value;
+    } else if (aData == "inspector.blink.duration") {
+      this.mFlasher.duration = value;
+    } else if (aData == "inspector.blink.speed") {
+      this.mFlasher.speed = value;
+    } else if (aData == "inspector.blink.invert") {
+      this.mFlasher.invert = value;
+    }
+  }
+}
diff --git a/suite/components/inspector/content/ViewerRegistry.js b/suite/components/inspector/content/ViewerRegistry.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/ViewerRegistry.js
@@ -0,0 +1,251 @@
+/* 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/. */
+
+/*****************************************************************************
+* ViewerRegistry -------------------------------------------------------------
+*   The central registry where information about all installed viewers is
+*   kept.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/rdf/RDFU.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kViewerURLPrefix = "chrome://inspector/content/viewers/";
+const kViewerRegURL  = "chrome://inspector/content/res/viewer-registry.rdf";
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class ViewerRegistry
+
+function ViewerRegistry() // implements inIViewerRegistry
+{
+  this.mViewerHash = {};
+}
+
+ViewerRegistry.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Interface inIViewerRegistry (not yet formalized...)
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mDS: null,
+  mObserver: null,
+  mViewerDS: null,
+  mViewerHash: null,
+  mFilters: null,
+
+  get url()
+  {
+    return this.mURL;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Loading Methods
+
+  load: function VR_Load(aURL, aObserver)
+  {
+    this.mURL = aURL;
+    this.mObserver = aObserver;
+    RDFU.loadDataSource(aURL, new ViewerRegistryLoadObserver(this));
+  },
+
+  onError: function VR_OnError(aStatus, aErrorMsg)
+  {
+    this.mObserver.onViewerRegistryLoadError(aStatus, aErrorMsg);
+  },
+
+  onLoad: function VR_OnLoad(aDS)
+  {
+    this.mDS = aDS;
+    this.prepareRegistry();
+    this.mObserver.onViewerRegistryLoad();
+  },
+
+  prepareRegistry: function VR_PrepareRegistry()
+  {
+    this.mViewerDS = RDFArray.fromContainer(this.mDS, "inspector:viewers",
+                                            kInspectorNSURI);
+
+    // create and cache the filter functions
+    var js, fn;
+    this.mFilters = [];
+    for (var i = 0; i < this.mViewerDS.length; ++i) {
+      js = this.getEntryProperty(i, "filter");
+      try {
+        fn = new Function("object", "linkedViewer", js);
+      }
+      catch (ex) {
+        fn = new Function("return false");
+        debug("### ERROR - Syntax error in filter for viewer \"" +
+              this.getEntryProperty(i, "description") + "\"\n");
+      }
+      this.mFilters.push(fn);
+    }
+  },
+
+  /**
+   * Returns the absolute url where the xul file for a viewer can be found.
+   *
+   * @param aIndex
+   *        The numerical index of the entry representing the viewer.
+   * @return A string of the fully canonized url.
+   */
+  getEntryURL: function VR_GetEntryURL(aIndex)
+  {
+    var uid = this.getEntryProperty(aIndex, "uid");
+    return kViewerURLPrefix + uid + "/" + uid + ".xul";
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Lookup Methods
+
+  /**
+   * Searches the viewer registry for all viewers that can view a particular
+   * object.
+   *
+   * @param aObject
+   *        The object being searched against.
+   * @param aPanelId
+   *        A string containing the id of the panel requesting viewers.
+   * @param aLinkedViewer
+   *        The view object of linked panel.
+   * @return An array of nsIRDFResource entries in the viewer registry.
+   */
+  findViewersForObject:
+    function VR_FindViewersForObject(aObject, aPanelId, aLinkedViewer)
+  {
+    // check each entry in the registry
+    var len = this.mViewerDS.length;
+    var entry;
+    var urls = [];
+    for (var i = 0; i < len; ++i) {
+      if (this.getEntryProperty(i, "panels").indexOf(aPanelId) == -1) {
+        continue;
+      }
+      if (this.objectMatchesEntry(aObject, aLinkedViewer, i)) {
+        if (this.getEntryProperty(i, "important")) {
+          urls.unshift(i);
+        } else {
+          urls.push(i);
+        }
+      }
+    }
+
+    return urls;
+  },
+
+  /**
+   * Determines if an object is eligible to be viewed by a particular viewer.
+   *
+   * @param aObject
+   *        The object being checked for eligibility.
+   * @param aLinkedViewer
+   *        The view object of linked panel.
+   * @param aIndex
+   *        The numerical index of the entry.
+   * @return true if object can be viewed.
+   */
+  objectMatchesEntry:
+    function VR_ObjectMatchesEntry(aObject, aLinkedViewer, aIndex)
+  {
+    try {
+      return this.mFilters[aIndex](aObject, aLinkedViewer);
+    }
+    catch (ex) {
+      Components.utils.reportError(ex);
+    }
+    return false;
+  },
+
+  /**
+   * Notifies the registry that a viewer has been instantiated, and that it
+   * corresponds to a particular entry in the viewer registry.
+   *
+   * @param aViewer
+   *        The inIViewer object to cache.
+   * @param aIndex
+   *        The numerical index of the entry.
+   */
+  cacheViewer: function VR_CacheViewer(aViewer, aIndex)
+  {
+    var uid = this.getEntryProperty(aIndex, "uid");
+    this.mViewerHash[uid] = { viewer: aViewer, entry: aIndex };
+  },
+
+  uncacheViewer: function VR_UncacheViewer(aViewer)
+  {
+    delete this.mViewerHash[aViewer.uid];
+  },
+
+  // for previously loaded viewers only
+  getViewerByUID: function VR_GetViewerByUID(aUID)
+  {
+    return this.mViewerHash[aUID].viewer;
+  },
+
+  // for previously loaded viewers only
+  getEntryForViewer: function VR_GetEntryForViewer(aViewer)
+  {
+    return this.mViewerHash[aViewer.uid].entry;
+  },
+
+  // for previously loaded viewers only
+  getEntryByUID: function VR_GetEntryByUID(aUID)
+  {
+    return this.mViewerHash[aUID].aIndex;
+  },
+
+  getEntryProperty: function VR_GetEntryProperty(aIndex, aProp)
+  {
+    return this.mViewerDS.get(aIndex, aProp);
+  },
+
+  getEntryCount: function VR_GetEntryCount()
+  {
+    return this.mViewerDS.length;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Viewer Registration
+
+  addNewEntry: function VR_AddNewEntry(aUID, aDescription, aFilter)
+  {
+  },
+
+  removeEntry: function VR_RemoveEntry(aIndex)
+  {
+  },
+
+  saveRegistry: function VR_SaveRegistry()
+  {
+  }
+};
+
+////////////////////////////////////////////////////////////////////////////
+//// Listener Objects
+
+function ViewerRegistryLoadObserver(aTarget)
+{
+  this.mTarget = aTarget;
+}
+
+ViewerRegistryLoadObserver.prototype =
+{
+  mTarget: null,
+
+  onError: function VRLO_OnError(aStatus, aErrorMsg)
+  {
+    this.mTarget.onError(aStatus, aErrorMsg);
+  },
+
+  onDataSourceReady: function VRLO_OnDataSourceReady(aDS)
+  {
+    this.mTarget.onLoad(aDS);
+  }
+};
diff --git a/suite/components/inspector/content/commandOverlay.xul b/suite/components/inspector/content/commandOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/commandOverlay.xul
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<overlay id="ovCommandsMain"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <commandset id="cmdsGlobalCommands">
+
+    <command id="cmdGotoURL"
+             ontextentered="inspector.gotoTypedURL();"
+             oncommand="inspector.gotoTypedURL();"/>
+
+    <command id="cmdEnterLocation"
+             oncommand="inspector.enterLocation();"/>
+    <command id="cmdSave" oncommand="inspector.save();"/>
+    <command id="cmdClose" oncommand="inspector.exit();"/>
+
+    <command id="cmdShowPrefsDialog"
+             oncommand="inspector.showPrefsDialog();"/>
+
+    <command id="cmdToggleDocument"
+             oncommand="inspector.toggleBrowser(true);"/>
+
+    <command id="cmdFlashOnSelect"
+             viewer="dom accessibleTree"
+             oncommand="inspector.toggleFlashOnSelect();"/>
+
+    <!-- These implement the editing commands needed by the top-level
+         inspectors.  See editingOverlay.xul for more information. -->
+    <command id="cmdEditUndo" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditUndo');"/>
+    <command id="cmdEditRedo" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditRedo');"/>
+    <command id="cmdEditCut" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditCut');"/>
+    <command id="cmdEditCopy" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditCopy');"/>
+    <command id="cmdEditPaste" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditPaste');"/>
+    <command id="cmdEditInsert" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditInsert');"/>
+    <command id="cmdEditEdit" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditEdit');"/>
+    <command id="cmdEditDelete" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditDelete');"/>
+    <command id="cmdEditInspectInNewWindow" global="true"
+             oncommand="inspector.doViewerCommand('cmdEditInspectInNewWindow');"/>
+
+  </commandset>
+
+</overlay>
diff --git a/suite/components/inspector/content/editingOverlay.xul b/suite/components/inspector/content/editingOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/editingOverlay.xul
@@ -0,0 +1,90 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/editing.dtd">
+
+<overlay id="ovEditing"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<!-- This overlay is pulled in by popupOverlay.xul, which is itself pulled in
+     by the top-level inspectors (inspector.xul, object.xul, and sidebar.xul),
+     to add these items to its menus.  Additionally, this overlay is suitable
+     for use by viewers which want to offer any of these items (e.g., for
+     their context menus).  Note that the cmdsEditing commandset is used only
+     by viewers due to scoping differences; the implementation of the commands
+     used in the top-level inspectors can be found in commandOverlay.xul. -->
+
+  <commandset id="cmdsEditing">
+    <command id="cmdEditUndo"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditUndo');"/>
+    <command id="cmdEditRedo"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditRedo');"/>
+    <command id="cmdEditCut"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditCut');"/>
+    <command id="cmdEditCopy"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditCopy');"/>
+    <command id="cmdEditPaste"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPaste');"/>
+    <command id="cmdEditInsert"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInsert');"/>
+    <command id="cmdEditEdit"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditEdit');"/>
+    <command id="cmdEditDelete"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditDelete');"/>
+  </commandset>
+  <commandset id="cmdsEditingExtras">
+    <command id="cmdEditInspectInNewWindow"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInspectInNewWindow');"/>
+    <command id="cmdEditCopyFileURI"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditCopyFileURI');"/>
+    <command id="cmdEditViewFileURI"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditViewFileURI');"/>
+  </commandset>
+
+  <keyset id="ksGlobalKeyset">
+    <key id="keyEditUndo" key="z" modifiers="accel" command="cmdEditUndo"/>
+    <key id="keyEditRedo" key="z" modifiers="accel,shift"
+         command="cmdEditRedo"/>
+    <key id="keyEditRedo2" key="y" modifiers="accel" command="cmdEditRedo"/>
+    <key id="keyEditCut" key="x" modifiers="accel" command="cmdEditCut"/>
+    <key id="keyEditCopy" key="c" modifiers="accel" command="cmdEditCopy"/>
+    <key id="keyEditPaste" key="v" modifiers="accel" command="cmdEditPaste"/>
+    <key id="keyEditDelete" keycode="VK_DELETE" command="cmdEditDelete"/>
+    <key id="keyEditDeleteMac" keycode="VK_BACK" command="cmdEditDelete"/>
+    <key id="keyEditInspectInNewWindow" key="&mnEditInspectInNewWindow.key;"
+         modifiers="accel" command="cmdEditInspectInNewWindow"/>
+  </keyset>
+
+  <menuitem id="mnEditUndo" label="&mnEditUndo.label;" command="cmdEditUndo"
+            accesskey="&mnEditUndo.accesskey;" key="keyEditUndo"/>
+  <menuitem id="mnEditRedo" label="&mnEditRedo.label;" command="cmdEditRedo"
+            accesskey="&mnEditRedo.accesskey;" key="keyEditRedo"/>
+  <menuitem id="mnEditCut" label="&mnEditCut.label;" command="cmdEditCut"
+            accesskey="&mnEditCut.accesskey;" key="keyEditCut"/>
+  <menuitem id="mnEditCopy" label="&mnEditCopy.label;" command="cmdEditCopy"
+            accesskey="&mnEditCopy.accesskey;" key="keyEditCopy"/>
+  <menuitem id="mnEditPaste" label="&mnEditPaste.label;" command="cmdEditPaste"
+            accesskey="&mnEditPaste.accesskey;" key="keyEditPaste"/>
+  <menuitem id="mnEditInsert" label="&mnEditInsert.label;"
+            command="cmdEditInsert" accesskey="&mnEditInsert.accesskey;"/>
+  <menuitem id="mnEditEdit" label="&mnEditEdit.label;" command="cmdEditEdit"
+            accesskey="&mnEditEdit.accesskey;"/>
+  <menuitem id="mnEditDelete" label="&mnEditDelete.label;"
+            command="cmdEditDelete" accesskey="&mnEditDelete.accesskey;"
+            key="keyEditDelete"/>
+  <menuitem id="mnEditInspectInNewWindow"
+            label="&mnEditInspectInNewWindow.label;"
+            command="cmdEditInspectInNewWindow"
+            accesskey="&mnEditInspectInNewWindow.accesskey;"
+            key="keyEditInspectInNewWindow"/>
+  <menuitem id="mnEditCopyFileURI" label="&mnEditCopyFileURI.label;"
+            command="cmdEditCopyFileURI"
+            accesskey="&mnEditCopyFileURI.accesskey;"/>
+  <menuitem id="mnEditViewFileURI" label="&mnEditViewFileURI.label;"
+            command="cmdEditViewFileURI"
+            accesskey="&mnEditViewFileURI.accesskey;"/>
+
+</overlay>
diff --git a/suite/components/inspector/content/extensions/titledSplitter.css b/suite/components/inspector/content/extensions/titledSplitter.css
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/extensions/titledSplitter.css
@@ -0,0 +1,9 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin/titledSplitter.css");
+
+.titled-splitter {
+  -moz-binding: url("titledSplitter.xml#titledSplitter") !important;
+}
diff --git a/suite/components/inspector/content/extensions/titledSplitter.xml b/suite/components/inspector/content/extensions/titledSplitter.xml
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/extensions/titledSplitter.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<bindings id="bdsTitledSplitter"
+          xmlns="http://www.mozilla.org/xbl"
+          xmlns:xbl="http://www.mozilla.org/xbl"
+          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <binding id="titledSplitter" extends="chrome://global/content/bindings/splitter.xml#splitter">
+    <content>
+      <xul:vbox class="titledsplitter-container" flex="1">
+        <xul:spacer class="titledsplitter-dragbar"/>
+        <xul:box class="titledsplitter-titlebox" flex="1" onmousedown="event.stopPropagation()">
+          <xul:box align="center">
+            <xul:label class="titledsplitter-text" xbl:inherits="value=label"/>
+          </xul:box>
+          <xul:spacer flex="1"/>
+          <xul:button class="titledsplitter-closebutton" align="center" pack="center"
+                   onclick="this.parentNode.parentNode.parentNode.close();">
+            <xul:image class="titledsplitter-closeimage"/>
+          </xul:button>
+        </xul:box>
+      </xul:vbox>
+    </content>
+
+    <implementation>
+      <property name="isOpened">
+        <getter><![CDATA[
+          return this.mOpened;
+        ]]></getter>
+      </property>
+
+      <property name="collapsee">
+        <getter><![CDATA[
+          var collapse = this.getAttribute("collapse");
+          return collapse == "before" ? this.previousSibling : this.nextSibling;
+        ]]></getter>
+      </property>
+
+      <method name="open">
+        <body><![CDATA[
+          var collapsee = this.collapsee;
+          if (collapsee) {
+            this.removeAttribute("closed");
+            this.removeAttribute("collapsed");
+            collapsee.removeAttribute("collapsed");
+            this.mOpened = true;
+            this.onopen();
+          }
+        ]]></body>
+      </method>
+
+      <method name="close">
+        <body><![CDATA[
+          var collapsee = this.collapsee;
+          if (collapsee) {
+            this.setAttribute("closed", "true");
+            this.setAttribute("collapsed", "true");
+            collapsee.setAttribute("collapsed", "true");
+            this.mOpened = false;
+            this.onopen();
+          }
+        ]]></body>
+      </method>
+      
+      <method name="onopen">
+        <body><![CDATA[
+          if (!this.mOnOpen) {
+            var js = this.getAttribute("onopen");
+            if (js)
+              this.mOnOpen = new Function(js);
+          }          
+
+          return this.mOnOpen ? this.mOnOpen() : null;
+        ]]></body>
+      </method>
+    
+	  <constructor><![CDATA[
+        this.mOpened = false;
+      ]]></constructor>
+    </implementation>
+    
+  </binding>
+
+</bindings>
diff --git a/suite/components/inspector/content/extensions/wsm-colorpicker.js b/suite/components/inspector/content/extensions/wsm-colorpicker.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/extensions/wsm-colorpicker.js
@@ -0,0 +1,51 @@
+/* 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/. */
+
+/***************************************************************
+* wsm-colorpicker ----------------------------------------------
+* Quick script which adds support for the color picker widget
+* to nsWidgetStateManager in the pref winodw.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+function AddColorPicker(aCallback)
+{
+  window.addEventListener("load", AddColorPicker_delayCheck, false);
+  window.AddColorPicker_callback = aCallback;
+}
+    
+function AddColorPicker_delayCheck()
+{
+  if (parent.hPrefWindow) 
+    AddColorPicker_addColorHandlers()
+  else
+    setTimeout("AddColorPicker_delayCheck()", 1);
+}
+
+function AddColorPicker_addColorHandlers() 
+{
+  parent.hPrefWindow.wsm.handlers.colorpicker = {
+    set: function (aElementID, aDataObject)
+    {
+      var wsm = parent.hPrefWindow.wsm;
+      var element = wsm.contentArea.document.getElementById( aElementID );
+      element.color = aDataObject.color;
+    },
+    
+    get: function (aElementID)
+    {
+      var wsm = parent.hPrefWindow.wsm;
+      var element = wsm.contentArea.document.getElementById( aElementID );
+      var dataObject = wsm.generic_Get(element);
+      if(dataObject) { 
+        dataObject.color = element.color;
+        return dataObject;
+      }
+      return null;
+    }
+  }
+
+  window.AddColorPicker_callback();
+}
diff --git a/suite/components/inspector/content/hooks.js b/suite/components/inspector/content/hooks.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/hooks.js
@@ -0,0 +1,21 @@
+/* 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/. */
+
+function inspectDOMDocument(aDocument, aModal)
+{
+  window.openDialog("chrome://inspector/content/", "_blank", 
+              "chrome,all,dialog=no"+(aModal?",modal":""), aDocument);
+}
+
+function inspectDOMNode(aNode, aModal)
+{
+  window.openDialog("chrome://inspector/content/", "_blank", 
+              "chrome,all,dialog=no"+(aModal?",modal":""), aNode);
+}
+
+function inspectObject(aObject, aModal)
+{
+  window.openDialog("chrome://inspector/content/object.xul", "_blank", 
+              "chrome,all,dialog=no"+(aModal?",modal":""), aObject);
+}
diff --git a/suite/components/inspector/content/inspector.css b/suite/components/inspector/content/inspector.css
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/inspector.css
@@ -0,0 +1,38 @@
+/* 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/. */
+
+@import url("chrome://inspector/content/extensions/titledSplitter.css");
+
+@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
+
+*[hide="true"] {
+  visibility: hidden;
+}
+
+domi-panelset {
+  -moz-binding: url("chrome://inspector/content/inspector.xml#panelset");
+  display: -moz-box;
+}
+
+domi-panel {
+  -moz-binding: url("chrome://inspector/content/inspector.xml#panel");
+  display: -moz-box;
+}
+
+#ppsViewerPopupset {
+  display: none;
+}
+
+.tree-list > treecol,
+.tree-list > .tree-columns > treecol {
+  -moz-binding: none;
+  background-color: transparent !important;
+  margin: 0px !important;
+  border: none !important;
+  padding: 0px !important;
+}
+
+.tree-nocolpicker > .tree-columns > .tree-columnpicker {
+  visibility: collapse;
+}
diff --git a/suite/components/inspector/content/inspector.js b/suite/components/inspector/content/inspector.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/inspector.js
@@ -0,0 +1,739 @@
+/* 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/. */
+
+/*****************************************************************************
+* InspectorApp ---------------------------------------------------------------
+*   The primary object that controls the Inspector application.
+*****************************************************************************/
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var inspector;
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kIsMac = /Mac/.test(navigator.platform);
+const kInspectorTitle =  kIsMac ?  "" : " - " + document.title;
+
+const kAccessibleRetrievalContractID =
+  "@mozilla.org/accessibleRetrieval;1";
+const kClipboardHelperContractID =
+  "@mozilla.org/widget/clipboardhelper;1";
+const kPromptServiceContractID =
+  "@mozilla.org/embedcomp/prompt-service;1";
+const kFOStreamContractID =
+  "@mozilla.org/network/file-output-stream;1";
+const kEncoderContractIDbase =
+  "@mozilla.org/layout/documentEncoder;1?type=";
+const kSerializerContractID =
+  "@mozilla.org/xmlextras/xmlserializer;1";
+const kWindowMediatorContractID =
+  "@mozilla.org/appshell/window-mediator;1";
+const kFilePickerContractID =
+  "@mozilla.org/filepicker;1";
+
+const nsIAccessible            = Components.interfaces.nsIAccessible;
+const nsIWebNavigation         = Components.interfaces.nsIWebNavigation;
+const nsIDocShellTreeItem      = Components.interfaces.nsIDocShellTreeItem;
+const nsIDocShell              = Components.interfaces.nsIDocShell;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", InspectorApp_initialize, false);
+window.addEventListener("unload", InspectorApp_destroy, false);
+
+function InspectorApp_initialize()
+{
+  inspector = new InspectorApp();
+
+  // window.arguments may be either a string or a node.
+  // If passed via a command line handler, it will be a uri string.
+  // If passed via navigator hooks, it will be a dom node to inspect.
+  var initNode, initURI;
+  if (window.arguments && window.arguments.length) {
+    if (typeof window.arguments[0] == "string") {
+      initURI = window.arguments[0];
+    }
+    else if (window.arguments[0] instanceof Components.interfaces.nsIDOMNode) {
+      initNode = window.arguments[0];
+    }
+  }
+  inspector.initialize(initNode, initURI);
+
+  // Enable/disable Mac outlier keys.
+  if (kIsMac) {
+    document.getElementById("keyEnterLocation2").setAttribute("disabled",
+                                                              "true");
+  }
+  else {
+    document.getElementById("keyEditDeleteMac").setAttribute("disabled",
+                                                             "true");
+  }
+
+  if (/Win/.test(navigator.platform)) {
+    document.getElementById("mnEditRedo").setAttribute("key", "keyEditRedo2");
+  }
+
+  // Get rid of any menus that we expose as overlay points for integration
+  // with several applications but aren't of use with the one hosting us here.
+  var menubar = document.getElementById("mbrInspectorMain");
+  var kid = menubar.firstChild;
+  while (kid) {
+    let nextSibling = kid.nextSibling;
+    if (!kid.hasChildNodes()) {
+      menubar.removeChild(kid);
+    }
+    kid = nextSibling;
+  }
+}
+
+function InspectorApp_destroy()
+{
+  inspector.destroy();
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class InspectorApp
+
+function InspectorApp()
+{
+}
+
+InspectorApp.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mShowBrowser: false,
+  mClipboardHelper: null,
+  mPromptService: null,
+
+  mDocPanel: null,
+  mObjectPanel: null,
+  mDocViewerListPopup: null,
+  mObjectViewerListPopup: null,
+
+  mLastKnownDocPanelSubject: null,
+  mLastKnownObjectPanelSubject: null,
+
+  get document()
+  {
+    return this.mDocPanel.viewer.subject
+  },
+
+  get panelset()
+  {
+    return this.mPanelSet;
+  },
+
+  initialize: function IA_Initialize(aTarget, aURI)
+  {
+    this.mInitTarget = aTarget;
+
+    var el = document.getElementById("bxBrowser");
+    el.addEventListener("pageshow", BrowserPageShowListener, true);
+
+    this.setBrowser(false, true);
+
+    this.mClipboardHelper = XPCU.getService(kClipboardHelperContractID,
+                                            "nsIClipboardHelper");
+    this.mPromptService = XPCU.getService(kPromptServiceContractID,
+                                          "nsIPromptService");
+
+    this.mDocViewerListPopup =
+      document.getElementById("mppDocViewerList");
+    this.mObjectViewerListPopup =
+      document.getElementById("mppObjectViewerList");
+
+    this.mPanelSet = document.getElementById("bxPanelSet");
+    this.mPanelSet.addObserver("panelsetready", this);
+    this.mPanelSet.initialize();
+
+    // check if accessibility service is available
+    if (!(kAccessibleRetrievalContractID in Components.classes)) {
+      var elm = document.getElementById("cmd:toggleAccessibleNodes");
+      if (elm) {
+        elm.setAttribute("disabled", "true");
+      }
+
+      elm = document.getElementById("mnInspectApplicationAccessible");
+      if (elm) {
+        elm.setAttribute("disabled", "true");
+      }
+    }
+
+    if (aURI) {
+      this.gotoURL(aURI);
+    }
+  },
+
+  destroy: function IA_Destroy()
+  {
+    InsUtil.persistAll("bxDocPanel");
+    InsUtil.persistAll("bxObjectPanel");
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Viewer Panels
+
+  initViewerPanels: function IA_InitViewerPanels()
+  {
+    this.mDocPanel = this.mPanelSet.getPanel(0);
+    this.mDocPanel.addObserver("subjectChange", this);
+    this.mObjectPanel = this.mPanelSet.getPanel(1);
+    this.mObjectPanel.addObserver("subjectChange", this);
+
+    if (this.mInitTarget) {
+      if (this.mInitTarget.nodeType == Node.DOCUMENT_NODE) {
+        this.setTargetDocument(this.mInitTarget, false);
+      }
+      else if (this.mInitTarget.nodeType == Node.ELEMENT_NODE) {
+        this.setTargetDocument(this.mInitTarget.ownerDocument, false);
+        this.mDocPanel.params = this.mInitTarget;
+      }
+      this.mInitTarget = null;
+    }
+  },
+
+  onEvent: function IA_OnEvent(aEvent)
+  {
+    switch (aEvent.type) {
+      case "panelsetready":
+        this.initViewerPanels();
+        break;
+      case "subjectChange":
+        // A subjectChange really means the *viewer's* subject changed, and
+        // one will be dispatched everytime a new viewer is loaded.  Don't
+        // update the entries if the panel's subject is the same as before and
+        // the subjectChange was only dispatched because of a new viewer.
+        if (aEvent.target == this.mDocPanel.viewer) {
+          let panel = this.mDocPanel;
+          let mpp = this.mDocViewerListPopup;
+          // Update the viewer list.
+          if (this.mLastKnownDocPanelSubject != aEvent.subject) {
+            panel.rebuildViewerList(mpp);
+            this.mLastKnownDocPanelSubject = aEvent.subject;
+          }
+          panel.updateViewerListSelection(mpp);
+
+          if (aEvent.subject) {
+            if ("location" in aEvent.subject) {
+              // display document url
+              this.locationText = aEvent.subject.location;
+  
+              document.title =
+                (aEvent.subject.title || aEvent.subject.location) +
+                kInspectorTitle;
+  
+              this.updateCommand("cmdSave");
+            }
+            else if (("nsIAccessibleApplication" in Components.interfaces &&
+                      aEvent.subject instanceof
+                        Components.interfaces.nsIAccessibleApplication) ||
+                     (aEvent.subject instanceof nsIAccessible &&
+                      !aEvent.subject.parent)) {
+              // Update title for application accessible in compatible way for
+              // Gecko 2.0 and 1.9.2.
+              this.locationText = "";
+
+              var title = this.mPanelSet.
+                stringBundle.getString("applicationAccesible.title");
+              document.title = title + kInspectorTitle;
+
+              this.updateCommand("cmdSave");
+            }
+          }
+        }
+        else if (aEvent.target == this.mObjectPanel.viewer) {
+          let panel = this.mObjectPanel;
+          let mpp = this.mObjectViewerListPopup;
+          // Update the viewer list.
+          if (this.mLastKnownObjectPanelSubject != aEvent.subject) {
+            panel.rebuildViewerList(mpp);
+            this.mLastKnownObjectPanelSubject = aEvent.subject;
+          }
+          panel.updateViewerListSelection(mpp);
+        }
+        break;
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// UI Commands
+
+  updateCommand: function IA_UpdateCommand(aCommand)
+  {
+    var command = document.getElementById(aCommand);
+
+    var disabled = false;
+    switch (aCommand) {
+      case "cmdSave":
+        var doc = this.mDocPanel.subject;
+        disabled =
+          !((kEncoderContractIDbase + doc.contentType) in Components.classes ||
+            (kSerializerContractID in Components.classes));
+        break;
+    }
+
+    command.setAttribute("disabled", disabled);
+  },
+
+  doViewerCommand: function IA_DoViewerCommand(aCommand)
+  {
+    this.mPanelSet.execCommand(aCommand);
+  },
+
+  enterLocation: function IA_EnterLocation()
+  {
+    this.locationBar.focus();
+    this.locationBar.select();
+  },
+
+  showPrefsDialog: function IA_ShowPrefsDialog()
+  {
+    goPreferences("inspector_pane");
+  },
+
+  toggleBrowser: function IA_ToggleBrowser(aToggleSplitter)
+  {
+    this.setBrowser(!this.mShowBrowser, aToggleSplitter)
+  },
+
+  /**
+   * Toggle 'blink on select' command.
+   */
+  toggleFlashOnSelect: function IA_ToggleFlashOnSelect()
+  {
+    this.mPanelSet.flasher.flashOnSelect =
+      !this.mPanelSet.flasher.flashOnSelect;
+  },
+
+  setBrowser: function IA_SetBrowser(aValue, aToggleSplitter)
+  {
+    this.mShowBrowser = aValue;
+    if (aToggleSplitter) {
+      this.openSplitter("Browser", aValue);
+    }
+    var cmd = document.getElementById("cmdToggleDocument");
+    cmd.setAttribute("checked", aValue);
+  },
+
+  openSplitter: function IA_OpenSplitter(aName, aTruth)
+  {
+    var splitter = document.getElementById("spl" + aName);
+    if (aTruth) {
+      splitter.open();
+    }
+    else {
+      splitter.close();
+    }
+  },
+
+ /**
+  * Saves the current document state in the inspector.
+  */
+  save: function IA_Save()
+  {
+    var picker = XPCU.createInstance(kFilePickerContractID, "nsIFilePicker");
+    var title = document.getElementById("mi-save").label;
+    picker.init(window, title, picker.modeSave)
+    picker.appendFilters(picker.filterHTML | picker.filterXML |
+                         picker.filterXUL);
+    if (picker.show() == picker.returnCancel) {
+      return;
+    }
+
+    var fos = XPCU.createInstance(kFOStreamContractID, "nsIFileOutputStream");
+    const flags = 0x02 | 0x08 | 0x20; // write, create, truncate
+
+    var doc = this.mDocPanel.subject;
+    if ((kEncoderContractIDbase + doc.contentType) in Components.classes) {
+      // first we try to use the document encoder for that content type.  If
+      // that fails, we move on to the xml serializer.
+      var encoder =
+        XPCU.createInstance(kEncoderContractIDbase + doc.contentType,
+                            "nsIDocumentEncoder");
+      encoder.init(doc, doc.contentType, encoder.OutputRaw);
+      encoder.setCharset(doc.characterSet);
+      fos.init(picker.file, flags, -1, 0);
+      try {
+        encoder.encodeToStream(fos);
+      }
+      finally {
+        fos.close();
+      }
+    }
+    else {
+      var serializer = XPCU.createInstance(kSerializerContractID,
+                                          "nsIDOMSerializer");
+      fos.init(picker.file, flags, -1, 0);
+      try {
+        serializer.serializeToStream(doc, fos);
+      }
+      finally {
+        fos.close();
+      }
+    }
+  },
+
+  exit: function IA_Exit()
+  {
+    window.close();
+    // Todo: remove observer service here
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Navigation
+
+  gotoTypedURL: function IA_GotoTypedURL()
+  {
+    var url = document.getElementById("tfURLBar").value;
+    this.gotoURL(url);
+  },
+
+  gotoURL: function IA_GotoURL(aURL, aNoSaveHistory)
+  {
+    this.mPendingURL = aURL;
+    this.mPendingNoSave = aNoSaveHistory;
+    this.browseToURL(aURL);
+    this.setBrowser(true, true);
+  },
+
+  browseToURL: function IA_BrowseToURL(aURL)
+  {
+    try {
+      this.webNavigation.loadURI(aURL, nsIWebNavigation.LOAD_FLAGS_NONE, null,
+                                 null, null);
+    }
+    catch(ex) {
+      // nsIWebNavigation.loadURI will spit out an appropriate user prompt, so
+      // we don't need to do anything here.  See nsDocShell::DisplayLoadError()
+    }
+  },
+
+ /**
+  * Creates the submenu for Inspect Content/Chrome Document
+  */
+  showInspectDocumentList:
+    function IA_ShowInspectDocumentList(aEvent, aChrome)
+  {
+    var menu = aEvent.target;
+    var ww = XPCU.getService(kWindowMediatorContractID, "nsIWindowMediator");
+    var windows = ww.getXULWindowEnumerator(null);
+    var docs = [];
+
+    while (windows.hasMoreElements()) {
+      try {
+        // Get the window's main docshell
+        var windowDocShell =
+          XPCU.QI(windows.getNext(), "nsIXULWindow").docShell;
+        this.appendContainedDocuments(docs, windowDocShell,
+                                      aChrome ?
+                                        nsIDocShellTreeItem.typeChrome :
+                                        nsIDocShellTreeItem.typeContent);
+      }
+      catch (ex) {
+        // We've failed with this window somehow, but we're catching the error
+        // so the others will still work
+        Components.utils.reportError(ex);
+      }
+    }
+
+    // Clear out any previous menu
+    this.emptyChildren(menu);
+
+    // Now add what we found to the menu
+    if (!docs.length) {
+      var noneMenuItem = document.createElementNS(kXULNSURI, "menuitem");
+      var label = this.mPanelSet.stringBundle.getString(
+        "inspectWindow.noDocuments.message"
+      );
+      noneMenuItem.setAttribute("label", label);
+      noneMenuItem.setAttribute("disabled", true);
+      menu.appendChild(noneMenuItem);
+    }
+    else {
+      for (var i = 0; i < docs.length; i++) {
+        this.addInspectDocumentMenuItem(menu, docs[i], i + 1);
+      }
+    }
+  },
+
+ /**
+  * Appends to the array the documents contained in docShell (including the
+  * passed docShell itself).
+  *
+  * @param array
+  *        The array to append to.
+  * @param docShell
+  *        The docshell to look for documents in.
+  * @param type
+  *        One of the types defined in nsIDocShellTreeItem.
+  */
+  appendContainedDocuments:
+    function IA_AppendContainedDocuments(array, docShell, type)
+  {
+    // Load all the window's content docShells
+    var containedDocShells = docShell.getDocShellEnumerator(type,
+                                      nsIDocShell.ENUMERATE_FORWARDS);
+    while (containedDocShells.hasMoreElements()) {
+      try {
+        // Get the corresponding document for this docshell
+        var childDoc = XPCU.QI(containedDocShells.getNext(), "nsIDocShell")
+                         .contentViewer.DOMDocument;
+
+        // Ignore the DOM Inspector's browser docshell if it's not being used
+        if (docShell.contentViewer.DOMDocument.location.href !=
+              document.location.href ||
+            childDoc.location.href != "about:blank") {
+          array.push(childDoc);
+        }
+      }
+      catch (ex) {
+        // We've failed with this document somehow, but we're catching the
+        // error so the others will still work
+        dump(ex + "\n");
+      }
+    }
+  },
+
+ /**
+  * Creates a menu item for Inspect Document.
+  *
+  * @param doc
+  *        Document related to this menu item.
+  * @param docNumber
+  *        The position of the document.
+  */
+  addInspectDocumentMenuItem:
+    function IA_AddInspectDocumentMenuItem(parent, doc, docNumber)
+  {
+    var menuItem = document.createElementNS(kXULNSURI, "menuitem");
+    menuItem.doc = doc;
+    // Use the URL if there's no title
+    var title = doc.title || doc.location.href;
+    // The first ten items get numeric access keys
+    if (docNumber < 10) {
+      menuItem.setAttribute("label", docNumber + " " + title);
+      menuItem.setAttribute("accesskey", docNumber);
+    }
+    else {
+      menuItem.setAttribute("label", title);
+    }
+    parent.appendChild(menuItem);
+  },
+
+  setTargetApplicationAccessible: function setTargetApplicationAccessible()
+  {
+    var accService =
+      XPCU.getService(kAccessibleRetrievalContractID, "nsIAccessibleRetrieval");
+
+    if (accService) {
+      if ("getApplicationAccessible" in accService) {
+        this.mDocPanel.subject = accService.getApplicationAccessible();
+      }
+      else {
+        // Gecko 1.9.2 support.
+        var accessible = accService.getAccessibleFor(document);
+        while (accessible.parent) {
+          accessible = accessible.parent;
+        }
+        this.mDocPanel.subject = accessible;
+      }
+    }
+  },
+
+  setTargetWindow: function IA_SetTargetWindow(aWindow)
+  {
+    this.setTargetDocument(aWindow.document, true);
+  },
+
+  setTargetDocument: function IA_SetTargetDocument(aDoc, aIsInternal)
+  {
+    var cmd = document.getElementById("cmdToggleDocument");
+
+    if (aIsInternal == undefined) {
+      aIsInternal = false;
+    }
+
+    cmd.setAttribute("disabled", !aIsInternal);
+    this.setBrowser(aIsInternal, true);
+
+    this.mDocPanel.subject = aDoc;
+  },
+
+  get webNavigation()
+  {
+    var browser = document.getElementById("ifBrowser");
+    return browser.webNavigation;
+  },
+
+  get locationBar()
+  {
+    return document.getElementById("tfURLBar");
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// UI Labels Getters and Setters
+
+  get locationText()
+  {
+    return this.locationBar.value;
+  },
+
+  set locationText(aText)
+  {
+    this.locationBar.value = aText;
+  },
+
+  get statusText()
+  {
+    return document.getElementById("txStatus").value;
+  },
+
+  set statusText(aText)
+  {
+    document.getElementById("txStatus").value = aText;
+  },
+
+  get progress()
+  {
+    return document.getElementById("pmStatus").value;
+  },
+
+  set progress(aPct)
+  {
+    document.getElementById("pmStatus").value = aPct;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Document Loading
+
+  documentLoaded: function IA_DocumentLoaded()
+  {
+    this.setTargetWindow(content);
+
+    var url = this.webNavigation.currentURI.spec;
+
+    // put the url into the urlbar
+    this.locationText = url;
+
+    // add url to the history, unless explicity told not to
+    if (!this.mPendingNoSave) {
+      this.addToHistory(url);
+    }
+
+    this.mPendingURL = null;
+    this.mPendingNoSave = null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// History
+
+  addToHistory: function IA_AddToHistory(aURL)
+  {
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Uncategorized
+
+  get isViewingContent()
+  {
+    return this.mPanelSet.getPanel(0).subject != null;
+  },
+
+  fillInTooltip: function IA_FillInTooltip(aMenuItem)
+  {
+    var doc = aMenuItem.doc;
+    if (!doc) {
+      return false;
+    }
+
+    var titleLabel = document.getElementById("docItemsTitle");
+    var uriLabel = document.getElementById("docItemsURI");
+    titleLabel.value = doc.title;
+    uriLabel.value = doc.location.href;
+    titleLabel.hidden = !titleLabel.value;
+    return true;
+  },
+
+  initPopup: function IA_InitPopup(aPopup)
+  {
+    var items = aPopup.getElementsByTagName("menuitem");
+    var js, fn, item;
+    for (var i = 0; i < items.length; i++) {
+      item = items[i];
+      fn = "isDisabled" in item ? item.isDisabled : null;
+      if (!fn) {
+        js = item.getAttribute("isDisabled");
+        if (js) {
+          fn = new Function(js);
+          item.isDisabled = fn;
+        }
+        else {
+          // to prevent annoying "strict" warning messages
+          item.isDisabled = null;
+        }
+      }
+      if (fn) {
+        if (item.isDisabled()) {
+          item.setAttribute("disabled", "true");
+        }
+        else {
+          item.removeAttribute("disabled");
+        }
+      }
+
+      fn = null;
+    }
+  },
+
+  emptyChildren: function IA_EmptyChildren(aNode)
+  {
+    while (aNode.hasChildNodes()) {
+      aNode.removeChild(aNode.lastChild);
+    }
+  },
+
+  onSplitterOpen: function IA_OnSplitterOpen(aSplitter)
+  {
+    if (aSplitter.id == "splBrowser") {
+      this.setBrowser(aSplitter.isOpened, false);
+    }
+  },
+
+  onViewerListCommand: function IA_OnViewerListCommand(aItem)
+  {
+    var mpp = aItem.parentNode;
+    if (mpp == this.mDocViewerListPopup) {
+      this.mDocPanel.onViewerListCommand(aItem);
+    }
+    else if (mpp == this.mObjectViewerListPopup) {
+      this.mObjectPanel.onViewerListCommand(aItem);
+    }
+  },
+
+  // needed by overlayed commands from viewer to get references to a specific
+  // viewer object by name
+  getViewer: function IA_GetViewer(aUID)
+  {
+    return this.mPanelSet.registry.getViewerByUID(aUID);
+  }
+};
+
+////////////////////////////////////////////////////////////////////////////
+//// Event Listeners
+
+function BrowserPageShowListener(aEvent)
+{
+  // since we will also get pageshow events for frame documents,
+  // make sure we respond to the top-level document load
+  if (aEvent.target.defaultView == content) {
+    inspector.documentLoaded();
+  }
+}
diff --git a/suite/components/inspector/content/inspector.xml b/suite/components/inspector/content/inspector.xml
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/inspector.xml
@@ -0,0 +1,926 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<bindings id="ViewerPaneBindings"
+          xmlns="http://www.mozilla.org/xbl"
+          xmlns:xbl="http://www.mozilla.org/xbl"
+          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <!-- ***********************************************************************
+  * Inspector
+  *   Interface for a set of viewer panels.
+  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+  * REQUIRED IMPORTS:
+  *   chrome://inspector/content/jsutil/xpcom/XPCU.js
+  *   chrome://inspector/content/Flasher.js
+  *   chrome://inspector/content/ViewerRegistry.js
+  *   chrome://inspector/content/jsutil/events/ObserverManager.js
+  *   chrome://inspector/content/jsutil/system/PrefUtils.js
+  ************************************************************************ -->
+
+  <binding id="panelset"
+           extends="chrome://inspector/content/inspector.xml#base">
+    <content>
+      <xul:stringbundle src="chrome://inspector/locale/inspector.properties"/>
+      <children/>
+    </content>
+
+    <implementation>
+      <field name="mFocusedDocument">null</field>
+      <field name="mFocusedPanel">null</field>
+      <field name="mStringBundle">null</field>
+      <field name="mTransactionManager">null</field>
+
+      <property name="registry" readonly="true"
+                onget="return this.mRegistry"/>
+      <property name="initialized" readonly="true"
+                onget="return this.mInitialized"/>
+      <property name="focusedPanel" readonly="true"
+                onget="return this.mFocusedPanel;"/>
+      <property name="stringBundle" readonly="true"
+                onget="return this.mStringBundle;"/>
+      <property name="flasher" readonly="true"
+                onget="return this.mFlasher;"/>
+
+      <method name="initialize">
+        <body><![CDATA[
+          this.mRegistry = new ViewerRegistry();
+          this.mRegistry.load(kViewerRegURL, this);
+
+          this.mFlasher = new DOMIFlasher();
+
+          var tmClassID = "@mozilla.org/transactionmanager;1";
+          var tmIface = "nsITransactionManager";
+          this.mTransactionManager = XPCU.createInstance(tmClassID, tmIface);
+        ]]></body>
+      </method>
+
+      <method name="onEvent">
+        <parameter name="aEvent"/>
+        <body><![CDATA[
+          if (aEvent.type == "viewerChange") {
+            this.onViewerChange(aEvent);
+          }
+
+          // bubble the event up
+          this.mObsMan.dispatchEvent(aEvent.type, aEvent);
+        ]]></body>
+      </method>
+
+      <method name="onViewerRegistryLoad">
+        <body><![CDATA[
+          var panels = this.panels;
+          for (let i = 0; i < panels.length; ++i) {
+            panels[i].initialize();
+            panels[i].addObserver("viewerChange", this);
+            panels[i].addObserver("subjectChange", this);
+          }
+
+          this.updateViewerCommandsFor(null, null);
+          this.updateAllCommands();
+
+          this.mInitialized = true;
+          this.mObsMan.dispatchEvent("panelsetready", {});
+        ]]></body>
+      </method>
+
+      <method name="onViewerRegistryLoadError">
+        <body><![CDATA[
+          throw "Unable to load the Viewer Registry";
+        ]]></body>
+      </method>
+
+      <method name="onViewerChange">
+        <parameter name="aEvent"/>
+        <body><![CDATA[
+          // Update commands for the new viewer of the primary panel
+          // (currently driven viewers don't have own commands).
+          this.updateViewerCommandsFor(aEvent.newViewer.uid,
+                                       aEvent.oldViewer ?
+                                         aEvent.oldViewer.uid :
+                                         null);
+        ]]></body>
+      </method>
+
+      <property name="panels">
+        <getter>
+          return this.getElementsByTagName("domi-panel");
+        </getter>
+      </property>
+
+      <property name="panelCount">
+        <getter>
+          return this.panels.length;
+        </getter>
+      </property>
+
+      <method name="getPanel">
+        <parameter name="aIndex"/>
+        <body><![CDATA[
+          return this.panels[aIndex];
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// Global Commands -->
+
+      <method name="updateAllCommands">
+        <body><![CDATA[
+          var cmds =
+            document.getElementById(this.getAttribute("viewercommandset"));
+          if (!cmds) {
+            return;
+          }
+
+          var els = cmds.getElementsByAttribute("global", "true");
+          for (let i = 0; i < els.length; i++) {
+            this.updateCommand(els[i].id);
+          }
+        ]]></body>
+      </method>
+
+      <method name="updateCommand">
+        <parameter name="aCommand"/>
+        <body><![CDATA[
+          var enabled;
+          if (aCommand == "cmdEditUndo") {
+            enabled = this.mTransactionManager &&
+                      this.mTransactionManager.numberOfUndoItems > 0;
+          }
+          else if (aCommand == "cmdEditRedo") {
+            enabled = this.mTransactionManager &&
+                      this.mTransactionManager.numberOfRedoItems > 0;
+          }
+          else {
+            if (this.focusedPanel && this.focusedPanel.viewer) {
+              enabled = this.focusedPanel.viewer.isCommandEnabled(aCommand);
+            }
+          }
+          this.setCommandAttribute(aCommand, "disabled", !enabled);
+        ]]></body>
+      </method>
+
+      <method name="getCommandAttribute">
+        <parameter name="aCommand"/>
+        <parameter name="aAttribute"/>
+        <body><![CDATA[
+          var cmd = document.getElementById(aCommand);
+          return cmd ? cmd.getAttribute(aAttribute) : null;
+        ]]></body>
+      </method>
+
+      <method name="setCommandAttribute">
+        <parameter name="aCommand"/>
+        <parameter name="aAttribute"/>
+        <parameter name="aValue"/>
+        <body><![CDATA[
+          // set attribute on command in our document
+          var cmd = document.getElementById(aCommand);
+          if (cmd) {
+            if (aValue == false || aValue == "false") {
+              cmd.removeAttribute(aAttribute);
+            }
+            else {
+              cmd.setAttribute(aAttribute, aValue);
+            }
+          }
+
+          // set attribute on command in each viewer document
+          var panels = this.panels;
+          for (let i = 0; i < panels.length; ++i) {
+            var doc = panels[i].viewerDocument;
+            cmd = doc.getElementById(aCommand);
+            if (cmd) {
+              if (aValue == false || aValue == "false") {
+                cmd.removeAttribute(aAttribute);
+              }
+              else {
+                cmd.setAttribute(aAttribute, aValue);
+              }
+            }
+          }
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// Viewer-Specific Commands -->
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Update viewer-specific commands states in accordance with the current
+      // viewer.
+      //////////////////////////////////////////////////////////////////// -->
+      <method name="updateViewerCommandsFor">
+        <parameter name="aNewViewerUid"/>
+        <parameter name="aOldViewerUid"/>
+        <body><![CDATA[
+          let cmdsetElId = this.getAttribute("viewercommandset");
+          let cmdsetEl = document.getElementById(cmdsetElId);
+          if (!cmdsetEl) {
+            return;
+          }
+
+          let cmdEls = cmdsetEl.getElementsByAttribute("viewer", "*");
+          for (let idx = 0; idx < cmdEls.length; idx++) {
+            let cmdEl = cmdEls[idx];
+
+            if (!aNewViewerUid && !aOldViewerUid) {
+              cmdEl.setAttribute("disabled", "true");
+              continue;
+            }
+
+            let viewerUids = cmdEl.getAttribute("viewer");
+            let viewerUidArray = viewerUids.split(/\s/);
+
+            if (aNewViewerUid && viewerUidArray.indexOf(aNewViewerUid) != -1) {
+              cmdEl.removeAttribute("disabled");
+
+            }
+            else if (aOldViewerUid &&
+                     viewerUidArray.indexOf(aOldViewerUid) != -1) {
+              cmdEl.setAttribute("disabled", "true");
+            }
+          }
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// Command Execution -->
+
+      <method name="execCommand">
+        <parameter name="aCommand"/>
+        <body><![CDATA[
+          if (aCommand == "cmdEditUndo") {
+            this.mTransactionManager.undoTransaction();
+          }
+          else if (aCommand == "cmdEditRedo") {
+            this.mTransactionManager.redoTransaction();
+          }
+          else {
+            if (!this.focusedPanel) {
+              return;
+            }
+
+            // if the command is enabled, execute it
+            var viewer = this.focusedPanel.viewer;
+            if (!viewer.isCommandEnabled(aCommand)) {
+              return;
+            }
+            var command = viewer.getCommand(aCommand);
+            if (!command) {
+              return;
+            }
+
+            this.mTransactionManager.doTransaction(command);
+          }
+
+          this.updateCommand("cmdEditUndo");
+          this.updateCommand("cmdEditRedo");
+        ]]></body>
+      </method>
+
+      <method name="addTransactionListener">
+        <parameter name="aListener"/>
+        <body><![CDATA[
+          this.mTransactionManager.AddListener(aListener);
+        ]]></body>
+      </method>
+
+      <method name="removeTransactionListener">
+        <parameter name="aListener"/>
+        <body><![CDATA[
+          this.mTransactionManager.RemoveListener(aListener);
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// Clipboard -->
+
+      <field name="mClipboard">null</field>
+      <field name="mClipboardData">null</field>
+      <field name="mClipboardFlavor">null</field>
+      <field name="mClipboardHelper">null</field>
+
+      <property name="clipboardFlavor" readonly="true"
+                onget="return this.mClipboardFlavor"/>
+
+      <property name="clipboard" readonly="true">
+        <getter>
+        <![CDATA[
+          if (!this.mClipboard) {
+            var iid = Components.interfaces.nsIClipboard;
+            var cid = "@mozilla.org/widget/clipboard;1";
+            this.mClipboard = Components.classes[cid].createInstance(iid);
+          }
+          return this.mClipboard;
+        ]]></getter>
+      </property>
+
+      <property name="clipboardHelper" readonly="true">
+        <getter>
+        <![CDATA[
+          if (!this.mClipboardHelper) {
+            this.mClipboardHelper =
+              Components.classes["@mozilla.org/widget/clipboardhelper;1"]
+                .getService(Components.interfaces.nsIClipboardHelper);
+          }
+          return this.mClipboardHelper;
+        ]]></getter>
+      </property>
+
+      <method name="setClipboardData">
+        <parameter name="aObject"/>
+        <parameter name="aFlavor"/>
+        <parameter name="aTextRepresentation"/>
+        <body><![CDATA[
+          // put the text representation on the system clipboard
+          if (aTextRepresentation) {
+            this.clipboardHelper.copyString(aTextRepresentation);
+          }
+
+          // store the real object internally
+          this.mClipboardData = aObject;
+          this.mClipboardFlavor = aFlavor;
+
+          this.updateCommand("cmdEditPaste");
+        ]]></body>
+      </method>
+
+      <method name="getClipboardData">
+        <body><![CDATA[
+          return this.mClipboardData;
+        ]]></body>
+      </method>
+
+      <constructor><![CDATA[
+        this.mStringBundle = document.getAnonymousNodes(this)[0];
+      ]]></constructor>
+
+      <destructor>
+        this.mFlasher.destroy();
+        this.mFlasher = null;
+      </destructor>
+    </implementation>
+
+    <handlers>
+      <handler event="focus" phase="capturing">
+      <![CDATA[
+        if (!(event.originalTarget instanceof Element)) {
+          return;
+        }
+
+        var targetDoc = event.originalTarget.ownerDocument;
+        if (targetDoc == this.mFocusedDocument) {
+          return;
+        }
+
+        this.mFocusedDocument = targetDoc;
+
+        if (targetDoc != this.ownerDocument) {
+          var panels = this.panels;
+          for (let i = 0; i < panels.length; ++i) {
+            if (targetDoc == panels[i].viewerDocument) {
+              this.mFocusedPanel = panels[i];
+              this.updateAllCommands();
+              return;
+            }
+          }
+        }
+
+        this.mFocusedPanel = null; // if all else fails
+      ]]>
+      </handler>
+    </handlers>
+
+  </binding>
+
+  <!-- ************************************************************************
+  * ViewerPane
+  *  Interface for a panel accepts a node and displays all eligible
+  *  viewers in a list and activates the selected viewer.
+  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+  * REQUIRED IMPORTS:
+  *   chrome://inspector/content/jsutil/xpcom/XPCU.js
+  *   chrome://inspector/content/jsutil/events/ObserverManager.js
+  ************************************************************************ -->
+
+  <binding id="panel" extends="chrome://inspector/content/inspector.xml#base">
+    <content orient="vertical">
+      <xul:toolbox class="viewer-pane-toolbox" xbl:inherits="disabled">
+        <xul:toolbar class="viewer-pane-header" align="center"
+                     xbl:inherits="disabled" xpfe="false">
+          <xul:toolbarbutton type="menu" anonid="viewer-list"
+                             class="viewer-list" disabled="true"/>
+          <xul:label anonid="viewer-title" class="viewer-title label toolbar"
+                     flex="1"/>
+          <xul:toolbarbutton type="menu" anonid="viewer-menu"
+                             class="viewer-menu" disabled="true"/>
+        </xul:toolbar>
+      </xul:toolbox>
+      <xul:box class="viewer-pane-box-1" flex="1">
+        <xul:box class="viewer-pane-box-2" flex="1">
+          <xul:browser anonid="viewer-iframe" class="viewer-iframe"
+                       disablehistory="true" disablesecurity="true" flex="1"/>
+        </xul:box>
+      </xul:box>
+    </content>
+
+    <resources>
+      <stylesheet src="chrome://inspector/skin/panelset.css"/>
+    </resources>
+
+    <implementation>
+      <field name="mCurrentEntry">null</field>
+      <field name="mCurrentViewer">null</field>
+      <field name="mSubject">null</field>
+      <field name="mParams">null</field>
+      <field name="mParamsPending">null</field>
+
+      <constructor><![CDATA[
+        // look for panelset parent
+        var p = this.parentNode;
+        while (p && p.localName != "domi-panelset") {
+          p = p.parentNode;
+        }
+
+        this.mPanelSet = p;
+
+        this.setAttribute("disabled", "true");
+
+        this.mIFrameEl =
+          document.getAnonymousElementByAttribute(this, "anonid",
+                                                  "viewer-iframe");
+      ]]></constructor>
+
+      <destructor><![CDATA[
+        if (this.mCurrentViewer) {
+          this.destroyViewer();
+        }
+      ]]></destructor>
+
+      <property name="panelset"
+                onget="return this.mPanelSet;"/>
+
+      <property name="viewer"
+                onget="return this.mCurrentViewer;"/>
+
+      <property name="subject"
+                onget="return this.mSubject;"
+                onset="this.setSubject(val);"/>
+
+      <property name="params">
+        <getter><![CDATA[
+          return this.mParams;
+        ]]></getter>
+        <setter><![CDATA[
+          // Don't let the params get nulled out before anyone gets to use them.
+          this.mParamsPending = true;
+          return this.mParams = val;
+        ]]></setter>
+      </property>
+
+      <property name="title"
+                onget="return this.getAttribute('title');"
+                onset="return this.setAttribute('title', val);"/>
+
+      <property name="registry"
+                onget="return this.panelset.registry;"/>
+
+      <property name="viewerDocument"
+                onget="return this.mIFrameEl.contentDocument;"/>
+
+      <property name="linkedPanel">
+        <getter><![CDATA[
+          return this.mLinkedPanel;
+        ]]></getter>
+        <setter><![CDATA[
+          if (this.mLinkedPanel) {
+            this.mLinkedPanel.removeObserver("viewerChange", this);
+          }
+
+          this.mLinkedPanel = val;
+
+          if (val) {
+            val.addObserver("viewerChange", this);
+          }
+        ]]></setter>
+      </property>
+
+      <field name="mLinkedPanel">null</field>
+      <field name="mLinkedViewer">null</field>
+      <field name="mCurrentViewer">null</field>
+      <field name="mCurrentEntry">null</field>
+      <field name="mCachedEntries">null</field>
+
+      <method name="initialize">
+        <body><![CDATA[
+          this.mListEl =
+            document.getAnonymousElementByAttribute(this, "anonid",
+                                                    "viewer-list");
+          this.mTitleEl =
+            document.getAnonymousElementByAttribute(this, "anonid",
+                                                    "viewer-title");
+          this.mMenuEl =
+            document.getAnonymousElementByAttribute(this, "anonid",
+                                                    "viewer-menu");
+
+          if (this.hasAttribute("linkedpanel")) {
+            this.linkedPanel =
+              document.getElementById(this.getAttribute("linkedpanel"));
+          }
+
+          this.fillViewerList();
+        ]]></body>
+      </method>
+
+      <method name="notifyViewerReady">
+        <parameter name="aViewer"/>
+        <body><![CDATA[
+          var old = this.mCurrentViewer;
+          this.mCurrentViewer = aViewer;
+          var oldEntry = this.mCurrentEntry;
+          this.mCurrentEntry = this.mPendingEntry;
+
+          if (aViewer) {
+            this.registry.cacheViewer(aViewer, this.mCurrentEntry);
+            var title = this.registry.getEntryProperty(this.mCurrentEntry,
+                                                       "description");
+            this.setTitle(title);
+          }
+          else {
+            this.setTitle(null);
+          }
+
+          this.rebuildViewerContextMenu();
+          this.updateViewerListSelection(this.mListElPopup);
+
+          // listen for subjectChange so we can bubble it
+          if (old) {
+            old.removeObserver("subjectChange", this);
+          }
+
+          if (aViewer) {
+            aViewer.addObserver("subjectChange", this);
+          }
+
+          this.mObsMan.dispatchEvent("viewerChange",
+            { viewerPane: this, oldViewer: old, newViewer: aViewer });
+
+          if (aViewer) {
+            aViewer.subject = this.mSubject;
+            // only give initial focus to panes that are not on the right side
+            // of a link
+            if (!aViewer.pane.hasAttribute("linkedpanel")) {
+              var doc = aViewer.pane.viewerDocument;
+              doc.commandDispatcher
+                .advanceFocusIntoSubtree(doc.documentElement);
+            }
+          }
+        ]]></body>
+      </method>
+
+      <method name="destroyViewer">
+        <body><![CDATA[
+          this.mCurrentViewer.destroy();
+          this.registry.uncacheViewer(this.mCurrentViewer);
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// UI Commands -->
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Sets the new view to the item just selected from the "viewer list"
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="onViewerListCommand">
+        <parameter name="aItem"/>
+        <body><![CDATA[
+          this.switchViewer(parseInt(aItem.getAttribute("viewerListEntry")));
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Prepares the list of viewers for a node, rebuilds the menulist to
+      // display them, and load the default viewer for the node.
+      //
+      // @param aObject
+      //        the object to begin viewing
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="setSubject">
+        <parameter name="aObject"/>
+        <body><![CDATA[
+          // Check if someone wanted to pass some parameters in.
+          if (this.mParamsPending) {
+            this.mParamsPending = false;
+          }
+          else {
+            this.mParams = null;
+          }
+
+          var didRebuild = false;
+          var entries = this.mCachedEntries;
+          if (this.mSubject != aObject || !entries) {
+            this.mSubject = aObject;
+            entries = this.registry.findViewersForObject(aObject, this.id,
+                                                         this.mLinkedViewer);
+            // It's possible that the entries will be the same, even for
+            // different objects.  If they are, we can forego the DOM
+            // manipulations involved in rebuilding.
+            if (!this.mCachedEntries ||
+                this.mCachedEntries.toString() != entries.toString()) {
+              this.mCachedEntries = entries;
+              this.rebuildViewerList(this.mListElPopup);
+              didRebuild = true;
+            }
+          }
+
+          if (entries.length == 0) {
+            this.switchViewer(-1);
+            this.setAttribute("disabled", "true");
+          }
+          else if (entries.indexOf(this.mCurrentEntry) < 0) {
+            this.switchViewer(entries[0]);
+            this.removeAttribute("disabled");
+          }
+          else {
+            this.mCurrentViewer.subject = aObject;
+            this.removeAttribute("disabled");
+            if (didRebuild) {
+              // We need to ensure here that the viewer list selection gets
+              // updated, because otherwise it will only get updated when a
+              // new viewer loads and calls notifyViewerReady.
+              this.updateViewerListSelection(this.mListElPopup);
+            }
+          }
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Clear out and rebuild the menulist full of the available views for
+      // the currently selected node.
+      //
+      // @param aPopup
+      //        the menupopup to which the items should be added
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="rebuildViewerList">
+        <parameter name="aPopup"/>
+        <body><![CDATA[
+          var entries = this.mCachedEntries;
+          if (entries.length <= 0) {
+            aPopup.parentNode.setAttribute("disabled", true);
+          }
+          else {
+            aPopup.parentNode.removeAttribute("disabled");
+          }
+
+          // empty the list
+          while (aPopup.firstChild) {
+            aPopup.removeChild(aPopup.firstChild);
+          }
+
+          for (let i = 0; i < entries.length; i++) {
+            let entry = entries[i];
+            let menuitem = aPopup.ownerDocument.createElement("menuitem");
+            menuitem.setAttribute("label",
+                                  this.registry
+                                    .getEntryProperty(entry, "description"));
+            menuitem.setAttribute("viewerListEntry", entry);
+            menuitem.setAttribute("type", "radio");
+            menuitem.setAttribute("name", "viewerListEntries");
+            aPopup.appendChild(menuitem);
+          }
+        ]]></body>
+      </method>
+
+      <method name="updateViewerListSelection">
+        <parameter name="aPopup"/>
+        <body><![CDATA[
+          // Uncheck any previously checked items.
+          var checked = aPopup.getElementsByAttribute("checked", "true");
+          if (checked.length > 1) {
+            Components.utils.reportError("expected only zero or one checked items");
+          }
+          while (checked.length) {
+            checked[0].removeAttribute("checked");
+          }
+          var entry = this.mCurrentEntry;
+          checked = aPopup.getElementsByAttribute("viewerListEntry", entry);
+          if (checked.length == 1) {
+            checked[0].setAttribute("checked", "true");
+          }
+          else {
+            Components.utils.reportError("expected one item to match entry " +
+                                         entry);
+          }
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Loads the viewer described by an entry in the viewer registry.
+      //
+      // @param aEntry
+      //        entry index in the viewer registry
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="switchViewer">
+        <parameter name="aEntry"/>
+        <body><![CDATA[
+          if (aEntry < 0) { // -1 is for null viewer
+            this.mPendingEntry = -1;
+            this.notifyViewerReady(null);
+            return;
+          }
+
+          var url = this.registry.getEntryURL(aEntry);
+
+          var loadNew = true;
+          if (this.mCurrentViewer) {
+            var oldURL = this.registry.getEntryURL(this.mCurrentEntry);
+            if (oldURL == url) {
+              loadNew = false;
+            }
+          }
+
+          if (loadNew) {
+            this.mPendingEntry = aEntry;
+            this.loadViewerURL(url);
+          }
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Begin loading a new viewer from a given url.
+      //
+      // @param aURL
+      //        the url of the viewer document
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="loadViewerURL">
+        <parameter name="aURL"/>
+        <body><![CDATA[
+          if (this.mCurrentViewer) {
+            // tell the old viewer it's about to go away
+            this.destroyViewer();
+          }
+
+          // load the new document
+          FrameExchange.loadURL(this.mIFrameEl, aURL, this);
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Rebuild the viewer context menu
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="rebuildViewerContextMenu">
+        <body><![CDATA[
+          if (!this.mSubject) {
+            this.mMenuEl.setAttribute("disabled", "true");
+            return;
+          }
+          else {
+            this.mMenuEl.removeAttribute("disabled");
+          }
+
+          // remove old context menu
+          if (this.mContextMenu) {
+            this.mMenuEl.removeChild(this.mContextMenu);
+            this.mFormerContextParent.appendChild(this.mContextMenu);
+          }
+
+          var uid = this.registry.getEntryProperty(this.mCurrentEntry, "uid");
+          var ppId = "ppViewerContext-" + uid;
+          var pp = document.getElementById(ppId);
+          if (pp) {
+            this.mMenuEl.removeAttribute("disabled");
+            var parent = pp.parentNode;
+            parent.removeChild(pp);
+            this.mMenuEl.appendChild(pp);
+
+           this.mFormerContextParent = parent;
+          }
+          else {
+            this.mMenuEl.setAttribute("disabled", "true");
+          }
+          this.mContextMenu = pp;
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Set the text in the viewer title bar
+      //
+      // @param title
+      //        the text to use
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="setTitle">
+        <parameter name="aTitle"/>
+        <body><![CDATA[
+          this.mTitleEl.setAttribute("value",
+                                     this.title && aTitle ?
+                                       this.title + " - " + aTitle :
+                                       "");
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Fill out the content of the "viewer list" menu
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="fillViewerList">
+        <body><![CDATA[
+          this.mListEl.pViewer = this;
+          this.mListEl.setAttribute("oncommand",
+                                    "this.pViewer.onViewerListCommand(event.originalTarget)");
+
+          var mpp = document.createElement("menupopup");
+          this.mListEl.appendChild(mpp);
+          this.mListElPopup = mpp;
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Listen for selection changes on the viewer in the linked pane
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="observerLinkedViewer">
+        <body><![CDATA[
+          if (this.mLinkedViewer) {
+            this.mLinkedViewer.removeObserver("selectionChange", this);
+          }
+
+          this.mCachedEntries = null;
+          this.mLinkedViewer = this.mLinkedPanel.viewer;
+          this.mLinkedViewer.addObserver("selectionChange", this);
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // Update this pane's subject to be the selection of it's linked pane
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="updateLinkedSubject">
+        <body><![CDATA[
+          this.subject = this.mLinkedViewer.selection;
+        ]]></body>
+      </method>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      // global event handler
+      //////////////////////////////////////////////////////////////////// -->
+
+      <method name="onEvent">
+        <parameter name="aEvent"/>
+        <body><![CDATA[
+          switch (aEvent.type) {
+            case "viewerChange":
+              this.observerLinkedViewer();
+              break;
+            case "selectionChange":
+              this.updateLinkedSubject();
+              break;
+            case "subjectChange":
+              this.mObsMan.dispatchEvent("subjectChange", aEvent);
+          };
+        ]]></body>
+      </method>
+
+    </implementation>
+
+  </binding>
+
+  <binding id="base">
+    <implementation>
+      <constructor><![CDATA[
+        this.mObsMan = new ObserverManager(this);
+      ]]></constructor>
+
+      <!-- ///////////////////////////////////////////////////////////////////
+      //// Event Handling -->
+
+      <method name="addObserver">
+        <parameter name="aEvent"/>
+        <parameter name="aObserver"/>
+        <body><![CDATA[
+          this.mObsMan.addObserver(aEvent, aObserver);
+        ]]></body>
+      </method>
+
+      <method name="removeObserver">
+        <parameter name="aEvent"/>
+        <parameter name="aObserver"/>
+        <body><![CDATA[
+          this.mObsMan.removeObserver(aEvent, aObserver);
+        ]]></body>
+      </method>
+
+    </implementation>
+
+  </binding>
+
+</bindings>
diff --git a/suite/components/inspector/content/inspector.xul b/suite/components/inspector/content/inspector.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/inspector.xul
@@ -0,0 +1,58 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE window [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<?xul-overlay href="chrome://inspector/content/inspectorOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/toolboxOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/statusbarOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/inspectorWindow.css"?>
+
+<window id="winInspectorMain" title="&Inspector.title;"
+        width="640" height="480"
+        persist="screenX screenY width height sizemode"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <stringbundleset id="stringbundleset">
+    <stringbundle id="inspector-bundle"
+                  src="chrome://inspector/locale/inspector.properties"/>
+  </stringbundleset>
+  <popupset id="aTooltipSet"/>
+
+  <popupset id="ppsGlobalPopupset"/>
+  <popupset id="ppsViewerPopupset"/>
+
+  <keyset id="ksGlobalKeyset"/>
+  <commandset id="cmdsGlobalCommands"/>
+
+  <commandset id="tasksCommands">
+    <command id="cmd_quit"/>
+  </commandset>
+
+  <commandset id="baseMenuCommandSet"/>
+
+  <keyset id="tasksKeys">
+    <key id="key_saveInspector" key="&saveCmd.key;" command="cmdSave"
+         modifiers="accel"/>
+    <key id="key_closeInspector" key="&closeCmd.key;" command="cmdClose"
+         modifiers="accel"/>
+    <key id="key_quit"/>
+  </keyset>
+
+  <keyset id="baseMenuKeyset"/>
+
+  <toolbox id="tbxInsToolbox">
+    <menubar id="mbrInspectorMain"/>
+    <toolbar id="tbInspectorPrimary"/>
+  </toolbox>
+
+  <vbox id="bxInspectorMain" flex="1"/>
+</window>
diff --git a/suite/components/inspector/content/inspectorOverlay.xul b/suite/components/inspector/content/inspectorOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/inspectorOverlay.xul
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/inspector.dtd">
+
+<overlay id="ovInspector"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/inspector.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/ViewerRegistry.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/Flasher.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/FilePickerUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <vbox id="bxInspectorMain">
+
+    <domi-panelset id="bxPanelSet" flex="1"
+                   viewercommandset="cmdsGlobalCommands">
+      <domi-panel id="bxDocPanel" title="&bxDocPanel.title;"
+                  flex="1" persist="width"/>
+
+      <splitter id="splPanels" collapse="after">
+        <grippy/>
+      </splitter>
+
+      <domi-panel id="bxObjectPanel" title="&bxObjectPanel.title;"
+                  linkedpanel="bxDocPanel" flex="1" persist="width"/>
+    </domi-panelset>
+
+    <splitter id="splBrowser" class="titled-splitter"
+        onopen="inspector.onSplitterOpen(this)"
+        label="&browserPanel.label;" collapse="after"/>
+
+    <hbox id="bxBrowser" flex="1">
+      <browser id="ifBrowser" type="content" primary="true"
+               disablehistory="true" disablesecurity="true"
+               flex="1" src="about:blank"/>
+    </hbox>
+
+  </vbox>
+
+</overlay>
diff --git a/suite/components/inspector/content/jsutil/commands/baseCommands.js b/suite/components/inspector/content/jsutil/commands/baseCommands.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/commands/baseCommands.js
@@ -0,0 +1,164 @@
+/* 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/. */
+
+/*****************************************************************************
+* Base Commands --------------------------------------------------------------
+*   Transactions which can be used to implement common commands.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   (Other files may be necessary, depending on which base commands are used.)
+*****************************************************************************/
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kClipboardHelperClassID = "@mozilla.org/widget/clipboardhelper;1";
+
+//////////////////////////////////////////////////////////////////////////////
+//// Transactions
+
+/**
+ * Base implementation of an nsITransaction.
+ * @param aIsTransient [optional]
+ *        Override the isTransient field.  The default is true.
+ */
+function inBaseCommand(aIsTransient)
+{
+  if (aIsTransient !== undefined) {
+    this.isTransient = aIsTransient;
+  }
+}
+
+inBaseCommand.prototype = {
+  isTransient: true,
+
+  merge: function BaseCommand_Merge()
+  {
+    return false;
+  },
+
+  QueryInterface:
+    XPCOMUtils.generateQI([Components.interfaces.nsITransaction]),
+
+  doTransaction: function BaseCommand_DoTransaction() {},
+  undoTransaction: function BaseCommand_UndoTransaction() {},
+
+  redoTransaction: function BaseCommand_RedoTransaction()
+  {
+    this.doTransaction();
+  }
+};
+
+/**
+ * Open the object "mini" viewer (object.xul) on a given object.  The mObject
+ * field should be overridden to contain the object to be inspected.
+ *
+ * Primitives are uninteresting and attempts to inspect them will fail.
+ * Consumers should take this into account when determining whether the
+ * corresponding command should be enabled.  For convenience,
+ * cmdEditInspectInNewWindowBase.isInspectable is provided.
+ */
+function cmdEditInspectInNewWindowBase()
+{
+  this.mObject = null;
+}
+
+cmdEditInspectInNewWindowBase.isInspectable =
+  function InspectInNewWindowBase_IsInspectable(aValue)
+{
+  var type = typeof aValue;
+  return (type == "object" && aValue !== null) || type == "function";
+};
+
+cmdEditInspectInNewWindowBase.prototype = new inBaseCommand();
+
+cmdEditInspectInNewWindowBase.prototype.doTransaction =
+  function InspectInNewWindowBase_DoTransaction()
+{
+  if (cmdEditInspectInNewWindowBase.isInspectable(this.mObject)) {
+    inspectObject(this.mObject);
+  }
+};
+
+/**
+ * Copy a string to the clipboard.  The mString field should be overridden to
+ * contain the string to be copied.
+ */
+function cmdEditCopySimpleStringBase()
+{
+  this.mString = null;
+}
+
+cmdEditCopySimpleStringBase.prototype = new inBaseCommand();
+
+cmdEditCopySimpleStringBase.prototype.doTransaction =
+  function CopySimpleStringBase_DoTransaction()
+{
+  if (this.mString) {
+    var helper = XPCU.getService(kClipboardHelperClassID,
+                                 "nsIClipboardHelper");
+    helper.copyString(this.mString);
+  }
+};
+
+/**
+ * An nsITransaction to copy items to the panelset clipboard.
+ * @param aObjects
+ *        an array of objects that define a clipboard flavor, a delimiter, and
+ *        toString().
+ */
+function cmdEditCopy(aObjects)
+{
+  this.mObjects = aObjects;
+}
+
+cmdEditCopy.prototype = new inBaseCommand();
+
+cmdEditCopy.prototype.doTransaction = function Utils_Copy_DoTransaction()
+{
+  if (this.mObjects.length == 1) {
+    viewer.pane.panelset.setClipboardData(this.mObjects[0],
+                                          this.mObjects[0].flavor,
+                                          this.mObjects.toString());
+  }
+  else {
+    var joinedObjects = this.mObjects.join(this.mObjects[0].delimiter);
+    viewer.pane.panelset.setClipboardData(this.mObjects,
+                                          this.mObjects[0].flavor + "s",
+                                          joinedObjects);
+  }
+}
+
+/**
+ * Open a source view on a file.  The mURI field should be overridden to
+ * contain the URI of the file on which to open the source view.  The
+ * mLineNumber field may optionally be set to contain the line number at which
+ * the source view should be opened.
+ */
+function cmdEditViewFileURIBase()
+{
+  this.mURI = null;
+  this.mLineNumber = 0;
+}
+
+cmdEditViewFileURIBase.prototype = new inBaseCommand();
+
+cmdEditViewFileURIBase.prototype.doTransaction =
+  function ViewFileURIBase_DoTransaction()
+{
+  if (this.mURI) {
+    // 1.9.0 toolkit doesn't have this method
+    if ("viewSource" in gViewSourceUtils) {
+      gViewSourceUtils.viewSource(this.mURI, null, null, this.mLineNumber);
+    }
+    else {
+      openDialog("chrome://global/content/viewSource.xul",
+                 "_blank",
+                 "all,dialog=no",
+                 this.mURI, null, null, this.mLineNumber, null);
+    }
+  }
+};
diff --git a/suite/components/inspector/content/jsutil/events/ObserverManager.js b/suite/components/inspector/content/jsutil/events/ObserverManager.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/events/ObserverManager.js
@@ -0,0 +1,62 @@
+/* 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/. */
+
+/***************************************************************
+* ObserverManager -----------------------------------------------
+*  Manages observer and event dispatching for an object.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+////////////////////////////////////////////////////////////////////////////
+//// class ObserverManager
+
+function ObserverManager(aTarget)
+{
+  this.mTarget = aTarget;
+  this.mObservers = {};
+}
+
+ObserverManager.prototype = 
+{
+  addObserver: function(aEventName, aObserver)
+  {
+    var list;
+    if (!(aEventName in this.mObservers)) {
+      list = [];
+      this.mObservers[aEventName] = list;
+    } else
+      list = this.mObservers[aEventName];
+      
+    
+    list.push(aObserver);
+  },
+
+  removeObserver: function(aEventName, aObserver)
+  {
+    if (aEventName in this.mObservers) {
+      var list = this.mObservers[aEventName];
+      for (var i = 0; i < list.length; ++i) {
+        if (list[i] == aObserver) {
+          list.splice(i, 1);
+          return;
+        }
+      }
+    }
+  },
+
+  dispatchEvent: function(aEventName, aEventData)
+  {
+    if (aEventName in this.mObservers) {
+      if (!("target" in aEventData))
+        aEventData.target = this.mTarget;
+      aEventData.type = aEventName;
+      
+      var list = this.mObservers[aEventName];
+      for (var i = 0; i < list.length; ++i)
+        list[i].onEvent(aEventData);
+    }
+  }
+
+};
diff --git a/suite/components/inspector/content/jsutil/rdf/RDFArray.js b/suite/components/inspector/content/jsutil/rdf/RDFArray.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/rdf/RDFArray.js
@@ -0,0 +1,163 @@
+/* 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/. */
+
+/***************************************************************
+* RDFArray -----------------------------------------------
+*  A convenience routine for creating an RDF-based 2d array 
+*  indexed by number and hashkey.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/rdf/RDFU.js
+****************************************************************/
+
+//////////// global constants ////////////////////
+
+RDFArray.URI = "http://www.joehewitt.com/mozilla/util/RDFArray#";
+RDFArray.RDF_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+  
+///// class RDFArray /////////////////////////
+
+function RDFArray(aNSURI, aRootURN, aArcName)
+{
+  this.mNSURI = aNSURI;
+  this.mRootURN = aRootURN;
+  this.mArcName = aArcName ? aArcName : "list";
+}
+
+RDFArray.prototype = {
+  get datasource() { return this.mDS; },
+  get length() { return this.mLength } ,
+  
+  initialize: function()
+  {
+    this.mLength = 0;
+  
+    this.mDS = XPCU.createInstance("@mozilla.org/rdf/datasource;1?name=in-memory-datasource", "nsIRDFDataSource");
+  
+    var root = gRDF.GetResource(this.mRootURN);
+    var res = gRDF.GetAnonymousResource();
+    this.mDS.Assert(root, gRDF.GetResource(this.mNSURI+this.mArcName), res, true);
+  
+    this.mSeq = gRDFCU.MakeSeq(this.mDS, res); 
+  },
+
+  add: function(aObject)
+  {
+    var res = this.createResourceFrom(aObject);
+    this.addResource(res);
+  },
+
+  addResource: function(aResource)
+  {
+    this.mSeq.AppendElement(aResource);
+    this.mLength++;
+  },
+  
+  insertAt: function(aIndex, aObject)
+  {
+    var res = this.createResourceFrom(aObject);
+    this.insertResourceAt(aIndex, res);
+  },
+
+  insertResourceAt: function(aIndex, aResource)
+  {
+  },
+
+  removeAt: function(aIndex)
+  {
+    this.mSeq.RemoveElementAt(aIndex+1, true);
+    this.mLength--;
+  },
+  
+  removeById: function(aId)
+  {
+    var proj = gRDF.GetResource(aId);
+    proj = XPCU.QI(proj, "nsIRDFNode");
+    this.mSeq.RemoveElement(proj, true);
+    this.mLength--;
+  },
+  
+  get: function(aIndex, aKey)
+  {
+    var res = RDFU.getSeqElementAt(this.mSeq, aIndex);
+    return RDFU.readAttribute(this.mDS, res, this.mNSURI+aKey);
+  },
+  
+  set: function(aIndex, aKey, aValue)
+  {
+    var res = RDFU.getSeqElementAt(this.mSeq, aIndex);
+    RDFU.writeAttribute(this.mDS, res, this.mNSURI+aKey, aValue);
+  },
+  
+  getResource: function(aIndex)
+  {
+    return RDFU.getSeqElementAt(this.mSeq, aIndex);
+  },
+
+  getResourceId: function(aIndex)
+  {
+    var el = RDFU.getSeqElementAt(this.mSeq, aIndex);
+    return el.Value;
+  },
+
+  save: function()
+  {
+    RDFU.saveDataSource(this.mDS);
+  },
+
+
+  clear: function()
+  {
+    while (this.mLength) {
+      this.mSeq.RemoveElementAt(1, true);
+      this.mLength--;
+    }
+  },
+
+  createResourceFrom: function(aObject)
+  {
+    var el = gRDF.GetAnonymousResource();
+
+    // add a literal node for each property being added
+    for (var name in aObject) {
+      this.mDS.Assert(el, gRDF.GetResource(this.mNSURI+name), gRDF.GetLiteral(aObject[name]), true);
+    }
+    
+    return el;
+  }
+
+};
+
+/////////// static factory methods /////////////////////////
+
+RDFArray.fromContainer = function(aDS, aResourceID, aNSURI) 
+{
+  var list = new RDFArray(aNSURI);
+
+  list.mDS = aDS;
+  var seq = RDFU.findSeq(aDS, aResourceID);
+  list.mSeq = seq;
+  list.mLength = seq.GetCount();
+
+  return list;
+}
+
+RDFArray.fromContainerArc = function(aDS, aSourceId, aTargetId, aNSURI) 
+{
+  var list = new RDFArray(aNSURI);
+  list.mDS = aDS;
+
+  var source = gRDF.GetResource(aSourceId);
+  var target = gRDF.GetResource(aTargetId);
+  var seqRes = aDS.GetTarget(source, target, true);
+
+  var seq = RDFU.makeSeq(aDS, seqRes);
+  list.mSeq = seq;
+  list.mLength = seq.GetCount();
+
+  return list;
+}
+
diff --git a/suite/components/inspector/content/jsutil/rdf/RDFU.js b/suite/components/inspector/content/jsutil/rdf/RDFU.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/rdf/RDFU.js
@@ -0,0 +1,121 @@
+/* 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/. */
+
+/***************************************************************
+* RDFU -----------------------------------------------
+*  Convenience routines for common RDF commands.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+//////////// global constants ////////////////////
+
+try {
+var gRDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService();
+gRDF = gRDF.QueryInterface(Components.interfaces.nsIRDFService);
+
+var gRDFCU = Components.classes['@mozilla.org/rdf/container-utils;1'].getService();
+gRDFCU = gRDFCU.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
+} catch (ex) { alert("RDFU: " + ex);  }
+///////////////////////////////////////////////////
+
+var RDFU = {
+  
+  getSeqElementAt: function(aSeq, aIndex)
+  {
+  	var ordinal = gRDFCU.IndexToOrdinalResource(aIndex+1);
+    return aSeq.DataSource.GetTarget(aSeq.Resource, ordinal, true);
+  },
+  
+  readAttribute: function(aDS, aRes, aName)
+  {
+  	var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
+    if (attr)
+    	attr = XPCU.QI(attr, "nsIRDFLiteral");
+  	return attr ? attr.Value : null;
+  },
+  
+  
+  writeAttribute: function(aDS, aRes, aName, aValue)
+  {
+  	var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
+    if (attr)
+    	aDS.Change(aRes, gRDF.GetResource(aName), attr, gRDF.GetLiteral(aValue));
+  },
+  
+  
+  findSeq: function(aDS, aResName)
+  {
+  	try {
+      var res = gRDF.GetResource(aResName);
+      var seq = this.makeSeq(aDS, res);
+    } catch (ex) { 
+      alert("Unable to find sequence:" + ex); 
+    }
+  
+    return seq;
+  },
+  
+  makeSeq: function(aDS, aRes)
+  {
+    var seq = XPCU.createInstance("@mozilla.org/rdf/container;1", "nsIRDFContainer");
+  	seq.Init(aDS, aRes);
+    return seq;
+  },
+  
+  createSeq: function(aDS, aBaseRes, aArcRes)
+  {
+    var res = gRDF.GetAnonymousResource();
+    aDS.Assert(aBaseRes, aArcRes, res, true);
+    var seq = gRDFCU.MakeSeq(aDS, res); 
+    return seq;
+  },
+  
+  loadDataSource: function(aURL, aListener) 
+  {
+  	var ds = gRDF.GetDataSource(aURL);
+    var rds = XPCU.QI(ds, "nsIRDFRemoteDataSource");
+    
+    var observer = new DSLoadObserver(aListener);
+    
+    if (rds.loaded) {
+    	observer.onEndLoad(ds);
+    } else {
+      var sink = XPCU.QI(ds, "nsIRDFXMLSink");
+      sink.addXMLSinkObserver(observer);
+    }
+  },
+  
+  saveDataSource: function(aDS)
+  {
+    var ds = XPCU.QI(aDS, "nsIRDFRemoteDataSource");
+    ds.Flush();
+  }
+};
+
+///////////
+
+function DSLoadObserver(aListener) { this.mListener = aListener; }
+
+DSLoadObserver.prototype = 
+{
+  onBeginLoad: function(aSink) { },
+  onInterrupt: function(aSink) {},
+  onResume: function(aSink) {},
+  onError: function(aSink, aStatus, aErrorMsg) 
+  { 
+    this.mListener.onError(aStatus, aErrorMsg);
+    aSink.removeXMLSinkObserver(this);
+  },
+  
+  onEndLoad: function(aSink) 
+  { 
+    var ds = XPCU.QI(aSink, "nsIRDFDataSource");
+    this.mListener.onDataSourceReady(ds);
+    aSink = XPCU.QI(aSink, "nsIRDFXMLSink");
+    aSink.removeXMLSinkObserver(this);
+  }
+    
+};
diff --git a/suite/components/inspector/content/jsutil/system/DiskSearch.js b/suite/components/inspector/content/jsutil/system/DiskSearch.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/system/DiskSearch.js
@@ -0,0 +1,66 @@
+/* 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/. */
+
+/***************************************************************
+* DiskSearch -------------------------------------------------
+*  A utility for handily searching the disk for files matching
+*  a certain criteria.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+//////////// global constants ////////////////////
+
+////////////////////////////////////////////////////////////////////////////
+//// class DiskSearch
+
+var DiskSearch =
+{
+  findFiles: function(aRootDir, aExtList, aRecurse)
+  {
+    // has the file extensions so we don't have to 
+    // linear search the array every time through
+    var extHash = {};
+    for (var i = 0; i < aExtList.length; i++) {
+      extHash[aExtList[i]] = true;
+    }
+
+    var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
+    this.fileHandler = ios.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
+
+    // recursively build the list of results
+    var results = [];
+    this.recurseDir(aRootDir, extHash, aRecurse, results);
+    return results;
+  },
+
+  recurseDir: function(aDir, aExtHash, aRecurse, aResults)
+  {
+    debug("("+aResults.length+") entering " + aDir.path + "\n");
+    var entries = aDir.directoryEntries;
+    var entry, ext;
+    while (entries.hasMoreElements()) {
+      entry = XPCU.QI(entries.getNext(), "nsIFile");
+      if (aRecurse && entry.isDirectory())
+        this.recurseDir(entry, aExtHash, aRecurse, aResults);
+      ext = this.getExtension(entry.leafName);
+      if (ext) {
+        if (aExtHash[ext])
+          aResults.push(this.fileHandler.getURLSpecFromFile(entry));
+      }
+    }
+  },
+
+  getExtension: function(aFileName)
+  {
+    var dotpt = aFileName.lastIndexOf(".");
+    if (dotpt)
+      return aFileName.substr(dotpt+1).toLowerCase();
+
+    return null;
+  }
+};
+
diff --git a/suite/components/inspector/content/jsutil/system/FilePickerUtils.js b/suite/components/inspector/content/jsutil/system/FilePickerUtils.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/system/FilePickerUtils.js
@@ -0,0 +1,90 @@
+/* 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/. */
+
+/***************************************************************
+* FilePickerUtils -------------------------------------------------
+*  A utility for easily dealing with the file picker dialog.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global constants ////////////////////
+
+const kFilePickerCID = "@mozilla.org/filepicker;1";
+const kLFileCID = "@mozilla.org/file/local;1";
+
+const nsIFilePicker = Components.interfaces.nsIFilePicker;
+
+////////////////////////////////////////////////////////////////////////////
+//// class FilePickerUtils
+
+var FilePickerUtils =
+{
+  pickFile: function(aTitle, aInitPath, aFilters, aMode)
+  {
+    try {
+      var modeStr = aMode ? "mode" + aMode : "modeOpen";
+      var mode;
+      try {
+        mode = nsIFilePicker[modeStr];
+      } catch (ex) { 
+        dump("WARNING: Invalid FilePicker mode '"+aMode+"'. Defaulting to 'Open'.\n");
+        mode = nsIFilePicker.modeOpen;
+      }
+      
+      var fp = XPCU.createInstance(kFilePickerCID, "nsIFilePicker");
+      fp.init(window, aTitle, mode);
+
+      // join array of filter names into bit string
+      var filters = this.prepareFilters(aFilters);
+
+      if (aInitPath) {
+        var dir = XPCU.createInstance(kLFileCID, "nsILocalFile");
+        dir.initWithPath(aInitPath);
+        fp.displayDirectory = dir;
+      }
+
+      if (fp.show() == nsIFilePicker.returnOK) {
+        return fp.file;
+      }
+    } catch (ex) {
+      dump("ERROR: Unable to open file picker.\n" + ex + "\n");
+    }
+    return null;
+  },
+
+  pickDir: function(aTitle, aInitPath)
+  {
+    try {
+      var fp = XPCU.createInstance(kFilePickerCID, "nsIFilePicker");
+      fp.init(window, aTitle, nsIFilePicker.modeGetFolder);
+
+      if (aInitPath) {
+        var dir = XPCU.createInstance(kLFileCID, "nsILocalFile");
+        dir.initWithPath(aInitPath);
+        fp.displayDirectory = dir;
+      }
+      
+      if (fp.show() == nsIFilePicker.returnOK) {
+        return fp.file;
+      }
+    } catch (ex) {
+      dump("ERROR: Unable to open directory picker.\n" + ex + "\n");
+    }
+
+    return null;
+  },
+  
+  prepareFilters: function(aFilters)
+  {
+    // join array of filter names into bit string
+    var filters = 0;
+    for (var i = 0; i < aFilters.length; ++i)
+      filters = filters | nsIFilePicker[aFilters[i]];
+    
+    return filters;
+  }
+   
+};
+
diff --git a/suite/components/inspector/content/jsutil/system/PrefUtils.js b/suite/components/inspector/content/jsutil/system/PrefUtils.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/system/PrefUtils.js
@@ -0,0 +1,85 @@
+/* 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/. */
+
+/***************************************************************
+* PrefUtils -------------------------------------------------
+*  Utility for easily using the Mozilla preferences system.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+****************************************************************/
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+//////////// global variables ////////////////////
+
+//////////// global constants ////////////////////
+const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
+
+////////////////////////////////////////////////////////////////////////////
+//// class PrefUtils
+
+var PrefUtils =
+{
+  mPrefs: null,
+
+  init: function()
+  {
+    var prefService = XPCU.getService("@mozilla.org/preferences-service;1", "nsIPrefService");
+    this.mPrefs = prefService.getBranch(null);
+  },
+
+  addObserver: function addObserver(aDomain, aFunction)
+  {
+    if (!this.mPrefs) this.init();
+
+    var pbi = XPCU.QI(this.mPrefs, "nsIPrefBranch");
+    if (pbi)
+      pbi.addObserver(aDomain, aFunction, false);
+  },
+
+  removeObserver: function removeObserver(aDomain, aFunction)
+  {
+    if (!this.mPrefs) this.init();
+
+    var pbi = XPCU.QI(this.mPrefs, "nsIPrefBranch");
+    if (pbi)
+      pbi.removeObserver(aDomain, aFunction);
+  },
+
+  setPref: function(aName, aValue)
+  {
+    if (!this.mPrefs) this.init();
+
+    var type = this.mPrefs.getPrefType(aName);
+    try {
+      if (type == nsIPrefBranch.PREF_STRING) {
+        this.mPrefs.setStringPref(aName, aValue);
+      } else if (type == nsIPrefBranch.PREF_BOOL) {
+        this.mPrefs.setBoolPref(aName, aValue);
+      } else if (type == nsIPrefBranch.PREF_INT) {
+        this.mPrefs.setIntPref(aName, aValue);
+      }
+    } catch(ex) {
+      debug("ERROR: Unable to write pref \"" + aName + "\".\n");
+    }
+  },
+
+  getPref: function(aName)
+  {
+    if (!this.mPrefs) this.init();
+
+    var type = this.mPrefs.getPrefType(aName);
+    try {
+      if (type == nsIPrefBranch.PREF_STRING) {
+        return this.mPrefs.getStringPref(aName);
+      } else if (type == nsIPrefBranch.PREF_BOOL) {
+        return this.mPrefs.getBoolPref(aName);
+      } else if (type == nsIPrefBranch.PREF_INT) {
+        return this.mPrefs.getIntPref(aName);
+      }
+    } catch(ex) {
+      debug("ERROR: Unable to read pref \"" + aName + "\".\n");
+    }
+    return null;
+  }
+};
diff --git a/suite/components/inspector/content/jsutil/system/clipboardFlavors.js b/suite/components/inspector/content/jsutil/system/clipboardFlavors.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/system/clipboardFlavors.js
@@ -0,0 +1,62 @@
+/* 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/. */
+
+/*****************************************************************************
+* Clipboard Flavors ----------------------------------------------------------
+*   Flavors for copying inspected data to the clipboard.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+* chrome://inspector/content/utils.js
+*****************************************************************************/
+
+/**
+ * Represents a CSS property.
+ * @param aProperty
+ *        the name of the property
+ * @param aValue
+ *        the value of the property
+ * @param aImportant
+ *        boolean indicating whether this is !important
+ */
+function CSSProperty(aProperty, aValue, aImportant)
+{
+  this.flavor = "inspector/css-property";
+  this.delimiter = "\n";
+  this.property = aProperty;
+  this.value = aValue;
+  this.important = aImportant == true;
+}
+
+/**
+ * Returns a usable CSS string for the CSSProperty.
+ * @return a string in the form "property: value;"
+ */
+CSSProperty.prototype.toString = function CSSProperty_ToString()
+{
+  return this.property + ": " + this.value + (this.important ?
+                                                " !important" :
+                                                "") + ";";
+}
+
+/**
+ * Represents a DOM attribute.
+ * @param aNode
+ *        the attribute node
+ */
+function DOMAttribute(aNode)
+{
+  this.flavor = "inspector/dom-attribute";
+  this.node = aNode.cloneNode(false);
+  this.delimiter = " ";
+}
+
+/**
+ * Returns a string representing an attribute name/value pair
+ * @return a string in the form of 'name="value"'
+ */
+DOMAttribute.prototype.toString = function DOMA_ToString()
+{
+  return this.node.nodeName + '="' +
+         InsUtil.unicodeToEntity(this.node.nodeValue) + '"';
+};
diff --git a/suite/components/inspector/content/jsutil/xpcom/XPCU.js b/suite/components/inspector/content/jsutil/xpcom/XPCU.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xpcom/XPCU.js
@@ -0,0 +1,36 @@
+/* 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/. */
+
+var XPCU = 
+{ 
+  getService: function(aURL, aInterface)
+  {
+    try {
+      return Components.classes[aURL].getService(Components.interfaces[aInterface]);
+    } catch (ex) {
+      dump("Error getting service: " + aURL + ", " + aInterface + "\n" + ex);
+      return null;
+    }
+  },
+
+  createInstance: function (aURL, aInterface)
+  {
+    try {
+      return Components.classes[aURL].createInstance(Components.interfaces[aInterface]);
+    } catch (ex) {
+      dump("Error creating instance: " + aURL + ", " + aInterface + "\n" + ex);
+      return null;
+    }
+  },
+
+  QI: function(aEl, aIName)
+  {
+    try {
+      return aEl.QueryInterface(Components.interfaces[aIName]);
+    } catch (ex) {
+      throw("Unable to QI " + aEl + " to " + aIName);
+    }
+  }
+
+};
\ No newline at end of file
diff --git a/suite/components/inspector/content/jsutil/xul/DNDUtils.js b/suite/components/inspector/content/jsutil/xul/DNDUtils.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/DNDUtils.js
@@ -0,0 +1,83 @@
+/* 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/. */
+
+/***************************************************************
+* DNDUtils -------------------------------------------------
+*  Utility functions for common drag and drop tasks.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var app;
+
+//////////// global constants ////////////////////
+
+////////////////////////////////////////////////////////////////////////////
+//// class DNDUtils
+
+var DNDUtils =
+{
+  invokeSession: function(aTarget, aTypes, aValues)
+  {
+    var transData, trans, supports;
+    let transArray = XPCU.createInstance("@mozilla.org/array;1", "nsIMutableArray");
+    for (var i = 0; i < aTypes.length; ++i) {
+      transData = this.createTransferableData(aValues[i]);
+      trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
+      trans.addDataFlavor(aTypes[i]);
+      trans.setTransferData (aTypes[i], transData.data, transData.size);
+      supports = trans.QueryInterface(Components.interfaces.nsISupports);
+      transArray.appendElement(supports, /* weak */ false);
+    }
+
+    var nsIDragService = Components.interfaces.nsIDragService;
+    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
+    dragService.invokeDragSession(aTarget, transArray, null, nsIDragService.DRAGDROP_ACTION_MOVE);
+  },
+  
+  createTransferableData: function(aValue)
+  {
+    var obj = {};
+    if (typeof(aValue) == "string") {
+      obj.data = XPCU.createInstance("@mozilla.org/supports-string;1", "nsISupportsString");
+      obj.data.data = aValue;
+      obj.size = aValue.length*2;
+    } else if (false) {
+      // TODO: create data for other primitive types
+    }
+    
+    return obj;
+  },
+  
+  checkCanDrop: function(aType)
+  {
+    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
+    var dragSession = dragService.getCurrentSession();
+    
+    var gotFlavor = false;
+    for (var i = 0; i < arguments.length; ++i)
+      gotFlavor |= dragSession.isDataFlavorSupported(arguments[i]); 
+
+    dragSession.canDrop = gotFlavor;
+    return gotFlavor;
+  },
+  
+  getData: function(aType, aIndex)
+  {
+    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
+    var dragSession = dragService.getCurrentSession();
+    
+    var trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
+    trans.addDataFlavor(aType);
+  
+    dragSession.getData(trans, aIndex);
+    var data = new Object();
+    trans.getAnyTransferData ({}, data, {});
+    return data.value;
+  }  
+  
+};
+
diff --git a/suite/components/inspector/content/jsutil/xul/FrameExchange.js b/suite/components/inspector/content/jsutil/xul/FrameExchange.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/FrameExchange.js
@@ -0,0 +1,34 @@
+/* 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/. */
+
+/***************************************************************
+* FrameExchange ----------------------------------------------
+*  Utility for passing specific data to a document loaded
+*  through an iframe
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// implementation ////////////////////
+
+var FrameExchange = {
+  mData: {},
+
+  loadURL: function(aFrame, aURL, aData)
+  {
+    this.mData[aURL] = aData;
+    aFrame.setAttribute("src", aURL);
+  },
+
+  receiveData: function(aWindow)
+  {
+    var id = aWindow.location.href;
+    var data = this.mData[id];
+    this.mData[id] = null;
+
+    return data;
+  }
+};
+
+
diff --git a/suite/components/inspector/content/jsutil/xul/inBaseTreeView.js b/suite/components/inspector/content/jsutil/xul/inBaseTreeView.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/inBaseTreeView.js
@@ -0,0 +1,82 @@
+/* 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/. */
+
+/***************************************************************
+* inBaseTreeView -------------------------------------------------
+*  Simple tree view object meant to be extended.
+*  
+* Usage example: MyView.prototype = new inBaseTreeView();
+****************************************************************/
+
+//XXX Don't use anonymous functions
+function inBaseTreeView() { }
+
+inBaseTreeView.prototype = 
+{
+  mRowCount: 0,
+  mTree: null,
+  
+  get rowCount() { return this.mRowCount; },
+  setTree: function(aTree) { this.mTree = aTree; },
+  getCellText: function(aRow, aCol) { return ""; },
+  getRowProperties: function(aIndex, aProperties) { return ""; },
+  getCellProperties: function(aIndex, aCol, aProperties) { return ""; },
+  getColumnProperties: function(aCol, aProperties) { return ""; },
+  getParentIndex: function(aRowIndex) { },
+  hasNextSibling: function(aRowIndex, aAfterIndex) { },
+  getLevel: function(aIndex) {},
+  getImageSrc: function(aRow, aCol) {},
+  getProgressMode: function(aRow, aCol) {},
+  getCellValue: function(aRow, aCol) {},
+  isContainer: function(aIndex) {},
+  isContainerOpen: function(aIndex) {},
+  isContainerEmpty: function(aIndex) {},
+  isSeparator: function(aIndex) {},
+  isSorted: function() {},
+  toggleOpenState: function(aIndex) {},
+  selectionChanged: function() {},
+  cycleHeader: function(aCol) {},
+  cycleCell: function(aRow, aCol) {},
+  isEditable: function(aRow, aCol) {},
+  isSelectable: function(aRow, aCol) {},
+  setCellValue: function(aRow, aCol, aValue) {},
+  setCellText: function(aRow, aCol, aValue) {},
+  performAction: function(aAction) {},
+  performActionOnRow: function(aAction, aRow) {},
+  performActionOnCell: function(aAction, aRow, aCol) {},
+
+ /**
+  * Returns an array of selected indices in the tree.
+  * @return an array of indices
+  */
+  getSelectedIndices: function getSelectedIndices()
+  {
+    var indices = [];
+    var rangeCount = this.selection.getRangeCount();
+    for (var i = 0; i < rangeCount; i++) {
+      var start = {};
+      var end = {};
+      this.selection.getRangeAt(i,start,end);
+      for (var c = start.value; c <= end.value; c++) {
+        indices.push(c);
+      }
+    }
+    return indices;
+  },
+
+ /**
+  * Returns an array of row objects selected in the tree.
+  * @return an array of row objects
+  */
+  getSelectedRowObjects: function getSelectedRowObjects()
+  {
+    var declarations = [];
+    var indices = this.getSelectedIndices();
+    for (var i = 0; i < indices.length; i++) {
+      declarations.push(this.getRowObjectFromIndex(indices[i]));
+    }
+    return declarations;
+  }
+  
+};
diff --git a/suite/components/inspector/content/jsutil/xul/inDataTreeView.js b/suite/components/inspector/content/jsutil/xul/inDataTreeView.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/inDataTreeView.js
@@ -0,0 +1,243 @@
+/* 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/. */
+
+
+///////////////////////////////////////////////////////////////////////////////
+//// inDataTreeView
+
+function inDataTreeView()
+{
+  this.mRows = [];
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inDataTreeView. nsITreeView interface implementation
+
+inDataTreeView.prototype = new inBaseTreeView();
+
+inDataTreeView.prototype.__defineGetter__("rowCount",
+  function inDataTreeView_rowCount()
+  {
+    return this.mRows.length;
+  }
+);
+
+inDataTreeView.prototype.getCellText =
+  function inDataTreeView_getCellText(aRowIdx, aCol)
+{
+  var row = this.getRowAt(aRowIdx);
+  return row ? row.node.data[aCol.id] : "";
+};
+
+inDataTreeView.prototype.isContainer =
+  function inDataTreeView_isContainer(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  return row ? row.node.children.length > 0 : false;
+};
+
+inDataTreeView.prototype.isContainerOpen =
+  function inDataTreeView_isContainerOpen(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  return row ? row.isOpen : false;
+};
+
+inDataTreeView.prototype.isContainerEmpty =
+  function inDataTreeView_isContainerEmpty(aRowIdx)
+{
+  return !this.isContainer(aRowIdx);
+};
+
+inDataTreeView.prototype.getLevel =
+  function inDataTreeView_getLevel(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  return row ? row.node.level : 0;
+};
+
+inDataTreeView.prototype.getParentIndex =
+  function inDataTreeView_getParentIndex(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  if (!row) {
+    return -1;
+  }
+
+  for (let i = aRowIdx - 1; i >= 0; --i) {
+    let checkRow = this.getRowAt(i);
+    if (checkRow.node == row.node.parent) {
+      return i;
+    }
+  }
+
+  return -1;
+};
+
+inDataTreeView.prototype.hasNextSibling =
+  function inDataTreeView_hasNextSibling(aRowIdx, aAfterRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  if (!row || !row.node.parent) {
+    return false;
+  }
+
+  var lastIdx = row.node.parent.children.length - 1;
+  return row.node.parent.children[lastIdx] != row.node;
+};
+
+inDataTreeView.prototype.toggleOpenState =
+  function inDataTreeView_toggleOpenState(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  if (!row) {
+    return;
+  }
+
+  var oldCount = this.rowCount;
+  if (row.isOpen) {
+    this.collapseRowAt(aRowIdx);
+  }
+  else {
+    this.expandRowAt(aRowIdx);
+  }
+
+  this.mTree.invalidateRow(aRowIdx);
+  this.mTree.rowCountChanged(aRowIdx + 1, this.rowCount - oldCount);
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// inDataTreeView. Public.
+
+/**
+ * Append the child row to the row at the given index.
+ */
+inDataTreeView.prototype.appendChild =
+  function inDataTreeView_appendChild(aParent, aData)
+{
+  var node = new inDataTreeViewNode(aData);
+  if (aParent) {
+    node.level = aParent.level + 1;
+    node.parent = aParent;
+    aParent.children.push(node);
+    return node;
+  }
+
+  this.mRows.push(new inDataTreeViewRow(node));
+  return node;
+};
+
+/**
+ * Expand nodes from the given list. The caller should ensure that every node
+ * to expand precedes its ancestors in the list, in other words the list should
+ * be in reverse order, and include all ancestor nodes.
+ */
+inDataTreeView.prototype.expandNodes =
+  function inDataTreeView_expandNodes(aNodes)
+{
+  var node = aNodes.pop();
+  for (let rowIdx = 0; node && rowIdx < this.mRows.length; rowIdx++) {
+    if (this.getRowAt(rowIdx).node == node) {
+      this.expandRowAt(rowIdx);
+      node = aNodes.pop();
+    }
+  }
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//// inDataTreeView. Tree utils.
+
+/**
+ * Expands a tree node on the given row.
+ */
+inDataTreeView.prototype.expandRowAt =
+  function inDataTreeView_expandRowAt(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  if (!row || row.isOpen) {
+    return;
+  }
+
+  var kids = row.node.children;
+  var kidCount = kids.length;
+
+  for (let i = this.rowCount - 1; i > aRowIdx; --i) {
+    this.mRows[i + kidCount] = this.mRows[i];
+  }
+
+  for (let i = 0; i < kidCount; ++i) {
+    this.mRows[aRowIdx + i + 1] = new inDataTreeViewRow(kids[i]);
+  }
+
+  row.isOpen = true;
+};
+
+/**
+ * Collapse a tree node on the given row.
+ */
+inDataTreeView.prototype.collapseRowAt =
+  function inDataTreeView_collapseRowAt(aRowIdx)
+{
+  var row = this.getRowAt(aRowIdx);
+  if (!row || !row.isOpen) {
+    return;
+  }
+
+  var removeCount = 0;
+  var rowLevel = row.node.level;
+  for (let idx = aRowIdx + 1; idx < this.rowCount; idx++) {
+    if (this.getRowAt(idx).node.level <= rowLevel) {
+      removeCount = idx - aRowIdx - 1;
+      break;
+    }
+  }
+  this.mRows.splice(aRowIdx + 1, removeCount);
+
+  row.isOpen = false;
+};
+
+/**
+ * Return a tree row object by the given row index.
+ */
+inDataTreeView.prototype.getRowAt =
+  function inDataTreeView_getRowAt(aRowIdx)
+{
+  if (aRowIdx < 0 || aRowIdx >= this.rowCount) {
+    return null;
+  }
+
+  return this.mRows[aRowIdx];
+}
+
+/**
+ * Return a tree row data object by the given row index.
+ */
+inDataTreeView.prototype.getDataAt =
+  function inDataTreeView_getDataAt(aRowIdx)
+{
+  if (aRowIdx < 0 || aRowIdx >= this.rowCount) {
+    return null;
+  }
+
+  return this.mRows[aRowIdx].node.data;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// inDataTreeViewNode
+
+function inDataTreeViewNode(aData)
+{
+  this.parent = null;
+  this.children = [];
+
+  this.level = 0;
+  this.data = aData;
+}
+
+function inDataTreeViewRow(aNode)
+{
+  this.node = aNode;
+  this.isOpen = false;
+}
diff --git a/suite/components/inspector/content/jsutil/xul/inFormManager.js b/suite/components/inspector/content/jsutil/xul/inFormManager.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/inFormManager.js
@@ -0,0 +1,111 @@
+/* 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/. */
+
+/***************************************************************
+* inFormManager -------------------------------------------------
+*  Manages the reading and writing of forms via simple maps of
+*  attribute/value pairs.  A "form" is simply a XUL window which
+*  contains "form widgets" such as textboxes and menulists.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+****************************************************************/
+
+////////////////////////////////////////////////////////////////////////////
+//// class inFormManager
+
+var inFormManager =
+{
+  // Object
+  readWindow: function(aWindow, aIds)
+  {
+    var el, fn;
+    var doc = aWindow.document;
+    var map = {};
+    for (var i = 0; i < aIds.length; i++) {
+      el = doc.getElementById(aIds[i]);
+      if (el) {
+        this.persistIf(doc, el);
+        fn = this["read_"+el.localName];
+        if (fn)
+          map[aIds[i]] = fn(el);
+      }
+    }
+
+    return map;
+  },
+
+  // void
+  writeWindow: function(aWindow, aMap)
+  {
+    var el, fn;
+    var doc = aWindow.document;
+    for (var i = 0; i < aIds.length; i++) {
+      el = doc.getElementById(aIds[i]);
+      if (el) {
+        fn = this["write_"+el.localName];
+        if (fn)
+          fn(el, aMap[aIds[i]]);
+      }
+    }
+  },
+
+  persistIf: function(aDoc, aEl)
+  {
+    if (aEl.getAttribute("persist") == "true" && aEl.hasAttribute("id")) {
+      aEl.setAttribute("value", aEl.value);
+      aDoc.persist(aEl.getAttribute("id"), "value");
+    }
+  },
+
+  read_textbox: function(aEl)
+  {
+    return aEl.value;
+  },
+
+  read_menulist: function(aEl)
+  {
+    return aEl.getAttribute("value");
+  },
+
+  read_checkbox: function(aEl)
+  {
+    return aEl.getAttribute("checked") == "true";
+  },
+
+  read_radiogroup: function(aEl)
+  {
+    return aEl.getAttribute("value");
+  },
+
+  read_colorpicker: function(aEl)
+  {
+    return aEl.getAttribute("color");
+  },
+
+  write_textbox: function(aEl, aValue)
+  {
+    aEl.setAttribute("value", aValue);
+  },
+
+  write_menulist: function(aEl, aValue)
+  {
+    aEl.setAttribute("value", aValue);
+  },
+
+  write_checkbox: function(aEl, aValue)
+  {
+    aEl.setAttribute("checked", aValue);
+  },
+
+  write_radiogroup: function(aEl, aValue)
+  {
+    aEl.setAttribute("value", aValue);
+  },
+
+  write_colorpicker: function(aEl, aValue)
+  {
+    aEl.color = aValue;
+  }
+};
+
diff --git a/suite/components/inspector/content/jsutil/xul/inTreeBuilder.js b/suite/components/inspector/content/jsutil/xul/inTreeBuilder.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/jsutil/xul/inTreeBuilder.js
@@ -0,0 +1,636 @@
+/* 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/. */
+
+/***************************************************************
+* inTreeBuilder -------------------------------------------------
+*  Automatically builds up an tree so that it will display a tabular
+*  set of data with titled columns and optionally an icon for each row.
+*  The tree that is supplied must have an treechildren with an 
+*  empty template inside of it.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xul/DNDUtils.js
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var inTreeBuilderPartCount = 0;
+
+//////////// global constants ////////////////////
+
+////////////////////////////////////////////////////////////////////////////
+//// class inTreeBuilder
+
+function inTreeBuilder(aTree, aNameSpace, aArcName)
+{
+  this.tree = aTree;
+  this.nameSpace = aNameSpace;
+  this.arcName = aArcName;
+
+  this.mColumns = [];
+  this.mExtras = [];
+}
+
+inTreeBuilder.prototype =
+{
+  mTree: null,
+  mTreeBody: null,
+  // datasource stuff
+  mNameSpace: null,
+  mArcName: null,
+  mIsRefContainer: false,
+  mIsContainer: true,
+
+  // table structure stuff
+  mIsIconic: false,
+  mColumns: null,
+  mSplitters: true,
+  mRowFields: null,
+  mRowAttrs: null,
+  mAllowDND: false,
+  mLastDragCol: null,
+  mLastDragColWhere: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// properties
+
+  // the xul tree node we will construct
+  get tree() { return this.mTree },
+  set tree(aVal) 
+  { 
+    this.mTree = aVal;
+    if (aVal)
+      this.mTreeBody = aVal.getElementsByTagName("treechildren")[0];
+    aVal._treeBuilder = this 
+  },
+
+  // the namespace to use for all fields
+  get nameSpace() { return this.mNameSpace },
+  set nameSpace(aVal) { this.mNameSpace = aVal },
+
+  // the name of the arc to the container
+  get arcName() { return this.mArcName },
+  set arcName(aVal) { this.mArcName = aVal },
+
+  // is the datasource ref an arc to a container, or a container itself
+  get isRefContainer() { return this.mIsRefContainer },
+  set isRefContainer(aVal) { this.mIsRefContainer = aVal },
+
+  // is each row a potential container?
+  get isContainer() { return this.mIsContainer },
+  set isContainer(aVal) { this.mIsContainer = aVal },
+
+  // place an icon before the first column of each row
+  get isIconic() { return this.mIsIconic },
+  set isIconic(aVal) { this.mIsIconic = aVal },
+
+  // put splitters between the columns?
+  get useSplitters() { return this.mSplitters },
+  set useSplitters(aVal) { this.mSplitters = aVal },
+
+  // extra attributes to set on the treeitem
+  get rowAttributes() { return this.mRowAttrs },
+  set rowAttributes(aVal) { this.mRowAttrs = aVal },
+
+  // extra data fields to set on the treeitem
+  get rowFields() { return this.mRowFields },
+  set rowFields(aVal) { this.mRowFields = aVal },
+
+  // extra data fields to set on the treeitem
+  get allowDragColumns() { return this.mAllowDND },
+  set allowDragColumns(aVal) { this.mAllowDND = aVal },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// event handlers
+
+  get onColumnAdd() { return this.mOnColumnAdd },
+  set onColumnAdd(aFn) { this.mOnColumnAdd = aFn },
+
+  get onColumnRemove() { return this.mOnColumnRemove },
+  set onColumnRemove(aFn) { this.mOnColumnRemove = aFn },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// initialization
+
+  initialize: function()
+  {
+    this.initColumns();
+    this.initTemplate();
+  },
+
+  initColumns: function()
+  {
+    this.initDND();
+  },
+
+  initTemplate: function()
+  {
+    var template = this.mTree.getElementsByTagNameNS(kXULNSURI, "template")[0];
+    this.mTemplate = template;
+    this.clearChildren(template);
+
+    var rule = document.createElementNS(kXULNSURI, "rule");
+    template.appendChild(rule);
+    this.mRule = rule;
+
+    this.createDefaultConditions();
+
+    var bindings = document.createElementNS(kXULNSURI, "bindings");
+    rule.appendChild(bindings);
+    this.mBindings = bindings;
+
+    this.createDefaultAction();
+  },
+
+  createDefaultConditions: function()
+  {
+    var conditions = document.createElementNS(kXULNSURI, "conditions");
+    this.mRule.appendChild(conditions);
+
+    var content = document.createElementNS(kXULNSURI, "treerow");
+    content.setAttribute("uri", "?uri");
+    conditions.appendChild(content);
+
+    var triple = this.createTriple("?uri", this.mNameSpace+this.mArcName,
+      this.mIsRefContainer ? "?table" : "?row");
+    conditions.appendChild(triple);
+
+    if (this.mIsRefContainer) {
+      var member = this.createMember("?table", "?row");
+      conditions.appendChild(member);
+    }
+  },
+
+  createDefaultAction: function()
+  {
+    var action = document.createElementNS(kXULNSURI, "action");
+    this.mRule.appendChild(action);
+
+    var orow = this.createTemplatePart("treerow");
+    orow.setAttribute("uri", "?row");
+    action.appendChild(orow);
+    this.mTreeRow = orow;
+
+    // assign the item attributes
+    if (this.mRowAttrs)
+      for (key in this.mRowAttrs)
+        orow.setAttribute(key, this.mRowAttrs[key]);
+  },
+
+  createDefaultBindings: function()
+  {
+    // assign the item fields
+    var binding;
+    if (this.mRowFields) {
+      var props = "";
+      for (key in this.mRowFields) {
+        binding = this.createBinding(this.mRowFields[key]);
+        this.mBindings.appendChild(binding);
+        props += key+"-?"+this.mRowFields[key]+" ";
+      }
+      this.mTreeRow.setAttribute("properties", props);
+    }
+  },
+
+  createTriple: function(aSubject, aPredicate, aObject)
+  {
+    var triple = document.createElementNS(kXULNSURI, "triple");
+    triple.setAttribute("subject", aSubject);
+    triple.setAttribute("predicate", aPredicate);
+    triple.setAttribute("object", aObject);
+
+    return triple;
+  },
+
+  createMember: function(aContainer, aChild)
+  {
+    var member = document.createElementNS(kXULNSURI, "member");
+    member.setAttribute("container", aContainer);
+    member.setAttribute("child", aChild);
+
+    return member;
+  },
+
+  reset: function()
+  {
+    this.mColumns = [];
+    this.mIsIconic = false;
+
+    this.resetTree();
+  },
+
+  resetTree: function()
+  {
+    var kids = this.mTree.childNodes;
+    for (var i = kids.length - 1; i >= 0; --i)
+      if (kids[i].localName != "treechildren")
+        this.mTree.removeChild(kids[i]);
+      
+    this.clearChildren(this.mBindings);
+    this.clearChildren(this.mTreeRow);
+    this.createDefaultBindings();
+  },
+
+  clearChildren: function(aEl)
+  {
+    while (aEl.hasChildNodes())
+      aEl.removeChild(aEl.lastChild);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// column drag and drop
+
+  initDND: function()
+  {
+    if (this.mAllowDND) {
+      // addEventListener doesn't work for dnd events, apparently... so we use the attributes
+      this.addDNDListener(this.mTree, "ondragenter");
+      this.addDNDListener(this.mTree, "ondragover");
+      this.addDNDListener(this.mTree, "ondragexit");
+      this.addDNDListener(this.mTree, "ondragstart");
+      this.addDNDListener(this.mTree, "ondrop");
+    }
+  },
+
+  onDragEnter: function(aEvent)
+  {
+  },
+
+  onDragOver: function(aEvent)
+  {
+    if (!DNDUtils.checkCanDrop("TreeBuilder/column-add"))
+      return;
+
+    var idx = this.getColumnIndexFromX(aEvent.clientX, 0.5);
+    this.mColumnInsertIndex = idx;
+    var col = this.getColumnAt(idx);
+    
+    if (idx == -1)
+      this.markColumnInsert(col, "after");
+    else
+      this.markColumnInsert(col, "before");
+  },
+
+  onDragExit: function(aEvent)
+  {
+  },
+
+  onDrop: function(aEvent)
+  {
+    this.markColumnInsert(null);
+    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
+    var dragSession = dragService.getCurrentSession();
+
+    if (!dragSession.isDataFlavorSupported("TreeBuilder/column-add"))
+      return false;
+
+    var trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
+    trans.addDataFlavor("TreeBuilder/column-add");
+
+    dragSession.getData(trans, 0);
+    var data = {};
+    trans.getAnyTransferData ({}, data, {});
+
+    var string = XPCU.QI(data.value, "nsISupportsString");
+
+    this.insertColumn(this.mColumnInsertIndex,
+      {
+        name: string.data,
+        title: string.data,
+        flex: 1
+      });
+    
+    
+    // if we rebuildContent during this thread, it will crash in the dnd service
+    setTimeout(function(me) { me.build(); me.buildContent() }, 1, this);
+
+    // bug 56270 - dragSession.sourceDocument is null --
+    // causes me to code this very temporary, very nasty hack
+    // to tell columnsDialog.js about the drop
+    if (this.mTree.onClientDrop) {
+      this.mTree.onClientDrop();
+    }
+  },
+
+  markColumnInsert: function (aColumn, aWhere)
+  {
+    var col = this.mLastDragCol;
+    var lastWhere = this.mLastDragColWhere;
+    if (col)
+      col.setAttribute("properties", "");
+
+    if (aWhere != "before" && aWhere != "after") {
+      this.mLastDragCol = null;
+      this.mLastDragColWhere = null;
+      return;
+    }
+
+    col = aColumn;
+    if (col) {
+      this.mLastDragCol = col;
+      this.mLastDragColWhere = aWhere;
+      col.setAttribute("properties", "dnd-insert-"+aWhere);
+    }
+    
+    var bx = this.mTree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
+    bx.invalidate();
+  },
+
+  getColumnIndexFromX: function(aX, aThresh)
+  {
+    var width = 0;
+    var col, cw;
+    for (var i = 0; i < this.columnCount; ++i) {
+      col = this.getColumnAt(i);
+      cw = col.boxObject.width;
+      width += cw;
+      if (width-(cw*aThresh) > aX)
+        return i;
+    }
+
+    return -1;
+  },
+
+  getColumnIndexFromHeader: function(aHeader)
+  {
+    var headers = this.mTree.getElementsByTagName("treecol");
+    for (var i = 0; i < headers.length; ++i) {
+      if (headers[i] == aHeader)
+        return i;
+    }
+    return -1;
+  },
+
+  //// for drag-n-drop removal/arrangement of columns
+
+  onDragStart: function(aEvent)
+  {
+    var target = aEvent.target;
+    if (target.parentNode == this.mTree) {
+      var column = target.getAttribute("label");
+
+      var idx = this.getColumnIndexFromHeader(target);
+      if (idx == -1) return;
+      this.mColumnDragging = idx;
+
+      DNDUtils.invokeSession(target, ["TreeBuilder/column-remove"], [column]);
+    }
+  },
+
+  addColumnDropTarget: function(aBox)
+  {
+    aBox._treeBuilderDropTarget = this;
+    this.addDNDListener(aBox, "ondragover", "Target");
+    this.addDNDListener(aBox, "ondrop", "Target");
+  },
+
+  removeColumnDropTarget: function(aBox)
+  {
+    aBox._treeBuilderDropTarget = this;
+    this.removeDNDListener(aBox, "ondragover", "Target");
+    this.removeDNDListener(aBox, "ondrop", "Target");
+  },
+
+  onDragOverTarget: function(aBox, aEvent)
+  {
+    DNDUtils.checkCanDrop("TreeBuilder/column-remove");
+  },
+
+  onDropTarget: function(aBox, aEvent)
+  {
+    this.removeColumn(this.mColumnDragging);
+    this.build();
+    // if we rebuildContent during this thread, it will crash in the dnd service
+    setTimeout(function(aTreeBuilder) { aTreeBuilder.buildContent() }, 1, this);
+  },
+
+  // these are horrible hacks to compensate for the lack of true multiple
+  // listener support for the DND events
+
+  addDNDListener: function(aBox, aType, aModifier)
+  {
+   var js = "inTreeBuilder_"+aType+(aModifier?"_"+aModifier:"")+"(this, event);";
+
+   var attr = aBox.getAttribute(aType);
+   attr = attr ? attr : "";
+   aBox.setAttribute(aType, attr + js);
+  },
+
+  removeDNDListener: function(aBox, aType, aModifier)
+  {
+   var js = "inTreeBuilder_"+aType+(aModifier?"_"+aModifier:"")+"(this, event);";
+
+   var attr = aBox.getAttribute(aType);
+   var idx = attr.indexOf(js);
+   if (idx != -1)
+     attr = attr.substr(0,idx) + attr.substr(idx+1);
+   aBox.setAttribute(aType, attr);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// column properties
+
+  addColumn: function(aData)
+  {
+    this.mColumns.push(aData);
+
+    if (this.mOnColumnAdd)
+      this.mOnColumnAdd(this.mColumns.length-1)
+  },
+
+  insertColumn: function(aIndex, aData)
+  {
+    var idx;
+    if (aIndex == -1) {
+      this.mColumns.push(aData);
+      idx = this.mColumns.length-1;
+    } else {
+      this.mColumns.splice(aIndex, 0, aData);
+      idx = aIndex;
+    }
+
+    if (this.mOnColumnAdd)
+      this.mOnColumnAdd(idx);
+  },
+
+  removeColumn: function(aIndex)
+  {
+    this.mColumns.splice(aIndex, 1);
+
+    if (this.mOnColumnRemove)
+      this.mOnColumnRemove(aIndex);
+  },
+
+  getColumnAt: function(aIndex)
+  {
+    var kids = this.mTree.getElementsByTagName("treecol");
+    return aIndex < 0 || aIndex >= kids.length ? kids[kids.length-1] : kids[aIndex];
+  },
+
+  get columnCount() { return this.mColumns.length },
+
+  getColumnName: function(aIndex) { return this.mColumns[aIndex].name  },
+  setColumnName: function(aIndex, aValue) { this.mColumns[aIndex].name = aValue },
+
+  getColumnTitle: function(aIndex) { return this.mColumns[aIndex].title  },
+  setColumnTitle: function(aIndex, aValue) { this.mColumns[aIndex].title = aValue },
+
+  getColumnClassName: function(aIndex) { return this.mColumns[aIndex].className  },
+  setColumnClassName: function(aIndex, aValue) { this.mColumns[aIndex].className = aValue },
+
+  getColumnFlex: function(aIndex) { return this.mColumns[aIndex].flex  },
+  setColumnFlex: function(aIndex, aValue) { this.mColumns[aIndex].flex = aValue },
+
+  getExtras: function(aIndex) { return this.mColumns[aIndex].extras  },
+  setExtras: function(aIndex, aValue) { this.mColumns[aIndex].extras = aExtras },
+
+  getAttrs: function(aIndex) { return this.mColumns[aIndex].attrs  },
+  setAttrs: function(aIndex, aValue) { this.mColumns[aIndex].attrs = aExtras },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// template building
+
+  build: function(aBuildContent)
+  {
+    try {
+      this.resetTree();
+      this.buildColumns();
+      this.buildTemplate();
+      if (aBuildContent)
+        this.buildContent();
+    } catch (ex) {
+      debug("### ERROR - inTreeBuilder::build failed.\n" + ex);
+    }
+
+    //dumpDOM2(this.mTree);
+
+  },
+
+  buildContent: function()
+  {
+    this.mTreeBody.builder.rebuild();
+  },
+
+  buildColumns: function()
+  {
+    var cols = document.createElementNS(kXULNSURI, "treecols");
+    var col, val, split;
+    for (var i = 0; i < this.mColumns.length; i++) {
+      col = document.createElementNS(kXULNSURI, "treecol");
+      col.setAttribute("id", "treecol-"+this.mColumns[i].name);
+      col.setAttribute("persist", "width");
+      col.setAttribute("label", this.mColumns[i].title);
+
+      // mark first node as primary, if necessary
+      if (i == 0 && this.mIsContainer)
+        col.setAttribute("primary", "true");
+
+      val = cols[i].className;
+      if (val)
+        col.setAttribute("class", val);
+      val = cols[i].flex;
+      if (val)
+        col.setAttribute("flex", val);
+
+      cols.appendChild(col);
+
+      if (this.mSplitters && i < this.mColumns.length-1) {
+        split = document.createElementNS(kXULNSURI, "splitter");
+        split.setAttribute("class", "tree-splitter");
+        cols.appendChild(split);
+      }
+    }
+    this.mTree.appendChild(cols);
+  },
+
+  buildTemplate: function()
+  {
+    var cols = this.mColumns;
+    var bindings = this.mBindings;
+    var row = this.mTreeRow;
+    var cell, binding, val, extras, attrs, key, className;
+
+    if (this.mIsIconic) {
+      binding = this.createBinding("_icon");
+      bindings.appendChild(binding);
+    }
+
+    for (var i = 0; i < cols.length; ++i) {
+      val = cols[i].name;
+      if (!val)
+        throw "Column data is incomplete - missing name at index " + i + ".";
+
+      cell = this.createTemplatePart("treecell");
+      className = "";
+
+      // build the default value data field
+      binding = this.createBinding(val);
+      bindings.appendChild(binding);
+      
+      cell.setAttribute("label", "?" + val);
+      cell.setAttribute("ref", "treecol-"+cols[i].name);
+      cell.setAttribute("class", className);
+      
+      var props = "";
+      for (key in this.mRowFields)
+        props += key+"-?"+this.mRowFields[key]+" ";
+      cell.setAttribute("properties", props);
+
+      row.appendChild(cell);
+    }
+  },
+
+  createBinding: function(aName)
+  {
+    var binding = document.createElementNS(kXULNSURI, "binding");
+    binding.setAttribute("subject", "?row");
+    binding.setAttribute("predicate", this.mNameSpace+aName);
+    binding.setAttribute("object", "?" + aName);
+    return binding;
+  },
+
+  createTemplatePart: function(aTagName)
+  {
+    var el = document.createElementNS(kXULNSURI, aTagName);
+    el.setAttribute("id", "templatePart"+inTreeBuilderPartCount);
+    inTreeBuilderPartCount++;
+    return el;
+  }
+
+};
+
+function inTreeBuilder_ondragstart(aTree, aEvent)
+{
+  return aTree._treeBuilder.onDragStart(aEvent);
+}
+
+function inTreeBuilder_ondragenter(aTree, aEvent)
+{
+  return aTree._treeBuilder.onDragEnter(aEvent);
+}
+
+function inTreeBuilder_ondragover(aTree, aEvent)
+{
+  return aTree._treeBuilder.onDragOver(aEvent);
+}
+
+function inTreeBuilder_ondragexit(aTree, aEvent)
+{
+  return aTree._treeBuilder.onDragExit(aEvent);
+}
+
+function inTreeBuilder_ondrop(aTree, aEvent)
+{
+  return aTree._treeBuilder.onDrop(aEvent);
+}
+
+function inTreeBuilder_ondragover_Target(aBox, aEvent)
+{
+  return aBox._treeBuilderDropTarget.onDragOverTarget(aBox, aEvent);
+}
+
+function inTreeBuilder_ondrop_Target(aBox, aEvent)
+{
+  return aBox._treeBuilderDropTarget.onDropTarget(aBox, aEvent);
+}
diff --git a/suite/components/inspector/content/keysetOverlay.xul b/suite/components/inspector/content/keysetOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/keysetOverlay.xul
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<overlay id="ovKeyset"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <keyset id="ksGlobalKeyset">
+    <key id="keyEnterLocation" command="cmdEnterLocation"
+         key="&cmdEnterLocation.key;" modifiers="accel"/>
+    <key id="keyEnterLocation2" command="cmdEnterLocation"
+         key="&cmdEnterLocation.key2;" modifiers="alt"/>
+  </keyset>
+
+</overlay>
diff --git a/suite/components/inspector/content/object.js b/suite/components/inspector/content/object.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/object.js
@@ -0,0 +1,91 @@
+/* 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/. */
+
+/***************************************************************
+* ObjectApp -------------------------------------------------
+*  The primary object that controls the Inspector compact app.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var inspector;
+
+//////////// global constants ////////////////////
+
+//////////////////////////////////////////////////
+
+window.addEventListener("load", ObjectApp_initialize, false);
+window.addEventListener("unload", ObjectApp_destroy, false);
+
+function ObjectApp_initialize()
+{
+  inspector = new ObjectApp();
+  inspector.initialize();
+}
+
+function ObjectApp_destroy()
+{
+  inspector.destroy();
+}
+
+////////////////////////////////////////////////////////////////////////////
+//// class ObjectApp
+
+function ObjectApp()
+{
+}
+
+ObjectApp.prototype = 
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  initialize: function()
+  {
+    this.mInitTarget = window.arguments && window.arguments.length > 0 ? window.arguments[0] : null;
+
+    this.mPanelSet = document.getElementById("bxPanelSet");
+    this.mPanelSet.addObserver("panelsetready", this, false);
+    this.mPanelSet.initialize();
+  },
+  
+  destroy: function()
+  {
+  },
+  
+  doViewerCommand: function(aCommand)
+  {
+    this.mPanelSet.execCommand(aCommand);
+  },
+  
+  getViewer: function(aUID)
+  {
+    return this.mPanelSet.registry.getViewerByUID(aUID);
+  },
+  
+  onEvent: function(aEvent)
+  {
+    switch (aEvent.type) {
+      case "panelsetready":
+        this.initViewerPanels();
+    }
+  },
+
+  initViewerPanels: function()
+  {
+    if (this.mInitTarget)
+      this.target = this.mInitTarget;
+  },
+  
+  set target(aObj)
+  {
+    this.mPanelSet.getPanel(0).subject = aObj;
+  }
+};
+
+////////////////////////////////////////////////////////////////////////////
+//// event listeners
+
diff --git a/suite/components/inspector/content/object.xul b/suite/components/inspector/content/object.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/object.xul
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE window [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<window id="winInspectorMain" class="color-dialog" 
+        title="&Inspector.title;"
+        width="400" height="700"
+        persist="screenX screenY width height sizemode"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <script type="application/javascript" src="chrome://inspector/content/object.js"/>  
+  <script type="application/javascript" src="chrome://inspector/content/Flasher.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/ViewerRegistry.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
+      
+  <commandset id="cmdsGlobalCommands"/>
+  <keyset id="ksGlobalKeyset"/>
+  <popupset id="ppsViewerPopupset"/>
+  
+  <domi-panelset id="bxPanelSet" flex="1" viewercommandset="cmdsGlobalCommands">
+    <domi-panel title="&bxObjectPanel.title;" flex="1"/>
+  </domi-panelset>
+
+</window>
+
+        
diff --git a/suite/components/inspector/content/popupOverlay.xul b/suite/components/inspector/content/popupOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/popupOverlay.xul
@@ -0,0 +1,102 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<overlay id="ovPopupsMain"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <popupset id="aTooltipSet">
+    <tooltip id="docItemsTooltip"
+             noautohide="true"
+             onpopupshowing="return inspector.fillInTooltip(document.tooltipNode);">
+      <vbox>
+        <label id="docItemsTitle" class="tooltip-label"/>
+        <label id="docItemsURI" class="tooltip-label"/>
+      </vbox>
+    </tooltip>
+  </popupset>
+
+  <menupopup id="menu_FilePopup">
+    <menu oncommand="inspector.setTargetDocument(event.target.doc);"
+          id="mnInspectContentDocumentFile"
+          label="&mnInspectContentDocument.label;"
+          accesskey="&mnInspectContentDocument.accesskey;">
+      <menupopup id="list-content-documents-popup"
+                 tooltip="docItemsTooltip"
+                 onpopupshowing="inspector.showInspectDocumentList(event, false);"/>
+    </menu>
+    <menu oncommand="inspector.setTargetDocument(event.target.doc);"
+          id="mnInspectChromeDocumentFile"
+          label="&mnInspectChromeDocument.label;"
+          accesskey="&mnInspectChromeDocument.accesskey;">
+      <menupopup id="list-chrome-documents-popup"
+                 tooltip="docItemsTooltip"
+                 onpopupshowing="inspector.showInspectDocumentList(event, true);"/>
+    </menu>
+    <menuitem oncommand="inspector.setTargetApplicationAccessible();"
+              id="mnInspectApplicationAccessible"
+              label="&mnInspectApplicationAccessible.label;"
+              accesskey="&mnInspectApplicationAccessible.accesskey;"/>
+    <menuitem label="&cmdEnterLocation.label;"
+              accesskey="&cmdEnterLocation.accesskey;"
+              id="mnEnterLocation" observes="cmdEnterLocation"/>
+    <menuitem label="&cmdClose.label;" accesskey="&cmdClose.accesskey;"
+              id="mnClose" observes="cmdClose" key="key_closeInspector"/>
+    <menuseparator/>
+    <menuitem label="&cmdSave.label;" accesskey="&cmdSave.accesskey;"
+              observes="cmdSave" key="key_saveInspector" id="mi-save"/>
+  </menupopup>
+
+  <menupopup id="mppEdit">
+    <menuitem id="mnEditUndo"/>
+    <menuitem id="mnEditRedo"/>
+    <menuseparator/>
+    <menuitem id="mnEditCut"/>
+    <menuitem id="mnEditCopy"/>
+    <menuitem id="mnEditPaste"/>
+    <menuitem id="mnEditDelete"/>
+    <menuitem id="mnEditInsert"/>
+    <menuseparator/>
+    <menuitem id="mnEditInspectInNewWindow"/>
+  </menupopup>
+
+  <menupopup id="mppView">
+    <menu id="mnDocViewerList"
+          label="&mnDocViewerList.label;"
+          accesskey="&mnDocViewerList.accesskey;"
+          oncommand="inspector.onViewerListCommand(event.target);"
+          disabled="true">
+      <menupopup id="mppDocViewerList"/>
+    </menu>
+    <menu id="mnObjectViewerList"
+          label="&mnObjectViewerList.label;"
+          accesskey="&mnObjectViewerList.accesskey;"
+          oncommand="inspector.onViewerListCommand(event.target);"
+          disabled="true">
+      <menupopup id="mppObjectViewerList"/>
+    </menu>
+    <menuitem class="menuitem-iconic" type="checkbox"
+              id="item:toggleDocument"
+              label="&cmdToggleDocument.label;"
+              accesskey="&cmdToggleDocument.accesskey;"
+              observes="cmdToggleDocument" disabled="true"/> 
+    <menuseparator/>
+    <menuitem id="item:flashOnSelect"
+              class="menuitem-iconic"
+              type="checkbox"
+              label="&cmdFlashOnSelect.label;"
+              accesskey="&cmdFlashOnSelect.accesskey;"
+              observes="cmdFlashOnSelect"/>
+  </menupopup>
+
+  <popupset id="ppsViewerPopupset"/>
+
+</overlay>
diff --git a/suite/components/inspector/content/prefs/pref-inspector.js b/suite/components/inspector/content/prefs/pref-inspector.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/prefs/pref-inspector.js
@@ -0,0 +1,49 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: ts=2 sw=2 sts=2
+ * 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/. */
+
+function Startup()
+{
+  SidebarPrefs_initialize();
+  enableBlinkPrefs(document.getElementById("inspector.blink.on").value);
+}
+
+function enableBlinkPrefs(aTruth)
+{
+  /* 
+   * define the pair of label and control used in the prefpane to allow
+   * disabling of both elements, if a pref is locked.
+   */
+  let els = {
+    lbElBorderColor: "cprElBorderColor",
+    lbElBorderWidth: "txfElBorderWidth",
+    lbElDuration: "txfElDuration",
+    lbElSpeed: "txfElSpeed",
+    "": "cbElInvert"
+  };
+
+  for (let [label, control] in Iterator(els)) {
+    let controlElem = document.getElementById(control);
+
+    // only remove disabled attribute, if pref isn't locked
+    if (aTruth && !isPrefLocked(controlElem)) {
+      controlElem.removeAttribute("disabled");
+      if (label)
+        document.getElementById(label).removeAttribute("disabled");
+    } else {
+      controlElem.setAttribute("disabled", true);
+      if (label)
+        document.getElementById(label).setAttribute("disabled", true);
+    }
+  }
+}
+
+function isPrefLocked(elem)
+{
+  if (!elem.hasAttribute("preference"))
+    return false;
+
+  return document.getElementById(elem.getAttribute("preference")).locked;
+}
diff --git a/suite/components/inspector/content/prefs/pref-inspector.xul b/suite/components/inspector/content/prefs/pref-inspector.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/prefs/pref-inspector.xul
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/prefs.dtd">
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  <prefpane id="inspector_pane"
+            label="&Inspector.label;"
+            script="chrome://inspector/content/extensions/wsm-colorpicker.js
+                    chrome://inspector/content/prefs/pref-inspector.js
+                    chrome://inspector/content/prefs/pref-sidebar.js
+                    chrome://inspector/content/jsutil/xpcom/XPCU.js
+                    chrome://inspector/content/jsutil/rdf/RDFU.js">
+
+    <stringbundle id="inspector-bundle" src="chrome://inspector/locale/inspector.properties"/>
+
+    <preferences id="inspector_preferences">
+      <preference id="inspector.blink.on"
+                  name="inspector.blink.on"
+                  type="bool"
+                  onchange="enableBlinkPrefs(this.value);"/>
+      <preference id="inspector.blink.border-color"
+                  name="inspector.blink.border-color"
+                  type="string"/>
+      <preference id="inspector.blink.border-width"
+                  name="inspector.blink.border-width"
+                  type="int"/>
+      <preference id="inspector.blink.duration"
+                  name="inspector.blink.duration"
+                  type="int"/>
+      <preference id="inspector.blink.speed"
+                  name="inspector.blink.speed"
+                  type="int"/>
+      <preference id="inspector.blink.invert"
+                  name="inspector.blink.invert"
+                  type="bool"/>
+      <!-- preference id="inspector.hooks.navigator"
+                  name="inspector.hooks.navigator"
+                  type="bool"/ -->
+    </preferences>
+
+    <groupbox id="tbxBlink">
+      <caption label="&elementBlinking.label;"/>
+      <vbox>
+        <checkbox id="cbElOn" label="&blinkSelectedElement.label;"
+                  preference="inspector.blink.on"
+                  accesskey="&blinkSelectedElement.accesskey;"/>
+        <grid>
+          <columns>
+            <column/>
+            <column flex="1"/>
+          </columns>
+          <rows>
+            <row align="center">
+              <label id="lbElBorderColor" control="cprElBorderColor"
+                     value="&borderColor.label;"
+                     accesskey="&borderColor.accesskey;"/>
+              <hbox align="center">
+                <colorpicker id="cprElBorderColor" type="button"
+                             preference="inspector.blink.border-color"/>
+              </hbox>
+            </row>
+            <row align="center">
+              <label id="lbElBorderWidth" control="txfElBorderWidth"
+                     value="&borderWidth.label;"
+                     accesskey="&borderWidth.accesskey;"/>
+              <hbox align="center">
+                <textbox id="txfElBorderWidth" style="width: 4em"
+                         preference="inspector.blink.border-width"/>
+                <label value="&px.label;"/>
+              </hbox>
+            </row>
+            <row align="center">
+            <label id="lbElDuration" control="txfElDuration"
+                   value="&blinkDuration.label;"
+                   accesskey="&blinkDuration.accesskey;"/>
+              <hbox align="center">
+                <textbox id="txfElDuration" style="width: 4em"
+                         preference="inspector.blink.duration"/>
+               <label value="&ms.label;"/>
+              </hbox>
+            </row>
+            <row align="center">
+              <label id="lbElSpeed" control="txfElSpeed"
+                     value="&blinkSpeed.label;"
+                     accesskey="&blinkSpeed.accesskey;"/>
+              <hbox align="center">
+                <textbox id="txfElSpeed" style="width: 4em"
+                         preference="inspector.blink.speed"/>
+                <label value="&ms.label;"/>
+              </hbox>
+            </row>
+          </rows>
+        </grid>
+        <vbox align="start">
+          <checkbox id="cbElInvert" label="&invertColors.label;"
+                    preference="inspector.blink.invert"
+                    accesskey="&invertColors.accesskey;"/>
+        </vbox>
+      </vbox>
+    </groupbox>
+
+    <groupbox id="tbxSidebar">
+      <caption label="&Sidebar.label;"/>
+      <vbox flex="1">
+        <vbox id="bxSidebarInstall" flex="1">
+          <hbox>
+            <description id="txSidebarMsg" flex="1">&installHowTo.label;</description>
+          </hbox>
+          <button id="btnSidebarInstall" label="&install.label;"
+                  oncommand="sidebarPref.installSidebar()"
+                  accesskey="&install.accesskey;"/>
+        </vbox>
+      </vbox>
+    </groupbox>
+
+    <!--
+    <vbox>
+      <checkbox id="cbxNavIntegration" label="&addNavigatorHooks.label;"
+                preference="inspector.hooks.navigator"
+                accesskey="&addNavigatorHooks.accesskey;"/>
+    </vbox>
+    -->
+
+  </prefpane>
+</overlay>
diff --git a/suite/components/inspector/content/prefs/pref-sidebar.js b/suite/components/inspector/content/prefs/pref-sidebar.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/prefs/pref-sidebar.js
@@ -0,0 +1,136 @@
+/* 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/. */
+
+/***************************************************************
+* SidebarPrefs -------------------------------------------------
+*  The controller for the lovely sidebar prefs panel.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/rdf/RDFU.js
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var sidebarPref;
+
+//////////// global constants ////////////////////
+
+const kDirServiceCID       = "@mozilla.org/file/directory_service;1"
+const kNCURI               = "http://home.netscape.com/NC-rdf#";
+const kSidebarPanelId      = "UPnls"; // directory services property to find panels.rdf
+const kSidebarURNPanelList = "urn:sidebar:current-panel-list";
+const kSidebarURN3rdParty  = "urn:sidebar:3rdparty-panel";
+const kSidebarURL          = "chrome://inspector/content/sidebar.xul";
+
+//////////////////////////////////////////////////
+
+function SidebarPrefs_initialize()
+{
+  sidebarPref = new SidebarPrefs();
+  sidebarPref.initSidebarData();
+}
+
+///// class SidebarPrefs /////////////////////////
+
+function SidebarPrefs()
+{
+}
+
+SidebarPrefs.prototype = 
+{
+  
+  ///////////////////////////////////////////////////////////////////////////
+  // Because nsSidebar has been so mean to me, I'm going to re-write it's
+  // addPanel code right here so I don't have to fight with it.  Pbbbbt!
+  ///////////////////////////////////////////////////////////////////////////
+
+  initSidebarData: function()
+  {
+    var file = this.getDirectoryFile(kSidebarPanelId);
+    if (file)
+      RDFU.loadDataSource(file, gSidebarLoadListener);
+  },
+
+  initSidebarData2: function(aDS)
+  {
+    var res = aDS.GetTarget(gRDF.GetResource(kSidebarURNPanelList), gRDF.GetResource(kNCURI + "panel-list"), true);
+    this.mDS = aDS;
+    this.mPanelSeq = RDFU.makeSeq(aDS, res);
+    this.mPanelRes = gRDF.GetResource(kSidebarURN3rdParty + ":" + kSidebarURL);
+    
+    if (this.isSidebarInstalled()) {
+      document.getElementById("tbxSidebar").setAttribute("hidden", "true");      
+    }
+  },
+
+  isSidebarInstalled: function()
+  {
+    return this.mPanelSeq.IndexOf(this.mPanelRes) != -1;
+  },
+
+  installSidebar: function()
+  {
+    if (this.isSidebarInstalled()) {
+      return false;
+    }
+
+    var bundle = document.getElementById("inspector-bundle");
+    var kSidebarTitle = bundle.getString("sidebar.title");
+
+    this.mDS.Assert(this.mPanelRes, gRDF.GetResource(kNCURI + "title"), gRDF.GetLiteral(kSidebarTitle), true);
+    this.mDS.Assert(this.mPanelRes, gRDF.GetResource(kNCURI + "content"), gRDF.GetLiteral(kSidebarURL), true);
+    this.mPanelSeq.AppendElement(this.mPanelRes);
+    this.forceSidebarRefresh();
+
+    var msg = document.getElementById("txSidebarMsg");
+    msg.removeChild(msg.firstChild);
+
+    msg.appendChild(document.createTextNode(bundle.getString("sidebarInstalled"))); 
+    var btn = document.getElementById("btnSidebarInstall");
+    btn.setAttribute("disabled", "true");
+
+    return true;
+  },
+
+  forceSidebarRefresh: function()
+  {
+    var listRes = gRDF.GetResource(kSidebarURNPanelList);
+    var refreshRes = gRDF.GetResource(kNCURI + "refresh");
+    var trueRes = gRDF.GetLiteral("true");
+    this.mDS.Assert(listRes, refreshRes, trueRes, true);
+    this.mDS.Unassert(listRes, refreshRes, trueRes);
+  },
+
+  getDirectoryFile: function(aFileId)
+  {
+    try {
+      var dirService = XPCU.getService(kDirServiceCID, "nsIProperties");
+      var file = dirService.get(aFileId, Components.interfaces.nsIFile);
+      if (!file.exists())
+        return null;
+
+      var ioService = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService");
+      var fileHandler = XPCU.QI(ioService.getProtocolHandler("file"), "nsIFileProtocolHandler");
+
+      return fileHandler.getURLSpecFromFile(file);
+
+    } catch (ex) {
+      return null;
+    }
+  }
+
+};
+
+var gSidebarLoadListener = {
+  onDataSourceReady: function(aDS) 
+  {
+    sidebarPref.initSidebarData2(aDS);
+  },
+
+  onError: function()
+  {
+  }
+};
+
diff --git a/suite/components/inspector/content/prefs/prefsOverlay.xul b/suite/components/inspector/content/prefs/prefsOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/prefs/prefsOverlay.xul
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/prefs.dtd">
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <treechildren id="advancedChildren">
+    <treeitem id="inspectorItem" label="&Inspector.label;"
+              prefpane="inspector_pane" helpTopic="advanced_pref_dom_inspector"
+              url="chrome://inspector/content/prefs/pref-inspector.xul"/>
+  </treechildren>
+
+</overlay>
diff --git a/suite/components/inspector/content/res/Linux/winInspectorMain.xpm b/suite/components/inspector/content/res/Linux/winInspectorMain.xpm
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/res/Linux/winInspectorMain.xpm
@@ -0,0 +1,45 @@
+/* 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/. */
+
+/* XPM */
+static char * winInspectorMain_xpm[] = {
+"32 32 6 1",
+" 	c None",
+".	c #000000",
+"+	c #FFB300",
+"@	c #FF7500",
+"#	c #FF8C00",
+"$	c #FF0000",
+"................................",
+"................................",
+"..++++++++++++++++++++++++++++..",
+"..++++++++++++++++++++++++++++..",
+"..++++++++++........++++++++++..",
+"..++++++++++........++++++++++..",
+"..++++++....@@@@@@@@....++++++..",
+"..++++++....@@@@@@@@....++++++..",
+"..++++++..@@@@@@@@@@@@..++++++..",
+"..++++++..@@@@@@@@@@@@..++++++..",
+"..++++..@@@@@@@@@@@@@@@@..++++..",
+"..++++..@@@@@@@@@@@@@@@@..++++..",
+"..++++..@@@@@@@@@@@@@@@@..++++..",
+"..++++..@@@@@@@@@@@@@@@@..++++..",
+"..++++..@@@@@@@@@@@@##@@..++++..",
+"..++++..@@@@@@@@@@@@##@@..++++..",
+"..++++..@@@@@@@@@@@@##@@..++++..",
+"..++++..@@@@@@@@@@@@##@@..++++..",
+"..++++++..@@@@@@####$$..++++++..",
+"..++++++..@@@@@@####$$..++++++..",
+"..++++++....@@@@@@@@......++++..",
+"..++++++....@@@@@@@@......++++..",
+"..++++++++++........++......++..",
+"..++++++++++........++......++..",
+"..++++++++++++++++++++++........",
+"..++++++++++++++++++++++........",
+"..++++++++++++++++++++++++......",
+"..++++++++++++++++++++++++......",
+"..++++++++++++++++++++++++++....",
+"..++++++++++++++++++++++++++....",
+"................................",
+"................................"};
diff --git a/suite/components/inspector/content/res/Linux/winInspectorMain16.xpm b/suite/components/inspector/content/res/Linux/winInspectorMain16.xpm
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/res/Linux/winInspectorMain16.xpm
@@ -0,0 +1,29 @@
+/* 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/. */
+
+/* XPM */
+static char * winInspectorMain16_xpm[] = {
+"16 16 6 1",
+" 	c None",
+".	c #000000",
+"+	c #FFAD00",
+"@	c #FF6D00",
+"#	c #FF8500",
+"$	c #FF0000",
+"................",
+".++++++++++++++.",
+".+++++....+++++.",
+".+++..@@@@..+++.",
+".+++.@@@@@@.+++.",
+".++.@@@@@@@@.++.",
+".++.@@@@@@@@.++.",
+".++.@@@@@@#@.++.",
+".++.@@@@@@#@.++.",
+".+++.@@@##$.+++.",
+".+++..@@@@...++.",
+".+++++....+...+.",
+".+++++++++++....",
+".++++++++++++...",
+".+++++++++++++..",
+"................"};
diff --git a/suite/components/inspector/content/res/WINNT/winInspectorMain.ico b/suite/components/inspector/content/res/WINNT/winInspectorMain.ico
new file mode 100644
index 0000000000000000000000000000000000000000..78efb3acf8b4d277c01999e3d611c354b1f20227
GIT binary patch
diff --git a/suite/components/inspector/content/res/search-registry.rdf b/suite/components/inspector/content/res/search-registry.rdf
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/res/search-registry.rdf
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
+          xmlns:ins="http://www.mozilla.org/inspector#">
+
+  <rdf:Seq about="inspector:search">
+    <rdf:li><rdf:Description 
+      ins:uid="findOrphanImages"
+      ins:description="Find Orphan Images"
+      ins:factory="SearchModule_findOrphanImages"/></rdf:li>
+
+  </rdf:Seq>
+
+</rdf:RDF>
\ No newline at end of file
diff --git a/suite/components/inspector/content/res/viewer-registry.rdf b/suite/components/inspector/content/res/viewer-registry.rdf
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/res/viewer-registry.rdf
@@ -0,0 +1,336 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE RDF SYSTEM "chrome://inspector/locale/viewer-registry.dtd">  
+ 
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
+         xmlns:ins="http://www.mozilla.org/inspector#">
+
+<!-- Inspector-specific RDF attributes
+  xmlns:ins     Sets the ins: prefix to an Inspector-specific namespace URI.
+
+  ins:uid       Sets the basic viewer filename Inspector uses to find the viewer XUL file.
+                For example, ins:uid="dom" leads to chrome://inspector/content/viewers/dom/dom.xul
+                (ViewerRegistry.js#getEntryURL())
+
+  ins:panels    This determines which DOM Inspector panels, by id, the viewer referenced is valid for.
+                For example, ins:panels="bxObjectPanel bxObjPanel" means the panel id must be 
+                bxObjectPanel or bxObjPanel.
+
+  ins:description
+                This sets a title for the viewer.
+
+  ins:icon      This sets an icon for the viewer.  Currently unused.
+
+  ins:filter    This determines which nodes (or in the case of JavaScript Object
+                viewer, values), the viewer referenced is valid for.
+
+                @param object - nsIDOMNode object (or in the case of JavaScript
+                  Object viewer, JavaScript object).
+                @param linkedViewer - linked viewer object.
+
+                For example, ins:filter=
+                "return object instanceof Components.interfaces.nsIDOMDocument;"
+                is a JavaScript fragment ViewerRegistry.js uses to define a
+                filter function if the panel's subject node is an instance of
+                nsIDOMDocument.
+-->
+
+  <rdf:Seq about="inspector:viewers">
+    <rdf:li><rdf:Description 
+      ins:uid="dom"
+      ins:panels="bxDocPanel"
+      ins:description="&dom.label;"
+      ins:icon="chrome://inspector/content/viewers/dom/dom-icon.gif"
+      ins:filter="return object instanceof Components.interfaces.nsIDOMDocument;"/>
+    </rdf:li>
+
+    <rdf:li><rdf:Description 
+      ins:uid="stylesheets"
+      ins:panels="bxDocPanel"
+      ins:description="&stylesheets.label;"
+      ins:filter="return object instanceof Components.interfaces.nsIDOMDocument;"/>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description
+        ins:uid="domNode"
+        ins:panels="bxObjectPanel bxObjPanel"
+        ins:description="&domNode.label;">
+        <ins:filter><![CDATA[
+          return object instanceof Components.interfaces.nsIDOMNode ||
+            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+            object instanceof Components.interfaces.nsIAccessible;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description
+        ins:uid="boxModel"
+        ins:panels="bxObjectPanel bxObjPanel"
+        ins:description="&boxModel.label;">
+        <ins:filter><![CDATA[
+          return object instanceof Components.interfaces.nsIDOMElement ||
+            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+            object instanceof Components.interfaces.nsIAccessible &&
+            object.DOMNode instanceof Components.interfaces.nsIDOMElement;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description 
+        ins:uid="xblBindings"
+        ins:panels="bxObjectPanel bxObjPanel"
+        ins:description="&xblBindings.label;">
+        <ins:filter><![CDATA[
+          var node =
+            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+            object instanceof Components.interfaces.nsIAccessible ?
+            object.DOMNode : object;
+
+          if (node instanceof Components.interfaces.nsIDOMElement) {
+            try {
+              var urls =
+                Components.classes["@mozilla.org/inspector/dom-utils;1"].
+                  getService(Components.interfaces["inIDOMUtils"]).
+                  getBindingURLs(node);
+              return urls && urls.length;
+            }
+            catch (e) { }
+          }
+          return false;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description
+        ins:uid="styleRules"
+        ins:panels="bxObjectPanel bxObjPanel"
+        ins:description="&styleRules.label;">
+      <ins:filter><![CDATA[
+        return object instanceof Components.interfaces.nsIDOMElement ||
+          object instanceof Components.interfaces.nsIDOMCSSStyleSheet ||
+          "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+          object instanceof Components.interfaces.nsIAccessible &&
+          object.DOMNode instanceof Components.interfaces.nsIDOMElement;
+      ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description
+        ins:uid="computedStyle"
+        ins:panels="bxObjectPanel bxObjPanel"
+        ins:description="&computedStyle.label;">
+        <ins:filter><![CDATA[
+          return object instanceof Components.interfaces.nsIDOMElement ||
+            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+            object instanceof Components.interfaces.nsIAccessible &&
+            object.DOMNode instanceof Components.interfaces.nsIDOMElement;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li><rdf:Description 
+      ins:uid="usedFontFaces"
+      ins:panels="bxObjectPanel bxObjPanel"
+      ins:description="&usedFontFaces.label;">
+        <ins:filter><![CDATA[
+          // XXX getUsedFontFaces really works on a Range,
+          // but to avoid bug 166749 we permit any Node.
+          return (object instanceof Components.interfaces.nsIDOMNode ||
+                  "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+                  object instanceof Components.interfaces.nsIAccessible) &&
+            "getUsedFontFaces" in XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li><rdf:Description
+      ins:uid="jsObject"
+      ins:panels="bxDocPanel bxObjectPanel bxObjPanel"
+      ins:description="&jsObject.label;"
+      ins:filter="return true;"/>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleEvent"
+                       ins:panels="bxObjectPanel bxObjPanel"
+                       ins:description="&accessibleEvent.label;">
+        <ins:filter><![CDATA[
+          if (!linkedViewer || linkedViewer.uid != "accessibleEvents") {
+            return false;
+          }
+
+          const Ci = Components.interfaces;
+          if (object instanceof Ci.nsIDOMNode ||
+              ("@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+               object instanceof Ci.nsIAccessible)) {
+            return object;
+          }
+
+          return false;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleObject"
+                       ins:panels="bxObjectPanel bxObjPanel"
+                       ins:description="&accessibleObject.label;">
+        <ins:filter><![CDATA[
+          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
+              object instanceof Components.interfaces.nsIAccessible) {
+            return true;
+          }
+
+          if (!linkedViewer ||
+              !(object instanceof Components.interfaces.nsIDOMNode))
+            return false;
+
+          if (linkedViewer.uid != "accessibleEvents" &&
+              linkedViewer.uid != "accessibleTree" &&
+              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
+            return false;
+
+          try {
+            var accService =
+              Components.classes["@mozilla.org/accessibleRetrieval;1"]
+                        .getService(Components.interfaces.nsIAccessibleRetrieval);
+
+            if ("getAttachedAccessibleFor" in accService)
+              return accService.getAttachedAccessibleFor(object);
+            return accService.getAccessibleFor(object);
+          } catch(e) {
+            return false;
+          }
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleProps"
+                       ins:panels="bxObjectPanel bxObjPanel"
+                       ins:description="&accessibleProps.label;">
+        <ins:filter><![CDATA[
+          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
+              object instanceof Components.interfaces.nsIAccessible) {
+            return true;
+          }
+
+          if (!linkedViewer ||
+              !(object instanceof Components.interfaces.nsIDOMNode))
+            return false;
+
+          if (linkedViewer.uid != "accessibleEvents" &&
+              linkedViewer.uid != "accessibleTree" &&
+              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
+            return false;
+
+          try {
+            var accService =
+              Components.classes["@mozilla.org/accessibleRetrieval;1"]
+                        .getService(Components.interfaces.nsIAccessibleRetrieval);
+
+            if ("getAttachedAccessibleFor" in accService)
+              return accService.getAttachedAccessibleFor(object);
+            return accService.getAccessibleFor(object);
+          } catch(e) {
+            return false;
+          }
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleRelations"
+                       ins:panels="bxObjectPanel bxObjPanel"
+                       ins:description="&accessibleRelations.label;">
+        <ins:filter><![CDATA[
+          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
+              object instanceof Components.interfaces.nsIAccessible) {
+            return true;
+          }
+
+          if (!linkedViewer ||
+              !(object instanceof Components.interfaces.nsIDOMNode))
+            return false;
+
+          if (linkedViewer.uid != "accessibleEvents" &&
+              linkedViewer.uid != "accessibleTree" &&
+              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
+            return false;
+
+          try {
+            var accService =
+              Components.classes["@mozilla.org/accessibleRetrieval;1"]
+                        .getService(Components.interfaces.nsIAccessibleRetrieval);
+
+            if ("getAttachedAccessibleFor" in accService)
+              return accService.getAttachedAccessibleFor(object);
+            return accService.getAccessibleFor(object);
+          } catch(e) {
+            return false;
+          }
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleEvents"
+                       ins:panels="bxDocPanel"
+                       ins:description="&accessibleEvents.label;">
+        <ins:filter><![CDATA[
+          if (!("@mozilla.org/accessibleRetrieval;1" in Components.classes)) {
+            return false;
+          }
+
+          // Allow for DOM document and application accessible (compatible
+          // with Gecko 2.0 and 1.9.2).
+          const Ci = Components.interfaces;
+          if (object instanceof Ci.nsIDOMDocument) {
+            return true;
+          }
+
+          if ("nsIAccessibleApplication" in Ci) {
+            return object instanceof Ci.nsIAccessibleApplication;
+          }
+
+          return object instanceof Ci.nsIAccessible && !object.parent;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+
+    <rdf:li>
+      <rdf:Description ins:uid="accessibleTree"
+                       ins:panels="bxDocPanel"
+                       ins:description="&accessibleTree.label;">
+        <ins:filter><![CDATA[
+          if (!("@mozilla.org/accessibleRetrieval;1" in Components.classes)) {
+            return false;
+          }
+
+          // Allow for DOM document and application accessible (compatible
+          // with Gecko 2.0 and 1.9.2).
+          const Ci = Components.interfaces;
+          if (object instanceof Ci.nsIDOMDocument) {
+            return true;
+          }
+
+          if ("nsIAccessibleApplication" in Ci) {
+            return object instanceof Ci.nsIAccessibleApplication;
+          }
+
+          return object instanceof Ci.nsIAccessible && !object.parent;
+        ]]></ins:filter>
+      </rdf:Description>
+    </rdf:li>
+  </rdf:Seq>
+
+</rdf:RDF>
diff --git a/suite/components/inspector/content/sidebar.js b/suite/components/inspector/content/sidebar.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/sidebar.js
@@ -0,0 +1,117 @@
+/* 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/. */
+
+/*****************************************************************************
+* InspectorSidebar -----------------------------------------------------------
+*   The primary object that controls the Inspector sidebar.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var inspector;
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kObserverServiceContractID  = "@mozilla.org/observer-service;1";
+
+const gNavigator = window.content;
+
+//////////////////////////////////////////////////////////////////////////////
+
+function InspectorSidebar_initialize()
+{
+  inspector = new InspectorSidebar();
+  inspector.initialize();
+}
+
+window.addEventListener("load", InspectorSidebar_initialize, false);
+
+//////////////////////////////////////////////////////////////////////////////
+//// class InspectorSidebar
+
+function InspectorSidebar()
+{
+}
+
+InspectorSidebar.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  get document()
+  {
+    return this.mDocPanel.viewer.subject;
+  },
+
+  initialize: function IS_Initialize()
+  {
+    this.installNavObserver();
+
+    this.mPanelSet = document.getElementById("bxPanelSet");
+    this.mPanelSet.addObserver("panelsetready", this, false);
+    this.mPanelSet.initialize();
+  },
+
+  destroy: function IS_Destroy()
+  {
+  },
+
+  doViewerCommand: function IS_DoViewerCommand(aCommand)
+  {
+    this.mPanelSet.execCommand(aCommand);
+  },
+
+  getViewer: function IS_GetViewer(aUID)
+  {
+    return this.mPanelSet.registry.getViewerByUID(aUID);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Viewer Panels
+
+  initViewerPanels: function IS_InitViewerPanels()
+  {
+    this.mDocPanel = this.mPanelSet.getPanel(0);
+    this.mDocPanel.addObserver("subjectChange", this, false);
+    this.mObjectPanel = this.mPanelSet.getPanel(1);
+  },
+
+  onEvent: function IS_OnEvent(aEvent)
+  {
+    if (aEvent.type == "panelsetready") {
+      this.initViewerPanels();
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Navigation
+
+  setTargetWindow: function IS_SetTargetWindow(aWindow)
+  {
+    this.setTargetDocument(aWindow.document);
+  },
+
+  setTargetDocument: function IS_SetTargetDocument(aDoc)
+  {
+    this.mPanelSet.getPanel(0).subject = aDoc;
+  },
+
+  installNavObserver: function IS_InstallNavObserver()
+  {
+    var observerService = XPCU.getService(kObserverServiceContractID,
+                                          "nsIObserverService");
+    observerService.addObserver(NavLoadObserver, "EndDocumentLoad", false);
+  }
+};
+
+var NavLoadObserver = {
+  observe: function NLO_Observe(aWindow)
+  {
+    inspector.setTargetWindow(aWindow);
+  }
+};
diff --git a/suite/components/inspector/content/sidebar.xul b/suite/components/inspector/content/sidebar.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/sidebar.xul
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE window [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
+<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/sidebar.css"?>
+
+<window id="winInspectorMain" class="color-dialog"
+        title="&Inspector.title;"
+        width="400" height="700"
+        persist="screenX screenY width height sizemode"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/sidebar.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/Flasher.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/ViewerRegistry.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
+
+  <commandset id="cmdsGlobalCommands"/>
+  <keyset id="ksGlobalKeyset"/>
+  <popupset id="ppsViewerPopupset"/>
+
+  <domi-panelset id="bxPanelSet" flex="1" viewercommandset="cmdsGlobalCommands">
+    <tabbox flex="1" orient="vertical">
+      <tabs>
+        <tab label="&bxDocPanel.title;"/>
+        <tab label="&bxObjectPanel.title;"/>
+      </tabs>
+      <tabpanels flex="1">
+        <domi-panel id="bxDocPanel" title="&bxDocPanel.title;"/>
+        <domi-panel id="bxObjPanel" title="&bxObjectPanel.title;"
+                    linkedpanel="bxDocPanel"/>
+      </tabpanels>
+    </tabbox>
+  </domi-panelset>
+</window>
diff --git a/suite/components/inspector/content/statusbarOverlay.xul b/suite/components/inspector/content/statusbarOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/statusbarOverlay.xul
@@ -0,0 +1,17 @@
+<?xml version="1.0"?> 
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<overlay id="ovStatusbar"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <statusbar id="status-bar">
+    <statusbarpanel id="txStatusPanel" flex="1"/>
+    <statusbarpanel class="statusbarpanel-progress">
+      <progressmeter id="pmStatus" mode="normal" value="0" class="progressmeter-statusbar"/>
+    </statusbarpanel>
+  </statusbar>
+
+</overlay>
diff --git a/suite/components/inspector/content/tasksOverlay.xul b/suite/components/inspector/content/tasksOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/tasksOverlay.xul
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/tasksOverlay.dtd" >
+
+<overlay id="eInspectorTasksOverlay"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+
+  <commandset id="tasksCommands">
+    <command id="Tasks:Inspector" oncommand="inspectDOMDocument();"/>
+    <command id="Tasks:InspectPage"
+             oncommand="inspectDOMDocument(content ? content.document : document);"/>
+  </commandset>
+
+  <keyset id="tasksKeys">
+    <key id="key_inspectPage"
+         key="&inspectorTaskCmd.commandkey;"
+         modifiers="accel,alt"
+         command="Tasks:InspectPage"/>
+  </keyset>
+
+  <menupopup id="toolsPopup">
+    <menuitem id="menu_inspector" label="&inspectorTaskCmd.label;"
+              key="key_inspectPage" accesskey="&inspectorTaskCmd.accesskey;"
+              command="Tasks:Inspector"/>
+  </menupopup>
+
+</overlay>
diff --git a/suite/components/inspector/content/tests/allskin.xul b/suite/components/inspector/content/tests/allskin.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/tests/allskin.xul
@@ -0,0 +1,77 @@
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://communicator/skin/box.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/brand.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/button.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/communicator.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/menubutton.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/prefpanels.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/securityOverlay.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/splitter.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/tasksOverlay.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/toolbar.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarks.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/directory/directory.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/profile/profile.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/profile/profileManager.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/regviewer/regviewer.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/related/related.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/findresults.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/icons.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/internet.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/internetresults.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/search-editor.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/search/search.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/sidebar/customize.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/sidebar/preview.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/sidebar/sidebar.css"?>
+<?xml-stylesheet href="chrome://communicator/skin/xpinstall/xpinstall.css"?>
+<?xml-stylesheet href="chrome://editor/skin/EdImageMap.css"?>
+<?xml-stylesheet href="chrome://editor/skin/EdImageMapPage.css"?>
+<?xml-stylesheet href="chrome://editor/skin/editor.css"?>
+<?xml-stylesheet href="chrome://editor/skin/EditorDialog.css"?>
+<?xml-stylesheet href="chrome://editor/skin/EditorToolbars.css"?>
+<?xml-stylesheet href="chrome://global/skin/box.css"?>
+<?xml-stylesheet href="chrome://global/skin/button.css"?>
+<?xml-stylesheet href="chrome://global/skin/checkbox.css"?>
+<?xml-stylesheet href="chrome://global/skin/colorpicker.css"?>
+<?xml-stylesheet href="chrome://global/skin/commonDialog.css"?>
+<?xml-stylesheet href="chrome://global/skin/console.css"?>
+<?xml-stylesheet href="chrome://global/skin/filepicker.css"?>
+<?xml-stylesheet href="chrome://global/skin/formatting.css"?>
+<?xml-stylesheet href="chrome://global/skin/global.css"?>
+<?xml-stylesheet href="chrome://global/skin/menu.css"?>
+<?xml-stylesheet href="chrome://global/skin/menubutton.css"?>
+<?xml-stylesheet href="chrome://global/skin/menulist.css"?>
+<?xml-stylesheet href="chrome://global/skin/radio.css"?>
+<?xml-stylesheet href="chrome://global/skin/scrollbars.css"?>
+<?xml-stylesheet href="chrome://global/skin/splitter.css"?>
+<?xml-stylesheet href="chrome://global/skin/tabcontrol.css"?>
+<?xml-stylesheet href="chrome://global/skin/tasksOverlay.css"?>
+<?xml-stylesheet href="chrome://global/skin/textfield.css"?>
+<?xml-stylesheet href="chrome://global/skin/toolbar.css"?>
+<?xml-stylesheet href="chrome://global/skin/tree.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/AccountManager.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/fieldMapImport.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/folderPane.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/importDialog.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/mailheader.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/messenger.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/msgHdrViewOverlay.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/pref-mailnews.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/subscribe.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/threadPane.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/wizard.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/addressbook/addressbook.css"?>
+<?xml-stylesheet href="chrome://messenger/skin/messengercompose/messengercompose.css"?>
+<?xml-stylesheet href="chrome://navigator/skin/navigator.css"?>
+<?xml-stylesheet href="chrome://navigator/skin/NavSecurityOverlay.css"?>
+
+<window orient="vertical"
+  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <label value="All skin css files are now loaded."/>
+
+</window>
+
+        
diff --git a/suite/components/inspector/content/toolboxOverlay.xul b/suite/components/inspector/content/toolboxOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/toolboxOverlay.xul
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+]>
+
+<overlay id="ovToolbox"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <popupset id="ppsGlobalPopupset"/>
+
+  <menubar id="mbrInspectorMain">
+
+    <menu id="mnFile" label="&mnFile.label;" accesskey="&mnFile.accesskey;">
+      <menupopup id="menu_FilePopup"/>
+    </menu>
+
+    <menu id="mnEdit" label="&mnEdit.label;" accesskey="&mnEdit.accesskey;">
+      <menupopup id="mppEdit"/>
+    </menu>
+
+    <menu id="mnView" label="&mnView.label;" accesskey="&mnView.accesskey;">
+      <menupopup id="mppView"/>
+    </menu>
+
+    <menu id="tasksMenu"/> <!-- SeaMonkey -->
+    <menu id="windowMenu"/> <!-- Firefox-mac, SeaMonkey -->
+    <menupopup id="menu_ToolsPopup"/> <!-- Mac magic -->
+    <menu id="menu_Help"/> <!-- SeaMonkey -->
+    <menu id="helpMenu"/>  <!-- Firefox -->
+
+  </menubar>
+
+  <toolbar id="tbInspectorPrimary" class="chromeclass-toolbar">
+
+    <hbox id="bxURLBar" flex="1">
+      <toolbarbutton id="btnSelecting" type="checkbox"
+                     observes="cmd:selectByClick"
+                     tooltiptext="&btnSelecting.tooltip;"/>
+
+      <toolbarbutton id="btnFind" observes="cmd:find"
+                     tooltiptext="&btnFind.tooltip;"/>
+
+      <hbox id="bxURLBarContainer" flex="1">
+        <hbox align="center" flex="1">
+          <!-- request both autocomplete implementations for compatibility -->
+          <textbox id="tfURLBar" type="autocomplete" flex="1"
+            searchSessions="history" timeout="50" maxrows="6" class="padded"
+            placeholder="&cmdEnterLocation.label;"
+            autocompletesearch="history file" observes="cmdGotoURL">
+            <image id="imgURLBarIcon" class="bookmark-item"/>
+          </textbox>
+        </hbox>
+
+      </hbox>
+
+      <toolbarbutton label="&btnInspect.label;"
+                     accesskey="&btnInspect.accesskey;"
+                     observes="cmdGotoURL"/>
+    </hbox>
+
+  </toolbar>
+
+</overlay>
diff --git a/suite/components/inspector/content/utils.js b/suite/components/inspector/content/utils.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/utils.js
@@ -0,0 +1,194 @@
+/* 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/. */
+
+/*****************************************************************************
+* Inspector Utils ------------------------------------------------------------
+*  Common functions and constants used across the app.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+* chrome://inspector/content/jsutil/xpcom/XPCU.js
+* chrome://inspector/content/jsutil/rdf/RDFU.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kInspectorNSURI = "http://www.mozilla.org/inspector#";
+const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/" +
+                  "there.is.only.xul";
+const kHTMLNSURI = "http://www.w3.org/1999/xhtml";
+const kCharTable = {
+  '&': "&amp;",
+  '<': "&lt;",
+  '>': "&gt;",
+  '"': "&quot;"
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var gEntityConverter;
+
+var InsUtil = {
+  /***************************************************************************
+  * Convenience function for calling nsIChromeRegistry::convertChromeURL
+  ***************************************************************************/
+  convertChromeURL: function IU_ConvertChromeURL(aURL)
+  {
+    var uri =
+      XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService")
+        .newURI(aURL, null, null);
+    var reg = XPCU.getService("@mozilla.org/chrome/chrome-registry;1",
+                              "nsIChromeRegistry");
+
+    return reg.convertChromeURL(uri);
+  },
+
+  /***************************************************************************
+  * Convenience function for getting a literal value from
+  * nsIRDFDataSource::GetTarget
+  * @param aDS
+  *        nsISupports
+  * @param aId
+  *        string
+  * @param aPropName
+  *        string
+  ***************************************************************************/
+  getDSProperty: function IU_GetDSProperty(aDS, aId, aPropName)
+  {
+    var ruleRes = gRDF.GetResource(aId);
+    var ds = XPCU.QI(aDS, "nsIRDFDataSource"); // just to be sure
+    var propRes = ds.GetTarget(ruleRes,
+                               gRDF.GetResource(kInspectorNSURI + aPropName),
+                               true);
+    propRes = XPCU.QI(propRes, "nsIRDFLiteral");
+
+    return propRes.Value;
+  },
+
+  /***************************************************************************
+  * Convenience function for persisting an element's persisted attributes.
+  ***************************************************************************/
+  persistAll: function IU_PersistAll(aId)
+  {
+    var el = document.getElementById(aId);
+    if (el) {
+      var attrs = el.getAttribute("persist").split(" ");
+      for (var i = 0; i < attrs.length; ++i) {
+        document.persist(aId, attrs[i]);
+      }
+    }
+  },
+
+  /***************************************************************************
+  * Convenience function for escaping HTML strings.
+  ***************************************************************************/
+  unicodeToEntity: function IU_UnicodeToEntity(text)
+  {
+    const entityVersion = Components.interfaces.nsIEntityConverter.entityW3C;
+
+    function charTableLookup(letter)
+    {
+      return kCharTable[letter];
+    }
+
+    function convertEntity(letter)
+    {
+      try {
+        return gEntityConverter.ConvertToEntity(letter, entityVersion);
+      }
+      catch (ex) {
+        return letter;
+      }
+    }
+
+    if (!gEntityConverter) {
+      try {
+        gEntityConverter =
+          XPCU.createInstance("@mozilla.org/intl/entityconverter;1",
+                              "nsIEntityConverter");
+      }
+      catch (ex) { }
+    }
+
+    // replace chars in our charTable
+    text = text.replace(/[<>&"]/g, charTableLookup);
+
+    // replace chars > 0x7f via nsIEntityConverter
+    text = text.replace(/[^\0-\u007f]/g, convertEntity);
+
+    return text;
+  },
+
+  /**
+   * Determine which from a list of indexes is nearest to the given index.
+   * @param aIndex
+   *        The index to search for.
+   * @param aIndexList
+   *        A sorted list of indexes to be searched.
+   * @return The index in the list closest to aIndex.  This will be aIndex
+   *         itself if it appears in the list, or -1 if the list is empty.
+   * @note
+   */
+  getNearestIndex: function IU_GetNearestIndex(aIndex, aIndexList)
+  {
+    // Four easy cases:
+    //  - empty list
+    //  - single element list
+    //  - given index comes before the first element
+    //  - given index comes after the last element
+    if (aIndexList.length == 0) {
+      return -1;
+    }
+    var first = aIndexList[0];
+    if (aIndexList.length == 1 || aIndex <= first) {
+      return first;
+    }
+    var high = aIndexList.length - 1;
+    var last = aIndexList[high];
+    if (aIndex >= last) {
+      return last;
+    }
+  
+    var mid, low = 0;
+    while (low <= high) {
+      mid = low + Math.floor((high - low) / 2);
+      let current = aIndexList[mid];
+      if (aIndex > current) {
+        low = mid + 1;
+      }
+      else if (aIndex < current) {
+        high = mid - 1;
+      }
+      else {
+        return aIndex;
+      }
+    }
+  
+    // By handling the four easy cases above, we eliminated the possibility
+    // that low or high will be out of bounds at this point.  If aIndex had
+    // been present, it would have been sandwiched between these two values:
+    var previous = aIndexList[high];
+    var next = aIndexList[low];
+  
+    if ((aIndex - previous) < (next - aIndex)) {
+      return previous;
+    }
+    // Even if previous and next are equidistant to aIndex's position, we'll
+    // go with the one that's greater.
+    return next;
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Debugging Utilities
+
+// dump text to the Error Console
+function debug(aText)
+{
+  // XX comment out to reduce noise
+  var cs =
+    XPCU.getService("@mozilla.org/consoleservice;1", "nsIConsoleService");
+  cs.logStringMessage(aText);
+}
diff --git a/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.js b/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.js
@@ -0,0 +1,255 @@
+/* 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/. */
+ 
+ 
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+
+const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
+const nsIAccessibleStateChangeEvent =
+  Components.interfaces.nsIAccessibleStateChangeEvent;
+const nsIAccessibleTextChangeEvent =
+  Components.interfaces.nsIAccessibleTextChangeEvent;
+const nsIAccessibleCaretMoveEvent =
+  Components.interfaces.nsIAccessibleCaretMoveEvent;
+
+const nsIDOMNode = Components.interfaces.nsIDOMNode;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization/Destruction
+
+window.addEventListener("load", AccessibleEventViewer_initialize, false);
+
+function AccessibleEventViewer_initialize()
+{
+  viewer = new AccessibleEventViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class AccessibleEventViewer
+function AccessibleEventViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                     nsIAccessibleRetrieval);
+}
+
+AccessibleEventViewer.prototype =
+{
+  mSubject: null,
+  mPane: null,
+  mAccEventSubject: null,
+  mAccService: null,
+
+  get uid() { return "accessibleEvent"; },
+  get pane() { return this.mPane; },
+
+  get subject() { return this.mSubject; },
+  set subject(aObject)
+  {
+    this.mSubject = aObject;
+    this.updateView();
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    return false;
+  },
+
+  getCommand: function getCommand(aCommand)
+  {
+    return null;
+  },
+
+  destroy: function destroy() {},
+
+  // event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  // private
+  updateView: function updateView()
+  {
+    this.clearView();
+
+    if (!this.pane.params) {
+      return;
+    }
+
+    this.mAccEventSubject = this.pane.params.accessibleEvent;
+    if (!this.mAccEventSubject)
+      return;
+
+    XPCU.QI(this.mAccEventSubject, nsIAccessibleEvent);
+
+    // Update accessible event properties.
+    var shownPropsId = "";
+    if (this.mAccEventSubject instanceof nsIAccessibleStateChangeEvent)
+      shownPropsId = "stateChangeEvent";
+    else if (this.mAccEventSubject instanceof nsIAccessibleTextChangeEvent)
+      shownPropsId = "textChangeEvent";
+    else if (this.mAccEventSubject instanceof nsIAccessibleCaretMoveEvent)
+      shownPropsId = "caretMoveEvent";
+
+    var props = document.getElementsByAttribute("prop", "*");
+    for (var i = 0; i < props.length; i++) {
+      var propElm = props[i];
+      var isActive = !propElm.hasAttribute("class") ||
+                     (propElm.getAttribute("class") == shownPropsId);
+
+      if (isActive) {
+        var prop = propElm.getAttribute("prop");
+        propElm.textContent = this[prop];
+        propElm.parentNode.removeAttribute("hidden");
+      } else {
+        propElm.parentNode.setAttribute("hidden", "true");
+      }
+    }
+
+    // Update handler output.
+    var outputElm = document.getElementById("handlerOutput");
+    var outputList = this.pane.params.accessibleEventHandlerOutput;
+    if (outputList) {
+      while (outputElm.firstChild) {
+        outputElm.removeChild(outputElm.lastChild);
+      }
+
+      for (let i = 0; i < outputList.length; i++) {
+        var output = outputList[i];
+
+        // Generate a tree.
+        if (typeof output == "object" && "cols" in output && "view" in output) {
+          var tree = document.createElement("tree");
+          tree.setAttribute("flex", "1");
+          tree.setAttribute("treelines", "true");
+
+          var treecols = document.createElement("treecols");
+          for (let col in output.cols) {
+            var treecol = document.createElement("treecol");
+            treecol.setAttribute("id", col);
+            treecol.setAttribute("label", output.cols[col].name);
+            treecol.setAttribute("flex", output.cols[col].flex);
+            if (output.cols[col].isPrimary) {
+              treecol.setAttribute("primary", "true");
+            }
+            treecol.setAttribute("persist", "width,hidden,ordinal");
+            treecols.appendChild(treecol);
+
+            var splitter = document.createElement("splitter");
+            splitter.setAttribute("class", "tree-splitter");
+            treecols.appendChild(splitter);
+          }
+          tree.appendChild(treecols);
+
+          var treechildren = document.createElement("treechildren");
+          tree.appendChild(treechildren);
+          outputElm.appendChild(tree);
+          tree.treeBoxObject.view = output.view;
+
+        }
+        else {
+          // Output text.
+          var node = document.createElement("description");
+          node.textContent = output;
+          outputElm.appendChild(node);
+        }
+      }
+
+      outputElm.parentNode.removeAttribute("hidden");
+    }
+    else {
+      outputElm.parentNode.setAttribute("hidden", "true");
+    }
+  },
+
+  clearView: function clearView()
+  {
+    var containers = document.getElementsByAttribute("prop", "*");
+    for (var i = 0; i < containers.length; ++i)
+      containers[i].textContent = "";
+  },
+
+  get isFromUserInput()
+  {
+    return this.mAccEventSubject.isFromUserInput;
+  },
+
+  get state()
+  {
+    var state = 0, extraState = 0;
+    var isExtraState = typeof this.mAccEventSubject.isExtraState == "function" ?
+      this.mAccEventSubject.isExtraState() : this.mAccEventSubject.isExtraState;
+    if (isExtraState) {
+      extraState = this.mAccEventSubject.state;
+    }
+    else {
+      state = this.mAccEventSubject.state;
+    }
+
+    var states = this.mAccService.getStringStates(state, extraState);
+
+    var list = [];
+    for (var i = 0; i < states.length; i++)
+      list.push(states.item(i));
+    return list.join();
+  },
+
+  get isEnabled()
+  {
+    return typeof this.mAccEventSubject.isEnabled == "function" ?
+      this.mAccEventSubject.isEnabled() : this.mAccEventSubject.isEnabled;
+  },
+
+  get startOffset()
+  {
+    return this.mAccEventSubject.start;
+  },
+
+  get length()
+  {
+    return this.mAccEventSubject.length;
+  },
+
+  get isInserted()
+  {
+    return typeof this.mAccEventSubject.isInserted == "function" ?
+      this.mAccEventSubject.isInserted() : this.mAccEventSubject.isInserted;
+  },
+
+  get modifiedText()
+  {
+    return this.mAccEventSubject.modifiedText;
+  },
+
+  get caretOffset()
+  {
+    return this.mAccEventSubject.caretOffset;
+  }
+};
+
diff --git a/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.xul b/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleEvent/accessibleEvent.xul
@@ -0,0 +1,70 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleEvent.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet
+    href="chrome://inspector/skin/viewers/accessibleEvent/accessibleEvent.css"?>
+
+<page id="winAccessibleEvent"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleEvent/accessibleEvent.js"/>
+
+  <grid>
+    <columns>
+      <column/>
+      <column flex="1"/>
+    </columns>
+    <rows>
+      <row>
+        <description>&descIsFromUserInput.label;</description>
+        <description prop="isFromUserInput"/>
+      </row>
+      <row>
+        <description>&descState.label;</description>
+        <description prop="state" class="stateChangeEvent"/>
+      </row>
+      <row>
+        <description>&descIsEnabled.label;</description>
+        <description prop="isEnabled" class="stateChangeEvent"/>
+      </row>
+      <row>
+        <description>&descStartOffset.label;</description>
+        <description prop="startOffset" class="textChangeEvent"/>
+      </row>
+      <row>
+        <description>&descLength.label;</description>
+        <description prop="length" class="textChangeEvent"/>
+      </row>
+      <row>
+        <description>&descIsInserted.label;</description>
+        <description prop="isInserted" class="textChangeEvent"/>
+      </row>
+      <row>
+        <description>&descModifiedText.label;</description>
+        <description prop="modifiedText" class="textChangeEvent"/>
+      </row>
+      <row>
+        <description>&descCaretOffset.label;</description>
+        <description prop="caretOffset" class="caretMoveEvent"/>
+      </row>
+    </rows>
+  </grid>
+  <vbox flex="1">
+    <description>&descrHandlerOutput.label;</description>
+    <vbox id="handlerOutput" flex="1"/>
+  </vbox>
+</page>
+
diff --git a/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.js b/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.js
@@ -0,0 +1,1194 @@
+/* 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/. */
+
+/***************************************************************
+* AccessibleEventsViewer --------------------------------------------
+*  The viewer for the accessible events occured on a document accessible.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var gBundle;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kObserverServiceCID = "@mozilla.org/observer-service;1";
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const Ci = Components.interfaces;
+const nsIObserverService = Ci.nsIObserverService;
+const nsIAccessibleRetrieval = Ci.nsIAccessibleRetrieval;
+const nsIAccessibleEvent = Ci.nsIAccessibleEvent;
+const nsIAccessible = Ci.nsIAccessible;
+const nsIPropertyElement = Ci.nsIPropertyElement;
+
+const gAccInterfaces =
+[
+  Ci.nsIAccessible,
+  Ci.nsIAccessibleDocument,
+  Ci.nsIAccessibleEditableText,
+  Ci.nsIAccessibleHyperLink,
+  Ci.nsIAccessibleHyperText,
+  Ci.nsIAccessibleImage,
+  Ci.nsIAccessibleSelectable,
+  Ci.nsIAccessibleTable,
+  Ci.nsIAccessibleTableCell,
+  Ci.nsIAccessibleText,
+  Ci.nsIAccessibleValue
+];
+
+if ("nsIAccessNode" in Ci)
+  gAccInterfaces.push(Ci.nsIAccessNode);
+
+/**
+ * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
+ * prior to Gecko13.
+ */
+function QIAccessNode(aAccessible)
+{
+  return "nsIAccessNode" in Ci ?
+    XPCU.QI(aAccessible, Ci.nsIAccessNode) : aAccessible;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization
+
+window.addEventListener("load", AccessibleEventsViewer_initialize, false);
+
+function AccessibleEventsViewer_initialize()
+{
+  gBundle = document.getElementById("accessiblePropsBundle");
+
+  viewer = new AccessibleEventsViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class AccessibleEventsViewer
+
+function AccessibleEventsViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  this.mTree = document.getElementById("olAccessibleEvents");
+  this.mOlBox = this.mTree.treeBoxObject;
+
+  this.mWatchTree = document.getElementById("watchEventList");
+  this.mWatchBox = this.mWatchTree.treeBoxObject;
+}
+
+AccessibleEventsViewer.prototype =
+{
+  // initialization
+
+  mSubject: null,
+  mPane: null,
+  mView: null,
+
+  // interface inIViewer
+
+  get uid() { return "accessibleEvents"; },
+  get pane() { return this.mPane; },
+  get selection() { return this.mSelection; },
+
+  get subject() { return this.mSubject; },
+  set subject(aObject)
+  {
+    this.mWatchView = new WatchAccessibleEventsListView();
+
+    if (this.mView) {
+      this.mView.destroy();
+    }
+    this.mView = new AccessibleEventsView(aObject, this.mWatchView);
+
+    this.mOlBox.view = this.mView;
+    this.mWatchBox.view = this.mWatchView;
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function destroy()
+  {
+    this.mView.destroy();
+    this.mOlBox.view = null;
+    this.mWatchBox.view = null;
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    return false;
+  },
+
+  getCommand: function getCommand(aCommand)
+  {
+    return null;
+  },
+
+  // event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  // utils
+
+  onItemSelected: function onItemSelected()
+  {
+    var idx = this.mTree.currentIndex;
+    var object = this.mView.getObject(idx);
+
+    // Set subject for right panel view.
+    this.mSelection = object.accessnode;
+
+    // Set parameters for right panel view.
+    if (this.pane.panelset.panelCount > 1) {
+      this.pane.panelset.getPanel(1).params = {
+        accessibleEvent: object.event,
+        accessibleEventHandlerOutput: object.eventHandlerOutput
+      };
+    }
+
+    this.mObsMan.dispatchEvent("selectionChange",
+                               { selection: this.mSelection } );
+  },
+
+  onWatchViewItemSelected: function onWatchViewItemSelected()
+  {
+    this.mWatchView.updateHandlerEditor();
+    this.mWatchView.updateHandlerState();
+  },
+
+  onWatchViewHandlerStateChanged:
+    function onWatchViewHandlerStateChanged(aState)
+  {
+    this.mWatchView.updateHandlerState(aState);
+  },
+
+  onWatchViewKeyPressed: function onWatchViewKeyPressed(aEvent)
+  {
+    // SPACE key was pressed. Toggle the row's Watched column tick.
+    if (aEvent.charCode == KeyEvent.DOM_VK_SPACE)
+      this.mWatchView.toggleEventWatched();
+  },
+
+  /**
+   * Clear the list of handled events.
+   */
+  clearEventsList: function clearEventsList()
+  {
+    this.mView.clear();
+  },
+
+  /**
+   * Start or stop to watch all events.
+   *
+   * @param  aDoWatch  [in] indicates whether to start or stop events watching.
+   */
+  watchAllEvents: function watchAllEvents(aDoWatch)
+  {
+    this.mWatchView.watchAllEvents(aDoWatch);
+  },
+
+  /**
+   * Shows context help for event handler editor.
+   */
+  showWatchViewHandlerHelp: function showWatchViewHandlerHelp()
+  {
+    openDialog("chrome://inspector/content/viewers/accessibleEvents/handlerHelpDialog.xul",
+               "_blank", "chrome,modal,centerscreen");
+  },
+
+  /**
+   * Open/hide handler editor.
+   */
+  toggleHandlerEditor: function toggleHandlerEditor(aSplitter)
+  {
+    var state = aSplitter.getAttribute("state");
+    if (state == "collapsed") {
+      aSplitter.setAttribute("state", "open");
+    }
+    else {
+      aSplitter.setAttribute("state", "collapsed");
+    }
+  }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleEventsView
+
+function AccessibleEventsView(aObject, aWatchView)
+{
+  this.mWatchView = aWatchView;
+  this.mEvents = [];
+  this.mRowCount = 0;
+
+  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                     nsIAccessibleRetrieval);
+
+  this.mAccessible = aObject instanceof nsIAccessible ?
+    aObject : this.mAccService.getAccessibleFor(aObject);
+
+  this.canSkipTreeTraversal = false;
+  this.mDOMIRootDocumentAccessible = null;
+  var acc = QIAccessNode(this.mAccService.getAccessibleFor(document));
+  if ("rootDocument" in acc) {
+    this.mDOMIRootDocumentAccessible = acc.rootDocument;
+    this.mApplicationAccessible = this.mDOMIRootDocumentAccessible.parent;
+
+    // We can skip accessible tree traversal for perf on Gecko 2.0 if the
+    // inspected accessible is application accessible.
+    this.canSkipTreeTraversal =
+      (this.mAccessible == this.mApplicationAccessible);
+  }
+  else {
+    // Gecko 1.9.2 compatibility.
+    while (acc.parent) {
+      this.mDOMIRootDocumentAccessible = acc;
+      acc = acc.parent;
+    }
+    this.mApplicationAccessible = acc;
+  }
+
+  this.mObserverService = XPCU.getService(kObserverServiceCID,
+                                          nsIObserverService);
+
+  this.mObserverService.addObserver(this, "accessible-event", false);
+}
+
+AccessibleEventsView.prototype = new inBaseTreeView();
+
+/**
+ * Global variables used to store event object and user's event handler output
+ * from helper functions.
+ */
+var gEvent = null;
+var gEventHandlerOutput = [ ];
+
+AccessibleEventsView.prototype.observe =
+function observe(aSubject, aTopic, aData)
+{
+  var event = XPCU.QI(aSubject, nsIAccessibleEvent);
+  var accessible = event.accessible;
+  if (!accessible)
+    return;
+
+  var accessnode = QIAccessNode(accessible);
+
+  // Ignore events on this DOM Inspector to avoid a mess (Gecko 2.0).
+  if (accessnode.rootDocument &&
+      accessnode.rootDocument == this.mDOMIRootDocumentAccessible) {
+    return;
+  }
+
+  // Ignore events having target not in subtree of currently inspected
+  // document accessible.
+  if (!this.canSkipTreeTraversal) {
+    var parentDocAccessible = accessible.document;
+    while (true) {
+      // The target accessible is inspected document accessible or its child.
+      if (parentDocAccessible == this.mAccessible) {
+        break;
+      }
+
+      // Ignore events on this DOM inspector to avoid a mess.
+      if (parentDocAccessible == this.mDOMIRootDocumentAccessible) {
+        return;
+      }
+
+      // Ignore events that aren't in subtree of inspected accessible.
+      if (!parentDocAccessible.parent || !parentDocAccessible.parent.document) {
+        return;
+      }
+
+      parentDocAccessible = parentDocAccessible.parent.document;
+    }
+  }
+
+  // Ignore unwatched events.
+  var type = event.eventType;
+  if (!this.mWatchView.isEventWatched(type))
+    return;
+
+  // Execute user handlers.
+  gEvent = event;
+  gEventHandlerOutput = [ ];
+  var expr = this.mWatchView.getHandlerExpr(type);
+  if (expr) {
+    for (let idx = 0; idx < gAccInterfaces.length; idx++) {
+      // Accessibility interfaces implicit query.
+      accessible instanceof gAccInterfaces[idx];
+    }
+
+    try {
+      var f = Function("event", "target", expr);
+      f(event, accessible);
+    }
+    catch (ex) {
+      output(ex);
+    }
+  }
+
+  // Put event into list.
+  var date = new Date();
+  var node = accessnode.DOMNode;
+  var role = "", name = "";
+  try {
+    // may fail prior Gecko 2.0
+    role = this.mAccService.getStringRole(accessible.role);
+    name = accessible.name;
+  } catch(e) {
+  }
+
+  var eventObj = {
+    event: event,
+    eventHandlerOutput: gEventHandlerOutput,
+    accessnode: accessnode,
+    node: node,
+    id: node.id || "",
+    nodename: node ? node.nodeName : "",
+    name: name,
+    role: role,
+    type: this.mAccService.getStringEventType(type),
+    time: date.toLocaleTimeString()
+  };
+
+  this.mEvents.unshift(eventObj);
+  ++this.mRowCount;
+  this.mTree.rowCountChanged(0, 1);
+}
+
+AccessibleEventsView.prototype.destroy =
+function destroy()
+{
+  this.mObserverService.removeObserver(this, "accessible-event");
+}
+
+AccessibleEventsView.prototype.clear =
+function clear()
+{
+  var count = this.mRowCount;
+  this.mRowCount = 0;
+  this.mEvents = [];
+  this.mTree.rowCountChanged(0, -count);
+}
+
+/**
+ * Return object to be used as a subject for the right panel. It could be either
+ * DOM node or accessible object depending on whether accessible has a DOM node.
+ * Also the returned object has properties that can used by accessibleEvent
+ * view to represent information about accessible event and output from user
+ * defined accessible event handlers.
+ */
+AccessibleEventsView.prototype.getObject =
+function getObject(aRow)
+{
+  return aRow < 0 ? null : this.mEvents[aRow];
+}
+
+AccessibleEventsView.prototype.getCellText =
+function getCellText(aRow, aCol)
+{
+  if (aCol.id == "olcEventType")
+    return this.mEvents[aRow].type;
+  if (aCol.id == "olcEventTime")
+    return this.mEvents[aRow].time;
+  if (aCol.id == "olcEventTargetNodeName")
+    return this.mEvents[aRow].nodename;
+  if (aCol.id == "olcEventTargetNodeID")
+    return this.mEvents[aRow].id;
+  if (aCol.id == "olcEventTargetRole")
+    return this.mEvents[aRow].role;
+  if (aCol.id == "olcEventTargetName")
+    return this.mEvents[aRow].name;
+  return "";
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// WatchAccessibleEventsListView
+
+const kIgnoredEvents = -1;
+const kMutationEvents = 0;
+const kChangeEvents = 1;
+const kNotificationEvents = 2;
+const kSelectionEvents = 3;
+const kMenuEvents = 4;
+const kDocumentEvents = 5;
+const kTextEvents = 6;
+const kTableEvents = 7;
+const kWindowEvents = 8;
+const kHyperLinkEvents = 9;
+const kHyperTextEvents = 10;
+
+function WatchAccessibleEventsListView()
+{
+  // nsITreeView
+  this.__proto__ = new inBaseTreeView();
+
+  this.__defineGetter__(
+    "rowCount",
+    function watchview_getRowCount()
+    {
+      var rowCount = 0;
+
+      for (var idx = 0; idx < this.mChildren.length; idx++) {
+        rowCount++;
+
+        if (this.mChildren[idx].open)
+        rowCount += this.mChildren[idx].children.length;
+      }
+
+      return rowCount;
+    }
+  );
+
+  this.getCellText = function watchview_getCellText(aRowIndex, aCol)
+  {
+    if (aCol.id == "welEventType") {
+      var data = this.getData(aRowIndex);
+      return data.text;
+    }
+
+    return "??";
+  };
+
+  this.getCellValue = function watchview_getCellValue(aRowIndex, aCol)
+  {
+    if (aCol.id == "welIsWatched") {
+      var data = this.getData(aRowIndex);
+      return data.value;
+    }
+    else if (aCol.id == "welIsHandlerEnabled") {
+      var data = this.getData(aRowIndex);
+      return data.isHandlerEnabled;
+    }
+
+    return false;
+  };
+
+  this.getParentIndex = function watchview_getParentIndex(aRowIndex)
+  {
+    var info = this.getInfo(aRowIndex);
+    return info.parentIndex;
+  };
+
+  this.hasNextSibling = function(aRowIndex, aAfterIndex)
+  {
+    var info = this.getInfo(aRowIndex);
+    var siblings = info.parentData.children;
+    return siblings[siblings.length - 1] != info.data;
+  };
+
+  this.getLevel = function watchview_getLevel(aRowIndex)
+  {
+    var info = this.getInfo(aRowIndex);
+    return info.level;
+  };
+
+  this.isContainer = function watchview_isContainer(aRowIndex)
+  {
+    var info = this.getInfo(aRowIndex);
+    return info.level == 0;
+  };
+
+  this.isContainerOpen = function watchview_isContainerOpen(aRowIndex)
+  {
+    var data = this.getData(aRowIndex);
+    return data.open;
+  };
+
+  this.isContainerEmpty = function watchview_isContainerEmpty(aRowIndex)
+  {
+    return false;
+  };
+
+  this.toggleOpenState = function watchview_toogleOpenState(aRowIndex)
+  {
+    var data = this.getData(aRowIndex);
+
+    data.open = !data.open;
+    var rowCount = data.children.length;
+
+    if (data.open)
+      this.mTree.rowCountChanged(aRowIndex + 1, rowCount);
+    else
+      this.mTree.rowCountChanged(aRowIndex + 1, -rowCount);
+
+    this.mTree.invalidateRow(aRowIndex);
+  };
+
+  this.isEditable = function watchview_isEditable(aRowIndex, aCol)
+  {
+    if (aCol.id == "welIsWatched" ||
+        (aCol.id == "welIsHandlerEnabled" && !this.isContainer(aRowIndex))) {
+      return true;
+    }
+    return false;
+  };
+
+  this.setCellValue = function watchview_setCellValue(aRowIndex, aCol, aValue)
+  {
+    if (aCol.id == "welIsWatched") {
+      var newValue = aValue == "true";
+
+      var info = this.getInfo(aRowIndex);
+      var data = info.data;
+
+      data.value = newValue;
+
+      if (this.isContainer(aRowIndex)) {
+        var children = data.children;
+        for (var idx = 0; idx < children.length; idx++)
+          children[idx].value = newValue;
+
+        this.mTree.invalidateColumnRange(aRowIndex, aRowIndex + children.length,
+                                         aCol);
+        return;
+      }
+
+      this.mTree.invalidateCell(aRowIndex, aCol);
+
+      var parentData = info.parentData;
+      if (parentData.value && !newValue) {
+        parentData.value = false;
+        this.mTree.invalidateCell(info.parentIndex, aCol);
+      }
+    }
+    else if (aCol.id == "welIsHandlerEnabled") {
+      var newValue = aValue == "true";
+      this.updateHandlerState(newValue, aRowIndex);
+    }
+  };
+
+  //////////////////////////////////////////////////////////////////////////////
+  ///// Public
+
+  /**
+   * Return true if the given event type is watched.
+   */
+  this.isEventWatched = function watchview_isEventWatched(aType)
+  {
+    return this.mReverseData[aType].value;
+  };
+
+  /**
+   * Start or stop to watch all events.
+   */
+  this.watchAllEvents = function watchview_watchAllEvents(aAll)
+  {
+    for (var idx = 0; idx < this.mChildren.length; idx++) {
+      var data = this.mChildren[idx];
+      data.value = aAll;
+      for (var jdx = 0; jdx < data.children.length; jdx++) {
+        var subdata = data.children[jdx];
+        subdata.value = aAll;
+      }
+    }
+
+    this.mTree.invalidate();
+  };
+
+  this.getHandlerExpr = function watchview_getHandlerExpr(aType)
+  {
+    var data = this.mReverseData[aType];
+    if (data.isHandlerEnabled) {
+      return data.handlerSource;
+    }
+
+    return "";
+  }
+
+  this.toggleEventWatched = function watchview_toggleEventWatched()
+  {
+    var idx = this.selection.currentIndex;
+    var colWatched = this.mTree.columns.welIsWatched;
+    var newValue = !this.getCellValue(idx, colWatched);
+
+    // setCellValue() needs the new value to be passed as a string.
+    this.setCellValue(idx, colWatched, newValue.toString());
+  }
+
+  /**
+   * Updates state and value of handler source editor.
+   */
+  this.updateHandlerEditor = function watchview_updateHandlerEditor()
+  {
+    var idx = this.selection.currentIndex;
+
+    if (idx == -1 || this.isContainer(idx)) {
+      this.mHandlerState.hidden = true;
+      this.mHandlerEditor.disabled = true;
+      this.mHandlerEditor.value = "";
+      this.mHandlerEditorLabel.hidden = false;
+      return;
+    }
+
+    this.mHandlerState.hidden = false;
+    this.mHandlerEditorLabel.hidden = true;
+    this.mHandlerEditor.disabled = false;
+
+    var data = this.getData(idx);
+
+    var label = gBundle.getFormattedString("handlerEditorLabel", [data.text]);
+    this.mHandlerState.label = label;
+    this.mHandlerEditor.value = data.handlerSource;
+  }
+
+  /**
+   * Updates state of handler (enabled or disabled) and UI displaying the state.
+   * @param aValue [optional]
+   *        New value of handler state column at the given row index, if
+   *        undefined then data wasn't changed, needs to update UI
+   * @param aRowIdx [optional]
+   *        The given row index, if missed then current row index is used
+   */
+  this.updateHandlerState =
+    function watchview_updateHandlerState(aValue, aRowIdx)
+  {
+    var updateData = aValue != undefined;
+    var updateCheckbox = !updateData || aRowIdx == this.selection.currentIndex;
+
+    var rowIdx = aRowIdx == undefined ? this.selection.currentIndex : aRowIdx;
+
+    var data = this.getData(rowIdx);
+
+    if (updateData) {
+      data.isHandlerEnabled = aValue;
+      var col = this.mTree.columns.getNamedColumn("welIsHandlerEnabled");
+      this.mTree.invalidateCell(rowIdx, col);
+    }
+
+    if (updateCheckbox) {
+      this.mHandlerState.checked = data.isHandlerEnabled;
+    }
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  ///// Private
+
+  /**
+   * Return the data of the tree item at the given row index.
+   */
+  this.getData = function watchview_getData(aRowIndex)
+  {
+    return this.getInfo(aRowIndex).data;
+  };
+
+  /**
+   * Return an object describing the tree item at the given row index:
+   *
+   * {
+   *   data: null, // the data of tree item
+   *   parentIndex: -1, // index of parent row
+   *   parentData: null, // the data of parent tree item
+   *   level: 0 // the level of the tree item
+   * };
+   */
+  this.getInfo = function watchview_getInfo(aRowIndex)
+  {
+    var info = {
+      data: null,
+      parentIndex: -1,
+      parentData: null,
+      level: 0
+    };
+
+    var groupIdx = 0;
+    var rowIdx = aRowIndex;
+
+    for (var idx = 0; idx < this.mChildren.length; idx++) {
+      var groupItem = this.mChildren[idx];
+
+      if (rowIdx == 0) {
+        info.data = groupItem;
+        return info;
+      }
+
+      rowIdx--;
+      if (groupItem.open) {
+        var typeItemLen = groupItem.children.length;
+        if (rowIdx < typeItemLen) {
+          info.data = groupItem.children[rowIdx];
+          info.parentIndex = idx;
+          info.parentData = groupItem;
+          info.level = 1;
+          return info;
+        }
+
+        rowIdx -= typeItemLen;
+      }
+    }
+
+    return info;
+  };
+
+  /**
+   * Initialize the tree view.
+   */
+  this.init = function watchview_init()
+  {
+    // Register event groups.
+    for (var idx = 0; idx < gEventGroupMap.length; idx++)
+      this.registerEventGroup(idx, gBundle.getString(gEventGroupMap[idx]));
+
+    // Register event types.
+    for (var idx = 1; idx < gEventTypesMap.length; idx++) {
+      var props = gEventTypesMap[idx];
+      this.registerEventType(props.group, idx, props.isIgnored);
+    }
+
+    // Prepare handler source editor.
+    this.mHandlerState = document.getElementById("welHandlerState");
+    this.mHandlerEditor = document.getElementById("welHandlerEditor");
+    this.mHandlerEditorLabel = document.getElementById("welHandlerEditorLabel");
+    this.mHandlerEditor.addEventListener("input", this, false);
+    this.mHandlerEditor.disabled = true;
+  };
+
+  /**
+   * Add tree item for the group.
+   */
+  this.registerEventGroup = function watchview_registerEventGroup(aType, aName)
+  {
+    var item = {
+      text: aName,
+      value: true,
+      handlerSource: "",
+      open: false,
+      children: []
+    };
+
+    this.mChildren[aType] = item;
+  };
+
+  /**
+   * Add tree item for the event type.
+   */
+  this.registerEventType = function watchview_registerEventType(aGroup, aType,
+                                                                aIgnored)
+  {
+    if (aGroup == kIgnoredEvents)
+      return;
+
+    var item = {
+      text: this.mAccService.getStringEventType(aType),
+      value: !aIgnored,
+      isHandlerEnabled: false,
+      handlerSource: ""
+    };
+
+    var groupItem = this.mChildren[aGroup];
+    if (aIgnored)
+      groupItem.value = false;
+
+    var children = groupItem.children;
+    children.push(item);
+
+    this.mReverseData[aType] = item;
+  };
+
+  /**
+   * Listen for 'input' event from handler source textbox to record the handler.
+   */
+  this.handleEvent = function watchview_handleEvent(aEvent)
+  {
+    if (aEvent.target != this.mHandlerEditor) {
+      return;
+    }
+
+    switch (aEvent.type) {
+      case "input":
+        var idx = this.selection.currentIndex;
+
+        // Enable/disable event handler automatically.
+        var isEnabled = this.mHandlerEditor.value != "";
+        this.updateHandlerState(isEnabled, idx);
+
+        // Update event handler code.
+        var data = this.getData(idx);
+        data.handlerSource = this.mHandlerEditor.value;
+        break;
+    }
+  }
+
+  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                     nsIAccessibleRetrieval);
+
+  this.mChildren = [];
+  this.mReverseData = [];
+  this.mHandlers = {};
+
+  this.mHandlerState = null;
+  this.mHandlerEditor = null;
+  this.mHandlerEditorLabel = null;
+
+  this.init();
+}
+
+function eventProps(aGroup, aValue)
+{
+  this.group = aGroup;
+  this.isIgnored = aValue;
+}
+
+/**
+ * The map of event groups.
+ */
+var gEventGroupMap =
+[
+  "mutationEvents", // kMutationEvents
+  "changeEvents", // kChangeEvents,
+  "notificationEvents", // kNotificationEvents,
+  "selectionEvents", // kSelectionEvents
+  "menuEvents", // kMenuEvents,
+  "documentEvents", // kDocumentEvents,
+  "textEvents", // kTextEvents,
+  "tableEvents", // kTableEvents,
+  "windowEvents", // kWindowEvents,
+  "hyperLinkEvents", // kHyperLinkEvents
+  "hyperTextEvents", // kHyperTextEvents
+];
+
+/**
+ * The map of event types. Events are listed in the order of nsIAccessibleEvent.
+ */
+var gEventTypesMap =
+[
+  new eventProps(kIgnoredEvents), // No event
+
+  new eventProps(kMutationEvents), // EVENT_SHOW
+  new eventProps(kMutationEvents), // EVENT_HIDE
+  new eventProps(kMutationEvents), // EVENT_REORDER
+
+  new eventProps(kChangeEvents), // EVENT_ACTIVE_DECENDENT_CHANGED
+
+  new eventProps(kNotificationEvents), // EVENT_FOCUS
+
+  new eventProps(kChangeEvents), // EVENT_STATE_CHANGE
+  new eventProps(kChangeEvents), // EVENT_LOCATION_CHANGE
+  new eventProps(kChangeEvents), // EVENT_NAME_CHANGE
+  new eventProps(kChangeEvents), // EVENT_DESCRIPTION_CHANGE
+  new eventProps(kChangeEvents), // EVENT_VALUE_CHANGE
+  new eventProps(kChangeEvents), // EVENT_HELP_CHANGE
+  new eventProps(kChangeEvents), // EVENT_DEFACTION_CHANGE
+  new eventProps(kChangeEvents), // EVENT_ACTION_CHANGE
+  new eventProps(kChangeEvents), // EVENT_ACCELERATOR_CHANGE
+
+  new eventProps(kSelectionEvents), // EVENT_SELECTION
+  new eventProps(kSelectionEvents), // EVENT_SELECTION_ADD
+  new eventProps(kSelectionEvents), // EVENT_SELECTION_REMOVE
+  new eventProps(kSelectionEvents), // EVENT_SELECTION_WITHIN
+
+  new eventProps(kNotificationEvents), // EVENT_ALERT
+  new eventProps(kNotificationEvents), // EVENT_FOREGROUND
+
+  new eventProps(kMenuEvents), // EVENT_MENU_START
+  new eventProps(kMenuEvents), // EVENT_MENU_END
+  new eventProps(kMenuEvents), // EVENT_MENUPOPUP_START
+  new eventProps(kMenuEvents), // EVENT_MENUPOPUP_END
+
+  new eventProps(kNotificationEvents), // EVENT_CAPTURE_START
+  new eventProps(kNotificationEvents), // EVENT_CAPTURE_END
+  new eventProps(kNotificationEvents), // EVENT_MOVESIZE_START
+  new eventProps(kNotificationEvents), // EVENT_MOVESIZE_END
+  new eventProps(kNotificationEvents), // EVENT_CONTEXTHELP_START
+  new eventProps(kNotificationEvents), // EVENT_CONTEXTHELP_END
+  new eventProps(kNotificationEvents, true), // EVENT_DRAGDROP_START
+  new eventProps(kNotificationEvents, true), // EVENT_DRAGDROP_END
+  new eventProps(kNotificationEvents), // EVENT_DIALOG_START
+  new eventProps(kNotificationEvents), // EVENT_DIALOG_END
+  new eventProps(kNotificationEvents), // EVENT_SCROLLING_START
+  new eventProps(kNotificationEvents), // EVENT_SCROLLING_END
+  new eventProps(kNotificationEvents), // EVENT_MINIMIZE_START
+  new eventProps(kNotificationEvents), // EVENT_MINIMIZE_END
+
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_START
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_COMPLETE
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_RELOAD
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_STOPPED
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_ATTRIBUTES_CHANGED
+  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_CONTENT_CHANGED
+
+  new eventProps(kChangeEvents), // EVENT_PROPERTY_CHANGED
+
+  new eventProps(kSelectionEvents), // EVENT_SELECTION_CHANGED
+
+  new eventProps(kChangeEvents), // EVENT_TEXT_ATTRIBUTE_CHANGED
+
+  new eventProps(kTextEvents), // EVENT_TEXT_CARET_MOVED
+  new eventProps(kTextEvents), // EVENT_TEXT_CHANGED
+  new eventProps(kTextEvents), // EVENT_TEXT_INSERTED
+  new eventProps(kTextEvents), // EVENT_TEXT_REMOVED
+  new eventProps(kTextEvents), // EVENT_TEXT_UPDATED
+  new eventProps(kTextEvents), // EVENT_TEXT_SELECTION_CHANGED
+
+  new eventProps(kNotificationEvents), // EVENT_VISIBLE_DATA_CHANGED
+  new eventProps(kNotificationEvents), // EVENT_TEXT_COLUMN_CHANGED
+  new eventProps(kNotificationEvents), // EVENT_SECTION_CHANGED
+
+  new eventProps(kTableEvents), // EVENT_TABLE_CAPTION_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_MODEL_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_SUMMARY_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_ROW_DESCRIPTION_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_ROW_HEADER_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_ROW_INSERT
+  new eventProps(kTableEvents), // EVENT_TABLE_ROW_DELETE
+  new eventProps(kTableEvents), // EVENT_TABLE_ROW_REORDER
+  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_HEADER_CHANGED
+  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_INSERT
+  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_DELETE
+  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_REORDER
+
+  new eventProps(kWindowEvents), // EVENT_WINDOW_ACTIVATE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_CREATE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_DEACTIVATE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_DESTROY
+  new eventProps(kWindowEvents), // EVENT_WINDOW_MAXIMIZE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_MINIMIZE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_RESIZE
+  new eventProps(kWindowEvents), // EVENT_WINDOW_RESTORE
+
+  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_END_INDEX_CHANGED
+  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED
+  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_SELECTED_LINK_CHANGED
+
+  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_LINK_ACTIVATED
+  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_LINK_SELECTED
+
+  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_START_INDEX_CHANGED
+
+  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_CHANGED
+  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_NLINKS_CHANGED
+
+  new eventProps(kChangeEvents), // EVENT_OBJECT_ATTRIBUTE_CHANGED
+  new eventProps(kChangeEvents), // EVENT_PAGE_CHANGED
+
+  new eventProps(kDocumentEvents) // EVENT_INTERNAL_LOAD
+];
+
+////////////////////////////////////////////////////////////////////////////////
+//// Functions and objects for usage in event handler editor.
+
+var accRetrieval = XPCU.getService(kAccessibleRetrievalCID,
+                                   nsIAccessibleRetrieval);
+
+function output(aValue)
+{
+  gEventHandlerOutput.push(aValue);
+}
+
+function outputRole(aAccessible)
+{
+  output(accRetrieval.getStringRole(aAccessible.role));
+}
+
+function outputStates(aAccessible)
+{
+  var stateObj = {}, extraStateObj = {};
+  aAccessible.getState(stateObj, extraStateObj);
+  var states = accRetrieval.getStringStates(stateObj.value,
+                                            extraStateObj.value);
+
+  var list = [];
+  for (let i = 0; i < states.length; i++) {
+    list.push(states.item(i));
+  }
+
+  output(list.join());
+}
+
+function outputAttrs(aAccessible)
+{
+  var str = "";
+  var attrs = aAccessible.attributes;
+  if (attrs) {
+    var enumerate = attrs.enumerate();
+    while (enumerate.hasMoreElements()) {
+      var prop = XPCU.QI(enumerate.getNext(), nsIPropertyElement);
+      str += prop.key + ": " + prop.value + "; ";
+    }
+
+    if (str)
+      output(str);
+  }
+}
+
+function outputTree(aAccessible, aHighlightList)
+{
+  var treeObj = {
+    cols: {
+      outputtreeRole: {
+        name: gBundle.getString("role"),
+        flex: 2,
+        isPrimary: true
+      },
+      outputtreeName: {
+        name: gBundle.getString("name"),
+        flex: 2
+      },
+      outputtreeNodename: {
+        name: gBundle.getString("nodeName"),
+        flex: 1
+      },
+      outputtreeId:{
+        name: gBundle.getString("id"),
+        flex: 1
+      }
+    },
+    view: new inAccTreeView(aAccessible, aHighlightList)
+  };
+
+  output(treeObj);
+}
+
+function outputDOMAttrs(aAccessible)
+{
+  var DOMNode = QIAccessNode(aAccessible).DOMNode;
+  var DOMAttributes = DOMNode.attributes;
+  for (let i = 0; i < DOMAttributes.length; i++) {
+    var DOMAttribute = DOMAttributes.item(i);
+    output(DOMAttribute.name + ": " + DOMAttribute.value);
+  }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//// Private functions.
+
+function inAccTreeView(aAccessible, aHighlightList)
+{
+  inDataTreeView.call(this);
+
+  var list = this.generateChildren(aAccessible, aHighlightList);
+  if (list) {
+    this.expandNodes(list);
+  }
+}
+
+inAccTreeView.prototype = new inDataTreeView();
+
+// nsITreeView
+inAccTreeView.prototype.getRowProperties =
+  function inAccTreeView_getRowProperties(aRowIdx)
+{
+  var data = this.getDataAt(aRowIdx);
+  if (data && data.properties) {
+    return data.properties.join(" ");
+  }
+
+  return "";
+};
+
+inAccTreeView.prototype.getCellProperties =
+  function inAccTreeView_getCellProperties(aRowIdx, aCol)
+{
+  return this.getRowProperties(aRowIdx);
+};
+
+// Initialization
+inAccTreeView.prototype.generateChildren =
+  function inAccTreeView_generateChildren(aAccessible, aHighlightList, aParent,
+                                          aIsUnattached)
+{
+  var data = {
+    properties: []
+  };
+
+  var accessible = QIAccessNode(aAccessible);
+
+  // Highlight the row for accessible from the list.
+  var isHighlighted =
+    aHighlightList && aHighlightList.indexOf(aAccessible) != -1;
+  if (isHighlighted) {
+    data.properties.push("highlight");
+  }
+
+  // Gray out the row for accessible unattached from the tree.
+  if (aIsUnattached) {
+    data.properties.push("grayout");
+  }
+
+  // Add cells data.
+  data["outputtreeRole"] = accRetrieval.getStringRole(aAccessible.role);
+  data["outputtreeName"] = aAccessible.name;
+  data["outputtreeNodename"] = accessible.DOMNode.nodeName;
+  data["outputtreeId"] =
+    ("id" in accessible.DOMNode ? accessible.DOMNode.id : "");
+
+  var parent = this.appendChild(aParent, data);
+  var nodesToExpand = null;
+
+  // Insert highlighted row for target of handled hide event if it's specified
+  // in the list (works for Gecko versions higher 13).
+  var containsUnattached = false;
+  var accBeforeUnattached = null;
+  if ("nsIAccessibleHideEvent" in Ci &&
+      gEvent instanceof Ci.nsIAccessibleHideEvent &&
+      gEvent.targetParent == aAccessible) {
+    containsUnattached = true;
+    try {
+      if (gEvent.targetNextSibling.parent == aAccessible) {
+        accBeforeUnattached = gEvent.targetNextSibling;
+      }
+    } catch (e) {
+    }
+    try {
+      if (!accBeforeUnattached &&
+          gEvent.targetPrevSibling.parent == aAccessible) {
+        accBeforeUnattached = gEvent.targetPrevSibling.nextSibling;
+      }
+    } catch (e) {
+    }
+  }
+
+  // Add children.
+  var childCount = aAccessible.childCount;
+  for (let i = 0; i < childCount; i++) {
+    var child = aAccessible.getChildAt(i);
+
+    // Add unattached child before current child.
+    if (accBeforeUnattached == child) {
+      var list =
+        this.generateChildren(gEvent.accessible, aHighlightList, parent, true);
+      if (list) {
+        nodesToExpand = list.concat(nodesToExpand || []);
+      }
+    }
+
+    var list =
+      this.generateChildren(child, aHighlightList, parent);
+    if (list) {
+      nodesToExpand = list.concat(nodesToExpand || []);
+    }
+  }
+
+  // Put unattached child as last child of the parent, we don't have good guess
+  // about its hierarchy position.
+  if (containsUnattached && !accBeforeUnattached) {
+    var list =
+      this.generateChildren(gEvent.accessible, aHighlightList, parent, true);
+    if (list) {
+      nodesToExpand = list.concat(nodesToExpand || []);
+    }
+  }
+
+  return nodesToExpand ? nodesToExpand.concat(parent) : isHighlighted && [];
+};
diff --git a/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.xul b/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleEvents/accessibleEvents.xul
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleEvents.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleEvents/accessibleEvents.css"?>
+
+<page id="winAccessibleEvents"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inDataTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleEvents/accessibleEvents.js"/>
+
+  <stringbundle id="accessiblePropsBundle"
+                src="chrome://inspector/locale/viewers/accessibleEvents.properties"/>
+
+  <tabbox flex="1">
+    <tabs>
+      <tab label="&eventList.label;"/>
+      <tab label="&watchedEvents.label;"/>
+    </tabs>
+    <tabpanels flex="1">
+
+      <!-- Event list -->
+      <vbox>
+        <label value="&handledEvents.label;" control="olAccessibleEvents"/>
+        <tree id="olAccessibleEvents"
+              flex="1"
+              onselect="viewer.onItemSelected()">
+
+          <treecols>
+            <treecol id="olcEventType"
+                     label="&eventType.label;"
+                     primary="true"
+                     persist="width,hidden,ordinal"
+                     flex="2"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcEventTargetRole"
+                     label="&eventTargetRole.label;"
+                     hidden="true"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcEventTargetName"
+                     label="&eventTargetName.label;"
+                     hidden="true"
+                     persist="width,hidden,ordinal"
+                     flex="2"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcEventTargetNodeName"
+                     label="&eventTargetNodeName.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcEventTargetNodeID"
+                     label="&eventTargetNodeID.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcEventTime"
+                     label="&eventTime.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+          </treecols>
+          <treechildren id="olbAccessibleEvents"
+                        alternatingbackground="true"/>
+        </tree>
+        <hbox align="end">
+          <button label="&clearEventList.label;"
+                  oncommand="viewer.clearEventsList();"/>
+        </hbox>
+      </vbox>
+
+      <!-- Watched events -->
+      <vbox>
+        <vbox flex="1">
+          <label value="&chooseEventsToWatch.label;" control="watchEventList"/>
+          <tree id="watchEventList"
+                flex="1"
+                editable="true"
+                onselect="viewer.onWatchViewItemSelected();"
+                onkeypress="viewer.onWatchViewKeyPressed(event);"
+                seltype="single">
+            <treecols>
+              <treecol id="welEventType"
+                       label="&eventType.label;"
+                       primary="true"
+                       persist="width,hidden,ordinal"
+                       flex="1"/>
+              <splitter class="tree-splitter"/>
+              <treecol id="welIsWatched"
+                       label="&isWatched.label;"
+                       type="checkbox"
+                       editable="true"
+                       persist="width,hidden,ordinal"/>
+              <splitter class="tree-splitter"/>
+              <treecol id="welIsHandlerEnabled"
+                       label="&isHandlerEnabled.label;"
+                       type="checkbox"
+                       editable="true"
+                       persist="width,hidden,ordinal"
+                       hidden="true"/>
+            </treecols>
+            <treechildren/>
+          </tree>
+        </vbox>
+        <hbox align="right">
+          <button label="&watchAll.label;"
+                  oncommand="viewer.watchAllEvents(true);"/>
+          <button label="&watchNone.label;"
+                  oncommand="viewer.watchAllEvents(false);"/>
+        </hbox>
+        <splitter state="collapsed" collapse="after" persist="state"
+                  resizebefore="farthest" id="welSplitter">
+          <toolbarbutton label="&editHandler.label;" id="welGrippyButton"
+                         oncommand="viewer.toggleHandlerEditor(this.parentNode);"/>
+        </splitter>
+        <vbox>
+          <hbox align="baseline">
+            <label control="welHandlerEditor"
+                   id="welHandlerEditorLabel"
+                   flex="1">&handlerEditorNoEvent.label;</label>
+            <checkbox id="welHandlerState" hidden="true"
+                      oncommand="viewer.onWatchViewHandlerStateChanged(this.checked);"
+                      flex="1"/>
+            <toolbarbutton label="&contextHelp.label;"
+                           oncommand="viewer.showWatchViewHandlerHelp();"/>
+          </hbox>
+          <textbox id="welHandlerEditor" multiline="true" rows="8" flex="1"/>
+        </vbox>
+      </vbox>
+    </tabpanels>
+  </tabbox>
+
+</page>
+
diff --git a/suite/components/inspector/content/viewers/accessibleEvents/handlerHelpDialog.xul b/suite/components/inspector/content/viewers/accessibleEvents/handlerHelpDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleEvents/handlerHelpDialog.xul
@@ -0,0 +1,69 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE dialog [
+  <!ENTITY % dtd1 SYSTEM
+    "chrome://inspector/locale/viewers/accessibleEventsHandlerHelpDialog.dtd">
+  %dtd1;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin"?>
+
+<dialog id="winEvalJS"
+        title="&helpDialog.title;"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        buttons="accept"
+        style="width: 30em;">
+
+  <description>&general.descr;</description>
+  <description>&helpers.descr;</description>
+  <grid>
+    <columns>
+      <column/>
+      <column flex="1"/>
+    </columns>
+    <rows>
+      <row>
+        <description value="event"/>
+        <description>&event.descr;</description>
+      </row>
+      <row>
+        <description value="target"/>
+        <description>&target.descr;</description>
+      </row>
+      <row>
+        <description value="accRetrieval"/>
+        <description>&accRetrieval.descr;</description>
+      </row>
+      <row>
+        <description value="output(string)"/>
+        <description>&output.descr;</description>
+      </row>
+      <row>
+        <description value="outputAttrs(accessible)"/>
+        <description>&outputAttrs.descr;</description>
+      </row>
+      <row>
+        <description value="outputRole(accessible)"/>
+        <description>&outputRole.descr;</description>
+      </row>
+      <row>
+        <description value="outputStates(accessible)"/>
+        <description>&outputStates.descr;</description>
+      </row>
+      <row>
+        <description value="outputTree(accessible, hightlightList)"/>
+        <description>&outputTree.descr;</description>
+      </row>
+      <row>
+        <description value="outputDOMAttrs(accessible)"/>
+        <description>&outputDOMAttrs.descr;</description>
+      </row>
+    </rows>
+  </grid>
+
+</dialog>
diff --git a/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.js b/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.js
@@ -0,0 +1,59 @@
+/* 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/. */
+
+/***************************************************************
+* AccessibleObjectViewer --------------------------------------------
+*  The viewer for the accessible object.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/events/ObserverManager.js
+****************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var bundle;
+var accService;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessible = Components.interfaces.nsIAccessible;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization/Destruction
+
+window.addEventListener("load", AccessibleObjectViewer_initialize, false);
+
+function AccessibleObjectViewer_initialize()
+{
+  bundle = document.getElementById("inspector-bundle");
+  accService = XPCU.getService(kAccessibleRetrievalCID, nsIAccessibleRetrieval);
+
+  viewer = new JSObjectViewer();
+
+  viewer.__defineGetter__(
+    "uid",
+    function uidGetter()
+    {
+      return "accessibleObject";
+    }
+  );
+
+  viewer.__defineSetter__(
+    "subject",
+    function subjectSetter(aObject)
+    {
+      var accObject = aObject instanceof nsIAccessible ?
+        aObject : accService.getAccessibleFor(aObject);
+      this.setSubject(accObject);
+    }
+   );
+
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
diff --git a/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.xul b/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleObject/accessibleObject.xul
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<?xul-overlay href="chrome://inspector/content/viewers/jsObject/jsObjectViewer.xul"?>
+
+<page id="winAccessibleObject"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleObject/accessibleObject.js"/>
+
+  <stringbundle id="inspector-bundle"/>
+  <commandset id="cmdsJSObjectViewer"/>
+
+  <popupset>
+    <menupopup id="popupContext"/>
+  </popupset>
+  <tree id="treeJSObject" treelines="true" class="plain"/>
+</page>
diff --git a/suite/components/inspector/content/viewers/accessibleProps/accessiblePropViewerMgr.js b/suite/components/inspector/content/viewers/accessibleProps/accessiblePropViewerMgr.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleProps/accessiblePropViewerMgr.js
@@ -0,0 +1,619 @@
+/* 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/. */
+
+////////////////////////////////////////////////////////////////////////////////
+//// Global
+
+const nsIAccessibleText = Components.interfaces.nsIAccessibleText;
+const nsIAccessibleTableCell = Components.interfaces.nsIAccessibleTableCell;
+
+
+////////////////////////////////////////////////////////////////////////////////
+//// Accessible property viewer manager
+
+/**
+ * Used to show additional properties of the accessible in tabbox.
+ *
+ * @param aPaneElm
+ *        A pane element where the view is hosted.
+ */
+function accessiblePropViewerMgr(aPaneElm)
+{
+  /**
+   * Updates all property views for the given accessible.
+   *
+   * @param aAccessible
+   *        The given accessible
+   */
+  this.updateViews = function accessiblePropViewerMgr_updateViews(aAccessible)
+  {
+    for (var id in this.viewers)
+    {
+      var tab = document.getElementById("tab_" + id);
+      tab.hidden = !this.viewers[id].update(aAccessible);
+    }
+
+    this.tabboxElm.selectedIndex = this.getCurrentViewerIdx();
+  }
+
+  /**
+   * Clear the data of property views.
+   */
+  this.clearViews = function accessiblePropViewerMgr_clearViews()
+  {
+    for (var id in this.viewers)
+    {
+      this.viewers[id].clear();
+
+      var tab = document.getElementById("tab_" + id);
+      tab.hidden = true;
+    }
+  }
+
+  this.isCommandEnabled =
+    function accessiblePropViewerMgr_isCommandEnabled(aCommand)
+  {
+    var tab = this.tabboxElm.selectedTab;
+    var viewerid = tab.id.replace("tab_", "");
+    var viewer = this.viewers[viewerid];
+    if ("isCommandEnabled" in viewer) {
+      return viewer.isCommandEnabled(aCommand);
+    }
+    return false;
+  },
+
+  /**
+   * Process 'inspectInNewView' command for selected property view.
+   */
+  this.inspectInNewView = function accessiblePropViewerMgr_inspectInNewView()
+  {
+    var tab = this.tabboxElm.selectedTab;
+    var viewerid = tab.id.replace("tab_", "");
+    var viewer = this.viewers[viewerid];
+    if ("inspectInNewView" in viewer)
+      viewer.inspectInNewView();
+  }
+
+  this.doCommand = function accessiblePropViewerMgr_doCommand(aCommandId)
+  {
+    var tab = this.tabboxElm.selectedTab;
+    var viewerid = tab.id.replace("tab_", "");
+    var viewer = this.viewers[viewerid];
+    if ("doCommand" in viewer)
+      viewer.doCommand(aCommandId);
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// private
+
+  this.handleEvent = function accessiblePropViewerMgr_handleEvent(aEvent)
+  {
+    this.setCurrentViewerIdx(this.tabboxElm.selectedIndex);
+    viewer.pane.panelset.updateAllCommands();
+  }
+
+  this.setCurrentViewerIdx = function accessiblePropViewerMgr_setCurrentViewerIdx(aIdx)
+  {
+    this.paneElm.accessiblePropsCurrentViewerIdx = aIdx;
+  }
+
+  this.getCurrentViewerIdx = function accessiblePropViewerMgr_getCurrentViewerIdx()
+  {
+    var idx = this.paneElm.accessiblePropsCurrentViewerIdx;
+
+    idx = idx ? idx : 0;
+    var tab = this.tabsElm.children[idx];
+    if (tab.hidden)
+      return 0;
+
+    return idx;
+  }
+
+  this.viewers = {
+    "attributes": new attributesViewer(),
+    "actions": new actionViewer(),
+    "textattrs": new textAttrsViewer(),
+    "tablecell": new tableCellViewer()
+  };
+
+  this.tabboxElm = document.getElementById("tabviewers");
+  this.tabsElm = this.tabboxElm.tabs;
+  this.tabsElm.addEventListener("select", this, false);
+  this.paneElm = aPaneElm;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//// Accessible property viewers
+
+/**
+ * Object attribute property view. Used to display accessible attributes.
+ */
+function attributesViewer()
+{
+  /**
+   * Updates the view for the given accessible.
+   *
+   * @param aAccessible
+   *        The given accessible
+   */
+  this.update = function attributesViewer_update(aAccessible)
+  {
+    var attrs = aAccessible.attributes;
+    if (attrs) {
+      var enumerate = attrs.enumerate();
+      while (enumerate.hasMoreElements())
+        this.addAttribute(enumerate.getNext());
+    }
+
+    return true;
+  }
+
+  /**
+   * Clear the view's data.
+   */
+  this.clear = function attributesViewer_clear()
+  {
+    var trAttrBody = document.getElementById("trAttrBody");
+    while (trAttrBody.hasChildNodes())
+      trAttrBody.removeChild(trAttrBody.lastChild)
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// private
+
+  this.addAttribute = function attrbiutesViewer_addAttribute(aElement)
+  {
+    var prop = XPCU.QI(aElement, nsIPropertyElement);
+    
+    var trAttrBody = document.getElementById("trAttrBody");
+    
+    var ti = document.createElement("treeitem");
+    var tr = document.createElement("treerow");
+    
+    var tc = document.createElement("treecell");
+    tc.setAttribute("label", prop.key);
+    tr.appendChild(tc);
+    
+    tc = document.createElement("treecell");
+    tc.setAttribute("label", prop.value);
+    tr.appendChild(tc);
+    
+    ti.appendChild(tr);
+    
+    trAttrBody.appendChild(ti);
+  }
+}
+
+
+/**
+ * Action property view.
+ */
+function actionViewer()
+{
+  /**
+   * Updates the view for the given accessible.
+   *
+   * @param aAccessible
+   *        The given accessible
+   */
+  this.update = function actionViewer_update(aAccessible)
+  {
+    this.mAccessible = aAccessible;
+
+    // nsIAccessible::numActions was renamed to actionCount in Mozilla 15.
+    let count = ("actionCount" in aAccessible) ?
+      aAccessible.actionCount : aAccessible.numActions;
+    if (!count)
+      return false;
+
+    this.updateActionItem(this.mDefaultActionItem, 0);
+
+    for (let idx = 1; idx < count; idx++) {
+      let actionItem = this.mDefaultActionItem.cloneNode(true);
+      this.updateActionItem(actionItem, idx);
+      this.mActionItemContainer.appendChild(actionItem);
+    }
+
+    return true;
+  }
+
+  /**
+   * Clear the view's data.
+   */
+  this.clear = function actionViewer_clear()
+  {
+    this.mAccessible = null;
+
+    let cntr = this.mActionItemContainer;
+    while (cntr.firstChild != cntr.lastChild)
+      cntr.removeChild(cntr.lastChild);
+
+    this.setValues(this.mDefaultActionItem, "", "", "", "", "");
+  }
+
+  /**
+   * Performes a command.
+   */
+  this.doCommand = function actionViewer_doCommand(aCommandId)
+  {
+    this.mAccessible.doAction(aCommandId);
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// private
+
+  this.updateActionItem = function actionViewer_updateActionItem(aActionItem,
+                                                                 aActionIndex)
+  {
+    var index = (aActionIndex + 1) + ".";
+    var name = this.mAccessible.getActionName(aActionIndex);
+    var description = this.mAccessible.getActionDescription(aActionIndex);
+
+    var keysStr = "";
+    try {
+      let keys = this.mAccessible.getKeyBindings(aActionIndex);
+      for (let idx = 0; idx < keys.length; idx++)
+        keysStr += keys.item(idx);
+
+    } catch (e) { }
+
+    let jsCommand = "viewer.doCommand(" + aActionIndex + ");";
+
+    this.setValues(aActionItem, index, name, description, keysStr, jsCommand);
+  }
+
+  this.setValues = function actionViewer_setValues(aActionItem,
+                                                   aIndex, aName, aDescription,
+                                                   aKeyBindings, aJSCommand)
+  {
+    let elm = aActionItem.getElementsByAttribute("prop", "actionIndex")[0];
+    elm.textContent = aIndex;
+
+    elm = aActionItem.getElementsByAttribute("prop", "actionName")[0];
+    elm.textContent = aName;
+
+    elm = aActionItem.getElementsByAttribute("prop", "actionDescription")[0];
+    elm.textContent = aDescription;
+
+    elm = aActionItem.getElementsByAttribute("prop", "actionKeyBindings")[0];
+    elm.textContent = aKeyBindings;
+
+    elm = aActionItem.getElementsByAttribute("prop", "invokeAction")[0];
+    if (aJSCommand)
+      elm.setAttribute("oncommand", aJSCommand)
+    else
+      elm.removeAttribute("oncommand");
+  }
+
+  this.mAccessible = null;
+
+  this.mActionItemContainer = document.getElementById("actionItemContainer");
+  this.mDefaultActionItem = document.getElementById("actionItem");
+}
+
+
+/**
+ * Text attributes property view.
+ */
+function textAttrsViewer()
+{
+  /**
+   * Updates the view for the given accessible.
+   */
+  this.update = function textAttrsViewer_update(aAccessible)
+  {
+    if (!(aAccessible instanceof nsIAccessibleText))
+      return false;
+
+    // Default text attributes.
+    this.addAttributes(aAccessible.defaultTextAttributes,
+                       "textAttrs:default:treeBody");
+
+    // Generate text ranges.
+    var length = aAccessible.characterCount;
+    var offset = 0;
+    while (offset < length) {
+      const kHTMLNS = "http://www.w3.org/1999/xhtml";
+      var textRangeElm = document.createElementNS(kHTMLNS, "span");
+      textRangeElm.setAttribute("class", "textAttrsTextRange");
+
+      var endOffset = { };
+
+      textRangeElm.textAttrs =
+        aAccessible.getTextAttributes(false, offset, { }, endOffset);
+      textRangeElm.startOffset = offset;
+      textRangeElm.endOffset = endOffset.value;
+
+      var text = aAccessible.getText(offset, endOffset.value);
+      textRangeElm.textContent = text;
+
+      textRangeElm.addEventListener("focus", this, false);
+      textRangeElm.setAttribute("tabindex", 0);
+
+      document.getElementById("textAttrs:content").appendChild(textRangeElm);
+
+      offset = endOffset.value;
+    }
+
+    return true;
+  }
+
+  /**
+   * Clear the view's data.
+   */
+  this.clear = function textAttrsViewer_clear()
+  {
+    var content = document.getElementById("textAttrs:content");
+    while (content.hasChildNodes()) {
+      content.removeChild(content.lastChild);
+    }
+
+    var treeBody = document.getElementById("textAttrs:default:treeBody");
+    while (treeBody.hasChildNodes()) {
+      treeBody.removeChild(treeBody.lastChild);
+    }
+
+    document.getElementById("textAttrs:startOffset").textContent = "";
+    document.getElementById("textAttrs:endOffset").textContent = "";
+
+    treeBody = document.getElementById("textAttrs:treeBody");
+    while (treeBody.hasChildNodes()) {
+      treeBody.removeChild(treeBody.lastChild);
+    }
+  }
+
+  this.handleEvent = function textAttrsViewer_handleEvent(aEvent)
+  {
+    var treeBody = document.getElementById("textAttrs:treeBody");
+    while (treeBody.hasChildNodes()) {
+      treeBody.removeChild(treeBody.lastChild);
+    }
+
+    if (this.mLastElm) {
+      this.mLastElm.removeAttribute("selected");
+    }
+
+    this.mLastElm = aEvent.target;
+    this.mLastElm.setAttribute("selected", "true");
+
+    document.getElementById("textAttrs:startOffset").textContent =
+      this.mLastElm.startOffset;
+    document.getElementById("textAttrs:endOffset").textContent =
+      this.mLastElm.endOffset;
+
+    this.addAttributes(this.mLastElm.textAttrs, "textAttrs:treeBody");
+  }
+
+  this.addAttributes = function textAttrsViewer_addAttributes(aTextAttrs,
+                                                              aTreeID)
+  {
+    var enumerate = aTextAttrs.enumerate();
+    while (enumerate.hasMoreElements()) {
+      var prop = XPCU.QI(enumerate.getNext(), nsIPropertyElement);
+
+      var treeBody = document.getElementById(aTreeID);
+
+      var ti = document.createElement("treeitem");
+      var tr = document.createElement("treerow");
+
+      var tc = document.createElement("treecell");
+      tc.setAttribute("label", prop.key);
+      tr.appendChild(tc);
+
+      tc = document.createElement("treecell");
+      tc.setAttribute("label", prop.value);
+      tr.appendChild(tc);
+
+      ti.appendChild(tr);
+
+      treeBody.appendChild(ti);
+    }
+  }
+
+  this.mLastElm = null;
+}
+
+
+/**
+ * Table cell property view. Used to display table cell properties of the
+ * accessible implementing nsIAccessibleTableCell.
+ */
+function tableCellViewer()
+{
+  /**
+   * Updates the view for the given accessible.
+   *
+   * @param aAccessible
+   *        The given accessible
+   */
+  this.update = function tableCellViewer_update(aAccessible)
+  {
+    if (!(aAccessible instanceof nsIAccessibleTableCell))
+      return false;
+
+    // columnIndex
+    var columnIndex = aAccessible.columnIndex;
+    this.columnIndexElm.textContent = columnIndex;
+
+    // rowIndex
+    var rowIndex = aAccessible.rowIndex;
+    this.rowIndexElm.textContent = rowIndex;
+
+    // columnExtent
+    var columnExtent = aAccessible.columnExtent;
+    this.columnExtentElm.textContent = columnExtent;
+    
+    // rowIndex
+    var rowExtent = aAccessible.rowExtent;
+    this.rowExtentElm.textContent = rowExtent;
+
+    // isSelected
+    var isSelected = aAccessible.isSelected();
+    this.isSelectedElm.textContent = isSelected;
+
+    // table, columnHeaderCells, rowHeaderCells
+    this.addRelated(aAccessible);
+
+    return true;
+  }
+
+  /**
+   * Clear the view's data.
+   */
+  this.clear = function tableCellViewer_clear()
+  {
+    this.mTreeBox.view = null;
+
+    this.columnIndexElm.textContent = "";
+    this.rowIndexElm.textContent = "";
+    this.columnExtentElm.textContent = "";
+    this.rowExtentElm.textContent = "";
+    this.isSelectedElm.textContent = "";
+  }
+
+  this.isCommandEnabled = function tableCellViewer_isCommandEnable(aCommand)
+  {
+    if (aCommand == "cmdEditInspectInNewWindow") {
+      return this.mTreeView.selection.count == 1;
+    }
+    return false;
+  },
+
+  /**
+   * Prepares 'inspectInNewView' command.
+   */
+  this.inspectInNewView = function tableCellViewer_inspectInNewView()
+  {
+    if (this.mTreeView.selection.count == 1) {
+      var minAndMax = {};
+      this.mTreeView.selection.getRangeAt(0, minAndMax, minAndMax);
+      var node = this.mTreeView.getDOMNode(minAndMax.value);
+      if (node) {
+        inspectObject(node);
+      }
+    }
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //// private
+
+  this.addRelated = function tableCellViewer_addRelated(aAccessible)
+  {
+    this.mTreeView = new TableCellTreeView(aAccessible);
+    this.mTreeBox.view = this.mTreeView;
+  }
+
+  this.mTree = document.getElementById("tableCell:accObjects");
+  this.mTreeBox = this.mTree.treeBoxObject;
+
+  this.columnIndexElm = document.getElementById("tableCell:columnIndex");
+  this.rowIndexElm = document.getElementById("tableCell:rowIndex");
+  this.columnExtentElm = document.getElementById("tableCell:columnExtent");
+  this.rowExtentElm = document.getElementById("tableCell:rowExtent");
+  this.isSelectedElm = document.getElementById("tableCell:isSelected");
+}
+
+
+///////////////////////////////////////////////////////////////////////////////
+//// TableCellTreeView. nsITreeView
+
+function TableCellTreeView(aTableCell)
+{
+  this.tableCell = aTableCell;
+  this.mRowCount = this.getRowCount();
+}
+
+TableCellTreeView.prototype = new inBaseTreeView();
+
+TableCellTreeView.prototype.getRowCount =
+  function TableCellTreeView_rowCount()
+{
+  this.columnHeaderCells = this.tableCell.columnHeaderCells;
+  this.columnHeaderCellsLen = (this.columnHeaderCells ?
+                               this.columnHeaderCells.length : 0);
+
+  this.rowHeaderCells = this.tableCell.rowHeaderCells;
+  this.rowHeaderCellsLen = (this.rowHeaderCells ?
+                            this.rowHeaderCells.length : 0);
+
+  return 1 + this.columnHeaderCellsLen + this.rowHeaderCellsLen;
+}
+
+TableCellTreeView.prototype.getCellText =
+  function TableCellTreeView_getCellText(aRow, aCol)
+{
+  var accessible = this.getAccessible(aRow);
+  if (!accessible)
+    return "";
+
+  if (aCol.id == "tableCell:property") {
+    return this.getPropertyName(aRow);
+
+  } else if (aCol.id == "tableCell:role") {
+    return gAccService.getStringRole(accessible.role);
+
+  } else if (aCol.id == "tableCell:name") {
+    return accessible.name;
+
+  } else if (aCol.id == "tableCell:nodeName") {
+    var node = this.getDOMNode(aRow);
+    if (node)
+      return node.nodeName;
+  }
+
+  return "";
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// TableCellTreeView. Utils
+
+/**
+ * Return an accessible for the given row index.
+ *
+ * @param aRow
+ *        Row index
+ */
+TableCellTreeView.prototype.getAccessible =
+  function TableCellTreeView_getAccessible(aRow)
+{
+  if (aRow == 0)
+    return this.tableCell.table;
+
+  if (aRow <= this.columnHeaderCellsLen)
+    return this.columnHeaderCells.queryElementAt(aRow - 1, nsIAccessible);
+
+  return this.rowHeaderCells.queryElementAt(aRow - 1 - this.columnHeaderCellsLen, nsIAccessible);
+}
+
+/**
+ * Retrun interface attribute name (property) used at the given row index.
+ *
+ * @param aRow
+ *        Row index
+ */
+TableCellTreeView.prototype.getPropertyName =
+  function TableCellTreeView_getPropertyName(aRow)
+{
+  if (aRow == 0)
+    return "table";
+  
+  if (aRow <= this.columnHeaderCellsLen)
+    return "column header cell";
+  
+  return "row header cell";
+}
+
+/**
+ * Return DOM node at the given row index.
+ *
+ * @param aRow
+ *        Row index
+ */
+TableCellTreeView.prototype.getDOMNode =
+  function TableCellTreeView_getDOMNode(aRow)
+{
+  var accessNode = QIAccessNode(this.getAccessible(aRow));
+  return accessNode && accessNode.DOMNode;
+}
diff --git a/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.js b/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.js
@@ -0,0 +1,241 @@
+/* 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/. */
+
+/*****************************************************************************
+* AccessiblePropsViewer ------------------------------------------------------
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/events/ObserverManager.js
+*   chrome://inspector/content/jsutil/system/PrefUtils.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/xul/FrameExchange.js
+*****************************************************************************/
+ 
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var gBundle;
+var gAccService = null;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessible = Components.interfaces.nsIAccessible;
+
+const nsIPropertyElement = Components.interfaces.nsIPropertyElement;
+
+/**
+ * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
+ * prior to Gecko13.
+ */
+function QIAccessNode(aAccessible)
+{
+  return "nsIAccessNode" in Components.interfaces ?
+    XPCU.QI(aAccessible, Components.interfaces.nsIAccessNode) : aAccessible;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization/Destruction
+
+window.addEventListener("load", AccessiblePropsViewer_initialize, false);
+
+function AccessiblePropsViewer_initialize()
+{
+  gBundle = document.getElementById("accessiblePropsBundle");
+
+  viewer = new AccessiblePropsViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class AccessiblePropsViewer
+function AccessiblePropsViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  gAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                nsIAccessibleRetrieval);
+}
+
+AccessiblePropsViewer.prototype =
+{
+  mSubject: null,
+  mPane: null,
+  mAccSubject: null,
+  mAccService: null,
+  mPropViewerMgr: null,
+
+  get uid() { return "accessibleProps" },
+  get pane() { return this.mPane },
+
+  get subject() { return this.mSubject },
+  set subject(aObject)
+  {
+    this.mSubject = aObject;
+    this.updateView();
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPropViewerMgr = new accessiblePropViewerMgr(aPane);
+
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    return this.mPropViewerMgr.isCommandEnabled(aCommand);
+  },
+  
+  getCommand: function getCommand(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditInspectInNewWindow":
+        return new cmdEditInspectInNewWindow(this.mPropViewerMgr);
+    }
+    return null;
+  },
+
+  destroy: function destroy() {},
+
+  /////////////////////////
+  //// event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  /////////////////////////
+  //// utils
+
+  doCommand: function doCommand(aCommandId)
+  {
+    this.mPropViewerMgr.doCommand(aCommandId);
+  },
+
+  // private
+  updateView: function updateView()
+  {
+    this.clearView();
+
+    this.mAccSubject = this.mSubject instanceof nsIAccessible ?
+      this.mSubject : gAccService.getAccessibleFor(this.mSubject);
+
+    // accessible properties.
+    var propContainer = document.getElementById("mainPropContainer");
+    var containers = propContainer.getElementsByAttribute("prop", "*");
+
+    for (var i = 0; i < containers.length; ++i) {
+      var value = "";
+      try {
+        var prop = containers[i].getAttribute("prop");
+        value = this[prop];
+      } catch (e) {
+        dump("Accessibility " + prop + " property is not available.\n");
+      }
+
+      if (value instanceof Array)
+        containers[i].value = value.join(", ");
+      else
+        containers[i].value = value;
+    }
+
+    this.mPropViewerMgr.updateViews(this.mAccSubject);
+  },
+
+  clearView: function clearView()
+  {
+    var containers = document.getElementsByAttribute("prop", "*");
+    for (var i = 0; i < containers.length; ++i)
+      containers[i].textContent = "";
+
+    this.mPropViewerMgr.clearViews();
+  },
+
+  get role()
+  {
+    // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
+    var role = "finalRole" in this.mAccSubject ?
+      this.mAccSubject.finalRole : this.mAccSubject.role;
+    return gAccService.getStringRole(role);
+  },
+
+  get name()
+  {
+    return this.mAccSubject.name;
+  },
+
+  get description()
+  {
+    return this.mAccSubject.description;
+  },
+
+  get value()
+  {
+    return this.mAccSubject.value;
+  },
+
+  get state()
+  {
+    var stateObj = {value: null};
+    var extStateObj = {value: null};
+
+    // Since Firefox 3.1 nsIAccessible::getFinalState has been renamed to
+    // nsIAccessible::getState.
+    if ("getState" in this.mAccSubject)
+      this.mAccSubject.getState(stateObj, extStateObj);
+    else
+      this.mAccSubject.getFinalState(stateObj, extStateObj);
+
+    var list = [];
+
+    var states = gAccService.getStringStates(stateObj.value,
+                                             extStateObj.value);
+
+    for (var i = 0; i < states.length; i++)
+      list.push(states.item(i));
+    return list;
+  },
+
+  get bounds()
+  {
+    var x = { value: 0 };
+    var y = { value: 0 };
+    var width = { value: 0 };
+    var height = { value: 0 };
+    this.mAccSubject.getBounds(x, y, width, height);
+
+    return gBundle.getFormattedString("accBounds",
+                                      [x.value, y.value,
+                                       width.value, height.value]);
+  }
+};
+
+function cmdEditInspectInNewWindow(aMgr)
+{
+  this.mPropViewerMgr = aMgr;
+}
+
+cmdEditInspectInNewWindow.prototype = new inBaseCommand();
+
+cmdEditInspectInNewWindow.prototype.doTransaction =
+  function InspectInNewWindow_DoTransaction()
+{
+  if (this.mPropViewerMgr) {
+    this.mPropViewerMgr.inspectInNewView();
+  }
+};
diff --git a/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.xul b/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleProps/accessibleProps.xul
@@ -0,0 +1,226 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleProps.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleProps/accessibleProps.css"?>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<page id="winAccessibleProps"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleProps/accessibleProps.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleProps/accessiblePropViewerMgr.js"/>
+
+  <stringbundle id="accessiblePropsBundle"
+                src="chrome://inspector/locale/viewers/accessibleProps.properties"/>
+
+  <commandset id="cmdsEditingExtras"/>
+
+  <popupset>
+    <menupopup id="popupContext">
+      <menuitem id="mnEditInspectInNewWindow"/>
+    </menupopup>
+  </popupset>
+
+  <grid id="mainPropContainer">
+    <columns>
+      <column/>
+      <column flex="1"/>
+    </columns>
+    <rows>
+      <row>
+        <description>&descRole.label;</description>
+        <textbox prop="role" readonly="true" class="plain"/>
+      </row>
+      <row>
+        <description>&descName.label;</description>
+        <textbox prop="name" readonly="true" class="plain"/>
+      </row>
+      <row>
+        <description>&descDescription.label;</description>
+        <textbox prop="description" readonly="true" class="plain"/>
+      </row>
+      <row>
+        <description>&descValue.label;</description>
+        <textbox prop="value" readonly="true" class="plain"/>
+      </row>
+      <row>
+        <description>&descState.label;</description>
+        <textbox prop="state" readonly="true" class="plain"/>
+      </row>
+      <row>
+        <description>&descBounds.label;</description>
+        <textbox prop="bounds" readonly="true" class="plain"/>
+      </row>
+    </rows>
+  </grid>
+
+  <tabbox id="tabviewers" flex="1">
+    <tabs>
+      <tab id="tab_attributes" label="&tabAttrs.label;"/>
+      <tab id="tab_actions" label="&tabActions.label;"/>
+      <tab id="tab_textattrs" label="&tabTextAttrs.label;"/>
+      <tab id="tab_tablecell" label="&tabTableCell.label;"/>
+    </tabs>
+    <tabpanels flex="1">
+
+      <!-- Object attributes tab panel -->
+      <tree>
+        <treecols>
+          <treecol label="&colAttrName.label;" flex="1"/>
+          <treecol label="&colAttrValue.label;" flex="2"/>
+        </treecols>
+        <treechildren id="trAttrBody"/>
+      </tree>
+
+      <!-- Action properties tab panel -->
+      <vbox id="actionTabPanel">
+        <grid>
+          <columns>
+            <column/>
+            <column flex="1"/>
+          </columns>
+          <rows id="actionItemContainer">
+            <row id="actionItem">
+              <description prop="actionIndex"/>
+              <vbox>
+                <hbox>
+                  <label value="&descName.label;"/>
+                  <description prop="actionName"/>
+                </hbox>
+                <hbox>
+                  <label value="&descDescription.label;"/>
+                  <description prop="actionDescription"/>
+                </hbox>
+                <hbox>
+                  <label value="&descKeyBindings.label;"/>
+                  <description prop="actionKeyBindings"/>
+                </hbox>
+                <button label="&descInvoke.label;"
+                        prop="invokeAction"/>
+              </vbox>
+            </row>
+          </rows>
+        </grid>
+      </vbox>
+
+      <!-- Text attributes -->
+      <vbox id="textAttrsTabPanel">
+        <label control="textAttrs:default:tree"
+               value="&descDefaultAttrs.label;"/>
+        <tree flex="1" id="textAttrs:default:tree">
+          <treecols>
+            <treecol label="&colAttrName.label;" flex="2"/>
+            <splitter class="tree-splitter"/>
+            <treecol label="&colAttrValue.label;" flex="4"/>
+          </treecols>
+          <treechildren id="textAttrs:default:treeBody"/>
+        </tree>
+
+        <description id="textAttrs:content"/>
+
+        <hbox>
+          <description>&descStartOffset.label;</description>
+          <description id="textAttrs:startOffset"/>
+          <description>&descEndOffset.label;</description>
+          <description id="textAttrs:endOffset"/>
+        </hbox>
+
+        <tree flex="1" id="textAttrs:tree">
+          <treecols>
+            <treecol label="&colAttrName.label;" flex="2"/>
+            <splitter class="tree-splitter"/>
+            <treecol label="&colAttrValue.label;" flex="4"/>
+          </treecols>
+          <treechildren id="textAttrs:treeBody"/>
+        </tree>
+      </vbox>
+
+      <!-- Table cell properties tab panel -->
+      <vbox>
+        <grid>
+          <columns>
+            <column/>
+            <column flex="1"/>
+            <column/>
+            <column flex="1"/>
+          </columns>
+          <rows>
+            <row>
+              <description>&descColumnIdx.label;</description>
+              <description id="tableCell:columnIndex"/>
+
+              <description>&descRowIdx.label;</description>
+              <description id="tableCell:rowIndex"/>
+            </row>
+            <row>
+              <description>&descColumnExtent.label;</description>
+              <description id="tableCell:columnExtent"/>
+
+              <description>&descRowExtent.label;</description>
+              <description id="tableCell:rowExtent"/>
+            </row>
+            <row>
+              <description>&descIsSelected.label;</description>
+              <description id="tableCell:isSelected"/>
+            </row>
+          </rows>
+        </grid>
+
+        <tree id="tableCell:accObjects"
+              flex="1"
+              context="popupContext"
+              onselect="viewer.pane.panelset.updateAllCommands();">
+
+          <treecols>
+            <treecol id="tableCell:property"
+                     primary="true"
+                     label="&colProp.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="tableCell:role"
+                     label="&colRole.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="tableCell:name"
+                     label="&colName.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="tableCell:nodeName"
+                     label="&colNodeName.label;"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+          </treecols>
+          <treechildren/>
+        </tree>
+      </vbox>
+    </tabpanels>
+  </tabbox>
+</page>
+
diff --git a/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.js b/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.js
@@ -0,0 +1,256 @@
+/* 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/. */
+
+/***************************************************************
+* AccessibleRelationsViewer --------------------------------------------
+*  The viewer for the accessible relations for the inspected accessible.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var gAccService = null;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessibleRelation = Components.interfaces.nsIAccessibleRelation;
+const nsIAccessible = Components.interfaces.nsIAccessible;
+
+/**
+ * Used for compatibility with Gecko versions prior to Gecko13.
+ */
+const nsIAccessNode = Components.interfaces.nsIAccessNode || nsIAccessible;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization
+
+window.addEventListener("load", AccessibleRelationsViewer_initialize, false);
+
+function AccessibleRelationsViewer_initialize()
+{
+  gAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                nsIAccessibleRetrieval);
+
+  viewer = new AccessibleRelationsViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class AccessibleRelationsViewer
+
+function AccessibleRelationsViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  this.mTree = document.getElementById("olAccessibleRelations");
+  this.mTreeBox = this.mTree.treeBoxObject;
+
+  this.mTargetsTree = document.getElementById("olAccessibleTargets");
+  this.mTargetsTreeBox = this.mTargetsTree.treeBoxObject;
+}
+
+AccessibleRelationsViewer.prototype =
+{
+  /////////////////////////
+  //// initialization
+
+  mSubject: null,
+  mPane: null,
+  mView: null,
+  mTargetsView: null,
+
+  /////////////////////////
+  //// interface inIViewer
+
+  get uid() { return "accessibleRelations"; },
+  get pane() { return this.mPane; },
+  get selection() { return this.mSelection; },
+
+  get subject() { return this.mSubject; },
+  set subject(aObject)
+  {
+    this.mView = new AccessibleRelationsView(aObject);
+    this.mTreeBox.view = this.mView;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function destroy()
+  {
+    this.mTreeBox.view = null;
+    this.mTargetsTreeBox.view = null;
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditInspectInNewWindow":
+        return !!this.getSelectedTargetDOMNode();
+    }
+    return false;
+  },
+
+  getCommand: function getCommand(aCommand)
+  {
+    if (aCommand in window) {
+      return new window[aCommand]();
+    }
+    return null;
+  },
+
+  /////////////////////////
+  //// event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  /////////////////////////
+  //// utils
+
+  onItemSelected: function onItemSelected()
+  {
+    var idx = this.mTree.currentIndex;
+    var relation = this.mView.getRelationObject(idx);
+    this.mTargetsView = new AccessibleTargetsView(relation);
+    this.mTargetsTreeBox.view = this.mTargetsView;
+  },
+
+  getSelectedTargetDOMNode: function getSelectedTargetDOMNode()
+  {
+    return this.mTargetsView.getSelectedDOMNode();
+  }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleRelationsView
+
+function AccessibleRelationsView(aObject)
+{
+  this.mAccessible = aObject instanceof nsIAccessible ?
+    aObject : gAccService.getAccessibleFor(aObject);
+
+  this.mRelations = this.mAccessible.getRelations();
+}
+
+AccessibleRelationsView.prototype = new inBaseTreeView();
+
+AccessibleRelationsView.prototype.__defineGetter__("rowCount",
+function rowCount()
+{
+  return this.mRelations.length;
+});
+
+AccessibleRelationsView.prototype.getRelationObject =
+function getRelationObject(aRow)
+{
+  return this.mRelations.queryElementAt(aRow, nsIAccessibleRelation);
+}
+
+AccessibleRelationsView.prototype.getCellText =
+function getCellText(aRow, aCol)
+{
+  if (aCol.id == "olcRelationType") {
+    var relation = this.getRelationObject(aRow);
+    if (relation)
+      return gAccService.getStringRelationType(relation.relationType);
+  }
+
+  return "";
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleTargetsView
+
+function AccessibleTargetsView(aRelation)
+{
+  this.mRelation = aRelation;
+  this.mTargets = this.mRelation.getTargets();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleTargetsView. nsITreeView
+
+AccessibleTargetsView.prototype = new inBaseTreeView();
+
+AccessibleTargetsView.prototype.__defineGetter__("rowCount",
+function rowCount()
+{
+  return this.mTargets.length;
+});
+
+AccessibleTargetsView.prototype.getCellText =
+function getCellText(aRow, aCol)
+{
+  if (aCol.id == "olcRole") {
+    var accessible = this.getAccessible(aRow);
+    if (accessible) {
+      // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
+      var role = "finalRole" in accessible ?
+        accessible.finalRole : accessible.role;
+      return gAccService.getStringRole(role);
+    }
+  } else if (aCol.id == "olcNodeName") {
+    var node = this.getDOMNode(aRow);
+    if (node)
+      return node.nodeName;
+  }
+
+  return "";
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleTargetsView. Utils
+
+AccessibleTargetsView.prototype.getAccessible =
+function getAccessible(aRow)
+{
+  return this.mTargets.queryElementAt(aRow, nsIAccessible);
+}
+
+AccessibleTargetsView.prototype.getDOMNode =
+function getDOMNode(aRow)
+{
+  var accessNode = this.mTargets.queryElementAt(aRow, nsIAccessNode);
+  return accessNode && accessNode.DOMNode;
+}
+
+AccessibleTargetsView.prototype.getSelectedDOMNode =
+  function getSelectedDOMNode()
+{
+  if (this.selection.count == 1) {
+    var rangeMinAndMax = {};
+    this.selection.getRangeAt(0, rangeMinAndMax, rangeMinAndMax);
+    return this.getDOMNode(rangeMinAndMax.value);
+  }
+  return null;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// Transactions
+
+function cmdEditInspectInNewWindow() {
+  this.mObject = viewer.getSelectedTargetDOMNode();
+}
+
+cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.xul b/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleRelations/accessibleRelations.xul
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleRelations.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<page id="winAccessibleEvents"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleRelations/accessibleRelations.js"/>
+
+  <commandset id="cmdsEditingExtras"/>
+
+  <popupset>
+    <menupopup id="popupContext">
+      <menuitem id="mnEditInspectInNewWindow"/>
+    </menupopup>
+  </popupset>
+
+  <label control="olAccessibleRelations"
+         value="&relations.label;"/>
+
+  <tree id="olAccessibleRelations"
+        class="plain"
+        flex="1"
+        onselect="viewer.onItemSelected()">
+
+    <treecols>
+      <treecol id="olcRelationType"
+               label="&relationType.label;"
+               primary="true"
+               flex="1"
+               persist="width,hidden,ordinal"/>
+    </treecols>
+    <treechildren id="olbAccessibleRelations"
+                  alternatingbackground="true"/>
+  </tree>
+
+  <label control="olAccessibleTargets"
+         value="&relationTargets.label;"/>
+
+  <tree id="olAccessibleTargets"
+        class="plain"
+        flex="1"
+        context="popupContext"
+        onselect="viewer.pane.panelset.updateAllCommands();">
+
+    <treecols>
+      <treecol id="olcRole"
+               primary="true"
+               label="&role.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcNodeName"
+               label="&nodeName.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+    </treecols>
+    <treechildren id="olbAccessibleTargets"
+                  alternatingbackground="true"/>
+  </tree>
+
+</page>
+
diff --git a/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.js b/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.js
@@ -0,0 +1,595 @@
+/* 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/. */
+
+/***************************************************************
+* AccessibleEventsViewer --------------------------------------------
+*  The viewer for the accessible tree of a document.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/hooks.js
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/events/ObserverManager.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/xul/FrameExchange.js
+****************************************************************/
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kObserverServiceCID = "@mozilla.org/observer-service;1";
+const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
+
+const nsIObserverService = Components.interfaces.nsIObserverService;
+
+const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
+const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
+const nsIAccessible = Components.interfaces.nsIAccessible;
+
+const nsIDOMNode = Components.interfaces.nsIDOMNode;
+
+/**
+ * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
+ * prior to Gecko13.
+ */
+function QIAccessNode(aAccessible)
+{
+  return "nsIAccessNode" in Components.interfaces ?
+    XPCU.QI(aAccessible, Components.interfaces.nsIAccessNode) : aAccessible;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization
+
+window.addEventListener("load", AccessibleTreeViewer_initialize, false);
+
+function AccessibleTreeViewer_initialize()
+{
+  viewer = new AccessibleTreeViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// AccessibleEventsViewer
+
+function AccessibleTreeViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  this.mTree = document.getElementById("olAccessibleTree");
+  this.mOlBox = this.mTree.treeBoxObject;
+}
+
+AccessibleTreeViewer.prototype =
+{
+  //Initialization
+
+  mSubject: null,
+  mPane: null,
+  mView: null,
+
+  // interface inIViewer
+
+  get uid() { return "accessibleTree"; },
+  get pane() { return this.mPane; },
+  get selection() { return this.mSelection; },
+
+  get subject() { return this.mSubject; },
+  set subject(aObject)
+  {
+    this.mView = new inAccTreeView(aObject);
+    this.mOlBox.view = this.mView;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+    this.mView.selection.select(0);
+  },
+
+  initialize: function initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function destroy()
+  {
+    this.mView.destroy();
+    this.mOlBox.view = null;
+  },
+
+  isCommandEnabled: function isCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditInspectInNewWindow":
+        return this.mTree.view.selection.count == 1;
+    }
+    return false;
+  },
+
+  getCommand: function getCommand(aCommand)
+  {
+    if (aCommand in window) {
+      return new window[aCommand]();
+    }
+    return null;
+  },
+
+  // event dispatching
+
+  addObserver: function addObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+  removeObserver: function removeObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  // UI commands
+  cmdEvalJS: function cmdEvalJS()
+  {
+    var sel = this.getSelectedAccessible();
+    if (sel) {
+      var win = openDialog("chrome://inspector/content/viewers/accessibleTree/evalJSDialog.xul", 
+                           "_blank", "chrome,resizable=yes", sel, this.mView);
+    }
+  },
+
+  // stuff
+
+  onItemSelected: function onItemSelected()
+  {
+    var idx = this.mTree.currentIndex;
+    this.mSelection = this.mView.getObject(idx);
+    this.mObsMan.dispatchEvent("selectionChange",
+                               { selection: this.mSelection } );
+
+    if (this.mSelection) {
+      var node = this.mSelection.DOMNode;
+      if (node.nodeType == nsIDOMNode.ELEMENT_NODE) {
+        var flasher = this.mPane.panelset.flasher;
+        flasher.flashElementOnSelect(node);
+      }
+    }
+
+    viewer.pane.panelset.updateAllCommands();
+  },
+
+  getSelectedAccessible: function getSelectedAccessible()
+  {
+    if (this.mTree.view.selection.count == 1) {
+      var rangeMinAndMax = {};
+      this.mTree.view.selection.getRangeAt(0, rangeMinAndMax, rangeMinAndMax);
+      return this.mView.getAccessible(rangeMinAndMax.value);
+    }
+    return null;
+  }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView
+
+function inAccTreeView(aObject)
+{
+  this.mNodes = [];
+
+  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
+                                     nsIAccessibleRetrieval);
+
+  this.mAccessible = aObject instanceof nsIAccessible ?
+    aObject : this.mAccService.getAccessibleFor(aObject);
+
+  this.mObserverService = XPCU.getService(kObserverServiceCID,
+                                          nsIObserverService);
+
+  this.mObserverService.addObserver(this, "accessible-event", false);
+
+  var node = this.createNode(this.mAccessible);
+  this.mNodes.push(node);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. nsITreeView interface
+
+inAccTreeView.prototype = new inBaseTreeView();
+
+inAccTreeView.prototype.__defineGetter__("rowCount",
+function rowCount()
+{
+  return this.mNodes.length;
+});
+
+inAccTreeView.prototype.getCellText =
+function getCellText(aRow, aCol)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return "";
+
+  var accessible = node.accessible;
+
+  if (aCol.id == "olcRole") {
+    // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
+    var role = "finalRole" in accessible ?
+      accessible.finalRole : accessible.role;
+    return this.mAccService.getStringRole(role);
+  }
+
+  if (aCol.id == "olcName")
+    return accessible.name;
+
+  if (aCol.id == "olcNodeName") {
+    var node = QIAccessNode(accessible).DOMNode;
+    return node ? node.nodeName : "";
+  }
+
+  return "";
+}
+
+inAccTreeView.prototype.isContainer =
+function isContainer(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.isContainer : false;
+}
+
+inAccTreeView.prototype.isContainerOpen =
+function isContainerOpen(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.isOpen : false;
+}
+
+inAccTreeView.prototype.isContainerEmpty =
+function isContainerEmpty(aRow)
+{
+  return !this.isContainer(aRow);
+}
+
+inAccTreeView.prototype.getLevel =
+function getLevel(aRow)
+{
+  var node = this.rowToNode(aRow);
+  return node ? node.level : 0;
+}
+
+inAccTreeView.prototype.getParentIndex =
+function getParentIndex(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return -1;
+
+  var checkNode = null;
+  var i = aRow - 1;
+  do {
+    checkNode = this.rowToNode(i);
+    if (!checkNode)
+      return -1;
+
+    if (checkNode == node.parent)
+      return i;
+    --i;
+  } while (checkNode);
+
+  return -1;
+}
+
+inAccTreeView.prototype.hasNextSibling =
+function hasNextSibling(aRow, aAfterRow)
+{
+  var node = this.rowToNode(aRow);
+  return node && (node.next != null);
+}
+
+inAccTreeView.prototype.toggleOpenState =
+function toggleOpenState(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var oldCount = this.rowCount;
+  if (node.isOpen)
+    this.collapseNode(aRow);
+  else
+    this.expandNode(aRow);
+
+  this.mTree.invalidateRow(aRow);
+  this.mTree.rowCountChanged(aRow + 1, this.rowCount - oldCount);
+}
+
+inAccTreeView.prototype.getRowProperties =
+function getRowProperties(aRowIdx)
+{
+  var node = this.rowToNode(aRowIdx);
+  if (node && node.highlighted) {
+    return "highlight";
+  }
+
+  return "";
+}
+
+inAccTreeView.prototype.getCellProperties =
+function getCellProperties(aRowIdx, aCol)
+{
+  return this.getRowProperties(aRowIdx);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. Public.
+
+/**
+ * Destroy the view.
+ */
+inAccTreeView.prototype.destroy =
+function inAccTreeView_destroy()
+{
+  this.mObserverService.removeObserver(this, "accessible-event");
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. Tree utils.
+
+/**
+ * Expands a tree node on the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.expandNode =
+function expandNode(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var kids = node.accessible.children;
+  var kidCount = kids.length;
+
+  var newNode = null;
+  var prevNode = null;
+
+  for (var i = 0; i < kidCount; ++i) {
+    var accessible = kids.queryElementAt(i, nsIAccessible);
+    newNode = this.createNode(accessible, node);
+    this.mNodes.splice(aRow + i + 1, 0, newNode);
+
+    if (prevNode)
+      prevNode.next = newNode;
+    newNode.previous = prevNode;
+    prevNode = newNode;
+  }
+
+  node.isOpen = true;
+}
+
+/**
+ * Collapse a tree node on the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.collapseNode =
+function collapseNode(aRow)
+{
+  var node = this.rowToNode(aRow);
+  if (!node)
+    return;
+
+  var row = this.getLastDescendantOf(node, aRow);
+  this.mNodes.splice(aRow + 1, row - aRow);
+
+  node.isOpen = false;
+}
+
+/**
+ * Expand the tree and highlight accessibles in the given subtree that comply
+ * to filter function.
+ *
+ * @param aRoot - the root accessible of subtree to search in
+ * @param aFilterFunc - a function that returns true if the passed accessible
+                        complies to search criteria.
+ */
+inAccTreeView.prototype.search =
+function search(aRoot, aFilterFunc)
+{
+  QIAccessNode(aRoot);
+  if (aFilterFunc(aRoot)) {
+    let chain = [];
+    let parent = aRoot;
+    do {
+      chain.push(parent);
+      if (parent == aRoot.document)
+        break;
+
+      parent = parent.parent;
+    } while (parent);
+
+    let current = chain.pop();
+    for (let idx = 0; idx < this.mNodes.length; idx++) {
+      let node = this.mNodes[idx];
+      if (node.accessible == current) {
+        if (chain.length == 0) {
+          node.highlighted = true;
+          this.mTree.invalidateRow(idx);
+        } else {
+          if (!node.isOpen)
+            this.toggleOpenState(idx);
+
+          current = chain.pop();
+        }
+      }
+    }
+  }
+
+  var count = aRoot.childCount;
+  for (let idx = 0; idx < count; idx++) {
+    let child = aRoot.getChildAt(idx);
+    this.search(child, aFilterFunc);
+  }
+}
+
+/**
+ * Clear search results.
+ */
+inAccTreeView.prototype.clearSearch =
+function clearSearch()
+{
+  for (let idx = 0; idx < this.mNodes.length; idx++) {
+    if (this.mNodes[idx].highlighted) {
+      this.mNodes[idx].highlighted = false;
+      this.mTree.invalidateRow(idx);
+    }
+  }
+}
+
+
+/**
+ * Create a tree node.
+ *
+ * @param aAccessible - an accessible object associated with created tree node.
+ * @param aParent - parent tree node for the created tree node.
+ * @retrurn - tree node object for the given accesible.
+ */
+inAccTreeView.prototype.createNode =
+function createNode(aAccessible, aParent)
+{
+  var node = new inAccTreeViewNode(aAccessible);
+  node.level = aParent ? aParent.level + 1 : 0;
+  node.parent = aParent;
+  node.isContainer = aAccessible.children.length > 0;
+
+  return node;
+}
+
+/**
+ * Return row index of the last node that is a descendant of the given node.
+ * If there is no required node then return the given row.
+ *
+ * @param aNode - tree node for that last descedant is searched.
+ * @param aRow - row index of the given tree node.
+ */
+inAccTreeView.prototype.getLastDescendantOf =
+function getLastDescendantOf(aNode, aRow)
+{
+  var rowCount = this.rowCount;
+
+  var row = aRow + 1;
+  for (; row < rowCount; ++row) {
+    if (this.mNodes[row].level <= aNode.level)
+      return row - 1;
+  }
+
+  return rowCount - 1;
+}
+
+/**
+ * Return a tree node by the given row.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.rowToNode =
+function rowToNode(aRow)
+{
+  if (aRow < 0 || aRow >= this.rowCount)
+    return null;
+
+  return this.mNodes[aRow];
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeView. Accessibility utils.
+
+/**
+ * Return DOM node for an accessible or accessible if there is no associated
+ * DOM node by the tree node pointed by the given row index.
+ *
+ * @param aRow - row index.
+ */
+inAccTreeView.prototype.getObject =
+function getObject(aRow)
+{
+  var node = this.mNodes[aRow];
+  return node && QIAccessNode(node.accessible);
+}
+
+/**
+ * Return accessible of the tree node pointed by the given
+ * row index.
+ *
+ * @param aRow - the row index to get the accessible from.
+ * @returns the accessible for the given index.
+ */
+inAccTreeView.prototype.getAccessible =
+function getAccessible(aRow)
+{
+  var node = this.mNodes[aRow];
+  if (!node)
+    return null;
+
+  return node.accessible;
+}
+
+inAccTreeView.prototype.observe =
+function inAccTreeView_observe(aSubject, aTopic, aData)
+{
+  let event = XPCU.QI(aSubject, nsIAccessibleEvent);
+
+  // Update the children if they were changed.
+  if (event.eventType != nsIAccessibleEvent.EVENT_REORDER)
+    return;
+
+  var accessible = event.accessible;
+  if (!accessible)
+    return;
+
+  // Ignore the event if its target is from anther document.
+  var parentAccessible = accessible;
+  while (parentAccessible != this.mAccessible) {
+    parentAccessible = parentAccessible.parent;
+    if (!parentAccessible) {
+      return;
+    }
+  }
+
+  for (let idx = 0; idx < this.mNodes.length; idx++) {
+    let node = this.mNodes[idx];
+    if (node.accessible == accessible) {
+      if (node.isOpen) {
+        // Toggle open state twice to update the children.
+        this.toggleOpenState(idx);
+        this.toggleOpenState(idx);
+      }
+      break;
+    }
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// inAccTreeViewNode
+
+function inAccTreeViewNode(aAccessible)
+{
+  this.accessible = aAccessible;
+
+  this.parent = null;
+  this.next = null;
+  this.previous = null;
+
+  this.level = 0;
+  this.isOpen = false;
+  this.isContainer = false;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Transactions
+
+function cmdEditInspectInNewWindow()
+{
+  this.mObject = viewer.getSelectedAccessible();
+}
+
+cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.xul b/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleTree/accessibleTree.xul
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleTree.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css"?>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<page id="winAccessibleTree"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleTree/accessibleTree.js"/>
+
+  <commandset id="cmdsAccTreeViewer">
+    <command id="cmdEvalJS" oncommand="viewer.cmdEvalJS();"/>
+  </commandset>
+  <commandset id="cmdsEditingExtras"/>
+
+  <popupset>
+    <menupopup id="popupContext">
+      <menuitem id="mnEditInspectInNewWindow"/>
+      <menuseparator/>
+      <menuitem label="&evaluateJS.label;" observes="cmdEvalJS"/>
+    </menupopup>
+  </popupset>
+
+  <tree id="olAccessibleTree" class="plain" treelines="true" flex="1"
+        onselect="viewer.onItemSelected()"
+        context="popupContext">
+    <treecols>
+      <treecol id="olcRole"
+               label="&role.label;"
+               persist="width,hidden,ordinal"
+               primary="true"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcName"
+               label="&name.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcNodeName"
+               label="&nodeName.label;"
+               persist="width,hidden,ordinal"
+               flex="1"/>
+    </treecols>
+    <treechildren id="olbAccessibleTree"
+                  alternatingbackground="true"/>
+  </tree>
+
+</page>
+
diff --git a/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.js b/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.js
@@ -0,0 +1,89 @@
+/* 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/. */
+ 
+var gAcc = window.arguments[0];
+var gTreeView = window.arguments[1];
+
+var gInputArea = null;
+var gOutputArea = null;
+
+var Cc = Components.classes;
+var Ci = Components.interfaces;
+
+function load()
+{
+  gInputArea = document.getElementById("JSInputArea");
+  gOutputArea = document.getElementById("JSOutputArea");
+}
+
+function closeDialog()
+{
+  gTreeView.clearSearch();
+}
+ 
+function execute()
+{
+  if (!gAcc)
+    return;
+
+  for (var idx = 0; idx < gAccInterfaces.length; idx++) {
+    if (gAcc instanceof gAccInterfaces[idx])
+      gAcc.QueryInterface(gAccInterfaces[idx]);
+  }
+
+  gOutputArea.value = "";
+
+  var expr = gInputArea.value;
+  try {
+    var f = Function("accessible", "tree", expr);
+    var result = f(gAcc, gTreeView);
+  } catch (ex) {
+      output(ex);
+  }
+}
+
+var gAccInterfaces =
+[
+  Ci.nsIAccessible,
+  Ci.nsIAccessibleDocument,
+  Ci.nsIAccessibleEditableText,
+  Ci.nsIAccessibleHyperLink,
+  Ci.nsIAccessibleHyperText,
+  Ci.nsIAccessibleImage,
+  Ci.nsIAccessibleSelectable,
+  Ci.nsIAccessibleTable,
+  Ci.nsIAccessibleTableCell,
+  Ci.nsIAccessibleText,
+  Ci.nsIAccessibleValue
+];
+
+// Used for compatibility with Gecko versions prior to Gecko13.
+if ("nsIAccessNode" in Ci)
+  gAccInterfaces.push(Ci.nsIAccessNode);
+
+function output(aValue)
+{
+  gOutputArea.value += aValue;
+}
+
+function outputTextAttrs(aAccessible, aOffset)
+{
+  if (aAccessible instanceof Ci.nsIAccessibleText) {
+    var startOffsetObj = {}, endOffsetObj = {};
+    var attrs = aAccessible.getTextAttributes(false, aOffset,
+                                              startOffsetObj, endOffsetObj);
+    if (attrs) {
+      var str = "Start offset: " + startOffsetObj.value;
+      str += ", end offset: " + endOffsetObj.value + "\nText attributes:\n";
+
+      var enumerator = attrs.enumerate();
+      while (enumerator.hasMoreElements()) {
+        var prop = enumerator.getNext().QueryInterface(Ci.nsIPropertyElement);
+        str += "\t" + prop.key + ": " + prop.value + ";\n";
+      }
+
+      output(str);
+    }
+  }
+}
diff --git a/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.xul b/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/accessibleTree/evalJSDialog.xul
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE dialog [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/viewers/accessibleTreeEvalJSDialog.dtd"> %dtd1;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin"?>
+
+<dialog id="winEvalJS"
+        title="&evaluateDialog.title;"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        buttons="accept, extra1"
+        buttonlabelextra1="&btnEvaluateJS.label;"
+        buttonaccesskeyextra1="&btnEvaluateJS.accesskey;"
+        ondialogextra1="return execute();"
+        style="width: 30em;"
+        onload="load();"
+        ondialogaccept="closeDialog();">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/accessibleTree/evalJSDialog.js"/>
+
+  <label control="JSInputArea"
+         accesskey="&txtInputArea.accesskey;">&txtInputArea.label;</label>
+  <textbox id="JSInputArea"
+           flex="1"
+           multiline="true"
+           rows="10"/>
+
+  <label control="JSOutputArea"
+         value="&txtOutputArea.label;"
+         accesskey="&txtOutputArea.accesskey;"/>
+  <textbox id="JSOutputArea"
+           flex="1"
+           multiline="true"
+           readonly="true"
+           rows="8"/>
+
+</dialog>
diff --git a/suite/components/inspector/content/viewers/boxModel/boxModel.js b/suite/components/inspector/content/viewers/boxModel/boxModel.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/boxModel/boxModel.js
@@ -0,0 +1,244 @@
+/* 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/. */
+
+/***************************************************************
+* BoxModelViewer --------------------------------------------
+*  The viewer for the boxModel and visual appearance of an element.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var viewer;
+
+//////////// global constants ////////////////////
+
+const kIMPORT_RULE = Components.interfaces.nsIDOMCSSRule.IMPORT_RULE;
+
+//////////////////////////////////////////////////
+
+window.addEventListener("load", BoxModelViewer_initialize, false);
+
+function BoxModelViewer_initialize()
+{
+  viewer = new BoxModelViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+////////////////////////////////////////////////////////////////////////////
+//// class BoxModelViewer
+
+function BoxModelViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+}
+
+BoxModelViewer.prototype = 
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+  
+  mSubject: null,
+  mPane: null,
+  
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  get uid() { return "boxModel" },
+  get pane() { return this.mPane },
+
+  get subject() { return this.mSubject },
+  set subject(aObject) 
+  {
+    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
+      aObject : aObject.DOMNode;
+    this.showStats();
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  initialize: function(aPane)
+  {
+    this.initGroups();
+
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  groupPosition:  {},
+  groupDimension: {},
+  groupMargin:    {},
+  groupBorder:    {},
+  groupPadding:   {},
+
+  initGroups: function()
+  {
+    this.groupPosition.x =    document.getElementById("positionXValue");
+    this.groupPosition.y =    document.getElementById("positionYValue");
+    this.groupPosition.screenX =
+                              document.getElementById("positionScreenXValue");
+    this.groupPosition.screenY =
+                              document.getElementById("positionScreenYValue");
+
+    this.groupDimension.width  =
+                              document.getElementById("dimensionWidthValue");
+    this.groupDimension.height =
+                              document.getElementById("dimensionHeightValue");
+
+    this.groupMargin.top =    document.getElementById("marginTopValue");
+    this.groupMargin.right =  document.getElementById("marginRightValue");
+    this.groupMargin.bottom = document.getElementById("marginBottomValue");
+    this.groupMargin.left =   document.getElementById("marginLeftValue");
+
+    this.groupBorder.top =    document.getElementById("borderTopValue");
+    this.groupBorder.right =  document.getElementById("borderRightValue");
+    this.groupBorder.bottom = document.getElementById("borderBottomValue");
+    this.groupBorder.left =   document.getElementById("borderLeftValue");
+
+    this.groupPadding.top =    document.getElementById("paddingTopValue");
+    this.groupPadding.right =  document.getElementById("paddingRightValue");
+    this.groupPadding.bottom = document.getElementById("paddingBottomValue");
+    this.groupPadding.left =   document.getElementById("paddingLeftValue");
+  },
+
+  destroy: function()
+  {
+  },
+
+  isCommandEnabled: function(aCommand)
+  {
+    return false;
+  },
+  
+  getCommand: function(aCommand)
+  {
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// event dispatching
+
+  addObserver: function(aEvent, aObserver) { this.mObsMan.addObserver(aEvent, aObserver); },
+  removeObserver: function(aEvent, aObserver) { this.mObsMan.removeObserver(aEvent, aObserver); },
+  
+  ////////////////////////////////////////////////////////////////////////////
+  //// statistical updates
+  
+  showStats: function()
+  {
+    this.showPositionStats();
+    this.showDimensionStats();
+    this.showMarginStats();
+    this.showBorderStats();
+    this.showPaddingStats();
+  },
+  
+  showStatistic: function(aElement,  aSize)
+  {
+    if (aSize == null) {
+        aSize = "";
+    }
+    var str = aSize.toString();
+    aElement.setAttribute("value", str);
+
+    var nonzero = aSize != 0 && str.indexOf("0px");
+    aElement.setAttribute("class", nonzero ? "plain nonzero" : "plain");
+
+    aElement.setAttribute("size", str.length + 1);
+  },
+  
+  showPositionStats: function()
+  {
+    var group = this.groupPosition;
+    if ("boxObject" in this.mSubject) { // xul elements
+      var bx = this.mSubject.boxObject;
+      this.showStatistic(group.x, bx.x);
+      this.showStatistic(group.y, bx.y);
+      this.showStatistic(group.screenX, bx.screenX);
+      this.showStatistic(group.screenY, bx.screenY);
+      group.screenX.parentNode.hidden = false;
+      group.screenY.parentNode.hidden = false;
+    } else { // html elements
+      this.showStatistic(group.x, this.mSubject.offsetLeft);
+      this.showStatistic(group.y, this.mSubject.offsetTop);
+      group.screenX.parentNode.hidden = true;
+      group.screenY.parentNode.hidden = true;
+    }
+  },
+  
+  showDimensionStats: function()
+  {
+    var group = this.groupDimension;
+    if ("boxObject" in this.mSubject) { // xul elements
+      var bx = this.mSubject.boxObject;
+      this.showStatistic(group.width,  bx.width);
+      this.showStatistic(group.height, bx.height);
+    } else { // html elements
+      this.showStatistic(group.width,  this.mSubject.offsetWidth);
+      this.showStatistic(group.height, this.mSubject.offsetHeight);
+    }
+  },
+
+  getSubjectComputedStyle: function()
+  {
+    var view = this.mSubject.ownerDocument.defaultView;
+    return view.getComputedStyle(this.mSubject, "");
+  },
+
+  showMarginStats: function()
+  {
+    var style = this.getSubjectComputedStyle();
+    var data = [this.readMarginStyle(style, "top"), this.readMarginStyle(style, "right"), 
+                this.readMarginStyle(style, "bottom"), this.readMarginStyle(style, "left")];
+    this.showSideStats(this.groupMargin, data);
+  },
+
+  showBorderStats: function()
+  {
+    var style = this.getSubjectComputedStyle();
+    var data = [this.readBorderStyle(style, "top"), this.readBorderStyle(style, "right"), 
+                this.readBorderStyle(style, "bottom"), this.readBorderStyle(style, "left")];
+    this.showSideStats(this.groupBorder, data);
+  },
+
+  showPaddingStats: function()
+  {
+    var style = this.getSubjectComputedStyle();
+    var data = [this.readPaddingStyle(style, "top"), this.readPaddingStyle(style, "right"), 
+                this.readPaddingStyle(style, "bottom"), this.readPaddingStyle(style, "left")];
+    this.showSideStats(this.groupPadding, data);
+  },
+
+  showSideStats: function(aGroup, aData)
+  {
+    this.showStatistic(aGroup.top,    aData[0]);
+    this.showStatistic(aGroup.right,  aData[1]);
+    this.showStatistic(aGroup.bottom, aData[2]);
+    this.showStatistic(aGroup.left,   aData[3]);
+  },
+  
+  readMarginStyle: function(aStyle, aSide)
+  {
+    return aStyle.getPropertyCSSValue("margin-"+aSide).cssText;
+  },
+  
+  readPaddingStyle: function(aStyle, aSide)
+  {
+    return aStyle.getPropertyCSSValue("padding-"+aSide).cssText;
+  },
+  
+  readBorderStyle: function(aStyle, aSide)
+  {
+    var style = aStyle.getPropertyCSSValue("border-"+aSide+"-style").cssText;
+    if (!style || !style.length) {
+      return "none";
+    } else {
+      return aStyle.getPropertyCSSValue("border-"+aSide+"-width").cssText + " " + 
+             style + " " +
+             aStyle.getPropertyCSSValue("border-"+aSide+"-color").cssText;
+    }
+  }
+};
diff --git a/suite/components/inspector/content/viewers/boxModel/boxModel.xul b/suite/components/inspector/content/viewers/boxModel/boxModel.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/boxModel/boxModel.xul
@@ -0,0 +1,176 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/boxModel.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/boxModel/boxModel.css"?>
+<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
+
+<page id="winBoxModel"
+      orient="vertical"
+      xmlns:html="http://www.w3.org/1999/xhtml"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <script type="application/javascript" src="chrome://inspector/content/viewers/boxModel/boxModel.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>  
+
+  <vbox id="enclosingBox" flex="1">
+    <vbox>
+
+      <groupbox id="boxPosition">
+        <caption><label>&boxPosition.label;</label>
+        </caption>
+        <grid flex="1">
+          <columns>
+            <column/>
+            <column class="value-column"/>
+          </columns>
+          <rows>
+            <row>
+              <label id="positionXLabel" value="&xCoord.label;" class="title"/>
+              <textbox id="positionXValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="positionYLabel" value="&yCoord.label;" class="title"/>
+              <textbox id="positionYValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="positionScreenXLabel" value="&screenXCoord.label;"
+                     class="title"/>
+              <textbox id="positionScreenXValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="positionScreenYLabel" value="&screenYCoord.label;"
+                     class="title"/>
+              <textbox id="positionScreenYValue" readonly="true" class="plain"/>
+            </row>
+          </rows>
+        </grid>
+      </groupbox>
+
+      <groupbox id="boxDimension">
+        <caption><label>&boxDimension.label;</label>
+        </caption>
+        <grid flex="1">
+          <columns>
+            <column/>
+            <column class="value-column"/>
+          </columns>
+          <rows>
+            <row>
+              <label id="dimensionWidthLabel" value="&dimensionWidth.label;"
+                     class="title"/>
+              <textbox id="dimensionWidthValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="dimensionHeightLabel" value="&dimensionHeight.label;"
+                     class="title"/>
+              <textbox id="dimensionHeightValue" readonly="true" class="plain"/>
+            </row>
+          </rows>
+        </grid>
+      </groupbox>
+
+      <groupbox id="boxMargin">
+        <caption><label>&boxMargin.label;</label>
+        </caption>
+        <grid flex="1">
+          <columns>
+            <column/>
+            <column class="value-column"/>
+          </columns>
+          <rows>
+            <row>
+              <label id="marginTopLabel" value="margin-top" class="title"/>
+              <textbox id="marginTopValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="marginRightLabel" value="margin-right" class="title"/>
+              <textbox id="marginRightValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="marginBottomLabel" value="margin-bottom"
+                     class="title"/>
+              <textbox id="marginBottomValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="marginLeftLabel" value="margin-left" class="title"/>
+              <textbox id="marginLeftValue" readonly="true" class="plain"/>
+            </row>
+          </rows>
+        </grid>
+      </groupbox>
+
+      <groupbox id="boxBorder">
+        <caption><label>&boxBorder.label;</label>
+        </caption>
+        <grid flex="1">
+          <columns>
+            <column/>
+            <column class="value-column" flex="1"/>
+          </columns>
+          <rows>
+            <row>
+              <label id="borderTopLabel" value="border-top" class="title"/>
+              <textbox id="borderTopValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="borderRightLabel" value="border-right" class="title"/>
+              <textbox id="borderRightValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="borderBottomLabel" value="border-bottom"
+                     class="title"/>
+              <textbox id="borderBottomValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="borderLeftLabel" value="border-left" class="title"/>
+              <textbox id="borderLeftValue" readonly="true" class="plain"/>
+            </row>
+          </rows>
+        </grid>
+      </groupbox>
+
+      <groupbox id="boxPadding">
+        <caption><label>&boxPadding.label;</label>
+        </caption>
+        <grid flex="1">
+          <columns>
+            <column/>
+            <column class="value-column"/>
+          </columns>
+          <rows>
+            <row>
+              <label id="paddingTopLabel" value="padding-top" class="title"/>
+              <textbox id="paddingTopValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="paddingRightLabel" value="padding-right"
+                     class="title"/>
+              <textbox id="paddingRightValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="paddingBottomLabel" value="padding-bottom"
+                     class="title"/>
+              <textbox id="paddingBottomValue" readonly="true" class="plain"/>
+            </row>
+            <row>
+              <label id="paddingLeftLabel" value="padding-left" class="title"/>
+              <textbox id="paddingLeftValue" readonly="true" class="plain"/>
+            </row>
+          </rows>
+        </grid>
+      </groupbox>
+
+    </vbox>
+  </vbox>
+
+</page>
diff --git a/suite/components/inspector/content/viewers/computedStyle/computedStyle.js b/suite/components/inspector/content/viewers/computedStyle/computedStyle.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/computedStyle/computedStyle.js
@@ -0,0 +1,197 @@
+/* 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/. */
+
+/*****************************************************************************
+* ComputedStyleViewer --------------------------------------------------------
+*  The viewer for the computed CSS styles on a DOM element.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/events/ObserverManager.js
+*   chrome://inspector/content/commands/baseCommands.js
+*   chrome://inspector/content/system/clipboardFlavors.js
+*   chrome://inspector/content/xul/inBaseTreeView.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", ComputedStyleViewer_initialize, false);
+
+function ComputedStyleViewer_initialize()
+{
+  viewer = new ComputedStyleViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// class ComputedStyleViewer
+
+function ComputedStyleViewer()
+{
+  this.mObsMan = new ObserverManager(this);
+  this.mURL = window.location;
+
+  this.mTree = document.getElementById("olStyles");
+}
+
+//XXX Don't use anonymous functions
+ComputedStyleViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPane: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  get uid()
+  {
+    return "computedStyle";
+  },
+
+  get pane()
+  {
+    return this.mPane;
+  },
+
+  get subject()
+  {
+    return this.mSubject;
+  },
+
+  set subject(aObject)
+  {
+    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
+      aObject : aObject.DOMNode;
+
+    var bo = this.mTree.treeBoxObject;
+    var firstVisibleRow = -1;
+    var selectedIndices;
+    var currentIndex;
+    if (this.mTreeView) {
+      firstVisibleRow = bo.getFirstVisibleRow();
+      selectedIndices = this.mTreeView.getSelectedIndices();
+      currentIndex = this.mTreeView.selection.currentIndex;
+    }
+
+    this.mTreeView = new ComputedStyleView(this.mSubject);
+    this.mTree.view = this.mTreeView;
+
+    if (firstVisibleRow >= 0) {
+      bo.beginUpdateBatch();
+      try {
+        bo.scrollToRow(firstVisibleRow);
+        let selection = this.mTreeView.selection;
+        for (let i = 0, n = selectedIndices.length; i < n; ++i) {
+          selection.toggleSelect(selectedIndices[i]);
+        }
+        selection.currentIndex = currentIndex;
+      }
+      catch (ex) {
+        Components.utils.reportError(ex);
+      }
+      bo.endUpdateBatch();
+    }
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  initialize: function CSVr_Initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function CSVr_Destroy()
+  {
+    // We need to remove the view at this time or else it will attempt to
+    // re-paint while the document is being deconstructed, resulting in some
+    // nasty XPConnect assertions
+    this.mTree.view = null;
+  },
+
+  isCommandEnabled: function CSVr_IsCommandEnabled(aCommand)
+  {
+    if (aCommand == "cmdEditCopy") {
+      return this.mTree.view.selection.count > 0;
+    }
+    return false;
+  },
+
+  getCommand: function CSVr_GetCommand(aCommand)
+  {
+    if (aCommand == "cmdEditCopy") {
+      return new cmdEditCopy(this.mTreeView.getSelectedRowObjects());
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// event dispatching
+
+  addObserver: function CSVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function CSVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Miscellaneous
+
+  onItemSelected: function CSVr_OnItemSelected()
+  {
+    // This will (eventually) call isCommandEnabled on Copy
+    viewer.pane.panelset.updateAllCommands();
+  }
+};
+
+////////////////////////////////////////////////////////////////////////////
+//// ComputedStyleView
+
+function ComputedStyleView(aObject)
+{
+  var view = aObject.ownerDocument.defaultView;
+  this.mStyleList = view.getComputedStyle(aObject, "");
+  this.mRowCount = this.mStyleList.length;
+}
+
+ComputedStyleView.prototype = new inBaseTreeView();
+
+ComputedStyleView.prototype.getCellText = function CSV_GetCellText(aRow, aCol)
+{
+  var prop = this.mStyleList.item(aRow);
+  if (aCol.id == "olcStyleName") {
+    return prop;
+  }
+  else if (aCol.id == "olcStyleValue") {
+    return this.mStyleList.getPropertyValue(prop);
+  }
+
+  return null;
+}
+
+/**
+  * Returns a CSSProperty for the row in the tree corresponding to the passed
+  * index.
+  * @param aIndex
+  *        index of the row in the tree
+  * @return a CSSProperty
+  */
+ComputedStyleView.prototype.getRowObjectFromIndex =
+  function CSV_GetRowObjectFromIndex(aIndex)
+{
+  var prop = this.mStyleList.item(aIndex);
+  return new CSSProperty(prop, this.mStyleList.getPropertyValue(prop));
+}
diff --git a/suite/components/inspector/content/viewers/computedStyle/computedStyle.xul b/suite/components/inspector/content/viewers/computedStyle/computedStyle.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/computedStyle/computedStyle.xul
@@ -0,0 +1,51 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/computedStyle.dtd"> %dtd2;
+]>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<page id="winComputedStyle"
+      orient="vertical"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/computedStyle/computedStyle.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
+
+  <commandset id="cmdsEditing"/>
+
+  <popupset id="psPopups">
+    <menupopup id="ppComputedStyleContext">
+      <menuitem id="mnEditCopy"/>
+    </menupopup>
+  </popupset>
+
+  <tree id="olStyles" flex="1" onselect="viewer.onItemSelected()"
+        class="plain" contextmenu="ppComputedStyleContext">
+    <treecols>
+      <treecol id="olcStyleName" label="&propertyName.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcStyleValue" label="&propertyValue.label;" flex="1"/>
+    </treecols>
+    <treechildren id="olbStyles" alternatingbackground="true"/>
+  </tree>
+</page>
diff --git a/suite/components/inspector/content/viewers/dom/FindDialog.js b/suite/components/inspector/content/viewers/dom/FindDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/FindDialog.js
@@ -0,0 +1,144 @@
+/* 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/. */
+
+/***************************************************************
+* FindDialog ---------------------------------------------------
+*  Controls the dialog box used for searching the DOM.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/rdf/RDFU.js
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var dialog;
+
+//////////// global constants ////////////////////
+
+//////////////////////////////////////////////////
+
+window.addEventListener("load", FindDialog_initialize, false);
+
+function FindDialog_initialize()
+{
+  dialog = new FindDialog();
+}
+
+////////////////////////////////////////////////////////////////////////////
+//// class FindDialog
+
+function FindDialog()
+{
+  this.setDirection(window.arguments[1] ? window.arguments[1] : "down");
+  if (window.arguments[2]) {
+    this.setValue(window.arguments[2][0], window.arguments[2][1])
+  }
+  this.toggleType(window.arguments[0] ? window.arguments[0] : "id");
+  this.mOpener = window.opener.viewer;
+  
+  var txf = document.getElementById("tfText1");
+  txf.select();
+  txf.focus();
+}
+
+FindDialog.prototype = 
+{
+  mType: null,
+
+  ////////// Properties
+
+
+  ////////// Methods
+
+  doFind: function()
+  {
+    var el = document.getElementById("tfText1");
+    var dir = document.getElementById("rgDirection").value;
+    if (this.mType == "id") {
+      this.mOpener.startFind("id", dir, el.value);
+    } else if (this.mType == "tag") {
+      this.mOpener.startFind("tag", dir, el.value);
+    } else if (this.mType == "attr") {
+      var el2 = document.getElementById("tfText2");
+      this.mOpener.startFind("attr", dir, el.value, el2.value);
+    }
+  },
+
+  toggleType: function(aType)
+  {
+    this.mType = aType;
+
+    if (aType == "id") {
+      this.showDirection(false);
+      this.setLabel1(0);
+      this.showRow2(false);
+    } else if (aType == "tag") {
+      this.showDirection(true);
+      this.setLabel1(1);
+      this.showRow2(false);
+    } else if (aType == "attr") {
+      this.showDirection(true);
+      this.setLabel1(2);
+      this.showRow2(true);
+    }
+
+    var rd = document.getElementById("rdType_"+aType.toLowerCase());
+    if (rd) {
+      var rg = document.getElementById("rgType");
+      rg.selectedItem = rd;
+    }
+
+  },
+
+  setLabel1: function(aIndex)
+  {
+    var deck = document.getElementById("rwRow1Text");
+    
+    // We want to add a control attribute to the selected label so that 
+    // accessibility aids can get the textbox's label.
+    // Remove the control attribute from the old panel.
+    deck.selectedPanel.removeAttribute("control");
+
+    deck.selectedIndex = aIndex;
+    // Add the control attribute to the new panel.
+    deck.selectedPanel.control = "tfText1";
+  },
+
+  showRow2: function(aTruth)
+  {
+    var row = document.getElementById("rwRow2");
+    row.setAttribute("hide", !aTruth);
+  },
+  
+  setDirection: function(aMode)
+  {
+    var rd = document.getElementById("rdDir_"+aMode.toLowerCase());
+    if (rd) {
+      var rg = document.getElementById("rgDirection");
+      rg.selectedItem = rd;
+    }
+  },
+  
+  setValue: function(aValue1, aValue2)
+  {
+    var txf;
+    if (aValue1) {
+      txf = document.getElementById("tfText1");
+      txf.value = aValue1;
+    }
+    if (aValue2) {
+      txf = document.getElementById("tfText2");
+      txf.value = aValue2;
+    }
+  },
+  
+  showDirection: function(aTruth)
+  {
+    document.getElementById("rdDir_up").disabled = !aTruth;
+    document.getElementById("rdDir_down").disabled = !aTruth;
+  }
+
+};
+
diff --git a/suite/components/inspector/content/viewers/dom/columnsDialog.js b/suite/components/inspector/content/viewers/dom/columnsDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/columnsDialog.js
@@ -0,0 +1,219 @@
+/* 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/. */
+
+/***************************************************************
+* ColumnsDialog --------------------------------------------
+*  Dialog box for editing the columns in the DOM Viewer tree.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var dialog;
+
+var gColumnTitles = [
+  "nodeName",
+  "nodeValue",
+  "nodeType",
+  "prefix",
+  "localName",
+  "namespaceURI"
+];
+
+//////////// global constants ////////////////////
+
+//////////////////////////////////////////////////
+
+window.addEventListener("load", ColumnsDialog_initialize, false);
+window.addEventListener("unload", ColumnsDialog_destroy, false);
+
+function ColumnsDialog_initialize()
+{
+  dialog = new ColumnsDialog();
+  dialog.initialize();
+}
+
+function ColumnsDialog_destroy()
+{
+  dialog.destroy();
+}
+
+////////////////////////////////////////////////////////////////////////////
+//// class ColumnsDialog
+
+function ColumnsDialog()
+{
+  this.mViewer = window.arguments[0];
+  this.mColBoxHash = {};
+}
+
+ColumnsDialog.prototype = 
+{
+  mBox: null,
+  mDraggingBox: null,
+  
+  get box() { return this.mBox },
+  
+  initialize: function()
+  {
+    // bug 56270 - dragSession.sourceDocument is null --
+    // causes me to code this very temporary, very nasty hack
+    // to make sure I get notified when a column is dropped
+    opener.viewer.mDOMTree.onClientDrop = ColumnsDialogDropOut;
+    
+    this.buildContents();
+    
+    // notify the dom viewer that we've opened
+    this.mViewer.onColumnsDialogReady(this);
+  },
+  
+  destroy: function()
+  {
+    // notify the dom viewer that we're going away
+    this.mViewer.onColumnsDialogClose(this);
+  },
+  
+  buildContents: function()
+  {
+    var box = document.getElementById("bxColumns");
+    this.mBox = box;
+    
+    // create the special attribute box
+    var item = this.createAttrItem();
+    box.appendChild(item);
+    
+    // add all boxes except those that are already
+    // in the viewer
+    for (var i = 0; i < gColumnTitles.length; ++i)
+      if (!this.mViewer.hasColumn(gColumnTitles[i])) {
+        this.addItem(gColumnTitles[i]);
+      }  
+  },
+  
+  addItem: function(aValue)
+  {
+    if (!aValue || aValue.charAt(0) == "@") 
+      return null;
+      
+    item = this.createItem(aValue);
+    this.mColBoxHash[aValue] = item;
+    if (item) {
+      this.mBox.appendChild(item);
+      window.sizeToContent();
+    }
+  },
+  
+  removeItem: function(aValue)
+  {
+    if (!aValue || aValue.charAt(0) == "@")
+      return null;
+      
+    var colBox = this.mColBoxHash[aValue];
+    if (!colBox._isAttrCol) {
+      this.mBox.removeChild(colBox);
+      window.sizeToContent();
+    }
+  },
+  
+  createItem: function(aValue)
+  {
+    var text = document.createElementNS(kXULNSURI, "text");
+    text._ColValue = aValue;
+    text._isColBox = true;
+    text._isAttrCol = false;
+    text.setAttribute("class", "column-selector");
+    text.setAttribute("value", aValue);
+
+    return text;
+  },
+  
+  createAttrItem: function(aValue)
+  {
+    var box = document.createElementNS(kXULNSURI, "box");
+    box._isColBox = true;
+    box._isAttrCol = true;
+    box.setAttribute("class", "column-selector");
+    box.setAttribute("align", "center");
+
+    var text = document.createElementNS(kXULNSURI, "text");
+    text.setAttribute("value", "Attr");
+    box.appendChild(text);
+
+    var txf = document.createElementNS(kXULNSURI, "textbox");
+    txf.setAttribute("class", "attr-column-selector");
+    txf.setAttribute("flex", 1);
+    box.appendChild(txf);
+
+    return box;
+  },
+    
+  ////////////////////////////////////////////////////////////////////////////
+  //// Drag and Drop
+
+  onDragStart: function(aEvent)
+  {
+    var box = this.getBoxTarget(aEvent.target);
+    this.setDraggingBox(box);
+    if (!box) return false;
+    
+    var column = this.getColumnValue(box);
+    if (!column) return false;
+    
+    DNDUtils.invokeSession(aEvent.target, ["TreeBuilder/column-add"], [column]);
+    
+    return false;
+  },
+  
+  onDropOut: function()
+  {
+    var box = document.getElementById("bxColumns");
+    var value =  this.mDraggingBox._ColValue;
+    this.setDraggingBox(null);
+    this.removeItem(value);
+  },
+  
+  onDropIn: function(aEvent)
+  {
+    var data = DNDUtils.getData("TreeBuilder/column-remove", 0);
+    var string = XPCU.QI(data, "nsISupportsString");
+    this.addItem(string.data);
+  },
+
+  setDraggingBox: function(aBox)
+  {
+    if (this.mDraggingBox) {
+      this.mDraggingBox.removeAttribute("col-dragging");
+    }
+
+    this.mDraggingBox = aBox;
+
+    if (aBox)
+      aBox.setAttribute("col-dragging", "true");
+  },
+  
+  getBoxTarget: function(aNode)
+  {
+    var node = aNode;
+    while (node && !node._isColBox)
+      node = node.parentNode;
+    return node;
+  },
+  
+  getColumnValue: function(aColBox)
+  {
+    if (aColBox._isAttrCol) {
+      var txf = aColBox.getElementsByTagName("textbox")[0];
+      return "@" + txf.value;
+    } else {
+      return aColBox._ColValue;
+    }
+  }
+
+};
+
+function ColumnsDialogDropOut()
+{
+  dialog.onDropOut();
+}
diff --git a/suite/components/inspector/content/viewers/dom/columnsDialog.xul b/suite/components/inspector/content/viewers/dom/columnsDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/columnsDialog.xul
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE window SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/columnsDialog.css" type="text/css"?>
+
+<window id="winEditCols" class="color-dialog" 
+        title="&ColumnsDialog.title;"
+        persist="screenX screenY"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/columnsDialog.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/inTreeBuilder.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/DNDUtils.js"/>
+
+  <vbox id="bxColumns" flex="1"
+    ondrop="dialog.onDropIn(event);"
+    ondragstart="dialog.onDragStart(event);"/>
+</window>
diff --git a/suite/components/inspector/content/viewers/dom/commandOverlay.xul b/suite/components/inspector/content/viewers/dom/commandOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/commandOverlay.xul
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd1;
+]>
+
+<overlay id="ovDOMViewerCommands"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <commandset id="cmdsGlobalCommands">
+    <command id="cmd:selectByClick" viewer="dom"
+             oncommand="inspector.getViewer('dom').selectByClick()"/>
+
+    <command id="cmd:find" viewer="dom"
+             oncommand="inspector.getViewer('dom').showFindDialog()"/>
+
+    <command id="cmd:findAgain" viewer="dom"
+             oncommand="inspector.getViewer('dom').findNext()"/>
+
+    <command id="cmd:toggleAnon" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleAnonContent()"/>
+
+    <command id="cmd:toggleSubDocs" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleSubDocs()"/>
+
+    <command id="cmd:toggleAccessibleNodes" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleAccessibleNodes();"/>
+
+    <command id="cmd:toggleWhitespaceNodes" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleWhitespaceNodes()"/>
+
+    <command id="cmd:toggleProcessingInstructions" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleProcessingInstructions()"/>
+
+    <command id="cmd:toggleAttributes" viewer="dom"
+             oncommand="inspector.getViewer('dom').toggleAttributes()"/>
+  </commandset>
+
+</overlay>
+
diff --git a/suite/components/inspector/content/viewers/dom/dom.js b/suite/components/inspector/content/viewers/dom/dom.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/dom.js
@@ -0,0 +1,2272 @@
+/* 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/. */
+
+/*****************************************************************************
+* DOMViewer ------------------------------------------------------------------
+*  Views all nodes within a document.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://global/content/XPCNativeWrapper.js
+*   chrome://inspector/content/hooks.js
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/events/ObserverManager.js
+*   chrome://inspector/content/jsutil/system/PrefUtils.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/xul/FrameExchange.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kDOMViewClassID             = "@mozilla.org/inspector/dom-view;1";
+const kPromptServiceClassID       = "@mozilla.org/embedcomp/prompt-service;1";
+const kAccessibleRetrievalClassID = "@mozilla.org/accessibleRetrieval;1";
+const kDOMUtilsClassID            = "@mozilla.org/inspector/dom-utils;1";
+const kDeepTreeWalkerClassID      = "@mozilla.org/inspector/deep-tree-walker;1";
+const nsIDOMNode                  = Components.interfaces.nsIDOMNode;
+const nsIDOMElement               = Components.interfaces.nsIDOMElement;
+const nsIDOMDocument              = Components.interfaces.nsIDOMDocument;
+const nsIDOMCharacterData         = Components.interfaces.nsIDOMCharacterData;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", DOMViewer_initialize, false);
+window.addEventListener("unload", DOMViewer_destroy, false);
+
+function DOMViewer_initialize()
+{
+  viewer = new DOMViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+function DOMViewer_destroy()
+{
+  PrefUtils.removeObserver("inspector", PrefChangeObserver);
+  viewer.removeClickListeners();
+  viewer = null;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// class DOMViewer
+
+function DOMViewer() // implements inIViewer
+{
+  this.mObsMan = new ObserverManager(this);
+
+  this.mDOMUtils = XPCU.getService(kDOMUtilsClassID, "inIDOMUtils");
+
+  this.mDOMTree = document.getElementById("trDOMTree");
+  this.mDOMTreeBody = document.getElementById("trDOMTreeBody");
+
+  // prepare and attach the DOM DataSource
+  this.mDOMView = XPCU.createInstance(kDOMViewClassID, "inIDOMView");
+  this.mDOMView.showSubDocuments = true;
+  // hide attribute nodes
+  this.mDOMView.whatToShow &= ~(NodeFilter.SHOW_ATTRIBUTE);
+  this.mDOMTree.treeBoxObject.view = this.mDOMView;
+
+  PrefUtils.addObserver("inspector", PrefChangeObserver);
+}
+
+DOMViewer.prototype =
+{
+  mSubject: null,
+  mDOMView: null,
+  // searching stuff
+  mFindResult: null,
+  mColumns: null,
+  mFindDir: null,
+  mFindParams: null,
+  mFindType: null,
+  mFindWalker: null,
+  mSelecting: false,
+
+  mSelectionBatchNest: 0,
+  mPendingSelection: null,
+
+  /**
+   * Prevent the viewer from dispatching selectionChange events while batches
+   * are underway.  The last change in selection while disabled is remembered,
+   * however, and when all batches have ended, an event is dispatched for it.
+   * To prevent this pending selectionChange from being dispatched, set
+   * mPendingSelection to null before calling endSelectionBatch.
+   *
+   * Nested batches are permitted.
+   */
+  beginSelectionBatch: function DVr_BeginSelectionBatch()
+  {
+    ++this.mSelectionBatchNest;
+  },
+
+  endSelectionBatch: function DVr_EndSelectionBatch()
+  {
+    --this.mSelectionBatchNest;
+    if (this.mSelectionBatchNest < 0) {
+      Components.utils.reportError("Attempted to end a selection batch " +
+                                   "that doesn't exist");
+    }
+    else if (!this.mSelectionBatchNest && this.mPendingSelection) {
+      this.changeSelection(this.mPendingSelection);
+      this.mPendingSelection = null;
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  //// attributes
+
+  get uid() {
+    return "dom"
+  },
+
+  get pane() {
+    return this.mPanel
+  },
+
+  get editable() {
+    return true;
+  },
+
+  get selection() {
+    return this.mSelection
+  },
+
+  get subject() {
+    return this.mSubject
+  },
+
+  set subject(aObject) {
+    this.mSubject = aObject;
+    this.mDOMView.rootNode = aObject;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+    this.setInitialSelection(aObject);
+  },
+
+  //// methods
+
+  /**
+   * Properly sets up the DOM Viewer
+   *
+   * @param aPane
+   *        The panel this references.
+   */
+  initialize: function DVr_initialize(aPane)
+  {
+    this.mPanel = aPane;
+
+    this.setAnonContent(PrefUtils.getPref("inspector.dom.showAnon"));
+    this.setProcessingInstructions(
+      PrefUtils.getPref("inspector.dom.showProcessingInstructions")
+    );
+    this.setAccessibleNodes(
+      PrefUtils.getPref("inspector.dom.showAccessibleNodes")
+    );
+    this.setWhitespaceNodes(
+      PrefUtils.getPref("inspector.dom.showWhitespaceNodes")
+    );
+
+    this.pane.panelset.addTransactionListener(this);
+
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function DVr_Destroy()
+  {
+    this.mDOMTree.treeBoxObject.view = null;
+    this.pane.panelset.removeTransactionListener(this);
+  },
+
+  isCommandEnabled: function DVr_IsCommandEnabled(aCommand)
+  {
+    // NB: Don't confuse selected nodes and currentNode.  currentNode derives
+    // from currentIndex.  Think of currentIndex like the position of the
+    // cursor in a textbox.  Commands like Copy need text to be selected,
+    // while Paste and Insert need no selection, only that the cursor be in
+    // the area we're interested in.
+    // XXX Bring all commands around to handling multiple selection.
+    var clipboardNode = null;
+    var currentNode = null;
+    var parentNode = null;
+    var selectedNode = this.selectedNode;
+    if (/^cmdEditPaste/.test(aCommand)) {
+      if (this.mPanel.panelset.clipboardFlavor != "inspector/dom-node") {
+        return false;
+      }
+      clipboardNode = this.mPanel.panelset.getClipboardData();
+    }
+    if (/^cmdEdit(Paste|Insert)/.test(aCommand)) {
+      currentNode =
+        viewer.currentNode && new XPCNativeWrapper(viewer.currentNode);
+      parentNode = currentNode && currentNode.parentNode;
+    }
+    switch (aCommand) {
+      case "cmdEditPaste":
+      case "cmdEditPasteBefore":
+        // Paste before and after, like Insert, don't operate on a selection,
+        // but the other paste commands do.
+        return this.isValidChild(parentNode, clipboardNode);
+      case "cmdEditPasteReplace":
+        return !!selectedNode &&
+               this.isValidChild(parentNode, clipboardNode, selectedNode);
+      case "cmdEditPasteFirstChild":
+      case "cmdEditPasteLastChild":
+        return this.isValidChild(selectedNode, clipboardNode);
+      case "cmdEditPasteAsParent":
+        return !!selectedNode &&
+               this.isValidChild(clipboardNode, selectedNode) &&
+               this.isValidChild(parentNode, clipboardNode, selectedNode);
+      case "cmdEditInsertAfter":
+      case "cmdEditInsertBefore":
+      	return parentNode instanceof nsIDOMElement;
+      case "cmdEditInsertFirstChild":
+      case "cmdEditInsertLastChild":
+      	return selectedNode instanceof nsIDOMElement;
+      case "cmdEditCut":
+      case "cmdEditCopy":
+        return !!selectedNode;
+      case "cmdEditDelete":
+        // If at least one of the selected nodes can be deleted, allow it.
+        let selectedNodes = this.getSelectedNodes();
+        for (let i = 0, n = selectedNodes.length; i < n; ++i) {
+          if (cmdEditDelete.isDeletable(selectedNodes[i])) {
+            return true;
+          }
+        }
+        return false;
+      case "cmdInspectBrowser":
+        if (!(selectedNode instanceof nsIDOMElement)) {
+          return false;
+        }
+        let n = selectedNode.localName.toLowerCase();
+        return n == "tabbrowser" || n == "browser" || n == "iframe" ||
+               n == "frame" || n == "editor";
+      case "cmdBlink":
+        return selectedNode instanceof nsIDOMElement;
+      case "cmdCopyXML":
+      case "cmdShowPseudoClasses":
+        return true;
+      case "cmdEditInspectInNewWindow":
+        return this.mDOMTree.view.selection.count == 1;
+    }
+    return false;
+  },
+
+ /**
+  * Determines whether the passed parent/child combination is valid.
+  * @param parent
+  * @param child
+  * @param replaced
+  *        the node the child is replacing (optional)
+  * @return whether the passed parent can have the passed child as a child,
+  */
+  isValidChild: function DVr_IsValidChild(parent, child, replaced)
+  {
+    // the document (fragment) node must be an only child and can't be
+    // replaced
+    if (parent == null) {
+      return false;
+    }
+    // the only types that can ever have children
+    if (parent.nodeType != nsIDOMNode.ELEMENT_NODE &&
+        parent.nodeType != nsIDOMNode.DOCUMENT_NODE &&
+        parent.nodeType != nsIDOMNode.DOCUMENT_FRAGMENT_NODE) {
+
+      return false;
+    }
+    // the only types that can't ever be children
+    if (child.nodeType == nsIDOMNode.DOCUMENT_NODE ||
+        child.nodeType == nsIDOMNode.DOCUMENT_FRAGMENT_NODE ||
+        child.nodeType == nsIDOMNode.ATTRIBUTE_NODE) {
+
+      return false;
+    }
+    // doctypes can only be the children of documents
+    if (child.nodeType == nsIDOMNode.DOCUMENT_TYPE_NODE &&
+        parent.nodeType != nsIDOMNode.DOCUMENT_NODE) {
+
+      return false;
+    }
+    // only elements and fragments can have text, cdata, and entities as
+    // children
+    if (parent.nodeType != nsIDOMNode.ELEMENT_NODE &&
+        parent.nodeType != nsIDOMNode.DOCUMENT_FRAGMENT_NODE &&
+        (child.nodeType == nsIDOMNode.TEXT_NODE ||
+         child.nodeType == nsIDOMNode.CDATA_NODE ||
+         child.nodeType == nsIDOMNode.ENTITY_NODE)) {
+
+      return false;
+    }
+    // documents can only have one document element or doctype
+    if (parent.nodeType == nsIDOMNode.DOCUMENT_NODE &&
+        (child.nodeType == nsIDOMNode.ELEMENT_NODE ||
+         child.nodeType == nsIDOMNode.DOCUMENT_TYPE_NODE) &&
+        (!replaced || child.nodeType != replaced.nodeType)) {
+
+      for (var i = 0; i < parent.childNodes.length; i++) {
+        if (parent.childNodes[i].nodeType == child.nodeType) {
+          return false;
+        }
+      }
+    }
+    return true;
+  },
+
+  getCommand: function DVr_GetCommand(aCommand)
+  {
+    if (aCommand in window) {
+      try {
+        return new window[aCommand]();
+      }
+      catch (ex) {
+        // User canceled the transaction.
+      }
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// nsITransactionListener implementation
+
+  willDo: function DVr_WillDo(aManager, aTransaction)
+  {
+    var command = aTransaction.wrappedJSObject;
+    if (command instanceof cmdEditDelete) {
+      let nodes = command.nodes;
+      let deletables = [];
+      for (let i = 0, n = nodes.length; i < n; ++i) {
+        let node = nodes[i];
+        if (cmdEditDelete.isDeletable(node)) {
+          deletables.push(node);
+        }
+      }
+
+      // Save the currentNode and the linked pane's current subject, but
+      // don't overwrite them on redo.
+      if (!("oldCurrentNode" in command)) {
+        command.oldCurrentNode = this.currentNode;
+        command.oldLinkedSubject = this.mSelection;
+      }
+
+      if (cmdEditDelete.isDeletable(this.mSelection)) {
+        command.newLinkedSubject =
+          this.getNextInNextBestChain(this.mSelection, undefined,
+                                      function DVr_WillDo_Filter(aNode)
+                                      {
+                                        return deletables.indexOf(aNode) >= 0;
+                                      });
+      }
+    }
+  },
+
+  didDo: function DVr_DidDo(aManager, aTransaction, aResult)
+  {
+    var command = aTransaction.wrappedJSObject;
+    if (command instanceof cmdEditDelete) {
+      if (!("newLinkedSubject" in command)) {
+        // The linked panel's old subject wasn't deletable, but the
+        // transaction went through because other selected nodes were.  Leave
+        // things alone and let the linked subject and any other non-deletable
+        // nodes remain selected.
+        return;
+      }
+      let newLinkedSubject = command.newLinkedSubject;
+      let selection = this.mDOMTree.view.selection;
+      if (selection.count > 0) {
+        // There are still some nodes selected (because they weren't
+        // deletable).  newLinkedSubject should be one of them.
+        let idx = this.getRowIndexFromNode(newLinkedSubject);
+        if (!selection.isSelected(idx)) {
+          debug("node chosen for new linked subject was apparently deletable");
+          return;
+        }
+        this.changeSelection(newLinkedSubject);
+      }
+      else {
+        this.showNodeInTree(newLinkedSubject);
+      }
+    }
+  },
+
+  willUndo: stubImpl,
+
+  didUndo: function DVr_DidUndo(aManager, aTransaction, aResult)
+  {
+    var command = aTransaction.wrappedJSObject;
+    if (command instanceof cmdEditDelete) {
+      // Find all "deleted" rows and select them, even any that weren't
+      // deletable.  We also want currentNode and mSelection to reflect the
+      // values they had before this transaction.
+      let nodes = command.nodes;
+      if (!nodes.length) {
+        return;
+      }
+
+      // Disable selectionChange events, because otherwise the linked pane's
+      // viewers will be flipping around, which is also computational overhead
+      // that we just don't need.
+      this.mDOMTree.treeBoxObject.beginUpdateBatch();
+      this.beginSelectionBatch();
+
+      this.mDOMTree.view.selection.clearSelection();
+      for (let i = nodes.length - 1; i >= 0; --i) {
+        this.showNodeInTree(nodes[i], true);
+      }
+      this.changeSelection(command.oldLinkedSubject);
+      this.mDOMTree.currentIndex =
+        this.getRowIndexFromNode(command.oldCurrentNode);
+
+      this.endSelectionBatch();
+      this.mDOMTree.treeBoxObject.endUpdateBatch();
+    }
+  },
+
+  willRedo: function DVr_WillRedo(aManager, aTransaction)
+  {
+    var command = aTransaction.wrappedJSObject;
+    if (command instanceof cmdEditDelete) {
+      this.willDo(aManager, aTransaction);
+    }
+  },
+
+  didRedo: function DVr_DidRedo(aManager, aTransaction, aResult)
+  {
+    var command = aTransaction.wrappedJSObject;
+    if (command instanceof cmdEditDelete) {
+      this.didDo(aManager, aTransaction, aResult);
+    }
+  },
+
+  willBeginBatch: stubImpl,
+
+  didBeginBatch: stubImpl,
+
+  willEndBatch: stubImpl,
+
+  didEndBatch: stubImpl,
+
+  willMerge: stubImpl,
+
+  didMerge: stubImpl,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function DVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function DVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// UI Commands
+
+  showFindDialog: function DVr_ShowFindDialog()
+  {
+    var win =
+      openDialog("chrome://inspector/content/viewers/dom/findDialog.xul",
+                 "_blank", "chrome,dependent", this.mFindType, this.mFindDir,
+                 this.mFindParams);
+  },
+
+  /**
+   * Toggles the setting for displaying anonymous content.
+   */
+  toggleAnonContent: function DVr_ToggleAnonContent()
+  {
+    var value = PrefUtils.getPref("inspector.dom.showAnon");
+    PrefUtils.setPref("inspector.dom.showAnon", !value);
+  },
+
+  /**
+   * Sets the UI and filters for anonymous content.
+   *
+   * @param aValue
+   *        The value that we should be setting things to.
+   */
+  setAnonContent: function DVr_SetAnonContent(aValue)
+  {
+    this.mDOMView.showAnonymousContent = aValue;
+    this.mPanel.panelset.setCommandAttribute("cmd:toggleAnon", "checked",
+                                             aValue);
+  },
+
+  toggleSubDocs: function DVr_ToggleSubDocs()
+  {
+    var val = !this.mDOMView.showSubDocuments;
+    this.mDOMView.showSubDocuments = val;
+    this.mPanel.panelset.setCommandAttribute("cmd:toggleSubDocs", "checked",
+                                             val);
+  },
+
+  /**
+   * Toggles the visibility of Processing Instructions.
+   */
+  toggleProcessingInstructions: function DVr_ToggleProcessingInstructions()
+  {
+    var value = PrefUtils.getPref("inspector.dom.showProcessingInstructions");
+    PrefUtils.setPref("inspector.dom.showProcessingInstructions", !value);
+  },
+
+  /**
+   * Sets the visibility of Processing Instructions.
+   *
+   * @param aValue
+   *        The visibility of the instructions.
+   */
+  setProcessingInstructions: function DVr_SetProcessingInstructions(aValue)
+  {
+    this.mPanel.panelset
+      .setCommandAttribute("cmd:toggleProcessingInstructions", "checked",
+                           aValue);
+    if (aValue) {
+      this.mDOMView.whatToShow |= NodeFilter.SHOW_PROCESSING_INSTRUCTION;
+    }
+    else {
+      this.mDOMView.whatToShow &= ~NodeFilter.SHOW_PROCESSING_INSTRUCTION;
+    }
+  },
+
+  /**
+   * Toggle state of 'Show Accessible Nodes' option.
+   */
+  toggleAccessibleNodes: function DVr_ToggleAccessibleNodes()
+  {
+    var value = PrefUtils.getPref("inspector.dom.showAccessibleNodes");
+    PrefUtils.setPref("inspector.dom.showAccessibleNodes", !value);
+  },
+
+  /**
+   * Set state of 'Show Accessible Nodes' option.
+   *
+   * @param aValue
+   *        if true then accessible nodes will be shown
+   */
+  setAccessibleNodes: function DVr_SetAccessibleNodes(aValue)
+  {
+    if (!(kAccessibleRetrievalClassID in Components.classes)) {
+      aValue = false;
+    }
+
+    this.mDOMView.showAccessibleNodes = aValue;
+    this.mPanel.panelset.setCommandAttribute("cmd:toggleAccessibleNodes",
+                                             "checked", aValue);
+  },
+
+  /**
+   * Return state of 'Show Accessible Nodes' option.
+   */
+  getAccessibleNodes: function DVr_GetAccessibleNodes()
+  {
+    return this.mDOMView.showAccessibleNodes;
+  },
+
+  /**
+   * Toggles the value for whitespace nodes.
+   */
+  toggleWhitespaceNodes: function DVr_ToggleWhitespaceNodes()
+  {
+    var value = PrefUtils.getPref("inspector.dom.showWhitespaceNodes");
+    PrefUtils.setPref("inspector.dom.showWhitespaceNodes", !value);
+  },
+
+  /**
+   * Sets the UI for displaying whitespace nodes.
+   *
+   * @param aValue
+   *        true if whitespace nodes should be shown
+   */
+  setWhitespaceNodes: function DVr_SetWhitespaceNodes(aValue)
+  {
+    this.mPanel.panelset.setCommandAttribute("cmd:toggleWhitespaceNodes",
+                                             "checked", aValue);
+    this.mDOMView.showWhitespaceNodes = aValue;
+  },
+
+  showColumnsDialog: function DVr_ShowColumnsDialog()
+  {
+    var win =
+      openDialog("chrome://inspector/content/viewers/dom/columnsDialog.xul",
+                 "_blank", "chrome,dependent", this);
+  },
+
+  cmdShowPseudoClasses: function DVr_CmdShowPseudoClasses()
+  {
+    var node = this.selectedNode;
+
+    if (node) {
+      openDialog("chrome://inspector/content/viewers/dom/" +
+                   "pseudoClassDialog.xul",
+                 "_blank", "chrome", node);
+    }
+  },
+
+  cmdBlink: function DVr_CmdBlink()
+  {
+    this.flashElement(this.selectedNode);
+  },
+
+  onTreeSelectionChange: function DVr_OnTreeSelectionChange()
+  {
+    // NB: We're called on deselection, too.
+    var currentIndex = this.mDOMTree.currentIndex;
+    var currentNode = this.currentNode;
+
+    if (this.mDOMTree.view.selection.isSelected(currentIndex)) {
+      this.changeSelection(currentNode);
+    }
+    // Otherwise, we were deselected.  We only care, though, if we're the
+    // object viewer's subject, and there are other nodes selected.  (If no
+    // nodes are selected, we'll leave mSelection alone and won't fire any
+    // events, because nobody wants to inspect null.)
+    else if (this.mSelection == currentNode &&
+             this.mDOMTree.view.selection.count) {
+      // Find closest nearby selected node and use that.
+      var nearestSelectedIndex =
+        InsUtil.getNearestIndex(currentIndex, this.getSelectedIndexes());
+      this.changeSelection(this.getNodeFromRowIndex(nearestSelectedIndex));
+    }
+
+    viewer.pane.panelset.updateAllCommands();
+  },
+
+  /**
+   * Change the viewer selection.  Note that "selection" here refers to the
+   * (not formalized) inIViewer::selection, *not* the tree selection.  See
+   * bug 570879.
+   * @param aNode
+   *        The new viewer selection.  If there is an object panel linked to
+   *        ours, this will be used for its subject.
+   */
+  changeSelection: function DVr_ChangeSelection(aNode)
+  {
+    if (this.mSelectionBatchNest) {
+      this.mPendingSelection = aNode;
+    }
+    else {
+      this.mSelection = aNode;
+      this.mObsMan.dispatchEvent("selectionChange", { selection: aNode } );
+      if (this.mSelection) {
+        this.flashElement(this.mSelection, true);
+      }
+    }
+  },
+
+  setInitialSelection: function DVr_SetInitialSelection(aObject)
+  {
+    var fireSelected = this.mDOMTree.currentIndex == 0;
+
+    if (this.mPanel.params) {
+      this.showNodeInTree(this.mPanel.params);
+    }
+    else {
+      this.showNodeInTree(aObject, false, true);
+    }
+
+    if (fireSelected) {
+      this.onTreeSelectionChange();
+    }
+  },
+
+  onPopupShowing: function DVr_OnPopupShowing(aPopup)
+  {
+    if (aPopup.id != "ppDOMContext") {
+      // This is a nested menupopup, and it should have been already taken
+      // care of.
+      return;
+    }
+    this.checkMenu(aPopup);
+  },
+
+  /**
+   * Recursively enable/disable descendants of a given popup, based on whether
+   * their commands are enabled or disabled.  If the descendant has a
+   * checkvalid attribute, the descendant will be hidden as well as disabled.
+   * Recursively checked menus will be enabled or disabled depending on
+   * whether there are one or more enabled children in their respective
+   * menupopups.
+   * @param aPopup
+   *        The menupopup at which to start checking.
+   * @return true if the popup contains any enabled items
+   */
+  checkMenu: function DVr_CheckMenu(aPopup) {
+    // We can't use XBL getters/setters here, because we're using recursion,
+    // and items in nested menus won't have CSS frames since they're not
+    // visible.
+    var hasEnabledItems = false;
+    for (let i = 0; i < aPopup.childNodes.length; ++i) {
+      let el = aPopup.childNodes[i];
+      if (el.localName == "menuseparator") {
+        continue;
+      }
+      let subject = el;
+      let isEnabled = false;
+      let checkValid = false;
+      if (el.hasAttribute("command")) {
+        let cmd = document.getElementById(el.getAttribute("command"));
+        if (cmd) {
+          checkValid = el.hasAttribute("checkvalid");
+          isEnabled = this.isCommandEnabled(cmd.id);
+          subject = cmd;
+        }
+      }
+      else if (el.localName == "menu") {
+        let kid = el.firstChild;
+        while (kid) {
+          if (kid.localName == "menupopup") {
+            // Disable this menu if none of the descendants are enabled.
+            isEnabled = this.checkMenu(kid);
+            break;
+          }
+          kid = kid.nextSibling;
+        }
+      }
+      else if (el.getAttribute("disabled") != "true") {
+        // There is no command here.  (Maybe we're being extended?)  We'll
+        // leave it up to third parties to manage enabling/disabling their own
+        // menuitems, and assume that they already reflect the correct state
+        // by the time we're called.
+        isEnabled = true;
+      }
+
+      if (isEnabled) {
+        hasEnabledItems = true;
+        subject.removeAttribute("disabled");
+      }
+      else {
+        subject.setAttribute("disabled", "true");
+      }
+
+      if (checkValid) {
+        el.hidden = !isEnabled;
+      }
+    }
+
+    return hasEnabledItems;
+  },
+
+  cmdInspectBrowser: function DVr_CmdInspectBrowser()
+  {
+    var node = this.selectedNode;
+    var n = node && node.localName.toLowerCase();
+    if (n == "iframe" || n == "frame" ||
+        (node.namespaceURI == kXULNSURI && (n == "browser" ||
+                                            n == "tabbrowser" ||
+                                            n == "editor"))) {
+      this.pane.subject = node.contentDocument;
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// XML Serialization
+
+  cmdCopySelectedXML: function DVr_CmdCopySelectedXML()
+  {
+    var node = this.selectedNode;
+    if (node) {
+      var xml = this.toXML(node);
+
+      var helper = XPCU.getService(kClipboardHelperClassID,
+                                   "nsIClipboardHelper");
+      helper.copyString(xml);
+    }
+  },
+
+  toXML: function DVr_ToXML(aNode)
+  {
+    return (new XMLSerializer()).serializeToString(aNode);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Click Selection
+
+  selectByClick: function DVr_SelectByClick()
+  {
+    if (this.mSelecting) {
+      this.stopSelectByClick();
+      this.removeClickListeners();
+    }
+    else {
+      // wait until after user releases the mouse after selecting this command
+      // from a UI element
+      window.setTimeout("viewer.startSelectByClick()", 10);
+    }
+  },
+
+  startSelectByClick: function DVr_StartSelectByClick()
+  {
+    this.mSelecting = true;
+    this.mSelectDocs = this.getAllDocuments();
+
+    for (var i = 0; i < this.mSelectDocs.length; ++i) {
+      var doc = this.mSelectDocs[i];
+      doc.addEventListener("mousedown", MouseDownListener, true);
+      doc.addEventListener("mouseup", EventCanceller, true);
+      doc.addEventListener("click", ListenerRemover, true);
+      // If user moves the mouse out of the original target area, there
+      // will be no onclick event fired.... so we have to deal with
+      // that.
+      doc.addEventListener("mouseout", ListenerRemover, true);
+    }
+    this.mPanel.panelset.setCommandAttribute("cmd:selectByClick", "checked",
+                                             "true");
+  },
+
+  doSelectByClick: function DVr_DoSelectByClick(aTarget)
+  {
+    if (aTarget.nodeType == nsIDOMNode.TEXT_NODE) {
+      aTarget = aTarget.parentNode;
+    }
+
+    this.stopSelectByClick();
+    this.showNodeInTree(aTarget);
+  },
+
+  stopSelectByClick: function DVr_StopSelectByClick()
+  {
+    this.mSelecting = false;
+
+    this.mPanel.panelset.setCommandAttribute("cmd:selectByClick", "checked",
+                                             null);
+  },
+
+  removeClickListeners: function DVr_RemoveClickListeners()
+  {
+    if (!this.mSelectDocs) { // we didn't select an element by click
+      return;
+    }
+
+    for (var i = 0; i < this.mSelectDocs.length; ++i) {
+      var doc = this.mSelectDocs[i];
+      doc.removeEventListener("mousedown", MouseDownListener, true);
+      doc.removeEventListener("mouseup", EventCanceller, true);
+      doc.removeEventListener("click", ListenerRemover, true);
+      doc.removeEventListener("mouseout", ListenerRemover, true);
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Find Methods
+
+  startFind: function DVr_StartFind(aType, aDir)
+  {
+    this.mFindResult = null;
+    this.mFindType = aType;
+    this.mFindDir = aDir;
+    this.mFindParams = [];
+    for (var i = 2; i < arguments.length; ++i) {
+      this.mFindParams[i-2] = arguments[i];
+    }
+
+    var fn = null;
+    switch (aType) {
+      case "id":
+        fn = "doFindElementById";
+        break;
+      case "tag":
+        fn = "doFindElementsByTagName";
+        break;
+      case "attr":
+        fn = "doFindElementsByAttr";
+        break;
+    };
+
+    this.mFindFn = fn;
+    this.mFindWalker = this.createDOMWalker(this.mDOMView.rootNode);
+    this.findNext();
+  },
+
+  findNext: function DVr_FindNext()
+  {
+    var walker = this.mFindWalker;
+    if (!walker) {
+      Components.utils.reportError("deep tree walker unavailable");
+      return;
+    }
+    var result = null;
+    var currentNode = walker.currentNode;
+    while (currentNode) {
+      if (this[this.mFindFn](walker)) {
+        result = walker.currentNode;
+        walker.nextNode();
+        break;
+      }
+      currentNode = walker.nextNode();
+    }
+
+    if (result && result != this.mFindResult) {
+      this.showNodeInTree(result);
+      this.mFindResult = result;
+      this.mDOMTree.focus();
+    }
+    else {
+      var bundle = this.mPanel.panelset.stringBundle;
+      var msg = bundle.getString("findNodesDocumentEnd.message");
+      var title = bundle.getString("findNodesDocumentEnd.title");
+
+      var promptService = XPCU.getService(kPromptServiceClassID,
+                                         "nsIPromptService");
+      promptService.alert(window, title, msg);
+    }
+  },
+
+  doFindElementById: function DVr_DoFindElementById(aWalker)
+  {
+    var re = new RegExp(this.mFindParams[0], "i");
+
+    // NB: In HTML getAttribute can return null, so we have to check that it's
+    // actually set; if we don't and the search string is "null", implicit
+    // toString conversion means that we'll match on every element without an
+    // ID.  Additionally, for elements without an ID, getAttribute returns an
+    // empty string in XUL (bug 232598), so our check must handle that...
+    return aWalker.currentNode &&
+           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
+           aWalker.currentNode.hasAttribute("id") &&
+           re.test(aWalker.currentNode.getAttribute("id"));
+  },
+
+  doFindElementsByTagName: function DVr_DoFindElementsByTagName(aWalker)
+  {
+    var re = new RegExp(this.mFindParams[0], "i");
+
+    return aWalker.currentNode &&
+           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
+           re.test(aWalker.currentNode.localName);
+  },
+
+  doFindElementsByAttr: function DVr_DoFindElementsByAttr(aWalker)
+  {
+    var re = new RegExp(this.mFindParams[1], "i");
+
+    return aWalker.currentNode &&
+           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
+           aWalker.currentNode.hasAttribute(this.mFindParams[0]) &&
+           re.test(aWalker.currentNode.getAttribute(this.mFindParams[0]));
+  },
+
+  /**
+   * Makes sure each ancestor in the given node's ancestor chain is open, so
+   * so that there exists a row in the tree that represents the node.  That
+   * row will be selected and scrolled into view.  If that node doesn't have a
+   * row in the tree, the nearest ancestor is used as a fallback.  Further
+   * parameters allow finer control over what it means to "show" a node,
+   * including overriding the default behavior.
+   *
+   * @param aNode
+   *        Node to show.
+   * @param aAugment [optional]
+   *        true if selection should add to the current selection, false if it
+   *        should clear it and be the only row selected.  This has no effect
+   *        if aNoSelect is true.
+   * @param aExpand [optional]
+   *        true if the node's open state should be changed to open.
+   * @param aNoVisible [optional]
+   *        true if you don't care whether the given node is scrolled into
+   *        sight.
+   * @param aNoSelect [optional]
+   *        true if you don't want the given element to be selected.
+   * @return The current index of the given node in the tree.
+   */
+  showNodeInTree:
+    function DVr_ShowNodeInTree(aNode, aAugment, aExpand, aNoVisible,
+                                aNoSelect)
+  {
+    var bx = this.mDOMTree.treeBoxObject;
+
+    if (!aNode) {
+      if (!aAugment && !aNoSelect) {
+        bx.view.selection.select(-1);
+      }
+      return -1;
+    }
+
+    // Keep searching until a pre-created ancestor is found, and then open
+    // each ancestor until the row for the given node is created.
+    var line = [];
+    var parent = aNode;
+    var index = null;
+    while (parent) {
+      index = this.getRowIndexFromNode(parent);
+      line.push(parent);
+      if (index < 0) {
+        // The row for this node hasn't been created yet.
+        parent =
+          this.mDOMUtils.getParentForNode(parent,
+                                          this.mDOMView.showAnonymousContent);
+      }
+      else {
+        // The ancestor chain is already open above this point.
+        break;
+      }
+    }
+
+    // We've got all the ancestors, now open them one-by-one from the top
+    // down.
+    var view = bx.view;
+    var lastIndex;
+    for (let i = line.length - 1; i >= 0; --i) {
+      index = this.getRowIndexFromNode(line[i]);
+      if (index < 0)  {
+        index = -1;
+        break; // We can't find the row, so stop trying to descend.
+      }
+      if ((aExpand || i > 0) && !view.isContainerOpen(index)) {
+        view.toggleOpenState(index);
+      }
+      lastIndex = index;
+    }
+
+    if (lastIndex >= 0) {
+      if (!aNoVisible) {
+        bx.ensureRowIsVisible(lastIndex);
+      }
+      if (!aNoSelect) {
+        view.selection.rangedSelect(lastIndex, lastIndex, aAugment);
+      }
+    }
+
+    return index;
+  },
+
+  /**
+   * Rebuild the tree by re-opening previously opened rows, re-selecting
+   * previously selected rows, and restoring the viewer selection and the
+   * node previously at currentNode, if possible.
+   * @param aIncludeAnons [optional]
+   *        If a rebuild was triggered in response to a pref change for
+   *        showing anonymous content, this must be former pref value.
+   */
+  rebuild: function DVr_Rebuild(aIncludeAnons)
+  {
+    var selection = this.mDOMTree.view.selection;
+
+    // Remember all non-ignorable nodes of open rows.  Re-opening them will be
+    // the first step to recreating the tree's state.
+    var opened = [];
+    for (let i = 0, n = this.mDOMTree.view.rowCount; i < n; ++i) {
+      if (this.mDOMTree.view.isContainerOpen(i)) {
+        let node = this.getNodeFromRowIndex(i);
+        if (!this.isIgnorableNode(node)) {
+          opened.push(node);
+        }
+      }
+    }
+
+    // Remember all nodes of selected rows.  Also save the indexes of rows of
+    // non-ignorable nodes so we can determine the best viewer selection
+    // candidate below.
+    var ignorableSelectedNodes = [];
+    var nonIgnorableSelectedNodes = [];
+    var nonIgnorableSelectedIndexes = [];
+    let selectedIndexes = this.getSelectedIndexes();
+    for (let i = 0, n = selectedIndexes.length; i < n; ++i) {
+      let idx = selectedIndexes[i];
+      let node = this.getNodeFromRowIndex(idx);
+      if (this.isIgnorableNode(node)) {
+        ignorableSelectedNodes.push(node);
+      }
+      else {
+        nonIgnorableSelectedNodes.push(node);
+        nonIgnorableSelectedIndexes.push(idx);
+      }
+    }
+
+    // Remember the node showing in the object pane.  If the current node
+    // there is going to be filtered out, pick another one by using the same
+    // algorithm used when a row is deselected.
+    var viewerSelection = this.selection;
+    if (this.isIgnorableNode(viewerSelection)) {
+      let idx = this.getRowIndexFromNode(viewerSelection);
+      let nearestNonIgnorableSelectedIndex =
+        InsUtil.getNearestIndex(idx, nonIgnorableSelectedIndexes);
+      viewerSelection =
+        this.getNodeFromRowIndex(nearestNonIgnorableSelectedIndex);
+    }
+    if (!viewerSelection) {
+      // There was no nearest non-ignorable selected node (ostensibly, because
+      // there are no non-ignorable selected nodes), so find a fallback from
+      // the next-best chain.
+      if (nonIgnorableSelectedNodes.length) {
+        debug("some nodes are non-ignorable, but no suitable viewer " +
+              "selection was found");
+      }
+      viewerSelection =
+        this.getNextInNextBestChain(this.selection, aIncludeAnons);
+    }
+
+    // Remember currentNode.
+    var currentNode = this.currentNode;
+    if (this.isIgnorableNode(currentNode)) {
+      currentNode = this.getNextInNextBestChain(currentNode, aIncludeAnons);
+    }
+
+    selection.clearSelection();
+    this.mDOMView.rebuild();
+
+    // We're now operating under the new inIDOMView parameters.  Restore the
+    // previously opened rows.  This won't, however, ensure that all non-
+    // ignorable nodes which were previously exposed will be re-exposed.
+    // Consider the case of going from not showing anons to showing them, and
+    // where the ancestor of a previously exposed, non-ignorable node (or the
+    // node itself) is inserted as a "child" of an anonymous node.  See the
+    // comments below about re-selecting nodes for how we deal with this.
+    this.mDOMTree.treeBoxObject.beginUpdateBatch();
+    for (let i = 0, n = opened.length; i < n; ++i) {
+      let idx = 
+        this.showNodeInTree(opened[i], false, // Don't augment the selection.
+                                       true,  // Expand to show children.
+                                       true,  // The node need not be visible.
+                                       true); // Don't select it.
+      if (idx < 0) {
+        debug("previously opened node expected to be in tree but isn't");
+      }
+    }
+
+    // Re-select all rows for non-ignorable nodes which had been previously
+    // selected.
+    this.beginSelectionBatch();
+    for (let i = 0, n = nonIgnorableSelectedNodes.length; i < n; ++i) {
+      let idx = this.showNodeInTree(nonIgnorableSelectedNodes[i], true);
+      if (idx < 0) {
+        debug("previously selected node expected to have row in tree but " +
+              "doesn't");
+      }
+    }
+
+    // For rows of previously selected nodes which are ignorable, we call
+    // showNodeInTree on them without selecting them, in order to make sure as
+    // much of their ancestor chain is exposed as possible.  This two-phase
+    // system is necessary because it's not guaranteed that all non-ignorable
+    // rows which were exposed before are now exposed again.  See the above
+    // comments about re-opening nodes for why this is true.
+    for (let i = 0, n = ignorableSelectedNodes.length; i < n; ++i) {
+      let idx = this.showNodeInTree(ignorableSelectedNodes[i], false, false,
+                                    true, true);
+      if (idx >= 0) {
+        debug("previously selected node expected to be ignorable but still " +
+              "has a row in the tree");
+        // Well, I guess we'll go ahead and select it then...
+        selection.toggleSelect(idx);
+      }
+    }
+
+    // Restore the viewer selection.
+    if (!selection.count) {
+      // All previously selected nodes have been filtered out.  Select the
+      // fallback we found from the next-best chain.
+      this.showNodeInTree(viewerSelection);
+    }
+    else if (this.mPendingSelection != viewerSelection) {
+      // The previous viewer selection should now be one of the selected
+      // nodes, but it's not the one that was selected last.
+      if (this.getRowIndexFromNode(viewerSelection) >= 0) {
+        this.changeSelection(viewerSelection);
+      }
+      else {
+        debug("new viewer selection expected to have row in tree but " +
+              "doesn't");
+      }
+    }
+
+    // Attempt to restore currentIndex to the previous currentNode.
+    var currentIndex = this.showNodeInTree(currentNode, false, false, true,
+                                           true);
+    if (currentIndex >= 0) {
+      this.mDOMTree.currentIndex = currentIndex;
+    }
+    else if (currentNode) {
+      debug("currentNode expected to have row in tree but doesn't");
+    }
+
+    this.mDOMTree.treeBoxObject.endUpdateBatch();
+    this.endSelectionBatch();
+  },
+
+  /**
+   * Determine whether the given node will be displayed in the tree, based on
+   * the tree's current show parameters and node filters.
+   * @param aNode
+   *        A node contained within the subtree of the tree's root (including
+   *        any subdocuments and their children).
+   * @return A boolean indicating whether the node is ignorable
+   */
+  isIgnorableNode: function DVr_IsIgnorableNode(aNode)
+  {
+    if (!(aNode instanceof nsIDOMNode)) {
+      return true;
+    }
+
+    // The node filter doesn't actually get checked for documents in
+    // inDOMView.
+    if (!(aNode instanceof nsIDOMDocument)) {
+      let nodeTypeFilter = 1 << (aNode.nodeType - 1);
+      if (!(this.mDOMView.whatToShow & nodeTypeFilter)) {
+        return true;
+      }
+    }
+
+    if (aNode instanceof nsIDOMCharacterData &&
+        this.mDOMUtils.isIgnorableWhitespace(aNode) &&
+        !this.mDOMView.showWhitespaceNodes) {
+      return true;
+    }
+
+    if (aNode != this.mDOMView.rootNode) {
+      if (!this.mDOMView.showSubDocuments &&
+          aNode.ownerDocument != this.mDOMView.rootNode) {
+        return true;
+      }
+  
+      if (!this.mDOMView.showAnonymousContent) {
+        // Anonymous nodes are obviously ignorable,  but so are non-anonymous
+        // nodes in the contentDocument of an anonymous element (as is the
+        // contentDocument itself).
+        let current = aNode;
+        if (current instanceof nsIDOMDocument) {
+          current = this.mDOMUtils.getParentForNode(current, true);
+        }
+        while (current && current.ownerDocument) {
+          if (current.ownerDocument.getBindingParent(current)) {
+            return true;
+          }
+          if (current.ownerDocument == this.mDOMView.rootNode) {
+            break;
+          }
+          current = this.mDOMUtils.getParentForNode(current.ownerDocument, 
+                                                    true);
+        }
+      }
+    }
+
+    return false;
+  },
+
+  /**
+   * The next-best chain extending from a given node is defined as the next
+   * non-ignorable siblings in document order, followed the preceding non-
+   * ignorable siblings in reverse document order, followed by the parent node
+   * (if it's non-ignorable) and its non-ignorable siblings ordered similarly,
+   * continuing all the way up the ancestor chain.
+   * @param aNode
+   *        The node for which we'll traverse its next-best chain.
+   * @param aIncludeAnons [optional]
+   *        Whether to consider the effects of anonymous content on the chain
+   *        structure.  Note that this is not necessarily the same as the DOM
+   *        view's showAnonymousContent attribute, and even if true, won't
+   *        affect whether anonymous nodes can be returned.  However, the
+   *        default is whatever the showAnonymousContent attribute's value is.
+   * @param aFilterFn [optional]
+   *        If specified, when a node is considered, aFilterFn will be called
+   *        with that node as its only parameter.  A truthy return value will
+   *        disqualify the node's eligibility to be returned as the next in
+   *        the next-best chain.  NB: A falsy return value won't guarantee
+   *        that the node will positively appear in the chain; all nodes still
+   *        need to pass the isIgnorableNode check.
+   * @return The next node in the next-best chain.
+   */
+  getNextInNextBestChain:
+    function DVr_GetNextInNextBestChain(aNode, aIncludeAnons, aFilterFn)
+  {
+    if (!aNode) {
+      return null;
+    }
+
+    var withoutFilter = function DVr_GetNextInNextBestChain_IsIgnorable(aNode)
+    {
+      return viewer.isIgnorableNode(aNode);
+    };
+    var withFilter =
+      function DVr_GetNextInNextBestChain_FilteredIsIgnorable(aNode)
+    {
+      return viewer.isIgnorableNode(aNode) || aFilterFn(aNode);
+    };
+
+    var isIgnorable = aFilterFn ? withFilter : withoutFilter;
+    
+
+    // The approach is broken down as follows:
+    // 1. Locating the topmost ignorable node in the ancestor chain (including
+    //    the given node).
+    // 2. Locating the next non-ignorable sibling of that ancestor, beginning
+    //    by searching forward in the sibling group starting at that node then
+    //    backwards if we exhaust the list of all siblings that follow.
+    var showAnons = this.mDOMView.showAnonymousContent;
+    var ancestorChain = [];
+    var ancestor = aNode;
+    while (ancestor != this.mDOMView.rootNode) {
+      ancestor = this.mDOMUtils.getParentForNode(ancestor, showAnons);
+      if (!ancestor) {
+        break;
+      }
+      ancestorChain.push(ancestor);
+    }
+    var topmost = aNode;
+    for (let i = ancestorChain.length - 1; i >= 0; --i) {
+      // XXX This is O(h*d), where h is the node depth from the root, and d is
+      // the document nesting level of aNode's ownerDocument.  If the document
+      // consists entirely of nested iframes/browsers/what-have-you, that
+      // means it will technically be O(h^2).  There's room for optimization
+      // here, but d is expected to be much smaller than h in practice, i.e.,
+      // anywhere between 1 and something like 3, and I can't think of a good
+      // way to get around this right now without creating API awkwardness.
+      if (isIgnorable(ancestorChain[i])) {
+        topmost = ancestorChain[i];
+        break;
+      }
+    }
+    // Short circuit for rootNode; it won't have any siblings.
+    if (topmost == this.mDOMView.rootNode) {
+      // Just in case for some crazy reason the root node is ignorable...
+      return isIgnorable(topmost) ? null : topmost;
+    }
+
+    // Follow through on step 2.
+
+    // The nature of anonymous content means that the nodes around aNode can
+    // get completely rearranged, depending on whether we're showing anonymous
+    // content or not.  If we're getting called from a rebuild due to a pref
+    // change for showing anonymous content, showAnons is going to reflect the
+    // new value.  If that's why we are getting called, we want to select from
+    // the next-best chain based on the order nodes were visually presented
+    // when the user toggled the pref, which is is why we need the
+    // aIncludeAnons override, since showAnons is untrustworthy here.
+    var includeAnons =
+      aIncludeAnons === undefined ? showAnons : aIncludeAnons;
+    // NB: By allowing includeAnons to deviate from showAnons above, we can't
+    // guarantee that ancestor will be non-ignorable (it might be anonymous,
+    // and we're not showing anons), so we'll need to check for it later.
+    ancestor = this.mDOMUtils.getParentForNode(topmost, includeAnons);
+    // As a side-effect of special-casing the rootNode-as-topmost check
+    // earlier, we're guaranteed ancestor is non-null here.
+    var walker = this.createDOMWalker(ancestor, includeAnons);
+    var current = walker.firstChild();
+
+    // We have to relocate the walker over topmost by iterating over nodes
+    // until we get there.  We'll save the ones we pass up along the way so we
+    // can immediately begin looking at those preceding nodes in reverse order
+    // if we find that we've exhausted all of the nodes that follow.
+    var preceding = [];
+    while (current != topmost) {
+      preceding.push(current);
+      current = walker.nextSibling();
+      if (!current) {
+        debug("unexpected end of nodes");
+        return null;
+      }
+    }
+
+    // Look for the next non-ignorable in the nodes that follow topmost.
+    do {
+      current = walker.nextSibling();
+      if (!isIgnorable(current)) {
+        return current;
+      }
+    } while (current);
+
+    // Look for the next non-ignorable in the nodes that precede topmost.
+    for (let i = preceding.length - 1; i >= 0; --i) {
+      current = preceding[i];
+      if (!isIgnorable(current)) {
+        return current;
+      }
+    }
+
+    // All of the adjacent nodes are ignorable, too.  Use topmost's parent,
+    // which we know to be non-ignorable (by virtue of it being an ancestor of
+    // topmost).  Recall from before that we can't be sure that the ancestor
+    // we've got in |ancestor| is non-ignorable, though...
+    if (includeAnons != showAnons) {
+      ancestor = this.mDOMUtils.getParentForNode(topmost, showAnons);
+    }
+
+    return ancestor;
+  },
+
+  /**
+   * Convenience method for instantiating a deep tree walker, using much of
+   * the same preferences as the DOM view.
+   * @param aRoot
+   *        The root node to begin traversal.  See the W3 Traversal spec for
+   *        more information.
+   * @param aShowAnons [optional]
+   *        Whether to include anonymous content in the walk.  This is the
+   *        same as setting showAnonymousContent on an instantiated deep tree
+   *        walker.  The default is the value of the showAnonymousContent
+   *        attribute on the DOM view.
+   */
+  createDOMWalker:
+    function DVr_CreateDOMWalker(aRoot, aShowAnons)
+  {
+    var walker = XPCU.createInstance(kDeepTreeWalkerClassID,
+                                     "inIDeepTreeWalker");
+    walker.showAnonymousContent = aShowAnons === undefined ?
+                                    this.mDOMView.showAnonymousContent :
+                                    aShowAnons;
+    walker.showSubDocuments = this.mDOMView.showSubDocuments;
+    walker.init(aRoot, this.mDOMView.whatToShow);
+    return walker;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Columns
+
+  // XXX re-implement custom columns code someday
+
+  initColumns: function DVr_InitColumns()
+  {
+    var colPref = PrefUtils.getPref("inspector.dom.columns");
+    var cols = colPref.split(",")
+    this.mColumns = cols;
+    this.mColumnHash = {};
+  },
+
+  saveColumns: function DVr_SaveColumns()
+  {
+    var cols = this.mColumns.join(",");
+    PrefUtils.setPref("inspector.dom.columns", cols);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Flashing
+
+  flashElement: function DVr_FlashElement(aElement, aIsOnSelect)
+  {
+    // make sure we only try to flash element nodes, and don't
+    // flash the documentElement (it's too darn big!)
+    if (aElement.nodeType == nsIDOMNode.ELEMENT_NODE &&
+        aElement != aElement.ownerDocument.documentElement) {
+
+      var flasher = this.mPanel.panelset.flasher;
+      if (aIsOnSelect) {
+        flasher.flashElementOnSelect(aElement);
+      }
+      else {
+        flasher.flashElement(aElement);
+      }
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Prefs
+
+  /**
+   * Called by PrefChangeObserver.
+   *
+   * @param aName
+   *        The name of the preference that has been changed.
+   */
+  onPrefChanged: function DVr_OnPrefChanged(aName)
+  {
+    var value = PrefUtils.getPref(aName);
+    var includeAnons = undefined;
+
+    switch (aName) {
+      case "inspector.dom.showAnon":
+        includeAnons = this.mDOMView.showAnonymousContent;
+        this.setAnonContent(value);
+        break;
+
+      case "inspector.dom.showProcessingInstructions":
+        this.setProcessingInstructions(value);
+        break;
+
+      case "inspector.dom.showAccessibleNodes":
+        this.setAccessibleNodes(value);
+        break;
+
+      case "inspector.dom.showWhitespaceNodes":
+        this.setWhitespaceNodes(value);
+        break;
+
+      default:
+        return;
+    }
+
+    this.rebuild(includeAnons);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Uncategorized
+
+  getAllDocuments: function DVr_GetAllDocuments()
+  {
+    var doc = this.mDOMView.rootNode;
+    var results = [doc];
+    this.findDocuments(doc, results);
+    return results;
+  },
+
+  findDocuments: function DVr_FindDocuments(aDoc, aArray)
+  {
+    this.addKidsToArray(aDoc.getElementsByTagName("frame"), aArray);
+    this.addKidsToArray(aDoc.getElementsByTagName("iframe"), aArray);
+    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "browser"),
+                        aArray);
+    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "tabbrowser"),
+                        aArray);
+    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "editor"),
+                        aArray);
+  },
+
+  addKidsToArray: function DVr_AddKidsToArray(aKids, aArray)
+  {
+    for (var i = 0; i < aKids.length; ++i) {
+      try {
+        if (!aKids[i].contentDocument)
+          continue;
+        aArray.push(aKids[i].contentDocument);
+        // Now recurse down into the kid and look for documents there
+        this.findDocuments(aKids[i].contentDocument, aArray);
+      }
+      catch (ex) {
+        // if we can't access the content document, skip it
+      }
+    }
+  },
+
+  /**
+   * Get the node corresponding to the tree's currentIndex (the row with the
+   * focus rect).  NB: This is *not* a method to get the tree's selection.
+   * Use selectedNode or getSelectedNodes for that.
+   * @return the node corresponding to the tree's currentIndex, which may or
+   *         may not be a part of the tree's selection
+   */
+  get currentNode()
+  {
+    var index = this.mDOMTree.currentIndex;
+    return this.getNodeFromRowIndex(index);
+  },
+
+  /**
+   * Get the node represented by the tree's selection.
+   * @return The currently selected node, or null if zero or two or more nodes
+   *         are selected.
+   */
+  get selectedNode()
+  {
+    if (this.mDOMTree.view.selection.count == 1) {
+      var minAndMax = {};
+      this.mDOMTree.view.selection.getRangeAt(0, minAndMax, minAndMax);
+      return this.getNodeFromRowIndex(minAndMax.value);
+    }
+    return null;
+  },
+
+  /**
+   * Get the nodes corresponding to the tree's selected rows.
+   * @return An array of nodes.
+   */
+  getSelectedNodes: function DVr_GetSelectedNodes()
+  {
+    var nodes = [];
+    var indexes = this.getSelectedIndexes();
+    for (let i = 0, n = indexes.length; i < n; ++i) {
+      nodes.push(this.getNodeFromRowIndex(indexes[i]));
+    }
+    return nodes;
+  },
+
+  /**
+   * Determine the tree's selected rows.
+   * @return An array of row indexes.
+   */
+  getSelectedIndexes: function DVr_GetSelectedIndexes()
+  {
+    var indexes = [];
+    var selection = this.mDOMTree.view.selection;
+    for (let i = 0, n = selection.getRangeCount(); i < n; ++i) {
+      var min = {};
+      var max = {};
+      selection.getRangeAt(i, min, max);
+      for (let j = min.value; j <= max.value; ++j) {
+        indexes.push(j);
+      }
+    }
+    return indexes;
+  },
+
+  getNodeFromRowIndex: function DVr_GetNodeFromRowIndex(aIndex)
+  {
+    try {
+      return this.mDOMView.getNodeFromRowIndex(aIndex);
+    }
+    catch (ex) {
+      return null;
+    }
+  },
+
+  getRowIndexFromNode: function DVr_GetRowIndexFromNode(aNode)
+  {
+    try {
+      return this.mDOMView.getRowIndexFromNode(aNode);
+    }
+    catch (ex) {
+      return -1;
+    }
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Command Objects
+
+/**
+ * Deletes one or more nodes from the tree.
+ */
+function cmdEditDelete()
+{
+  // Approach:
+  // 1. Order the nodes with the primary criterion being the node depth, with
+  //    the nodes of greatest depth appearing near the beginning of the list.
+  //    The secondary (tiebreaker) criterion is applied only to nodes which
+  //    are siblings, and is the node order, corresponding to the nodes'
+  //    indexing in their parents' childNodes NodeLists.
+  // 2. Iterate over the list, storing the current node's parent and its next
+  //    sibling (or null if it's the last of its parent's children).
+  //
+  // Observe that after the nodes are deleted, this allows us to cleanly undo
+  // this transaction by working backwards and reinserting nodes.
+  var nodes = viewer.getSelectedNodes().sort(cmdEditDelete.sortComparator);
+
+  this.nodes = [];
+  this.mParents = [];
+  this.mSiblings = [];
+
+  var didPrompt = false;
+  for (let i = 0, n = nodes.length; i < n; ++i) {
+    let node = nodes[i];
+
+    // If we delete a descendant of an anonymous node and that anonymous
+    // node's binding parent, the nodes array and the mParents array (and
+    // potentially the mSiblings array) would continue to needlessly reference
+    // nodes from that anonymous subtree.  Even if the binding parent gets
+    // restored via undo, a new anonymous content tree will be created for it,
+    // so we can eliminate the references to the nodes in the old subtree.
+    let bindingParent = node.ownerDocument.getBindingParent(node);
+    if (bindingParent && cmdEditDelete.isDeletable(bindingParent) &&
+        nodes.indexOf(bindingParent, i) >= 0) { // XXX O(1/2 * n^2)
+      // Notify about the issue described above, and ask if it's okay to
+      // continue.
+      if (!didPrompt) {
+        let bundle = viewer.pane.panelset.stringBundle;
+        let msg = bundle.getString("irrecoverableSubtree.message");
+        let title = bundle.getString("irrecoverableSubtree.title");
+
+        let promptService = XPCU.getService(kPromptServiceClassID,
+                                            "nsIPromptService");
+        let confirmation = promptService.confirm(window, title, msg);
+
+        if (!confirmation) {
+          throw new Error("User canceled transaction");
+        }
+
+        didPrompt = true;
+      }
+    }
+    else {
+      this.nodes.push(node);
+      this.mParents.push(node.parentNode);
+      this.mSiblings.push(node.nextSibling);
+    }
+  }
+
+  this.wrappedJSObject = this;
+}
+
+cmdEditDelete.sortComparator = function Delete_SortComparator(a, b)
+{
+  // Sibling nodes get arranged by natural order.
+  if (a.parentNode && a.parentNode == b.parentNode) {
+    let kids = a.parentNode.childNodes;
+    for (let i = 0, n = kids.length; i < n; ++i) {
+      if (kids[i] == a) {
+        return -1;
+      }
+      if (kids[i] == b) {
+        break;
+      }
+    }
+    return 1;
+  }
+
+  // Otherwise, nodes at greatest depth appear first.
+  var rootNode = viewer.mDOMView.rootNode;
+  var showAnons = viewer.mDOMView.showAnonymousContent;
+  var aAncestor = viewer.mDOMUtils.getParentForNode(a, showAnons);
+  var bAncestor = viewer.mDOMUtils.getParentForNode(b, showAnons);
+
+  // Check for equivalence to the root node, too, because getParentForNode
+  // will walk all the way up the tree (e.g., out of a content document to a
+  // browser containing it).
+  while (aAncestor != bAncestor && aAncestor && bAncestor &&
+         aAncestor != rootNode && bAncestor != rootNode) {
+    aAncestor = viewer.mDOMUtils.getParentForNode(aAncestor, showAnons);
+    bAncestor = viewer.mDOMUtils.getParentForNode(bAncestor, showAnons);
+  }
+  if (!aAncestor || aAncestor == rootNode) {
+    return 1;
+  }
+  return -1;
+};
+
+/**
+ * Determine if a node is deletable by our deletion methods.
+ * @param aNode
+ *        The node to check.
+ * @param aFailure [optional]
+ *        Outparam whose value will correspond to a cmdEditDelete error
+ *        constant.  If the node is found to be deletable, aFailure will be
+ *        not be altered.
+ * @return Boolean indicating deletability.
+ */
+cmdEditDelete.isDeletable = function Delete_IsDeletable(aNode, aFailure)
+{
+  var failure = aFailure || { };
+  if (!aNode) {
+    failure.value = this.NODE_NULL;
+    return false;
+  }
+  var parent = aNode.parentNode;
+  if (!parent) {
+    failure.value = this.NO_PARENT;
+    return false;
+  }
+  if (Array.indexOf(parent.childNodes, aNode) < 0) {
+    failure.value = this.NOT_EXPLICIT_CHILD;
+    return false;
+  }
+  return true;
+};
+
+cmdEditDelete.NODE_NULL = 1;
+cmdEditDelete.NO_PARENT = 2;
+cmdEditDelete.NOT_EXPLICIT_CHILD = 3;
+
+cmdEditDelete.prototype = new inBaseCommand(false);
+cmdEditDelete.prototype.constructor = cmdEditDelete;
+
+cmdEditDelete.prototype.nodes = null;
+
+cmdEditDelete.prototype.doTransaction = function Delete_DoTransaction()
+{
+  // Note that the "indexes" here refer to the given nodes' indexes in this
+  // instance's |nodes| array, not the row indexes of the view.
+  this.mDeletedIndexes = [];
+  for (let i = 0, n = this.nodes.length; i < n; ++i) {
+    let node = this.nodes[i];
+    let failure = {};
+    if (cmdEditDelete.isDeletable(node, failure)) {
+      try {
+        this.mParents[i].removeChild(node);
+        this.mDeletedIndexes.push(i);
+      }
+      catch (ex) {
+        Components.utils.reportError(node + " was expected to be deletable but isn't");
+      }
+    }
+    else {
+      let consoleMsg = node.toString();
+      switch (failure.value) {
+        case cmdEditDelete.NO_PARENT:
+          consoleMsg += " has no parent node and cannot be deleted.";
+          break;
+        case cmdEditDelete.NOT_EXPLICIT_CHILD:
+          consoleMsg += " is anonymous to its parent node and cannot be deleted.";
+          break;
+      }
+      this.logString(consoleMsg);
+    }
+  }
+};
+
+cmdEditDelete.prototype.logString = function Delete_LogString(aMessage)
+{
+  if (("mConsoleService" in this)) {
+    // This is not the first call.
+    if (this.mConsoleService) {
+      this.mConsoleService.logStringMessage(aMessage);
+    }
+    else {
+      dump(aMessage);
+    }
+  }
+  else {
+    try {
+      this.mConsoleService = XPCU.getService("@mozilla.org/consoleservice;1",
+                                             "nsIConsoleService");
+    }
+    catch (ex) {
+      // Null it out for the next call, so we can use our fallback.
+      this.mConsoleService = null;
+    }
+    this.logString(aMessage);
+  }
+};
+
+cmdEditDelete.prototype.undoTransaction = function Delete_UndoTransaction()
+{
+  // Recall that since not all nodes in this.nodes are necessarily deletable,
+  // this.mDeletedIndexes is a list of indexes into this.nodes where the node
+  // at each index is one which was found to be deletable and was successfully
+  // removed.
+  for (let i = this.mDeletedIndexes.length - 1; i >= 0; --i) {
+    let idx = this.mDeletedIndexes[i];
+    try {
+      this.mParents[idx].insertBefore(this.nodes[idx], this.mSiblings[idx]); 
+    }
+    catch (ex) {
+      // XXX allow recovery from external manipulation
+      Components.utils.reportError("Couldn't undo deletion for node " +
+                                   this.nodes[idx]);
+    }
+  }
+};
+
+function cmdEditCut() {}
+
+cmdEditCut.prototype = new inBaseCommand(false);
+
+cmdEditCut.prototype.cmdCopy = null;
+cmdEditCut.prototype.cmdDelete = null;
+
+cmdEditCut.prototype.doTransaction = function Cut_DoTransaction()
+{
+  if (!this.cmdCopy) {
+    this.cmdDelete = new cmdEditDelete();
+    this.cmdCopy = new cmdEditCopy();
+  }
+  this.cmdCopy.doTransaction();
+  this.cmdDelete.doTransaction();
+};
+
+cmdEditCut.prototype.undoTransaction = function Cut_UndoTransaction()
+{
+  this.cmdDelete.undoTransaction();
+};
+
+function cmdEditCopy() {
+  this.mNode = viewer.selectedNode;
+}
+
+cmdEditCopy.prototype = new inBaseCommand();
+
+cmdEditCopy.prototype.mNode = null;
+
+cmdEditCopy.prototype.doTransaction = function Copy_DoTransaction()
+{
+  if (this.mNode) {
+    viewer.pane.panelset.setClipboardData(this.mNode.cloneNode(true),
+                                          "inspector/dom-node", null);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard as the next sibling of the selected node.
+ */
+function cmdEditPaste() {}
+
+cmdEditPaste.prototype = new inBaseCommand(false);
+
+cmdEditPaste.prototype.pastedNode = null;
+cmdEditPaste.prototype.pastedBefore = null;
+
+cmdEditPaste.prototype.doTransaction = function Paste_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var ref = this.pastedBefore || viewer.currentNode;
+  if (ref) {
+    this.pastedNode = node.cloneNode(true);
+    this.pastedBefore = ref;
+    ref.parentNode.insertBefore(this.pastedNode, ref.nextSibling);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPaste.prototype.undoTransaction = function Paste_UndoTransaction()
+{
+  if (this.pastedNode) {
+    this.pastedNode.parentNode.removeChild(this.pastedNode);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard as the previous sibling of the selected
+ * node.
+ */
+function cmdEditPasteBefore() {}
+
+cmdEditPasteBefore.prototype = new inBaseCommand(false);
+
+cmdEditPasteBefore.prototype.pastedNode = null;
+cmdEditPasteBefore.prototype.pastedBefore = null;
+
+cmdEditPasteBefore.prototype.doTransaction =
+  function PasteBefore_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var ref = this.pastedBefore || viewer.currentNode;
+  if (ref) {
+    this.pastedNode = node.cloneNode(true);
+    this.pastedBefore = ref;
+    ref.parentNode.insertBefore(this.pastedNode, ref);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPasteBefore.prototype.undoTransaction =
+  function PasteBefore_UndoTransaction()
+{
+  if (this.pastedNode) {
+    this.pastedNode.parentNode.removeChild(this.pastedNode);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard in the place of the selected node,
+ * overwriting it.
+ */
+function cmdEditPasteReplace() {}
+
+cmdEditPasteReplace.prototype = new inBaseCommand(false);
+
+cmdEditPasteReplace.prototype.pastedNode = null;
+cmdEditPasteReplace.prototype.originalNode = null;
+
+cmdEditPasteReplace.prototype.doTransaction =
+  function PasteReplace_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var selected = this.originalNode || viewer.selectedNode;
+  if (selected) {
+    this.pastedNode = node.cloneNode(true);
+    this.originalNode = selected;
+    selected.parentNode.replaceChild(this.pastedNode, selected);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPasteReplace.prototype.undoTransaction =
+  function PasteReplace_UndoTransaction()
+{
+  if (this.pastedNode) {
+    this.pastedNode.parentNode.replaceChild(this.originalNode,
+                                            this.pastedNode);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard as the first child of the selected node.
+ */
+function cmdEditPasteFirstChild() {}
+
+cmdEditPasteFirstChild.prototype = new inBaseCommand(false);
+
+cmdEditPasteFirstChild.prototype.pastedNode = null;
+cmdEditPasteFirstChild.prototype.pastedBefore = null;
+
+cmdEditPasteFirstChild.prototype.doTransaction =
+  function PasteFirstChild_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var selected = this.pastedBefore || viewer.selectedNode;
+  if (selected) {
+    this.pastedNode = node.cloneNode(true);
+    this.pastedBefore = selected.firstChild;
+    selected.insertBefore(this.pastedNode, this.pastedBefore);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPasteFirstChild.prototype.undoTransaction =
+  function PasteFirstChild_UndoTransaction()
+{
+  if (this.pastedNode) {
+    this.pastedNode.parentNode.removeChild(this.pastedNode);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard as the last child of the selected node.
+ */
+function cmdEditPasteLastChild() {}
+
+cmdEditPasteLastChild.prototype = new inBaseCommand(false);
+
+cmdEditPasteLastChild.prototype.pastedNode = null;
+cmdEditPasteLastChild.prototype.selectedNode = null;
+
+cmdEditPasteLastChild.prototype.doTransaction =
+  function PasteLastChild_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var selected = this.selectedNode || viewer.selectedNode;
+  if (selected) {
+    this.pastedNode = node.cloneNode(true);
+    this.selectedNode = selected;
+    selected.appendChild(this.pastedNode);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPasteLastChild.prototype.undoTransaction =
+  function PasteLastChild_UndoTransaction()
+{
+  if (this.selectedNode) {
+    this.selectedNode.removeChild(this.pastedNode);
+  }
+};
+
+/**
+ * Pastes the node on the clipboard in the place of the selected node, making
+ * the selected node its child.
+ */
+function cmdEditPasteAsParent() {}
+
+cmdEditPasteAsParent.prototype = new inBaseCommand(false);
+
+cmdEditPasteAsParent.prototype.pastedNode = null;
+cmdEditPasteAsParent.prototype.originalNode = null;
+cmdEditPasteAsParent.prototype.originalParentNode = null;
+
+cmdEditPasteAsParent.prototype.doTransaction =
+  function PasteAsParent_DoTransaction()
+{
+  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
+  var selected = this.originalNode || viewer.selectedNode;
+  var parent = this.originalParentNode || selected.parentNode;
+  if (selected) {
+    this.pastedNode = node.cloneNode(true);
+    this.originalNode = selected;
+    this.originalParentNode = parent;
+    parent.replaceChild(this.pastedNode, selected);
+    this.pastedNode.appendChild(selected);
+    return false;
+  }
+  return true;
+};
+
+cmdEditPasteAsParent.prototype.undoTransaction =
+  function PasteAsParent_UndoTransaction()
+{
+  if (this.pastedNode) {
+    this.originalParentNode.replaceChild(this.originalNode,
+                                         this.pastedNode);
+  }
+};
+
+/**
+ * Generic prototype for inserting a new node somewhere
+ */
+function InsertNode() {}
+
+InsertNode.prototype = new inBaseCommand(false);
+
+InsertNode.prototype.insertedNode = null;
+InsertNode.prototype.originalNode = null;
+InsertNode.prototype.attr = null;
+
+InsertNode.prototype.insertNode = function Insert_InsertNode()
+{
+};
+
+InsertNode.prototype.createNode = function Insert_CreateNode()
+{
+  var doc = this.originalNode.ownerDocument;
+  if (!this.attr) {
+    this.attr = { type: null, value: null,
+                  namespaceURI: this.originalNode.namespaceURI,
+                  accepted: false,
+                  enableNamespaces: doc.contentType != "text/html" };
+
+    window.openDialog("chrome://inspector/content/viewers/dom/" +
+                        "insertDialog.xul",
+                      "insert", "chrome,modal,centerscreen", doc,
+                      this.attr);
+  }
+
+  if (this.attr.accepted) {
+    switch (this.attr.type) {
+      case nsIDOMNode.ELEMENT_NODE:
+        if (this.attr.enableNamespaces) {
+          this.insertedNode = doc.createElementNS(this.attr.namespaceURI,
+                                                  this.attr.value);
+        }
+        else {
+          this.insertedNode = doc.createElement(this.attr.value);
+        }
+        break;
+      case nsIDOMNode.TEXT_NODE:
+        this.insertedNode = doc.createTextNode(this.attr.value);
+        break;
+    }
+    return true;
+  }
+  return false;
+};
+
+InsertNode.prototype.doTransaction = function Insert_DoTransaction()
+{
+  if (this.originalNode) {
+    if (this.createNode()) {
+      this.insertNode();
+      return false;
+    }
+  }
+  return true;
+};
+
+InsertNode.prototype.undoTransaction = function Insert_UndoTransaction()
+{
+  if (this.insertedNode) {
+    this.insertedNode.parentNode.removeChild(this.insertedNode);
+  }
+};
+
+/**
+ * Inserts a node after the selected node.
+ */
+function cmdEditInsertAfter()
+{
+  this.originalNode = viewer.currentNode;
+}
+
+cmdEditInsertAfter.prototype = new InsertNode();
+
+cmdEditInsertAfter.prototype.insertNode = function InsertAfter_InsertNode()
+{
+  this.originalNode.parentNode.insertBefore(this.insertedNode,
+                                            this.originalNode.nextSibling);
+};
+
+/**
+ * Inserts a node before the selected node.
+ */
+function cmdEditInsertBefore()
+{
+  this.originalNode = viewer.currentNode;
+}
+
+cmdEditInsertBefore.prototype = new InsertNode();
+
+cmdEditInsertBefore.prototype.insertNode = function InsertBefore_InsertNode()
+{
+  this.originalNode.parentNode.insertBefore(this.insertedNode,
+                                            this.originalNode);
+};
+
+/**
+ * Inserts a node as the first child of the selected node.
+ */
+function cmdEditInsertFirstChild()
+{
+  this.originalNode = viewer.selectedNode;
+}
+
+cmdEditInsertFirstChild.prototype = new InsertNode();
+
+cmdEditInsertFirstChild.prototype.insertNode =
+  function InsertFirstChild_InsertNode()
+{
+  this.originalNode.insertBefore(this.insertedNode,
+                                 this.originalNode.firstChild);
+};
+
+/**
+ * Inserts a node as the last child of the selected node.
+ */
+function cmdEditInsertLastChild()
+{
+  this.originalNode = viewer.selectedNode;
+}
+
+cmdEditInsertLastChild.prototype = new InsertNode();
+
+cmdEditInsertLastChild.prototype.insertNode =
+  function InsertLastChild_InsertNode()
+{
+  this.originalNode.appendChild(this.insertedNode);
+};
+
+function cmdEditInspectInNewWindow()
+{
+  this.mObject = viewer.selectedNode;
+}
+
+cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
+
+//////////////////////////////////////////////////////////////////////////////
+//// Listener Objects
+
+var MouseDownListener = {
+  handleEvent: function MDL_HandleEvent(aEvent)
+  {
+    aEvent.stopPropagation();
+    aEvent.preventDefault();
+
+    var target = viewer.mDOMView.showAnonymousContent ?
+                                   aEvent.originalTarget :
+                                   aEvent.target;
+    viewer.doSelectByClick(target);
+  }
+};
+
+var EventCanceller = {
+  handleEvent: function EC_HandleEvent(aEvent)
+  {
+    aEvent.stopPropagation();
+    aEvent.preventDefault();
+  }
+};
+
+var ListenerRemover = {
+  handleEvent: function LR_HandleEvent(aEvent)
+  {
+    if (!viewer.mSelecting) {
+      if (aEvent.type == "click") {
+        aEvent.stopPropagation();
+        aEvent.preventDefault();
+      }
+      viewer.removeClickListeners();
+    }
+  }
+};
+
+var PrefChangeObserver = {
+  observe: function PCO_Observe(aSubject, aTopic, aData)
+  {
+    viewer.onPrefChanged(aData);
+  }
+};
+
+function gColumnAddListener(aIndex)
+{
+  viewer.onColumnAdd(aIndex);
+}
+
+function gColumnRemoveListener(aIndex)
+{
+  viewer.onColumnRemove(aIndex);
+}
+
+function dumpDOM2(aNode)
+{
+  dump(DOMViewer.prototype.toXML(aNode));
+}
+
+function stubImpl(aNode)
+{
+}
diff --git a/suite/components/inspector/content/viewers/dom/dom.xul b/suite/components/inspector/content/viewers/dom/dom.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/dom.xul
@@ -0,0 +1,198 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
+]>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/dom.css"?>
+
+<page id="winDOMViewer"
+      orient="vertical"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/dom/dom.js"/>
+
+  <!-- ============================ COMMANDS ============================= -->
+
+  <commandset id="cmdsEditing"/>
+  <commandset id="cmdsEditingExtras"/>
+
+  <commandset>
+    <command id="cmdInspectBrowser"
+             oncommand="viewer.cmdInspectBrowser()"/>
+
+    <command id="cmdCopyXML"
+             oncommand="viewer.cmdCopySelectedXML()"/>
+
+    <command id="cmdBlink"
+             oncommand="viewer.cmdBlink()"/>
+
+    <command id="cmdShowPseudoClasses"
+             oncommand="viewer.cmdShowPseudoClasses()"/>
+
+    <command id="cmdEditPasteBefore"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteBefore');"/>
+    <command id="cmdEditPasteReplace"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteReplace');"/>
+    <command id="cmdEditPasteFirstChild"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteFirstChild');"/>
+    <command id="cmdEditPasteLastChild"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteLastChild');"/>
+    <command id="cmdEditPasteAsParent"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteAsParent');"/>
+
+    <command id="cmdEditInsertAfter"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertAfter');"/>
+    <command id="cmdEditInsertBefore"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertBefore');"/>
+    <command id="cmdEditInsertFirstChild"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertFirstChild');"/>
+    <command id="cmdEditInsertLastChild"
+             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertLastChild');"/>
+
+  </commandset>
+
+  <!--============================= POPUPS ============================== -->
+
+  <popupset id="psPopups">
+    <menupopup id="ppDOMContext"
+               onpopupshowing="viewer.onPopupShowing(event.target)">
+      <menuitem id="mnEditInspectInNewWindow"/>
+      <menuitem id="mnInspectBrowser"
+                label="&cmdInspectBrowser.label;"
+                accesskey="&cmdInspectBrowser.accesskey;"
+                checkvalid="true"
+                command="cmdInspectBrowser"/>
+      <menuseparator/>
+      <menuitem id="mnEditCut"/>
+      <menuitem id="mnEditCopy"/>
+      <menu id="mnEditPasteMenu"
+            label="&mnEditPasteMenu.label;"
+            accesskey="&mnEditPasteMenu.accesskey;">
+        <menupopup>
+          <!-- keep older functionality of paste command for paste menu in DOM
+               Nodes viewer -->
+          <menuitem id="mnEditPasteAfter"
+                    label="&mnEditPasteAfter.label;"
+                    accesskey="&mnEditPasteAfter.accesskey;"
+                    command="cmdEditPaste"
+                    key="keyEditPaste"/>
+          <!-- other paste commands -->
+          <menuitem id="mnEditPasteBefore"
+                    label="&mnEditPasteBefore.label;"
+                    accesskey="&mnEditPasteBefore.accesskey;"
+                    command="cmdEditPasteBefore"/>
+          <menuitem id="mnEditPasteReplace"
+                    label="&mnEditPasteReplace.label;"
+                    accesskey="&mnEditPasteReplace.accesskey;"
+                    command="cmdEditPasteReplace"/>
+          <menuitem id="mnEditPasteFirstChild"
+                    label="&mnEditPasteFirstChild.label;"
+                    accesskey="&mnEditPasteFirstChild.accesskey;"
+                    command="cmdEditPasteFirstChild"/>
+          <menuitem id="mnEditPasteLastChild"
+                    label="&mnEditPasteLastChild.label;"
+                    accesskey="&mnEditPasteLastChild.accesskey;"
+                    command="cmdEditPasteLastChild"/>
+          <menuitem id="mnEditPasteAsParent"
+                    label="&mnEditPasteAsParent.label;"
+                    accesskey="&mnEditPasteAsParent.accesskey;"
+                    command="cmdEditPasteAsParent"/>
+        </menupopup>
+      </menu>
+      <menuseparator/>
+      <menu id="mnEditInsertMenu"
+            label="&mnEditInsertMenu.label;"
+            accesskey="&mnEditInsertMenu.accesskey;">
+        <menupopup>
+          <menuitem id="mnEditInsertAfter"
+                    label="&mnEditInsertAfter.label;"
+                    accesskey="&mnEditInsertAfter.accesskey;"
+                    command="cmdEditInsertAfter"/>
+          <menuitem id="mnEditInsertBefore"
+                    label="&mnEditInsertBefore.label;"
+                    accesskey="&mnEditInsertBefore.accesskey;"
+                    command="cmdEditInsertBefore"/>
+          <menuitem id="mnEditInsertFirstChild"
+                    label="&mnEditInsertFirstChild.label;"
+                    accesskey="&mnEditInsertFirstChild.accesskey;"
+                    command="cmdEditInsertFirstChild"/>
+          <menuitem id="mnEditInsertLastChild"
+                    label="&mnEditInsertLastChild.label;"
+                    accesskey="&mnEditInsertLastChild.accesskey;"
+                    command="cmdEditInsertLastChild"/>
+        </menupopup>
+      </menu>
+      <menuitem id="mnEditDelete"/>
+      <menuseparator/>
+      <menuitem id="mnCopyXML"
+                label="&cmdCopyXML.label;"
+                accesskey="&cmdCopyXML.accesskey;"
+                command="cmdCopyXML"/>
+      <menuseparator/>
+      <menuitem id="mnBlink"
+                label="&cmdBlink.label;"
+                accesskey="&cmdBlink.accesskey;"
+                checkvalid="true"
+                command="cmdBlink"/>
+      <menuitem id="mnShowPseudoClasses"
+                label="&cmdShowPseudoClasses.label;"
+                accesskey="&cmdShowPseudoClasses.accesskey;"
+                command="cmdShowPseudoClasses"/>
+    </menupopup>
+  </popupset>
+
+  <tree id="trDOMTree" class="plain" treelines="true" flex="1"
+        enableColumnDrag="true"
+        contextmenu="ppDOMContext"
+        onselect="viewer.onTreeSelectionChange(event);">
+    <treecols>
+      <!-- These labels don't need to be localized since they are defined by
+           DOM APIs -->
+      <treecol id="colNodeName" label="nodeName" primary="true"
+               persist="width,hidden,ordinal" flex="3"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colLocalName" label="localName" hidden="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colPrefix" label="prefix" hidden="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colNamespaceURI" label="namespaceURI" hidden="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colNodeType" label="nodeType" hidden="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colNodeValue" label="nodeValue" hidden="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="col@id" label="id" persist="width,hidden,ordinal"
+               flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="col@class" label="class" persist="width,hidden,ordinal"
+               flex="1"/>
+    </treecols>
+    <treechildren id="trDOMTreeBody"/>
+  </tree>
+</page>
diff --git a/suite/components/inspector/content/viewers/dom/findDialog.xul b/suite/components/inspector/content/viewers/dom/findDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/findDialog.xul
@@ -0,0 +1,96 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE dialog [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/findDialog.css"?>
+
+<dialog id="winFind" style="width: 30em;"
+        title="&findNodes.title;"
+        ondialogaccept="return dialog.doFind();"
+        persist="screenX screenY"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/FindDialog.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+
+  <hbox flex="1">
+    <vbox flex="1">
+      <grid>
+        <columns>
+          <column/>
+          <column flex="1"/>
+        </columns>
+        <rows>
+          <row id="rwRow1">
+            <deck id="rwRow1Text">
+            <!-- The script places a "control" attribute on the selected label 
+            so that accessibility aids can identify the proper label for the 
+            textbox. -->
+              <label id="txText1Id"
+                     value="&findNodesById.label;"
+                     accesskey="&findNodesById.accesskey;"/>
+              <label id="txText1Tag"
+                     value="&findNodesByTag.label;"
+                     accesskey="&findNodesByTag.accesskey;"/>
+              <label id="txText1Attr"
+                     value="&findNodesByAttr.label;"
+                     accesskey="&findNodesByAttr.accesskey;"/>
+            </deck>
+            <textbox id="tfText1"/>
+          </row>
+          <row id="rwRow2">
+            <label id="txText2"
+                   value="&findNodesByAttrValue.label;"
+                   accesskey="&findNodesByAttrValue.accesskey;"
+                   control="tfText2"/>
+            <textbox id="tfText2"/>
+          </row>
+        </rows>
+      </grid>
+      
+      <hbox>
+        <groupbox id="tbxType">
+          <caption label="&findNodesSearchBy.label;"/>
+          <radiogroup id="rgType">
+            <radio id="rdType_id" value="id"
+                   label="&findNodesById.label;"
+                   accesskey="&findNodesById.accesskey2;"
+                   oncommand="dialog.toggleType('id')"/>
+            <radio id="rdType_tag" value="tag"
+                   label="&findNodesByTag.label;"
+                   accesskey="&findNodesByTag.accesskey2;"
+                   oncommand="dialog.toggleType('tag')"/>
+            <radio id="rdType_attr" value="attr"
+                   label="&findNodesByAttr.label;"
+                   accesskey="&findNodesByAttr.accesskey2;"
+                   oncommand="dialog.toggleType('attr')"/>
+          </radiogroup>
+        </groupbox>
+        <groupbox id="tbxDirection" hide="true">
+          <caption label="&findNodesDirection.label;"/>
+          <radiogroup id="rgDirection">
+            <radio id="rdDir_up" value="up"
+                   label="&findNodesDirectionUp.label;"
+                   accesskey="&findNodesDirectionUp.accesskey;"/>
+            <radio id="rdDir_down" value="down"
+                   label="&findNodesDirectionDown.label;"
+                   accesskey="&findNodesDirectionDown.accesskey;"/>
+          </radiogroup>
+        </groupbox>
+      </hbox>
+    </vbox>
+  
+    <vbox>
+      <button label="&findNodesFind.label;" dlgtype="accept" default="true"/>
+      <button label="&findNodesCancel.label;" dlgtype="cancel"/>
+    </vbox>
+  </hbox>
+  
+</dialog>
diff --git a/suite/components/inspector/content/viewers/dom/insertDialog.js b/suite/components/inspector/content/viewers/dom/insertDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/insertDialog.js
@@ -0,0 +1,136 @@
+/* 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/. */
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var dialog;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization/Destruction
+
+window.addEventListener("load", InsertDialog_initialize, false);
+
+function InsertDialog_initialize()
+{
+  dialog = new InsertDialog();
+  dialog.initialize();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class InsertDialog
+
+function InsertDialog()
+{
+  this.mDoc  = window.arguments[0];
+  this.mData = window.arguments[1];
+
+  this.nodeType  = document.getElementById("ml_nodeType");
+  this.tagName = document.getElementById("tx_tagName");
+  this.nodeValue = document.getElementById("tx_nodeValue");
+  this.namespace = document.getElementById("tx_namespace");
+  this.menulist  = document.getElementById("ml_namespace");
+  this.customNS  = document.getElementById("mi_custom");
+}
+
+InsertDialog.prototype =
+{
+ /**
+  * This function initializes the content of the dialog.
+  */
+  initialize: function initialize()
+  {
+    var menulist   = this.menulist;
+    var menuitems  = menulist.firstChild.childNodes;
+    var defaultNS  = document.getElementById("mi_namespace");
+    var accept     = document.documentElement.getButton("accept");
+
+    menulist.disabled = !this.mData.enableNamespaces;
+    defaultNS.value        = this.mDoc.documentElement.namespaceURI;
+
+    if (this.mData.enableNamespaces) {
+      let uri = this.mData.namespaceURI;
+      menulist.value = uri;
+      if (!menulist.selectedItem) {
+        // The original node's namespace isn't one listed in the menulist.
+        this.customNS.value = uri;
+        menulist.selectedItem = this.customNS;
+      }
+    }
+    this.updateNamespace();
+    this.updateType();
+    this.tagName.focus();
+  },
+
+ /**
+  * The function that is called on accept.  Sets data.
+  */
+  accept: function accept()
+  {
+    switch (this.nodeType.value)
+    {
+      case "element":
+      	this.mData.type     = Components.interfaces.nsIDOMNode.ELEMENT_NODE;
+        this.mData.value    = this.tagName.value;
+        break;
+      case "text":
+      	this.mData.type     = Components.interfaces.nsIDOMNode.TEXT_NODE;
+        this.mData.value    = this.nodeValue.value;
+        break;
+    }
+    this.mData.namespaceURI = this.namespace.value;
+    this.mData.accepted     = true;
+    return true;
+  },
+
+ /**
+  * updateType changes the visibility of rows based on the node type.
+  */
+  updateType: function updateType()
+  {
+    switch (dialog.nodeType.value)
+    {
+      case "text":
+        document.getElementById("row_text").hidden = false;
+        document.getElementById("row_element").hidden = true;
+        break;
+      case "element":
+        document.getElementById("row_text").hidden = true;
+        document.getElementById("row_element").hidden = false;
+        break;
+    }
+    dialog.toggleAccept();
+  },
+
+ /**
+  * updateNamespace updates the namespace textbox based on the namespace menu.
+  */
+  updateNamespace: function updateNamespace()
+  {
+    this.namespace.disabled = dialog.menulist.selectedItem != this.customNS;
+    this.namespace.value    = dialog.menulist.value;
+  },
+
+  /**
+   * Change the "Custom" menuitem's value to reflect the namespace textbox's
+   * value.
+   *
+   * This fires on input events, so if the user switches away from the
+   * "Custom" menuitem and then back, the previously-entered value remains.
+   */
+  updateCustom: function updateCustom()
+  {
+    this.customNS.value = this.namespace.value;
+  },
+
+ /**
+  * toggleAccept enables/disables the Accept button when there is/isn't an
+  *   attribute name.
+  */
+  toggleAccept: function toggleAccept()
+  {
+    document.documentElement.getButton("accept").disabled = 
+      (dialog.tagName.value == "") && (dialog.nodeType.selectedItem.value == "element");
+  }
+};
diff --git a/suite/components/inspector/content/viewers/dom/insertDialog.xul b/suite/components/inspector/content/viewers/dom/insertDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/insertDialog.xul
@@ -0,0 +1,110 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-->
+<!DOCTYPE dialog SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
+<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
+
+<dialog id="InsertNode"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        title="&insertNode.title;"
+        buttons="accept,cancel"
+        ondialogaccept="dialog.accept();">
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/dom/insertDialog.js"/>
+  <grid>
+    <columns>
+      <column/>
+      <column flex="1"/>
+    </columns>
+    <rows>
+      <row align="center">
+        <label value="&nodeType.label;"
+               accesskey="&nodeType.accesskey;"
+               control="ml_nodeType"/>
+        <menulist id="ml_nodeType" oncommand="dialog.updateType();">
+          <menupopup id="mp_nodetypes">
+            <menuitem label="&nodeType.element.label;"
+                      id="mi_Element"
+                      value="element"/>
+            <menuitem label="&nodeType.text.label;"
+                      id="mi_Text"
+                      value="text"/>
+          </menupopup>
+        </menulist>
+      </row>
+	    <rows id="row_element">
+	      <row align="center">
+         <label value="&namespaceURI.label;"
+                accesskey="&namespaceURI.accesskey;"
+                control="ml_namespace"/>
+	        <menulist id="ml_namespace" oncommand="dialog.updateNamespace();">
+	          <menupopup id="mp_namespaces">
+	            <!-- This must be first, and must have the value attribute set to
+	                 "" in order for it to work properly -->
+	            <menuitem label="&namespaceTitle.null.label;"
+	                      id="mi_NullNS"
+	                      value=""/>
+	            <menuitem label="&namespaceTitle.XMLNS.label;"
+	                      id="mi_XMLNSNS"
+	                      value="http://www.w3.org/2000/xmlns/"/>
+	            <menuitem label="&namespaceTitle.XML.label;"
+	                      id="mi_XMLNS"
+	                      value="http://www.w3.org/XML/1998/namespace"/>
+	            <menuitem label="&namespaceTitle.XHTML.label;"
+	                      id="mi_XHTMLNS"
+	                      value="http://www.w3.org/1999/xhtml"/>
+	            <menuitem label="&namespaceTitle.XLink.label;"
+	                      id="mi_XLinkNS"
+	                      value="http://www.w3.org/1999/xlink"/>
+	            <menuitem label="&namespaceTitle.XSLT.label;"
+	                      id="mi_XSLTNS"
+	                      value="http://www.w3.org/1999/XSL/Transform"/>
+	            <menuitem label="&namespaceTitle.XBL.label;"
+	                      id="mi_XBLNS"
+	                      value="http://www.mozilla.org/xbl"/>
+	            <menuitem label="&namespaceTitle.MathML.label;"
+	                      id="mi_MathMLNS"
+	                      value="http://www.w3.org/1998/Math/MathML"/>
+	            <menuitem label="&namespaceTitle.RDF.label;"
+	                      id="mi_RDFNS"
+	                      value="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>
+	            <menuitem label="&namespaceTitle.XUL.label;"
+	                      id="mi_XULNS"
+	                      value="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
+	            <menuitem label="&namespaceTitle.SVG.label;"
+	                      id="mi_SVGNS"
+	                      value="http://www.w3.org/2000/svg"/>
+	            <menuitem label="&namespaceTitle.XMLEvents.label;"
+	                      id="mi_XMLEventsNS"
+	                      value="http://www.w3.org/2001/xml-events"/>
+	            <!-- Value set onload -->
+	            <menuitem label="&namespaceTitle.default.label;"
+	                      id="mi_namespace"/>
+	            <!-- Value set onload -->
+	            <menuitem label="&namespaceTitle.custom.label;"
+	                      id="mi_custom"/>
+	          </menupopup>
+	        </menulist>
+	      </row>
+	      <row>
+	        <spacer/>
+	        <textbox id="tx_namespace" oninput="dialog.updateCustom();"/>
+	      </row>
+	      <row>
+         <label value="&tagName.label;"
+                accesskey="&tagName.accesskey;"
+                control="tx_tagName"/>
+	        <textbox id="tx_tagName" oninput="dialog.toggleAccept()"/>
+	      </row>
+	    </rows>
+      <row id="row_text" flex="1">
+        <label value="&nodeValue.label;"
+               accesskey="&nodeValue.accesskey;"
+               control="tx_nodeValue"/>
+        <textbox id="tx_nodeValue" multiline="true"/>
+      </row>
+    </rows>
+  </grid>
+</dialog>
diff --git a/suite/components/inspector/content/viewers/dom/keysetOverlay.xul b/suite/components/inspector/content/viewers/dom/keysetOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/keysetOverlay.xul
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
+
+<overlay id="ovDOMViewerKeyset"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <keyset id="ksGlobalKeyset">
+    <key id="key:find" key="&cmdShowFindDialog.key;" observes="cmd:find"
+         modifiers="accel"/>
+    <key id="key:findAgain" key="&cmdFindAgain.key;" observes="cmd:findAgain"
+         modifiers="accel"/>
+    <key id="key:findAgain2" keycode="VK_F3" observes="cmd:findAgain"/>
+  </keyset>
+
+</overlay>
diff --git a/suite/components/inspector/content/viewers/dom/popupOverlay.xul b/suite/components/inspector/content/viewers/dom/popupOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/popupOverlay.xul
@@ -0,0 +1,122 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
+
+<overlay id="ovDOMViewerPopup"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <popupset id="ppsViewerPopupset">
+    <menupopup id="ppViewerContext-dom">
+      <menuitem id="item:findPp"
+                label="&cmdShowFindDialog.label;"
+                accesskey="&cmdShowFindDialog.accesskey;"
+                key="key:find"
+                observes="cmd:find"/>
+
+      <menuitem id="item:findAgainPp"
+                label="&cmdFindAgain.label;"
+                accesskey="&cmdFindAgain.accesskey;"
+                key="key:findAgain"
+                observes="cmd:findAgain"/>
+
+      <menuseparator/>
+
+      <menuitem id="item:toggleAttributes" hidden="true"
+                class="menuitem-iconic"
+                type="checkbox"
+                label="&cmdToggleAttributes.label;"
+                accesskey="&cmdToggleAttributes.accesskey;"
+                observes="cmd:toggleAttributes"/>
+
+      <menuitem id="item:toggleAnonPp"
+                class="menuitem-iconic"
+                type="checkbox"
+                label="&cmdToggleAnonContent.label;"
+                accesskey="&cmdToggleAnonContent.accesskey;"
+                observes="cmd:toggleAnon"/>
+
+      <menuitem id="item:toggleAccessibleNodesPp"
+                class="menuitem-iconic"
+                type="checkbox"
+                label="&cmdToggleAccessibleNodes.label;"
+                accesskey="&cmdToggleAccessibleNodes.accesskey;"
+                observes="cmd:toggleAccessibleNodes"/>
+
+      <menuitem id="item:toggleWhitespaceNodesPp"
+                class="menuitem-iconic"
+                type="checkbox"
+                label="&cmdToggleWhitespaceNodes.label;"
+                accesskey="&cmdToggleWhitespaceNodes.accesskey;"
+                observes="cmd:toggleWhitespaceNodes"/>
+
+      <menuitem id="item:toggleProcessingInstructionsPp"
+                class="menuitem-iconic"
+                type="checkbox"
+                label="&cmdToggleProcessingInstructions.label;"
+                accesskey="&cmdToggleProcessingInstructions.accesskey;"
+                observes="cmd:toggleProcessingInstructions"/>
+
+    </menupopup>
+  </popupset>
+
+  <menupopup id="mppEdit">
+
+    <menuseparator/>
+
+    <menuitem id="item:findMpp"
+              label="&cmdShowFindDialog.label;"
+              accesskey="&cmdShowFindDialog.accesskey;"
+              key="key:find"
+              observes="cmd:find"/>
+
+    <menuitem id="item:findAgainMpp"
+              label="&cmdFindAgain.label;"
+              accesskey="&cmdFindAgain.accesskey;"
+              key="key:findAgain"
+              observes="cmd:findAgain"/>
+
+    <menuseparator/>
+
+    <menuitem id="item:selectByClick"
+              label="&cmdSelectByClick.label;"
+              accesskey="&cmdSelectByClick.accesskey;"
+              observes="cmd:selectByClick"
+              type="checkbox"/>
+
+  </menupopup>
+
+  <menupopup id="mppView">
+    <menuitem id="item:toggleAnonMpp"
+              class="menuitem-iconic"
+              type="checkbox"
+              label="&cmdToggleAnonContent.label;"
+              accesskey="&cmdToggleAnonContent.accesskey;"
+              observes="cmd:toggleAnon"/>
+
+    <menuitem id="item:toggleAccessibleNodesMpp"
+              class="menuitem-iconic"
+              type="checkbox"
+              label="&cmdToggleAccessibleNodes.label;"
+              accesskey="&cmdToggleAccessibleNodes.accesskey;"
+              observes="cmd:toggleAccessibleNodes"/>
+
+    <menuitem id="item:toggleWhitespaceNodesMpp"
+              class="menuitem-iconic"
+              type="checkbox"
+              label="&cmdToggleWhitespaceNodes.label;"
+              accesskey="&cmdToggleWhitespaceNodes.accesskey;"
+              observes="cmd:toggleWhitespaceNodes"/>
+
+    <menuitem id="item:toggleProcessingInstructionsMpp"
+              class="menuitem-iconic"
+              type="checkbox"
+              label="&cmdToggleProcessingInstructions.label;"
+              accesskey="&cmdToggleProcessingInstructions.accesskey;"
+              observes="cmd:toggleProcessingInstructions"/>
+  </menupopup>
+
+</overlay>
diff --git a/suite/components/inspector/content/viewers/dom/pseudoClassDialog.js b/suite/components/inspector/content/viewers/dom/pseudoClassDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/pseudoClassDialog.js
@@ -0,0 +1,97 @@
+/* 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/. */
+
+/***************************************************************
+* PseudoClassDialog --------------------------------------------
+*  A dialog for choosing the pseudo-classes that should be 
+*  imitated on the selected element.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var dialog;
+
+//////////// global constants ////////////////////
+
+const gCheckBoxIds = {
+  cbxStateHover: 4,
+  cbxStateActive: 1,
+  cbxStateFocus: 2
+};
+/////////////////////////////////////////////////
+
+window.addEventListener("load", PseudoClassDialog_initialize, false);
+
+function PseudoClassDialog_initialize()
+{
+  dialog = new PseudoClassDialog();
+  dialog.initialize();
+}
+
+////////////////////////////////////////////////////////////////////////////
+//// class PseudoClassDialog
+
+function PseudoClassDialog() 
+{
+  this.mOpener = window.opener.viewer;
+  this.mSubject = window.arguments[0];
+
+  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
+}
+
+PseudoClassDialog.prototype = 
+{
+  
+  initialize: function()
+  {
+    if ("hasPseudoClassLock" in this.mDOMUtils) {
+      for (var key in gCheckBoxIds) {
+        var cbx = document.getElementById(key);
+        if (this.mDOMUtils.hasPseudoClassLock(this.mSubject, cbx.label)) {
+          cbx.setAttribute("checked", "true");
+        }
+      }
+    }
+    else {
+      var state = this.mDOMUtils.getContentState(this.mSubject);
+
+      for (var key in gCheckBoxIds) {
+        if (gCheckBoxIds[key] & state) {
+          var cbx = document.getElementById(key);
+          cbx.setAttribute("checked", "true");
+        }
+      }
+    }
+  },
+  
+  onOk: function()
+  {
+    var el = this.mSubject;
+    var root = el.ownerDocument.documentElement;
+    
+    for (var key in gCheckBoxIds) {
+      var cbx = document.getElementById(key);
+      if (cbx.checked) {
+        if ("addPseudoClassLock" in this.mDOMUtils) {
+          this.mDOMUtils.addPseudoClassLock(el, cbx.label);
+        }
+        else {
+          this.mDOMUtils.setContentState(el, gCheckBoxIds[key]);
+        }
+      }
+      else {
+        if ("removePseudoClassLock" in this.mDOMUtils) {
+          this.mDOMUtils.removePseudoClassLock(el, cbx.label);
+        }
+        else {
+          this.mDOMUtils.setContentState(root, gCheckBoxIds[key]);
+        }
+      }
+    }
+  }
+  
+};
+
diff --git a/suite/components/inspector/content/viewers/dom/pseudoClassDialog.xul b/suite/components/inspector/content/viewers/dom/pseudoClassDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/dom/pseudoClassDialog.xul
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE dialog [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/styleRules/styleRules.css"?>
+
+<dialog id="winPseudoClasses"
+        title="&pseudoClasses.title;"
+        persist="screenX screenY width height"
+        ondialogaccept="return dialog.onOk()"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <!--============================= SCRIPTS ============================= -->
+
+  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/pseudoClassDialog.js"/>
+  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+
+  <keyset id="dialogKeys"/>
+
+  <groupbox style="width: 25em;">
+    <caption label="&pseudoClasses.title;"/>
+    <vbox>
+      <!--
+        The labels don't need to be localized, since they are CSS APIs,
+        but the access keys are localizable, because an English
+        keyboard may not always be available
+        see: https://bugzilla.mozilla.org/show_bug.cgi?id=398704#c1
+      -->
+      <checkbox id="cbxStateHover" label=":hover" accesskey="&cbxStateHover.accesskey;"/>
+      <checkbox id="cbxStateActive" label=":active" accesskey="&cbxStateActive.accesskey;"/>
+      <checkbox id="cbxStateFocus" label=":focus" accesskey="&cbxStateFocus.accesskey;"/>
+    </vbox>
+  </groupbox>
+
+</dialog>
diff --git a/suite/components/inspector/content/viewers/domNode/domNode.js b/suite/components/inspector/content/viewers/domNode/domNode.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/domNode/domNode.js
@@ -0,0 +1,549 @@
+/* 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/. */
+
+/*****************************************************************************
+* DOMNodeViewer --------------------------------------------------------------
+*  The default viewer for DOM Nodes
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kDOMViewCID = "@mozilla.org/inspector/dom-view;1";
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var gPromptService;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", DOMNodeViewer_initialize, false);
+
+function DOMNodeViewer_initialize()
+{
+  viewer = new DOMNodeViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// DOMNodeViewer Class
+
+function DOMNodeViewer()  // implements inIViewer
+{
+  this.mObsMan = new ObserverManager(this);
+
+  this.mURL = window.location;
+  this.mAttrTree = document.getElementById("olAttr");
+  this.mAttrGroupBox = document.getElementById("grpAttr");
+
+  // prepare and attach the DOM DataSource
+  this.mDOMView = XPCU.createInstance(kDOMViewCID, "inIDOMView");
+  this.mDOMView.whatToShow = NodeFilter.SHOW_ATTRIBUTE;
+  this.mAttrTree.treeBoxObject.view = this.mDOMView;
+}
+
+DOMNodeViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mDOMView: null,
+  mSubject: null,
+  mPanel: null,
+
+  get selectedIndex()
+  {
+    return this.mAttrTree.currentIndex;
+  },
+
+ /**
+  * Returns an array of the selected indices
+  */
+  get selectedIndices()
+  {
+    var indices = [];
+    var rangeCount = this.mAttrTree.view.selection.getRangeCount();
+    for (var i = 0; i < rangeCount; ++i) {
+      var start = {};
+      var end = {};
+      this.mAttrTree.view.selection.getRangeAt(i, start, end);
+      for (var c = start.value; c <= end.value; ++c) {
+        indices.push(c);
+      }
+    }
+    return indices;
+  },
+
+ /**
+  * Returns a DOMAttribute from the selected index
+  */
+  get selectedAttribute()
+  {
+    var index = this.selectedIndex;
+    return index >= 0 ?
+      new DOMAttribute(this.mDOMView.getNodeFromRowIndex(index)) : null;
+  },
+
+ /**
+  * Returns an array of DOMAttributes from the selected indices
+  */
+  get selectedAttributes()
+  {
+    var indices = this.selectedIndices;
+    var attrs = [];
+    for (var i = 0; i < indices.length; ++i) {
+      var idx = this.mDOMView.getNodeFromRowIndex(indices[i]);
+      attrs.push(new DOMAttribute(idx));
+    }
+    return attrs;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  //// attributes
+
+  get uid()
+  {
+    return "domNode"
+  },
+
+  get pane()
+  {
+    return this.mPanel
+  },
+
+
+  get selection()
+  {
+    return null
+  },
+
+
+  get subject()
+  {
+    return this.mSubject
+  },
+
+  set subject(aObject)
+  {
+    // the node value's textbox won't fire onchange when we change subjects, so
+    // let's fire it. this won't do anything if it wasn't actually changed
+    viewer.pane.panelset.execCommand('cmdEditTextValue');
+
+    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
+      aObject : aObject.DOMNode;
+    var deck = document.getElementById("dkContent");
+
+    switch (this.mSubject.nodeType) {
+      // things with useful nodeValues
+      case Node.TEXT_NODE:
+      case Node.CDATA_SECTION_NODE:
+      case Node.COMMENT_NODE:
+      case Node.PROCESSING_INSTRUCTION_NODE:
+        deck.selectedIndex = 1;
+        var txb = document.getElementById("txbTextNodeValue").value =
+                  this.mSubject.nodeValue;
+        break;
+      //XXX this view is designed for elements, write a more useful one for
+      // document nodes, etc.
+      default:
+        var bundle = this.pane.panelset.stringBundle;
+        deck.selectedIndex = 0;
+
+        this.setTextValue("localName", this.mSubject.localName);
+        this.setTextValue("nodeType", bundle.getString(this.mSubject.nodeType));
+        this.setTextValue("namespace", this.mSubject.namespaceURI);
+    }
+
+    var hideAttributes = this.mSubject.nodeType != Node.ELEMENT_NODE;
+    this.mAttrGroupBox.hidden = hideAttributes;
+    if (!hideAttributes && this.mSubject != this.mDOMView.rootNode) {
+      this.mDOMView.rootNode = this.mSubject;
+      this.mAttrTree.view.selection.select(-1);
+    }
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  // methods
+
+  initialize: function DNVr_Initialize(aPane)
+  {
+    this.mPanel = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function DNVr_Destroy()
+  {
+    // the node value's textbox won't fire onchange when we change views, so
+    // let's fire it. this won't do anything if it wasn't actually changed
+    viewer.pane.panelset.execCommand('cmdEditTextValue');
+  },
+
+  isCommandEnabled: function DNVr_IsCommandEnabled(aCommand)
+  {
+    // NB: This function can be fired before the subject is set.
+    switch (aCommand) {
+      case "cmdEditPaste":
+        var flavor = this.mPanel.panelset.clipboardFlavor;
+        return (flavor == "inspector/dom-attribute" ||
+                flavor == "inspector/dom-attributes");
+      case "cmdEditInsert":
+        return this.subject && this.subject.nodeType == Node.ELEMENT_NODE;
+      case "cmdEditCut":
+      case "cmdEditCopy":
+      case "cmdEditDelete":
+        return this.selectedAttribute != null;
+      case "cmdEditEdit":
+        return this.mAttrTree.currentIndex >= 0 &&
+                 this.mAttrTree.view.selection.count == 1;
+      case "cmdEditTextValue":
+        if (this.subject) {
+          // something with a useful nodeValue
+          if (this.subject.nodeType == Node.TEXT_NODE ||
+              this.subject.nodeType == Node.CDATA_SECTION_NODE ||
+              this.subject.nodeType == Node.COMMENT_NODE ||
+              this.subject.nodeType == Node.PROCESSING_INSTRUCTION_NODE) {
+            // did something change?
+            return this.subject.nodeValue !=
+                   document.getElementById("txbTextNodeValue").value;
+          }
+        }
+        return false;
+    }
+    return false;
+  },
+
+  getCommand: function DNVr_GetCommand(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCut":
+        return new cmdEditCut();
+      case "cmdEditCopy":
+        return new cmdEditCopy(this.selectedAttributes);
+      case "cmdEditPaste":
+        return new cmdEditPaste();
+      case "cmdEditInsert":
+        var command = new cmdEditInsert();
+        return command.promptFor();
+      case "cmdEditEdit":
+        var command = new cmdEditEdit();
+        return command.promptFor();
+      case "cmdEditDelete":
+        return new cmdEditDelete();
+      case "cmdEditTextValue":
+        return new cmdEditTextValue();
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function DNVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function DNVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Uncategorized
+
+  setTextValue: function DNVr_SetTextValue(aName, aText)
+  {
+    var field = document.getElementById("tx_" + aName);
+    if (field) {
+      field.value = aText;
+    }
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Command Objects
+
+function cmdEditCut() {}
+cmdEditCut.prototype = new inBaseCommand(false);
+
+cmdEditCut.prototype.cmdCopy = null,
+cmdEditCut.prototype.cmdDelete = null,
+
+cmdEditCut.prototype.doTransaction = function DNVr_Cut_DoTransaction()
+{
+  if (!this.cmdCopy) {
+    this.cmdDelete = new cmdEditDelete();
+    this.cmdCopy = new cmdEditCopy(viewer.selectedAttributes);
+    this.cmdCopy.doTransaction();
+  }
+  this.cmdDelete.doTransaction();
+};
+
+cmdEditCut.prototype.undoTransaction = function DVVr_Cut_UndoTransaction()
+{
+  this.cmdDelete.undoTransaction();
+};
+
+function cmdEditPaste() {}
+cmdEditPaste.prototype = new inBaseCommand(false);
+
+cmdEditPaste.prototype.pastedAttr = null;
+cmdEditPaste.prototype.previousAttrValue = null;
+cmdEditPaste.prototype.subject = null;
+cmdEditPaste.prototype.flavor = null;
+
+cmdEditPaste.prototype.doTransaction = function DNVr_Paste_DoTransaction()
+{
+  var subject, pastedAttr, flavor;
+  if (this.subject) {
+    subject = this.subject;
+    pastedAttr = this.pastedAttr;
+    flavor = this.flavor;
+  }
+  else {
+    subject = viewer.subject;
+    pastedAttr = viewer.pane.panelset.getClipboardData();
+    flavor = viewer.pane.panelset.clipboardFlavor;
+    this.pastedAttr = pastedAttr;
+    this.subject = subject;
+    this.flavor = flavor;
+    if (flavor == "inspector/dom-attributes") {
+      this.previousAttrValue = [];
+      for (var i = 0; i < pastedAttr.length; ++i) {
+        this.previousAttrValue[pastedAttr[i].node.nodeName] =
+          viewer.subject.getAttribute(pastedAttr[i].node.nodeName);
+      }
+    }
+    else if (flavor == "inspector/dom-attribute") {
+      this.previousAttrValue =
+        viewer.subject.getAttribute(pastedAttr.node.nodeName);
+    }
+  }
+
+  if (subject && pastedAttr) {
+    if (flavor == "inspector/dom-attributes") {
+      for (var i = 0; i < pastedAttr.length; ++i) {
+        subject.setAttribute(pastedAttr[i].node.nodeName,
+                             pastedAttr[i].node.nodeValue);
+      }
+    }
+    else if (flavor == "inspector/dom-attribute") {
+      subject.setAttribute(pastedAttr.node.nodeName,
+                           pastedAttr.node.nodeValue);
+    }
+  }
+};
+
+cmdEditPaste.prototype.undoTransaction = function DNVr_Paste_UndoTransaction()
+{
+  if (this.pastedAttr) {
+    if (this.flavor == "inspector/dom-attributes") {
+      for (var i = 0; i < this.pastedAttr.length; ++i) {
+        var attrNodeName = this.pastedAttr[i].node.nodeName;
+        if (this.previousAttrValue[attrNodeName]) {
+          this.subject.setAttribute(attrNodeName,
+                                    this.previousAttrValue[attrNodeName]);
+        }
+        else {
+          this.subject.removeAttribute(attrNodeName);
+        }
+      }
+    }
+    else if (this.flavor == "inspector/dom-attribute") {
+      if (this.previousAttrValue) {
+        this.subject.setAttribute(this.pastedAttr.node.nodeName,
+                                  this.previousAttrValue);
+      }
+      else {
+        this.subject.removeAttribute(this.pastedAttr.node.nodeName);
+      }
+    }
+  }
+};
+
+function cmdEditInsert() {}
+cmdEditInsert.prototype = new inBaseCommand(false);
+
+cmdEditInsert.prototype.attr = null;
+cmdEditInsert.prototype.subject = null;
+cmdEditInsert.prototype.name = null;
+cmdEditInsert.prototype.value = null;
+cmdEditInsert.prototype.namespaceURI = null;
+cmdEditInsert.prototype.accepted = false;
+
+cmdEditInsert.prototype.promptFor = function DNVr_Insert_PromptFor()
+{
+  var bundle = viewer.pane.panelset.stringBundle;
+  var title = bundle.getString("newAttribute.title");
+  var doc = viewer.subject.ownerDocument;
+
+  window.openDialog("chrome://inspector/content/viewers/domNode/" +
+                    "domNodeDialog.xul", "insert",
+                    "dialog,modal,centerscreen,resizable", this, title, doc);
+
+  this.subject = viewer.subject;
+
+  return this.accepted ? this : null;
+};
+
+cmdEditInsert.prototype.doTransaction = function DNVr_Insert_DoTransaction()
+{
+  this.subject.setAttributeNS(this.namespaceURI,
+                              this.name,
+                              this.value);
+};
+
+cmdEditInsert.prototype.undoTransaction =
+  function DNVr_Insert_UndoTransaction()
+{
+  if (this.subject == viewer.subject) {
+    this.subject.removeAttributeNS(this.namespaceURI,
+                                   this.name);
+  }
+};
+
+function cmdEditDelete() {}
+cmdEditDelete.prototype = new inBaseCommand(false);
+
+cmdEditDelete.prototype.attrs = null;
+cmdEditDelete.prototype.subject = null;
+
+cmdEditDelete.prototype.doTransaction = function DNVr_Delete_DoTransaction()
+{
+  var attrs = this.attrs ? this.attrs : viewer.selectedAttributes;
+  if (attrs) {
+    this.attrs = attrs;
+    this.subject = viewer.subject;
+    for (var i = 0; i < this.attrs.length; ++i) {
+      this.subject.removeAttribute(this.attrs[i].node.nodeName);
+    }
+  }
+};
+
+cmdEditDelete.prototype.undoTransaction =
+  function DNVr_Delete_UndoTransaction()
+{
+  if (this.attrs) {
+    for (var i = 0; i < this.attrs.length; ++i) {
+      this.subject.setAttribute(this.attrs[i].node.nodeName,
+                                this.attrs[i].node.nodeValue);
+    }
+  }
+};
+
+// XXX when editing the a attribute in this document:
+// data:text/xml,<x a="hi&#x0a;lo&#x0d;go"/>
+// You only get "hi" and not the mutltiline text (windows)
+// This seems to work on Linux, but not very usable
+function cmdEditEdit() {}
+cmdEditEdit.prototype = new inBaseCommand(false);
+
+cmdEditEdit.prototype.subject = null;
+cmdEditEdit.prototype.name = null;
+cmdEditEdit.prototype.value = null;
+cmdEditEdit.prototype.namespaceURI = null;
+cmdEditEdit.prototype.previousValue = null;
+cmdEditEdit.prototype.previousNamespaceURI = null;
+cmdEditEdit.prototype.accepted = false;
+
+cmdEditEdit.prototype.promptFor = function DNVr_Edit_PromptFor()
+{
+  var attr = viewer.selectedAttribute.node;
+  if (!attr) {
+    return null;
+  }
+  var bundle = viewer.pane.panelset.stringBundle;
+  var title = bundle.getString("editAttribute.title");
+  var doc = attr.ownerDocument;
+
+  this.subject              = viewer.subject;
+  this.name                 = attr.nodeName;
+  this.previousValue        = attr.nodeValue;
+  this.previousNamespaceURI = attr.namespaceURI;
+  this.value                = this.previousValue;
+  this.namespaceURI         = this.previousNamespaceURI;
+
+  window.openDialog("chrome://inspector/content/viewers/domNode/" +
+                    "domNodeDialog.xul", "edit",
+                    "dialog,modal,centerscreen,resizable", this, title, doc);
+
+  return this.accepted ? this : null;
+};
+
+cmdEditEdit.prototype.doTransaction = function DNVr_Edit_DoTransaction()
+{
+  if (this.previousNamespaceURI == this.namespaceURI) {
+    this.subject.setAttributeNS(this.previousNamespaceURI,
+                                this.name,
+                                this.value);
+  }
+  else {
+    this.subject.removeAttributeNS(this.previousNamespaceURI,
+                                   this.name);
+    this.subject.setAttributeNS(this.namespaceURI,
+                                this.name,
+                                this.value);
+  }
+};
+
+cmdEditEdit.prototype.undoTransaction = function DNVr_Edit_UndoTransaction()
+{
+  if (this.previousNamespaceURI == this.namespaceURI) {
+    this.subject.setAttributeNS(this.previousNamespaceURI,
+                                this.name,
+                                this.previousValue);
+  }
+  else {
+    this.subject.removeAttributeNS(this.namespaceURI,
+                                   this.name);
+    this.subject.setAttributeNS(this.previousNamespaceURI,
+                                this.name,
+                                this.previousValue);
+  }
+};
+
+/**
+ * Handles editing of text nodes.
+ */
+function cmdEditTextValue() {
+  this.newValue = document.getElementById("txbTextNodeValue").value;
+  this.subject = viewer.subject;
+  this.previousValue = this.subject.nodeValue;
+}
+
+cmdEditTextValue.prototype = new inBaseCommand(false);
+
+cmdEditTextValue.prototype.doTransaction =
+  function DNVr_EditText_DoTransaction()
+{
+  this.subject.nodeValue = this.newValue;
+};
+
+cmdEditTextValue.prototype.undoTransaction =
+  function DNVr_EditText_UndoTransaction()
+{
+  this.subject.nodeValue = this.previousValue;
+  this.refreshView();
+};
+
+cmdEditTextValue.prototype.redoTransaction =
+  function DNVr_EditText_RedoTransaction()
+{
+  this.doTransaction();
+  this.refreshView();
+};
+
+cmdEditTextValue.prototype.refreshView = function DNVr_EditText_RefreshView()
+{
+  // if we're still on the same subject, update the textbox
+  if (viewer.subject == this.subject) {
+    document.getElementById("txbTextNodeValue").value =
+             this.subject.nodeValue;
+  }
+};
diff --git a/suite/components/inspector/content/viewers/domNode/domNode.xul b/suite/components/inspector/content/viewers/domNode/domNode.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/domNode/domNode.xul
@@ -0,0 +1,135 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/domNode.dtd"> %dtd2;
+]>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/domNode/domNode.css"?>
+
+<page id="winNodeDefault"
+      style="padding: 10px"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <!--============================= SCRIPTS ============================= -->
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/domNode/domNode.js"/>
+
+  <!--============================= CONTENT ============================== -->
+
+  <commandset id="cmdsEditing"/>  
+  
+  <popupset id="psPopups">
+    <menupopup id="ppAttrContext">
+      <menuitem id="mnEditCut"/>
+      <menuitem id="mnEditCopy"/>
+      <menuitem id="mnEditPaste"/>
+      <menuseparator/>
+      <menuitem id="mnEditEdit"/>
+      <menuitem id="mnEditInsert"/>
+      <menuitem id="mnEditDelete"/>
+    </menupopup>
+  </popupset>
+ 
+  <deck id="dkContent" flex="1">
+    <vbox id="bxElement">
+      <grid id="olNodeInfo">
+        <columns>
+          <column/>
+          <column flex="1"/>
+        </columns>
+        <rows>
+          <row>
+            <label value="&localName.label;"
+                   control="tx_localName"
+                   class="olNodeInfoLabel"/>
+            <textbox id="tx_localName" readonly="true" class="plain"/>
+          </row>
+          <row>
+            <label value="&namespaceURI.label;"
+                   control="tx_namespace"
+                   class="olNodeInfoLabel"/>
+            <textbox id="tx_namespace" readonly="true" class="plain"/>
+          </row>
+          <row>
+            <label value="&nodeType.label;"
+                   control="tx_nodeType"
+                   class="olNodeInfoLabel"/>
+            <textbox id="tx_nodeType" readonly="true" class="plain"/>
+          </row>
+        </rows>
+      </grid>
+    
+      <groupbox id="grpAttr" flex="1">
+        <caption label="&grpAttr.label;"/>
+        <tree id="olAttr"
+              class="plain"
+              flex="1"
+              enableColumnDrag="true"
+              contextmenu="ppAttrContext"
+              onselect="viewer.pane.panelset.updateAllCommands()">
+          <treecols>
+            <!-- These labels don't need to be localized since they are defined
+                 by DOM APIs. For column headers labeled as |name| and |value|,
+                 even though we're really accessing the |nodeName| and |nodeValue|
+                 properties, it's fine because they're guaranteed to match
+                 the attributes' |name| and |value|, respectively. -->
+            <treecol id="colNodeName"
+                     label="name"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="colLocalName"
+                     hidden="true"
+                     label="localName"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="colPrefix"
+                     hidden="true"
+                     label="prefix"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="colNamespaceURI"
+                     hidden="true"
+                     label="namespaceURI"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="colNodeValue"
+                     label="value"
+                     persist="width,hidden,ordinal"
+                     flex="1"/>
+          </treecols>
+          <treechildren id="olAttrBody"
+                        alternatingbackground="true"
+                        ondblclick="viewer.pane.panelset.execCommand('cmdEditEdit');"/>
+        </tree>
+      </groupbox>
+
+    </vbox>
+
+    <vbox id="bxText">
+      <textbox id="txbTextNodeValue" multiline="true" flex="1"
+               onchange="viewer.pane.panelset.execCommand('cmdEditTextValue');"/>
+    </vbox>
+  </deck>
+</page>
diff --git a/suite/components/inspector/content/viewers/domNode/domNodeDialog.js b/suite/components/inspector/content/viewers/domNode/domNodeDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/domNode/domNodeDialog.js
@@ -0,0 +1,101 @@
+/* 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/. */
+
+///////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var dialog;
+
+///////////////////////////////////////////////////////////////////////////////
+//// Initialization/Destruction
+
+window.addEventListener("load", DomNodeDialog_initialize, false);
+
+function DomNodeDialog_initialize()
+{
+  dialog = new DomNodeDialog();
+  dialog.initialize();
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// class DomNodeDialog
+
+function DomNodeDialog()
+{
+  this.mData  = window.arguments[0];
+  this.mTitle = window.arguments[1];
+  this.mDoc   = window.arguments[2];
+
+  this.nodeName  = document.getElementById("tx_nodeName");
+  this.nodeValue = document.getElementById("tx_nodeValue");
+  this.namespace = document.getElementById("tx_namespace");
+  this.menulist  = document.getElementById("ml_namespace");
+}
+
+DomNodeDialog.prototype =
+{
+ /**
+  * This function initializes the content of the dialog.
+  */
+  initialize: function initialize()
+  {
+    document.title = this.mTitle;
+    var defaultNS  = document.getElementById("mi_namespace");
+    var customNS   = document.getElementById("mi_custom");
+    var accept     = document.documentElement.getButton("accept");
+
+    accept.disabled        = this.mData.name == null;
+    this.nodeName.value    = this.mData.name || "";
+    this.nodeName.disabled = this.mData.name != null;
+    this.nodeValue.value   = this.mData.value || "";
+    this.menulist.disabled = !this.enableNamespaces();
+    defaultNS.value        = this.mDoc.documentElement.namespaceURI;
+    customNS.value         = this.mData.namespaceURI;
+    this.menulist.value    = this.mData.namespaceURI || "";
+
+    this.toggleNamespace();
+  },
+
+ /**
+  * The function that is called on accept.  Sets data.
+  */
+  accept: function accept()
+  {
+    this.mData.name         = this.nodeName.value;
+    this.mData.value        = this.nodeValue.value;
+    this.mData.namespaceURI = this.namespace.value;
+    this.mData.accepted     = true;
+    return true;
+  },
+
+ /**
+  * toggleNamespace toggles the namespace textbox based on the namespace menu.
+  */
+  toggleNamespace: function toggleNamespace()
+  {
+    dialog.namespace.disabled = dialog.menulist.selectedItem.id != "mi_custom";
+    dialog.namespace.value    = dialog.menulist.value;
+  },
+
+ /**
+  * enableNamespaces determines if the document accepts namespaces or not
+  *
+  * @return True if the document can have namespaced attributes, false
+  *           otherwise.
+  */
+  enableNamespaces: function enableNamespaces()
+  {
+    return this.mDoc.contentType != "text/html";
+  },
+
+ /**
+  * toggleAccept enables/disables the Accept button when there is/isn't an
+  *   attribute name.
+  */
+  toggleAccept: function toggleAccept()
+  {
+    document.documentElement.getButton("accept").disabled = 
+      dialog.nodeName.value == "";
+  }
+};
diff --git a/suite/components/inspector/content/viewers/domNode/domNodeDialog.xul b/suite/components/inspector/content/viewers/domNode/domNodeDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/domNode/domNodeDialog.xul
@@ -0,0 +1,89 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-->
+<!DOCTYPE dialog SYSTEM "chrome://inspector/locale/viewers/domNode.dtd">
+<?xml-stylesheet type="text/css"
+                 href="chrome://inspector/skin/viewers/domNode/domNode.css"?>
+
+<dialog id="editInsertAttribute"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        style="min-width: 64ch;"
+        persist="width"
+        buttons="accept,cancel"
+        ondialogaccept="dialog.accept();">
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/domNode/domNodeDialog.js"/>
+  <grid flex="1">
+    <columns>
+      <column/>
+      <column flex="1"/>
+    </columns>
+    <rows>
+      <row align="center">
+        <label value="&nodeName.label;" control="tx_nodeName"/>
+        <textbox id="tx_nodeName" oninput="dialog.toggleAccept();"/>
+      </row>
+      <row align="center">
+        <label value="&nodeValue.label;" control="tx_nodeValue"/>
+        <textbox id="tx_nodeValue"/>
+      </row>
+      <row align="center">
+        <label value="&namespaceURI.label;" control="ml_namespace"/>
+        <menulist id="ml_namespace" oncommand="dialog.toggleNamespace();">
+          <menupopup id="mp_namespaces">
+            <!-- This must be first, and must have the value attribute set to
+                 "" in order for it to work properly -->
+            <menuitem label="&namespaceTitle.null.label;"
+                      id="mi_NullNS"
+                      value=""/>
+            <menuitem label="&namespaceTitle.XMLNS.label;"
+                      id="mi_XMLNSNS"
+                      value="http://www.w3.org/2000/xmlns/"/>
+            <menuitem label="&namespaceTitle.XML.label;"
+                      id="mi_XMLNS"
+                      value="http://www.w3.org/XML/1998/namespace"/>
+            <menuitem label="&namespaceTitle.XHTML.label;"
+                      id="mi_XHTMLNS"
+                      value="http://www.w3.org/1999/xhtml"/>
+            <menuitem label="&namespaceTitle.XLink.label;"
+                      id="mi_XLinkNS"
+                      value="http://www.w3.org/1999/xlink"/>
+            <menuitem label="&namespaceTitle.XSLT.label;"
+                      id="mi_XSLTNS"
+                      value="http://www.w3.org/1999/XSL/Transform"/>
+            <menuitem label="&namespaceTitle.XBL.label;"
+                      id="mi_XBLNS"
+                      value="http://www.mozilla.org/xbl"/>
+            <menuitem label="&namespaceTitle.MathML.label;"
+                      id="mi_MathMLNS"
+                      value="http://www.w3.org/1998/Math/MathML"/>
+            <menuitem label="&namespaceTitle.RDF.label;"
+                      id="mi_RDFNS"
+                      value="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>
+            <menuitem label="&namespaceTitle.XUL.label;"
+                      id="mi_XULNS"
+                      value="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
+            <menuitem label="&namespaceTitle.SVG.label;"
+                      id="mi_SVGNS"
+                      value="http://www.w3.org/2000/svg"/>
+            <menuitem label="&namespaceTitle.XMLEvents.label;"
+                      id="mi_XMLEventsNS"
+                      value="http://www.w3.org/2001/xml-events"/>
+            <!-- Value set onload -->
+            <menuitem label="&namespaceTitle.default.label;"
+                      id="mi_namespace"/>
+            <!-- Value set onload -->
+            <menuitem label="&namespaceTitle.custom.label;"
+                      id="mi_custom"/>
+          </menupopup>
+        </menulist>
+      </row>
+      <row>
+        <spacer/>
+        <textbox id="tx_namespace"/>
+      </row>
+    </rows>
+  </grid>
+</dialog>
diff --git a/suite/components/inspector/content/viewers/jsObject/evalExprDialog.js b/suite/components/inspector/content/viewers/jsObject/evalExprDialog.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/evalExprDialog.js
@@ -0,0 +1,36 @@
+/* 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/. */
+
+/*****************************************************************************
+* EvalExprDialog -------------------------------------------------------------
+*   A dialog for entering javascript expression to evaluate and view in the JS
+*   Object Viewer.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+* chrome://inspector/content/jsutil/xpcom/XPCU.js
+*****************************************************************************/
+
+var gViewer = window.arguments[0];
+var gTarget = window.arguments[1];
+
+/**
+ * Executes the JavaScript expression entered by the user.
+ */
+function execute()
+{
+  var txf = document.getElementById("txfExprInput");
+  var rad = document.getElementById("inspect-new-window");
+  try {
+    gViewer.doEvalExpr(txf.value, gTarget, rad.selected);
+  }
+  catch (ex) {
+    // alert the user of an error in their expression, and don't close
+    let svc = XPCU.getService("@mozilla.org/embedcomp/prompt-service;1",
+                              "nsIPromptService");
+    svc.alert(window, ex.name, ex.message);
+
+    return false;
+  }
+  return true;
+}
diff --git a/suite/components/inspector/content/viewers/jsObject/evalExprDialog.xul b/suite/components/inspector/content/viewers/jsObject/evalExprDialog.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/evalExprDialog.xul
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE dialog [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/jsObject.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin"?>
+
+<dialog id="winEvalExpr"
+        title="&evaluateDialog.title;"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+        ondialogaccept="return execute();"
+        buttonlabelaccept="&jsExecute.label;"
+        style="width: 30em;">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/jsObject/evalExprDialog.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+
+  <stringbundle id="strings"
+                src="chrome://inspector/locale/inspector.properties"/>
+
+  <description>&jsEval.desc;</description>
+
+  <textbox id="txfExprInput"/>
+
+  <groupbox>
+    <caption label="&inspectReturn.label;"/>
+    <radiogroup id="inspect-return-location">
+      <radio id="inspect-existing-window" label="&inspectReturnExisting.label;"
+             selected="true"/>
+      <radio id="inspect-new-window" label="&inspectReturnNew.label;"/>
+    </radiogroup>
+  </groupbox>
+
+</dialog>
diff --git a/suite/components/inspector/content/viewers/jsObject/jsObject.js b/suite/components/inspector/content/viewers/jsObject/jsObject.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/jsObject.js
@@ -0,0 +1,27 @@
+/* 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/. */
+
+/***************************************************************
+* JSObjectViewer --------------------------------------------
+*  The viewer for all facets of a javascript object.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+****************************************************************/
+
+//////////// global variables /////////////////////
+
+var viewer;
+var bundle;
+
+//////////////////////////////////////////////////
+
+window.addEventListener("load", JSObjectViewer_initialize, false);
+
+function JSObjectViewer_initialize()
+{
+  bundle = document.getElementById("inspector-bundle");
+  viewer = new JSObjectViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
diff --git a/suite/components/inspector/content/viewers/jsObject/jsObject.xul b/suite/components/inspector/content/viewers/jsObject/jsObject.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/jsObject.xul
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<?xul-overlay href="chrome://inspector/content/viewers/jsObject/jsObjectViewer.xul"?>
+
+<page id="winJSObject"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/jsObject/jsObject.js"/>
+
+  <stringbundle id="inspector-bundle"/>
+  <commandset id="cmdsEditingExtras"/>
+  <commandset id="cmdsJSObjectViewer"/>
+
+  <popupset>
+    <menupopup id="popupContext"/>
+  </popupset>
+  <tree id="treeJSObject" treelines="true" class="plain"/>
+</page>
diff --git a/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.js b/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.js
@@ -0,0 +1,617 @@
+/* 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/. */
+
+/*****************************************************************************
+* JSObjectViewer -------------------------------------------------------------
+*  The viewer for all facets of a javascript object.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/hooks.js
+*   chrome://inspector/content/jsutil/events/ObserverManager.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kClipboardHelperCID  = "@mozilla.org/widget/clipboardhelper;1";
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class JSObjectViewer
+
+function JSObjectViewer()
+{
+  this.mObsMan = new ObserverManager(this);
+}
+
+JSObjectViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPane: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  get uid()
+  {
+    return "jsObject";
+  },
+
+  get pane()
+  {
+    return this.mPane;
+  },
+
+  get selection()
+  {
+    return this.mSelection;
+  },
+
+  get subject()
+  {
+    return this.mSubject;
+  },
+
+  set subject(aObject)
+  {
+    var object =
+      "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+      aObject instanceof Components.interfaces.nsIAccessible ?
+      aObject.DOMNode : aObject;
+
+    this.setSubject(object);
+  },
+
+  // The accessibleObject viewer extends JSObjectViewer.  This method is here
+  // (and not just inlined above) so that the accessibleObject viewer can get
+  // access to this function without having to use __lookupSetter__ before
+  // overriding with its own subject setter.
+  setSubject: function JSOVr_SetSubject(aObject)
+  {
+    this.mSubject = this.unwrapObject(aObject);
+    this.mView = new JSObjectView(this.mSubject);
+    this.mTree.view = this.mView;
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+
+    // If the user has just switched to us from another viewer in the document
+    // pane and we don't set the selection below, the object pane will
+    // continue to show whatever now-irrelevant thing it was showing before.
+    this.mView.selection.select(0);
+    this.mView.toggleOpenState(0);
+  },
+
+  initialize: function JSOVr_Initialize(aPane)
+  {
+    this.mPane = aPane;
+    this.mTree = document.getElementById("treeJSObject");
+
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function JSOVr_Destroy()
+  {
+  },
+
+  isCommandEnabled: function JSOVr_IsCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdCopyValue":
+      case "cmdEvalExpr":
+        return this.getSelectedCount() == 1;
+      case "cmdEditInspectInNewWindow":
+        if (this.getSelectedCount() != 1) {
+          return false;
+        }
+        let obj = this.getSelectedObject();
+        return cmdEditInspectInNewWindowBase.isInspectable(obj);
+    }
+    return false;
+  },
+
+  getCommand: function JSOVr_GetCommand(aCommand)
+  {
+    if (aCommand in window) {
+      return new window[aCommand]();
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function JSOVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function JSOVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// UI Commands
+
+  cmdCopyValue: function JSOVr_CmdCopyValue()
+  {
+    if (this.getSelectedCount() != 1) {
+      return;
+    }
+
+    var obj = this.getSelectedObject();
+    var helper = XPCU.getService(kClipboardHelperCID, "nsIClipboardHelper");
+    helper.copyString(obj);
+  },
+
+  cmdEvalExpr: function JSOVr_CmdEvalExpr()
+  {
+    if (this.getSelectedCount() != 1) {
+      return;
+    }
+
+    var obj = this.getSelectedObject();
+    openDialog("chrome://inspector/content/viewers/jsObject/evalExprDialog.xul",
+               "_blank", "chrome", this, obj);
+  },
+
+  doEvalExpr: function JSOVr_DoEvalExpr(aExpr, aTarget, aNewView)
+  {
+    // TODO: I should really write some C++ code to execute the js code in the
+    // js context of the inspected window
+
+    try {
+      var f = Function("target", aExpr);
+      var result = f(aTarget);
+
+      if (result) {
+        if (aNewView) {
+          inspectObject(result);
+        }
+        else {
+          this.subject = result;
+        }
+      }
+    }
+    catch (ex) {
+      dump("Error in expression.\n");
+      throw (ex);
+    }
+  },
+
+  getSelectedCount: function JSOVr_GetSelectedCount()
+  {
+    return this.mView.selection.count;
+  },
+
+  getSelectedObject: function JSOVr_GetSelectedObject()
+  {
+    if (this.getSelectedCount() != 1) {
+      throw new Error("Selection count not 1");
+    }
+    return this.mView.getSelectedRowObjects()[0];
+  },
+
+  onTreeSelectionChange: function JSOVr_OnTreeSelectionChange()
+  {
+    // NB: This function gets called on selection *and* deselection.
+    var view = this.mView;
+    var currentIndex = view.selection.currentIndex;
+    var currentValue = view.getRowObjectFromIndex(currentIndex);
+
+    if (view.selection.isSelected(currentIndex)) {
+      this.changeSelection(currentValue);
+    }
+    // Otherwise, the row at currentIndex was deselected.  If there are other
+    // rows selected, use the nearest one for mSelection.  If not, we'll leave
+    // mSelection alone and won't dispatch any event; if there's an object
+    // panel linked to ours, just let it keep inspecting the value from the
+    // deselected row.
+    else if (this.mSelection == currentValue && view.selection.count) {
+      var nearestSelectedIndex = 
+        InsUtil.getNearestIndex(currentIndex, view.getSelectedIndices());
+      this.changeSelection(view.getRowObjectFromIndex(nearestSelectedIndex));
+    }
+
+    this.updateAllCommands();
+  },
+
+  changeSelection: function JSOVr_ChangeSelection(aVal)
+  {
+    this.mSelection = aVal;
+    this.mObsMan.dispatchEvent("selectionChange", { selection: aVal });
+  },
+
+  updateAllCommands: function JSOVr_UpdateAllCommands()
+  {
+    this.pane.panelset.updateAllCommands();
+
+    // There's no need to worry about any other commands outside this
+    // commandset; cmdInspectInNewWindow is global, so it just got updated.
+    var commands = document.getElementById("cmdsJSObjectViewer").childNodes;
+    for (let i = 0, n = commands.length; i < n; ++i) {
+      let command = commands[i];
+      if (this.isCommandEnabled(command.id)) {
+        command.removeAttribute("disabled");
+      }
+      else {
+        command.setAttribute("disabled", true);
+      }
+    }
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Miscellaneous Utility Methods
+
+  unwrapObject: function JSOVr_UnwrapObject(aObject)
+  {
+    /* unwrap() throws for primitive values, so don't call it for those */
+    if (typeof(aObject) === "object" && aObject) {
+      aObject = XPCNativeWrapper.unwrap(aObject);
+    }
+    return aObject;
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// JSObjectView
+
+function JSObjectView(aObject)
+{
+  this.mKeys = [bundle.getString("root.title")];
+  this.mValues = [aObject];
+  this.mValueStrings = [this.jsValueToString(aObject)];
+
+  this.mLevels = [0];
+  this.mOpenStates = [false];
+
+  this.mRowCount = 1;
+}
+
+JSObjectView.prototype = new inBaseTreeView();
+
+JSObjectView.prototype.mLevels = null;
+JSObjectView.prototype.mValues = null;
+JSObjectView.prototype.mValueStrings = null;
+JSObjectView.prototype.mLevels = null;
+JSObjectView.prototype.mOpenStates = null;
+
+JSObjectView.prototype.jsValueToString = function JSOV_JSValueToString(aVal)
+{
+  var str;
+  try {
+    str = String(aVal);
+  }
+  catch (ex) {
+    str = Object.prototype.toString.call(aVal);
+  }
+
+  if (typeof(aVal) == "string") {
+    str = "\"" + str + "\"";
+  }
+
+  return str;
+};
+
+/**
+ * Sort the keys for an object into the following order:
+ * - constants with numeric values sorted numerically by value
+ *   - sorted alphanumerically by key in the event of a tie
+ * - constants with non-numeric values sorted alphanumerically by key
+ * - other numeric key names (e.g., array indices) sorted numerically
+ * - other key names sorted alphanumerically
+ * @param aObject
+ *        The object whose keys we're sorting.
+ * @param aKeys
+ *        The list of property names of aObject being sorted.
+ */
+JSObjectView.prototype.sortKeys = function JSOV_SortKeys(aObject, aKeys)
+{
+  /**
+   * A sort comparator for numeric values. Numerics come before non-numerics.
+   * If both parameters are non-numeric, returns 0.
+   */
+  var numericSortComparator =
+    function JSOV_SortKeys_NumericSortComparator(a, b)
+  {
+    if (isNaN(a)) {
+      return isNaN(b) ? 0 : 1;
+    }
+    if (isNaN(b)) {
+      return -1;
+    }
+    return a - b;
+  };
+
+  var keySortComparator = function JSOV_SortKeys_KeySortComparator(a, b)
+  {
+    var aIsConstant = a == a.toUpperCase() && isNaN(a);
+    var bIsConstant = b == b.toUpperCase() && isNaN(b);
+    // constants come first
+    if (aIsConstant) {
+      if (bIsConstant) {
+        // both are constants. sort by numeric value, then non-numeric name
+        return numericSortComparator(aObject[a], aObject[b]) ||
+               a.localeCompare(b);
+      }
+      // a is constant, b is not
+      return -1;
+    }
+    if (bIsConstant) {
+      // b is constant, a is not
+      return 1;
+    }
+    // neither are constants. go by numeric property name, then non-numeric
+    // property name
+    return numericSortComparator(a, b) || a.localeCompare(b);
+  };
+
+  aKeys.sort(keySortComparator);
+};
+
+/**
+ * Get the number of rows that are descendants of the given row.
+ * @param aIndex
+ *        The index of the row.
+ * @return The number of descendants, as above.
+ */
+JSObjectView.prototype.getDescendantCount =
+  function JSOV_GetDescendantCount(aIndex)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    return 0;
+  }
+
+  var level = this.mLevels[aIndex];
+  var currentIndex = aIndex + 1;
+  var rowCount = this.mRowCount;
+  while (this.mLevels[currentIndex] > level && currentIndex < rowCount) {
+    ++currentIndex;
+  }
+
+  return currentIndex - aIndex - 1;
+};
+
+JSObjectView.prototype.getRowObjectFromIndex =
+  function JSOV_GetRowObjectFromIndex(aIndex)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    throw new RangeError("Invalid index " + aIndex);
+  }
+
+  return this.mValues[aIndex];
+}
+
+JSObjectView.prototype.collapseRow = function JSOV_CollapseRow(aIndex)
+{
+  var rowsDeleted = this.getDescendantCount(aIndex);
+  if (rowsDeleted) {
+    let after = aIndex + 1;
+    this.mKeys.splice(after, rowsDeleted);
+    this.mValues.splice(after, rowsDeleted);
+    this.mValueStrings.splice(after, rowsDeleted);
+    this.mOpenStates.splice(after, rowsDeleted);
+    this.mLevels.splice(after, rowsDeleted);
+  }
+  return rowsDeleted;
+};
+
+JSObjectView.prototype.expandRow = function JSOV_ExpandRow(aIndex)
+{
+  var insertedKeys = [];
+  var insertedValues = [];
+  var insertedValueStrings = [];
+  var insertedOpenStates = [];
+  var insertedLevels = [];
+
+  // Get the new keys.
+  var obj = this.mValues[aIndex];
+  for (let key in obj) {
+    // Not pretty, but we need some way to weed out properties that throw.
+    // It's not as simple as just going ahead and caching the values now,
+    // because when we sort the keys, we'd lose the correspondence between
+    // array indices.
+    try {
+      let val = obj[key];
+      insertedKeys.push(key);
+    }
+    catch (ex) {
+      // Faked properties throw NOT_YET_IMPLEMENTED.  Discard them.
+    }
+  }
+  this.sortKeys(obj, insertedKeys);
+
+  // Get the new data.
+  var rowsInserted = insertedKeys.length;
+  var level = this.mLevels[aIndex] + 1;
+  for (let i = 0; i < rowsInserted; ++i) {
+    let val = viewer.unwrapObject(obj[insertedKeys[i]]);
+    insertedValues.push(val);
+    insertedValueStrings.push(this.jsValueToString(val));
+    insertedOpenStates.push(false);
+    insertedLevels.push(level);
+  }
+
+  // Splice in everything.
+  var after = aIndex + 1;
+  this.spliceFrom(this.mKeys, after, insertedKeys);
+  this.spliceFrom(this.mValues, after, insertedValues);
+  this.spliceFrom(this.mValueStrings, after, insertedValueStrings);
+  this.spliceFrom(this.mOpenStates, after, insertedOpenStates);
+  this.spliceFrom(this.mLevels, after, insertedLevels);
+
+  return rowsInserted;
+};
+
+/**
+ * Splice elements copied from one array into another at the given index.
+ * There is no way to specify that any elements should be removed.
+ * @param aDestination
+ *        The array the data should be spliced into.
+ * @param aIndex
+ *        The index into aDestination that the data should be copied to.
+ * @param aSource
+ *        The array that should be copied into aDestination at aIndex.
+ */
+JSObjectView.prototype.spliceFrom =
+  function JSOV_SpliceFrom(aDestination, aIndex, aSource)
+{
+  Array.prototype.splice.apply(aDestination, ([aIndex, 0]).concat(aSource));
+};
+
+/**
+ * Check if the purported row is outside the range of valid row indexes.
+ * @param aIndex
+ *        The index of the given row.
+ * @return true iff aIndex is outside the range
+ */
+JSObjectView.prototype.checkForBadIndex =
+  function JSOV_CheckForBadIndex(aIndex)
+{
+  if (aIndex < 0 || aIndex >= this.mRowCount) {
+    Components.utils.reportError("Bad index");
+    return true;
+  }
+
+  return false;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// JSObjectView nsITreeView Implementation
+
+JSObjectView.prototype.toggleOpenState = function JSOV_ToggleOpenState(aIndex)
+{
+  if (this.isContainerEmpty(aIndex)) {
+    return;
+  }
+
+  var rowCountChange = 0;
+  var isOpen = this.mOpenStates[aIndex];
+  if (isOpen) {
+    rowCountChange = -this.collapseRow(aIndex);
+  }
+  else {
+    rowCountChange = this.expandRow(aIndex);
+  }
+  this.mOpenStates[aIndex] = !isOpen;
+
+  this.mRowCount += rowCountChange;
+
+  // Notify the box object.
+  var bo = this.mTree;
+  if (bo) {
+    bo.rowCountChanged(aIndex + 1, rowCountChange);
+    bo.invalidateRow(aIndex);
+  }
+};
+
+JSObjectView.prototype.getCellText = function JSOV_GetCellText(aIndex, aCol)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    return "";
+  }
+
+  switch (aCol.id) {
+    case "colProp":
+      return this.mKeys[aIndex];
+    case "colVal":
+      return this.mValueStrings[aIndex];
+  }
+  return "";
+};
+
+JSObjectView.prototype.getParentIndex = function JSOV_GetParentIndex(aIndex)
+{
+  if (this.checkForBadIndex(aIndex) || aIndex == 0) {
+    return -1;
+  }
+
+  var parentLevel = this.mLevels[aIndex] - 1;
+  for (let i = aIndex - 1; i >= 0; --i) {
+    if (this.mLevels[i] == parentLevel) {
+      return i;
+    }
+  }
+
+  Components.utils.reportError("Unrooted rows present");
+  return -1;
+};
+
+JSObjectView.prototype.hasNextSibling =
+  function JSOV_HasNextSibling(aIndex, aAfterIndex)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    return false;
+  }
+
+  var level = this.mLevels[aIndex];
+  for (let i = aAfterIndex + 1, n = this.mRowCount; i < n; ++i) {
+    if (this.mLevels[i] == level) {
+      return true;
+    }
+    if (this.mLevels[i] < level) {
+      break;
+    }
+  }
+
+  return false;
+};
+
+JSObjectView.prototype.getLevel = function JSOV_GetLevel(aIndex)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    return -1;
+  }
+
+  return this.mLevels[aIndex];
+};
+
+JSObjectView.prototype.isContainer = function JSOV_IsContainer(aIndex)
+{
+  if (this.checkForBadIndex(aIndex)) {
+    return false;
+  }
+
+  return cmdEditInspectInNewWindowBase.isInspectable(this.mValues[aIndex]);
+};
+
+JSObjectView.prototype.isContainerEmpty =
+  function JSOV_IsContainerEmpty(aIndex)
+{
+  if (!this.isContainer(aIndex)) {
+    return true;
+  }
+
+  var val = this.mValues[aIndex];
+  for (let key in val) {
+    return false;
+  }
+
+  return true;
+};
+
+JSObjectView.prototype.isContainerOpen = function JSOV_IsContainerOpen(aIndex)
+{
+  if (!this.isContainer(aIndex)) {
+    return false;
+  }
+
+  return this.mOpenStates[aIndex];
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Transactions
+
+function cmdEditInspectInNewWindow()
+{
+  if (viewer.getSelectedCount() == 1) {
+    this.mObject = viewer.getSelectedObject();
+  }
+}
+
+cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.xul b/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/jsObject/jsObjectViewer.xul
@@ -0,0 +1,60 @@
+<?xml version="1.0"?>
+
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/jsObject.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/inspector.css"?>
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/jsObject/jsObjectViewer.js"/>
+
+  <stringbundle id="inspector-bundle"
+                src="chrome://inspector/locale/inspector.properties"/>
+
+  <commandset id="cmdsEditingExtras"/>
+  <commandset id="cmdsJSObjectViewer">
+    <command id="cmdCopyValue" oncommand="viewer.cmdCopyValue();"/>
+    <command id="cmdEvalExpr" oncommand="viewer.cmdEvalExpr();"/>
+  </commandset>
+
+  <menupopup id="popupContext">
+    <!-- mnEditInspectInNewWindow is overlaid by editingOverlay.xul -->
+    <menuitem id="mnEditInspectInNewWindow"/>
+    <menuseparator/>
+    <menuitem label="&jsCopyValue.label;" command="cmdCopyValue"/>
+    <menuitem label="&jsEval.label;" command="cmdEvalExpr"/>
+  </menupopup>
+
+  <tree id="treeJSObject" flex="1" context="popupContext"
+        onselect="viewer.onTreeSelectionChange();">
+    <treecols>
+      <treecol id="colProp" flex="1" primary="true"
+               label="&jsProperty.label;"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="colVal" flex="1" label="&jsValue.label;"/>
+    </treecols>
+
+    <treechildren id="trchJSObject"/>
+  </tree>
+</overlay>
diff --git a/suite/components/inspector/content/viewers/styleRules/commandOverlay.xul b/suite/components/inspector/content/viewers/styleRules/commandOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/styleRules/commandOverlay.xul
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
+
+<overlay id="ovStyleRulesViewerCommands"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <commandset id="cmdsGlobalCommands">
+
+  </commandset>
+
+</overlay>
+
+        
diff --git a/suite/components/inspector/content/viewers/styleRules/keysetOverlay.xul b/suite/components/inspector/content/viewers/styleRules/keysetOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/styleRules/keysetOverlay.xul
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
+
+<overlay id="ovDOMViewerKeyset"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <keyset id="ksGlobalKeyset">
+    <key id="key:find" key="&cmdShowFindDialog.accelkey;" observes="cmd:find"
+         modifiers="accel"/>
+    <key id="key:findNext" keycode="VK_F3" observes="cmd:findNext"/>
+  </keyset>
+
+</overlay>
diff --git a/suite/components/inspector/content/viewers/styleRules/popupOverlay.xul b/suite/components/inspector/content/viewers/styleRules/popupOverlay.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/styleRules/popupOverlay.xul
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
+
+<overlay id="ovStyleRulesViewerPopup"
+        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+  
+  <popupset id="ppsViewerPopupset">
+    <!--
+    <menupopup id="ppViewerContext-styleRules">
+    </menupopup>
+    -->
+  </popupset>
+
+</overlay>
+
+        
diff --git a/suite/components/inspector/content/viewers/styleRules/styleRules.js b/suite/components/inspector/content/viewers/styleRules/styleRules.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/styleRules/styleRules.js
@@ -0,0 +1,806 @@
+/* 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/. */
+
+/*****************************************************************************
+* StyleRulesViewer -----------------------------------------------------------
+*  The viewer for CSS style rules that apply to a DOM element.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/jsutil/rdf/RDFU.js
+*   chrome://global/content/viewSourceUtils.js
+*   chrome://inspector/content/jsutil/commands/baseCommands.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+var gPromptService;
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kDOMUtilsCID = "@mozilla.org/inspector/dom-utils;1";
+const kPromptServiceCID = "@mozilla.org/embedcomp/prompt-service;1";
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", StyleRulesViewer_initialize, false);
+
+function StyleRulesViewer_initialize()
+{
+  viewer = new StyleRulesViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+
+  gPromptService = XPCU.getService(kPromptServiceCID, "nsIPromptService");
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class StyleRulesViewer
+
+function StyleRulesViewer() // implements inIViewer
+{
+  this.mObsMan = new ObserverManager(this);
+
+  this.mURL = window.location;
+  this.mRuleTree = document.getElementById("olStyleRules");
+  this.mRuleBoxObject = this.mRuleTree.treeBoxObject;
+  this.mPropsTree = document.getElementById("olStyleProps");
+  this.mPropsBoxObject = this.mPropsTree.treeBoxObject;
+  this.mFocusedTree = null;
+  this.mDOMUtils = XPCU.getService(kDOMUtilsCID, "inIDOMUtils");
+}
+
+StyleRulesViewer.prototype =
+{
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPanel: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Interface inIViewer
+
+  get uid()
+  {
+    return "styleRules"
+  },
+
+  get pane()
+  {
+    return this.mPanel
+  },
+
+  get selection()
+  {
+    return null
+  },
+
+  get subject()
+  {
+    return this.mSubject
+  },
+
+  set subject(aObject)
+  {
+    this.mSubject =
+      ("@mozilla.org/accessibleRetrieval;1" in Components.classes &&
+       aObject instanceof Components.interfaces.nsIAccessible) ?
+      aObject.DOMNode : aObject;
+
+    // update the rule tree
+    this.mRuleView = new StyleRuleView(this.mSubject);
+    this.mRuleBoxObject.view = this.mRuleView;
+    // clear the props tree
+    this.mPropsTree.disabled = true;
+    this.mPropsTree.contextMenu = null;
+    this.mPropsView = null;
+    this.mPropsBoxObject.view = null;
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  initialize: function SRVr_Initialize(aPane)
+  {
+    this.mPanel = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function SRVr_Destroy()
+  {
+    // We need to remove the views at this time or else they will attempt to
+    // re-paint while the document is being deconstructed, resulting in
+    // some nasty XPConnect assertions
+    this.mRuleBoxObject.view = null;
+    this.mPropsBoxObject.view = null;
+  },
+
+  isCommandEnabled: function SRVr_IsCommandEnabled(aCommand)
+  {
+    var rule = this.getSelectedRule();
+    var fileURI = rule && rule.parentStyleSheet && rule.parentStyleSheet.href;
+    // XXX can't edit resource: stylesheets because of bug 343508, and
+    // CSSFontFaceRules because of bug 443978
+    var isEditable = !(/^resource:/.test(fileURI) ||
+                       rule instanceof CSSFontFaceRule);
+
+    var propFocus = this.mFocusedTree == this.mPropsTree;
+    var propCount = this.mPropsTree.view.selection.count;
+
+    switch (aCommand) {
+      // ppStylePropsContext
+      // The first three of these are context-sensitive; until they are
+      // supported for the rule pane, they are meaningless when it has focus.
+      case "cmdEditCopy":
+        return propFocus && propCount > 0;
+      case "cmdEditDelete":
+        return isEditable && propFocus && propCount > 0;
+      case "cmdEditInsert":
+        return isEditable && propFocus;
+      case "cmdTogglePriority":
+        return isEditable && propCount > 0;
+      case "cmdEditEdit":
+        return isEditable && propCount == 1;
+      // ppStyleRulesContext
+      case "cmdEditCopyFileURI":
+      case "cmdEditViewFileURI":
+        return !!fileURI;
+    }
+    return false;
+  },
+
+  getCommand: function SRVr_GetCommand(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCopy":
+        return new cmdEditCopy(this.mPropsView.getSelectedRowObjects());
+      case "cmdEditDelete":
+        return new cmdEditDelete(this.getSelectedDec(),
+                                 this.mPropsView.getSelectedRowObjects());
+      case "cmdEditInsert":
+        var bundle = this.mPanel.panelset.stringBundle;
+        var msg = bundle.getString("styleRulePropertyName.message");
+        var title = bundle.getString("styleRuleNewProperty.title");
+
+        var property = { value: "" };
+        var value = { value: "" };
+        var dummy = { value: false };
+
+        if (!gPromptService.prompt(window, title, msg, property, null,
+                                   dummy)) {
+          return null;
+        }
+
+        msg = bundle.getString("styleRulePropertyValue.message");
+        if (!gPromptService.prompt(window, title, msg, value, null, dummy)) {
+          return null;
+        }
+
+        return new cmdEditInsert(this.getSelectedDec(), property.value,
+                                  value.value, "");
+      case "cmdEditEdit":
+        var rule = this.getSelectedDec();
+        var property = this.getSelectedProp();
+        var priority = rule.getPropertyPriority(property);
+
+        var bundle = this.mPanel.panelset.stringBundle;
+        var msg = bundle.getString("styleRulePropertyValue.message");
+        var title = bundle.getString("styleRuleEditProperty.title");
+
+        var value = { value: rule.getPropertyValue(property) };
+        var dummy = { value: false };
+
+        if (!gPromptService.prompt(window, title, msg, value, null, dummy)) {
+          return null;
+        }
+
+        return new cmdEditEdit(rule, property, value.value, priority);
+      case "cmdTogglePriority":
+        return new cmdTogglePriority(this.getSelectedDec(),
+                                     this.mPropsView.getSelectedRowObjects());
+      case "cmdEditCopyFileURI":
+        return new cmdEditCopyFileURI(this.getSelectedRule());
+      case "cmdEditViewFileURI":
+        return new cmdEditViewFileURI(this.getSelectedRule());
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function SRVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function SRVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Uncategorized
+
+  get DOMUtils() {
+    return this.mDOMUtils;
+  },
+
+  getSelectedDec: function SRVr_GetSelectedDec()
+  {
+    var idx = this.mRuleTree.currentIndex;
+    return this.mRuleView.selection.count == 1 ?
+             this.mRuleView.getDecAt(idx) :
+             null;
+  },
+
+  getSelectedProp: function SRVr_GetSelectedProp()
+  {
+    if (this.mPropsView.selection.count != 1) {
+      return null;
+    }
+    var dec = this.getSelectedDec();
+    // API awkwardness
+    var min = {}, max = {};
+    this.mPropsView.selection.getRangeAt(0, min, max);
+    return dec.item(min.value);
+  },
+
+  getSelectedRule: function SRVr_GetSelectedRule()
+  {
+    var idx = this.mRuleTree.currentIndex;
+    return this.mRuleView.selection.count == 1 ?
+             this.mRuleView.getRuleAt(idx) :
+             null;
+  },
+
+  onRuleSelect: function SRVr_OnRuleSelect()
+  {
+    var dec = this.getSelectedDec();
+    this.mPropsView = new StylePropsView(dec);
+    this.mPropsBoxObject.view = this.mPropsView;
+    viewer.pane.panelset.updateAllCommands();
+    // for non-style rules, change props tree depending on its relevance
+    this.mPropsTree.disabled = !dec;
+    this.mPropsTree.contextMenu = dec ? "ppStylePropsContext" : null;
+  },
+
+  onPropSelect: function SRVr_OnPropSelect()
+  {
+    viewer.pane.panelset.updateAllCommands();
+  },
+
+  onTreeFocus: function SRVr_OnTreeFocus(aTree)
+  {
+    this.mFocusedTree = aTree;
+    viewer.pane.panelset.updateAllCommands();
+  },
+
+  onPopupShowing: function SRVr_OnPopupShowing(aCommandSetId)
+  {
+    var commandset = document.getElementById(aCommandSetId);
+    for (let i = 0; i < commandset.childNodes.length; i++) {
+      var command = commandset.childNodes[i];
+      command.setAttribute("disabled", !viewer.isCommandEnabled(command.id));
+    }
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// StyleRuleView
+
+function StyleRuleView(aObject)
+{
+  this.mLevel = [];
+  this.mOpen = [];
+  if (aObject instanceof Components.interfaces.nsIDOMCSSStyleSheet) {
+    document.getElementById("olcRule").setAttribute("primary", "true");
+    this.mSheetRules = [];
+    for (let i = 0; i < aObject.cssRules.length; i++) {
+      this.mSheetRules[i] = aObject.cssRules[i];
+      this.mLevel[i] = 0;
+      this.mOpen[i] = false;
+    }
+  }
+  else {
+    document.getElementById("olcRule").removeAttribute("primary");
+    this.mRules = viewer.DOMUtils.getCSSStyleRules(aObject);
+    if (aObject.hasAttribute("style")) {
+      try {
+        this.mStyleAttribute =
+          new XPCNativeWrapper(aObject, "style").style;
+      }
+      catch (ex) {
+      }
+    }
+  }
+}
+
+StyleRuleView.prototype = new inBaseTreeView();
+
+StyleRuleView.prototype.mSheetRules = null;
+StyleRuleView.prototype.mLevel = null;
+StyleRuleView.prototype.mOpen = null;
+StyleRuleView.prototype.mRules = null;
+StyleRuleView.prototype.mStyleAttribute = null;
+
+StyleRuleView.prototype.getRuleAt = function SRV_GetRuleAt(aRow)
+{
+  if (aRow >= 0) {
+    if (this.mRules) {
+      var rule = this.mRules.GetElementAt(aRow);
+      try {
+        return XPCU.QI(rule, "nsIDOMCSSStyleRule");
+      }
+      catch (ex) {
+      }
+    }
+    else {
+      return this.mSheetRules[aRow];
+    }
+  }
+  return null;
+}
+
+StyleRuleView.prototype.getDecAt = function SRV_GetDecAt(aRow)
+{
+  if (aRow >= 0) {
+    if (this.mRules) {
+      if (this.mStyleAttribute && aRow == this.mRules.Count()) {
+        return this.mStyleAttribute;
+      }
+      var rule = this.mRules.GetElementAt(aRow);
+      try {
+        return XPCU.QI(rule, "nsIDOMCSSStyleRule").style;
+      }
+      catch (ex) {
+      }
+    }
+    // for CSSStyleRule, CSSFontFaceRule, CSSPageRule, and
+    // ElementCSSInlineStyle
+    else if ("style" in this.mSheetRules[aRow]) {
+      return this.mSheetRules[aRow].style;
+    }
+  }
+  return null;
+}
+
+StyleRuleView.prototype.getChildCount = function SRV_GetChildCount(aRow)
+{
+  if (aRow >= 0) {
+    var rule = this.mSheetRules[aRow];
+    if (rule instanceof CSSImportRule) {
+      return rule.styleSheet ? rule.styleSheet.cssRules.length : 0;
+    }
+    if (rule instanceof CSSMediaRule ||
+        rule instanceof CSSMozDocumentRule) {
+      return rule.cssRules.length;
+    }
+  }
+  return 0;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Interface nsITreeView (Override inBaseTreeView)
+
+StyleRuleView.prototype.__defineGetter__("rowCount", function()
+{
+  if (this.mRules) {
+    return this.mRules.Count() + (this.mStyleAttribute ? 1 : 0);
+  }
+  if (this.mSheetRules) {
+    return this.mSheetRules.length;
+  }
+  return 0;
+});
+
+StyleRuleView.prototype.getCellText = function SRV_GetCellText(aRow, aCol)
+{
+  if (aRow > this.rowCount) {
+    return "";
+  }
+
+  // special case for the style attribute
+  if (this.mStyleAttribute && aRow == this.mRules.Count()) {
+    if (aCol.id == "olcRule") {
+      return 'style=""';
+    }
+
+    if (aCol.id == "olcFileURL") {
+      // we ought to be able to get to the URL...
+      return "";
+    }
+
+    if (aCol.id == "olcLine") {
+      return "";
+    }
+    return "";
+  }
+
+  var rule = this.getRuleAt(aRow);
+  if (!rule) {
+    return "";
+  }
+
+  if (aCol.id == "olcRule") {
+    if (rule instanceof CSSStyleRule) {
+      return rule.selectorText;
+    }
+    if (rule instanceof CSSFontFaceRule) {
+      return "@font-face";
+    }
+    if (rule instanceof CSSMediaRule ||
+        rule instanceof CSSMozDocumentRule) {
+      // get rule text up until the block begins, and trim off whitespace
+      return rule.cssText.replace(/\s*{[\s\S]*/, "");
+    }
+    return rule.cssText;
+  }
+
+  if (aCol.id == "olcFileURL") {
+    return rule.parentStyleSheet ? rule.parentStyleSheet.href : "";
+  }
+
+  if (aCol.id == "olcLine") {
+    return rule.type == CSSRule.STYLE_RULE ?
+                          viewer.DOMUtils.getRuleLine(rule) :
+                          "";
+  }
+
+  return "";
+}
+
+StyleRuleView.prototype.getLevel = function SRV_GetLevel(aRow)
+{
+  if (aRow in this.mLevel) {
+    return this.mLevel[aRow];
+  }
+  return 0;
+}
+
+StyleRuleView.prototype.getParentIndex = function SRV_GetParentIndex(aRow)
+{
+  var level = this.getLevel(aRow);
+  for (let i = aRow - 1; i >= 0; --i) {
+    if (this.getLevel(i) < level) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+StyleRuleView.prototype.hasNextSibling =
+  function SRV_HasNextSibling(aRow, aAfter)
+{
+  var baseLevel = this.getLevel(aRow);
+  var rowCount = this.rowCount; // quick access since this property is dynamic
+  for (let i = aAfter + 1; i < rowCount; ++i) {
+    if (this.getLevel(i) < baseLevel) {
+      break;
+    }
+    if (this.getLevel(i) == baseLevel) {
+      return true;
+    }
+  }
+  return false;
+}
+
+StyleRuleView.prototype.isContainer = function SRV_IsContainer(aRow)
+{
+  if (this.mSheetRules) {
+    if (this.mSheetRules[aRow] instanceof CSSImportRule ||
+        this.mSheetRules[aRow] instanceof CSSMediaRule ||
+        this.mSheetRules[aRow] instanceof CSSMozDocumentRule) {
+      return true;
+    }
+  }
+  return false;
+}
+
+StyleRuleView.prototype.isContainerEmpty = function SRV_IsContainerEmpty(aRow)
+{
+  return !this.getChildCount(aRow);
+}
+
+StyleRuleView.prototype.isContainerOpen = function SRV_IsContainerOpen(aRow)
+{
+  return this.mOpen[aRow];
+}
+
+StyleRuleView.prototype.toggleOpenState = function SRV_ToggleOpenState(aRow)
+{
+  var oldLength = this.mSheetRules.length;
+  var childLevel = this.mLevel[aRow] + 1;
+  if (this.mOpen[aRow]) {
+    // find the number of children and other descendants
+    let count = this.mSheetRules.length - aRow - 1;
+    for (let i = aRow + 1, n = this.mSheetRules.length; i < n; ++i) {
+      if (this.mLevel[i] < childLevel) {
+        count = i - aRow - 1;
+        break;
+      }
+    }
+    this.mSheetRules.splice(aRow + 1, count);
+    this.mLevel.splice(aRow + 1, count);
+    this.mOpen.splice(aRow + 1, count);
+  }
+  else {
+    var inserts = [];
+    var rule = this.mSheetRules[aRow];
+    if (rule instanceof CSSImportRule) {
+      // @import is tricky, because its styleSheet property is allowed to be
+      // null if its media-type qualifier isn't supported, among other
+      // reasons.
+      inserts = rule.styleSheet ? rule.styleSheet.cssRules : [];
+    }
+    else if (rule instanceof CSSMediaRule ||
+             rule instanceof CSSMozDocumentRule) {
+      inserts = rule.cssRules;
+    }
+    // make space for children
+    var count = this.getChildCount(aRow);
+    for (let i = this.rowCount - 1; i > aRow; --i) {
+      this.mSheetRules[i + count] = this.mSheetRules[i];
+      this.mLevel[i + count] = this.mLevel[i];
+      this.mOpen[i + count] = this.mOpen[i];
+    }
+    // fill in children
+    for (let i = 0; i < inserts.length; ++i) {
+      this.mSheetRules[aRow + 1 + i] = inserts[i];
+      this.mLevel[aRow + 1 + i] = childLevel;
+      this.mOpen[aRow + 1 + i] = false;
+    }
+  }
+  this.mOpen[aRow] = !this.mOpen[aRow];
+  viewer.mRuleTree.treeBoxObject.rowCountChanged(aRow + 1,
+    this.mSheetRules.length - oldLength);
+  viewer.mRuleTree.treeBoxObject.invalidateRow(aRow);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// StylePropsView
+
+function StylePropsView(aDec)
+{
+  this.mDec = aDec;
+}
+
+StylePropsView.prototype = new inBaseTreeView();
+
+StylePropsView.prototype.__defineGetter__("rowCount", function()
+{
+  return this.mDec ? this.mDec.length : 0;
+});
+
+StylePropsView.prototype.getCellProperties =
+  function SPV_GetCellProperties(aRow, aCol)
+{
+  if (aCol.id == "olcPropPriority") {
+    var prop = this.mDec.item(aRow);
+    if (this.mDec.getPropertyPriority(prop) == "important") {
+      return "important";
+    }
+  }
+
+  return "";
+}
+
+StylePropsView.prototype.getCellText = function SPV_GetCellText(aRow, aCol)
+{
+  var prop = this.mDec.item(aRow);
+
+  if (aCol.id == "olcPropName") {
+    return prop;
+  }
+  else if (aCol.id == "olcPropValue") {
+    return this.mDec.getPropertyValue(prop)
+  }
+
+  return null;
+}
+
+/**
+ * Returns a CSSProperty for the row in the tree corresponding to the
+ * passed index.
+ * @param aIndex
+ *        index of the row in the tree
+ * @return a CSSProperty
+ */
+StylePropsView.prototype.getRowObjectFromIndex =
+  function SPV_GetRowObjectFromIndex(aIndex)
+{
+  var prop = this.mDec.item(aIndex);
+  return new CSSProperty(prop, this.mDec.getPropertyValue(prop),
+                         this.mDec.getPropertyPriority(prop));
+}
+
+/**
+ * Handles inserting a CSS property
+ * @param aRule
+ *        the rule that will contain the new property
+ * @param aProperty
+ *        the name of the new property
+ * @param aValue
+ *        the value of the new property
+ * @param aPriority
+ *        the priority of the new property ("important" or "")
+ */
+function cmdEditInsert(aRule, aProperty, aValue, aPriority)
+{
+  this.rule = aRule;
+  this.property = aProperty;
+  this.value = aValue;
+  this.priority = aPriority;
+}
+
+cmdEditInsert.prototype = new inBaseCommand(false);
+
+cmdEditInsert.prototype.doTransaction = function Insert_DoTransaction()
+{
+  viewer.mPropsBoxObject.beginUpdateBatch();
+  try {
+    this.rule.setProperty(this.property, this.value, this.priority);
+  }
+  finally {
+    viewer.mPropsBoxObject.endUpdateBatch();
+  }
+};
+
+cmdEditInsert.prototype.undoTransaction = function Insert_UndoTransaction()
+{
+  this.rule.removeProperty(this.property);
+  viewer.mPropsBoxObject.invalidate();
+};
+
+/**
+ * Handles deleting CSS properties
+ * @param aRule
+ *        the rule containing the properties
+ * @param aProperties
+ *        an array of CSSPropertys to delete
+ */
+function cmdEditDelete(aRule, aProperties)
+{
+  this.rule = aRule;
+  this.properties = aProperties;
+}
+
+cmdEditDelete.prototype = new inBaseCommand(false);
+
+cmdEditDelete.prototype.doTransaction = function Delete_DoTransaction()
+{
+  viewer.mPropsBoxObject.beginUpdateBatch();
+  for (let i = 0; i < this.properties.length; i++) {
+    this.rule.removeProperty(this.properties[i].property);
+  }
+  viewer.mPropsBoxObject.endUpdateBatch();
+};
+
+cmdEditDelete.prototype.undoTransaction = function Delete_UndoTransaction()
+{
+  viewer.mPropsBoxObject.beginUpdateBatch();
+  try {
+    for (let i = 0; i < this.properties.length; i++) {
+      this.rule.setProperty(this.properties[i].property,
+                            this.properties[i].value,
+                            this.properties[i].important ?
+                              "important" :
+                              "");
+    }
+  }
+  finally {
+    viewer.mPropsBoxObject.endUpdateBatch();
+  }
+};
+
+/**
+ * Handles editing CSS properties
+ * @param aRule
+ *        the rule containing the property
+ * @param aProperty
+ *        the property to change
+ * @param aNewValue
+ *        the new value for the property
+ * @param aNewPriority
+ *        the new priority for the property ("important" or "")
+ */
+function cmdEditEdit(aRule, aProperty, aNewValue, aNewPriority)
+{
+  this.rule = aRule;
+  this.property = aProperty;
+  this.oldValue = aRule.getPropertyValue(aProperty);
+  this.newValue = aNewValue;
+  this.oldPriority = aRule.getPropertyPriority(aProperty);
+  this.newPriority = aNewPriority;
+}
+
+cmdEditEdit.prototype = new inBaseCommand(false);
+
+cmdEditEdit.prototype.doTransaction = function Edit_DoTransaction()
+{
+  this.rule.setProperty(this.property, this.newValue,
+                        this.newPriority);
+  viewer.mPropsBoxObject.invalidate();
+};
+
+cmdEditEdit.prototype.undoTransaction = function Edit_UndoTransaction()
+{
+  this.rule.setProperty(this.property, this.oldValue,
+                        this.oldPriority);
+  viewer.mPropsBoxObject.invalidate();
+};
+
+/**
+ * Handles toggling CSS !important.
+ * @param aRule
+ *        the rule containing the properties
+ * @param aProperties
+ *        an array of CSSPropertys to toggle
+ */
+function cmdTogglePriority(aRule, aProperties)
+{
+  this.rule = aRule;
+  this.properties = aProperties;
+}
+
+cmdTogglePriority.prototype = new inBaseCommand(false);
+
+cmdTogglePriority.prototype.doTransaction =
+  function TogglePriority_DoTransaction()
+{
+  for (let i = 0; i < this.properties.length; i++) {
+    // XXX bug 305761 means we can't make something not important, so
+    // instead we'll delete this property and make a new one at the proper
+    // priority.  This method also sucks because the property gets moved to
+    // the bottom.
+    var property = this.properties[i].property;
+    var value = this.properties[i].value;
+    var newPriority = this.rule.getPropertyPriority(property) == "" ?
+                        "important" : "";
+    this.rule.removeProperty(property);
+    this.rule.setProperty(property, value, newPriority);
+  }
+  viewer.mPropsBoxObject.invalidate();
+};
+
+cmdTogglePriority.prototype.undoTransaction =
+  function TogglePriority_UndoTransaction()
+{
+  this.doTransaction();
+};
+
+/**
+ * Copy the URI for a CSS rule's parent style sheet onto the clipboard.
+ * @param aRule
+ *        The nsIDOMCSSRule whose parent style sheet's URI should be copied.
+ */
+function cmdEditCopyFileURI(aRule)
+{
+  this.mString = aRule && aRule.parentStyleSheet &&
+                 aRule.parentStyleSheet.href;
+}
+
+cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
+
+/**
+ * Open a source view on a CSS rule's parent style sheet.  This will attempt
+ * open the file at the line that the rule appears on.
+ * @param aRule
+ *        The source view will open on nsIDOMCSSRule aRule's parent style
+ *        sheet.  If aRule is an nsIDOMCSSStyleRule, the source view will open
+ *        to the line in the style sheet that aRule appears on.
+ */
+function cmdEditViewFileURI(aRule)
+{
+  this.mURI = aRule && aRule.parentStyleSheet && aRule.parentStyleSheet.href;
+  if (aRule.type == CSSRule.STYLE_RULE) {
+    this.mLineNumber = viewer.DOMUtils.getRuleLine(aRule);
+  }
+}
+
+cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
diff --git a/suite/components/inspector/content/viewers/styleRules/styleRules.xul b/suite/components/inspector/content/viewers/styleRules/styleRules.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/styleRules/styleRules.xul
@@ -0,0 +1,109 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/viewers/styleRules/styleRules.css"?>
+
+<page id="winStyleRules"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <!--============================= SCRIPTS ============================= -->
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/styleRules/styleRules.js"/>
+  <script type="application/javascript"
+          src="chrome://global/content/XPCNativeWrapper.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
+  <script type="application/javascript"
+          src="chrome://global/content/viewSourceUtils.js"/>
+
+  <!--============================ COMMANDS ============================= -->
+
+  <commandset id="cmdsEditing"/>
+  <commandset id="cmdsEditingExtras"/>
+  <commandset id="cmdsProps">
+    <command id="cmdTogglePriority"
+             oncommand="viewer.pane.panelset.execCommand('cmdTogglePriority')"/>
+  </commandset>
+
+  <!--============================= POPUPS ============================== -->
+
+  <popupset id="psPopups">
+    <menupopup id="ppStyleRulesContext"
+               onpopupshowing="return viewer.onPopupShowing('cmdsEditingExtras')">
+      <menuitem id="mnEditCopyFileURI"/>
+      <menuitem id="mnEditViewFileURI"/>
+    </menupopup>
+
+    <menupopup id="ppStylePropsContext"
+               onpopupshowing="viewer.onPopupShowing('cmdsProps')">
+      <menuitem id="mnEditCopy"/>
+      <menuseparator/>
+      <menuitem id="mnEditInsert"/>
+      <menuitem id="mnEditEdit"/>
+      <menuitem id="mnEditDelete"/>
+      <menuseparator/>
+      <menuitem label="&toggleSelectedImportant.label;"
+                command="cmdTogglePriority"/>
+    </menupopup>
+  </popupset>
+
+  <!--============================= CONTENT ============================== -->
+
+  <tree id="olStyleRules" class="plain" flex="1" persist="height"
+        seltype="single" onselect="viewer.onRuleSelect()"
+        contextmenu="ppStyleRulesContext" onfocus="viewer.onTreeFocus(this)">
+    <treecols>
+      <treecol id="olcRule" label="&styleRule.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcFileURL" label="&styleRuleURI.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcLine" label="&styleRuleLineNumber.label;"/>
+    </treecols>
+    <treechildren id="olbStyleRules"
+                  alternatingbackground="true"/>
+  </tree>
+
+  <splitter id="splTrees" collapse="after" persist="state">
+    <grippy/>
+  </splitter>
+
+  <tree id="olStyleProps"
+        class="plain"
+        flex="1"
+        persist="height"
+        onselect="viewer.onPropSelect()"
+        onfocus="viewer.onTreeFocus(this)">
+    <treecols>
+      <treecol id="olcPropPriority" label="&styleRulePropPriority.label;"
+               class="treecol-image"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcPropName" label="&styleRulePropName.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcPropValue" label="&styleRulePropValue.label;" flex="1"/>
+    </treecols>
+    <treechildren id="olbStyleProps"
+                  alternatingbackground="true"
+                  ondblclick="viewer.pane.panelset.execCommand('cmdEditEdit')"/>
+  </tree>
+
+</page>
diff --git a/suite/components/inspector/content/viewers/stylesheets/stylesheets.js b/suite/components/inspector/content/viewers/stylesheets/stylesheets.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/stylesheets/stylesheets.js
@@ -0,0 +1,359 @@
+/* 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/. */
+
+/*****************************************************************************
+* StyleSheetsViewer ----------------------------------------------------------
+*  The viewer for the style sheets loaded by a document.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/utils.js
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://global/content/viewSourceUtils.js
+*   chrome://inspector/content/jsutil/commands/baseCommands.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", StyleSheetsViewer_initialize, false);
+
+function StyleSheetsViewer_initialize()
+{
+  viewer = new StyleSheetsViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class StyleSheetsViewer
+
+function StyleSheetsViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+
+  this.mTree = document.getElementById("olStyleSheets");
+  this.mOlBox = this.mTree.treeBoxObject;
+}
+
+StyleSheetsViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPane: null,
+  mView: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Interface inIViewer
+
+  get uid()
+  {
+    return "stylesheets";
+  },
+
+  get pane()
+  {
+    return this.mPane;
+  },
+
+  get selection()
+  {
+    return this.mSelection;
+  },
+
+  get subject()
+  {
+    return this.mSubject;
+  },
+
+  set subject(aObject)
+  {
+    this.mView = new StyleSheetsView(aObject);
+    this.mOlBox.view = this.mView;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
+    this.mView.selection.select(0);
+  },
+
+  initialize: function SSVr_Initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function SSVr_Destroy()
+  {
+    this.mOlBox.view = null;
+  },
+
+  isCommandEnabled: function SSVr_IsCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCopyFileURI":
+      case "cmdEditViewFileURI":
+      case "cmdEditInspectInNewWindow":
+        return !!this.getSelectedSheet();
+    }
+    return false;
+  },
+
+  getCommand: function SSVr_GetCommand(aCommand)
+  {
+    if (aCommand in window) {
+      return new window[aCommand]();
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function SSVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function SSVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Stuff
+
+  onItemSelected: function SSVr_OnItemSelected()
+  {
+    this.pane.panelset.updateAllCommands();
+
+    var idx = this.mTree.currentIndex;
+    this.mSelection = this.mView.getSheet(idx);
+    this.mObsMan.dispatchEvent("selectionChange",
+                               { selection: this.mSelection });
+  },
+
+  getSelectedSheet: function SSVr_GetSelectedSheet()
+  {
+    if (this.mView.selection.count == 1) {
+      let minAndMax = {};
+      this.mView.selection.getRangeAt(0, minAndMax, minAndMax);
+      return this.mView.getSheet(minAndMax.value);
+    }
+    return null;
+  },
+
+  onPopupShowing: function SRVr_OnPopupShowing(aCommandSetId)
+  {
+    // cmdEditInspectInNewWindow should already be up to date, but we need to
+    // make sure the others are as well.
+    var commandset = document.getElementById(aCommandSetId);
+    for (let i = 0; i < commandset.childNodes.length; i++) {
+      var command = commandset.childNodes[i];
+      if (viewer.isCommandEnabled(command.id)) {
+        command.removeAttribute("disabled");
+      }
+      else {
+        command.setAttribute("disabled", "true");
+      }
+    }
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// StyleSheetsView
+
+function StyleSheetsView(aDocument)
+{
+  this.mDocument = aDocument;
+  this.mSheets = [];
+  this.mLevels = [];
+  this.mOpen = [];
+  this.mChildCount = [];
+  this.mRowCount = 0;
+
+  var ss = aDocument.styleSheets;
+  for (let i = 0; i < ss.length; ++i) {
+    this.insertSheet(ss[i], 0, -1);
+  }
+}
+
+StyleSheetsView.prototype = new inBaseTreeView();
+
+StyleSheetsView.prototype.getSheet =
+function SSV_GetSheet(aRow)
+{
+  return this.mSheets[aRow];
+}
+
+StyleSheetsView.prototype.insertSheet =
+function SSV_InsertSheet(aSheet, aLevel, aRow)
+{
+  var row = aRow < 0 ? this.mSheets.length : aRow;
+
+  this.mSheets[row] = aSheet;
+  this.mLevels[row] = aLevel;
+  this.mOpen[row] = false;
+
+  var count = 0;
+  var rules = aSheet.cssRules;
+  for (let i = 0; i < rules.length; ++i) {
+    if (rules[i].type == CSSRule.IMPORT_RULE) {
+      ++count;
+    }
+  }
+  this.mChildCount[row] = count;
+  ++this.mRowCount;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Interface nsITreeView
+
+StyleSheetsView.prototype.getCellText =
+function SSV_GetCellText(aRow, aCol)
+{
+  var rule = this.mSheets[aRow];
+  if (aCol.id == "olcHref") {
+    if (rule.href) {
+      return rule.href;
+    }
+    // fall back for style elements
+    if (rule.ownerNode && rule.ownerNode.ownerDocument) {
+      return rule.ownerNode.ownerDocument.documentURI;
+    }
+  }
+  else if (aCol.id == "olcRules") {
+    return this.mSheets[aRow].cssRules.length;
+  }
+  return "";
+}
+
+StyleSheetsView.prototype.getLevel =
+function SSV_GetLevel(aRow)
+{
+  return this.mLevels[aRow];
+}
+
+StyleSheetsView.prototype.isContainer =
+function SSV_IsContainer(aRow)
+{
+  return this.mChildCount[aRow] > 0;
+}
+
+StyleSheetsView.prototype.isContainerEmpty =
+function SSV_IsContainerEmpty(aRow)
+{
+  return !this.isContainer(aRow);
+}
+
+StyleSheetsView.prototype.getParentIndex =
+function SSV_GetParentIndex(aRow)
+{
+  var baseLevel = this.mLevels[aRow];
+  for (let i = aRow - 1; i >= 0; --i) {
+    if (this.mLevels[i] < baseLevel) {
+      return i;
+    }
+  }
+  return -1;
+}
+
+StyleSheetsView.prototype.hasNextSibling =
+function SSV_HasNextSibling(aRow, aAfter)
+{
+  var baseLevel = this.mLevels[aRow];
+  for (let i = aAfter + 1; i < this.mRowCount; ++i) {
+    if (this.mLevels[i] < baseLevel) {
+      break;
+    }
+    if (this.mLevels[i] == baseLevel) {
+      return true;
+    }
+  }
+  return false;
+}
+
+StyleSheetsView.prototype.isContainerOpen =
+function SSV_IsContainerOpen(aRow)
+{
+  return this.mOpen[aRow];
+}
+
+StyleSheetsView.prototype.toggleOpenState =
+function SSV_ToggleOpenState(aRow)
+{
+  var changeCount = 0;
+  if (this.mOpen[aRow]) {
+    var baseLevel = this.mLevels[aRow];
+    for (let i = aRow + 1; i < this.mRowCount; ++i) {
+      if (this.mLevels[i] <= baseLevel) {
+        break;
+      }
+      ++changeCount;
+    }
+    // shift data up
+    this.mSheets.splice(aRow + 1, changeCount);
+    this.mLevels.splice(aRow + 1, changeCount);
+    this.mOpen.splice(aRow + 1, changeCount);
+    this.mChildCount.splice(aRow + 1, changeCount);
+    changeCount = -changeCount;
+    this.mRowCount += changeCount;
+  }
+  else {
+    // for quick access
+    var rules = this.mSheets[aRow].cssRules;
+    var level = this.mLevels[aRow] + 1;
+    var childCount = this.mChildCount[aRow];
+    // shift data down
+    for (let i = this.mRowCount - 1; i > aRow; --i) {
+      this.mSheets[i + childCount] = this.mSheets[i];
+      this.mLevels[i + childCount] = this.mLevels[i];
+      this.mOpen[i + childCount] = this.mOpen[i];
+      this.mChildCount[i + childCount] = this.mChildCount[i];
+    }
+    // fill in new rows
+    for (let i = 0; i < rules.length; ++i) {
+      if (rules[i].type == CSSRule.IMPORT_RULE) {
+        ++changeCount;
+        this.insertSheet(rules[i].styleSheet, level, aRow + changeCount);
+      }
+      else if (rules[i].type != CSSRule.CHARSET_RULE) {
+        // only @charset and other @imports may precede @import, so exit now
+        break;
+      }
+    }
+  }
+
+  this.mOpen[aRow] = !this.mOpen[aRow];
+  this.mTree.rowCountChanged(aRow + 1, changeCount);
+  this.mTree.invalidateRow(aRow);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Transactions
+
+function cmdEditInspectInNewWindow()
+{
+  this.mObject = viewer.getSelectedSheet();
+}
+
+cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
+
+function cmdEditCopyFileURI()
+{
+  var sheet = viewer.getSelectedSheet();
+  this.mString = sheet && sheet.href;
+}
+
+cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
+
+function cmdEditViewFileURI()
+{
+  var sheet = viewer.getSelectedSheet();
+  this.mURI = sheet && sheet.href;
+}
+
+cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
diff --git a/suite/components/inspector/content/viewers/stylesheets/stylesheets.xul b/suite/components/inspector/content/viewers/stylesheets/stylesheets.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/stylesheets/stylesheets.xul
@@ -0,0 +1,61 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/stylesheets.dtd"> %dtd2;
+]>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<page id="winStylesheets"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://global/content/viewSourceUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/stylesheets/stylesheets.js"/>
+
+  <commandset id="cmdsEditingExtras"/>
+
+  <popupset id="psPopups">
+    <menupopup id="ppStyleSheetsContext"
+               onpopupshowing="viewer.onPopupShowing('cmdsEditingExtras');">
+      <menuitem id="mnEditInspectInNewWindow"/>
+      <menuseparator/>
+      <menuitem id="mnEditCopyFileURI"/>
+      <menuitem id="mnEditViewFileURI"/>
+    </menupopup>
+  </popupset>
+
+  <tree id="olStyleSheets" class="plain" treelines="true" flex="1"
+        seltype="single" onselect="viewer.onItemSelected()"
+        context="ppStyleSheetsContext">
+    <treecols>
+      <treecol id="olcHref" label="&sheetLocation.label;" primary="true"
+               persist="width,hidden,ordinal" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcRules" label="&sheetRules.label;"
+               persist="width,hidden,ordinal" style="width: 4em"/>
+    </treecols>
+    <treechildren id="olbStyleSheets"
+                  alternatingbackground="true"/>
+  </tree>
+</page>
diff --git a/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.js b/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.js
@@ -0,0 +1,229 @@
+/* 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/. */
+
+/*****************************************************************************
+* UsedFontFacesViewer --------------------------------------------------------
+*  The viewer for the font faces used for a DOM node.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*   chrome://inspector/content/events/ObserverManager.js
+*   chrome://inspector/content/commands/baseCommands.js
+*   chrome://inspector/content/system/clipboardFlavors.js
+*   chrome://inspector/content/xul/inBaseTreeView.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", UsedFontFacesViewer_initialize, false);
+
+function UsedFontFacesViewer_initialize()
+{
+  viewer = new UsedFontFacesViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// class UsedFontFacesViewer
+
+function UsedFontFacesViewer()
+{
+  this.mObsMan = new ObserverManager(this);
+
+  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1",
+                                   "inIDOMUtils");
+
+  this.mTree = document.getElementById("olFonts");
+}
+
+UsedFontFacesViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPane: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// interface inIViewer
+
+  get uid()
+  {
+    return "usedFontFaces";
+  },
+
+  get pane()
+  {
+    return this.mPane;
+  },
+
+  get subject()
+  {
+    return this.mSubject;
+  },
+
+  set subject(aObject)
+  {
+    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
+      aObject : aObject.DOMNode;
+    this.mTreeView = new UsedFontFacesView(this.mSubject);
+    this.mTree.view = this.mTreeView;
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  initialize: function UFFVr_Initialize(aPane)
+  {
+    this.mPane = aPane;
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function UFFVr_Destroy()
+  {
+    // We need to remove the view at this time or else it will attempt to
+    // re-paint while the document is being deconstructed, resulting in some
+    // nasty XPConnect assertions
+    this.mTree.view = null;
+  },
+
+  isCommandEnabled: function UFFVr_IsCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      // ppUsedFontFacesContext
+      case "cmdEditCopy":
+        return this.mTree.view.selection.count > 0;
+      case "cmdEditCopyFileURI":
+        return this.mTreeView.getSelectedRowObjects()
+                             .some(function(aFont) { return !!aFont.URI; });
+    }
+    return false;
+  },
+
+  getCommand: function UFFVr_GetCommand(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCopy":
+        return new cmdEditCopy(this.mTreeView.getSelectedRowObjects());
+      case "cmdEditCopyFileURI":
+        return new cmdEditCopyFileURI(this.mTreeView.getSelectedRowObjects());
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// event dispatching
+
+  addObserver: function UFFVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function UFFVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Miscellaneous
+
+  onItemSelected: function UFFVr_OnItemSelected()
+  {
+    // This will (eventually) call isCommandEnabled on Copy
+    viewer.pane.panelset.updateAllCommands();
+  },
+
+  onPopupShowing: function UFFVr_OnPopupShowing(aCommandSetId)
+  {
+    var commandset = document.getElementById(aCommandSetId);
+    for (let i = 0; i < commandset.childNodes.length; i++) {
+      var command = commandset.childNodes[i];
+      command.setAttribute("disabled", !viewer.isCommandEnabled(command.id));
+    }
+  }
+};
+
+////////////////////////////////////////////////////////////////////////////
+//// UsedFontFacesView
+
+function UsedFontFacesView(aObject)
+{
+  // XXX Can't create a range for a DocumentType object
+  if (aObject instanceof Components.interfaces.nsIDOMDocumentType) {
+    this.mFontList = [];
+    this.mRowCount = 0;
+  }
+  else {
+    var range = (aObject.ownerDocument || aObject).createRange();
+    range.selectNodeContents(aObject);
+    this.mFontList = viewer.mDOMUtils.getUsedFontFaces(range);
+    this.mRowCount = this.mFontList.length;
+  }
+}
+
+UsedFontFacesView.prototype = new inBaseTreeView();
+
+UsedFontFacesView.prototype.getCellText = function UFFV_GetCellText(aRow, aCol)
+{
+  var font = this.mFontList.item(aRow);
+  if (aCol.id == "olcFontName") {
+    return font.name;
+  }
+  else if (aCol.id == "olcCSSFamilyName") {
+    return font.CSSFamilyName;
+  }
+  else if (aCol.id == "olcURI") {
+    return font.URI;
+  }
+  else if (aCol.id == "olcLocalName") {
+    return font.localName;
+  }
+  else if (aCol.id == "olcFormat") {
+    return font.format;
+  }
+
+  return null;
+};
+
+/**
+  * Returns a FontFace for the row in the tree corresponding to the passed
+  * index.
+  * @param aIndex
+  *        index of the row in the tree
+  * @return a FontFace
+  */
+UsedFontFacesView.prototype.getRowObjectFromIndex =
+  function UFFV_GetRowObjectFromIndex(aIndex)
+{
+  return this.mFontList.item(aIndex);
+};
+
+/**
+ * Copy the names of fonts onto the clipboard.
+ * @param aFonts
+ *        The font faces whose names should be copied.
+ */
+function cmdEditCopy(aFonts)
+{
+  this.mString = aFonts.map(function(aFont) { return aFont.name; }).join("\n");
+}
+
+cmdEditCopy.prototype = new cmdEditCopySimpleStringBase();
+
+/**
+ * Copy the URIs for downloaded fonts onto the clipboard.
+ * @param aFonts
+ *        The font faces whose URIs should be copied.
+ */
+function cmdEditCopyFileURI(aFonts)
+{
+  this.mString = aFonts.map(function(aFont) { return aFont.URI; })
+                       .filter(function(aURI) { return !!aURI; })
+                       .join("\n");
+}
+
+cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
diff --git a/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.xul b/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/usedFontFaces/usedFontFaces.xul
@@ -0,0 +1,68 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE page [
+  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
+  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/usedFontFaces.dtd"> %dtd2;
+]>
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet href="chrome://inspector/skin/"?>
+
+<page id="winUsedFontFaces"
+      orient="vertical"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <!--============================= SCRIPTS ============================= -->
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/usedFontFaces/usedFontFaces.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
+
+  <!--============================ COMMANDS ============================= -->
+
+  <commandset id="cmdsEditing"/>
+  <commandset id="cmdsEditingExtras"/>
+
+  <!--============================= POPUPS ============================== -->
+
+  <popupset id="psPopups">
+    <menupopup id="ppUsedFontFacesContext"
+               onpopupshowing="return viewer.onPopupShowing('cmdsEditingExtras')">
+      <menuitem id="mnEditCopy"/>
+      <menuitem id="mnEditCopyFileURI"/>
+    </menupopup>
+  </popupset>
+
+  <!--============================= CONTENT ============================== -->
+
+  <tree id="olFonts" flex="1" onselect="viewer.onItemSelected()"
+        class="plain" contextmenu="ppUsedFontFacesContext">
+    <treecols>
+      <treecol id="olcFontName" label="&fontName.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcCSSFamilyName" label="&cssFamilyName.label;" flex="1"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcURI" label="&uri.label;" flex="1" hidden="true"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcLocalName" label="&localName.label;" flex="1" hidden="true"/>
+      <splitter class="tree-splitter"/>
+      <treecol id="olcFormat" label="&format.label;" flex="1" hidden="true"/>
+    </treecols>
+    <treechildren id="olbFonts" alternatingbackground="true"/>
+  </tree>
+</page>
diff --git a/suite/components/inspector/content/viewers/xblBindings/xblBindings.js b/suite/components/inspector/content/viewers/xblBindings/xblBindings.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/xblBindings/xblBindings.js
@@ -0,0 +1,730 @@
+/* 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/. */
+
+/*****************************************************************************
+* XBLBindingsViewer ----------------------------------------------------------
+*  Inspects the XBL bindings for a given element, including anonymous content,
+*  methods, properties, event handlers, and resources.
+* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+* REQUIRED IMPORTS:
+*   chrome://inspector/content/jsutil/xpcom/XPCU.js
+*****************************************************************************/
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Variables
+
+var viewer;
+
+//////////////////////////////////////////////////////////////////////////////
+//// Global Constants
+
+const kDOMViewContractID = "@mozilla.org/inspector/dom-view;1";
+const kDOMUtilsContractID = "@mozilla.org/inspector/dom-utils;1";
+const kXBLNSURI = "http://www.mozilla.org/xbl";
+
+//////////////////////////////////////////////////////////////////////////////
+
+window.addEventListener("load", XBLBindingsViewer_initialize, false);
+
+function XBLBindingsViewer_initialize()
+{
+  viewer = new XBLBindingsViewer();
+  viewer.initialize(parent.FrameExchange.receiveData(window));
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// Class XBLBindingsViewer
+
+function XBLBindingsViewer()
+{
+  this.mURL = window.location;
+  this.mObsMan = new ObserverManager(this);
+  this.mDOMUtils = XPCU.getService(kDOMUtilsContractID, "inIDOMUtils");
+
+  this.mBindingsList = document.getElementById("mlBindings");
+
+  this.mContentTree = document.getElementById("olContent");
+  this.mMethodTree = document.getElementById("olMethods");
+  this.mPropTree = document.getElementById("olProps");
+  this.mHandlerTree = document.getElementById("olHandlers");
+  this.mResourceTree = document.getElementById("olResources");
+
+  this.mTreeViews = {};
+
+  this.generateViewGetterAndSetter("contentView", this.mContentTree);
+  this.generateViewGetterAndSetter("methodView", this.mMethodTree);
+  this.generateViewGetterAndSetter("propView", this.mPropTree);
+  this.generateViewGetterAndSetter("handlerView", this.mHandlerTree);
+  this.generateViewGetterAndSetter("resourceView", this.mResourceTree);
+
+  this.mControllers = {};
+
+  this.addController(this.mBindingsList, BindingsListController);
+  this.addController(this.mResourceTree, ResourceTreeController);
+
+  // prepare and attach the content DOM datasource
+  var contentView = XPCU.createInstance(kDOMViewContractID, "inIDOMView");
+  contentView.whatToShow &= ~(NodeFilter.SHOW_TEXT);
+  XPCU.QI(contentView, "nsITreeView");
+  this.contentView = contentView;
+}
+
+XBLBindingsViewer.prototype =
+{
+  ////////////////////////////////////////////////////////////////////////////
+  //// Initialization
+
+  mSubject: null,
+  mPane: null,
+  mControllers: null,
+  mTreeViews: null,
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Interface inIViewer
+
+  get uid()
+  {
+    return "xblBindings";
+  },
+
+  get pane()
+  {
+    return this.mPane;
+  },
+
+  get subject()
+  {
+    return this.mSubject;
+  },
+
+  set subject(aObject)
+  {
+    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
+      aObject : aObject.DOMNode;
+
+    this.populateBindings();
+
+    this.displayBinding(this.mBindingsList.value);
+
+    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
+  },
+
+  initialize: function XBLBVr_Initialize(aPane)
+  {
+    this.mPane = aPane;
+
+    aPane.notifyViewerReady(this);
+  },
+
+  destroy: function XBLBVr_Destroy()
+  {
+    this.contentView = null;
+    this.methodView = null;
+    this.propView = null;
+    this.handlerView = null;
+    this.resourceView = null;
+  },
+
+  isCommandEnabled: function XBLBVr_IsCommandEnabled(aCommand)
+  {
+    var controller =
+      document.commandDispatcher.getControllerForCommand(aCommand);
+    return !!controller && controller.isCommandEnabled(aCommand);
+  },
+
+  getCommand: function XBLBVr_GetCommand(aCommand)
+  {
+    var controller =
+      this.mControllers[document.commandDispatcher.focusedElement.id];
+    if (controller) {
+      return controller.getCommand(aCommand);
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Event Dispatching
+
+  addObserver: function XBLBVr_AddObserver(aEvent, aObserver)
+  {
+    this.mObsMan.addObserver(aEvent, aObserver);
+  },
+
+  removeObserver: function XBLBVr_RemoveObserver(aEvent, aObserver)
+  {
+    this.mObsMan.removeObserver(aEvent, aObserver);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Displaying Binding Info
+
+  populateBindings: function XBLBVr_PopulateBindings()
+  {
+    var urls = this.mDOMUtils.getBindingURLs(this.mSubject);
+
+    this.mBindingsList.removeAllItems();
+
+    for (let i = 0, n = urls.length; i < n; ++i) {
+      var url = urls.queryElementAt(i, Components.interfaces.nsIURI).spec;
+      var currentItem = this.mBindingsList.appendItem(url, url);
+      currentItem.crop = "center";
+      currentItem.tooltipText = url;
+    }
+
+    this.mBindingsList.selectedIndex = 0;
+  },
+
+  displayBinding: function XBLBVr_DisplayBinding(aURL)
+  {
+    this.mBindingsList.tooltipText = aURL;
+    this.mBindingURL = aURL;
+    if (aURL) {
+      var req = new XMLHttpRequest();
+      req.addEventListener("load", gDocLoadListener, true);
+      req.open("GET", aURL);
+      req.overrideMimeType("application/xml");
+      req.send(null);
+    }
+    else {
+      this.doDisplayBinding(null);
+    }
+  },
+
+  doDisplayBinding: function XBLBVr_DoDisplayBinding(doc)
+  {
+    if (doc) {
+      var url = this.mBindingURL;
+      var poundPt = url.indexOf("#");
+      var id = url.substr(poundPt + 1);
+      var bindings = doc.getElementsByTagNameNS(kXBLNSURI, "binding");
+      var binding = null;
+      for (var i = 0; i < bindings.length; ++i) {
+        if (bindings[i].getAttribute("id") == id) {
+          binding = bindings[i];
+          break;
+        }
+      }
+      this.mBinding = binding;
+    }
+    else {
+      this.mBinding = null;
+    }
+
+    this.displayContent();
+    this.displayMethods();
+    this.displayProperties();
+    this.displayHandlers();
+    this.displayResources();
+
+    // switch to the first non-disabled tab if the one that's showing is
+    // disabled, otherwise, you can't use the keyboard to switch tabs
+    var tabbox = document.getElementById("bxBindingAspects");
+    if (tabbox.selectedTab.disabled) {
+      for (let i = 0; i < tabbox.tabs.childNodes.length; ++i) {
+         if (!tabbox.tabs.childNodes[i].disabled) {
+           tabbox.selectedTab = tabbox.tabs.childNodes[i];
+           break;
+         }
+      }
+    }
+
+    this.mBindingsList.disabled = !this.mBinding;
+  },
+
+  displayContent: function XBLBVr_DisplayContent()
+  {
+    this.contentView.rootNode = this.mBinding &&
+      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "content").item(0);
+    this.mContentTree.disabled = !this.contentView.rootNode;
+    document.getElementById("tbContent").disabled =
+      !this.contentView.rootNode;
+    if (this.contentView.rootNode) {
+      this.contentView.selection.select(0);
+    }
+  },
+
+  displayMethods: function XBLBVr_DisplayMethods()
+  {
+    this.methodView =
+      this.mBinding ? new MethodTreeView(this.mBinding) : null;
+
+    var active = this.mBinding &&
+      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "method").length > 0;
+    this.mMethodTree.disabled = !active;
+    document.getElementById("tbMethods").disabled = !active;
+    if (active && this.methodView.rowCount) {
+      this.methodView.selection.select(0);
+    }
+  },
+
+  displayProperties: function XBLBVr_DisplayProperties()
+  {
+    this.propView =
+      this.mBinding ? new PropTreeView(this.mBinding) : null;
+
+    var active = this.mBinding &&
+      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "property").length > 0;
+    this.mPropTree.disabled = !active;
+    document.getElementById("tbProps").disabled = !active;
+    if (active && this.propView.rowCount) {
+      this.propView.selection.select(0);
+    }
+  },
+
+  displayHandlers: function XBLBVr_DisplayHandlers()
+  {
+    this.handlerView =
+      this.mBinding ? new HandlerTreeView(this.mBinding) : null;
+
+    var active = this.mBinding &&
+      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "handler").length > 0;
+    this.mHandlerTree.disabled = !active;
+    document.getElementById("tbHandlers").disabled = !active;
+    if (active && this.handlerView.rowCount) {
+      this.handlerView.selection.select(0);
+    }
+  },
+
+  displayResources: function XBLBVr_DisplayResources()
+  {
+    this.resourceView =
+      this.mBinding ? new ResourceTreeView(this.mBinding) : null;
+
+    var active = this.mBinding &&
+      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "resources").length > 0;
+    document.getElementById("tbResources").disabled = !active;
+    this.mResourceTree.disabled = !active;
+  },
+
+  displayMethod: function XBLBVr_DisplayMethod(aMethod)
+  {
+    var body = aMethod.getElementsByTagNameNS(kXBLNSURI, "body").item(0);
+    document.getElementById("txbMethodCode").value = 
+      this.justifySource(this.readDOMText(body));
+  },
+
+  displayProperty: function XBLBVr_DisplayProperty(aProp)
+  {
+    var rgroup = document.getElementById("rgPropGetterSetter");
+    var getradio = document.getElementById("raPropGetter");
+    var setradio = document.getElementById("raPropSetter");
+
+    // disable/enable radio buttons
+    getradio.disabled =
+      !aProp || !(aProp.hasAttribute("onget") ||
+                  aProp.getElementsByTagName("getter").length);
+    setradio.disabled =
+      !aProp || !(aProp.hasAttribute("onset") ||
+                  aProp.getElementsByTagName("setter").length);
+
+    // make sure a valid radio button is selected
+    if (rgroup.selectedIndex < 0) {
+      rgroup.selectedIndex = 0;
+    }
+    if (rgroup.selectedItem.disabled) {
+      var other = rgroup.getItemAtIndex((rgroup.selectedIndex + 1) % 2);
+      if (!other.disabled) {
+        rgroup.selectedItem = other;
+      }
+    }
+
+    // display text
+    var et = rgroup.value;
+    var text = "";
+    if (et && aProp) {
+      text = aProp.getAttribute("on" + et);
+      if (!text) {
+        let kids = aProp.getElementsByTagNameNS(kXBLNSURI, et + "ter");
+        text = this.readDOMText(kids.item(0));
+      }
+    }
+    document.getElementById("txbPropCode").value = this.justifySource(text);
+  },
+
+  displayHandler: function XBLBVr_DisplayHandler(aHandler)
+  {
+    var text = "";
+    if (aHandler) {
+      text = aHandler.getAttribute("action") || this.readDOMText(aHandler);
+    }
+    document.getElementById("txbHandlerCode").value =
+      this.justifySource(text);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Selection
+
+  onMethodSelected: function XBLBVr_OnMethodSelected()
+  {
+    var idx = this.mMethodTree.currentIndex;
+    var methods = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "method");
+    var method = methods[idx];
+    this.displayMethod(method);
+  },
+
+  onPropSelected: function XBLBVr_OnPropSelected()
+  {
+    var idx = this.mPropTree.currentIndex;
+    var props = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "property");
+    var prop = props[idx];
+    this.displayProperty(prop);
+  },
+
+  onHandlerSelected: function XBLBVr_OnHandlerSelected()
+  {
+    var idx = this.mHandlerTree.currentIndex;
+    var handlers = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "handler");
+    var handler = handlers[idx];
+    this.displayHandler(handler);
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// Misc
+
+  /**
+   * Generates getter and setter methods for property named by the given
+   * identifier.  The setter will set the tree's view and cache it.  The
+   * getter will recall the cached view.
+   * @param aIdentifier
+   *        The name of the property where the getter and setter should live.
+   * @param aTree
+   *        The tree whose view should be set in the setter.
+   */
+  generateViewGetterAndSetter:
+    function XBLBVr_GenerateViewGetterAndSetter(aIdentifier, aTree)
+  {
+    this.__defineSetter__(aIdentifier, function(aVal)
+      {
+	aTree.view = aVal;
+	return this.mTreeViews[aIdentifier] = aVal;
+      });
+    this.__defineGetter__(aIdentifier, function()
+      {
+	return this.mTreeViews[aIdentifier];
+      });
+  },
+
+  /**
+   * Creates a controller, registers it with this viewer, and appends it to
+   * the controllers of the given element.
+   * @param aEl
+   *        The element to which we should add the controller.  aEl.id must be
+   *        non-empty.
+   * @param aControllerConstructor
+   *        A constructor function whose instances will implement
+   *        nsIController.  aEl will be passed as the first parameter during
+   *        construction.
+   */
+  addController: function XBLBVr_AddController(aEl, aControllerConstructor) {
+    var controller = new aControllerConstructor(aEl);
+    this.mControllers[aEl.id] = controller;
+    aEl.controllers.appendController(controller);
+  },
+
+
+  onPopupShowing: function XBLBVr_OnPopupShowing(aPopup)
+  {
+    var kids = aPopup.childNodes;
+    for (let i = 0, n = kids.length; i < n; ++i) {
+      let command = document.getElementById(kids[i].command);
+      if (this.isCommandEnabled(command.id)) {
+        command.removeAttribute("disabled");
+      }
+      else {
+        command.setAttribute("disabled", "true");
+      }
+    }
+  },
+
+  readDOMText: function XBLBVr_ReadDOMText(aEl)
+  {
+    if (!aEl) {
+      return "";
+    }
+
+    var text = aEl.nodeValue || "";
+    for (var i = 0; i < aEl.childNodes.length; ++i) {
+      text += this.readDOMText(aEl.childNodes[i]);
+    }
+    return text;
+  },
+
+  // Remove newlines at the beginning of the string and the lowest level of
+  // indentation from the beginning of each line, since most XBL getters,
+  // setters, methods, and handlers are handwritten CDATA.
+  justifySource: function XBLBVr_JustifySource(aStr)
+  {
+    // convert indentation to use spaces
+    while (/^ *\t/m.test(aStr)) {
+      aStr = aStr.replace(/^((        )*) {0,7}\t/gm, "$1        ");
+    }
+    // remove trailing spaces from all lines
+    aStr = aStr.replace(/ +$/gm, "");
+    // lose the trailing blank lines
+    aStr = aStr.replace(/\n*$/, "");
+    // lose the initial blank lines
+    aStr = aStr.replace(/^\n*/, "");
+    // now check if, for some crazy reason, there are lines in the rest of the
+    // source at a lower indentation level than the first line
+    var indentations = aStr.match(/^ *(?=[^\n])/gm);
+    if (indentations) {
+      indentations.sort();
+      if (indentations[0]) {
+        aStr = aStr.replace(RegExp("^" + indentations[0], "gm"), "");
+      }
+    }
+    return aStr;
+  }
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Controllers
+
+function BindingsListController(aBindingsList) {}
+
+BindingsListController.prototype = {
+
+  commands: {
+    cmdEditCopyFileURI: function BLC_CopyFileURI()
+    {
+      this.mString = document.popupNode.value;
+    },
+
+    cmdEditViewFileURI: function BLC_ViewFileURI()
+    {
+      this.mURI = document.popupNode.value;
+    }
+  },
+
+  getCommand: function BLC_GetCommand(aCommand)
+  {
+    if (this.supportsCommand(aCommand)) {
+      return new this.commands[aCommand]();
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// nsIController Implementation
+
+  isCommandEnabled: function BLC_IsCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCopyFileURI":
+      case "cmdEditViewFileURI":
+        return !!document.popupNode.value;
+    }
+    return false;
+  },
+
+  supportsCommand: function BLC_SupportsCommand(aCommand)
+  {
+    return aCommand in this.commands;
+  },
+
+  doCommand: function BLC_DoCommand(aCommand) {},
+
+  onEvent: function BLC_OnEvent(aEvent) {}
+}
+
+let commands = BindingsListController.prototype.commands;
+commands.cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
+commands.cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
+
+function ResourceTreeController(aTree) {}
+
+ResourceTreeController.prototype = {
+
+  commands: {
+    cmdEditCopyFileURI: function RTC_CopyFileURI()
+    {
+      this.mString = viewer.resourceView.getSelectedResourceURI();
+    },
+  
+    cmdEditViewFileURI: function RTC_ViewFileURI()
+    {
+      this.mURI = viewer.resourceView.getSelectedResourceURI();
+    }
+  },
+
+  getCommand: function RTC_GetCommand(aCommand)
+  {
+    if (this.supportsCommand(aCommand)) {
+      return new this.commands[aCommand]();
+    }
+    return null;
+  },
+
+  ////////////////////////////////////////////////////////////////////////////
+  //// nsIController Implementation
+
+  isCommandEnabled: function RTC_IsCommandEnabled(aCommand)
+  {
+    switch (aCommand) {
+      case "cmdEditCopyFileURI":
+        return !!viewer.resourceView.getSelectedResourceURI();
+      case "cmdEditViewFileURI":
+        return !!viewer.resourceView.getSelectedResourceURI() &&
+               viewer.resourceView.getSelectedResourceType() != "image";
+    }
+    return false;
+  },
+
+  supportsCommand: function RTC_SupportsCommand(aCommand)
+  {
+    return aCommand in this.commands;
+  },
+
+  doCommand: function RTC_DoCommand(aCommand) {},
+
+  onEvent: function RTC_OnEvent(aEvent) {}
+}
+
+commands = ResourceTreeController.prototype.commands;
+commands.cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
+commands.cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
+
+//////////////////////////////////////////////////////////////////////////////
+//// MethodTreeView
+
+function MethodTreeView(aBinding)
+{
+  this.mMethods = aBinding.getElementsByTagNameNS(kXBLNSURI, "method");
+  this.mRowCount = this.mMethods ? this.mMethods.length : 0;
+}
+
+MethodTreeView.prototype = new inBaseTreeView();
+
+MethodTreeView.prototype.getCellText =
+function MTV_GetCellText(aRow, aCol)
+{
+  if (aCol.id == "olcMethodName") {
+    var method = this.mMethods[aRow];
+    var name = method.getAttribute("name");
+    var params = method.getElementsByTagNameNS(kXBLNSURI, "parameter");
+    var pstr = "";
+    if (params.length) {
+      pstr += params[0].getAttribute("name");
+    }
+    for (var i = 1; i < params.length; ++i) {
+      pstr += ", " + params[i].getAttribute("name");
+    }
+    return name + "(" + pstr + ")";
+  }
+
+  return "";
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// PropTreeView
+
+function PropTreeView(aBinding)
+{
+  this.mProps = aBinding.getElementsByTagNameNS(kXBLNSURI, "property");
+  this.mRowCount = this.mProps ? this.mProps.length : 0;
+}
+
+PropTreeView.prototype = new inBaseTreeView();
+
+PropTreeView.prototype.getCellText =
+function PTV_GetCellText(aRow, aCol)
+{
+  if (aCol.id == "olcPropName") {
+    return this.mProps[aRow].getAttribute("name");
+  }
+
+  return "";
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// HandlerTreeView
+
+function HandlerTreeView(aBinding)
+{
+  this.mHandlers = aBinding.getElementsByTagNameNS(kXBLNSURI, "handler");
+  this.mRowCount = this.mHandlers ? this.mHandlers.length : 0;
+}
+
+HandlerTreeView.prototype = new inBaseTreeView();
+
+HandlerTreeView.prototype.getCellText =
+function HTV_GetCellText(aRow, aCol)
+{
+  var handler = this.mHandlers[aRow];
+  if (aCol.id == "olcHandlerEvent") {
+    return handler.getAttribute("event");
+  }
+  else if (aCol.id == "olcHandlerPhase") {
+    return handler.getAttribute("phase");
+  }
+
+  return "";
+}
+
+//////////////////////////////////////////////////////////////////////////////
+//// ResourceTreeView
+
+function ResourceTreeView(aBinding)
+{
+  this.mResources = [];
+  var res = aBinding.getElementsByTagNameNS(kXBLNSURI, "resources").item(0);
+  if (res) {
+    var kids = res.childNodes;
+    for (var i = 0; i < kids.length; ++i) {
+      if (kids[i].nodeType == Node.ELEMENT_NODE) {
+        this.mResources.push(kids[i]);
+      }
+    }
+  }
+
+  this.mRowCount = this.mResources.length;
+
+  this.wrappedJSObject = this;
+}
+
+ResourceTreeView.prototype = new inBaseTreeView();
+
+ResourceTreeView.prototype.getCellText =
+function RTV_GetCellText(aRow, aCol)
+{
+  var resource = this.mResources[aRow];
+  if (aCol.id == "olcResourceType") {
+    return resource.localName;
+  }
+  else if (aCol.id == "olcResourceSrc") {
+    return resource.getAttribute("src");
+  }
+
+  return "";
+}
+
+ResourceTreeView.prototype.getSelectedResourceURI =
+  function RTV_GetSelectedResourceURI()
+{
+  if (this.selection.count == 1) {
+    let minAndMax = {};
+    this.selection.getRangeAt(0, minAndMax, minAndMax);
+    return this.mResources[minAndMax.value].getAttribute("src");
+  }
+  return null;
+};
+
+ResourceTreeView.prototype.getSelectedResourceType =
+  function RTV_GetSelectedResourceType()
+{
+  if (this.selection.count == 1) {
+    let minAndMax = {};
+    this.selection.getRangeAt(0, minAndMax, minAndMax);
+    return this.mResources[minAndMax.value].localName;
+  }
+  return null;
+};
+
+//////////////////////////////////////////////////////////////////////////////
+//// Event Listeners
+
+function gDocLoadListener(event)
+{
+  viewer.doDisplayBinding(event.target.responseXML);
+}
diff --git a/suite/components/inspector/content/viewers/xblBindings/xblBindings.xul b/suite/components/inspector/content/viewers/xblBindings/xblBindings.xul
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/content/viewers/xblBindings/xblBindings.xul
@@ -0,0 +1,167 @@
+<?xml version="1.0"?>
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+   - License, v. 2.0. If a copy of the MPL was not distributed with this
+   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<!DOCTYPE page SYSTEM "chrome://inspector/locale/viewers/xblBindings.dtd">
+
+<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
+
+<?xml-stylesheet
+    href="chrome://inspector/skin/viewers/xblBindings/xblBindings.css"?>
+
+<page id="winXBLBindings"
+      orient="vertical"
+      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/utils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/hooks.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
+  <script type="application/javascript"
+          src="chrome://global/content/viewSourceUtils.js"/>
+  <script type="application/javascript"
+          src="chrome://inspector/content/viewers/xblBindings/xblBindings.js"/>
+
+  <commandset id="cmdsEditingExtras"/>
+
+  <popupset id="psPopups">
+    <!-- Just split this if it's ever at all specialized. -->
+    <menupopup id="ppSharedContext"
+               onpopupshowing="viewer.onPopupShowing(this);">
+      <menuitem id="mnEditCopyFileURI"/>
+      <menuitem id="mnEditViewFileURI"/>
+    </menupopup>
+  </popupset>
+
+  <menulist id="mlBindings" oncommand="viewer.displayBinding(this.value)"
+            crop="center" contextmenu="ppSharedContext">
+    <menupopup id="mpBindings"/>
+  </menulist>
+
+  <tabbox id="bxBindingAspects" flex="1">
+    <tabs>
+      <tab id="tbContent" label="&bindingContent.label;"
+           disabled="true"/>
+      <tab id="tbMethods" label="&bindingMethods.label;"
+           disabled="true"/>
+      <tab id="tbProps" label="&bindingProperties.label;"
+           disabled="true"/>
+      <tab id="tbHandlers" label="&bindingHandlers.label;"
+           disabled="true"/>
+      <tab id="tbResources" label="&bindingResources.label;"
+           disabled="true"/>
+    </tabs>
+    <tabpanels flex="1">
+      <tree id="olContent" seltype="single" treelines="true">
+        <treecols>
+          <!-- Don't localize these DOM API names -->
+          <treecol id="colNodeName" primary="true" label="nodeName" flex="1"/>
+          <splitter class="tree-splitter"/>
+          <treecol id="colNodeValue" label="nodeValue" flex="1"/>
+        </treecols>
+        <treechildren id="olbContent"/>
+      </tree>
+
+      <vbox>
+        <tree id="olMethods" seltype="single"
+              hidecolumnpicker="true"
+              flex="1"
+              onselect="viewer.onMethodSelected()"
+              persist="height">
+          <treecols>
+            <treecol id="olcMethodName" label="&bindingMethodName.label;"
+                     flex="1"/>
+          </treecols>
+          <treechildren id="olbMethods" alternatingbackground="true"/>
+        </tree>
+        <splitter id="splMethods" orient="vertical" collapse="after"
+                  persist="state">
+          <grippy/>
+        </splitter>
+        <groupbox id="gbMethods" flex="1" persist="height">
+          <caption label="Source Code"/>
+          <textbox id="txbMethodCode" readonly="true" multiline="true"
+                   flex="1"/>
+        </groupbox>
+      </vbox>
+
+      <vbox>
+        <vbox id="bxProps" flex="1" persist="height">
+          <tree id="olProps" seltype="single"
+                hidecolumnpicker="true"
+                flex="1"
+                onselect="viewer.onPropSelected()">
+            <treecols>
+              <treecol id="olcPropName" label="&bindingProperty.label;"
+                       flex="1"/>
+            </treecols>
+            <treechildren id="olbProps" alternatingbackground="true"/>
+          </tree>
+          <radiogroup id="rgPropGetterSetter" orient="horizontal">
+            <radio id="raPropGetter" label="&bindingGetter.label;"
+                   value="get" oncommand="viewer.onPropSelected()"
+                   selected="true"/>
+            <radio id="raPropSetter" label="&bindingSetter.label;"
+                   value="set" oncommand="viewer.onPropSelected()"/>
+          </radiogroup>
+        </vbox>
+        <splitter id="splProps" orient="vertical" collapse="after"
+                  persist="state">
+          <grippy/>
+        </splitter>
+        <groupbox id="gbProps" flex="1" persist="height">
+          <caption label="Source Code"/>
+          <textbox id="txbPropCode" readonly="true" multiline="true"
+                   flex="1"/>
+        </groupbox>
+      </vbox>
+
+      <vbox>
+        <tree id="olHandlers" seltype="single"
+              flex="1"
+              onselect="viewer.onHandlerSelected()"
+              persist="height">
+          <treecols>
+            <treecol id="olcHandlerEvent" label="&bindingHandlerEvent.label;"
+                     flex="1"/>
+            <splitter class="tree-splitter"/>
+            <treecol id="olcHandlerPhase"
+                     label="&bindingHandlerPhase.label;"/>
+          </treecols>
+          <treechildren id="olbHandlers" alternatingbackground="true"/>
+        </tree>
+        <splitter id="splHandlers" orient="vertical" collapse="after"
+                  persist="state">
+          <grippy/>
+        </splitter>
+        <groupbox id="gbHandlers" flex="1" persist="height">
+          <caption label="Source Code"/>
+          <textbox id="txbHandlerCode" readonly="true" multiline="true"
+                   flex="1"/>
+        </groupbox>
+      </vbox>
+
+      <tree id="olResources" seltype="single"
+            contextmenu="ppSharedContext">
+        <treecols>
+          <treecol id="olcResourceType" label="&bindingResourceType.label;"
+                   flex="1"/>
+          <splitter class="tree-splitter"/>
+          <treecol id="olcResourceSrc" label="&bindingResourceSrc.label;"
+                   flex="2"/>
+        </treecols>
+        <treechildren id="olbResources" alternatingbackground="true"/>
+      </tree>
+    </tabpanels>
+  </tabbox>
+</page>
diff --git a/suite/components/inspector/inspector-cmdline.js b/suite/components/inspector/inspector-cmdline.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/inspector-cmdline.js
@@ -0,0 +1,49 @@
+/* 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/. */
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler;
+const nsISupportsString     = Components.interfaces.nsISupportsString;
+const nsIWindowWatcher      = Components.interfaces.nsIWindowWatcher;
+
+function InspectorCmdLineHandler() {}
+InspectorCmdLineHandler.prototype =
+{
+  classDescription: "DOM Inspector Command Line Handler",
+  classID: Components.ID("{38293526-6b13-4d4f-a075-71939435b408}"),
+  contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=inspector",
+
+  /* nsISupports */
+  QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler]),
+
+  /* nsICommandLineHandler */
+  handle : function handler_handle(cmdLine) {
+    var args = Components.classes["@mozilla.org/supports-string;1"]
+                         .createInstance(nsISupportsString);
+    try {
+      var uristr = cmdLine.handleFlagWithParam("inspector", false);
+      if (uristr == null)
+        return;
+      try {
+        args.data = cmdLine.resolveURI(uristr).spec;
+      }
+      catch (e) {
+        return;
+      }
+    }
+    catch (e) {
+      cmdLine.handleFlag("inspector", true);
+    }
+
+    var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
+                           .getService(nsIWindowWatcher);
+    wwatch.openWindow(null, "chrome://inspector/content/", "_blank",
+                      "chrome,dialog=no,all", args);
+  },
+
+  helpInfo : "  -inspector <url>     Open the DOM inspector.\n"
+};
+
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([InspectorCmdLineHandler]);
diff --git a/suite/components/inspector/inspector-prefs.js b/suite/components/inspector/inspector-prefs.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/inspector-prefs.js
@@ -0,0 +1,18 @@
+/* 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/. */
+
+pref("inspector.blink.border-color", "#CC0000");
+pref("inspector.blink.border-width", 2);
+pref("inspector.blink.duration", 1200);
+pref("inspector.blink.on", true);
+pref("inspector.blink.speed", 100);
+pref("inspector.blink.invert", false);
+pref("inspector.dom.showAnon", true);
+pref("inspector.dom.showWhitespaceNodes", true);
+pref("inspector.dom.showAccessibleNodes", false);
+pref("inspector.dom.showProcessingInstructions", true);
+// Enables inspecting any DOM element by shift + right click
+// This is disabled by default and requires a restart to takeRecords
+// effect.
+pref("inspector.inspectElementKeyCombo.enabled", false);
diff --git a/suite/components/inspector/inspector-startup.js b/suite/components/inspector/inspector-startup.js
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/inspector-startup.js
@@ -0,0 +1,41 @@
+/* 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 https://mozilla.org/MPL/2.0/. */
+
+ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+/**
+ * A startup/shutdown observer, triggers init()/uninit() methods.
+ * @constructor
+ */
+function DOMInspectorStartup() {}
+DOMInspectorStartup.prototype = {
+  classDescription: "DOMi Startup",
+  contractID: "@mozilla.org/domi/startup;1",
+  classID: Components.ID("{4788f52a-0fbb-494c-8ffd-25e0ff39d80d}"),
+  _xpcom_categories: [{ category: "app-startup" }],
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference]),
+
+  observe: function(subject, topic, data) {
+    switch (topic) {
+      case "app-startup":
+        Services.obs.addObserver(this, "profile-after-change", true);
+        break;
+      case "profile-after-change":
+        if (Services.prefs.getBoolPref("inspector.inspectElementKeyCombo.enabled", false)) {
+          Services.obs.addObserver(this, "quit-application", true);
+          ChromeUtils.import("resource:///modules/DOMiInspectElement.jsm");
+          DOMiInspectElement.init();
+        }
+        break;
+      case "quit-application":
+        Services.obs.removeObserver(this, "quit-application");
+        DOMiInspectElement.uninit();
+        break;
+    }
+  }
+};
+
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([DOMInspectorStartup]);
diff --git a/suite/components/inspector/jar.mn b/suite/components/inspector/jar.mn
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/jar.mn
@@ -0,0 +1,113 @@
+# 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/.
+
+comm.jar:
+% content inspector %content/inspector/
+% overlay chrome://inspector/content/inspector.xul chrome://communicator/content/utilityOverlay.xul
+% overlay chrome://inspector/content/inspector.xul chrome://communicator/content/tasksOverlay.xul
+% overlay chrome://communicator/content/tasksOverlay.xul chrome://inspector/content/tasksOverlay.xul
+% overlay chrome://communicator/content/pref/preferences.xul chrome://inspector/content/prefs/prefsOverlay.xul
+% overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/dom/commandOverlay.xul
+% overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/styleRules/commandOverlay.xul
+% overlay chrome://inspector/content/keysetOverlay.xul chrome://inspector/content/viewers/dom/keysetOverlay.xul
+% overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/dom/popupOverlay.xul
+% overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/styleRules/popupOverlay.xul
+  content/inspector/inspector.xul                                       (content/inspector.xul)
+  content/inspector/inspector.js                                        (content/inspector.js)
+  content/inspector/inspector.css                                       (content/inspector.css)
+  content/inspector/inspector.xml                                       (content/inspector.xml)
+  content/inspector/sidebar.xul                                         (content/sidebar.xul)
+  content/inspector/sidebar.js                                          (content/sidebar.js)
+  content/inspector/object.xul                                          (content/object.xul)
+  content/inspector/object.js                                           (content/object.js)
+  content/inspector/inspectorOverlay.xul                                (content/inspectorOverlay.xul)
+  content/inspector/toolboxOverlay.xul                                  (content/toolboxOverlay.xul)
+  content/inspector/commandOverlay.xul                                  (content/commandOverlay.xul)
+  content/inspector/keysetOverlay.xul                                   (content/keysetOverlay.xul)
+  content/inspector/popupOverlay.xul                                    (content/popupOverlay.xul)
+  content/inspector/statusbarOverlay.xul                                (content/statusbarOverlay.xul)
+  content/inspector/tasksOverlay.xul                                    (content/tasksOverlay.xul)
+  content/inspector/editingOverlay.xul                                  (content/editingOverlay.xul)
+  content/inspector/Flasher.js                                          (content/Flasher.js)
+  content/inspector/ViewerRegistry.js                                   (content/ViewerRegistry.js)
+  content/inspector/utils.js                                            (content/utils.js)
+  content/inspector/hooks.js                                            (content/hooks.js)
+  content/inspector/res/viewer-registry.rdf                             (content/res/viewer-registry.rdf)
+  content/inspector/extensions/titledSplitter.css                       (content/extensions/titledSplitter.css)
+  content/inspector/extensions/titledSplitter.xml                       (content/extensions/titledSplitter.xml)
+  content/inspector/extensions/wsm-colorpicker.js                       (content/extensions/wsm-colorpicker.js)
+  content/inspector/jsutil/rdf/RDFArray.js                              (content/jsutil/rdf/RDFArray.js)
+  content/inspector/jsutil/rdf/RDFU.js                                  (content/jsutil/rdf/RDFU.js)
+  content/inspector/jsutil/system/DiskSearch.js                         (content/jsutil/system/DiskSearch.js)
+  content/inspector/jsutil/system/FilePickerUtils.js                    (content/jsutil/system/FilePickerUtils.js)
+  content/inspector/jsutil/system/PrefUtils.js                          (content/jsutil/system/PrefUtils.js)
+  content/inspector/jsutil/system/clipboardFlavors.js                   (content/jsutil/system/clipboardFlavors.js)
+  content/inspector/jsutil/xpcom/XPCU.js                                (content/jsutil/xpcom/XPCU.js)
+  content/inspector/jsutil/xul/DNDUtils.js                              (content/jsutil/xul/DNDUtils.js)
+  content/inspector/jsutil/xul/FrameExchange.js                         (content/jsutil/xul/FrameExchange.js)
+  content/inspector/jsutil/xul/inFormManager.js                         (content/jsutil/xul/inFormManager.js)
+  content/inspector/jsutil/xul/inTreeBuilder.js                         (content/jsutil/xul/inTreeBuilder.js)
+  content/inspector/jsutil/xul/inBaseTreeView.js                        (content/jsutil/xul/inBaseTreeView.js)
+  content/inspector/jsutil/xul/inDataTreeView.js                        (content/jsutil/xul/inDataTreeView.js)
+  content/inspector/jsutil/events/ObserverManager.js                    (content/jsutil/events/ObserverManager.js)
+  content/inspector/jsutil/commands/baseCommands.js                     (content/jsutil/commands/baseCommands.js)
+  content/inspector/prefs/pref-inspector.xul                            (content/prefs/pref-inspector.xul)
+  content/inspector/prefs/pref-inspector.js                             (content/prefs/pref-inspector.js)
+  content/inspector/prefs/prefsOverlay.xul                              (content/prefs/prefsOverlay.xul)
+  content/inspector/prefs/pref-sidebar.js                               (content/prefs/pref-sidebar.js)
+  content/inspector/tests/allskin.xul                                   (content/tests/allskin.xul)
+  content/inspector/viewers/accessibleEvent/accessibleEvent.js          (content/viewers/accessibleEvent/accessibleEvent.js)
+  content/inspector/viewers/accessibleEvent/accessibleEvent.xul         (content/viewers/accessibleEvent/accessibleEvent.xul)
+  content/inspector/viewers/accessibleEvents/accessibleEvents.js        (content/viewers/accessibleEvents/accessibleEvents.js)
+  content/inspector/viewers/accessibleEvents/accessibleEvents.xul       (content/viewers/accessibleEvents/accessibleEvents.xul)
+  content/inspector/viewers/accessibleEvents/handlerHelpDialog.xul      (content/viewers/accessibleEvents/handlerHelpDialog.xul)
+  content/inspector/viewers/accessibleObject/accessibleObject.js        (content/viewers/accessibleObject/accessibleObject.js)
+  content/inspector/viewers/accessibleObject/accessibleObject.xul       (content/viewers/accessibleObject/accessibleObject.xul)
+  content/inspector/viewers/accessibleProps/accessibleProps.js          (content/viewers/accessibleProps/accessibleProps.js)
+  content/inspector/viewers/accessibleProps/accessiblePropViewerMgr.js  (content/viewers/accessibleProps/accessiblePropViewerMgr.js)
+  content/inspector/viewers/accessibleProps/accessibleProps.xul         (content/viewers/accessibleProps/accessibleProps.xul)
+  content/inspector/viewers/accessibleRelations/accessibleRelations.js  (content/viewers/accessibleRelations/accessibleRelations.js)
+  content/inspector/viewers/accessibleRelations/accessibleRelations.xul (content/viewers/accessibleRelations/accessibleRelations.xul)
+  content/inspector/viewers/accessibleTree/accessibleTree.js            (content/viewers/accessibleTree/accessibleTree.js)
+  content/inspector/viewers/accessibleTree/accessibleTree.xul           (content/viewers/accessibleTree/accessibleTree.xul)
+  content/inspector/viewers/accessibleTree/evalJSDialog.js              (content/viewers/accessibleTree/evalJSDialog.js)
+  content/inspector/viewers/accessibleTree/evalJSDialog.xul             (content/viewers/accessibleTree/evalJSDialog.xul)
+  content/inspector/viewers/computedStyle/computedStyle.js              (content/viewers/computedStyle/computedStyle.js)
+  content/inspector/viewers/computedStyle/computedStyle.xul             (content/viewers/computedStyle/computedStyle.xul)
+  content/inspector/viewers/usedFontFaces/usedFontFaces.js              (content/viewers/usedFontFaces/usedFontFaces.js)
+  content/inspector/viewers/usedFontFaces/usedFontFaces.xul             (content/viewers/usedFontFaces/usedFontFaces.xul)
+  content/inspector/viewers/dom/FindDialog.js                           (content/viewers/dom/FindDialog.js)
+  content/inspector/viewers/dom/columnsDialog.js                        (content/viewers/dom/columnsDialog.js)
+  content/inspector/viewers/dom/columnsDialog.xul                       (content/viewers/dom/columnsDialog.xul)
+  content/inspector/viewers/dom/commandOverlay.xul                      (content/viewers/dom/commandOverlay.xul)
+  content/inspector/viewers/dom/insertDialog.js                         (content/viewers/dom/insertDialog.js)
+  content/inspector/viewers/dom/insertDialog.xul                        (content/viewers/dom/insertDialog.xul)
+  content/inspector/viewers/dom/findDialog.xul                          (content/viewers/dom/findDialog.xul)
+  content/inspector/viewers/dom/keysetOverlay.xul                       (content/viewers/dom/keysetOverlay.xul)
+  content/inspector/viewers/dom/popupOverlay.xul                        (content/viewers/dom/popupOverlay.xul)
+  content/inspector/viewers/dom/dom.xul                                 (content/viewers/dom/dom.xul)
+  content/inspector/viewers/dom/dom.js                                  (content/viewers/dom/dom.js)
+  content/inspector/viewers/dom/pseudoClassDialog.js                    (content/viewers/dom/pseudoClassDialog.js)
+  content/inspector/viewers/dom/pseudoClassDialog.xul                   (content/viewers/dom/pseudoClassDialog.xul)
+  content/inspector/viewers/boxModel/boxModel.js                        (content/viewers/boxModel/boxModel.js)
+  content/inspector/viewers/boxModel/boxModel.xul                       (content/viewers/boxModel/boxModel.xul)
+  content/inspector/viewers/jsObject/jsObject.js                        (content/viewers/jsObject/jsObject.js)
+  content/inspector/viewers/jsObject/jsObject.xul                       (content/viewers/jsObject/jsObject.xul)
+  content/inspector/viewers/jsObject/jsObjectViewer.js                  (content/viewers/jsObject/jsObjectViewer.js)
+  content/inspector/viewers/jsObject/jsObjectViewer.xul                 (content/viewers/jsObject/jsObjectViewer.xul)
+  content/inspector/viewers/jsObject/evalExprDialog.js                  (content/viewers/jsObject/evalExprDialog.js)
+  content/inspector/viewers/jsObject/evalExprDialog.xul                 (content/viewers/jsObject/evalExprDialog.xul)
+  content/inspector/viewers/domNode/domNode.js                          (content/viewers/domNode/domNode.js)
+  content/inspector/viewers/domNode/domNode.xul                         (content/viewers/domNode/domNode.xul)
+  content/inspector/viewers/domNode/domNodeDialog.js                    (content/viewers/domNode/domNodeDialog.js)
+  content/inspector/viewers/domNode/domNodeDialog.xul                   (content/viewers/domNode/domNodeDialog.xul)
+  content/inspector/viewers/styleRules/commandOverlay.xul               (content/viewers/styleRules/commandOverlay.xul)
+  content/inspector/viewers/styleRules/keysetOverlay.xul                (content/viewers/styleRules/keysetOverlay.xul)
+  content/inspector/viewers/styleRules/popupOverlay.xul                 (content/viewers/styleRules/popupOverlay.xul)
+  content/inspector/viewers/styleRules/styleRules.js                    (content/viewers/styleRules/styleRules.js)
+  content/inspector/viewers/styleRules/styleRules.xul                   (content/viewers/styleRules/styleRules.xul)
+  content/inspector/viewers/stylesheets/stylesheets.js                  (content/viewers/stylesheets/stylesheets.js)
+  content/inspector/viewers/stylesheets/stylesheets.xul                 (content/viewers/stylesheets/stylesheets.xul)
+  content/inspector/viewers/xblBindings/xblBindings.js                  (content/viewers/xblBindings/xblBindings.js)
+  content/inspector/viewers/xblBindings/xblBindings.xul                 (content/viewers/xblBindings/xblBindings.xul)
diff --git a/suite/components/inspector/moz.build b/suite/components/inspector/moz.build
new file mode 100644
--- /dev/null
+++ b/suite/components/inspector/moz.build
@@ -0,0 +1,17 @@
+# -*- 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/.
+
+EXTRA_COMPONENTS += [
+    'inspector-cmdline.js',
+    'inspector-startup.js',
+    'InspectorComponents.manifest',
+]
+
+EXTRA_JS_MODULES += ['DOMiInspectElement.jsm']
+
+JS_PREFERENCE_FILES += ['inspector-prefs.js']
+
+JAR_MANIFESTS += ['jar.mn']
diff --git a/suite/components/moz.build b/suite/components/moz.build
--- a/suite/components/moz.build
+++ b/suite/components/moz.build
@@ -7,16 +7,17 @@
 DIRS += [
     'autocomplete',
     'bindings',
     'console',
     'dataman',
     'downloads',
     'feeds',
     'helpviewer',
+    'inspector',
     'migration',
     'permissions',
     'places',
     'pref',
     'profile',
     'sanitize',
     'search',
     'security',
diff --git a/suite/extensions/inspector/Makefile.in b/suite/extensions/inspector/Makefile.in
deleted file mode 100644
--- a/suite/extensions/inspector/Makefile.in
+++ /dev/null
@@ -1,29 +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/.
-
-DEPTH = ../../../..
-topsrcdir = @top_srcdir@
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-DOMi_VERSION = 2.0.20
-
-XPI_NAME               = inspector
-INSTALL_EXTENSION_ID   = inspector@mozilla.org
-XPI_PKGNAME            = inspector-$(DOMi_VERSION)
-
-DIST_FILES = install.rdf
-
-DEFINES += -DDOMi_VERSION=$(DOMi_VERSION)
-
-include $(topsrcdir)/config/rules.mk
-
-export::
-	$(NSINSTALL) -D $(FINAL_TARGET)/chrome/icons/default
-	$(INSTALL) $(srcdir)/resources/content/res/Linux/winInspectorMain.xpm $(FINAL_TARGET)/chrome/icons/default
-	$(INSTALL) $(srcdir)/resources/content/res/Linux/winInspectorMain16.xpm $(FINAL_TARGET)/chrome/icons/default
-	$(INSTALL) $(srcdir)/resources/content/res/WINNT/winInspectorMain.ico $(FINAL_TARGET)/chrome/icons/default
diff --git a/suite/extensions/inspector/base/js/inspector-cmdline.js b/suite/extensions/inspector/base/js/inspector-cmdline.js
deleted file mode 100644
--- a/suite/extensions/inspector/base/js/inspector-cmdline.js
+++ /dev/null
@@ -1,49 +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/. */
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-const nsICommandLineHandler = Components.interfaces.nsICommandLineHandler;
-const nsISupportsString     = Components.interfaces.nsISupportsString;
-const nsIWindowWatcher      = Components.interfaces.nsIWindowWatcher;
-
-function InspectorCmdLineHandler() {}
-InspectorCmdLineHandler.prototype =
-{
-  classDescription: "DOM Inspector Command Line Handler",
-  classID: Components.ID("{38293526-6b13-4d4f-a075-71939435b408}"),
-  contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=inspector",
-
-  /* nsISupports */
-  QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler]),
-
-  /* nsICommandLineHandler */
-  handle : function handler_handle(cmdLine) {
-    var args = Components.classes["@mozilla.org/supports-string;1"]
-                         .createInstance(nsISupportsString);
-    try {
-      var uristr = cmdLine.handleFlagWithParam("inspector", false);
-      if (uristr == null)
-        return;
-      try {
-        args.data = cmdLine.resolveURI(uristr).spec;
-      }
-      catch (e) {
-        return;
-      }
-    }
-    catch (e) {
-      cmdLine.handleFlag("inspector", true);
-    }
-
-    var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
-                           .getService(nsIWindowWatcher);
-    wwatch.openWindow(null, "chrome://inspector/content/", "_blank",
-                      "chrome,dialog=no,all", args);
-  },
-
-  helpInfo : "  -inspector <url>     Open the DOM inspector.\n"
-};
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([InspectorCmdLineHandler]);
diff --git a/suite/extensions/inspector/base/js/inspector-startup.js b/suite/extensions/inspector/base/js/inspector-startup.js
deleted file mode 100644
--- a/suite/extensions/inspector/base/js/inspector-startup.js
+++ /dev/null
@@ -1,41 +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 https://mozilla.org/MPL/2.0/. */
-
-ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-/**
- * A startup/shutdown observer, triggers init()/uninit() methods.
- * @constructor
- */
-function InspectorStartup() {}
-InspectorStartup.prototype = {
-  classDescription: "DOMi Startup",
-  contractID: "@mozilla.org/domi/startup;1",
-  classID: Components.ID("{4788f52a-0fbb-494c-8ffd-25e0ff39d80d}"),
-  _xpcom_categories: [{ category: "app-startup", service: true }],
-
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference]),
-
-  observe: function(subject, topic, data) {
-    switch (topic) {
-      case "app-startup":
-        Services.obs.addObserver(this, "profile-after-change", true);
-        break;
-      case "profile-after-change":
-        if (Services.prefs.getBoolPref("inspector.inspectElementKeyCombo.enabled", false)) {
-          Services.obs.addObserver(this, "quit-application", true);
-          ChromeUtils.import("resource://inspector/InspectElement.jsm");
-          InspectElement.init();
-        }
-        break;
-      case "quit-application":
-        Services.obs.removeObserver(this, "quit-application");
-        InspectElement.uninit();
-        break;
-    }
-  }
-};
-
-var NSGetFactory = XPCOMUtils.generateNSGetFactory([InspectorStartup]);
diff --git a/suite/extensions/inspector/install.rdf b/suite/extensions/inspector/install.rdf
deleted file mode 100644
--- a/suite/extensions/inspector/install.rdf
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-#filter substitution
-
-<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-     xmlns:em="http://www.mozilla.org/2004/em-rdf#">
-  <Description about="urn:mozilla:install-manifest">
-    <em:id>inspector@mozilla.org</em:id>
-    <em:version>@DOMi_VERSION@</em:version>
-    <em:type>2</em:type>
-    <em:multiprocessCompatible>false</em:multiprocessCompatible>
-
-    <!-- DOM Inspector supports Gecko 2.0.0 and higher.
-         All applications listed below are the subset of supported versions
-         which also use an appropriate version of Gecko. -->
-    <!-- For maxVersion of applications that follow the rapid cycle pattern,
-         use '(x)a1' (*-central) on default,
-         and '(x-1).*' (*-aurora/beta/release) for branches. -->
-
-    <!-- SeaMonkey
-         2.0 is Gecko 1.9.1
-         2.1 is Gecko 2.0
-         2.2 is Gecko 5.0
-         2.x is Gecko (x+3).0, where x is greater than 2 -->
-    <em:targetApplication>
-      <Description>
-        <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
-        <em:minVersion>2.1</em:minVersion>
-        <em:maxVersion>2.56</em:maxVersion>
-      </Description>
-    </em:targetApplication>
-
-    <!-- front-end metadata -->
-    <em:name>DOM Inspector</em:name>
-    <em:description>Inspects the structure and properties of a window and its contents.</em:description>
-    <em:creator>mozilla.org</em:creator>
-    <em:homepageURL>http://www.mozilla.org/projects/inspector/</em:homepageURL>
-
-    <em:localized>
-      <Description>
-        <em:locale>sk</em:locale>
-        <em:name>DOM Inspector</em:name>
-        <em:description>Umožní preskúmať štruktúru a vlastnosti okna a jeho obsahu.</em:description>
-      </Description>
-    </em:localized>
-
-    <em:localized>
-      <Description>
-        <em:locale>sv-SE</em:locale>
-        <em:name>DOM-granskaren (DOM Inspector)</em:name>
-        <em:description>Granskar strukturen och egenskaperna för ett fönster och dess innehåll.</em:description>
-      </Description>
-    </em:localized>
-
-    <em:localized>
-      <Description>
-        <em:locale>el</em:locale>
-        <em:name>Επιθεωρητής DOM</em:name>
-        <em:description>Επιθεωρεί τη δομή και τις ιδιότητες ενός παραθύρου και των περιεχομένων του.</em:description>
-      </Description>
-    </em:localized>
-
-    <!-- Force unpack the xpi, otherwise window icons do not work
-         on Gecko 2.0 and higher. -->
-    <em:unpack>true</em:unpack>
-  </Description>
-</RDF>
diff --git a/suite/extensions/inspector/jar.mn b/suite/extensions/inspector/jar.mn
deleted file mode 100644
--- a/suite/extensions/inspector/jar.mn
+++ /dev/null
@@ -1,178 +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/.
-
-inspector.jar:
-% content inspector %content/inspector/
-% overlay chrome://inspector/content/inspector.xul chrome://communicator/content/utilityOverlay.xul
-% overlay chrome://inspector/content/inspector.xul chrome://communicator/content/tasksOverlay.xul
-% overlay chrome://communicator/content/tasksOverlay.xul chrome://inspector/content/tasksOverlay.xul
-% overlay chrome://communicator/content/pref/preferences.xul chrome://inspector/content/prefs/prefsOverlay.xul
-% overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/dom/commandOverlay.xul
-% overlay chrome://inspector/content/commandOverlay.xul chrome://inspector/content/viewers/styleRules/commandOverlay.xul
-% overlay chrome://inspector/content/keysetOverlay.xul chrome://inspector/content/viewers/dom/keysetOverlay.xul
-% overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/dom/popupOverlay.xul
-% overlay chrome://inspector/content/popupOverlay.xul chrome://inspector/content/viewers/styleRules/popupOverlay.xul
-% component {4788f52a-0fbb-494c-8ffd-25e0ff39d80d} components/inspector-startup.js
-% contract @mozilla.org/domi/startup;1 {4788f52a-0fbb-494c-8ffd-25e0ff39d80d}
-% category profile-after-change @mozilla.org/domi/startup;1 @mozilla.org/domi/startup;1
-#ifdef XPI_NAME
-%  component {38293526-6b13-4d4f-a075-71939435b408} components/inspector-cmdline.js
-%  contract @mozilla.org/commandlinehandler/general-startup;1?type=inspector {38293526-6b13-4d4f-a075-71939435b408}
-%  category command-line-handler m-inspector @mozilla.org/commandlinehandler/general-startup;1?type=inspector
-#endif
-  content/inspector/inspector.xul                                       (resources/content/inspector.xul)
-  content/inspector/inspector.js                                        (resources/content/inspector.js)
-  content/inspector/inspector.css                                       (resources/content/inspector.css)
-  content/inspector/inspector.xml                                       (resources/content/inspector.xml)
-  content/inspector/sidebar.xul                                         (resources/content/sidebar.xul)
-  content/inspector/sidebar.js                                          (resources/content/sidebar.js)
-  content/inspector/object.xul                                          (resources/content/object.xul)
-  content/inspector/object.js                                           (resources/content/object.js)
-  content/inspector/inspectorOverlay.xul                                (resources/content/inspectorOverlay.xul)
-  content/inspector/toolboxOverlay.xul                                  (resources/content/toolboxOverlay.xul)
-  content/inspector/commandOverlay.xul                                  (resources/content/commandOverlay.xul)
-  content/inspector/keysetOverlay.xul                                   (resources/content/keysetOverlay.xul)
-  content/inspector/popupOverlay.xul                                    (resources/content/popupOverlay.xul)
-  content/inspector/statusbarOverlay.xul                                (resources/content/statusbarOverlay.xul)
-  content/inspector/tasksOverlay.xul                                    (resources/content/tasksOverlay.xul)
-  content/inspector/editingOverlay.xul                                  (resources/content/editingOverlay.xul)
-  content/inspector/Flasher.js                                          (resources/content/Flasher.js)
-  content/inspector/ViewerRegistry.js                                   (resources/content/ViewerRegistry.js)
-  content/inspector/utils.js                                            (resources/content/utils.js)
-  content/inspector/hooks.js                                            (resources/content/hooks.js)
-  content/inspector/res/viewer-registry.rdf                             (resources/content/res/viewer-registry.rdf)
-  content/inspector/extensions/titledSplitter.css                       (resources/content/extensions/titledSplitter.css)
-  content/inspector/extensions/titledSplitter.xml                       (resources/content/extensions/titledSplitter.xml)
-  content/inspector/extensions/wsm-colorpicker.js                       (resources/content/extensions/wsm-colorpicker.js)
-  content/inspector/jsutil/rdf/RDFArray.js                              (resources/content/jsutil/rdf/RDFArray.js)
-  content/inspector/jsutil/rdf/RDFU.js                                  (resources/content/jsutil/rdf/RDFU.js)
-  content/inspector/jsutil/system/DiskSearch.js                         (resources/content/jsutil/system/DiskSearch.js)
-  content/inspector/jsutil/system/FilePickerUtils.js                    (resources/content/jsutil/system/FilePickerUtils.js)
-  content/inspector/jsutil/system/PrefUtils.js                          (resources/content/jsutil/system/PrefUtils.js)
-  content/inspector/jsutil/system/clipboardFlavors.js                   (resources/content/jsutil/system/clipboardFlavors.js)
-  content/inspector/jsutil/xpcom/XPCU.js                                (resources/content/jsutil/xpcom/XPCU.js)
-  content/inspector/jsutil/xul/DNDUtils.js                              (resources/content/jsutil/xul/DNDUtils.js)
-  content/inspector/jsutil/xul/FrameExchange.js                         (resources/content/jsutil/xul/FrameExchange.js)
-  content/inspector/jsutil/xul/inFormManager.js                         (resources/content/jsutil/xul/inFormManager.js)
-  content/inspector/jsutil/xul/inTreeBuilder.js                         (resources/content/jsutil/xul/inTreeBuilder.js)
-  content/inspector/jsutil/xul/inBaseTreeView.js                        (resources/content/jsutil/xul/inBaseTreeView.js)
-  content/inspector/jsutil/xul/inDataTreeView.js                        (resources/content/jsutil/xul/inDataTreeView.js)
-  content/inspector/jsutil/events/ObserverManager.js                    (resources/content/jsutil/events/ObserverManager.js)
-  content/inspector/jsutil/commands/baseCommands.js                     (resources/content/jsutil/commands/baseCommands.js)
-  content/inspector/prefs/pref-inspector.xul                            (resources/content/prefs/pref-inspector.xul)
-  content/inspector/prefs/pref-inspector.js                             (resources/content/prefs/pref-inspector.js)
-  content/inspector/prefs/prefsOverlay.xul                              (resources/content/prefs/prefsOverlay.xul)
-  content/inspector/prefs/pref-sidebar.js                               (resources/content/prefs/pref-sidebar.js)
-  content/inspector/tests/allskin.xul                                   (resources/content/tests/allskin.xul)
-  content/inspector/viewers/accessibleEvent/accessibleEvent.js          (resources/content/viewers/accessibleEvent/accessibleEvent.js)
-  content/inspector/viewers/accessibleEvent/accessibleEvent.xul         (resources/content/viewers/accessibleEvent/accessibleEvent.xul)
-  content/inspector/viewers/accessibleEvents/accessibleEvents.js        (resources/content/viewers/accessibleEvents/accessibleEvents.js)
-  content/inspector/viewers/accessibleEvents/accessibleEvents.xul       (resources/content/viewers/accessibleEvents/accessibleEvents.xul)
-  content/inspector/viewers/accessibleEvents/handlerHelpDialog.xul      (resources/content/viewers/accessibleEvents/handlerHelpDialog.xul)
-  content/inspector/viewers/accessibleObject/accessibleObject.js        (resources/content/viewers/accessibleObject/accessibleObject.js)
-  content/inspector/viewers/accessibleObject/accessibleObject.xul       (resources/content/viewers/accessibleObject/accessibleObject.xul)
-  content/inspector/viewers/accessibleProps/accessibleProps.js          (resources/content/viewers/accessibleProps/accessibleProps.js)
-  content/inspector/viewers/accessibleProps/accessiblePropViewerMgr.js  (resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js)
-  content/inspector/viewers/accessibleProps/accessibleProps.xul         (resources/content/viewers/accessibleProps/accessibleProps.xul)
-  content/inspector/viewers/accessibleRelations/accessibleRelations.js  (resources/content/viewers/accessibleRelations/accessibleRelations.js)
-  content/inspector/viewers/accessibleRelations/accessibleRelations.xul (resources/content/viewers/accessibleRelations/accessibleRelations.xul)
-  content/inspector/viewers/accessibleTree/accessibleTree.js            (resources/content/viewers/accessibleTree/accessibleTree.js)
-  content/inspector/viewers/accessibleTree/accessibleTree.xul           (resources/content/viewers/accessibleTree/accessibleTree.xul)
-  content/inspector/viewers/accessibleTree/evalJSDialog.js              (resources/content/viewers/accessibleTree/evalJSDialog.js)
-  content/inspector/viewers/accessibleTree/evalJSDialog.xul             (resources/content/viewers/accessibleTree/evalJSDialog.xul)
-  content/inspector/viewers/computedStyle/computedStyle.js              (resources/content/viewers/computedStyle/computedStyle.js)
-  content/inspector/viewers/computedStyle/computedStyle.xul             (resources/content/viewers/computedStyle/computedStyle.xul)
-  content/inspector/viewers/usedFontFaces/usedFontFaces.js              (resources/content/viewers/usedFontFaces/usedFontFaces.js)
-  content/inspector/viewers/usedFontFaces/usedFontFaces.xul             (resources/content/viewers/usedFontFaces/usedFontFaces.xul)
-  content/inspector/viewers/dom/FindDialog.js                           (resources/content/viewers/dom/FindDialog.js)
-  content/inspector/viewers/dom/columnsDialog.js                        (resources/content/viewers/dom/columnsDialog.js)
-  content/inspector/viewers/dom/columnsDialog.xul                       (resources/content/viewers/dom/columnsDialog.xul)
-  content/inspector/viewers/dom/commandOverlay.xul                      (resources/content/viewers/dom/commandOverlay.xul)
-  content/inspector/viewers/dom/insertDialog.js                         (resources/content/viewers/dom/insertDialog.js)
-  content/inspector/viewers/dom/insertDialog.xul                        (resources/content/viewers/dom/insertDialog.xul)
-  content/inspector/viewers/dom/findDialog.xul                          (resources/content/viewers/dom/findDialog.xul)
-  content/inspector/viewers/dom/keysetOverlay.xul                       (resources/content/viewers/dom/keysetOverlay.xul)
-  content/inspector/viewers/dom/popupOverlay.xul                        (resources/content/viewers/dom/popupOverlay.xul)
-  content/inspector/viewers/dom/dom.xul                                 (resources/content/viewers/dom/dom.xul)
-  content/inspector/viewers/dom/dom.js                                  (resources/content/viewers/dom/dom.js)
-  content/inspector/viewers/dom/pseudoClassDialog.js                    (resources/content/viewers/dom/pseudoClassDialog.js)
-  content/inspector/viewers/dom/pseudoClassDialog.xul                   (resources/content/viewers/dom/pseudoClassDialog.xul)
-  content/inspector/viewers/boxModel/boxModel.js                        (resources/content/viewers/boxModel/boxModel.js)
-  content/inspector/viewers/boxModel/boxModel.xul                       (resources/content/viewers/boxModel/boxModel.xul)
-  content/inspector/viewers/jsObject/jsObject.js                        (resources/content/viewers/jsObject/jsObject.js)
-  content/inspector/viewers/jsObject/jsObject.xul                       (resources/content/viewers/jsObject/jsObject.xul)
-  content/inspector/viewers/jsObject/jsObjectViewer.js                  (resources/content/viewers/jsObject/jsObjectViewer.js)
-  content/inspector/viewers/jsObject/jsObjectViewer.xul                 (resources/content/viewers/jsObject/jsObjectViewer.xul)
-  content/inspector/viewers/jsObject/evalExprDialog.js                  (resources/content/viewers/jsObject/evalExprDialog.js)
-  content/inspector/viewers/jsObject/evalExprDialog.xul                 (resources/content/viewers/jsObject/evalExprDialog.xul)
-  content/inspector/viewers/domNode/domNode.js                          (resources/content/viewers/domNode/domNode.js)
-  content/inspector/viewers/domNode/domNode.xul                         (resources/content/viewers/domNode/domNode.xul)
-  content/inspector/viewers/domNode/domNodeDialog.js                    (resources/content/viewers/domNode/domNodeDialog.js)
-  content/inspector/viewers/domNode/domNodeDialog.xul                   (resources/content/viewers/domNode/domNodeDialog.xul)
-  content/inspector/viewers/styleRules/commandOverlay.xul               (resources/content/viewers/styleRules/commandOverlay.xul)
-  content/inspector/viewers/styleRules/keysetOverlay.xul                (resources/content/viewers/styleRules/keysetOverlay.xul)
-  content/inspector/viewers/styleRules/popupOverlay.xul                 (resources/content/viewers/styleRules/popupOverlay.xul)
-  content/inspector/viewers/styleRules/styleRules.js                    (resources/content/viewers/styleRules/styleRules.js)
-  content/inspector/viewers/styleRules/styleRules.xul                   (resources/content/viewers/styleRules/styleRules.xul)
-  content/inspector/viewers/stylesheets/stylesheets.js                  (resources/content/viewers/stylesheets/stylesheets.js)
-  content/inspector/viewers/stylesheets/stylesheets.xul                 (resources/content/viewers/stylesheets/stylesheets.xul)
-  content/inspector/viewers/xblBindings/xblBindings.js                  (resources/content/viewers/xblBindings/xblBindings.js)
-  content/inspector/viewers/xblBindings/xblBindings.xul                 (resources/content/viewers/xblBindings/xblBindings.xul)
-% skin inspector classic/1.0 %skin/classic/inspector/
-  skin/classic/inspector/btnFind.png                                    (resources/skin/classic/btnFind.png)
-  skin/classic/inspector/btnFind-dis.png                                (resources/skin/classic/btnFind-dis.png)
-  skin/classic/inspector/btnSelecting.png                               (resources/skin/classic/btnSelecting.png)
-  skin/classic/inspector/btnSelecting-act.png                           (resources/skin/classic/btnSelecting-act.png)
-  skin/classic/inspector/btnSelecting-dis.png                           (resources/skin/classic/btnSelecting-dis.png)
-  skin/classic/inspector/ImageSearchItem.png                            (resources/skin/classic/ImageSearchItem.png)
-  skin/classic/inspector/iconImportant.png                              (resources/skin/classic/iconImportant.png)
-  skin/classic/inspector/iconViewerList.png                             (resources/skin/classic/iconViewerList.png)
-  skin/classic/inspector/inspector.css                                  (resources/skin/classic/inspector.css)
-  skin/classic/inspector/inspectorWindow.css                            (resources/skin/classic/inspectorWindow.css)
-  skin/classic/inspector/titledSplitter.css                             (resources/skin/classic/titledSplitter.css)
-  skin/classic/inspector/titledsplitter-close.png                       (resources/skin/classic/titledsplitter-close.png)
-  skin/classic/inspector/panelset.css                                   (resources/skin/classic/panelset.css)
-  skin/classic/inspector/sidebar.css                                    (resources/skin/classic/sidebar.css)
-  skin/classic/inspector/iconViewerList-dis.png                         (resources/skin/classic/iconViewerList-dis.png)
-  skin/classic/inspector/viewers/accessibleEvent/accessibleEvent.css    (resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css)
-  skin/classic/inspector/viewers/accessibleEvents/accessibleEvents.css  (resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css)
-  skin/classic/inspector/viewers/accessibleProps/accessibleProps.css    (resources/skin/classic/viewers/accessibleProps/accessibleProps.css)
-  skin/classic/inspector/viewers/accessibleTree/accessibleTree.css      (resources/skin/classic/viewers/accessibleTree/accessibleTree.css)
-  skin/classic/inspector/viewers/boxModel/boxModel.css                  (resources/skin/classic/viewers/boxModel/boxModel.css)
-  skin/classic/inspector/viewers/dom/columnsDialog.css                  (resources/skin/classic/viewers/dom/columnsDialog.css)
-  skin/classic/inspector/viewers/dom/dom.css                            (resources/skin/classic/viewers/dom/dom.css)
-  skin/classic/inspector/viewers/dom/findDialog.css                     (resources/skin/classic/viewers/dom/findDialog.css)
-  skin/classic/inspector/viewers/domNode/domNode.css                    (resources/skin/classic/viewers/domNode/domNode.css)
-  skin/classic/inspector/viewers/styleRules/styleRules.css              (resources/skin/classic/viewers/styleRules/styleRules.css)
-  skin/classic/inspector/viewers/xblBindings/xblBindings.css            (resources/skin/classic/viewers/xblBindings/xblBindings.css)
-% skin inspector modern/1.0 %skin/modern/inspector/
-  skin/modern/inspector/btnFind.png                                     (resources/skin/modern/btnFind.png)
-  skin/modern/inspector/btnFind-dis.png                                 (resources/skin/modern/btnFind-dis.png)
-  skin/modern/inspector/btnSelecting.png                                (resources/skin/modern/btnSelecting.png)
-  skin/modern/inspector/btnSelecting-act.png                            (resources/skin/modern/btnSelecting-act.png)
-  skin/modern/inspector/btnSelecting-dis.png                            (resources/skin/modern/btnSelecting-dis.png)
-  skin/modern/inspector/ImageSearchItem.png                             (resources/skin/modern/ImageSearchItem.png)
-  skin/modern/inspector/iconImportant.png                               (resources/skin/modern/iconImportant.png)
-  skin/modern/inspector/iconViewerMenu-dis.png                          (resources/skin/modern/iconViewerMenu-dis.png)
-  skin/modern/inspector/inspector.css                                   (resources/skin/modern/inspector.css)
-  skin/modern/inspector/inspectorWindow.css                             (resources/skin/modern/inspectorWindow.css)
-  skin/modern/inspector/titledSplitter.css                              (resources/skin/modern/titledSplitter.css)
-  skin/modern/inspector/titledsplitter-close.png                        (resources/skin/modern/titledsplitter-close.png)
-  skin/modern/inspector/panelset.css                                    (resources/skin/modern/panelset.css)
-  skin/modern/inspector/sidebar.css                                     (resources/skin/modern/sidebar.css)
-  skin/modern/inspector/iconViewerMenu.png                              (resources/skin/modern/iconViewerMenu.png)
-  skin/modern/inspector/iconViewerList.png                              (resources/skin/modern/iconViewerList.png)
-  skin/modern/inspector/iconViewerList-dis.png                          (resources/skin/modern/iconViewerList-dis.png)
-  skin/modern/inspector/viewers/accessibleEvent/accessibleEvent.css     (resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css)
-  skin/modern/inspector/viewers/accessibleEvents/accessibleEvents.css   (resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css)
-  skin/modern/inspector/viewers/accessibleProps/accessibleProps.css     (resources/skin/modern/viewers/accessibleProps/accessibleProps.css)
-  skin/modern/inspector/viewers/accessibleTree/accessibleTree.css       (resources/skin/modern/viewers/accessibleTree/accessibleTree.css)
-  skin/modern/inspector/viewers/boxModel/boxModel.css                   (resources/skin/modern/viewers/boxModel/boxModel.css)
-  skin/modern/inspector/viewers/dom/columnsDialog.css                   (resources/skin/modern/viewers/dom/columnsDialog.css)
-  skin/modern/inspector/viewers/dom/dom.css                             (resources/skin/modern/viewers/dom/dom.css)
-  skin/modern/inspector/viewers/dom/findDialog.css                      (resources/skin/modern/viewers/dom/findDialog.css)
-  skin/modern/inspector/viewers/domNode/domNode.css                     (resources/skin/modern/viewers/domNode/domNode.css)
-  skin/modern/inspector/viewers/styleRules/styleRules.css               (resources/skin/modern/viewers/styleRules/styleRules.css)
-  skin/modern/inspector/viewers/xblBindings/xblBindings.css             (resources/skin/modern/viewers/xblBindings/xblBindings.css)
-% resource inspector modules/
diff --git a/suite/extensions/inspector/modules/InspectElement.jsm b/suite/extensions/inspector/modules/InspectElement.jsm
deleted file mode 100644
--- a/suite/extensions/inspector/modules/InspectElement.jsm
+++ /dev/null
@@ -1,106 +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 https://mozilla.org/MPL/2.0/. */
-
-var EXPORTED_SYMBOLS = ["InspectElement"];
-
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-
-var InspectElement = {
-  handleEvent: function(e) {
-    // Shift + right click.
-    if (!e.shiftKey || e.button != 2) {
-      return;
-    }
-
-    try {
-      e.stopPropagation();
-      e.preventDefault();
-    } catch (ex) {}
-
-    if (e.type != "click") {
-      return;
-    }
-
-    let elem = e.originalTarget;
-    let shadowElem = e.target;
-    let win = e.currentTarget;
-    this.inspect(win, elem, shadowElem);
-  },
-  inspect: function(win, elem, shadowElem) {
-    win.openDialog("chrome://inspector/content/", "_blank",
-                   "chrome, all, dialog=no", elem);
-    this.closePopup(elem, win);
-  },
-  closePopup: function (elem, win) {
-    var parent = elem.parentNode;
-    var list = [];
-
-    while (parent != win && parent != null) {
-      if (parent.localName == "menupopup" || parent.localName == "popup") {
-        list.push(parent);
-      }
-      parent = parent.parentNode;
-    }
-
-    var len = list.length;
-
-    if (!len) {
-      return;
-    }
-
-    list[len - 1].hidePopup();
-  },
-  aListener: {
-    onOpenWindow: function (aWindow) {
-      var win = aWindow.docShell.QueryInterface(Ci.nsIInterfaceRequestor)
-                                .getInterface(Ci.nsIDOMWindow);
-
-      win.addEventListener("load", function _inspect() {
-        this.removeEventListener("load", _inspect, false);
-        win.addEventListener("click", InspectElement, true);
-
-        if (Services.appinfo.OS == "WINNT") {
-          return;
-        }
-
-        win.addEventListener("mouseup", InspectElement, false);
-        win.addEventListener("contextmenu", InspectElement, true);
-      }, false);
-    },
-    onCloseWindow: function (aWindow) {},
-    onWindowTitleChange: function (aWindow, aTitle) {},
-  },
-  init: function() {
-     Services.wm.addListener(this.aListener);
-    var cw =  Services.ww.getWindowEnumerator();
-
-    while (cw.hasMoreElements()) {
-      var win = cw.getNext().QueryInterface(Ci.nsIDOMWindow);
-      win.addEventListener("click", InspectElement, true);
-
-      if (Services.appinfo.OS == "WINNT") {
-        continue;
-      }
-
-      win.addEventListener("mouseup", InspectElement, false);
-      win.addEventListener("contextmenu", InspectElement, true);
-    }
-  },
-  uninit: function() {
-    Services.wm.removeListener(this.aListener);
-    var cw =  Services.ww.getWindowEnumerator();
-
-    while (cw.hasMoreElements()) {
-      var win = cw.getNext().QueryInterface(Ci.nsIDOMWindow);
-      win.removeEventListener("click", InspectElement, true);
-
-      if (Services.appinfo.OS == "WINNT") {
-        continue;
-      }
-
-      win.removeEventListener("mouseup", InspectElement, false);
-      win.removeEventListener("contextmenu", InspectElement, true);
-    }
-  }
-}
\ No newline at end of file
diff --git a/suite/extensions/inspector/moz.build b/suite/extensions/inspector/moz.build
deleted file mode 100644
--- a/suite/extensions/inspector/moz.build
+++ /dev/null
@@ -1,31 +0,0 @@
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-DIRS += [
-    'resources',
-]
-
-XPI_NAME = 'inspector'
-export('XPI_NAME')
-
-NO_JS_MANIFEST = True
-USE_EXTENSION_MANIFEST = True
-
-JAR_MANIFESTS += ['jar.mn']
-
-JS_PREFERENCE_FILES += [
-    'resources/content/prefs/inspector.js',
-]
-
-EXTRA_COMPONENTS += [
-    'base/js/inspector-cmdline.js',
-    'base/js/inspector-startup.js',
-]
-
-EXTRA_JS_MODULES += ['modules/InspectElement.jsm']
-
-FINAL_TARGET_PP_FILES += [
-    'install.rdf',
-]
diff --git a/suite/extensions/inspector/resources/Makefile.in b/suite/extensions/inspector/resources/Makefile.in
deleted file mode 100644
--- a/suite/extensions/inspector/resources/Makefile.in
+++ /dev/null
@@ -1,39 +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/.
-
-DEPTH=../../../../..
-topsrcdir=@top_srcdir@
-srcdir=@srcdir@
-VPATH=@srcdir@
-
-include $(DEPTH)/config/autoconf.mk
-
-ALL_LOCALES = \
-	de \
-	el \
-	en-GB \
-	en-US \
-	pl \
-	ru \
-	sk \
-	sv-SE \
-	$(NULL)
-
-include $(topsrcdir)/config/config.mk
-
-include $(topsrcdir)/config/rules.mk
-
-libs realchrome:: locale/Makefile
-	@$(EXIT_ON_ERROR)                        \
-	for locale in $(ALL_LOCALES); do         \
-	  $(MAKE) -C locale AB_CD=$$locale;      \
-	done
-
-install::
-	@$(EXIT_ON_ERROR)                    \
-	for locale in $(ALL_LOCALES); do     \
-	  $(MAKE) -C locale AB_CD=$$locale install; \
-	done
-
diff --git a/suite/extensions/inspector/resources/content/Flasher.js b/suite/extensions/inspector/resources/content/Flasher.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/Flasher.js
+++ /dev/null
@@ -1,268 +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/. */
-
-/***************************************************************
-* Flasher ---------------------------------------------------
-*   Object for controlling a timed flashing animation which
-*   paints a border around an element.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-****************************************************************/
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-//////////// global variables /////////////////////
-
-//////////// global constants ////////////////////
-
-const isGecko58plus = Services.vc.compare(Services.appinfo.platformVersion, "58.0a1") >= 0;
-
-const HIGHLIGHTED_PSEUDO_CLASS = isGecko58plus? ":target" : ":-moz-devtools-highlighted";
-const INVERT = "filter: url(\"data:image/svg+xml;charset=utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='invert'><feColorMatrix in='SourceGraphic' type='matrix' values='-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0'/></filter></svg>%23invert\") !important; "
-
-////////////////////////////////////////////////////////////////////////////
-//// class Flasher
-
-function Flasher(aColor, aThickness, aDuration, aSpeed, aInvert)
-{
-  document.querySelector(HIGHLIGHTED_PSEUDO_CLASS);
-  this.mIOService = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService");
-  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
-  this.mShell = this.mDOMUtils;
-  this.color = aColor;
-  this.thickness = aThickness;
-  this.invert = aInvert;
-  this.duration = aDuration;
-  this.speed = aSpeed;
-}
-
-Flasher.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mFlashTimeout: null,
-  mElement: null,
-  mRegistryId: null,
-  mFlashes: 0,
-  mStartTime: 0,
-  mDOMUtils: null,
-  mWinUtils: null,
-  mStyleURI: null,
-  mColor: "#000000",
-  mInvert: false,
-  mThickness: 0,
-  mDuration: 0,
-  mSpeed: 0,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Properties
-
-  get flashing() { return this.mFlashTimeout != null; },
-
-  get element() { return this.mElement; },
-  set element(val)
-  {
-    if (val && val.nodeType == Node.ELEMENT_NODE) {
-      this.mElement = val;
-      this.mShell.scrollElementIntoView(val);
-      this.mWinUtils = val.ownerDocument.defaultView
-                          .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                          .getInterface(Components.interfaces.nsIDOMWindowUtils);
-    } else {
-      throw "Invalid node type.";
-    }
-  },
-
-  get color() { return this.mColor; },
-  set color(aVal)
-  {
-    var spacer = document.createElement("spacer");
-    spacer.style.color = aVal;
-    if (spacer.style.color) {
-      this.mStyleURI = null;
-      this.mColor = aVal;
-    }
-    return aVal;
-  },
-
-  get thickness() { return this.mThickness | 0; },
-  set thickness(aVal) { this.mStyleURI = null; return this.mThickness = aVal; },
-
-  get duration() { return this.mDuration; },
-  set duration(aVal) { this.mDuration = aVal; },
-
-  get speed() { return this.mSpeed; },
-  set speed(aVal) { this.mSpeed = aVal; },
-
-  get invert() { return !!this.mInvert; },
-  set invert(aVal) { this.mStyleURI = null; return this.mInvert = aVal; },
-
-  // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-  // :::::::::::::::::::: Methods ::::::::::::::::::::::::::::
-  // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::
-
-  start: function(aDuration, aSpeed, aHold)
-  {
-    if (!this.mStyleURI) {
-      var styleURI = "data:text/css;charset=utf-8," + HIGHLIGHTED_PSEUDO_CLASS +
-                     " { outline: " + this.thickness + "px solid " +
-                     encodeURIComponent(this.color) +
-                     " !important; outline-offset: " + -this.thickness +
-                     "px !important; " + (this.invert ? INVERT : "") + "}";
-      this.mStyleURI = this.mIOService.newURI(styleURI, null, null);
-    }
-
-    this.mWinUtils.loadSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET);
-    this.mUDuration = aDuration ? aDuration * 1000 : this.mDuration;
-    this.mUSpeed = aSpeed ? aSpeed : this.mSpeed;
-    this.mHold = aHold;
-    this.mFlashes = 0;
-    this.mStartTime = Date.now();
-    this.doFlash();
-  },
-
-  doFlash: function()
-  {
-    if (this.mHold || this.mFlashes & 1) {
-      this.paintOn();
-    } else {
-      this.paintOff();
-    }
-    this.mFlashes++;
-
-    if (this.mUDuration < 0 || Date.now() - this.mStartTime < this.mUDuration) {
-      this.mFlashTimeout = window.setTimeout(this.timeout, this.mUSpeed, this);
-    } else {
-      this.stop();
-    }
-  },
-
-  timeout: function(self)
-  {
-    self.doFlash();
-  },
-
-  stop: function()
-  {
-    if (this.flashing) {
-      this.mWinUtils.removeSheet(this.mStyleURI, this.mWinUtils.AGENT_SHEET);
-      window.clearTimeout(this.mFlashTimeout);
-      this.mFlashTimeout = null;
-      this.paintOff();
-    }
-  },
-
-  paintOn: function()
-  {
-    this.mDOMUtils.addPseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS);
-  },
-
-  paintOff: function()
-  {
-    this.mDOMUtils.removePseudoClassLock(this.mElement, HIGHLIGHTED_PSEUDO_CLASS);
-  }
-
-};
-
-////////////////////////////////////////////////////////////////////////////////
-//// DOMIFlasher
-
-/**
- * The special version of the flasher operating with DOM Inspector flasher
- * preferences.
- */
-function DOMIFlasher()
-{
-  this.init();
-}
-
-DOMIFlasher.prototype =
-{
-  //////////////////////////////////////////////////////////////////////////////
-  //// Public
-
-  get flashOnSelect() { return PrefUtils.getPref("inspector.blink.on"); },
-  set flashOnSelect(aVal) { PrefUtils.setPref("inspector.blink.on", aVal); },
-
-  get color() { return PrefUtils.getPref("inspector.blink.border-color"); },
-  set color(aVal) { PrefUtils.setPref("inspector.blink.border-color", aVal); },
-
-  get thickness() { return PrefUtils.getPref("inspector.blink.border-width"); },
-  set thickness(aVal) { PrefUtils.setPref("inspector.blink.border-width", aVal); },
-
-  get duration() { return PrefUtils.getPref("inspector.blink.duration"); },
-  set duration(aVal) { PrefUtils.setPref("inspector.blink.duration", aVal); },
-
-  get speed() { return PrefUtils.getPref("inspector.blink.speed"); },
-  set speed(aVal) { PrefUtils.setPref("inspector.blink.speed", aVal); },
-
-  get invert() { return PrefUtils.getPref("inspector.blink.invert"); },
-  set invert(aVal) { PrefUtils.setPref("inspector.blink.invert", aVal); },
-
-  flashElement: function DOMIFlasher_flashElement(aElement)
-  {
-    if (this.mFlasher.flashing)
-      this.mFlasher.stop();
-
-    this.mFlasher.element = aElement;
-    this.mFlasher.start();
-  },
-
-  flashElementOnSelect: function DOMIFlasher_flashElementOnSelect(aElement)
-  {
-    if (this.flashOnSelect) {
-      this.flashElement(aElement);
-    }
-  },
-
-  destroy: function DOMIFlasher_destroy()
-  {
-    PrefUtils.removeObserver("inspector.blink.", this);
-  },
-
-  //////////////////////////////////////////////////////////////////////////////
-  //// Private
-
-  init: function DOMIFlasher_init()
-  {
-    this.mFlasher = new Flasher(this.color, this.thickness, this.duration,
-                                this.speed, this.invert);
-
-    PrefUtils.addObserver("inspector.blink.", this);
-
-    this.updateFlashOnSelectCommand();
-  },
-
-  updateFlashOnSelectCommand: function DOMIFlasher_updateFlashOnSelectCommand()
-  {
-    var cmdEl = document.getElementById("cmdFlashOnSelect");
-    if (this.flashOnSelect) {
-      cmdEl.setAttribute("checked", "true");
-    } else {
-      cmdEl.removeAttribute("checked");
-    }
-  },
-
-  observe: function DOMIFlasher_observe(aSubject, aTopic, aData)
-  {
-    if (aData == "inspector.blink.on") {
-      this.updateFlashOnSelectCommand();
-      return;
-    }
-
-    var value = PrefUtils.getPref(aData);
-
-    if (aData == "inspector.blink.border-color") {
-      this.mFlasher.color = value;
-    } else if (aData == "inspector.blink.border-width") {
-      this.mFlasher.thickness = value;
-    } else if (aData == "inspector.blink.duration") {
-      this.mFlasher.duration = value;
-    } else if (aData == "inspector.blink.speed") {
-      this.mFlasher.speed = value;
-    } else if (aData == "inspector.blink.invert") {
-      this.mFlasher.invert = value;
-    }
-  }
-}
diff --git a/suite/extensions/inspector/resources/content/ViewerRegistry.js b/suite/extensions/inspector/resources/content/ViewerRegistry.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/ViewerRegistry.js
+++ /dev/null
@@ -1,251 +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/. */
-
-/*****************************************************************************
-* ViewerRegistry -------------------------------------------------------------
-*   The central registry where information about all installed viewers is
-*   kept.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/rdf/RDFU.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kViewerURLPrefix = "chrome://inspector/content/viewers/";
-const kViewerRegURL  = "chrome://inspector/content/res/viewer-registry.rdf";
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class ViewerRegistry
-
-function ViewerRegistry() // implements inIViewerRegistry
-{
-  this.mViewerHash = {};
-}
-
-ViewerRegistry.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Interface inIViewerRegistry (not yet formalized...)
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mDS: null,
-  mObserver: null,
-  mViewerDS: null,
-  mViewerHash: null,
-  mFilters: null,
-
-  get url()
-  {
-    return this.mURL;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Loading Methods
-
-  load: function VR_Load(aURL, aObserver)
-  {
-    this.mURL = aURL;
-    this.mObserver = aObserver;
-    RDFU.loadDataSource(aURL, new ViewerRegistryLoadObserver(this));
-  },
-
-  onError: function VR_OnError(aStatus, aErrorMsg)
-  {
-    this.mObserver.onViewerRegistryLoadError(aStatus, aErrorMsg);
-  },
-
-  onLoad: function VR_OnLoad(aDS)
-  {
-    this.mDS = aDS;
-    this.prepareRegistry();
-    this.mObserver.onViewerRegistryLoad();
-  },
-
-  prepareRegistry: function VR_PrepareRegistry()
-  {
-    this.mViewerDS = RDFArray.fromContainer(this.mDS, "inspector:viewers",
-                                            kInspectorNSURI);
-
-    // create and cache the filter functions
-    var js, fn;
-    this.mFilters = [];
-    for (var i = 0; i < this.mViewerDS.length; ++i) {
-      js = this.getEntryProperty(i, "filter");
-      try {
-        fn = new Function("object", "linkedViewer", js);
-      }
-      catch (ex) {
-        fn = new Function("return false");
-        debug("### ERROR - Syntax error in filter for viewer \"" +
-              this.getEntryProperty(i, "description") + "\"\n");
-      }
-      this.mFilters.push(fn);
-    }
-  },
-
-  /**
-   * Returns the absolute url where the xul file for a viewer can be found.
-   *
-   * @param aIndex
-   *        The numerical index of the entry representing the viewer.
-   * @return A string of the fully canonized url.
-   */
-  getEntryURL: function VR_GetEntryURL(aIndex)
-  {
-    var uid = this.getEntryProperty(aIndex, "uid");
-    return kViewerURLPrefix + uid + "/" + uid + ".xul";
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Lookup Methods
-
-  /**
-   * Searches the viewer registry for all viewers that can view a particular
-   * object.
-   *
-   * @param aObject
-   *        The object being searched against.
-   * @param aPanelId
-   *        A string containing the id of the panel requesting viewers.
-   * @param aLinkedViewer
-   *        The view object of linked panel.
-   * @return An array of nsIRDFResource entries in the viewer registry.
-   */
-  findViewersForObject:
-    function VR_FindViewersForObject(aObject, aPanelId, aLinkedViewer)
-  {
-    // check each entry in the registry
-    var len = this.mViewerDS.length;
-    var entry;
-    var urls = [];
-    for (var i = 0; i < len; ++i) {
-      if (this.getEntryProperty(i, "panels").indexOf(aPanelId) == -1) {
-        continue;
-      }
-      if (this.objectMatchesEntry(aObject, aLinkedViewer, i)) {
-        if (this.getEntryProperty(i, "important")) {
-          urls.unshift(i);
-        } else {
-          urls.push(i);
-        }
-      }
-    }
-
-    return urls;
-  },
-
-  /**
-   * Determines if an object is eligible to be viewed by a particular viewer.
-   *
-   * @param aObject
-   *        The object being checked for eligibility.
-   * @param aLinkedViewer
-   *        The view object of linked panel.
-   * @param aIndex
-   *        The numerical index of the entry.
-   * @return true if object can be viewed.
-   */
-  objectMatchesEntry:
-    function VR_ObjectMatchesEntry(aObject, aLinkedViewer, aIndex)
-  {
-    try {
-      return this.mFilters[aIndex](aObject, aLinkedViewer);
-    }
-    catch (ex) {
-      Components.utils.reportError(ex);
-    }
-    return false;
-  },
-
-  /**
-   * Notifies the registry that a viewer has been instantiated, and that it
-   * corresponds to a particular entry in the viewer registry.
-   *
-   * @param aViewer
-   *        The inIViewer object to cache.
-   * @param aIndex
-   *        The numerical index of the entry.
-   */
-  cacheViewer: function VR_CacheViewer(aViewer, aIndex)
-  {
-    var uid = this.getEntryProperty(aIndex, "uid");
-    this.mViewerHash[uid] = { viewer: aViewer, entry: aIndex };
-  },
-
-  uncacheViewer: function VR_UncacheViewer(aViewer)
-  {
-    delete this.mViewerHash[aViewer.uid];
-  },
-
-  // for previously loaded viewers only
-  getViewerByUID: function VR_GetViewerByUID(aUID)
-  {
-    return this.mViewerHash[aUID].viewer;
-  },
-
-  // for previously loaded viewers only
-  getEntryForViewer: function VR_GetEntryForViewer(aViewer)
-  {
-    return this.mViewerHash[aViewer.uid].entry;
-  },
-
-  // for previously loaded viewers only
-  getEntryByUID: function VR_GetEntryByUID(aUID)
-  {
-    return this.mViewerHash[aUID].aIndex;
-  },
-
-  getEntryProperty: function VR_GetEntryProperty(aIndex, aProp)
-  {
-    return this.mViewerDS.get(aIndex, aProp);
-  },
-
-  getEntryCount: function VR_GetEntryCount()
-  {
-    return this.mViewerDS.length;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Viewer Registration
-
-  addNewEntry: function VR_AddNewEntry(aUID, aDescription, aFilter)
-  {
-  },
-
-  removeEntry: function VR_RemoveEntry(aIndex)
-  {
-  },
-
-  saveRegistry: function VR_SaveRegistry()
-  {
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////
-//// Listener Objects
-
-function ViewerRegistryLoadObserver(aTarget)
-{
-  this.mTarget = aTarget;
-}
-
-ViewerRegistryLoadObserver.prototype =
-{
-  mTarget: null,
-
-  onError: function VRLO_OnError(aStatus, aErrorMsg)
-  {
-    this.mTarget.onError(aStatus, aErrorMsg);
-  },
-
-  onDataSourceReady: function VRLO_OnDataSourceReady(aDS)
-  {
-    this.mTarget.onLoad(aDS);
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/commandOverlay.xul b/suite/extensions/inspector/resources/content/commandOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/commandOverlay.xul
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<overlay id="ovCommandsMain"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <commandset id="cmdsGlobalCommands">
-
-    <command id="cmdGotoURL"
-             ontextentered="inspector.gotoTypedURL();"
-             oncommand="inspector.gotoTypedURL();"/>
-
-    <command id="cmdEnterLocation"
-             oncommand="inspector.enterLocation();"/>
-    <command id="cmdSave" oncommand="inspector.save();"/>
-    <command id="cmdClose" oncommand="inspector.exit();"/>
-
-    <command id="cmdShowPrefsDialog"
-             oncommand="inspector.showPrefsDialog();"/>
-
-    <command id="cmdToggleDocument"
-             oncommand="inspector.toggleBrowser(true);"/>
-
-    <command id="cmdFlashOnSelect"
-             viewer="dom accessibleTree"
-             oncommand="inspector.toggleFlashOnSelect();"/>
-
-    <!-- These implement the editing commands needed by the top-level
-         inspectors.  See editingOverlay.xul for more information. -->
-    <command id="cmdEditUndo" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditUndo');"/>
-    <command id="cmdEditRedo" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditRedo');"/>
-    <command id="cmdEditCut" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditCut');"/>
-    <command id="cmdEditCopy" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditCopy');"/>
-    <command id="cmdEditPaste" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditPaste');"/>
-    <command id="cmdEditInsert" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditInsert');"/>
-    <command id="cmdEditEdit" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditEdit');"/>
-    <command id="cmdEditDelete" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditDelete');"/>
-    <command id="cmdEditInspectInNewWindow" global="true"
-             oncommand="inspector.doViewerCommand('cmdEditInspectInNewWindow');"/>
-
-  </commandset>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/editingOverlay.xul b/suite/extensions/inspector/resources/content/editingOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/editingOverlay.xul
+++ /dev/null
@@ -1,90 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/editing.dtd">
-
-<overlay id="ovEditing"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-<!-- This overlay is pulled in by popupOverlay.xul, which is itself pulled in
-     by the top-level inspectors (inspector.xul, object.xul, and sidebar.xul),
-     to add these items to its menus.  Additionally, this overlay is suitable
-     for use by viewers which want to offer any of these items (e.g., for
-     their context menus).  Note that the cmdsEditing commandset is used only
-     by viewers due to scoping differences; the implementation of the commands
-     used in the top-level inspectors can be found in commandOverlay.xul. -->
-
-  <commandset id="cmdsEditing">
-    <command id="cmdEditUndo"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditUndo');"/>
-    <command id="cmdEditRedo"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditRedo');"/>
-    <command id="cmdEditCut"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditCut');"/>
-    <command id="cmdEditCopy"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditCopy');"/>
-    <command id="cmdEditPaste"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPaste');"/>
-    <command id="cmdEditInsert"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInsert');"/>
-    <command id="cmdEditEdit"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditEdit');"/>
-    <command id="cmdEditDelete"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditDelete');"/>
-  </commandset>
-  <commandset id="cmdsEditingExtras">
-    <command id="cmdEditInspectInNewWindow"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInspectInNewWindow');"/>
-    <command id="cmdEditCopyFileURI"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditCopyFileURI');"/>
-    <command id="cmdEditViewFileURI"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditViewFileURI');"/>
-  </commandset>
-
-  <keyset id="ksGlobalKeyset">
-    <key id="keyEditUndo" key="z" modifiers="accel" command="cmdEditUndo"/>
-    <key id="keyEditRedo" key="z" modifiers="accel,shift"
-         command="cmdEditRedo"/>
-    <key id="keyEditRedo2" key="y" modifiers="accel" command="cmdEditRedo"/>
-    <key id="keyEditCut" key="x" modifiers="accel" command="cmdEditCut"/>
-    <key id="keyEditCopy" key="c" modifiers="accel" command="cmdEditCopy"/>
-    <key id="keyEditPaste" key="v" modifiers="accel" command="cmdEditPaste"/>
-    <key id="keyEditDelete" keycode="VK_DELETE" command="cmdEditDelete"/>
-    <key id="keyEditDeleteMac" keycode="VK_BACK" command="cmdEditDelete"/>
-    <key id="keyEditInspectInNewWindow" key="&mnEditInspectInNewWindow.key;"
-         modifiers="accel" command="cmdEditInspectInNewWindow"/>
-  </keyset>
-
-  <menuitem id="mnEditUndo" label="&mnEditUndo.label;" command="cmdEditUndo"
-            accesskey="&mnEditUndo.accesskey;" key="keyEditUndo"/>
-  <menuitem id="mnEditRedo" label="&mnEditRedo.label;" command="cmdEditRedo"
-            accesskey="&mnEditRedo.accesskey;" key="keyEditRedo"/>
-  <menuitem id="mnEditCut" label="&mnEditCut.label;" command="cmdEditCut"
-            accesskey="&mnEditCut.accesskey;" key="keyEditCut"/>
-  <menuitem id="mnEditCopy" label="&mnEditCopy.label;" command="cmdEditCopy"
-            accesskey="&mnEditCopy.accesskey;" key="keyEditCopy"/>
-  <menuitem id="mnEditPaste" label="&mnEditPaste.label;" command="cmdEditPaste"
-            accesskey="&mnEditPaste.accesskey;" key="keyEditPaste"/>
-  <menuitem id="mnEditInsert" label="&mnEditInsert.label;"
-            command="cmdEditInsert" accesskey="&mnEditInsert.accesskey;"/>
-  <menuitem id="mnEditEdit" label="&mnEditEdit.label;" command="cmdEditEdit"
-            accesskey="&mnEditEdit.accesskey;"/>
-  <menuitem id="mnEditDelete" label="&mnEditDelete.label;"
-            command="cmdEditDelete" accesskey="&mnEditDelete.accesskey;"
-            key="keyEditDelete"/>
-  <menuitem id="mnEditInspectInNewWindow"
-            label="&mnEditInspectInNewWindow.label;"
-            command="cmdEditInspectInNewWindow"
-            accesskey="&mnEditInspectInNewWindow.accesskey;"
-            key="keyEditInspectInNewWindow"/>
-  <menuitem id="mnEditCopyFileURI" label="&mnEditCopyFileURI.label;"
-            command="cmdEditCopyFileURI"
-            accesskey="&mnEditCopyFileURI.accesskey;"/>
-  <menuitem id="mnEditViewFileURI" label="&mnEditViewFileURI.label;"
-            command="cmdEditViewFileURI"
-            accesskey="&mnEditViewFileURI.accesskey;"/>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/extensions/titledSplitter.css b/suite/extensions/inspector/resources/content/extensions/titledSplitter.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/extensions/titledSplitter.css
+++ /dev/null
@@ -1,9 +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/. */
-
-@import url("chrome://inspector/skin/titledSplitter.css");
-
-.titled-splitter {
-  -moz-binding: url("titledSplitter.xml#titledSplitter") !important;
-}
diff --git a/suite/extensions/inspector/resources/content/extensions/titledSplitter.xml b/suite/extensions/inspector/resources/content/extensions/titledSplitter.xml
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/extensions/titledSplitter.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<bindings id="bdsTitledSplitter"
-          xmlns="http://www.mozilla.org/xbl"
-          xmlns:xbl="http://www.mozilla.org/xbl"
-          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <binding id="titledSplitter" extends="chrome://global/content/bindings/splitter.xml#splitter">
-    <content>
-      <xul:vbox class="titledsplitter-container" flex="1">
-        <xul:spacer class="titledsplitter-dragbar"/>
-        <xul:box class="titledsplitter-titlebox" flex="1" onmousedown="event.stopPropagation()">
-          <xul:box align="center">
-            <xul:label class="titledsplitter-text" xbl:inherits="value=label"/>
-          </xul:box>
-          <xul:spacer flex="1"/>
-          <xul:button class="titledsplitter-closebutton" align="center" pack="center"
-                   onclick="this.parentNode.parentNode.parentNode.close();">
-            <xul:image class="titledsplitter-closeimage"/>
-          </xul:button>
-        </xul:box>
-      </xul:vbox>
-    </content>
-
-    <implementation>
-      <property name="isOpened">
-        <getter><![CDATA[
-          return this.mOpened;
-        ]]></getter>
-      </property>
-
-      <property name="collapsee">
-        <getter><![CDATA[
-          var collapse = this.getAttribute("collapse");
-          return collapse == "before" ? this.previousSibling : this.nextSibling;
-        ]]></getter>
-      </property>
-
-      <method name="open">
-        <body><![CDATA[
-          var collapsee = this.collapsee;
-          if (collapsee) {
-            this.removeAttribute("closed");
-            this.removeAttribute("collapsed");
-            collapsee.removeAttribute("collapsed");
-            this.mOpened = true;
-            this.onopen();
-          }
-        ]]></body>
-      </method>
-
-      <method name="close">
-        <body><![CDATA[
-          var collapsee = this.collapsee;
-          if (collapsee) {
-            this.setAttribute("closed", "true");
-            this.setAttribute("collapsed", "true");
-            collapsee.setAttribute("collapsed", "true");
-            this.mOpened = false;
-            this.onopen();
-          }
-        ]]></body>
-      </method>
-      
-      <method name="onopen">
-        <body><![CDATA[
-          if (!this.mOnOpen) {
-            var js = this.getAttribute("onopen");
-            if (js)
-              this.mOnOpen = new Function(js);
-          }          
-
-          return this.mOnOpen ? this.mOnOpen() : null;
-        ]]></body>
-      </method>
-    
-	  <constructor><![CDATA[
-        this.mOpened = false;
-      ]]></constructor>
-    </implementation>
-    
-  </binding>
-
-</bindings>
diff --git a/suite/extensions/inspector/resources/content/extensions/wsm-colorpicker.js b/suite/extensions/inspector/resources/content/extensions/wsm-colorpicker.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/extensions/wsm-colorpicker.js
+++ /dev/null
@@ -1,51 +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/. */
-
-/***************************************************************
-* wsm-colorpicker ----------------------------------------------
-* Quick script which adds support for the color picker widget
-* to nsWidgetStateManager in the pref winodw.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-function AddColorPicker(aCallback)
-{
-  window.addEventListener("load", AddColorPicker_delayCheck, false);
-  window.AddColorPicker_callback = aCallback;
-}
-    
-function AddColorPicker_delayCheck()
-{
-  if (parent.hPrefWindow) 
-    AddColorPicker_addColorHandlers()
-  else
-    setTimeout("AddColorPicker_delayCheck()", 1);
-}
-
-function AddColorPicker_addColorHandlers() 
-{
-  parent.hPrefWindow.wsm.handlers.colorpicker = {
-    set: function (aElementID, aDataObject)
-    {
-      var wsm = parent.hPrefWindow.wsm;
-      var element = wsm.contentArea.document.getElementById( aElementID );
-      element.color = aDataObject.color;
-    },
-    
-    get: function (aElementID)
-    {
-      var wsm = parent.hPrefWindow.wsm;
-      var element = wsm.contentArea.document.getElementById( aElementID );
-      var dataObject = wsm.generic_Get(element);
-      if(dataObject) { 
-        dataObject.color = element.color;
-        return dataObject;
-      }
-      return null;
-    }
-  }
-
-  window.AddColorPicker_callback();
-}
diff --git a/suite/extensions/inspector/resources/content/hooks.js b/suite/extensions/inspector/resources/content/hooks.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/hooks.js
+++ /dev/null
@@ -1,21 +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/. */
-
-function inspectDOMDocument(aDocument, aModal)
-{
-  window.openDialog("chrome://inspector/content/", "_blank", 
-              "chrome,all,dialog=no"+(aModal?",modal":""), aDocument);
-}
-
-function inspectDOMNode(aNode, aModal)
-{
-  window.openDialog("chrome://inspector/content/", "_blank", 
-              "chrome,all,dialog=no"+(aModal?",modal":""), aNode);
-}
-
-function inspectObject(aObject, aModal)
-{
-  window.openDialog("chrome://inspector/content/object.xul", "_blank", 
-              "chrome,all,dialog=no"+(aModal?",modal":""), aObject);
-}
diff --git a/suite/extensions/inspector/resources/content/inspector.css b/suite/extensions/inspector/resources/content/inspector.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/inspector.css
+++ /dev/null
@@ -1,38 +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/. */
-
-@import url("chrome://inspector/content/extensions/titledSplitter.css");
-
-@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
-
-*[hide="true"] {
-  visibility: hidden;
-}
-
-domi-panelset {
-  -moz-binding: url("chrome://inspector/content/inspector.xml#panelset");
-  display: -moz-box;
-}
-
-domi-panel {
-  -moz-binding: url("chrome://inspector/content/inspector.xml#panel");
-  display: -moz-box;
-}
-
-#ppsViewerPopupset {
-  display: none;
-}
-
-.tree-list > treecol,
-.tree-list > .tree-columns > treecol {
-  -moz-binding: none;
-  background-color: transparent !important;
-  margin: 0px !important;
-  border: none !important;
-  padding: 0px !important;
-}
-
-.tree-nocolpicker > .tree-columns > .tree-columnpicker {
-  visibility: collapse;
-}
diff --git a/suite/extensions/inspector/resources/content/inspector.js b/suite/extensions/inspector/resources/content/inspector.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/inspector.js
+++ /dev/null
@@ -1,739 +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/. */
-
-/*****************************************************************************
-* InspectorApp ---------------------------------------------------------------
-*   The primary object that controls the Inspector application.
-*****************************************************************************/
-
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var inspector;
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kIsMac = /Mac/.test(navigator.platform);
-const kInspectorTitle =  kIsMac ?  "" : " - " + document.title;
-
-const kAccessibleRetrievalContractID =
-  "@mozilla.org/accessibleRetrieval;1";
-const kClipboardHelperContractID =
-  "@mozilla.org/widget/clipboardhelper;1";
-const kPromptServiceContractID =
-  "@mozilla.org/embedcomp/prompt-service;1";
-const kFOStreamContractID =
-  "@mozilla.org/network/file-output-stream;1";
-const kEncoderContractIDbase =
-  "@mozilla.org/layout/documentEncoder;1?type=";
-const kSerializerContractID =
-  "@mozilla.org/xmlextras/xmlserializer;1";
-const kWindowMediatorContractID =
-  "@mozilla.org/appshell/window-mediator;1";
-const kFilePickerContractID =
-  "@mozilla.org/filepicker;1";
-
-const nsIAccessible            = Components.interfaces.nsIAccessible;
-const nsIWebNavigation         = Components.interfaces.nsIWebNavigation;
-const nsIDocShellTreeItem      = Components.interfaces.nsIDocShellTreeItem;
-const nsIDocShell              = Components.interfaces.nsIDocShell;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", InspectorApp_initialize, false);
-window.addEventListener("unload", InspectorApp_destroy, false);
-
-function InspectorApp_initialize()
-{
-  inspector = new InspectorApp();
-
-  // window.arguments may be either a string or a node.
-  // If passed via a command line handler, it will be a uri string.
-  // If passed via navigator hooks, it will be a dom node to inspect.
-  var initNode, initURI;
-  if (window.arguments && window.arguments.length) {
-    if (typeof window.arguments[0] == "string") {
-      initURI = window.arguments[0];
-    }
-    else if (window.arguments[0] instanceof Components.interfaces.nsIDOMNode) {
-      initNode = window.arguments[0];
-    }
-  }
-  inspector.initialize(initNode, initURI);
-
-  // Enable/disable Mac outlier keys.
-  if (kIsMac) {
-    document.getElementById("keyEnterLocation2").setAttribute("disabled",
-                                                              "true");
-  }
-  else {
-    document.getElementById("keyEditDeleteMac").setAttribute("disabled",
-                                                             "true");
-  }
-
-  if (/Win/.test(navigator.platform)) {
-    document.getElementById("mnEditRedo").setAttribute("key", "keyEditRedo2");
-  }
-
-  // Get rid of any menus that we expose as overlay points for integration
-  // with several applications but aren't of use with the one hosting us here.
-  var menubar = document.getElementById("mbrInspectorMain");
-  var kid = menubar.firstChild;
-  while (kid) {
-    let nextSibling = kid.nextSibling;
-    if (!kid.hasChildNodes()) {
-      menubar.removeChild(kid);
-    }
-    kid = nextSibling;
-  }
-}
-
-function InspectorApp_destroy()
-{
-  inspector.destroy();
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class InspectorApp
-
-function InspectorApp()
-{
-}
-
-InspectorApp.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mShowBrowser: false,
-  mClipboardHelper: null,
-  mPromptService: null,
-
-  mDocPanel: null,
-  mObjectPanel: null,
-  mDocViewerListPopup: null,
-  mObjectViewerListPopup: null,
-
-  mLastKnownDocPanelSubject: null,
-  mLastKnownObjectPanelSubject: null,
-
-  get document()
-  {
-    return this.mDocPanel.viewer.subject
-  },
-
-  get panelset()
-  {
-    return this.mPanelSet;
-  },
-
-  initialize: function IA_Initialize(aTarget, aURI)
-  {
-    this.mInitTarget = aTarget;
-
-    var el = document.getElementById("bxBrowser");
-    el.addEventListener("pageshow", BrowserPageShowListener, true);
-
-    this.setBrowser(false, true);
-
-    this.mClipboardHelper = XPCU.getService(kClipboardHelperContractID,
-                                            "nsIClipboardHelper");
-    this.mPromptService = XPCU.getService(kPromptServiceContractID,
-                                          "nsIPromptService");
-
-    this.mDocViewerListPopup =
-      document.getElementById("mppDocViewerList");
-    this.mObjectViewerListPopup =
-      document.getElementById("mppObjectViewerList");
-
-    this.mPanelSet = document.getElementById("bxPanelSet");
-    this.mPanelSet.addObserver("panelsetready", this);
-    this.mPanelSet.initialize();
-
-    // check if accessibility service is available
-    if (!(kAccessibleRetrievalContractID in Components.classes)) {
-      var elm = document.getElementById("cmd:toggleAccessibleNodes");
-      if (elm) {
-        elm.setAttribute("disabled", "true");
-      }
-
-      elm = document.getElementById("mnInspectApplicationAccessible");
-      if (elm) {
-        elm.setAttribute("disabled", "true");
-      }
-    }
-
-    if (aURI) {
-      this.gotoURL(aURI);
-    }
-  },
-
-  destroy: function IA_Destroy()
-  {
-    InsUtil.persistAll("bxDocPanel");
-    InsUtil.persistAll("bxObjectPanel");
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Viewer Panels
-
-  initViewerPanels: function IA_InitViewerPanels()
-  {
-    this.mDocPanel = this.mPanelSet.getPanel(0);
-    this.mDocPanel.addObserver("subjectChange", this);
-    this.mObjectPanel = this.mPanelSet.getPanel(1);
-    this.mObjectPanel.addObserver("subjectChange", this);
-
-    if (this.mInitTarget) {
-      if (this.mInitTarget.nodeType == Node.DOCUMENT_NODE) {
-        this.setTargetDocument(this.mInitTarget, false);
-      }
-      else if (this.mInitTarget.nodeType == Node.ELEMENT_NODE) {
-        this.setTargetDocument(this.mInitTarget.ownerDocument, false);
-        this.mDocPanel.params = this.mInitTarget;
-      }
-      this.mInitTarget = null;
-    }
-  },
-
-  onEvent: function IA_OnEvent(aEvent)
-  {
-    switch (aEvent.type) {
-      case "panelsetready":
-        this.initViewerPanels();
-        break;
-      case "subjectChange":
-        // A subjectChange really means the *viewer's* subject changed, and
-        // one will be dispatched everytime a new viewer is loaded.  Don't
-        // update the entries if the panel's subject is the same as before and
-        // the subjectChange was only dispatched because of a new viewer.
-        if (aEvent.target == this.mDocPanel.viewer) {
-          let panel = this.mDocPanel;
-          let mpp = this.mDocViewerListPopup;
-          // Update the viewer list.
-          if (this.mLastKnownDocPanelSubject != aEvent.subject) {
-            panel.rebuildViewerList(mpp);
-            this.mLastKnownDocPanelSubject = aEvent.subject;
-          }
-          panel.updateViewerListSelection(mpp);
-
-          if (aEvent.subject) {
-            if ("location" in aEvent.subject) {
-              // display document url
-              this.locationText = aEvent.subject.location;
-  
-              document.title =
-                (aEvent.subject.title || aEvent.subject.location) +
-                kInspectorTitle;
-  
-              this.updateCommand("cmdSave");
-            }
-            else if (("nsIAccessibleApplication" in Components.interfaces &&
-                      aEvent.subject instanceof
-                        Components.interfaces.nsIAccessibleApplication) ||
-                     (aEvent.subject instanceof nsIAccessible &&
-                      !aEvent.subject.parent)) {
-              // Update title for application accessible in compatible way for
-              // Gecko 2.0 and 1.9.2.
-              this.locationText = "";
-
-              var title = this.mPanelSet.
-                stringBundle.getString("applicationAccesible.title");
-              document.title = title + kInspectorTitle;
-
-              this.updateCommand("cmdSave");
-            }
-          }
-        }
-        else if (aEvent.target == this.mObjectPanel.viewer) {
-          let panel = this.mObjectPanel;
-          let mpp = this.mObjectViewerListPopup;
-          // Update the viewer list.
-          if (this.mLastKnownObjectPanelSubject != aEvent.subject) {
-            panel.rebuildViewerList(mpp);
-            this.mLastKnownObjectPanelSubject = aEvent.subject;
-          }
-          panel.updateViewerListSelection(mpp);
-        }
-        break;
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// UI Commands
-
-  updateCommand: function IA_UpdateCommand(aCommand)
-  {
-    var command = document.getElementById(aCommand);
-
-    var disabled = false;
-    switch (aCommand) {
-      case "cmdSave":
-        var doc = this.mDocPanel.subject;
-        disabled =
-          !((kEncoderContractIDbase + doc.contentType) in Components.classes ||
-            (kSerializerContractID in Components.classes));
-        break;
-    }
-
-    command.setAttribute("disabled", disabled);
-  },
-
-  doViewerCommand: function IA_DoViewerCommand(aCommand)
-  {
-    this.mPanelSet.execCommand(aCommand);
-  },
-
-  enterLocation: function IA_EnterLocation()
-  {
-    this.locationBar.focus();
-    this.locationBar.select();
-  },
-
-  showPrefsDialog: function IA_ShowPrefsDialog()
-  {
-    goPreferences("inspector_pane");
-  },
-
-  toggleBrowser: function IA_ToggleBrowser(aToggleSplitter)
-  {
-    this.setBrowser(!this.mShowBrowser, aToggleSplitter)
-  },
-
-  /**
-   * Toggle 'blink on select' command.
-   */
-  toggleFlashOnSelect: function IA_ToggleFlashOnSelect()
-  {
-    this.mPanelSet.flasher.flashOnSelect =
-      !this.mPanelSet.flasher.flashOnSelect;
-  },
-
-  setBrowser: function IA_SetBrowser(aValue, aToggleSplitter)
-  {
-    this.mShowBrowser = aValue;
-    if (aToggleSplitter) {
-      this.openSplitter("Browser", aValue);
-    }
-    var cmd = document.getElementById("cmdToggleDocument");
-    cmd.setAttribute("checked", aValue);
-  },
-
-  openSplitter: function IA_OpenSplitter(aName, aTruth)
-  {
-    var splitter = document.getElementById("spl" + aName);
-    if (aTruth) {
-      splitter.open();
-    }
-    else {
-      splitter.close();
-    }
-  },
-
- /**
-  * Saves the current document state in the inspector.
-  */
-  save: function IA_Save()
-  {
-    var picker = XPCU.createInstance(kFilePickerContractID, "nsIFilePicker");
-    var title = document.getElementById("mi-save").label;
-    picker.init(window, title, picker.modeSave)
-    picker.appendFilters(picker.filterHTML | picker.filterXML |
-                         picker.filterXUL);
-    if (picker.show() == picker.returnCancel) {
-      return;
-    }
-
-    var fos = XPCU.createInstance(kFOStreamContractID, "nsIFileOutputStream");
-    const flags = 0x02 | 0x08 | 0x20; // write, create, truncate
-
-    var doc = this.mDocPanel.subject;
-    if ((kEncoderContractIDbase + doc.contentType) in Components.classes) {
-      // first we try to use the document encoder for that content type.  If
-      // that fails, we move on to the xml serializer.
-      var encoder =
-        XPCU.createInstance(kEncoderContractIDbase + doc.contentType,
-                            "nsIDocumentEncoder");
-      encoder.init(doc, doc.contentType, encoder.OutputRaw);
-      encoder.setCharset(doc.characterSet);
-      fos.init(picker.file, flags, -1, 0);
-      try {
-        encoder.encodeToStream(fos);
-      }
-      finally {
-        fos.close();
-      }
-    }
-    else {
-      var serializer = XPCU.createInstance(kSerializerContractID,
-                                          "nsIDOMSerializer");
-      fos.init(picker.file, flags, -1, 0);
-      try {
-        serializer.serializeToStream(doc, fos);
-      }
-      finally {
-        fos.close();
-      }
-    }
-  },
-
-  exit: function IA_Exit()
-  {
-    window.close();
-    // Todo: remove observer service here
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Navigation
-
-  gotoTypedURL: function IA_GotoTypedURL()
-  {
-    var url = document.getElementById("tfURLBar").value;
-    this.gotoURL(url);
-  },
-
-  gotoURL: function IA_GotoURL(aURL, aNoSaveHistory)
-  {
-    this.mPendingURL = aURL;
-    this.mPendingNoSave = aNoSaveHistory;
-    this.browseToURL(aURL);
-    this.setBrowser(true, true);
-  },
-
-  browseToURL: function IA_BrowseToURL(aURL)
-  {
-    try {
-      this.webNavigation.loadURI(aURL, nsIWebNavigation.LOAD_FLAGS_NONE, null,
-                                 null, null);
-    }
-    catch(ex) {
-      // nsIWebNavigation.loadURI will spit out an appropriate user prompt, so
-      // we don't need to do anything here.  See nsDocShell::DisplayLoadError()
-    }
-  },
-
- /**
-  * Creates the submenu for Inspect Content/Chrome Document
-  */
-  showInspectDocumentList:
-    function IA_ShowInspectDocumentList(aEvent, aChrome)
-  {
-    var menu = aEvent.target;
-    var ww = XPCU.getService(kWindowMediatorContractID, "nsIWindowMediator");
-    var windows = ww.getXULWindowEnumerator(null);
-    var docs = [];
-
-    while (windows.hasMoreElements()) {
-      try {
-        // Get the window's main docshell
-        var windowDocShell =
-          XPCU.QI(windows.getNext(), "nsIXULWindow").docShell;
-        this.appendContainedDocuments(docs, windowDocShell,
-                                      aChrome ?
-                                        nsIDocShellTreeItem.typeChrome :
-                                        nsIDocShellTreeItem.typeContent);
-      }
-      catch (ex) {
-        // We've failed with this window somehow, but we're catching the error
-        // so the others will still work
-        Components.utils.reportError(ex);
-      }
-    }
-
-    // Clear out any previous menu
-    this.emptyChildren(menu);
-
-    // Now add what we found to the menu
-    if (!docs.length) {
-      var noneMenuItem = document.createElementNS(kXULNSURI, "menuitem");
-      var label = this.mPanelSet.stringBundle.getString(
-        "inspectWindow.noDocuments.message"
-      );
-      noneMenuItem.setAttribute("label", label);
-      noneMenuItem.setAttribute("disabled", true);
-      menu.appendChild(noneMenuItem);
-    }
-    else {
-      for (var i = 0; i < docs.length; i++) {
-        this.addInspectDocumentMenuItem(menu, docs[i], i + 1);
-      }
-    }
-  },
-
- /**
-  * Appends to the array the documents contained in docShell (including the
-  * passed docShell itself).
-  *
-  * @param array
-  *        The array to append to.
-  * @param docShell
-  *        The docshell to look for documents in.
-  * @param type
-  *        One of the types defined in nsIDocShellTreeItem.
-  */
-  appendContainedDocuments:
-    function IA_AppendContainedDocuments(array, docShell, type)
-  {
-    // Load all the window's content docShells
-    var containedDocShells = docShell.getDocShellEnumerator(type,
-                                      nsIDocShell.ENUMERATE_FORWARDS);
-    while (containedDocShells.hasMoreElements()) {
-      try {
-        // Get the corresponding document for this docshell
-        var childDoc = XPCU.QI(containedDocShells.getNext(), "nsIDocShell")
-                         .contentViewer.DOMDocument;
-
-        // Ignore the DOM Inspector's browser docshell if it's not being used
-        if (docShell.contentViewer.DOMDocument.location.href !=
-              document.location.href ||
-            childDoc.location.href != "about:blank") {
-          array.push(childDoc);
-        }
-      }
-      catch (ex) {
-        // We've failed with this document somehow, but we're catching the
-        // error so the others will still work
-        dump(ex + "\n");
-      }
-    }
-  },
-
- /**
-  * Creates a menu item for Inspect Document.
-  *
-  * @param doc
-  *        Document related to this menu item.
-  * @param docNumber
-  *        The position of the document.
-  */
-  addInspectDocumentMenuItem:
-    function IA_AddInspectDocumentMenuItem(parent, doc, docNumber)
-  {
-    var menuItem = document.createElementNS(kXULNSURI, "menuitem");
-    menuItem.doc = doc;
-    // Use the URL if there's no title
-    var title = doc.title || doc.location.href;
-    // The first ten items get numeric access keys
-    if (docNumber < 10) {
-      menuItem.setAttribute("label", docNumber + " " + title);
-      menuItem.setAttribute("accesskey", docNumber);
-    }
-    else {
-      menuItem.setAttribute("label", title);
-    }
-    parent.appendChild(menuItem);
-  },
-
-  setTargetApplicationAccessible: function setTargetApplicationAccessible()
-  {
-    var accService =
-      XPCU.getService(kAccessibleRetrievalContractID, "nsIAccessibleRetrieval");
-
-    if (accService) {
-      if ("getApplicationAccessible" in accService) {
-        this.mDocPanel.subject = accService.getApplicationAccessible();
-      }
-      else {
-        // Gecko 1.9.2 support.
-        var accessible = accService.getAccessibleFor(document);
-        while (accessible.parent) {
-          accessible = accessible.parent;
-        }
-        this.mDocPanel.subject = accessible;
-      }
-    }
-  },
-
-  setTargetWindow: function IA_SetTargetWindow(aWindow)
-  {
-    this.setTargetDocument(aWindow.document, true);
-  },
-
-  setTargetDocument: function IA_SetTargetDocument(aDoc, aIsInternal)
-  {
-    var cmd = document.getElementById("cmdToggleDocument");
-
-    if (aIsInternal == undefined) {
-      aIsInternal = false;
-    }
-
-    cmd.setAttribute("disabled", !aIsInternal);
-    this.setBrowser(aIsInternal, true);
-
-    this.mDocPanel.subject = aDoc;
-  },
-
-  get webNavigation()
-  {
-    var browser = document.getElementById("ifBrowser");
-    return browser.webNavigation;
-  },
-
-  get locationBar()
-  {
-    return document.getElementById("tfURLBar");
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// UI Labels Getters and Setters
-
-  get locationText()
-  {
-    return this.locationBar.value;
-  },
-
-  set locationText(aText)
-  {
-    this.locationBar.value = aText;
-  },
-
-  get statusText()
-  {
-    return document.getElementById("txStatus").value;
-  },
-
-  set statusText(aText)
-  {
-    document.getElementById("txStatus").value = aText;
-  },
-
-  get progress()
-  {
-    return document.getElementById("pmStatus").value;
-  },
-
-  set progress(aPct)
-  {
-    document.getElementById("pmStatus").value = aPct;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Document Loading
-
-  documentLoaded: function IA_DocumentLoaded()
-  {
-    this.setTargetWindow(content);
-
-    var url = this.webNavigation.currentURI.spec;
-
-    // put the url into the urlbar
-    this.locationText = url;
-
-    // add url to the history, unless explicity told not to
-    if (!this.mPendingNoSave) {
-      this.addToHistory(url);
-    }
-
-    this.mPendingURL = null;
-    this.mPendingNoSave = null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// History
-
-  addToHistory: function IA_AddToHistory(aURL)
-  {
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Uncategorized
-
-  get isViewingContent()
-  {
-    return this.mPanelSet.getPanel(0).subject != null;
-  },
-
-  fillInTooltip: function IA_FillInTooltip(aMenuItem)
-  {
-    var doc = aMenuItem.doc;
-    if (!doc) {
-      return false;
-    }
-
-    var titleLabel = document.getElementById("docItemsTitle");
-    var uriLabel = document.getElementById("docItemsURI");
-    titleLabel.value = doc.title;
-    uriLabel.value = doc.location.href;
-    titleLabel.hidden = !titleLabel.value;
-    return true;
-  },
-
-  initPopup: function IA_InitPopup(aPopup)
-  {
-    var items = aPopup.getElementsByTagName("menuitem");
-    var js, fn, item;
-    for (var i = 0; i < items.length; i++) {
-      item = items[i];
-      fn = "isDisabled" in item ? item.isDisabled : null;
-      if (!fn) {
-        js = item.getAttribute("isDisabled");
-        if (js) {
-          fn = new Function(js);
-          item.isDisabled = fn;
-        }
-        else {
-          // to prevent annoying "strict" warning messages
-          item.isDisabled = null;
-        }
-      }
-      if (fn) {
-        if (item.isDisabled()) {
-          item.setAttribute("disabled", "true");
-        }
-        else {
-          item.removeAttribute("disabled");
-        }
-      }
-
-      fn = null;
-    }
-  },
-
-  emptyChildren: function IA_EmptyChildren(aNode)
-  {
-    while (aNode.hasChildNodes()) {
-      aNode.removeChild(aNode.lastChild);
-    }
-  },
-
-  onSplitterOpen: function IA_OnSplitterOpen(aSplitter)
-  {
-    if (aSplitter.id == "splBrowser") {
-      this.setBrowser(aSplitter.isOpened, false);
-    }
-  },
-
-  onViewerListCommand: function IA_OnViewerListCommand(aItem)
-  {
-    var mpp = aItem.parentNode;
-    if (mpp == this.mDocViewerListPopup) {
-      this.mDocPanel.onViewerListCommand(aItem);
-    }
-    else if (mpp == this.mObjectViewerListPopup) {
-      this.mObjectPanel.onViewerListCommand(aItem);
-    }
-  },
-
-  // needed by overlayed commands from viewer to get references to a specific
-  // viewer object by name
-  getViewer: function IA_GetViewer(aUID)
-  {
-    return this.mPanelSet.registry.getViewerByUID(aUID);
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////
-//// Event Listeners
-
-function BrowserPageShowListener(aEvent)
-{
-  // since we will also get pageshow events for frame documents,
-  // make sure we respond to the top-level document load
-  if (aEvent.target.defaultView == content) {
-    inspector.documentLoaded();
-  }
-}
diff --git a/suite/extensions/inspector/resources/content/inspector.xml b/suite/extensions/inspector/resources/content/inspector.xml
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/inspector.xml
+++ /dev/null
@@ -1,926 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<bindings id="ViewerPaneBindings"
-          xmlns="http://www.mozilla.org/xbl"
-          xmlns:xbl="http://www.mozilla.org/xbl"
-          xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <!-- ***********************************************************************
-  * Inspector
-  *   Interface for a set of viewer panels.
-  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-  * REQUIRED IMPORTS:
-  *   chrome://inspector/content/jsutil/xpcom/XPCU.js
-  *   chrome://inspector/content/Flasher.js
-  *   chrome://inspector/content/ViewerRegistry.js
-  *   chrome://inspector/content/jsutil/events/ObserverManager.js
-  *   chrome://inspector/content/jsutil/system/PrefUtils.js
-  ************************************************************************ -->
-
-  <binding id="panelset"
-           extends="chrome://inspector/content/inspector.xml#base">
-    <content>
-      <xul:stringbundle src="chrome://inspector/locale/inspector.properties"/>
-      <children/>
-    </content>
-
-    <implementation>
-      <field name="mFocusedDocument">null</field>
-      <field name="mFocusedPanel">null</field>
-      <field name="mStringBundle">null</field>
-      <field name="mTransactionManager">null</field>
-
-      <property name="registry" readonly="true"
-                onget="return this.mRegistry"/>
-      <property name="initialized" readonly="true"
-                onget="return this.mInitialized"/>
-      <property name="focusedPanel" readonly="true"
-                onget="return this.mFocusedPanel;"/>
-      <property name="stringBundle" readonly="true"
-                onget="return this.mStringBundle;"/>
-      <property name="flasher" readonly="true"
-                onget="return this.mFlasher;"/>
-
-      <method name="initialize">
-        <body><![CDATA[
-          this.mRegistry = new ViewerRegistry();
-          this.mRegistry.load(kViewerRegURL, this);
-
-          this.mFlasher = new DOMIFlasher();
-
-          var tmClassID = "@mozilla.org/transactionmanager;1";
-          var tmIface = "nsITransactionManager";
-          this.mTransactionManager = XPCU.createInstance(tmClassID, tmIface);
-        ]]></body>
-      </method>
-
-      <method name="onEvent">
-        <parameter name="aEvent"/>
-        <body><![CDATA[
-          if (aEvent.type == "viewerChange") {
-            this.onViewerChange(aEvent);
-          }
-
-          // bubble the event up
-          this.mObsMan.dispatchEvent(aEvent.type, aEvent);
-        ]]></body>
-      </method>
-
-      <method name="onViewerRegistryLoad">
-        <body><![CDATA[
-          var panels = this.panels;
-          for (let i = 0; i < panels.length; ++i) {
-            panels[i].initialize();
-            panels[i].addObserver("viewerChange", this);
-            panels[i].addObserver("subjectChange", this);
-          }
-
-          this.updateViewerCommandsFor(null, null);
-          this.updateAllCommands();
-
-          this.mInitialized = true;
-          this.mObsMan.dispatchEvent("panelsetready", {});
-        ]]></body>
-      </method>
-
-      <method name="onViewerRegistryLoadError">
-        <body><![CDATA[
-          throw "Unable to load the Viewer Registry";
-        ]]></body>
-      </method>
-
-      <method name="onViewerChange">
-        <parameter name="aEvent"/>
-        <body><![CDATA[
-          // Update commands for the new viewer of the primary panel
-          // (currently driven viewers don't have own commands).
-          this.updateViewerCommandsFor(aEvent.newViewer.uid,
-                                       aEvent.oldViewer ?
-                                         aEvent.oldViewer.uid :
-                                         null);
-        ]]></body>
-      </method>
-
-      <property name="panels">
-        <getter>
-          return this.getElementsByTagName("domi-panel");
-        </getter>
-      </property>
-
-      <property name="panelCount">
-        <getter>
-          return this.panels.length;
-        </getter>
-      </property>
-
-      <method name="getPanel">
-        <parameter name="aIndex"/>
-        <body><![CDATA[
-          return this.panels[aIndex];
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// Global Commands -->
-
-      <method name="updateAllCommands">
-        <body><![CDATA[
-          var cmds =
-            document.getElementById(this.getAttribute("viewercommandset"));
-          if (!cmds) {
-            return;
-          }
-
-          var els = cmds.getElementsByAttribute("global", "true");
-          for (let i = 0; i < els.length; i++) {
-            this.updateCommand(els[i].id);
-          }
-        ]]></body>
-      </method>
-
-      <method name="updateCommand">
-        <parameter name="aCommand"/>
-        <body><![CDATA[
-          var enabled;
-          if (aCommand == "cmdEditUndo") {
-            enabled = this.mTransactionManager &&
-                      this.mTransactionManager.numberOfUndoItems > 0;
-          }
-          else if (aCommand == "cmdEditRedo") {
-            enabled = this.mTransactionManager &&
-                      this.mTransactionManager.numberOfRedoItems > 0;
-          }
-          else {
-            if (this.focusedPanel && this.focusedPanel.viewer) {
-              enabled = this.focusedPanel.viewer.isCommandEnabled(aCommand);
-            }
-          }
-          this.setCommandAttribute(aCommand, "disabled", !enabled);
-        ]]></body>
-      </method>
-
-      <method name="getCommandAttribute">
-        <parameter name="aCommand"/>
-        <parameter name="aAttribute"/>
-        <body><![CDATA[
-          var cmd = document.getElementById(aCommand);
-          return cmd ? cmd.getAttribute(aAttribute) : null;
-        ]]></body>
-      </method>
-
-      <method name="setCommandAttribute">
-        <parameter name="aCommand"/>
-        <parameter name="aAttribute"/>
-        <parameter name="aValue"/>
-        <body><![CDATA[
-          // set attribute on command in our document
-          var cmd = document.getElementById(aCommand);
-          if (cmd) {
-            if (aValue == false || aValue == "false") {
-              cmd.removeAttribute(aAttribute);
-            }
-            else {
-              cmd.setAttribute(aAttribute, aValue);
-            }
-          }
-
-          // set attribute on command in each viewer document
-          var panels = this.panels;
-          for (let i = 0; i < panels.length; ++i) {
-            var doc = panels[i].viewerDocument;
-            cmd = doc.getElementById(aCommand);
-            if (cmd) {
-              if (aValue == false || aValue == "false") {
-                cmd.removeAttribute(aAttribute);
-              }
-              else {
-                cmd.setAttribute(aAttribute, aValue);
-              }
-            }
-          }
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// Viewer-Specific Commands -->
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Update viewer-specific commands states in accordance with the current
-      // viewer.
-      //////////////////////////////////////////////////////////////////// -->
-      <method name="updateViewerCommandsFor">
-        <parameter name="aNewViewerUid"/>
-        <parameter name="aOldViewerUid"/>
-        <body><![CDATA[
-          let cmdsetElId = this.getAttribute("viewercommandset");
-          let cmdsetEl = document.getElementById(cmdsetElId);
-          if (!cmdsetEl) {
-            return;
-          }
-
-          let cmdEls = cmdsetEl.getElementsByAttribute("viewer", "*");
-          for (let idx = 0; idx < cmdEls.length; idx++) {
-            let cmdEl = cmdEls[idx];
-
-            if (!aNewViewerUid && !aOldViewerUid) {
-              cmdEl.setAttribute("disabled", "true");
-              continue;
-            }
-
-            let viewerUids = cmdEl.getAttribute("viewer");
-            let viewerUidArray = viewerUids.split(/\s/);
-
-            if (aNewViewerUid && viewerUidArray.indexOf(aNewViewerUid) != -1) {
-              cmdEl.removeAttribute("disabled");
-
-            }
-            else if (aOldViewerUid &&
-                     viewerUidArray.indexOf(aOldViewerUid) != -1) {
-              cmdEl.setAttribute("disabled", "true");
-            }
-          }
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// Command Execution -->
-
-      <method name="execCommand">
-        <parameter name="aCommand"/>
-        <body><![CDATA[
-          if (aCommand == "cmdEditUndo") {
-            this.mTransactionManager.undoTransaction();
-          }
-          else if (aCommand == "cmdEditRedo") {
-            this.mTransactionManager.redoTransaction();
-          }
-          else {
-            if (!this.focusedPanel) {
-              return;
-            }
-
-            // if the command is enabled, execute it
-            var viewer = this.focusedPanel.viewer;
-            if (!viewer.isCommandEnabled(aCommand)) {
-              return;
-            }
-            var command = viewer.getCommand(aCommand);
-            if (!command) {
-              return;
-            }
-
-            this.mTransactionManager.doTransaction(command);
-          }
-
-          this.updateCommand("cmdEditUndo");
-          this.updateCommand("cmdEditRedo");
-        ]]></body>
-      </method>
-
-      <method name="addTransactionListener">
-        <parameter name="aListener"/>
-        <body><![CDATA[
-          this.mTransactionManager.AddListener(aListener);
-        ]]></body>
-      </method>
-
-      <method name="removeTransactionListener">
-        <parameter name="aListener"/>
-        <body><![CDATA[
-          this.mTransactionManager.RemoveListener(aListener);
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// Clipboard -->
-
-      <field name="mClipboard">null</field>
-      <field name="mClipboardData">null</field>
-      <field name="mClipboardFlavor">null</field>
-      <field name="mClipboardHelper">null</field>
-
-      <property name="clipboardFlavor" readonly="true"
-                onget="return this.mClipboardFlavor"/>
-
-      <property name="clipboard" readonly="true">
-        <getter>
-        <![CDATA[
-          if (!this.mClipboard) {
-            var iid = Components.interfaces.nsIClipboard;
-            var cid = "@mozilla.org/widget/clipboard;1";
-            this.mClipboard = Components.classes[cid].createInstance(iid);
-          }
-          return this.mClipboard;
-        ]]></getter>
-      </property>
-
-      <property name="clipboardHelper" readonly="true">
-        <getter>
-        <![CDATA[
-          if (!this.mClipboardHelper) {
-            this.mClipboardHelper =
-              Components.classes["@mozilla.org/widget/clipboardhelper;1"]
-                .getService(Components.interfaces.nsIClipboardHelper);
-          }
-          return this.mClipboardHelper;
-        ]]></getter>
-      </property>
-
-      <method name="setClipboardData">
-        <parameter name="aObject"/>
-        <parameter name="aFlavor"/>
-        <parameter name="aTextRepresentation"/>
-        <body><![CDATA[
-          // put the text representation on the system clipboard
-          if (aTextRepresentation) {
-            this.clipboardHelper.copyString(aTextRepresentation);
-          }
-
-          // store the real object internally
-          this.mClipboardData = aObject;
-          this.mClipboardFlavor = aFlavor;
-
-          this.updateCommand("cmdEditPaste");
-        ]]></body>
-      </method>
-
-      <method name="getClipboardData">
-        <body><![CDATA[
-          return this.mClipboardData;
-        ]]></body>
-      </method>
-
-      <constructor><![CDATA[
-        this.mStringBundle = document.getAnonymousNodes(this)[0];
-      ]]></constructor>
-
-      <destructor>
-        this.mFlasher.destroy();
-        this.mFlasher = null;
-      </destructor>
-    </implementation>
-
-    <handlers>
-      <handler event="focus" phase="capturing">
-      <![CDATA[
-        if (!(event.originalTarget instanceof Element)) {
-          return;
-        }
-
-        var targetDoc = event.originalTarget.ownerDocument;
-        if (targetDoc == this.mFocusedDocument) {
-          return;
-        }
-
-        this.mFocusedDocument = targetDoc;
-
-        if (targetDoc != this.ownerDocument) {
-          var panels = this.panels;
-          for (let i = 0; i < panels.length; ++i) {
-            if (targetDoc == panels[i].viewerDocument) {
-              this.mFocusedPanel = panels[i];
-              this.updateAllCommands();
-              return;
-            }
-          }
-        }
-
-        this.mFocusedPanel = null; // if all else fails
-      ]]>
-      </handler>
-    </handlers>
-
-  </binding>
-
-  <!-- ************************************************************************
-  * ViewerPane
-  *  Interface for a panel accepts a node and displays all eligible
-  *  viewers in a list and activates the selected viewer.
-  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-  * REQUIRED IMPORTS:
-  *   chrome://inspector/content/jsutil/xpcom/XPCU.js
-  *   chrome://inspector/content/jsutil/events/ObserverManager.js
-  ************************************************************************ -->
-
-  <binding id="panel" extends="chrome://inspector/content/inspector.xml#base">
-    <content orient="vertical">
-      <xul:toolbox class="viewer-pane-toolbox" xbl:inherits="disabled">
-        <xul:toolbar class="viewer-pane-header" align="center"
-                     xbl:inherits="disabled" xpfe="false">
-          <xul:toolbarbutton type="menu" anonid="viewer-list"
-                             class="viewer-list" disabled="true"/>
-          <xul:label anonid="viewer-title" class="viewer-title label toolbar"
-                     flex="1"/>
-          <xul:toolbarbutton type="menu" anonid="viewer-menu"
-                             class="viewer-menu" disabled="true"/>
-        </xul:toolbar>
-      </xul:toolbox>
-      <xul:box class="viewer-pane-box-1" flex="1">
-        <xul:box class="viewer-pane-box-2" flex="1">
-          <xul:browser anonid="viewer-iframe" class="viewer-iframe"
-                       disablehistory="true" disablesecurity="true" flex="1"/>
-        </xul:box>
-      </xul:box>
-    </content>
-
-    <resources>
-      <stylesheet src="chrome://inspector/skin/panelset.css"/>
-    </resources>
-
-    <implementation>
-      <field name="mCurrentEntry">null</field>
-      <field name="mCurrentViewer">null</field>
-      <field name="mSubject">null</field>
-      <field name="mParams">null</field>
-      <field name="mParamsPending">null</field>
-
-      <constructor><![CDATA[
-        // look for panelset parent
-        var p = this.parentNode;
-        while (p && p.localName != "domi-panelset") {
-          p = p.parentNode;
-        }
-
-        this.mPanelSet = p;
-
-        this.setAttribute("disabled", "true");
-
-        this.mIFrameEl =
-          document.getAnonymousElementByAttribute(this, "anonid",
-                                                  "viewer-iframe");
-      ]]></constructor>
-
-      <destructor><![CDATA[
-        if (this.mCurrentViewer) {
-          this.destroyViewer();
-        }
-      ]]></destructor>
-
-      <property name="panelset"
-                onget="return this.mPanelSet;"/>
-
-      <property name="viewer"
-                onget="return this.mCurrentViewer;"/>
-
-      <property name="subject"
-                onget="return this.mSubject;"
-                onset="this.setSubject(val);"/>
-
-      <property name="params">
-        <getter><![CDATA[
-          return this.mParams;
-        ]]></getter>
-        <setter><![CDATA[
-          // Don't let the params get nulled out before anyone gets to use them.
-          this.mParamsPending = true;
-          return this.mParams = val;
-        ]]></setter>
-      </property>
-
-      <property name="title"
-                onget="return this.getAttribute('title');"
-                onset="return this.setAttribute('title', val);"/>
-
-      <property name="registry"
-                onget="return this.panelset.registry;"/>
-
-      <property name="viewerDocument"
-                onget="return this.mIFrameEl.contentDocument;"/>
-
-      <property name="linkedPanel">
-        <getter><![CDATA[
-          return this.mLinkedPanel;
-        ]]></getter>
-        <setter><![CDATA[
-          if (this.mLinkedPanel) {
-            this.mLinkedPanel.removeObserver("viewerChange", this);
-          }
-
-          this.mLinkedPanel = val;
-
-          if (val) {
-            val.addObserver("viewerChange", this);
-          }
-        ]]></setter>
-      </property>
-
-      <field name="mLinkedPanel">null</field>
-      <field name="mLinkedViewer">null</field>
-      <field name="mCurrentViewer">null</field>
-      <field name="mCurrentEntry">null</field>
-      <field name="mCachedEntries">null</field>
-
-      <method name="initialize">
-        <body><![CDATA[
-          this.mListEl =
-            document.getAnonymousElementByAttribute(this, "anonid",
-                                                    "viewer-list");
-          this.mTitleEl =
-            document.getAnonymousElementByAttribute(this, "anonid",
-                                                    "viewer-title");
-          this.mMenuEl =
-            document.getAnonymousElementByAttribute(this, "anonid",
-                                                    "viewer-menu");
-
-          if (this.hasAttribute("linkedpanel")) {
-            this.linkedPanel =
-              document.getElementById(this.getAttribute("linkedpanel"));
-          }
-
-          this.fillViewerList();
-        ]]></body>
-      </method>
-
-      <method name="notifyViewerReady">
-        <parameter name="aViewer"/>
-        <body><![CDATA[
-          var old = this.mCurrentViewer;
-          this.mCurrentViewer = aViewer;
-          var oldEntry = this.mCurrentEntry;
-          this.mCurrentEntry = this.mPendingEntry;
-
-          if (aViewer) {
-            this.registry.cacheViewer(aViewer, this.mCurrentEntry);
-            var title = this.registry.getEntryProperty(this.mCurrentEntry,
-                                                       "description");
-            this.setTitle(title);
-          }
-          else {
-            this.setTitle(null);
-          }
-
-          this.rebuildViewerContextMenu();
-          this.updateViewerListSelection(this.mListElPopup);
-
-          // listen for subjectChange so we can bubble it
-          if (old) {
-            old.removeObserver("subjectChange", this);
-          }
-
-          if (aViewer) {
-            aViewer.addObserver("subjectChange", this);
-          }
-
-          this.mObsMan.dispatchEvent("viewerChange",
-            { viewerPane: this, oldViewer: old, newViewer: aViewer });
-
-          if (aViewer) {
-            aViewer.subject = this.mSubject;
-            // only give initial focus to panes that are not on the right side
-            // of a link
-            if (!aViewer.pane.hasAttribute("linkedpanel")) {
-              var doc = aViewer.pane.viewerDocument;
-              doc.commandDispatcher
-                .advanceFocusIntoSubtree(doc.documentElement);
-            }
-          }
-        ]]></body>
-      </method>
-
-      <method name="destroyViewer">
-        <body><![CDATA[
-          this.mCurrentViewer.destroy();
-          this.registry.uncacheViewer(this.mCurrentViewer);
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// UI Commands -->
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Sets the new view to the item just selected from the "viewer list"
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="onViewerListCommand">
-        <parameter name="aItem"/>
-        <body><![CDATA[
-          this.switchViewer(parseInt(aItem.getAttribute("viewerListEntry")));
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Prepares the list of viewers for a node, rebuilds the menulist to
-      // display them, and load the default viewer for the node.
-      //
-      // @param aObject
-      //        the object to begin viewing
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="setSubject">
-        <parameter name="aObject"/>
-        <body><![CDATA[
-          // Check if someone wanted to pass some parameters in.
-          if (this.mParamsPending) {
-            this.mParamsPending = false;
-          }
-          else {
-            this.mParams = null;
-          }
-
-          var didRebuild = false;
-          var entries = this.mCachedEntries;
-          if (this.mSubject != aObject || !entries) {
-            this.mSubject = aObject;
-            entries = this.registry.findViewersForObject(aObject, this.id,
-                                                         this.mLinkedViewer);
-            // It's possible that the entries will be the same, even for
-            // different objects.  If they are, we can forego the DOM
-            // manipulations involved in rebuilding.
-            if (!this.mCachedEntries ||
-                this.mCachedEntries.toString() != entries.toString()) {
-              this.mCachedEntries = entries;
-              this.rebuildViewerList(this.mListElPopup);
-              didRebuild = true;
-            }
-          }
-
-          if (entries.length == 0) {
-            this.switchViewer(-1);
-            this.setAttribute("disabled", "true");
-          }
-          else if (entries.indexOf(this.mCurrentEntry) < 0) {
-            this.switchViewer(entries[0]);
-            this.removeAttribute("disabled");
-          }
-          else {
-            this.mCurrentViewer.subject = aObject;
-            this.removeAttribute("disabled");
-            if (didRebuild) {
-              // We need to ensure here that the viewer list selection gets
-              // updated, because otherwise it will only get updated when a
-              // new viewer loads and calls notifyViewerReady.
-              this.updateViewerListSelection(this.mListElPopup);
-            }
-          }
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Clear out and rebuild the menulist full of the available views for
-      // the currently selected node.
-      //
-      // @param aPopup
-      //        the menupopup to which the items should be added
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="rebuildViewerList">
-        <parameter name="aPopup"/>
-        <body><![CDATA[
-          var entries = this.mCachedEntries;
-          if (entries.length <= 0) {
-            aPopup.parentNode.setAttribute("disabled", true);
-          }
-          else {
-            aPopup.parentNode.removeAttribute("disabled");
-          }
-
-          // empty the list
-          while (aPopup.firstChild) {
-            aPopup.removeChild(aPopup.firstChild);
-          }
-
-          for (let i = 0; i < entries.length; i++) {
-            let entry = entries[i];
-            let menuitem = aPopup.ownerDocument.createElement("menuitem");
-            menuitem.setAttribute("label",
-                                  this.registry
-                                    .getEntryProperty(entry, "description"));
-            menuitem.setAttribute("viewerListEntry", entry);
-            menuitem.setAttribute("type", "radio");
-            menuitem.setAttribute("name", "viewerListEntries");
-            aPopup.appendChild(menuitem);
-          }
-        ]]></body>
-      </method>
-
-      <method name="updateViewerListSelection">
-        <parameter name="aPopup"/>
-        <body><![CDATA[
-          // Uncheck any previously checked items.
-          var checked = aPopup.getElementsByAttribute("checked", "true");
-          if (checked.length > 1) {
-            Components.utils.reportError("expected only zero or one checked items");
-          }
-          while (checked.length) {
-            checked[0].removeAttribute("checked");
-          }
-          var entry = this.mCurrentEntry;
-          checked = aPopup.getElementsByAttribute("viewerListEntry", entry);
-          if (checked.length == 1) {
-            checked[0].setAttribute("checked", "true");
-          }
-          else {
-            Components.utils.reportError("expected one item to match entry " +
-                                         entry);
-          }
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Loads the viewer described by an entry in the viewer registry.
-      //
-      // @param aEntry
-      //        entry index in the viewer registry
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="switchViewer">
-        <parameter name="aEntry"/>
-        <body><![CDATA[
-          if (aEntry < 0) { // -1 is for null viewer
-            this.mPendingEntry = -1;
-            this.notifyViewerReady(null);
-            return;
-          }
-
-          var url = this.registry.getEntryURL(aEntry);
-
-          var loadNew = true;
-          if (this.mCurrentViewer) {
-            var oldURL = this.registry.getEntryURL(this.mCurrentEntry);
-            if (oldURL == url) {
-              loadNew = false;
-            }
-          }
-
-          if (loadNew) {
-            this.mPendingEntry = aEntry;
-            this.loadViewerURL(url);
-          }
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Begin loading a new viewer from a given url.
-      //
-      // @param aURL
-      //        the url of the viewer document
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="loadViewerURL">
-        <parameter name="aURL"/>
-        <body><![CDATA[
-          if (this.mCurrentViewer) {
-            // tell the old viewer it's about to go away
-            this.destroyViewer();
-          }
-
-          // load the new document
-          FrameExchange.loadURL(this.mIFrameEl, aURL, this);
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Rebuild the viewer context menu
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="rebuildViewerContextMenu">
-        <body><![CDATA[
-          if (!this.mSubject) {
-            this.mMenuEl.setAttribute("disabled", "true");
-            return;
-          }
-          else {
-            this.mMenuEl.removeAttribute("disabled");
-          }
-
-          // remove old context menu
-          if (this.mContextMenu) {
-            this.mMenuEl.removeChild(this.mContextMenu);
-            this.mFormerContextParent.appendChild(this.mContextMenu);
-          }
-
-          var uid = this.registry.getEntryProperty(this.mCurrentEntry, "uid");
-          var ppId = "ppViewerContext-" + uid;
-          var pp = document.getElementById(ppId);
-          if (pp) {
-            this.mMenuEl.removeAttribute("disabled");
-            var parent = pp.parentNode;
-            parent.removeChild(pp);
-            this.mMenuEl.appendChild(pp);
-
-           this.mFormerContextParent = parent;
-          }
-          else {
-            this.mMenuEl.setAttribute("disabled", "true");
-          }
-          this.mContextMenu = pp;
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Set the text in the viewer title bar
-      //
-      // @param title
-      //        the text to use
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="setTitle">
-        <parameter name="aTitle"/>
-        <body><![CDATA[
-          this.mTitleEl.setAttribute("value",
-                                     this.title && aTitle ?
-                                       this.title + " - " + aTitle :
-                                       "");
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Fill out the content of the "viewer list" menu
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="fillViewerList">
-        <body><![CDATA[
-          this.mListEl.pViewer = this;
-          this.mListEl.setAttribute("oncommand",
-                                    "this.pViewer.onViewerListCommand(event.originalTarget)");
-
-          var mpp = document.createElement("menupopup");
-          this.mListEl.appendChild(mpp);
-          this.mListElPopup = mpp;
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Listen for selection changes on the viewer in the linked pane
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="observerLinkedViewer">
-        <body><![CDATA[
-          if (this.mLinkedViewer) {
-            this.mLinkedViewer.removeObserver("selectionChange", this);
-          }
-
-          this.mCachedEntries = null;
-          this.mLinkedViewer = this.mLinkedPanel.viewer;
-          this.mLinkedViewer.addObserver("selectionChange", this);
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // Update this pane's subject to be the selection of it's linked pane
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="updateLinkedSubject">
-        <body><![CDATA[
-          this.subject = this.mLinkedViewer.selection;
-        ]]></body>
-      </method>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      // global event handler
-      //////////////////////////////////////////////////////////////////// -->
-
-      <method name="onEvent">
-        <parameter name="aEvent"/>
-        <body><![CDATA[
-          switch (aEvent.type) {
-            case "viewerChange":
-              this.observerLinkedViewer();
-              break;
-            case "selectionChange":
-              this.updateLinkedSubject();
-              break;
-            case "subjectChange":
-              this.mObsMan.dispatchEvent("subjectChange", aEvent);
-          };
-        ]]></body>
-      </method>
-
-    </implementation>
-
-  </binding>
-
-  <binding id="base">
-    <implementation>
-      <constructor><![CDATA[
-        this.mObsMan = new ObserverManager(this);
-      ]]></constructor>
-
-      <!-- ///////////////////////////////////////////////////////////////////
-      //// Event Handling -->
-
-      <method name="addObserver">
-        <parameter name="aEvent"/>
-        <parameter name="aObserver"/>
-        <body><![CDATA[
-          this.mObsMan.addObserver(aEvent, aObserver);
-        ]]></body>
-      </method>
-
-      <method name="removeObserver">
-        <parameter name="aEvent"/>
-        <parameter name="aObserver"/>
-        <body><![CDATA[
-          this.mObsMan.removeObserver(aEvent, aObserver);
-        ]]></body>
-      </method>
-
-    </implementation>
-
-  </binding>
-
-</bindings>
diff --git a/suite/extensions/inspector/resources/content/inspector.xul b/suite/extensions/inspector/resources/content/inspector.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/inspector.xul
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE window [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<?xul-overlay href="chrome://inspector/content/inspectorOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/toolboxOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/statusbarOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/inspectorWindow.css"?>
-
-<window id="winInspectorMain" title="&Inspector.title;"
-        width="640" height="480"
-        persist="screenX screenY width height sizemode"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <stringbundleset id="stringbundleset">
-    <stringbundle id="inspector-bundle"
-                  src="chrome://inspector/locale/inspector.properties"/>
-  </stringbundleset>
-  <popupset id="aTooltipSet"/>
-
-  <popupset id="ppsGlobalPopupset"/>
-  <popupset id="ppsViewerPopupset"/>
-
-  <keyset id="ksGlobalKeyset"/>
-  <commandset id="cmdsGlobalCommands"/>
-
-  <commandset id="tasksCommands">
-    <command id="cmd_quit"/>
-  </commandset>
-
-  <commandset id="baseMenuCommandSet"/>
-
-  <keyset id="tasksKeys">
-    <key id="key_saveInspector" key="&saveCmd.key;" command="cmdSave"
-         modifiers="accel"/>
-    <key id="key_closeInspector" key="&closeCmd.key;" command="cmdClose"
-         modifiers="accel"/>
-    <key id="key_quit"/>
-  </keyset>
-
-  <keyset id="baseMenuKeyset"/>
-
-  <toolbox id="tbxInsToolbox">
-    <menubar id="mbrInspectorMain"/>
-    <toolbar id="tbInspectorPrimary"/>
-  </toolbox>
-
-  <vbox id="bxInspectorMain" flex="1"/>
-</window>
diff --git a/suite/extensions/inspector/resources/content/inspectorOverlay.xul b/suite/extensions/inspector/resources/content/inspectorOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/inspectorOverlay.xul
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/inspector.dtd">
-
-<overlay id="ovInspector"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/inspector.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/ViewerRegistry.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/Flasher.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/FilePickerUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <vbox id="bxInspectorMain">
-
-    <domi-panelset id="bxPanelSet" flex="1"
-                   viewercommandset="cmdsGlobalCommands">
-      <domi-panel id="bxDocPanel" title="&bxDocPanel.title;"
-                  flex="1" persist="width"/>
-
-      <splitter id="splPanels" collapse="after">
-        <grippy/>
-      </splitter>
-
-      <domi-panel id="bxObjectPanel" title="&bxObjectPanel.title;"
-                  linkedpanel="bxDocPanel" flex="1" persist="width"/>
-    </domi-panelset>
-
-    <splitter id="splBrowser" class="titled-splitter"
-        onopen="inspector.onSplitterOpen(this)"
-        label="&browserPanel.label;" collapse="after"/>
-
-    <hbox id="bxBrowser" flex="1">
-      <browser id="ifBrowser" type="content" primary="true"
-               disablehistory="true" disablesecurity="true"
-               flex="1" src="about:blank"/>
-    </hbox>
-
-  </vbox>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/jsutil/commands/baseCommands.js b/suite/extensions/inspector/resources/content/jsutil/commands/baseCommands.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/commands/baseCommands.js
+++ /dev/null
@@ -1,164 +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/. */
-
-/*****************************************************************************
-* Base Commands --------------------------------------------------------------
-*   Transactions which can be used to implement common commands.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   (Other files may be necessary, depending on which base commands are used.)
-*****************************************************************************/
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kClipboardHelperClassID = "@mozilla.org/widget/clipboardhelper;1";
-
-//////////////////////////////////////////////////////////////////////////////
-//// Transactions
-
-/**
- * Base implementation of an nsITransaction.
- * @param aIsTransient [optional]
- *        Override the isTransient field.  The default is true.
- */
-function inBaseCommand(aIsTransient)
-{
-  if (aIsTransient !== undefined) {
-    this.isTransient = aIsTransient;
-  }
-}
-
-inBaseCommand.prototype = {
-  isTransient: true,
-
-  merge: function BaseCommand_Merge()
-  {
-    return false;
-  },
-
-  QueryInterface:
-    XPCOMUtils.generateQI([Components.interfaces.nsITransaction]),
-
-  doTransaction: function BaseCommand_DoTransaction() {},
-  undoTransaction: function BaseCommand_UndoTransaction() {},
-
-  redoTransaction: function BaseCommand_RedoTransaction()
-  {
-    this.doTransaction();
-  }
-};
-
-/**
- * Open the object "mini" viewer (object.xul) on a given object.  The mObject
- * field should be overridden to contain the object to be inspected.
- *
- * Primitives are uninteresting and attempts to inspect them will fail.
- * Consumers should take this into account when determining whether the
- * corresponding command should be enabled.  For convenience,
- * cmdEditInspectInNewWindowBase.isInspectable is provided.
- */
-function cmdEditInspectInNewWindowBase()
-{
-  this.mObject = null;
-}
-
-cmdEditInspectInNewWindowBase.isInspectable =
-  function InspectInNewWindowBase_IsInspectable(aValue)
-{
-  var type = typeof aValue;
-  return (type == "object" && aValue !== null) || type == "function";
-};
-
-cmdEditInspectInNewWindowBase.prototype = new inBaseCommand();
-
-cmdEditInspectInNewWindowBase.prototype.doTransaction =
-  function InspectInNewWindowBase_DoTransaction()
-{
-  if (cmdEditInspectInNewWindowBase.isInspectable(this.mObject)) {
-    inspectObject(this.mObject);
-  }
-};
-
-/**
- * Copy a string to the clipboard.  The mString field should be overridden to
- * contain the string to be copied.
- */
-function cmdEditCopySimpleStringBase()
-{
-  this.mString = null;
-}
-
-cmdEditCopySimpleStringBase.prototype = new inBaseCommand();
-
-cmdEditCopySimpleStringBase.prototype.doTransaction =
-  function CopySimpleStringBase_DoTransaction()
-{
-  if (this.mString) {
-    var helper = XPCU.getService(kClipboardHelperClassID,
-                                 "nsIClipboardHelper");
-    helper.copyString(this.mString);
-  }
-};
-
-/**
- * An nsITransaction to copy items to the panelset clipboard.
- * @param aObjects
- *        an array of objects that define a clipboard flavor, a delimiter, and
- *        toString().
- */
-function cmdEditCopy(aObjects)
-{
-  this.mObjects = aObjects;
-}
-
-cmdEditCopy.prototype = new inBaseCommand();
-
-cmdEditCopy.prototype.doTransaction = function Utils_Copy_DoTransaction()
-{
-  if (this.mObjects.length == 1) {
-    viewer.pane.panelset.setClipboardData(this.mObjects[0],
-                                          this.mObjects[0].flavor,
-                                          this.mObjects.toString());
-  }
-  else {
-    var joinedObjects = this.mObjects.join(this.mObjects[0].delimiter);
-    viewer.pane.panelset.setClipboardData(this.mObjects,
-                                          this.mObjects[0].flavor + "s",
-                                          joinedObjects);
-  }
-}
-
-/**
- * Open a source view on a file.  The mURI field should be overridden to
- * contain the URI of the file on which to open the source view.  The
- * mLineNumber field may optionally be set to contain the line number at which
- * the source view should be opened.
- */
-function cmdEditViewFileURIBase()
-{
-  this.mURI = null;
-  this.mLineNumber = 0;
-}
-
-cmdEditViewFileURIBase.prototype = new inBaseCommand();
-
-cmdEditViewFileURIBase.prototype.doTransaction =
-  function ViewFileURIBase_DoTransaction()
-{
-  if (this.mURI) {
-    // 1.9.0 toolkit doesn't have this method
-    if ("viewSource" in gViewSourceUtils) {
-      gViewSourceUtils.viewSource(this.mURI, null, null, this.mLineNumber);
-    }
-    else {
-      openDialog("chrome://global/content/viewSource.xul",
-                 "_blank",
-                 "all,dialog=no",
-                 this.mURI, null, null, this.mLineNumber, null);
-    }
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/events/ObserverManager.js b/suite/extensions/inspector/resources/content/jsutil/events/ObserverManager.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/events/ObserverManager.js
+++ /dev/null
@@ -1,62 +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/. */
-
-/***************************************************************
-* ObserverManager -----------------------------------------------
-*  Manages observer and event dispatching for an object.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-////////////////////////////////////////////////////////////////////////////
-//// class ObserverManager
-
-function ObserverManager(aTarget)
-{
-  this.mTarget = aTarget;
-  this.mObservers = {};
-}
-
-ObserverManager.prototype = 
-{
-  addObserver: function(aEventName, aObserver)
-  {
-    var list;
-    if (!(aEventName in this.mObservers)) {
-      list = [];
-      this.mObservers[aEventName] = list;
-    } else
-      list = this.mObservers[aEventName];
-      
-    
-    list.push(aObserver);
-  },
-
-  removeObserver: function(aEventName, aObserver)
-  {
-    if (aEventName in this.mObservers) {
-      var list = this.mObservers[aEventName];
-      for (var i = 0; i < list.length; ++i) {
-        if (list[i] == aObserver) {
-          list.splice(i, 1);
-          return;
-        }
-      }
-    }
-  },
-
-  dispatchEvent: function(aEventName, aEventData)
-  {
-    if (aEventName in this.mObservers) {
-      if (!("target" in aEventData))
-        aEventData.target = this.mTarget;
-      aEventData.type = aEventName;
-      
-      var list = this.mObservers[aEventName];
-      for (var i = 0; i < list.length; ++i)
-        list[i].onEvent(aEventData);
-    }
-  }
-
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/rdf/RDFArray.js b/suite/extensions/inspector/resources/content/jsutil/rdf/RDFArray.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/rdf/RDFArray.js
+++ /dev/null
@@ -1,163 +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/. */
-
-/***************************************************************
-* RDFArray -----------------------------------------------
-*  A convenience routine for creating an RDF-based 2d array 
-*  indexed by number and hashkey.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/rdf/RDFU.js
-****************************************************************/
-
-//////////// global constants ////////////////////
-
-RDFArray.URI = "http://www.joehewitt.com/mozilla/util/RDFArray#";
-RDFArray.RDF_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
-  
-///// class RDFArray /////////////////////////
-
-function RDFArray(aNSURI, aRootURN, aArcName)
-{
-  this.mNSURI = aNSURI;
-  this.mRootURN = aRootURN;
-  this.mArcName = aArcName ? aArcName : "list";
-}
-
-RDFArray.prototype = {
-  get datasource() { return this.mDS; },
-  get length() { return this.mLength } ,
-  
-  initialize: function()
-  {
-    this.mLength = 0;
-  
-    this.mDS = XPCU.createInstance("@mozilla.org/rdf/datasource;1?name=in-memory-datasource", "nsIRDFDataSource");
-  
-    var root = gRDF.GetResource(this.mRootURN);
-    var res = gRDF.GetAnonymousResource();
-    this.mDS.Assert(root, gRDF.GetResource(this.mNSURI+this.mArcName), res, true);
-  
-    this.mSeq = gRDFCU.MakeSeq(this.mDS, res); 
-  },
-
-  add: function(aObject)
-  {
-    var res = this.createResourceFrom(aObject);
-    this.addResource(res);
-  },
-
-  addResource: function(aResource)
-  {
-    this.mSeq.AppendElement(aResource);
-    this.mLength++;
-  },
-  
-  insertAt: function(aIndex, aObject)
-  {
-    var res = this.createResourceFrom(aObject);
-    this.insertResourceAt(aIndex, res);
-  },
-
-  insertResourceAt: function(aIndex, aResource)
-  {
-  },
-
-  removeAt: function(aIndex)
-  {
-    this.mSeq.RemoveElementAt(aIndex+1, true);
-    this.mLength--;
-  },
-  
-  removeById: function(aId)
-  {
-    var proj = gRDF.GetResource(aId);
-    proj = XPCU.QI(proj, "nsIRDFNode");
-    this.mSeq.RemoveElement(proj, true);
-    this.mLength--;
-  },
-  
-  get: function(aIndex, aKey)
-  {
-    var res = RDFU.getSeqElementAt(this.mSeq, aIndex);
-    return RDFU.readAttribute(this.mDS, res, this.mNSURI+aKey);
-  },
-  
-  set: function(aIndex, aKey, aValue)
-  {
-    var res = RDFU.getSeqElementAt(this.mSeq, aIndex);
-    RDFU.writeAttribute(this.mDS, res, this.mNSURI+aKey, aValue);
-  },
-  
-  getResource: function(aIndex)
-  {
-    return RDFU.getSeqElementAt(this.mSeq, aIndex);
-  },
-
-  getResourceId: function(aIndex)
-  {
-    var el = RDFU.getSeqElementAt(this.mSeq, aIndex);
-    return el.Value;
-  },
-
-  save: function()
-  {
-    RDFU.saveDataSource(this.mDS);
-  },
-
-
-  clear: function()
-  {
-    while (this.mLength) {
-      this.mSeq.RemoveElementAt(1, true);
-      this.mLength--;
-    }
-  },
-
-  createResourceFrom: function(aObject)
-  {
-    var el = gRDF.GetAnonymousResource();
-
-    // add a literal node for each property being added
-    for (var name in aObject) {
-      this.mDS.Assert(el, gRDF.GetResource(this.mNSURI+name), gRDF.GetLiteral(aObject[name]), true);
-    }
-    
-    return el;
-  }
-
-};
-
-/////////// static factory methods /////////////////////////
-
-RDFArray.fromContainer = function(aDS, aResourceID, aNSURI) 
-{
-  var list = new RDFArray(aNSURI);
-
-  list.mDS = aDS;
-  var seq = RDFU.findSeq(aDS, aResourceID);
-  list.mSeq = seq;
-  list.mLength = seq.GetCount();
-
-  return list;
-}
-
-RDFArray.fromContainerArc = function(aDS, aSourceId, aTargetId, aNSURI) 
-{
-  var list = new RDFArray(aNSURI);
-  list.mDS = aDS;
-
-  var source = gRDF.GetResource(aSourceId);
-  var target = gRDF.GetResource(aTargetId);
-  var seqRes = aDS.GetTarget(source, target, true);
-
-  var seq = RDFU.makeSeq(aDS, seqRes);
-  list.mSeq = seq;
-  list.mLength = seq.GetCount();
-
-  return list;
-}
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/rdf/RDFU.js b/suite/extensions/inspector/resources/content/jsutil/rdf/RDFU.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/rdf/RDFU.js
+++ /dev/null
@@ -1,121 +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/. */
-
-/***************************************************************
-* RDFU -----------------------------------------------
-*  Convenience routines for common RDF commands.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-****************************************************************/
-
-//////////// global constants ////////////////////
-
-try {
-var gRDF = Components.classes['@mozilla.org/rdf/rdf-service;1'].getService();
-gRDF = gRDF.QueryInterface(Components.interfaces.nsIRDFService);
-
-var gRDFCU = Components.classes['@mozilla.org/rdf/container-utils;1'].getService();
-gRDFCU = gRDFCU.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
-} catch (ex) { alert("RDFU: " + ex);  }
-///////////////////////////////////////////////////
-
-var RDFU = {
-  
-  getSeqElementAt: function(aSeq, aIndex)
-  {
-  	var ordinal = gRDFCU.IndexToOrdinalResource(aIndex+1);
-    return aSeq.DataSource.GetTarget(aSeq.Resource, ordinal, true);
-  },
-  
-  readAttribute: function(aDS, aRes, aName)
-  {
-  	var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
-    if (attr)
-    	attr = XPCU.QI(attr, "nsIRDFLiteral");
-  	return attr ? attr.Value : null;
-  },
-  
-  
-  writeAttribute: function(aDS, aRes, aName, aValue)
-  {
-  	var attr = aDS.GetTarget(aRes, gRDF.GetResource(aName), true);
-    if (attr)
-    	aDS.Change(aRes, gRDF.GetResource(aName), attr, gRDF.GetLiteral(aValue));
-  },
-  
-  
-  findSeq: function(aDS, aResName)
-  {
-  	try {
-      var res = gRDF.GetResource(aResName);
-      var seq = this.makeSeq(aDS, res);
-    } catch (ex) { 
-      alert("Unable to find sequence:" + ex); 
-    }
-  
-    return seq;
-  },
-  
-  makeSeq: function(aDS, aRes)
-  {
-    var seq = XPCU.createInstance("@mozilla.org/rdf/container;1", "nsIRDFContainer");
-  	seq.Init(aDS, aRes);
-    return seq;
-  },
-  
-  createSeq: function(aDS, aBaseRes, aArcRes)
-  {
-    var res = gRDF.GetAnonymousResource();
-    aDS.Assert(aBaseRes, aArcRes, res, true);
-    var seq = gRDFCU.MakeSeq(aDS, res); 
-    return seq;
-  },
-  
-  loadDataSource: function(aURL, aListener) 
-  {
-  	var ds = gRDF.GetDataSource(aURL);
-    var rds = XPCU.QI(ds, "nsIRDFRemoteDataSource");
-    
-    var observer = new DSLoadObserver(aListener);
-    
-    if (rds.loaded) {
-    	observer.onEndLoad(ds);
-    } else {
-      var sink = XPCU.QI(ds, "nsIRDFXMLSink");
-      sink.addXMLSinkObserver(observer);
-    }
-  },
-  
-  saveDataSource: function(aDS)
-  {
-    var ds = XPCU.QI(aDS, "nsIRDFRemoteDataSource");
-    ds.Flush();
-  }
-};
-
-///////////
-
-function DSLoadObserver(aListener) { this.mListener = aListener; }
-
-DSLoadObserver.prototype = 
-{
-  onBeginLoad: function(aSink) { },
-  onInterrupt: function(aSink) {},
-  onResume: function(aSink) {},
-  onError: function(aSink, aStatus, aErrorMsg) 
-  { 
-    this.mListener.onError(aStatus, aErrorMsg);
-    aSink.removeXMLSinkObserver(this);
-  },
-  
-  onEndLoad: function(aSink) 
-  { 
-    var ds = XPCU.QI(aSink, "nsIRDFDataSource");
-    this.mListener.onDataSourceReady(ds);
-    aSink = XPCU.QI(aSink, "nsIRDFXMLSink");
-    aSink.removeXMLSinkObserver(this);
-  }
-    
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/system/DiskSearch.js b/suite/extensions/inspector/resources/content/jsutil/system/DiskSearch.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/system/DiskSearch.js
+++ /dev/null
@@ -1,66 +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/. */
-
-/***************************************************************
-* DiskSearch -------------------------------------------------
-*  A utility for handily searching the disk for files matching
-*  a certain criteria.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-//////////// global constants ////////////////////
-
-////////////////////////////////////////////////////////////////////////////
-//// class DiskSearch
-
-var DiskSearch =
-{
-  findFiles: function(aRootDir, aExtList, aRecurse)
-  {
-    // has the file extensions so we don't have to 
-    // linear search the array every time through
-    var extHash = {};
-    for (var i = 0; i < aExtList.length; i++) {
-      extHash[aExtList[i]] = true;
-    }
-
-    var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
-    this.fileHandler = ios.getProtocolHandler("file").QueryInterface(Components.interfaces.nsIFileProtocolHandler);
-
-    // recursively build the list of results
-    var results = [];
-    this.recurseDir(aRootDir, extHash, aRecurse, results);
-    return results;
-  },
-
-  recurseDir: function(aDir, aExtHash, aRecurse, aResults)
-  {
-    debug("("+aResults.length+") entering " + aDir.path + "\n");
-    var entries = aDir.directoryEntries;
-    var entry, ext;
-    while (entries.hasMoreElements()) {
-      entry = XPCU.QI(entries.getNext(), "nsIFile");
-      if (aRecurse && entry.isDirectory())
-        this.recurseDir(entry, aExtHash, aRecurse, aResults);
-      ext = this.getExtension(entry.leafName);
-      if (ext) {
-        if (aExtHash[ext])
-          aResults.push(this.fileHandler.getURLSpecFromFile(entry));
-      }
-    }
-  },
-
-  getExtension: function(aFileName)
-  {
-    var dotpt = aFileName.lastIndexOf(".");
-    if (dotpt)
-      return aFileName.substr(dotpt+1).toLowerCase();
-
-    return null;
-  }
-};
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/system/FilePickerUtils.js b/suite/extensions/inspector/resources/content/jsutil/system/FilePickerUtils.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/system/FilePickerUtils.js
+++ /dev/null
@@ -1,90 +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/. */
-
-/***************************************************************
-* FilePickerUtils -------------------------------------------------
-*  A utility for easily dealing with the file picker dialog.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global constants ////////////////////
-
-const kFilePickerCID = "@mozilla.org/filepicker;1";
-const kLFileCID = "@mozilla.org/file/local;1";
-
-const nsIFilePicker = Components.interfaces.nsIFilePicker;
-
-////////////////////////////////////////////////////////////////////////////
-//// class FilePickerUtils
-
-var FilePickerUtils =
-{
-  pickFile: function(aTitle, aInitPath, aFilters, aMode)
-  {
-    try {
-      var modeStr = aMode ? "mode" + aMode : "modeOpen";
-      var mode;
-      try {
-        mode = nsIFilePicker[modeStr];
-      } catch (ex) { 
-        dump("WARNING: Invalid FilePicker mode '"+aMode+"'. Defaulting to 'Open'.\n");
-        mode = nsIFilePicker.modeOpen;
-      }
-      
-      var fp = XPCU.createInstance(kFilePickerCID, "nsIFilePicker");
-      fp.init(window, aTitle, mode);
-
-      // join array of filter names into bit string
-      var filters = this.prepareFilters(aFilters);
-
-      if (aInitPath) {
-        var dir = XPCU.createInstance(kLFileCID, "nsILocalFile");
-        dir.initWithPath(aInitPath);
-        fp.displayDirectory = dir;
-      }
-
-      if (fp.show() == nsIFilePicker.returnOK) {
-        return fp.file;
-      }
-    } catch (ex) {
-      dump("ERROR: Unable to open file picker.\n" + ex + "\n");
-    }
-    return null;
-  },
-
-  pickDir: function(aTitle, aInitPath)
-  {
-    try {
-      var fp = XPCU.createInstance(kFilePickerCID, "nsIFilePicker");
-      fp.init(window, aTitle, nsIFilePicker.modeGetFolder);
-
-      if (aInitPath) {
-        var dir = XPCU.createInstance(kLFileCID, "nsILocalFile");
-        dir.initWithPath(aInitPath);
-        fp.displayDirectory = dir;
-      }
-      
-      if (fp.show() == nsIFilePicker.returnOK) {
-        return fp.file;
-      }
-    } catch (ex) {
-      dump("ERROR: Unable to open directory picker.\n" + ex + "\n");
-    }
-
-    return null;
-  },
-  
-  prepareFilters: function(aFilters)
-  {
-    // join array of filter names into bit string
-    var filters = 0;
-    for (var i = 0; i < aFilters.length; ++i)
-      filters = filters | nsIFilePicker[aFilters[i]];
-    
-    return filters;
-  }
-   
-};
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/system/PrefUtils.js b/suite/extensions/inspector/resources/content/jsutil/system/PrefUtils.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/system/PrefUtils.js
+++ /dev/null
@@ -1,85 +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/. */
-
-/***************************************************************
-* PrefUtils -------------------------------------------------
-*  Utility for easily using the Mozilla preferences system.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-****************************************************************/
-Components.utils.import("resource://gre/modules/Services.jsm");
-
-//////////// global variables ////////////////////
-
-//////////// global constants ////////////////////
-const nsIPrefBranch = Components.interfaces.nsIPrefBranch;
-
-////////////////////////////////////////////////////////////////////////////
-//// class PrefUtils
-
-var PrefUtils =
-{
-  mPrefs: null,
-
-  init: function()
-  {
-    var prefService = XPCU.getService("@mozilla.org/preferences-service;1", "nsIPrefService");
-    this.mPrefs = prefService.getBranch(null);
-  },
-
-  addObserver: function addObserver(aDomain, aFunction)
-  {
-    if (!this.mPrefs) this.init();
-
-    var pbi = XPCU.QI(this.mPrefs, "nsIPrefBranch");
-    if (pbi)
-      pbi.addObserver(aDomain, aFunction, false);
-  },
-
-  removeObserver: function removeObserver(aDomain, aFunction)
-  {
-    if (!this.mPrefs) this.init();
-
-    var pbi = XPCU.QI(this.mPrefs, "nsIPrefBranch");
-    if (pbi)
-      pbi.removeObserver(aDomain, aFunction);
-  },
-
-  setPref: function(aName, aValue)
-  {
-    if (!this.mPrefs) this.init();
-
-    var type = this.mPrefs.getPrefType(aName);
-    try {
-      if (type == nsIPrefBranch.PREF_STRING) {
-        this.mPrefs.setStringPref(aName, aValue);
-      } else if (type == nsIPrefBranch.PREF_BOOL) {
-        this.mPrefs.setBoolPref(aName, aValue);
-      } else if (type == nsIPrefBranch.PREF_INT) {
-        this.mPrefs.setIntPref(aName, aValue);
-      }
-    } catch(ex) {
-      debug("ERROR: Unable to write pref \"" + aName + "\".\n");
-    }
-  },
-
-  getPref: function(aName)
-  {
-    if (!this.mPrefs) this.init();
-
-    var type = this.mPrefs.getPrefType(aName);
-    try {
-      if (type == nsIPrefBranch.PREF_STRING) {
-        return this.mPrefs.getStringPref(aName);
-      } else if (type == nsIPrefBranch.PREF_BOOL) {
-        return this.mPrefs.getBoolPref(aName);
-      } else if (type == nsIPrefBranch.PREF_INT) {
-        return this.mPrefs.getIntPref(aName);
-      }
-    } catch(ex) {
-      debug("ERROR: Unable to read pref \"" + aName + "\".\n");
-    }
-    return null;
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/system/clipboardFlavors.js b/suite/extensions/inspector/resources/content/jsutil/system/clipboardFlavors.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/system/clipboardFlavors.js
+++ /dev/null
@@ -1,62 +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/. */
-
-/*****************************************************************************
-* Clipboard Flavors ----------------------------------------------------------
-*   Flavors for copying inspected data to the clipboard.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-* chrome://inspector/content/utils.js
-*****************************************************************************/
-
-/**
- * Represents a CSS property.
- * @param aProperty
- *        the name of the property
- * @param aValue
- *        the value of the property
- * @param aImportant
- *        boolean indicating whether this is !important
- */
-function CSSProperty(aProperty, aValue, aImportant)
-{
-  this.flavor = "inspector/css-property";
-  this.delimiter = "\n";
-  this.property = aProperty;
-  this.value = aValue;
-  this.important = aImportant == true;
-}
-
-/**
- * Returns a usable CSS string for the CSSProperty.
- * @return a string in the form "property: value;"
- */
-CSSProperty.prototype.toString = function CSSProperty_ToString()
-{
-  return this.property + ": " + this.value + (this.important ?
-                                                " !important" :
-                                                "") + ";";
-}
-
-/**
- * Represents a DOM attribute.
- * @param aNode
- *        the attribute node
- */
-function DOMAttribute(aNode)
-{
-  this.flavor = "inspector/dom-attribute";
-  this.node = aNode.cloneNode(false);
-  this.delimiter = " ";
-}
-
-/**
- * Returns a string representing an attribute name/value pair
- * @return a string in the form of 'name="value"'
- */
-DOMAttribute.prototype.toString = function DOMA_ToString()
-{
-  return this.node.nodeName + '="' +
-         InsUtil.unicodeToEntity(this.node.nodeValue) + '"';
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/xpcom/XPCU.js b/suite/extensions/inspector/resources/content/jsutil/xpcom/XPCU.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xpcom/XPCU.js
+++ /dev/null
@@ -1,36 +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/. */
-
-var XPCU = 
-{ 
-  getService: function(aURL, aInterface)
-  {
-    try {
-      return Components.classes[aURL].getService(Components.interfaces[aInterface]);
-    } catch (ex) {
-      dump("Error getting service: " + aURL + ", " + aInterface + "\n" + ex);
-      return null;
-    }
-  },
-
-  createInstance: function (aURL, aInterface)
-  {
-    try {
-      return Components.classes[aURL].createInstance(Components.interfaces[aInterface]);
-    } catch (ex) {
-      dump("Error creating instance: " + aURL + ", " + aInterface + "\n" + ex);
-      return null;
-    }
-  },
-
-  QI: function(aEl, aIName)
-  {
-    try {
-      return aEl.QueryInterface(Components.interfaces[aIName]);
-    } catch (ex) {
-      throw("Unable to QI " + aEl + " to " + aIName);
-    }
-  }
-
-};
\ No newline at end of file
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/DNDUtils.js b/suite/extensions/inspector/resources/content/jsutil/xul/DNDUtils.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/DNDUtils.js
+++ /dev/null
@@ -1,83 +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/. */
-
-/***************************************************************
-* DNDUtils -------------------------------------------------
-*  Utility functions for common drag and drop tasks.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var app;
-
-//////////// global constants ////////////////////
-
-////////////////////////////////////////////////////////////////////////////
-//// class DNDUtils
-
-var DNDUtils =
-{
-  invokeSession: function(aTarget, aTypes, aValues)
-  {
-    var transData, trans, supports;
-    let transArray = XPCU.createInstance("@mozilla.org/array;1", "nsIMutableArray");
-    for (var i = 0; i < aTypes.length; ++i) {
-      transData = this.createTransferableData(aValues[i]);
-      trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
-      trans.addDataFlavor(aTypes[i]);
-      trans.setTransferData (aTypes[i], transData.data, transData.size);
-      supports = trans.QueryInterface(Components.interfaces.nsISupports);
-      transArray.appendElement(supports, /* weak */ false);
-    }
-
-    var nsIDragService = Components.interfaces.nsIDragService;
-    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
-    dragService.invokeDragSession(aTarget, transArray, null, nsIDragService.DRAGDROP_ACTION_MOVE);
-  },
-  
-  createTransferableData: function(aValue)
-  {
-    var obj = {};
-    if (typeof(aValue) == "string") {
-      obj.data = XPCU.createInstance("@mozilla.org/supports-string;1", "nsISupportsString");
-      obj.data.data = aValue;
-      obj.size = aValue.length*2;
-    } else if (false) {
-      // TODO: create data for other primitive types
-    }
-    
-    return obj;
-  },
-  
-  checkCanDrop: function(aType)
-  {
-    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
-    var dragSession = dragService.getCurrentSession();
-    
-    var gotFlavor = false;
-    for (var i = 0; i < arguments.length; ++i)
-      gotFlavor |= dragSession.isDataFlavorSupported(arguments[i]); 
-
-    dragSession.canDrop = gotFlavor;
-    return gotFlavor;
-  },
-  
-  getData: function(aType, aIndex)
-  {
-    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
-    var dragSession = dragService.getCurrentSession();
-    
-    var trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
-    trans.addDataFlavor(aType);
-  
-    dragSession.getData(trans, aIndex);
-    var data = new Object();
-    trans.getAnyTransferData ({}, data, {});
-    return data.value;
-  }  
-  
-};
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/FrameExchange.js b/suite/extensions/inspector/resources/content/jsutil/xul/FrameExchange.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/FrameExchange.js
+++ /dev/null
@@ -1,34 +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/. */
-
-/***************************************************************
-* FrameExchange ----------------------------------------------
-*  Utility for passing specific data to a document loaded
-*  through an iframe
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// implementation ////////////////////
-
-var FrameExchange = {
-  mData: {},
-
-  loadURL: function(aFrame, aURL, aData)
-  {
-    this.mData[aURL] = aData;
-    aFrame.setAttribute("src", aURL);
-  },
-
-  receiveData: function(aWindow)
-  {
-    var id = aWindow.location.href;
-    var data = this.mData[id];
-    this.mData[id] = null;
-
-    return data;
-  }
-};
-
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/inBaseTreeView.js b/suite/extensions/inspector/resources/content/jsutil/xul/inBaseTreeView.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/inBaseTreeView.js
+++ /dev/null
@@ -1,82 +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/. */
-
-/***************************************************************
-* inBaseTreeView -------------------------------------------------
-*  Simple tree view object meant to be extended.
-*  
-* Usage example: MyView.prototype = new inBaseTreeView();
-****************************************************************/
-
-//XXX Don't use anonymous functions
-function inBaseTreeView() { }
-
-inBaseTreeView.prototype = 
-{
-  mRowCount: 0,
-  mTree: null,
-  
-  get rowCount() { return this.mRowCount; },
-  setTree: function(aTree) { this.mTree = aTree; },
-  getCellText: function(aRow, aCol) { return ""; },
-  getRowProperties: function(aIndex, aProperties) { return ""; },
-  getCellProperties: function(aIndex, aCol, aProperties) { return ""; },
-  getColumnProperties: function(aCol, aProperties) { return ""; },
-  getParentIndex: function(aRowIndex) { },
-  hasNextSibling: function(aRowIndex, aAfterIndex) { },
-  getLevel: function(aIndex) {},
-  getImageSrc: function(aRow, aCol) {},
-  getProgressMode: function(aRow, aCol) {},
-  getCellValue: function(aRow, aCol) {},
-  isContainer: function(aIndex) {},
-  isContainerOpen: function(aIndex) {},
-  isContainerEmpty: function(aIndex) {},
-  isSeparator: function(aIndex) {},
-  isSorted: function() {},
-  toggleOpenState: function(aIndex) {},
-  selectionChanged: function() {},
-  cycleHeader: function(aCol) {},
-  cycleCell: function(aRow, aCol) {},
-  isEditable: function(aRow, aCol) {},
-  isSelectable: function(aRow, aCol) {},
-  setCellValue: function(aRow, aCol, aValue) {},
-  setCellText: function(aRow, aCol, aValue) {},
-  performAction: function(aAction) {},
-  performActionOnRow: function(aAction, aRow) {},
-  performActionOnCell: function(aAction, aRow, aCol) {},
-
- /**
-  * Returns an array of selected indices in the tree.
-  * @return an array of indices
-  */
-  getSelectedIndices: function getSelectedIndices()
-  {
-    var indices = [];
-    var rangeCount = this.selection.getRangeCount();
-    for (var i = 0; i < rangeCount; i++) {
-      var start = {};
-      var end = {};
-      this.selection.getRangeAt(i,start,end);
-      for (var c = start.value; c <= end.value; c++) {
-        indices.push(c);
-      }
-    }
-    return indices;
-  },
-
- /**
-  * Returns an array of row objects selected in the tree.
-  * @return an array of row objects
-  */
-  getSelectedRowObjects: function getSelectedRowObjects()
-  {
-    var declarations = [];
-    var indices = this.getSelectedIndices();
-    for (var i = 0; i < indices.length; i++) {
-      declarations.push(this.getRowObjectFromIndex(indices[i]));
-    }
-    return declarations;
-  }
-  
-};
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/inDataTreeView.js b/suite/extensions/inspector/resources/content/jsutil/xul/inDataTreeView.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/inDataTreeView.js
+++ /dev/null
@@ -1,243 +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/. */
-
-
-///////////////////////////////////////////////////////////////////////////////
-//// inDataTreeView
-
-function inDataTreeView()
-{
-  this.mRows = [];
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inDataTreeView. nsITreeView interface implementation
-
-inDataTreeView.prototype = new inBaseTreeView();
-
-inDataTreeView.prototype.__defineGetter__("rowCount",
-  function inDataTreeView_rowCount()
-  {
-    return this.mRows.length;
-  }
-);
-
-inDataTreeView.prototype.getCellText =
-  function inDataTreeView_getCellText(aRowIdx, aCol)
-{
-  var row = this.getRowAt(aRowIdx);
-  return row ? row.node.data[aCol.id] : "";
-};
-
-inDataTreeView.prototype.isContainer =
-  function inDataTreeView_isContainer(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  return row ? row.node.children.length > 0 : false;
-};
-
-inDataTreeView.prototype.isContainerOpen =
-  function inDataTreeView_isContainerOpen(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  return row ? row.isOpen : false;
-};
-
-inDataTreeView.prototype.isContainerEmpty =
-  function inDataTreeView_isContainerEmpty(aRowIdx)
-{
-  return !this.isContainer(aRowIdx);
-};
-
-inDataTreeView.prototype.getLevel =
-  function inDataTreeView_getLevel(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  return row ? row.node.level : 0;
-};
-
-inDataTreeView.prototype.getParentIndex =
-  function inDataTreeView_getParentIndex(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  if (!row) {
-    return -1;
-  }
-
-  for (let i = aRowIdx - 1; i >= 0; --i) {
-    let checkRow = this.getRowAt(i);
-    if (checkRow.node == row.node.parent) {
-      return i;
-    }
-  }
-
-  return -1;
-};
-
-inDataTreeView.prototype.hasNextSibling =
-  function inDataTreeView_hasNextSibling(aRowIdx, aAfterRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  if (!row || !row.node.parent) {
-    return false;
-  }
-
-  var lastIdx = row.node.parent.children.length - 1;
-  return row.node.parent.children[lastIdx] != row.node;
-};
-
-inDataTreeView.prototype.toggleOpenState =
-  function inDataTreeView_toggleOpenState(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  if (!row) {
-    return;
-  }
-
-  var oldCount = this.rowCount;
-  if (row.isOpen) {
-    this.collapseRowAt(aRowIdx);
-  }
-  else {
-    this.expandRowAt(aRowIdx);
-  }
-
-  this.mTree.invalidateRow(aRowIdx);
-  this.mTree.rowCountChanged(aRowIdx + 1, this.rowCount - oldCount);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//// inDataTreeView. Public.
-
-/**
- * Append the child row to the row at the given index.
- */
-inDataTreeView.prototype.appendChild =
-  function inDataTreeView_appendChild(aParent, aData)
-{
-  var node = new inDataTreeViewNode(aData);
-  if (aParent) {
-    node.level = aParent.level + 1;
-    node.parent = aParent;
-    aParent.children.push(node);
-    return node;
-  }
-
-  this.mRows.push(new inDataTreeViewRow(node));
-  return node;
-};
-
-/**
- * Expand nodes from the given list. The caller should ensure that every node
- * to expand precedes its ancestors in the list, in other words the list should
- * be in reverse order, and include all ancestor nodes.
- */
-inDataTreeView.prototype.expandNodes =
-  function inDataTreeView_expandNodes(aNodes)
-{
-  var node = aNodes.pop();
-  for (let rowIdx = 0; node && rowIdx < this.mRows.length; rowIdx++) {
-    if (this.getRowAt(rowIdx).node == node) {
-      this.expandRowAt(rowIdx);
-      node = aNodes.pop();
-    }
-  }
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-//// inDataTreeView. Tree utils.
-
-/**
- * Expands a tree node on the given row.
- */
-inDataTreeView.prototype.expandRowAt =
-  function inDataTreeView_expandRowAt(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  if (!row || row.isOpen) {
-    return;
-  }
-
-  var kids = row.node.children;
-  var kidCount = kids.length;
-
-  for (let i = this.rowCount - 1; i > aRowIdx; --i) {
-    this.mRows[i + kidCount] = this.mRows[i];
-  }
-
-  for (let i = 0; i < kidCount; ++i) {
-    this.mRows[aRowIdx + i + 1] = new inDataTreeViewRow(kids[i]);
-  }
-
-  row.isOpen = true;
-};
-
-/**
- * Collapse a tree node on the given row.
- */
-inDataTreeView.prototype.collapseRowAt =
-  function inDataTreeView_collapseRowAt(aRowIdx)
-{
-  var row = this.getRowAt(aRowIdx);
-  if (!row || !row.isOpen) {
-    return;
-  }
-
-  var removeCount = 0;
-  var rowLevel = row.node.level;
-  for (let idx = aRowIdx + 1; idx < this.rowCount; idx++) {
-    if (this.getRowAt(idx).node.level <= rowLevel) {
-      removeCount = idx - aRowIdx - 1;
-      break;
-    }
-  }
-  this.mRows.splice(aRowIdx + 1, removeCount);
-
-  row.isOpen = false;
-};
-
-/**
- * Return a tree row object by the given row index.
- */
-inDataTreeView.prototype.getRowAt =
-  function inDataTreeView_getRowAt(aRowIdx)
-{
-  if (aRowIdx < 0 || aRowIdx >= this.rowCount) {
-    return null;
-  }
-
-  return this.mRows[aRowIdx];
-}
-
-/**
- * Return a tree row data object by the given row index.
- */
-inDataTreeView.prototype.getDataAt =
-  function inDataTreeView_getDataAt(aRowIdx)
-{
-  if (aRowIdx < 0 || aRowIdx >= this.rowCount) {
-    return null;
-  }
-
-  return this.mRows[aRowIdx].node.data;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//// inDataTreeViewNode
-
-function inDataTreeViewNode(aData)
-{
-  this.parent = null;
-  this.children = [];
-
-  this.level = 0;
-  this.data = aData;
-}
-
-function inDataTreeViewRow(aNode)
-{
-  this.node = aNode;
-  this.isOpen = false;
-}
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/inFormManager.js b/suite/extensions/inspector/resources/content/jsutil/xul/inFormManager.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/inFormManager.js
+++ /dev/null
@@ -1,111 +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/. */
-
-/***************************************************************
-* inFormManager -------------------------------------------------
-*  Manages the reading and writing of forms via simple maps of
-*  attribute/value pairs.  A "form" is simply a XUL window which
-*  contains "form widgets" such as textboxes and menulists.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-****************************************************************/
-
-////////////////////////////////////////////////////////////////////////////
-//// class inFormManager
-
-var inFormManager =
-{
-  // Object
-  readWindow: function(aWindow, aIds)
-  {
-    var el, fn;
-    var doc = aWindow.document;
-    var map = {};
-    for (var i = 0; i < aIds.length; i++) {
-      el = doc.getElementById(aIds[i]);
-      if (el) {
-        this.persistIf(doc, el);
-        fn = this["read_"+el.localName];
-        if (fn)
-          map[aIds[i]] = fn(el);
-      }
-    }
-
-    return map;
-  },
-
-  // void
-  writeWindow: function(aWindow, aMap)
-  {
-    var el, fn;
-    var doc = aWindow.document;
-    for (var i = 0; i < aIds.length; i++) {
-      el = doc.getElementById(aIds[i]);
-      if (el) {
-        fn = this["write_"+el.localName];
-        if (fn)
-          fn(el, aMap[aIds[i]]);
-      }
-    }
-  },
-
-  persistIf: function(aDoc, aEl)
-  {
-    if (aEl.getAttribute("persist") == "true" && aEl.hasAttribute("id")) {
-      aEl.setAttribute("value", aEl.value);
-      aDoc.persist(aEl.getAttribute("id"), "value");
-    }
-  },
-
-  read_textbox: function(aEl)
-  {
-    return aEl.value;
-  },
-
-  read_menulist: function(aEl)
-  {
-    return aEl.getAttribute("value");
-  },
-
-  read_checkbox: function(aEl)
-  {
-    return aEl.getAttribute("checked") == "true";
-  },
-
-  read_radiogroup: function(aEl)
-  {
-    return aEl.getAttribute("value");
-  },
-
-  read_colorpicker: function(aEl)
-  {
-    return aEl.getAttribute("color");
-  },
-
-  write_textbox: function(aEl, aValue)
-  {
-    aEl.setAttribute("value", aValue);
-  },
-
-  write_menulist: function(aEl, aValue)
-  {
-    aEl.setAttribute("value", aValue);
-  },
-
-  write_checkbox: function(aEl, aValue)
-  {
-    aEl.setAttribute("checked", aValue);
-  },
-
-  write_radiogroup: function(aEl, aValue)
-  {
-    aEl.setAttribute("value", aValue);
-  },
-
-  write_colorpicker: function(aEl, aValue)
-  {
-    aEl.color = aValue;
-  }
-};
-
diff --git a/suite/extensions/inspector/resources/content/jsutil/xul/inTreeBuilder.js b/suite/extensions/inspector/resources/content/jsutil/xul/inTreeBuilder.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/jsutil/xul/inTreeBuilder.js
+++ /dev/null
@@ -1,636 +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/. */
-
-/***************************************************************
-* inTreeBuilder -------------------------------------------------
-*  Automatically builds up an tree so that it will display a tabular
-*  set of data with titled columns and optionally an icon for each row.
-*  The tree that is supplied must have an treechildren with an 
-*  empty template inside of it.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xul/DNDUtils.js
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var inTreeBuilderPartCount = 0;
-
-//////////// global constants ////////////////////
-
-////////////////////////////////////////////////////////////////////////////
-//// class inTreeBuilder
-
-function inTreeBuilder(aTree, aNameSpace, aArcName)
-{
-  this.tree = aTree;
-  this.nameSpace = aNameSpace;
-  this.arcName = aArcName;
-
-  this.mColumns = [];
-  this.mExtras = [];
-}
-
-inTreeBuilder.prototype =
-{
-  mTree: null,
-  mTreeBody: null,
-  // datasource stuff
-  mNameSpace: null,
-  mArcName: null,
-  mIsRefContainer: false,
-  mIsContainer: true,
-
-  // table structure stuff
-  mIsIconic: false,
-  mColumns: null,
-  mSplitters: true,
-  mRowFields: null,
-  mRowAttrs: null,
-  mAllowDND: false,
-  mLastDragCol: null,
-  mLastDragColWhere: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// properties
-
-  // the xul tree node we will construct
-  get tree() { return this.mTree },
-  set tree(aVal) 
-  { 
-    this.mTree = aVal;
-    if (aVal)
-      this.mTreeBody = aVal.getElementsByTagName("treechildren")[0];
-    aVal._treeBuilder = this 
-  },
-
-  // the namespace to use for all fields
-  get nameSpace() { return this.mNameSpace },
-  set nameSpace(aVal) { this.mNameSpace = aVal },
-
-  // the name of the arc to the container
-  get arcName() { return this.mArcName },
-  set arcName(aVal) { this.mArcName = aVal },
-
-  // is the datasource ref an arc to a container, or a container itself
-  get isRefContainer() { return this.mIsRefContainer },
-  set isRefContainer(aVal) { this.mIsRefContainer = aVal },
-
-  // is each row a potential container?
-  get isContainer() { return this.mIsContainer },
-  set isContainer(aVal) { this.mIsContainer = aVal },
-
-  // place an icon before the first column of each row
-  get isIconic() { return this.mIsIconic },
-  set isIconic(aVal) { this.mIsIconic = aVal },
-
-  // put splitters between the columns?
-  get useSplitters() { return this.mSplitters },
-  set useSplitters(aVal) { this.mSplitters = aVal },
-
-  // extra attributes to set on the treeitem
-  get rowAttributes() { return this.mRowAttrs },
-  set rowAttributes(aVal) { this.mRowAttrs = aVal },
-
-  // extra data fields to set on the treeitem
-  get rowFields() { return this.mRowFields },
-  set rowFields(aVal) { this.mRowFields = aVal },
-
-  // extra data fields to set on the treeitem
-  get allowDragColumns() { return this.mAllowDND },
-  set allowDragColumns(aVal) { this.mAllowDND = aVal },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// event handlers
-
-  get onColumnAdd() { return this.mOnColumnAdd },
-  set onColumnAdd(aFn) { this.mOnColumnAdd = aFn },
-
-  get onColumnRemove() { return this.mOnColumnRemove },
-  set onColumnRemove(aFn) { this.mOnColumnRemove = aFn },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// initialization
-
-  initialize: function()
-  {
-    this.initColumns();
-    this.initTemplate();
-  },
-
-  initColumns: function()
-  {
-    this.initDND();
-  },
-
-  initTemplate: function()
-  {
-    var template = this.mTree.getElementsByTagNameNS(kXULNSURI, "template")[0];
-    this.mTemplate = template;
-    this.clearChildren(template);
-
-    var rule = document.createElementNS(kXULNSURI, "rule");
-    template.appendChild(rule);
-    this.mRule = rule;
-
-    this.createDefaultConditions();
-
-    var bindings = document.createElementNS(kXULNSURI, "bindings");
-    rule.appendChild(bindings);
-    this.mBindings = bindings;
-
-    this.createDefaultAction();
-  },
-
-  createDefaultConditions: function()
-  {
-    var conditions = document.createElementNS(kXULNSURI, "conditions");
-    this.mRule.appendChild(conditions);
-
-    var content = document.createElementNS(kXULNSURI, "treerow");
-    content.setAttribute("uri", "?uri");
-    conditions.appendChild(content);
-
-    var triple = this.createTriple("?uri", this.mNameSpace+this.mArcName,
-      this.mIsRefContainer ? "?table" : "?row");
-    conditions.appendChild(triple);
-
-    if (this.mIsRefContainer) {
-      var member = this.createMember("?table", "?row");
-      conditions.appendChild(member);
-    }
-  },
-
-  createDefaultAction: function()
-  {
-    var action = document.createElementNS(kXULNSURI, "action");
-    this.mRule.appendChild(action);
-
-    var orow = this.createTemplatePart("treerow");
-    orow.setAttribute("uri", "?row");
-    action.appendChild(orow);
-    this.mTreeRow = orow;
-
-    // assign the item attributes
-    if (this.mRowAttrs)
-      for (key in this.mRowAttrs)
-        orow.setAttribute(key, this.mRowAttrs[key]);
-  },
-
-  createDefaultBindings: function()
-  {
-    // assign the item fields
-    var binding;
-    if (this.mRowFields) {
-      var props = "";
-      for (key in this.mRowFields) {
-        binding = this.createBinding(this.mRowFields[key]);
-        this.mBindings.appendChild(binding);
-        props += key+"-?"+this.mRowFields[key]+" ";
-      }
-      this.mTreeRow.setAttribute("properties", props);
-    }
-  },
-
-  createTriple: function(aSubject, aPredicate, aObject)
-  {
-    var triple = document.createElementNS(kXULNSURI, "triple");
-    triple.setAttribute("subject", aSubject);
-    triple.setAttribute("predicate", aPredicate);
-    triple.setAttribute("object", aObject);
-
-    return triple;
-  },
-
-  createMember: function(aContainer, aChild)
-  {
-    var member = document.createElementNS(kXULNSURI, "member");
-    member.setAttribute("container", aContainer);
-    member.setAttribute("child", aChild);
-
-    return member;
-  },
-
-  reset: function()
-  {
-    this.mColumns = [];
-    this.mIsIconic = false;
-
-    this.resetTree();
-  },
-
-  resetTree: function()
-  {
-    var kids = this.mTree.childNodes;
-    for (var i = kids.length - 1; i >= 0; --i)
-      if (kids[i].localName != "treechildren")
-        this.mTree.removeChild(kids[i]);
-      
-    this.clearChildren(this.mBindings);
-    this.clearChildren(this.mTreeRow);
-    this.createDefaultBindings();
-  },
-
-  clearChildren: function(aEl)
-  {
-    while (aEl.hasChildNodes())
-      aEl.removeChild(aEl.lastChild);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// column drag and drop
-
-  initDND: function()
-  {
-    if (this.mAllowDND) {
-      // addEventListener doesn't work for dnd events, apparently... so we use the attributes
-      this.addDNDListener(this.mTree, "ondragenter");
-      this.addDNDListener(this.mTree, "ondragover");
-      this.addDNDListener(this.mTree, "ondragexit");
-      this.addDNDListener(this.mTree, "ondragstart");
-      this.addDNDListener(this.mTree, "ondrop");
-    }
-  },
-
-  onDragEnter: function(aEvent)
-  {
-  },
-
-  onDragOver: function(aEvent)
-  {
-    if (!DNDUtils.checkCanDrop("TreeBuilder/column-add"))
-      return;
-
-    var idx = this.getColumnIndexFromX(aEvent.clientX, 0.5);
-    this.mColumnInsertIndex = idx;
-    var col = this.getColumnAt(idx);
-    
-    if (idx == -1)
-      this.markColumnInsert(col, "after");
-    else
-      this.markColumnInsert(col, "before");
-  },
-
-  onDragExit: function(aEvent)
-  {
-  },
-
-  onDrop: function(aEvent)
-  {
-    this.markColumnInsert(null);
-    var dragService = XPCU.getService("@mozilla.org/widget/dragservice;1", "nsIDragService");
-    var dragSession = dragService.getCurrentSession();
-
-    if (!dragSession.isDataFlavorSupported("TreeBuilder/column-add"))
-      return false;
-
-    var trans = XPCU.createInstance("@mozilla.org/widget/transferable;1", "nsITransferable");
-    trans.addDataFlavor("TreeBuilder/column-add");
-
-    dragSession.getData(trans, 0);
-    var data = {};
-    trans.getAnyTransferData ({}, data, {});
-
-    var string = XPCU.QI(data.value, "nsISupportsString");
-
-    this.insertColumn(this.mColumnInsertIndex,
-      {
-        name: string.data,
-        title: string.data,
-        flex: 1
-      });
-    
-    
-    // if we rebuildContent during this thread, it will crash in the dnd service
-    setTimeout(function(me) { me.build(); me.buildContent() }, 1, this);
-
-    // bug 56270 - dragSession.sourceDocument is null --
-    // causes me to code this very temporary, very nasty hack
-    // to tell columnsDialog.js about the drop
-    if (this.mTree.onClientDrop) {
-      this.mTree.onClientDrop();
-    }
-  },
-
-  markColumnInsert: function (aColumn, aWhere)
-  {
-    var col = this.mLastDragCol;
-    var lastWhere = this.mLastDragColWhere;
-    if (col)
-      col.setAttribute("properties", "");
-
-    if (aWhere != "before" && aWhere != "after") {
-      this.mLastDragCol = null;
-      this.mLastDragColWhere = null;
-      return;
-    }
-
-    col = aColumn;
-    if (col) {
-      this.mLastDragCol = col;
-      this.mLastDragColWhere = aWhere;
-      col.setAttribute("properties", "dnd-insert-"+aWhere);
-    }
-    
-    var bx = this.mTree.boxObject.QueryInterface(Components.interfaces.nsITreeBoxObject);
-    bx.invalidate();
-  },
-
-  getColumnIndexFromX: function(aX, aThresh)
-  {
-    var width = 0;
-    var col, cw;
-    for (var i = 0; i < this.columnCount; ++i) {
-      col = this.getColumnAt(i);
-      cw = col.boxObject.width;
-      width += cw;
-      if (width-(cw*aThresh) > aX)
-        return i;
-    }
-
-    return -1;
-  },
-
-  getColumnIndexFromHeader: function(aHeader)
-  {
-    var headers = this.mTree.getElementsByTagName("treecol");
-    for (var i = 0; i < headers.length; ++i) {
-      if (headers[i] == aHeader)
-        return i;
-    }
-    return -1;
-  },
-
-  //// for drag-n-drop removal/arrangement of columns
-
-  onDragStart: function(aEvent)
-  {
-    var target = aEvent.target;
-    if (target.parentNode == this.mTree) {
-      var column = target.getAttribute("label");
-
-      var idx = this.getColumnIndexFromHeader(target);
-      if (idx == -1) return;
-      this.mColumnDragging = idx;
-
-      DNDUtils.invokeSession(target, ["TreeBuilder/column-remove"], [column]);
-    }
-  },
-
-  addColumnDropTarget: function(aBox)
-  {
-    aBox._treeBuilderDropTarget = this;
-    this.addDNDListener(aBox, "ondragover", "Target");
-    this.addDNDListener(aBox, "ondrop", "Target");
-  },
-
-  removeColumnDropTarget: function(aBox)
-  {
-    aBox._treeBuilderDropTarget = this;
-    this.removeDNDListener(aBox, "ondragover", "Target");
-    this.removeDNDListener(aBox, "ondrop", "Target");
-  },
-
-  onDragOverTarget: function(aBox, aEvent)
-  {
-    DNDUtils.checkCanDrop("TreeBuilder/column-remove");
-  },
-
-  onDropTarget: function(aBox, aEvent)
-  {
-    this.removeColumn(this.mColumnDragging);
-    this.build();
-    // if we rebuildContent during this thread, it will crash in the dnd service
-    setTimeout(function(aTreeBuilder) { aTreeBuilder.buildContent() }, 1, this);
-  },
-
-  // these are horrible hacks to compensate for the lack of true multiple
-  // listener support for the DND events
-
-  addDNDListener: function(aBox, aType, aModifier)
-  {
-   var js = "inTreeBuilder_"+aType+(aModifier?"_"+aModifier:"")+"(this, event);";
-
-   var attr = aBox.getAttribute(aType);
-   attr = attr ? attr : "";
-   aBox.setAttribute(aType, attr + js);
-  },
-
-  removeDNDListener: function(aBox, aType, aModifier)
-  {
-   var js = "inTreeBuilder_"+aType+(aModifier?"_"+aModifier:"")+"(this, event);";
-
-   var attr = aBox.getAttribute(aType);
-   var idx = attr.indexOf(js);
-   if (idx != -1)
-     attr = attr.substr(0,idx) + attr.substr(idx+1);
-   aBox.setAttribute(aType, attr);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// column properties
-
-  addColumn: function(aData)
-  {
-    this.mColumns.push(aData);
-
-    if (this.mOnColumnAdd)
-      this.mOnColumnAdd(this.mColumns.length-1)
-  },
-
-  insertColumn: function(aIndex, aData)
-  {
-    var idx;
-    if (aIndex == -1) {
-      this.mColumns.push(aData);
-      idx = this.mColumns.length-1;
-    } else {
-      this.mColumns.splice(aIndex, 0, aData);
-      idx = aIndex;
-    }
-
-    if (this.mOnColumnAdd)
-      this.mOnColumnAdd(idx);
-  },
-
-  removeColumn: function(aIndex)
-  {
-    this.mColumns.splice(aIndex, 1);
-
-    if (this.mOnColumnRemove)
-      this.mOnColumnRemove(aIndex);
-  },
-
-  getColumnAt: function(aIndex)
-  {
-    var kids = this.mTree.getElementsByTagName("treecol");
-    return aIndex < 0 || aIndex >= kids.length ? kids[kids.length-1] : kids[aIndex];
-  },
-
-  get columnCount() { return this.mColumns.length },
-
-  getColumnName: function(aIndex) { return this.mColumns[aIndex].name  },
-  setColumnName: function(aIndex, aValue) { this.mColumns[aIndex].name = aValue },
-
-  getColumnTitle: function(aIndex) { return this.mColumns[aIndex].title  },
-  setColumnTitle: function(aIndex, aValue) { this.mColumns[aIndex].title = aValue },
-
-  getColumnClassName: function(aIndex) { return this.mColumns[aIndex].className  },
-  setColumnClassName: function(aIndex, aValue) { this.mColumns[aIndex].className = aValue },
-
-  getColumnFlex: function(aIndex) { return this.mColumns[aIndex].flex  },
-  setColumnFlex: function(aIndex, aValue) { this.mColumns[aIndex].flex = aValue },
-
-  getExtras: function(aIndex) { return this.mColumns[aIndex].extras  },
-  setExtras: function(aIndex, aValue) { this.mColumns[aIndex].extras = aExtras },
-
-  getAttrs: function(aIndex) { return this.mColumns[aIndex].attrs  },
-  setAttrs: function(aIndex, aValue) { this.mColumns[aIndex].attrs = aExtras },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// template building
-
-  build: function(aBuildContent)
-  {
-    try {
-      this.resetTree();
-      this.buildColumns();
-      this.buildTemplate();
-      if (aBuildContent)
-        this.buildContent();
-    } catch (ex) {
-      debug("### ERROR - inTreeBuilder::build failed.\n" + ex);
-    }
-
-    //dumpDOM2(this.mTree);
-
-  },
-
-  buildContent: function()
-  {
-    this.mTreeBody.builder.rebuild();
-  },
-
-  buildColumns: function()
-  {
-    var cols = document.createElementNS(kXULNSURI, "treecols");
-    var col, val, split;
-    for (var i = 0; i < this.mColumns.length; i++) {
-      col = document.createElementNS(kXULNSURI, "treecol");
-      col.setAttribute("id", "treecol-"+this.mColumns[i].name);
-      col.setAttribute("persist", "width");
-      col.setAttribute("label", this.mColumns[i].title);
-
-      // mark first node as primary, if necessary
-      if (i == 0 && this.mIsContainer)
-        col.setAttribute("primary", "true");
-
-      val = cols[i].className;
-      if (val)
-        col.setAttribute("class", val);
-      val = cols[i].flex;
-      if (val)
-        col.setAttribute("flex", val);
-
-      cols.appendChild(col);
-
-      if (this.mSplitters && i < this.mColumns.length-1) {
-        split = document.createElementNS(kXULNSURI, "splitter");
-        split.setAttribute("class", "tree-splitter");
-        cols.appendChild(split);
-      }
-    }
-    this.mTree.appendChild(cols);
-  },
-
-  buildTemplate: function()
-  {
-    var cols = this.mColumns;
-    var bindings = this.mBindings;
-    var row = this.mTreeRow;
-    var cell, binding, val, extras, attrs, key, className;
-
-    if (this.mIsIconic) {
-      binding = this.createBinding("_icon");
-      bindings.appendChild(binding);
-    }
-
-    for (var i = 0; i < cols.length; ++i) {
-      val = cols[i].name;
-      if (!val)
-        throw "Column data is incomplete - missing name at index " + i + ".";
-
-      cell = this.createTemplatePart("treecell");
-      className = "";
-
-      // build the default value data field
-      binding = this.createBinding(val);
-      bindings.appendChild(binding);
-      
-      cell.setAttribute("label", "?" + val);
-      cell.setAttribute("ref", "treecol-"+cols[i].name);
-      cell.setAttribute("class", className);
-      
-      var props = "";
-      for (key in this.mRowFields)
-        props += key+"-?"+this.mRowFields[key]+" ";
-      cell.setAttribute("properties", props);
-
-      row.appendChild(cell);
-    }
-  },
-
-  createBinding: function(aName)
-  {
-    var binding = document.createElementNS(kXULNSURI, "binding");
-    binding.setAttribute("subject", "?row");
-    binding.setAttribute("predicate", this.mNameSpace+aName);
-    binding.setAttribute("object", "?" + aName);
-    return binding;
-  },
-
-  createTemplatePart: function(aTagName)
-  {
-    var el = document.createElementNS(kXULNSURI, aTagName);
-    el.setAttribute("id", "templatePart"+inTreeBuilderPartCount);
-    inTreeBuilderPartCount++;
-    return el;
-  }
-
-};
-
-function inTreeBuilder_ondragstart(aTree, aEvent)
-{
-  return aTree._treeBuilder.onDragStart(aEvent);
-}
-
-function inTreeBuilder_ondragenter(aTree, aEvent)
-{
-  return aTree._treeBuilder.onDragEnter(aEvent);
-}
-
-function inTreeBuilder_ondragover(aTree, aEvent)
-{
-  return aTree._treeBuilder.onDragOver(aEvent);
-}
-
-function inTreeBuilder_ondragexit(aTree, aEvent)
-{
-  return aTree._treeBuilder.onDragExit(aEvent);
-}
-
-function inTreeBuilder_ondrop(aTree, aEvent)
-{
-  return aTree._treeBuilder.onDrop(aEvent);
-}
-
-function inTreeBuilder_ondragover_Target(aBox, aEvent)
-{
-  return aBox._treeBuilderDropTarget.onDragOverTarget(aBox, aEvent);
-}
-
-function inTreeBuilder_ondrop_Target(aBox, aEvent)
-{
-  return aBox._treeBuilderDropTarget.onDropTarget(aBox, aEvent);
-}
diff --git a/suite/extensions/inspector/resources/content/keysetOverlay.xul b/suite/extensions/inspector/resources/content/keysetOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/keysetOverlay.xul
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<overlay id="ovKeyset"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <keyset id="ksGlobalKeyset">
-    <key id="keyEnterLocation" command="cmdEnterLocation"
-         key="&cmdEnterLocation.key;" modifiers="accel"/>
-    <key id="keyEnterLocation2" command="cmdEnterLocation"
-         key="&cmdEnterLocation.key2;" modifiers="alt"/>
-  </keyset>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/object.js b/suite/extensions/inspector/resources/content/object.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/object.js
+++ /dev/null
@@ -1,91 +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/. */
-
-/***************************************************************
-* ObjectApp -------------------------------------------------
-*  The primary object that controls the Inspector compact app.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var inspector;
-
-//////////// global constants ////////////////////
-
-//////////////////////////////////////////////////
-
-window.addEventListener("load", ObjectApp_initialize, false);
-window.addEventListener("unload", ObjectApp_destroy, false);
-
-function ObjectApp_initialize()
-{
-  inspector = new ObjectApp();
-  inspector.initialize();
-}
-
-function ObjectApp_destroy()
-{
-  inspector.destroy();
-}
-
-////////////////////////////////////////////////////////////////////////////
-//// class ObjectApp
-
-function ObjectApp()
-{
-}
-
-ObjectApp.prototype = 
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  initialize: function()
-  {
-    this.mInitTarget = window.arguments && window.arguments.length > 0 ? window.arguments[0] : null;
-
-    this.mPanelSet = document.getElementById("bxPanelSet");
-    this.mPanelSet.addObserver("panelsetready", this, false);
-    this.mPanelSet.initialize();
-  },
-  
-  destroy: function()
-  {
-  },
-  
-  doViewerCommand: function(aCommand)
-  {
-    this.mPanelSet.execCommand(aCommand);
-  },
-  
-  getViewer: function(aUID)
-  {
-    return this.mPanelSet.registry.getViewerByUID(aUID);
-  },
-  
-  onEvent: function(aEvent)
-  {
-    switch (aEvent.type) {
-      case "panelsetready":
-        this.initViewerPanels();
-    }
-  },
-
-  initViewerPanels: function()
-  {
-    if (this.mInitTarget)
-      this.target = this.mInitTarget;
-  },
-  
-  set target(aObj)
-  {
-    this.mPanelSet.getPanel(0).subject = aObj;
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////
-//// event listeners
-
diff --git a/suite/extensions/inspector/resources/content/object.xul b/suite/extensions/inspector/resources/content/object.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/object.xul
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE window [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-
-<window id="winInspectorMain" class="color-dialog" 
-        title="&Inspector.title;"
-        width="400" height="700"
-        persist="screenX screenY width height sizemode"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <script type="application/javascript" src="chrome://inspector/content/object.js"/>  
-  <script type="application/javascript" src="chrome://inspector/content/Flasher.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/ViewerRegistry.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
-      
-  <commandset id="cmdsGlobalCommands"/>
-  <keyset id="ksGlobalKeyset"/>
-  <popupset id="ppsViewerPopupset"/>
-  
-  <domi-panelset id="bxPanelSet" flex="1" viewercommandset="cmdsGlobalCommands">
-    <domi-panel title="&bxObjectPanel.title;" flex="1"/>
-  </domi-panelset>
-
-</window>
-
-        
diff --git a/suite/extensions/inspector/resources/content/popupOverlay.xul b/suite/extensions/inspector/resources/content/popupOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/popupOverlay.xul
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<overlay id="ovPopupsMain"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <popupset id="aTooltipSet">
-    <tooltip id="docItemsTooltip"
-             noautohide="true"
-             onpopupshowing="return inspector.fillInTooltip(document.tooltipNode);">
-      <vbox>
-        <label id="docItemsTitle" class="tooltip-label"/>
-        <label id="docItemsURI" class="tooltip-label"/>
-      </vbox>
-    </tooltip>
-  </popupset>
-
-  <menupopup id="menu_FilePopup">
-    <menu oncommand="inspector.setTargetDocument(event.target.doc);"
-          id="mnInspectContentDocumentFile"
-          label="&mnInspectContentDocument.label;"
-          accesskey="&mnInspectContentDocument.accesskey;">
-      <menupopup id="list-content-documents-popup"
-                 tooltip="docItemsTooltip"
-                 onpopupshowing="inspector.showInspectDocumentList(event, false);"/>
-    </menu>
-    <menu oncommand="inspector.setTargetDocument(event.target.doc);"
-          id="mnInspectChromeDocumentFile"
-          label="&mnInspectChromeDocument.label;"
-          accesskey="&mnInspectChromeDocument.accesskey;">
-      <menupopup id="list-chrome-documents-popup"
-                 tooltip="docItemsTooltip"
-                 onpopupshowing="inspector.showInspectDocumentList(event, true);"/>
-    </menu>
-    <menuitem oncommand="inspector.setTargetApplicationAccessible();"
-              id="mnInspectApplicationAccessible"
-              label="&mnInspectApplicationAccessible.label;"
-              accesskey="&mnInspectApplicationAccessible.accesskey;"/>
-    <menuitem label="&cmdEnterLocation.label;"
-              accesskey="&cmdEnterLocation.accesskey;"
-              id="mnEnterLocation" observes="cmdEnterLocation"/>
-    <menuitem label="&cmdClose.label;" accesskey="&cmdClose.accesskey;"
-              id="mnClose" observes="cmdClose" key="key_closeInspector"/>
-    <menuseparator/>
-    <menuitem label="&cmdSave.label;" accesskey="&cmdSave.accesskey;"
-              observes="cmdSave" key="key_saveInspector" id="mi-save"/>
-  </menupopup>
-
-  <menupopup id="mppEdit">
-    <menuitem id="mnEditUndo"/>
-    <menuitem id="mnEditRedo"/>
-    <menuseparator/>
-    <menuitem id="mnEditCut"/>
-    <menuitem id="mnEditCopy"/>
-    <menuitem id="mnEditPaste"/>
-    <menuitem id="mnEditDelete"/>
-    <menuitem id="mnEditInsert"/>
-    <menuseparator/>
-    <menuitem id="mnEditInspectInNewWindow"/>
-  </menupopup>
-
-  <menupopup id="mppView">
-    <menu id="mnDocViewerList"
-          label="&mnDocViewerList.label;"
-          accesskey="&mnDocViewerList.accesskey;"
-          oncommand="inspector.onViewerListCommand(event.target);"
-          disabled="true">
-      <menupopup id="mppDocViewerList"/>
-    </menu>
-    <menu id="mnObjectViewerList"
-          label="&mnObjectViewerList.label;"
-          accesskey="&mnObjectViewerList.accesskey;"
-          oncommand="inspector.onViewerListCommand(event.target);"
-          disabled="true">
-      <menupopup id="mppObjectViewerList"/>
-    </menu>
-    <menuitem class="menuitem-iconic" type="checkbox"
-              id="item:toggleDocument"
-              label="&cmdToggleDocument.label;"
-              accesskey="&cmdToggleDocument.accesskey;"
-              observes="cmdToggleDocument" disabled="true"/> 
-    <menuseparator/>
-    <menuitem id="item:flashOnSelect"
-              class="menuitem-iconic"
-              type="checkbox"
-              label="&cmdFlashOnSelect.label;"
-              accesskey="&cmdFlashOnSelect.accesskey;"
-              observes="cmdFlashOnSelect"/>
-  </menupopup>
-
-  <popupset id="ppsViewerPopupset"/>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/prefs/inspector.js b/suite/extensions/inspector/resources/content/prefs/inspector.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/prefs/inspector.js
+++ /dev/null
@@ -1,18 +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/. */
-
-pref("inspector.blink.border-color", "#CC0000");
-pref("inspector.blink.border-width", 2);
-pref("inspector.blink.duration", 1200);
-pref("inspector.blink.on", true);
-pref("inspector.blink.speed", 100);
-pref("inspector.blink.invert", false);
-pref("inspector.dom.showAnon", true);
-pref("inspector.dom.showWhitespaceNodes", true);
-pref("inspector.dom.showAccessibleNodes", false);
-pref("inspector.dom.showProcessingInstructions", true);
-// Enables inspecting any DOM element by shift + right click
-// This is disabled by default and requires a restart to takeRecords
-// effect.
-pref("inspector.inspectElementKeyCombo.enabled", false);
diff --git a/suite/extensions/inspector/resources/content/prefs/pref-inspector.js b/suite/extensions/inspector/resources/content/prefs/pref-inspector.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/prefs/pref-inspector.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim: ts=2 sw=2 sts=2
- * 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/. */
-
-function Startup()
-{
-  SidebarPrefs_initialize();
-  enableBlinkPrefs(document.getElementById("inspector.blink.on").value);
-}
-
-function enableBlinkPrefs(aTruth)
-{
-  /* 
-   * define the pair of label and control used in the prefpane to allow
-   * disabling of both elements, if a pref is locked.
-   */
-  let els = {
-    lbElBorderColor: "cprElBorderColor",
-    lbElBorderWidth: "txfElBorderWidth",
-    lbElDuration: "txfElDuration",
-    lbElSpeed: "txfElSpeed",
-    "": "cbElInvert"
-  };
-
-  for (let [label, control] in Iterator(els)) {
-    let controlElem = document.getElementById(control);
-
-    // only remove disabled attribute, if pref isn't locked
-    if (aTruth && !isPrefLocked(controlElem)) {
-      controlElem.removeAttribute("disabled");
-      if (label)
-        document.getElementById(label).removeAttribute("disabled");
-    } else {
-      controlElem.setAttribute("disabled", true);
-      if (label)
-        document.getElementById(label).setAttribute("disabled", true);
-    }
-  }
-}
-
-function isPrefLocked(elem)
-{
-  if (!elem.hasAttribute("preference"))
-    return false;
-
-  return document.getElementById(elem.getAttribute("preference")).locked;
-}
diff --git a/suite/extensions/inspector/resources/content/prefs/pref-inspector.xul b/suite/extensions/inspector/resources/content/prefs/pref-inspector.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/prefs/pref-inspector.xul
+++ /dev/null
@@ -1,131 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/prefs.dtd">
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <prefpane id="inspector_pane"
-            label="&Inspector.label;"
-            script="chrome://inspector/content/extensions/wsm-colorpicker.js
-                    chrome://inspector/content/prefs/pref-inspector.js
-                    chrome://inspector/content/prefs/pref-sidebar.js
-                    chrome://inspector/content/jsutil/xpcom/XPCU.js
-                    chrome://inspector/content/jsutil/rdf/RDFU.js">
-
-    <stringbundle id="inspector-bundle" src="chrome://inspector/locale/inspector.properties"/>
-
-    <preferences id="inspector_preferences">
-      <preference id="inspector.blink.on"
-                  name="inspector.blink.on"
-                  type="bool"
-                  onchange="enableBlinkPrefs(this.value);"/>
-      <preference id="inspector.blink.border-color"
-                  name="inspector.blink.border-color"
-                  type="string"/>
-      <preference id="inspector.blink.border-width"
-                  name="inspector.blink.border-width"
-                  type="int"/>
-      <preference id="inspector.blink.duration"
-                  name="inspector.blink.duration"
-                  type="int"/>
-      <preference id="inspector.blink.speed"
-                  name="inspector.blink.speed"
-                  type="int"/>
-      <preference id="inspector.blink.invert"
-                  name="inspector.blink.invert"
-                  type="bool"/>
-      <!-- preference id="inspector.hooks.navigator"
-                  name="inspector.hooks.navigator"
-                  type="bool"/ -->
-    </preferences>
-
-    <groupbox id="tbxBlink">
-      <caption label="&elementBlinking.label;"/>
-      <vbox>
-        <checkbox id="cbElOn" label="&blinkSelectedElement.label;"
-                  preference="inspector.blink.on"
-                  accesskey="&blinkSelectedElement.accesskey;"/>
-        <grid>
-          <columns>
-            <column/>
-            <column flex="1"/>
-          </columns>
-          <rows>
-            <row align="center">
-              <label id="lbElBorderColor" control="cprElBorderColor"
-                     value="&borderColor.label;"
-                     accesskey="&borderColor.accesskey;"/>
-              <hbox align="center">
-                <colorpicker id="cprElBorderColor" type="button"
-                             preference="inspector.blink.border-color"/>
-              </hbox>
-            </row>
-            <row align="center">
-              <label id="lbElBorderWidth" control="txfElBorderWidth"
-                     value="&borderWidth.label;"
-                     accesskey="&borderWidth.accesskey;"/>
-              <hbox align="center">
-                <textbox id="txfElBorderWidth" style="width: 4em"
-                         preference="inspector.blink.border-width"/>
-                <label value="&px.label;"/>
-              </hbox>
-            </row>
-            <row align="center">
-            <label id="lbElDuration" control="txfElDuration"
-                   value="&blinkDuration.label;"
-                   accesskey="&blinkDuration.accesskey;"/>
-              <hbox align="center">
-                <textbox id="txfElDuration" style="width: 4em"
-                         preference="inspector.blink.duration"/>
-               <label value="&ms.label;"/>
-              </hbox>
-            </row>
-            <row align="center">
-              <label id="lbElSpeed" control="txfElSpeed"
-                     value="&blinkSpeed.label;"
-                     accesskey="&blinkSpeed.accesskey;"/>
-              <hbox align="center">
-                <textbox id="txfElSpeed" style="width: 4em"
-                         preference="inspector.blink.speed"/>
-                <label value="&ms.label;"/>
-              </hbox>
-            </row>
-          </rows>
-        </grid>
-        <vbox align="start">
-          <checkbox id="cbElInvert" label="&invertColors.label;"
-                    preference="inspector.blink.invert"
-                    accesskey="&invertColors.accesskey;"/>
-        </vbox>
-      </vbox>
-    </groupbox>
-
-    <groupbox id="tbxSidebar">
-      <caption label="&Sidebar.label;"/>
-      <vbox flex="1">
-        <vbox id="bxSidebarInstall" flex="1">
-          <hbox>
-            <description id="txSidebarMsg" flex="1">&installHowTo.label;</description>
-          </hbox>
-          <button id="btnSidebarInstall" label="&install.label;"
-                  oncommand="sidebarPref.installSidebar()"
-                  accesskey="&install.accesskey;"/>
-        </vbox>
-      </vbox>
-    </groupbox>
-
-    <!--
-    <vbox>
-      <checkbox id="cbxNavIntegration" label="&addNavigatorHooks.label;"
-                preference="inspector.hooks.navigator"
-                accesskey="&addNavigatorHooks.accesskey;"/>
-    </vbox>
-    -->
-
-  </prefpane>
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/prefs/pref-sidebar.js b/suite/extensions/inspector/resources/content/prefs/pref-sidebar.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/prefs/pref-sidebar.js
+++ /dev/null
@@ -1,136 +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/. */
-
-/***************************************************************
-* SidebarPrefs -------------------------------------------------
-*  The controller for the lovely sidebar prefs panel.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/rdf/RDFU.js
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var sidebarPref;
-
-//////////// global constants ////////////////////
-
-const kDirServiceCID       = "@mozilla.org/file/directory_service;1"
-const kNCURI               = "http://home.netscape.com/NC-rdf#";
-const kSidebarPanelId      = "UPnls"; // directory services property to find panels.rdf
-const kSidebarURNPanelList = "urn:sidebar:current-panel-list";
-const kSidebarURN3rdParty  = "urn:sidebar:3rdparty-panel";
-const kSidebarURL          = "chrome://inspector/content/sidebar.xul";
-
-//////////////////////////////////////////////////
-
-function SidebarPrefs_initialize()
-{
-  sidebarPref = new SidebarPrefs();
-  sidebarPref.initSidebarData();
-}
-
-///// class SidebarPrefs /////////////////////////
-
-function SidebarPrefs()
-{
-}
-
-SidebarPrefs.prototype = 
-{
-  
-  ///////////////////////////////////////////////////////////////////////////
-  // Because nsSidebar has been so mean to me, I'm going to re-write it's
-  // addPanel code right here so I don't have to fight with it.  Pbbbbt!
-  ///////////////////////////////////////////////////////////////////////////
-
-  initSidebarData: function()
-  {
-    var file = this.getDirectoryFile(kSidebarPanelId);
-    if (file)
-      RDFU.loadDataSource(file, gSidebarLoadListener);
-  },
-
-  initSidebarData2: function(aDS)
-  {
-    var res = aDS.GetTarget(gRDF.GetResource(kSidebarURNPanelList), gRDF.GetResource(kNCURI + "panel-list"), true);
-    this.mDS = aDS;
-    this.mPanelSeq = RDFU.makeSeq(aDS, res);
-    this.mPanelRes = gRDF.GetResource(kSidebarURN3rdParty + ":" + kSidebarURL);
-    
-    if (this.isSidebarInstalled()) {
-      document.getElementById("tbxSidebar").setAttribute("hidden", "true");      
-    }
-  },
-
-  isSidebarInstalled: function()
-  {
-    return this.mPanelSeq.IndexOf(this.mPanelRes) != -1;
-  },
-
-  installSidebar: function()
-  {
-    if (this.isSidebarInstalled()) {
-      return false;
-    }
-
-    var bundle = document.getElementById("inspector-bundle");
-    var kSidebarTitle = bundle.getString("sidebar.title");
-
-    this.mDS.Assert(this.mPanelRes, gRDF.GetResource(kNCURI + "title"), gRDF.GetLiteral(kSidebarTitle), true);
-    this.mDS.Assert(this.mPanelRes, gRDF.GetResource(kNCURI + "content"), gRDF.GetLiteral(kSidebarURL), true);
-    this.mPanelSeq.AppendElement(this.mPanelRes);
-    this.forceSidebarRefresh();
-
-    var msg = document.getElementById("txSidebarMsg");
-    msg.removeChild(msg.firstChild);
-
-    msg.appendChild(document.createTextNode(bundle.getString("sidebarInstalled"))); 
-    var btn = document.getElementById("btnSidebarInstall");
-    btn.setAttribute("disabled", "true");
-
-    return true;
-  },
-
-  forceSidebarRefresh: function()
-  {
-    var listRes = gRDF.GetResource(kSidebarURNPanelList);
-    var refreshRes = gRDF.GetResource(kNCURI + "refresh");
-    var trueRes = gRDF.GetLiteral("true");
-    this.mDS.Assert(listRes, refreshRes, trueRes, true);
-    this.mDS.Unassert(listRes, refreshRes, trueRes);
-  },
-
-  getDirectoryFile: function(aFileId)
-  {
-    try {
-      var dirService = XPCU.getService(kDirServiceCID, "nsIProperties");
-      var file = dirService.get(aFileId, Components.interfaces.nsIFile);
-      if (!file.exists())
-        return null;
-
-      var ioService = XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService");
-      var fileHandler = XPCU.QI(ioService.getProtocolHandler("file"), "nsIFileProtocolHandler");
-
-      return fileHandler.getURLSpecFromFile(file);
-
-    } catch (ex) {
-      return null;
-    }
-  }
-
-};
-
-var gSidebarLoadListener = {
-  onDataSourceReady: function(aDS) 
-  {
-    sidebarPref.initSidebarData2(aDS);
-  },
-
-  onError: function()
-  {
-  }
-};
-
diff --git a/suite/extensions/inspector/resources/content/prefs/prefsOverlay.xul b/suite/extensions/inspector/resources/content/prefs/prefsOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/prefs/prefsOverlay.xul
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/prefs.dtd">
-
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <treechildren id="advancedChildren">
-    <treeitem id="inspectorItem" label="&Inspector.label;"
-              prefpane="inspector_pane" helpTopic="advanced_pref_dom_inspector"
-              url="chrome://inspector/content/prefs/pref-inspector.xul"/>
-  </treechildren>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain.xpm b/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain.xpm
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain.xpm
+++ /dev/null
@@ -1,45 +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/. */
-
-/* XPM */
-static char * winInspectorMain_xpm[] = {
-"32 32 6 1",
-" 	c None",
-".	c #000000",
-"+	c #FFB300",
-"@	c #FF7500",
-"#	c #FF8C00",
-"$	c #FF0000",
-"................................",
-"................................",
-"..++++++++++++++++++++++++++++..",
-"..++++++++++++++++++++++++++++..",
-"..++++++++++........++++++++++..",
-"..++++++++++........++++++++++..",
-"..++++++....@@@@@@@@....++++++..",
-"..++++++....@@@@@@@@....++++++..",
-"..++++++..@@@@@@@@@@@@..++++++..",
-"..++++++..@@@@@@@@@@@@..++++++..",
-"..++++..@@@@@@@@@@@@@@@@..++++..",
-"..++++..@@@@@@@@@@@@@@@@..++++..",
-"..++++..@@@@@@@@@@@@@@@@..++++..",
-"..++++..@@@@@@@@@@@@@@@@..++++..",
-"..++++..@@@@@@@@@@@@##@@..++++..",
-"..++++..@@@@@@@@@@@@##@@..++++..",
-"..++++..@@@@@@@@@@@@##@@..++++..",
-"..++++..@@@@@@@@@@@@##@@..++++..",
-"..++++++..@@@@@@####$$..++++++..",
-"..++++++..@@@@@@####$$..++++++..",
-"..++++++....@@@@@@@@......++++..",
-"..++++++....@@@@@@@@......++++..",
-"..++++++++++........++......++..",
-"..++++++++++........++......++..",
-"..++++++++++++++++++++++........",
-"..++++++++++++++++++++++........",
-"..++++++++++++++++++++++++......",
-"..++++++++++++++++++++++++......",
-"..++++++++++++++++++++++++++....",
-"..++++++++++++++++++++++++++....",
-"................................",
-"................................"};
diff --git a/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain16.xpm b/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain16.xpm
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/res/Linux/winInspectorMain16.xpm
+++ /dev/null
@@ -1,29 +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/. */
-
-/* XPM */
-static char * winInspectorMain16_xpm[] = {
-"16 16 6 1",
-" 	c None",
-".	c #000000",
-"+	c #FFAD00",
-"@	c #FF6D00",
-"#	c #FF8500",
-"$	c #FF0000",
-"................",
-".++++++++++++++.",
-".+++++....+++++.",
-".+++..@@@@..+++.",
-".+++.@@@@@@.+++.",
-".++.@@@@@@@@.++.",
-".++.@@@@@@@@.++.",
-".++.@@@@@@#@.++.",
-".++.@@@@@@#@.++.",
-".+++.@@@##$.+++.",
-".+++..@@@@...++.",
-".+++++....+...+.",
-".+++++++++++....",
-".++++++++++++...",
-".+++++++++++++..",
-"................"};
diff --git a/suite/extensions/inspector/resources/content/res/WINNT/winInspectorMain.ico b/suite/extensions/inspector/resources/content/res/WINNT/winInspectorMain.ico
deleted file mode 100644
index 78efb3acf8b4d277c01999e3d611c354b1f20227..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/content/res/search-registry.rdf b/suite/extensions/inspector/resources/content/res/search-registry.rdf
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/res/search-registry.rdf
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<rdf:RDF  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
-          xmlns:ins="http://www.mozilla.org/inspector#">
-
-  <rdf:Seq about="inspector:search">
-    <rdf:li><rdf:Description 
-      ins:uid="findOrphanImages"
-      ins:description="Find Orphan Images"
-      ins:factory="SearchModule_findOrphanImages"/></rdf:li>
-
-  </rdf:Seq>
-
-</rdf:RDF>
\ No newline at end of file
diff --git a/suite/extensions/inspector/resources/content/res/viewer-registry.rdf b/suite/extensions/inspector/resources/content/res/viewer-registry.rdf
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/res/viewer-registry.rdf
+++ /dev/null
@@ -1,336 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE RDF SYSTEM "chrome://inspector/locale/viewer-registry.dtd">  
- 
-<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
-         xmlns:ins="http://www.mozilla.org/inspector#">
-
-<!-- Inspector-specific RDF attributes
-  xmlns:ins     Sets the ins: prefix to an Inspector-specific namespace URI.
-
-  ins:uid       Sets the basic viewer filename Inspector uses to find the viewer XUL file.
-                For example, ins:uid="dom" leads to chrome://inspector/content/viewers/dom/dom.xul
-                (ViewerRegistry.js#getEntryURL())
-
-  ins:panels    This determines which DOM Inspector panels, by id, the viewer referenced is valid for.
-                For example, ins:panels="bxObjectPanel bxObjPanel" means the panel id must be 
-                bxObjectPanel or bxObjPanel.
-
-  ins:description
-                This sets a title for the viewer.
-
-  ins:icon      This sets an icon for the viewer.  Currently unused.
-
-  ins:filter    This determines which nodes (or in the case of JavaScript Object
-                viewer, values), the viewer referenced is valid for.
-
-                @param object - nsIDOMNode object (or in the case of JavaScript
-                  Object viewer, JavaScript object).
-                @param linkedViewer - linked viewer object.
-
-                For example, ins:filter=
-                "return object instanceof Components.interfaces.nsIDOMDocument;"
-                is a JavaScript fragment ViewerRegistry.js uses to define a
-                filter function if the panel's subject node is an instance of
-                nsIDOMDocument.
--->
-
-  <rdf:Seq about="inspector:viewers">
-    <rdf:li><rdf:Description 
-      ins:uid="dom"
-      ins:panels="bxDocPanel"
-      ins:description="&dom.label;"
-      ins:icon="chrome://inspector/content/viewers/dom/dom-icon.gif"
-      ins:filter="return object instanceof Components.interfaces.nsIDOMDocument;"/>
-    </rdf:li>
-
-    <rdf:li><rdf:Description 
-      ins:uid="stylesheets"
-      ins:panels="bxDocPanel"
-      ins:description="&stylesheets.label;"
-      ins:filter="return object instanceof Components.interfaces.nsIDOMDocument;"/>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description
-        ins:uid="domNode"
-        ins:panels="bxObjectPanel bxObjPanel"
-        ins:description="&domNode.label;">
-        <ins:filter><![CDATA[
-          return object instanceof Components.interfaces.nsIDOMNode ||
-            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-            object instanceof Components.interfaces.nsIAccessible;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description
-        ins:uid="boxModel"
-        ins:panels="bxObjectPanel bxObjPanel"
-        ins:description="&boxModel.label;">
-        <ins:filter><![CDATA[
-          return object instanceof Components.interfaces.nsIDOMElement ||
-            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-            object instanceof Components.interfaces.nsIAccessible &&
-            object.DOMNode instanceof Components.interfaces.nsIDOMElement;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description 
-        ins:uid="xblBindings"
-        ins:panels="bxObjectPanel bxObjPanel"
-        ins:description="&xblBindings.label;">
-        <ins:filter><![CDATA[
-          var node =
-            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-            object instanceof Components.interfaces.nsIAccessible ?
-            object.DOMNode : object;
-
-          if (node instanceof Components.interfaces.nsIDOMElement) {
-            try {
-              var urls =
-                Components.classes["@mozilla.org/inspector/dom-utils;1"].
-                  getService(Components.interfaces["inIDOMUtils"]).
-                  getBindingURLs(node);
-              return urls && urls.length;
-            }
-            catch (e) { }
-          }
-          return false;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description
-        ins:uid="styleRules"
-        ins:panels="bxObjectPanel bxObjPanel"
-        ins:description="&styleRules.label;">
-      <ins:filter><![CDATA[
-        return object instanceof Components.interfaces.nsIDOMElement ||
-          object instanceof Components.interfaces.nsIDOMCSSStyleSheet ||
-          "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-          object instanceof Components.interfaces.nsIAccessible &&
-          object.DOMNode instanceof Components.interfaces.nsIDOMElement;
-      ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description
-        ins:uid="computedStyle"
-        ins:panels="bxObjectPanel bxObjPanel"
-        ins:description="&computedStyle.label;">
-        <ins:filter><![CDATA[
-          return object instanceof Components.interfaces.nsIDOMElement ||
-            "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-            object instanceof Components.interfaces.nsIAccessible &&
-            object.DOMNode instanceof Components.interfaces.nsIDOMElement;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li><rdf:Description 
-      ins:uid="usedFontFaces"
-      ins:panels="bxObjectPanel bxObjPanel"
-      ins:description="&usedFontFaces.label;">
-        <ins:filter><![CDATA[
-          // XXX getUsedFontFaces really works on a Range,
-          // but to avoid bug 166749 we permit any Node.
-          return (object instanceof Components.interfaces.nsIDOMNode ||
-                  "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-                  object instanceof Components.interfaces.nsIAccessible) &&
-            "getUsedFontFaces" in XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li><rdf:Description
-      ins:uid="jsObject"
-      ins:panels="bxDocPanel bxObjectPanel bxObjPanel"
-      ins:description="&jsObject.label;"
-      ins:filter="return true;"/>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleEvent"
-                       ins:panels="bxObjectPanel bxObjPanel"
-                       ins:description="&accessibleEvent.label;">
-        <ins:filter><![CDATA[
-          if (!linkedViewer || linkedViewer.uid != "accessibleEvents") {
-            return false;
-          }
-
-          const Ci = Components.interfaces;
-          if (object instanceof Ci.nsIDOMNode ||
-              ("@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-               object instanceof Ci.nsIAccessible)) {
-            return object;
-          }
-
-          return false;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleObject"
-                       ins:panels="bxObjectPanel bxObjPanel"
-                       ins:description="&accessibleObject.label;">
-        <ins:filter><![CDATA[
-          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
-              object instanceof Components.interfaces.nsIAccessible) {
-            return true;
-          }
-
-          if (!linkedViewer ||
-              !(object instanceof Components.interfaces.nsIDOMNode))
-            return false;
-
-          if (linkedViewer.uid != "accessibleEvents" &&
-              linkedViewer.uid != "accessibleTree" &&
-              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
-            return false;
-
-          try {
-            var accService =
-              Components.classes["@mozilla.org/accessibleRetrieval;1"]
-                        .getService(Components.interfaces.nsIAccessibleRetrieval);
-
-            if ("getAttachedAccessibleFor" in accService)
-              return accService.getAttachedAccessibleFor(object);
-            return accService.getAccessibleFor(object);
-          } catch(e) {
-            return false;
-          }
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleProps"
-                       ins:panels="bxObjectPanel bxObjPanel"
-                       ins:description="&accessibleProps.label;">
-        <ins:filter><![CDATA[
-          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
-              object instanceof Components.interfaces.nsIAccessible) {
-            return true;
-          }
-
-          if (!linkedViewer ||
-              !(object instanceof Components.interfaces.nsIDOMNode))
-            return false;
-
-          if (linkedViewer.uid != "accessibleEvents" &&
-              linkedViewer.uid != "accessibleTree" &&
-              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
-            return false;
-
-          try {
-            var accService =
-              Components.classes["@mozilla.org/accessibleRetrieval;1"]
-                        .getService(Components.interfaces.nsIAccessibleRetrieval);
-
-            if ("getAttachedAccessibleFor" in accService)
-              return accService.getAttachedAccessibleFor(object);
-            return accService.getAccessibleFor(object);
-          } catch(e) {
-            return false;
-          }
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleRelations"
-                       ins:panels="bxObjectPanel bxObjPanel"
-                       ins:description="&accessibleRelations.label;">
-        <ins:filter><![CDATA[
-          if (("@mozilla.org/accessibleRetrieval;1" in Components.classes) &&
-              object instanceof Components.interfaces.nsIAccessible) {
-            return true;
-          }
-
-          if (!linkedViewer ||
-              !(object instanceof Components.interfaces.nsIDOMNode))
-            return false;
-
-          if (linkedViewer.uid != "accessibleEvents" &&
-              linkedViewer.uid != "accessibleTree" &&
-              (linkedViewer.uid != "dom" || !linkedViewer.getAccessibleNodes()))
-            return false;
-
-          try {
-            var accService =
-              Components.classes["@mozilla.org/accessibleRetrieval;1"]
-                        .getService(Components.interfaces.nsIAccessibleRetrieval);
-
-            if ("getAttachedAccessibleFor" in accService)
-              return accService.getAttachedAccessibleFor(object);
-            return accService.getAccessibleFor(object);
-          } catch(e) {
-            return false;
-          }
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleEvents"
-                       ins:panels="bxDocPanel"
-                       ins:description="&accessibleEvents.label;">
-        <ins:filter><![CDATA[
-          if (!("@mozilla.org/accessibleRetrieval;1" in Components.classes)) {
-            return false;
-          }
-
-          // Allow for DOM document and application accessible (compatible
-          // with Gecko 2.0 and 1.9.2).
-          const Ci = Components.interfaces;
-          if (object instanceof Ci.nsIDOMDocument) {
-            return true;
-          }
-
-          if ("nsIAccessibleApplication" in Ci) {
-            return object instanceof Ci.nsIAccessibleApplication;
-          }
-
-          return object instanceof Ci.nsIAccessible && !object.parent;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-
-    <rdf:li>
-      <rdf:Description ins:uid="accessibleTree"
-                       ins:panels="bxDocPanel"
-                       ins:description="&accessibleTree.label;">
-        <ins:filter><![CDATA[
-          if (!("@mozilla.org/accessibleRetrieval;1" in Components.classes)) {
-            return false;
-          }
-
-          // Allow for DOM document and application accessible (compatible
-          // with Gecko 2.0 and 1.9.2).
-          const Ci = Components.interfaces;
-          if (object instanceof Ci.nsIDOMDocument) {
-            return true;
-          }
-
-          if ("nsIAccessibleApplication" in Ci) {
-            return object instanceof Ci.nsIAccessibleApplication;
-          }
-
-          return object instanceof Ci.nsIAccessible && !object.parent;
-        ]]></ins:filter>
-      </rdf:Description>
-    </rdf:li>
-  </rdf:Seq>
-
-</rdf:RDF>
diff --git a/suite/extensions/inspector/resources/content/sidebar.js b/suite/extensions/inspector/resources/content/sidebar.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/sidebar.js
+++ /dev/null
@@ -1,117 +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/. */
-
-/*****************************************************************************
-* InspectorSidebar -----------------------------------------------------------
-*   The primary object that controls the Inspector sidebar.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var inspector;
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kObserverServiceContractID  = "@mozilla.org/observer-service;1";
-
-const gNavigator = window.content;
-
-//////////////////////////////////////////////////////////////////////////////
-
-function InspectorSidebar_initialize()
-{
-  inspector = new InspectorSidebar();
-  inspector.initialize();
-}
-
-window.addEventListener("load", InspectorSidebar_initialize, false);
-
-//////////////////////////////////////////////////////////////////////////////
-//// class InspectorSidebar
-
-function InspectorSidebar()
-{
-}
-
-InspectorSidebar.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  get document()
-  {
-    return this.mDocPanel.viewer.subject;
-  },
-
-  initialize: function IS_Initialize()
-  {
-    this.installNavObserver();
-
-    this.mPanelSet = document.getElementById("bxPanelSet");
-    this.mPanelSet.addObserver("panelsetready", this, false);
-    this.mPanelSet.initialize();
-  },
-
-  destroy: function IS_Destroy()
-  {
-  },
-
-  doViewerCommand: function IS_DoViewerCommand(aCommand)
-  {
-    this.mPanelSet.execCommand(aCommand);
-  },
-
-  getViewer: function IS_GetViewer(aUID)
-  {
-    return this.mPanelSet.registry.getViewerByUID(aUID);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Viewer Panels
-
-  initViewerPanels: function IS_InitViewerPanels()
-  {
-    this.mDocPanel = this.mPanelSet.getPanel(0);
-    this.mDocPanel.addObserver("subjectChange", this, false);
-    this.mObjectPanel = this.mPanelSet.getPanel(1);
-  },
-
-  onEvent: function IS_OnEvent(aEvent)
-  {
-    if (aEvent.type == "panelsetready") {
-      this.initViewerPanels();
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Navigation
-
-  setTargetWindow: function IS_SetTargetWindow(aWindow)
-  {
-    this.setTargetDocument(aWindow.document);
-  },
-
-  setTargetDocument: function IS_SetTargetDocument(aDoc)
-  {
-    this.mPanelSet.getPanel(0).subject = aDoc;
-  },
-
-  installNavObserver: function IS_InstallNavObserver()
-  {
-    var observerService = XPCU.getService(kObserverServiceContractID,
-                                          "nsIObserverService");
-    observerService.addObserver(NavLoadObserver, "EndDocumentLoad", false);
-  }
-};
-
-var NavLoadObserver = {
-  observe: function NLO_Observe(aWindow)
-  {
-    inspector.setTargetWindow(aWindow);
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/sidebar.xul b/suite/extensions/inspector/resources/content/sidebar.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/sidebar.xul
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE window [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<?xul-overlay href="chrome://inspector/content/commandOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/keysetOverlay.xul"?>
-<?xul-overlay href="chrome://inspector/content/popupOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/sidebar.css"?>
-
-<window id="winInspectorMain" class="color-dialog"
-        title="&Inspector.title;"
-        width="400" height="700"
-        persist="screenX screenY width height sizemode"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/sidebar.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/Flasher.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/ViewerRegistry.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/rdf/RDFArray.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/FrameExchange.js"/>
-
-  <commandset id="cmdsGlobalCommands"/>
-  <keyset id="ksGlobalKeyset"/>
-  <popupset id="ppsViewerPopupset"/>
-
-  <domi-panelset id="bxPanelSet" flex="1" viewercommandset="cmdsGlobalCommands">
-    <tabbox flex="1" orient="vertical">
-      <tabs>
-        <tab label="&bxDocPanel.title;"/>
-        <tab label="&bxObjectPanel.title;"/>
-      </tabs>
-      <tabpanels flex="1">
-        <domi-panel id="bxDocPanel" title="&bxDocPanel.title;"/>
-        <domi-panel id="bxObjPanel" title="&bxObjectPanel.title;"
-                    linkedpanel="bxDocPanel"/>
-      </tabpanels>
-    </tabbox>
-  </domi-panelset>
-</window>
diff --git a/suite/extensions/inspector/resources/content/statusbarOverlay.xul b/suite/extensions/inspector/resources/content/statusbarOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/statusbarOverlay.xul
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0"?> 
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<overlay id="ovStatusbar"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <statusbar id="status-bar">
-    <statusbarpanel id="txStatusPanel" flex="1"/>
-    <statusbarpanel class="statusbarpanel-progress">
-      <progressmeter id="pmStatus" mode="normal" value="0" class="progressmeter-statusbar"/>
-    </statusbarpanel>
-  </statusbar>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/tasksOverlay.xul b/suite/extensions/inspector/resources/content/tasksOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/tasksOverlay.xul
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/tasksOverlay.dtd" >
-
-<overlay id="eInspectorTasksOverlay"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-
-  <commandset id="tasksCommands">
-    <command id="Tasks:Inspector" oncommand="inspectDOMDocument();"/>
-    <command id="Tasks:InspectPage"
-             oncommand="inspectDOMDocument(content ? content.document : document);"/>
-  </commandset>
-
-  <keyset id="tasksKeys">
-    <key id="key_inspectPage"
-         key="&inspectorTaskCmd.commandkey;"
-         modifiers="accel,alt"
-         command="Tasks:InspectPage"/>
-  </keyset>
-
-  <menupopup id="toolsPopup">
-    <menuitem id="menu_inspector" label="&inspectorTaskCmd.label;"
-              key="key_inspectPage" accesskey="&inspectorTaskCmd.accesskey;"
-              command="Tasks:Inspector"/>
-  </menupopup>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/tests/allskin.xul b/suite/extensions/inspector/resources/content/tests/allskin.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/tests/allskin.xul
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0"?>
-
-<?xml-stylesheet href="chrome://communicator/skin/box.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/brand.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/button.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/communicator.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/menubutton.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/prefpanels.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/securityOverlay.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/splitter.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/tasksOverlay.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/toolbar.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/bookmarks/bookmarks.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/directory/directory.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/profile/profile.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/profile/profileManager.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/regviewer/regviewer.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/related/related.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/findresults.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/icons.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/internet.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/internetresults.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/search-editor.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/search/search.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/sidebar/customize.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/sidebar/preview.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/sidebar/sidebar.css"?>
-<?xml-stylesheet href="chrome://communicator/skin/xpinstall/xpinstall.css"?>
-<?xml-stylesheet href="chrome://editor/skin/EdImageMap.css"?>
-<?xml-stylesheet href="chrome://editor/skin/EdImageMapPage.css"?>
-<?xml-stylesheet href="chrome://editor/skin/editor.css"?>
-<?xml-stylesheet href="chrome://editor/skin/EditorDialog.css"?>
-<?xml-stylesheet href="chrome://editor/skin/EditorToolbars.css"?>
-<?xml-stylesheet href="chrome://global/skin/box.css"?>
-<?xml-stylesheet href="chrome://global/skin/button.css"?>
-<?xml-stylesheet href="chrome://global/skin/checkbox.css"?>
-<?xml-stylesheet href="chrome://global/skin/colorpicker.css"?>
-<?xml-stylesheet href="chrome://global/skin/commonDialog.css"?>
-<?xml-stylesheet href="chrome://global/skin/console.css"?>
-<?xml-stylesheet href="chrome://global/skin/filepicker.css"?>
-<?xml-stylesheet href="chrome://global/skin/formatting.css"?>
-<?xml-stylesheet href="chrome://global/skin/global.css"?>
-<?xml-stylesheet href="chrome://global/skin/menu.css"?>
-<?xml-stylesheet href="chrome://global/skin/menubutton.css"?>
-<?xml-stylesheet href="chrome://global/skin/menulist.css"?>
-<?xml-stylesheet href="chrome://global/skin/radio.css"?>
-<?xml-stylesheet href="chrome://global/skin/scrollbars.css"?>
-<?xml-stylesheet href="chrome://global/skin/splitter.css"?>
-<?xml-stylesheet href="chrome://global/skin/tabcontrol.css"?>
-<?xml-stylesheet href="chrome://global/skin/tasksOverlay.css"?>
-<?xml-stylesheet href="chrome://global/skin/textfield.css"?>
-<?xml-stylesheet href="chrome://global/skin/toolbar.css"?>
-<?xml-stylesheet href="chrome://global/skin/tree.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/AccountManager.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/fieldMapImport.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/folderPane.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/importDialog.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/mailheader.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/messenger.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/msgHdrViewOverlay.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/pref-mailnews.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/subscribe.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/threadPane.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/wizard.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/addressbook/addressbook.css"?>
-<?xml-stylesheet href="chrome://messenger/skin/messengercompose/messengercompose.css"?>
-<?xml-stylesheet href="chrome://navigator/skin/navigator.css"?>
-<?xml-stylesheet href="chrome://navigator/skin/NavSecurityOverlay.css"?>
-
-<window orient="vertical"
-  xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <label value="All skin css files are now loaded."/>
-
-</window>
-
-        
diff --git a/suite/extensions/inspector/resources/content/toolboxOverlay.xul b/suite/extensions/inspector/resources/content/toolboxOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/toolboxOverlay.xul
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-]>
-
-<overlay id="ovToolbox"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <popupset id="ppsGlobalPopupset"/>
-
-  <menubar id="mbrInspectorMain">
-
-    <menu id="mnFile" label="&mnFile.label;" accesskey="&mnFile.accesskey;">
-      <menupopup id="menu_FilePopup"/>
-    </menu>
-
-    <menu id="mnEdit" label="&mnEdit.label;" accesskey="&mnEdit.accesskey;">
-      <menupopup id="mppEdit"/>
-    </menu>
-
-    <menu id="mnView" label="&mnView.label;" accesskey="&mnView.accesskey;">
-      <menupopup id="mppView"/>
-    </menu>
-
-    <menu id="tasksMenu"/> <!-- SeaMonkey -->
-    <menu id="windowMenu"/> <!-- Firefox-mac, SeaMonkey -->
-    <menupopup id="menu_ToolsPopup"/> <!-- Mac magic -->
-    <menu id="menu_Help"/> <!-- SeaMonkey -->
-    <menu id="helpMenu"/>  <!-- Firefox -->
-
-  </menubar>
-
-  <toolbar id="tbInspectorPrimary" class="chromeclass-toolbar">
-
-    <hbox id="bxURLBar" flex="1">
-      <toolbarbutton id="btnSelecting" type="checkbox"
-                     observes="cmd:selectByClick"
-                     tooltiptext="&btnSelecting.tooltip;"/>
-
-      <toolbarbutton id="btnFind" observes="cmd:find"
-                     tooltiptext="&btnFind.tooltip;"/>
-
-      <hbox id="bxURLBarContainer" flex="1">
-        <hbox align="center" flex="1">
-          <!-- request both autocomplete implementations for compatibility -->
-          <textbox id="tfURLBar" type="autocomplete" flex="1"
-            searchSessions="history" timeout="50" maxrows="6" class="padded"
-            placeholder="&cmdEnterLocation.label;"
-            autocompletesearch="history file" observes="cmdGotoURL">
-            <image id="imgURLBarIcon" class="bookmark-item"/>
-          </textbox>
-        </hbox>
-
-      </hbox>
-
-      <toolbarbutton label="&btnInspect.label;"
-                     accesskey="&btnInspect.accesskey;"
-                     observes="cmdGotoURL"/>
-    </hbox>
-
-  </toolbar>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/utils.js b/suite/extensions/inspector/resources/content/utils.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/utils.js
+++ /dev/null
@@ -1,194 +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/. */
-
-/*****************************************************************************
-* Inspector Utils ------------------------------------------------------------
-*  Common functions and constants used across the app.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-* chrome://inspector/content/jsutil/xpcom/XPCU.js
-* chrome://inspector/content/jsutil/rdf/RDFU.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kInspectorNSURI = "http://www.mozilla.org/inspector#";
-const kXULNSURI = "http://www.mozilla.org/keymaster/gatekeeper/" +
-                  "there.is.only.xul";
-const kHTMLNSURI = "http://www.w3.org/1999/xhtml";
-const kCharTable = {
-  '&': "&amp;",
-  '<': "&lt;",
-  '>': "&gt;",
-  '"': "&quot;"
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var gEntityConverter;
-
-var InsUtil = {
-  /***************************************************************************
-  * Convenience function for calling nsIChromeRegistry::convertChromeURL
-  ***************************************************************************/
-  convertChromeURL: function IU_ConvertChromeURL(aURL)
-  {
-    var uri =
-      XPCU.getService("@mozilla.org/network/io-service;1", "nsIIOService")
-        .newURI(aURL, null, null);
-    var reg = XPCU.getService("@mozilla.org/chrome/chrome-registry;1",
-                              "nsIChromeRegistry");
-
-    return reg.convertChromeURL(uri);
-  },
-
-  /***************************************************************************
-  * Convenience function for getting a literal value from
-  * nsIRDFDataSource::GetTarget
-  * @param aDS
-  *        nsISupports
-  * @param aId
-  *        string
-  * @param aPropName
-  *        string
-  ***************************************************************************/
-  getDSProperty: function IU_GetDSProperty(aDS, aId, aPropName)
-  {
-    var ruleRes = gRDF.GetResource(aId);
-    var ds = XPCU.QI(aDS, "nsIRDFDataSource"); // just to be sure
-    var propRes = ds.GetTarget(ruleRes,
-                               gRDF.GetResource(kInspectorNSURI + aPropName),
-                               true);
-    propRes = XPCU.QI(propRes, "nsIRDFLiteral");
-
-    return propRes.Value;
-  },
-
-  /***************************************************************************
-  * Convenience function for persisting an element's persisted attributes.
-  ***************************************************************************/
-  persistAll: function IU_PersistAll(aId)
-  {
-    var el = document.getElementById(aId);
-    if (el) {
-      var attrs = el.getAttribute("persist").split(" ");
-      for (var i = 0; i < attrs.length; ++i) {
-        document.persist(aId, attrs[i]);
-      }
-    }
-  },
-
-  /***************************************************************************
-  * Convenience function for escaping HTML strings.
-  ***************************************************************************/
-  unicodeToEntity: function IU_UnicodeToEntity(text)
-  {
-    const entityVersion = Components.interfaces.nsIEntityConverter.entityW3C;
-
-    function charTableLookup(letter)
-    {
-      return kCharTable[letter];
-    }
-
-    function convertEntity(letter)
-    {
-      try {
-        return gEntityConverter.ConvertToEntity(letter, entityVersion);
-      }
-      catch (ex) {
-        return letter;
-      }
-    }
-
-    if (!gEntityConverter) {
-      try {
-        gEntityConverter =
-          XPCU.createInstance("@mozilla.org/intl/entityconverter;1",
-                              "nsIEntityConverter");
-      }
-      catch (ex) { }
-    }
-
-    // replace chars in our charTable
-    text = text.replace(/[<>&"]/g, charTableLookup);
-
-    // replace chars > 0x7f via nsIEntityConverter
-    text = text.replace(/[^\0-\u007f]/g, convertEntity);
-
-    return text;
-  },
-
-  /**
-   * Determine which from a list of indexes is nearest to the given index.
-   * @param aIndex
-   *        The index to search for.
-   * @param aIndexList
-   *        A sorted list of indexes to be searched.
-   * @return The index in the list closest to aIndex.  This will be aIndex
-   *         itself if it appears in the list, or -1 if the list is empty.
-   * @note
-   */
-  getNearestIndex: function IU_GetNearestIndex(aIndex, aIndexList)
-  {
-    // Four easy cases:
-    //  - empty list
-    //  - single element list
-    //  - given index comes before the first element
-    //  - given index comes after the last element
-    if (aIndexList.length == 0) {
-      return -1;
-    }
-    var first = aIndexList[0];
-    if (aIndexList.length == 1 || aIndex <= first) {
-      return first;
-    }
-    var high = aIndexList.length - 1;
-    var last = aIndexList[high];
-    if (aIndex >= last) {
-      return last;
-    }
-  
-    var mid, low = 0;
-    while (low <= high) {
-      mid = low + Math.floor((high - low) / 2);
-      let current = aIndexList[mid];
-      if (aIndex > current) {
-        low = mid + 1;
-      }
-      else if (aIndex < current) {
-        high = mid - 1;
-      }
-      else {
-        return aIndex;
-      }
-    }
-  
-    // By handling the four easy cases above, we eliminated the possibility
-    // that low or high will be out of bounds at this point.  If aIndex had
-    // been present, it would have been sandwiched between these two values:
-    var previous = aIndexList[high];
-    var next = aIndexList[low];
-  
-    if ((aIndex - previous) < (next - aIndex)) {
-      return previous;
-    }
-    // Even if previous and next are equidistant to aIndex's position, we'll
-    // go with the one that's greater.
-    return next;
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Debugging Utilities
-
-// dump text to the Error Console
-function debug(aText)
-{
-  // XX comment out to reduce noise
-  var cs =
-    XPCU.getService("@mozilla.org/consoleservice;1", "nsIConsoleService");
-  cs.logStringMessage(aText);
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.js b/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.js
+++ /dev/null
@@ -1,255 +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/. */
- 
- 
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
-
-const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
-const nsIAccessibleStateChangeEvent =
-  Components.interfaces.nsIAccessibleStateChangeEvent;
-const nsIAccessibleTextChangeEvent =
-  Components.interfaces.nsIAccessibleTextChangeEvent;
-const nsIAccessibleCaretMoveEvent =
-  Components.interfaces.nsIAccessibleCaretMoveEvent;
-
-const nsIDOMNode = Components.interfaces.nsIDOMNode;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization/Destruction
-
-window.addEventListener("load", AccessibleEventViewer_initialize, false);
-
-function AccessibleEventViewer_initialize()
-{
-  viewer = new AccessibleEventViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class AccessibleEventViewer
-function AccessibleEventViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                     nsIAccessibleRetrieval);
-}
-
-AccessibleEventViewer.prototype =
-{
-  mSubject: null,
-  mPane: null,
-  mAccEventSubject: null,
-  mAccService: null,
-
-  get uid() { return "accessibleEvent"; },
-  get pane() { return this.mPane; },
-
-  get subject() { return this.mSubject; },
-  set subject(aObject)
-  {
-    this.mSubject = aObject;
-    this.updateView();
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-  },
-
-  initialize: function initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  isCommandEnabled: function isCommandEnabled(aCommand)
-  {
-    return false;
-  },
-
-  getCommand: function getCommand(aCommand)
-  {
-    return null;
-  },
-
-  destroy: function destroy() {},
-
-  // event dispatching
-
-  addObserver: function addObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-  removeObserver: function removeObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  // private
-  updateView: function updateView()
-  {
-    this.clearView();
-
-    if (!this.pane.params) {
-      return;
-    }
-
-    this.mAccEventSubject = this.pane.params.accessibleEvent;
-    if (!this.mAccEventSubject)
-      return;
-
-    XPCU.QI(this.mAccEventSubject, nsIAccessibleEvent);
-
-    // Update accessible event properties.
-    var shownPropsId = "";
-    if (this.mAccEventSubject instanceof nsIAccessibleStateChangeEvent)
-      shownPropsId = "stateChangeEvent";
-    else if (this.mAccEventSubject instanceof nsIAccessibleTextChangeEvent)
-      shownPropsId = "textChangeEvent";
-    else if (this.mAccEventSubject instanceof nsIAccessibleCaretMoveEvent)
-      shownPropsId = "caretMoveEvent";
-
-    var props = document.getElementsByAttribute("prop", "*");
-    for (var i = 0; i < props.length; i++) {
-      var propElm = props[i];
-      var isActive = !propElm.hasAttribute("class") ||
-                     (propElm.getAttribute("class") == shownPropsId);
-
-      if (isActive) {
-        var prop = propElm.getAttribute("prop");
-        propElm.textContent = this[prop];
-        propElm.parentNode.removeAttribute("hidden");
-      } else {
-        propElm.parentNode.setAttribute("hidden", "true");
-      }
-    }
-
-    // Update handler output.
-    var outputElm = document.getElementById("handlerOutput");
-    var outputList = this.pane.params.accessibleEventHandlerOutput;
-    if (outputList) {
-      while (outputElm.firstChild) {
-        outputElm.removeChild(outputElm.lastChild);
-      }
-
-      for (let i = 0; i < outputList.length; i++) {
-        var output = outputList[i];
-
-        // Generate a tree.
-        if (typeof output == "object" && "cols" in output && "view" in output) {
-          var tree = document.createElement("tree");
-          tree.setAttribute("flex", "1");
-          tree.setAttribute("treelines", "true");
-
-          var treecols = document.createElement("treecols");
-          for (let col in output.cols) {
-            var treecol = document.createElement("treecol");
-            treecol.setAttribute("id", col);
-            treecol.setAttribute("label", output.cols[col].name);
-            treecol.setAttribute("flex", output.cols[col].flex);
-            if (output.cols[col].isPrimary) {
-              treecol.setAttribute("primary", "true");
-            }
-            treecol.setAttribute("persist", "width,hidden,ordinal");
-            treecols.appendChild(treecol);
-
-            var splitter = document.createElement("splitter");
-            splitter.setAttribute("class", "tree-splitter");
-            treecols.appendChild(splitter);
-          }
-          tree.appendChild(treecols);
-
-          var treechildren = document.createElement("treechildren");
-          tree.appendChild(treechildren);
-          outputElm.appendChild(tree);
-          tree.treeBoxObject.view = output.view;
-
-        }
-        else {
-          // Output text.
-          var node = document.createElement("description");
-          node.textContent = output;
-          outputElm.appendChild(node);
-        }
-      }
-
-      outputElm.parentNode.removeAttribute("hidden");
-    }
-    else {
-      outputElm.parentNode.setAttribute("hidden", "true");
-    }
-  },
-
-  clearView: function clearView()
-  {
-    var containers = document.getElementsByAttribute("prop", "*");
-    for (var i = 0; i < containers.length; ++i)
-      containers[i].textContent = "";
-  },
-
-  get isFromUserInput()
-  {
-    return this.mAccEventSubject.isFromUserInput;
-  },
-
-  get state()
-  {
-    var state = 0, extraState = 0;
-    var isExtraState = typeof this.mAccEventSubject.isExtraState == "function" ?
-      this.mAccEventSubject.isExtraState() : this.mAccEventSubject.isExtraState;
-    if (isExtraState) {
-      extraState = this.mAccEventSubject.state;
-    }
-    else {
-      state = this.mAccEventSubject.state;
-    }
-
-    var states = this.mAccService.getStringStates(state, extraState);
-
-    var list = [];
-    for (var i = 0; i < states.length; i++)
-      list.push(states.item(i));
-    return list.join();
-  },
-
-  get isEnabled()
-  {
-    return typeof this.mAccEventSubject.isEnabled == "function" ?
-      this.mAccEventSubject.isEnabled() : this.mAccEventSubject.isEnabled;
-  },
-
-  get startOffset()
-  {
-    return this.mAccEventSubject.start;
-  },
-
-  get length()
-  {
-    return this.mAccEventSubject.length;
-  },
-
-  get isInserted()
-  {
-    return typeof this.mAccEventSubject.isInserted == "function" ?
-      this.mAccEventSubject.isInserted() : this.mAccEventSubject.isInserted;
-  },
-
-  get modifiedText()
-  {
-    return this.mAccEventSubject.modifiedText;
-  },
-
-  get caretOffset()
-  {
-    return this.mAccEventSubject.caretOffset;
-  }
-};
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.xul b/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleEvent/accessibleEvent.xul
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleEvent.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet
-    href="chrome://inspector/skin/viewers/accessibleEvent/accessibleEvent.css"?>
-
-<page id="winAccessibleEvent"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleEvent/accessibleEvent.js"/>
-
-  <grid>
-    <columns>
-      <column/>
-      <column flex="1"/>
-    </columns>
-    <rows>
-      <row>
-        <description>&descIsFromUserInput.label;</description>
-        <description prop="isFromUserInput"/>
-      </row>
-      <row>
-        <description>&descState.label;</description>
-        <description prop="state" class="stateChangeEvent"/>
-      </row>
-      <row>
-        <description>&descIsEnabled.label;</description>
-        <description prop="isEnabled" class="stateChangeEvent"/>
-      </row>
-      <row>
-        <description>&descStartOffset.label;</description>
-        <description prop="startOffset" class="textChangeEvent"/>
-      </row>
-      <row>
-        <description>&descLength.label;</description>
-        <description prop="length" class="textChangeEvent"/>
-      </row>
-      <row>
-        <description>&descIsInserted.label;</description>
-        <description prop="isInserted" class="textChangeEvent"/>
-      </row>
-      <row>
-        <description>&descModifiedText.label;</description>
-        <description prop="modifiedText" class="textChangeEvent"/>
-      </row>
-      <row>
-        <description>&descCaretOffset.label;</description>
-        <description prop="caretOffset" class="caretMoveEvent"/>
-      </row>
-    </rows>
-  </grid>
-  <vbox flex="1">
-    <description>&descrHandlerOutput.label;</description>
-    <vbox id="handlerOutput" flex="1"/>
-  </vbox>
-</page>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.js b/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.js
+++ /dev/null
@@ -1,1194 +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/. */
-
-/***************************************************************
-* AccessibleEventsViewer --------------------------------------------
-*  The viewer for the accessible events occured on a document accessible.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-****************************************************************/
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var gBundle;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kObserverServiceCID = "@mozilla.org/observer-service;1";
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const Ci = Components.interfaces;
-const nsIObserverService = Ci.nsIObserverService;
-const nsIAccessibleRetrieval = Ci.nsIAccessibleRetrieval;
-const nsIAccessibleEvent = Ci.nsIAccessibleEvent;
-const nsIAccessible = Ci.nsIAccessible;
-const nsIPropertyElement = Ci.nsIPropertyElement;
-
-const gAccInterfaces =
-[
-  Ci.nsIAccessible,
-  Ci.nsIAccessibleDocument,
-  Ci.nsIAccessibleEditableText,
-  Ci.nsIAccessibleHyperLink,
-  Ci.nsIAccessibleHyperText,
-  Ci.nsIAccessibleImage,
-  Ci.nsIAccessibleSelectable,
-  Ci.nsIAccessibleTable,
-  Ci.nsIAccessibleTableCell,
-  Ci.nsIAccessibleText,
-  Ci.nsIAccessibleValue
-];
-
-if ("nsIAccessNode" in Ci)
-  gAccInterfaces.push(Ci.nsIAccessNode);
-
-/**
- * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
- * prior to Gecko13.
- */
-function QIAccessNode(aAccessible)
-{
-  return "nsIAccessNode" in Ci ?
-    XPCU.QI(aAccessible, Ci.nsIAccessNode) : aAccessible;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization
-
-window.addEventListener("load", AccessibleEventsViewer_initialize, false);
-
-function AccessibleEventsViewer_initialize()
-{
-  gBundle = document.getElementById("accessiblePropsBundle");
-
-  viewer = new AccessibleEventsViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class AccessibleEventsViewer
-
-function AccessibleEventsViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-
-  this.mTree = document.getElementById("olAccessibleEvents");
-  this.mOlBox = this.mTree.treeBoxObject;
-
-  this.mWatchTree = document.getElementById("watchEventList");
-  this.mWatchBox = this.mWatchTree.treeBoxObject;
-}
-
-AccessibleEventsViewer.prototype =
-{
-  // initialization
-
-  mSubject: null,
-  mPane: null,
-  mView: null,
-
-  // interface inIViewer
-
-  get uid() { return "accessibleEvents"; },
-  get pane() { return this.mPane; },
-  get selection() { return this.mSelection; },
-
-  get subject() { return this.mSubject; },
-  set subject(aObject)
-  {
-    this.mWatchView = new WatchAccessibleEventsListView();
-
-    if (this.mView) {
-      this.mView.destroy();
-    }
-    this.mView = new AccessibleEventsView(aObject, this.mWatchView);
-
-    this.mOlBox.view = this.mView;
-    this.mWatchBox.view = this.mWatchView;
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-  },
-
-  initialize: function initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function destroy()
-  {
-    this.mView.destroy();
-    this.mOlBox.view = null;
-    this.mWatchBox.view = null;
-  },
-
-  isCommandEnabled: function isCommandEnabled(aCommand)
-  {
-    return false;
-  },
-
-  getCommand: function getCommand(aCommand)
-  {
-    return null;
-  },
-
-  // event dispatching
-
-  addObserver: function addObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-  removeObserver: function removeObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  // utils
-
-  onItemSelected: function onItemSelected()
-  {
-    var idx = this.mTree.currentIndex;
-    var object = this.mView.getObject(idx);
-
-    // Set subject for right panel view.
-    this.mSelection = object.accessnode;
-
-    // Set parameters for right panel view.
-    if (this.pane.panelset.panelCount > 1) {
-      this.pane.panelset.getPanel(1).params = {
-        accessibleEvent: object.event,
-        accessibleEventHandlerOutput: object.eventHandlerOutput
-      };
-    }
-
-    this.mObsMan.dispatchEvent("selectionChange",
-                               { selection: this.mSelection } );
-  },
-
-  onWatchViewItemSelected: function onWatchViewItemSelected()
-  {
-    this.mWatchView.updateHandlerEditor();
-    this.mWatchView.updateHandlerState();
-  },
-
-  onWatchViewHandlerStateChanged:
-    function onWatchViewHandlerStateChanged(aState)
-  {
-    this.mWatchView.updateHandlerState(aState);
-  },
-
-  onWatchViewKeyPressed: function onWatchViewKeyPressed(aEvent)
-  {
-    // SPACE key was pressed. Toggle the row's Watched column tick.
-    if (aEvent.charCode == KeyEvent.DOM_VK_SPACE)
-      this.mWatchView.toggleEventWatched();
-  },
-
-  /**
-   * Clear the list of handled events.
-   */
-  clearEventsList: function clearEventsList()
-  {
-    this.mView.clear();
-  },
-
-  /**
-   * Start or stop to watch all events.
-   *
-   * @param  aDoWatch  [in] indicates whether to start or stop events watching.
-   */
-  watchAllEvents: function watchAllEvents(aDoWatch)
-  {
-    this.mWatchView.watchAllEvents(aDoWatch);
-  },
-
-  /**
-   * Shows context help for event handler editor.
-   */
-  showWatchViewHandlerHelp: function showWatchViewHandlerHelp()
-  {
-    openDialog("chrome://inspector/content/viewers/accessibleEvents/handlerHelpDialog.xul",
-               "_blank", "chrome,modal,centerscreen");
-  },
-
-  /**
-   * Open/hide handler editor.
-   */
-  toggleHandlerEditor: function toggleHandlerEditor(aSplitter)
-  {
-    var state = aSplitter.getAttribute("state");
-    if (state == "collapsed") {
-      aSplitter.setAttribute("state", "open");
-    }
-    else {
-      aSplitter.setAttribute("state", "collapsed");
-    }
-  }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleEventsView
-
-function AccessibleEventsView(aObject, aWatchView)
-{
-  this.mWatchView = aWatchView;
-  this.mEvents = [];
-  this.mRowCount = 0;
-
-  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                     nsIAccessibleRetrieval);
-
-  this.mAccessible = aObject instanceof nsIAccessible ?
-    aObject : this.mAccService.getAccessibleFor(aObject);
-
-  this.canSkipTreeTraversal = false;
-  this.mDOMIRootDocumentAccessible = null;
-  var acc = QIAccessNode(this.mAccService.getAccessibleFor(document));
-  if ("rootDocument" in acc) {
-    this.mDOMIRootDocumentAccessible = acc.rootDocument;
-    this.mApplicationAccessible = this.mDOMIRootDocumentAccessible.parent;
-
-    // We can skip accessible tree traversal for perf on Gecko 2.0 if the
-    // inspected accessible is application accessible.
-    this.canSkipTreeTraversal =
-      (this.mAccessible == this.mApplicationAccessible);
-  }
-  else {
-    // Gecko 1.9.2 compatibility.
-    while (acc.parent) {
-      this.mDOMIRootDocumentAccessible = acc;
-      acc = acc.parent;
-    }
-    this.mApplicationAccessible = acc;
-  }
-
-  this.mObserverService = XPCU.getService(kObserverServiceCID,
-                                          nsIObserverService);
-
-  this.mObserverService.addObserver(this, "accessible-event", false);
-}
-
-AccessibleEventsView.prototype = new inBaseTreeView();
-
-/**
- * Global variables used to store event object and user's event handler output
- * from helper functions.
- */
-var gEvent = null;
-var gEventHandlerOutput = [ ];
-
-AccessibleEventsView.prototype.observe =
-function observe(aSubject, aTopic, aData)
-{
-  var event = XPCU.QI(aSubject, nsIAccessibleEvent);
-  var accessible = event.accessible;
-  if (!accessible)
-    return;
-
-  var accessnode = QIAccessNode(accessible);
-
-  // Ignore events on this DOM Inspector to avoid a mess (Gecko 2.0).
-  if (accessnode.rootDocument &&
-      accessnode.rootDocument == this.mDOMIRootDocumentAccessible) {
-    return;
-  }
-
-  // Ignore events having target not in subtree of currently inspected
-  // document accessible.
-  if (!this.canSkipTreeTraversal) {
-    var parentDocAccessible = accessible.document;
-    while (true) {
-      // The target accessible is inspected document accessible or its child.
-      if (parentDocAccessible == this.mAccessible) {
-        break;
-      }
-
-      // Ignore events on this DOM inspector to avoid a mess.
-      if (parentDocAccessible == this.mDOMIRootDocumentAccessible) {
-        return;
-      }
-
-      // Ignore events that aren't in subtree of inspected accessible.
-      if (!parentDocAccessible.parent || !parentDocAccessible.parent.document) {
-        return;
-      }
-
-      parentDocAccessible = parentDocAccessible.parent.document;
-    }
-  }
-
-  // Ignore unwatched events.
-  var type = event.eventType;
-  if (!this.mWatchView.isEventWatched(type))
-    return;
-
-  // Execute user handlers.
-  gEvent = event;
-  gEventHandlerOutput = [ ];
-  var expr = this.mWatchView.getHandlerExpr(type);
-  if (expr) {
-    for (let idx = 0; idx < gAccInterfaces.length; idx++) {
-      // Accessibility interfaces implicit query.
-      accessible instanceof gAccInterfaces[idx];
-    }
-
-    try {
-      var f = Function("event", "target", expr);
-      f(event, accessible);
-    }
-    catch (ex) {
-      output(ex);
-    }
-  }
-
-  // Put event into list.
-  var date = new Date();
-  var node = accessnode.DOMNode;
-  var role = "", name = "";
-  try {
-    // may fail prior Gecko 2.0
-    role = this.mAccService.getStringRole(accessible.role);
-    name = accessible.name;
-  } catch(e) {
-  }
-
-  var eventObj = {
-    event: event,
-    eventHandlerOutput: gEventHandlerOutput,
-    accessnode: accessnode,
-    node: node,
-    id: node.id || "",
-    nodename: node ? node.nodeName : "",
-    name: name,
-    role: role,
-    type: this.mAccService.getStringEventType(type),
-    time: date.toLocaleTimeString()
-  };
-
-  this.mEvents.unshift(eventObj);
-  ++this.mRowCount;
-  this.mTree.rowCountChanged(0, 1);
-}
-
-AccessibleEventsView.prototype.destroy =
-function destroy()
-{
-  this.mObserverService.removeObserver(this, "accessible-event");
-}
-
-AccessibleEventsView.prototype.clear =
-function clear()
-{
-  var count = this.mRowCount;
-  this.mRowCount = 0;
-  this.mEvents = [];
-  this.mTree.rowCountChanged(0, -count);
-}
-
-/**
- * Return object to be used as a subject for the right panel. It could be either
- * DOM node or accessible object depending on whether accessible has a DOM node.
- * Also the returned object has properties that can used by accessibleEvent
- * view to represent information about accessible event and output from user
- * defined accessible event handlers.
- */
-AccessibleEventsView.prototype.getObject =
-function getObject(aRow)
-{
-  return aRow < 0 ? null : this.mEvents[aRow];
-}
-
-AccessibleEventsView.prototype.getCellText =
-function getCellText(aRow, aCol)
-{
-  if (aCol.id == "olcEventType")
-    return this.mEvents[aRow].type;
-  if (aCol.id == "olcEventTime")
-    return this.mEvents[aRow].time;
-  if (aCol.id == "olcEventTargetNodeName")
-    return this.mEvents[aRow].nodename;
-  if (aCol.id == "olcEventTargetNodeID")
-    return this.mEvents[aRow].id;
-  if (aCol.id == "olcEventTargetRole")
-    return this.mEvents[aRow].role;
-  if (aCol.id == "olcEventTargetName")
-    return this.mEvents[aRow].name;
-  return "";
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// WatchAccessibleEventsListView
-
-const kIgnoredEvents = -1;
-const kMutationEvents = 0;
-const kChangeEvents = 1;
-const kNotificationEvents = 2;
-const kSelectionEvents = 3;
-const kMenuEvents = 4;
-const kDocumentEvents = 5;
-const kTextEvents = 6;
-const kTableEvents = 7;
-const kWindowEvents = 8;
-const kHyperLinkEvents = 9;
-const kHyperTextEvents = 10;
-
-function WatchAccessibleEventsListView()
-{
-  // nsITreeView
-  this.__proto__ = new inBaseTreeView();
-
-  this.__defineGetter__(
-    "rowCount",
-    function watchview_getRowCount()
-    {
-      var rowCount = 0;
-
-      for (var idx = 0; idx < this.mChildren.length; idx++) {
-        rowCount++;
-
-        if (this.mChildren[idx].open)
-        rowCount += this.mChildren[idx].children.length;
-      }
-
-      return rowCount;
-    }
-  );
-
-  this.getCellText = function watchview_getCellText(aRowIndex, aCol)
-  {
-    if (aCol.id == "welEventType") {
-      var data = this.getData(aRowIndex);
-      return data.text;
-    }
-
-    return "??";
-  };
-
-  this.getCellValue = function watchview_getCellValue(aRowIndex, aCol)
-  {
-    if (aCol.id == "welIsWatched") {
-      var data = this.getData(aRowIndex);
-      return data.value;
-    }
-    else if (aCol.id == "welIsHandlerEnabled") {
-      var data = this.getData(aRowIndex);
-      return data.isHandlerEnabled;
-    }
-
-    return false;
-  };
-
-  this.getParentIndex = function watchview_getParentIndex(aRowIndex)
-  {
-    var info = this.getInfo(aRowIndex);
-    return info.parentIndex;
-  };
-
-  this.hasNextSibling = function(aRowIndex, aAfterIndex)
-  {
-    var info = this.getInfo(aRowIndex);
-    var siblings = info.parentData.children;
-    return siblings[siblings.length - 1] != info.data;
-  };
-
-  this.getLevel = function watchview_getLevel(aRowIndex)
-  {
-    var info = this.getInfo(aRowIndex);
-    return info.level;
-  };
-
-  this.isContainer = function watchview_isContainer(aRowIndex)
-  {
-    var info = this.getInfo(aRowIndex);
-    return info.level == 0;
-  };
-
-  this.isContainerOpen = function watchview_isContainerOpen(aRowIndex)
-  {
-    var data = this.getData(aRowIndex);
-    return data.open;
-  };
-
-  this.isContainerEmpty = function watchview_isContainerEmpty(aRowIndex)
-  {
-    return false;
-  };
-
-  this.toggleOpenState = function watchview_toogleOpenState(aRowIndex)
-  {
-    var data = this.getData(aRowIndex);
-
-    data.open = !data.open;
-    var rowCount = data.children.length;
-
-    if (data.open)
-      this.mTree.rowCountChanged(aRowIndex + 1, rowCount);
-    else
-      this.mTree.rowCountChanged(aRowIndex + 1, -rowCount);
-
-    this.mTree.invalidateRow(aRowIndex);
-  };
-
-  this.isEditable = function watchview_isEditable(aRowIndex, aCol)
-  {
-    if (aCol.id == "welIsWatched" ||
-        (aCol.id == "welIsHandlerEnabled" && !this.isContainer(aRowIndex))) {
-      return true;
-    }
-    return false;
-  };
-
-  this.setCellValue = function watchview_setCellValue(aRowIndex, aCol, aValue)
-  {
-    if (aCol.id == "welIsWatched") {
-      var newValue = aValue == "true";
-
-      var info = this.getInfo(aRowIndex);
-      var data = info.data;
-
-      data.value = newValue;
-
-      if (this.isContainer(aRowIndex)) {
-        var children = data.children;
-        for (var idx = 0; idx < children.length; idx++)
-          children[idx].value = newValue;
-
-        this.mTree.invalidateColumnRange(aRowIndex, aRowIndex + children.length,
-                                         aCol);
-        return;
-      }
-
-      this.mTree.invalidateCell(aRowIndex, aCol);
-
-      var parentData = info.parentData;
-      if (parentData.value && !newValue) {
-        parentData.value = false;
-        this.mTree.invalidateCell(info.parentIndex, aCol);
-      }
-    }
-    else if (aCol.id == "welIsHandlerEnabled") {
-      var newValue = aValue == "true";
-      this.updateHandlerState(newValue, aRowIndex);
-    }
-  };
-
-  //////////////////////////////////////////////////////////////////////////////
-  ///// Public
-
-  /**
-   * Return true if the given event type is watched.
-   */
-  this.isEventWatched = function watchview_isEventWatched(aType)
-  {
-    return this.mReverseData[aType].value;
-  };
-
-  /**
-   * Start or stop to watch all events.
-   */
-  this.watchAllEvents = function watchview_watchAllEvents(aAll)
-  {
-    for (var idx = 0; idx < this.mChildren.length; idx++) {
-      var data = this.mChildren[idx];
-      data.value = aAll;
-      for (var jdx = 0; jdx < data.children.length; jdx++) {
-        var subdata = data.children[jdx];
-        subdata.value = aAll;
-      }
-    }
-
-    this.mTree.invalidate();
-  };
-
-  this.getHandlerExpr = function watchview_getHandlerExpr(aType)
-  {
-    var data = this.mReverseData[aType];
-    if (data.isHandlerEnabled) {
-      return data.handlerSource;
-    }
-
-    return "";
-  }
-
-  this.toggleEventWatched = function watchview_toggleEventWatched()
-  {
-    var idx = this.selection.currentIndex;
-    var colWatched = this.mTree.columns.welIsWatched;
-    var newValue = !this.getCellValue(idx, colWatched);
-
-    // setCellValue() needs the new value to be passed as a string.
-    this.setCellValue(idx, colWatched, newValue.toString());
-  }
-
-  /**
-   * Updates state and value of handler source editor.
-   */
-  this.updateHandlerEditor = function watchview_updateHandlerEditor()
-  {
-    var idx = this.selection.currentIndex;
-
-    if (idx == -1 || this.isContainer(idx)) {
-      this.mHandlerState.hidden = true;
-      this.mHandlerEditor.disabled = true;
-      this.mHandlerEditor.value = "";
-      this.mHandlerEditorLabel.hidden = false;
-      return;
-    }
-
-    this.mHandlerState.hidden = false;
-    this.mHandlerEditorLabel.hidden = true;
-    this.mHandlerEditor.disabled = false;
-
-    var data = this.getData(idx);
-
-    var label = gBundle.getFormattedString("handlerEditorLabel", [data.text]);
-    this.mHandlerState.label = label;
-    this.mHandlerEditor.value = data.handlerSource;
-  }
-
-  /**
-   * Updates state of handler (enabled or disabled) and UI displaying the state.
-   * @param aValue [optional]
-   *        New value of handler state column at the given row index, if
-   *        undefined then data wasn't changed, needs to update UI
-   * @param aRowIdx [optional]
-   *        The given row index, if missed then current row index is used
-   */
-  this.updateHandlerState =
-    function watchview_updateHandlerState(aValue, aRowIdx)
-  {
-    var updateData = aValue != undefined;
-    var updateCheckbox = !updateData || aRowIdx == this.selection.currentIndex;
-
-    var rowIdx = aRowIdx == undefined ? this.selection.currentIndex : aRowIdx;
-
-    var data = this.getData(rowIdx);
-
-    if (updateData) {
-      data.isHandlerEnabled = aValue;
-      var col = this.mTree.columns.getNamedColumn("welIsHandlerEnabled");
-      this.mTree.invalidateCell(rowIdx, col);
-    }
-
-    if (updateCheckbox) {
-      this.mHandlerState.checked = data.isHandlerEnabled;
-    }
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
-  ///// Private
-
-  /**
-   * Return the data of the tree item at the given row index.
-   */
-  this.getData = function watchview_getData(aRowIndex)
-  {
-    return this.getInfo(aRowIndex).data;
-  };
-
-  /**
-   * Return an object describing the tree item at the given row index:
-   *
-   * {
-   *   data: null, // the data of tree item
-   *   parentIndex: -1, // index of parent row
-   *   parentData: null, // the data of parent tree item
-   *   level: 0 // the level of the tree item
-   * };
-   */
-  this.getInfo = function watchview_getInfo(aRowIndex)
-  {
-    var info = {
-      data: null,
-      parentIndex: -1,
-      parentData: null,
-      level: 0
-    };
-
-    var groupIdx = 0;
-    var rowIdx = aRowIndex;
-
-    for (var idx = 0; idx < this.mChildren.length; idx++) {
-      var groupItem = this.mChildren[idx];
-
-      if (rowIdx == 0) {
-        info.data = groupItem;
-        return info;
-      }
-
-      rowIdx--;
-      if (groupItem.open) {
-        var typeItemLen = groupItem.children.length;
-        if (rowIdx < typeItemLen) {
-          info.data = groupItem.children[rowIdx];
-          info.parentIndex = idx;
-          info.parentData = groupItem;
-          info.level = 1;
-          return info;
-        }
-
-        rowIdx -= typeItemLen;
-      }
-    }
-
-    return info;
-  };
-
-  /**
-   * Initialize the tree view.
-   */
-  this.init = function watchview_init()
-  {
-    // Register event groups.
-    for (var idx = 0; idx < gEventGroupMap.length; idx++)
-      this.registerEventGroup(idx, gBundle.getString(gEventGroupMap[idx]));
-
-    // Register event types.
-    for (var idx = 1; idx < gEventTypesMap.length; idx++) {
-      var props = gEventTypesMap[idx];
-      this.registerEventType(props.group, idx, props.isIgnored);
-    }
-
-    // Prepare handler source editor.
-    this.mHandlerState = document.getElementById("welHandlerState");
-    this.mHandlerEditor = document.getElementById("welHandlerEditor");
-    this.mHandlerEditorLabel = document.getElementById("welHandlerEditorLabel");
-    this.mHandlerEditor.addEventListener("input", this, false);
-    this.mHandlerEditor.disabled = true;
-  };
-
-  /**
-   * Add tree item for the group.
-   */
-  this.registerEventGroup = function watchview_registerEventGroup(aType, aName)
-  {
-    var item = {
-      text: aName,
-      value: true,
-      handlerSource: "",
-      open: false,
-      children: []
-    };
-
-    this.mChildren[aType] = item;
-  };
-
-  /**
-   * Add tree item for the event type.
-   */
-  this.registerEventType = function watchview_registerEventType(aGroup, aType,
-                                                                aIgnored)
-  {
-    if (aGroup == kIgnoredEvents)
-      return;
-
-    var item = {
-      text: this.mAccService.getStringEventType(aType),
-      value: !aIgnored,
-      isHandlerEnabled: false,
-      handlerSource: ""
-    };
-
-    var groupItem = this.mChildren[aGroup];
-    if (aIgnored)
-      groupItem.value = false;
-
-    var children = groupItem.children;
-    children.push(item);
-
-    this.mReverseData[aType] = item;
-  };
-
-  /**
-   * Listen for 'input' event from handler source textbox to record the handler.
-   */
-  this.handleEvent = function watchview_handleEvent(aEvent)
-  {
-    if (aEvent.target != this.mHandlerEditor) {
-      return;
-    }
-
-    switch (aEvent.type) {
-      case "input":
-        var idx = this.selection.currentIndex;
-
-        // Enable/disable event handler automatically.
-        var isEnabled = this.mHandlerEditor.value != "";
-        this.updateHandlerState(isEnabled, idx);
-
-        // Update event handler code.
-        var data = this.getData(idx);
-        data.handlerSource = this.mHandlerEditor.value;
-        break;
-    }
-  }
-
-  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                     nsIAccessibleRetrieval);
-
-  this.mChildren = [];
-  this.mReverseData = [];
-  this.mHandlers = {};
-
-  this.mHandlerState = null;
-  this.mHandlerEditor = null;
-  this.mHandlerEditorLabel = null;
-
-  this.init();
-}
-
-function eventProps(aGroup, aValue)
-{
-  this.group = aGroup;
-  this.isIgnored = aValue;
-}
-
-/**
- * The map of event groups.
- */
-var gEventGroupMap =
-[
-  "mutationEvents", // kMutationEvents
-  "changeEvents", // kChangeEvents,
-  "notificationEvents", // kNotificationEvents,
-  "selectionEvents", // kSelectionEvents
-  "menuEvents", // kMenuEvents,
-  "documentEvents", // kDocumentEvents,
-  "textEvents", // kTextEvents,
-  "tableEvents", // kTableEvents,
-  "windowEvents", // kWindowEvents,
-  "hyperLinkEvents", // kHyperLinkEvents
-  "hyperTextEvents", // kHyperTextEvents
-];
-
-/**
- * The map of event types. Events are listed in the order of nsIAccessibleEvent.
- */
-var gEventTypesMap =
-[
-  new eventProps(kIgnoredEvents), // No event
-
-  new eventProps(kMutationEvents), // EVENT_SHOW
-  new eventProps(kMutationEvents), // EVENT_HIDE
-  new eventProps(kMutationEvents), // EVENT_REORDER
-
-  new eventProps(kChangeEvents), // EVENT_ACTIVE_DECENDENT_CHANGED
-
-  new eventProps(kNotificationEvents), // EVENT_FOCUS
-
-  new eventProps(kChangeEvents), // EVENT_STATE_CHANGE
-  new eventProps(kChangeEvents), // EVENT_LOCATION_CHANGE
-  new eventProps(kChangeEvents), // EVENT_NAME_CHANGE
-  new eventProps(kChangeEvents), // EVENT_DESCRIPTION_CHANGE
-  new eventProps(kChangeEvents), // EVENT_VALUE_CHANGE
-  new eventProps(kChangeEvents), // EVENT_HELP_CHANGE
-  new eventProps(kChangeEvents), // EVENT_DEFACTION_CHANGE
-  new eventProps(kChangeEvents), // EVENT_ACTION_CHANGE
-  new eventProps(kChangeEvents), // EVENT_ACCELERATOR_CHANGE
-
-  new eventProps(kSelectionEvents), // EVENT_SELECTION
-  new eventProps(kSelectionEvents), // EVENT_SELECTION_ADD
-  new eventProps(kSelectionEvents), // EVENT_SELECTION_REMOVE
-  new eventProps(kSelectionEvents), // EVENT_SELECTION_WITHIN
-
-  new eventProps(kNotificationEvents), // EVENT_ALERT
-  new eventProps(kNotificationEvents), // EVENT_FOREGROUND
-
-  new eventProps(kMenuEvents), // EVENT_MENU_START
-  new eventProps(kMenuEvents), // EVENT_MENU_END
-  new eventProps(kMenuEvents), // EVENT_MENUPOPUP_START
-  new eventProps(kMenuEvents), // EVENT_MENUPOPUP_END
-
-  new eventProps(kNotificationEvents), // EVENT_CAPTURE_START
-  new eventProps(kNotificationEvents), // EVENT_CAPTURE_END
-  new eventProps(kNotificationEvents), // EVENT_MOVESIZE_START
-  new eventProps(kNotificationEvents), // EVENT_MOVESIZE_END
-  new eventProps(kNotificationEvents), // EVENT_CONTEXTHELP_START
-  new eventProps(kNotificationEvents), // EVENT_CONTEXTHELP_END
-  new eventProps(kNotificationEvents, true), // EVENT_DRAGDROP_START
-  new eventProps(kNotificationEvents, true), // EVENT_DRAGDROP_END
-  new eventProps(kNotificationEvents), // EVENT_DIALOG_START
-  new eventProps(kNotificationEvents), // EVENT_DIALOG_END
-  new eventProps(kNotificationEvents), // EVENT_SCROLLING_START
-  new eventProps(kNotificationEvents), // EVENT_SCROLLING_END
-  new eventProps(kNotificationEvents), // EVENT_MINIMIZE_START
-  new eventProps(kNotificationEvents), // EVENT_MINIMIZE_END
-
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_START
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_COMPLETE
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_RELOAD
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_LOAD_STOPPED
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_ATTRIBUTES_CHANGED
-  new eventProps(kDocumentEvents), // EVENT_DOCUMENT_CONTENT_CHANGED
-
-  new eventProps(kChangeEvents), // EVENT_PROPERTY_CHANGED
-
-  new eventProps(kSelectionEvents), // EVENT_SELECTION_CHANGED
-
-  new eventProps(kChangeEvents), // EVENT_TEXT_ATTRIBUTE_CHANGED
-
-  new eventProps(kTextEvents), // EVENT_TEXT_CARET_MOVED
-  new eventProps(kTextEvents), // EVENT_TEXT_CHANGED
-  new eventProps(kTextEvents), // EVENT_TEXT_INSERTED
-  new eventProps(kTextEvents), // EVENT_TEXT_REMOVED
-  new eventProps(kTextEvents), // EVENT_TEXT_UPDATED
-  new eventProps(kTextEvents), // EVENT_TEXT_SELECTION_CHANGED
-
-  new eventProps(kNotificationEvents), // EVENT_VISIBLE_DATA_CHANGED
-  new eventProps(kNotificationEvents), // EVENT_TEXT_COLUMN_CHANGED
-  new eventProps(kNotificationEvents), // EVENT_SECTION_CHANGED
-
-  new eventProps(kTableEvents), // EVENT_TABLE_CAPTION_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_MODEL_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_SUMMARY_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_ROW_DESCRIPTION_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_ROW_HEADER_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_ROW_INSERT
-  new eventProps(kTableEvents), // EVENT_TABLE_ROW_DELETE
-  new eventProps(kTableEvents), // EVENT_TABLE_ROW_REORDER
-  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_HEADER_CHANGED
-  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_INSERT
-  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_DELETE
-  new eventProps(kTableEvents), // EVENT_TABLE_COLUMN_REORDER
-
-  new eventProps(kWindowEvents), // EVENT_WINDOW_ACTIVATE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_CREATE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_DEACTIVATE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_DESTROY
-  new eventProps(kWindowEvents), // EVENT_WINDOW_MAXIMIZE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_MINIMIZE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_RESIZE
-  new eventProps(kWindowEvents), // EVENT_WINDOW_RESTORE
-
-  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_END_INDEX_CHANGED
-  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED
-  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_SELECTED_LINK_CHANGED
-
-  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_LINK_ACTIVATED
-  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_LINK_SELECTED
-
-  new eventProps(kHyperLinkEvents), // EVENT_HYPERLINK_START_INDEX_CHANGED
-
-  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_CHANGED
-  new eventProps(kHyperTextEvents), // EVENT_HYPERTEXT_NLINKS_CHANGED
-
-  new eventProps(kChangeEvents), // EVENT_OBJECT_ATTRIBUTE_CHANGED
-  new eventProps(kChangeEvents), // EVENT_PAGE_CHANGED
-
-  new eventProps(kDocumentEvents) // EVENT_INTERNAL_LOAD
-];
-
-////////////////////////////////////////////////////////////////////////////////
-//// Functions and objects for usage in event handler editor.
-
-var accRetrieval = XPCU.getService(kAccessibleRetrievalCID,
-                                   nsIAccessibleRetrieval);
-
-function output(aValue)
-{
-  gEventHandlerOutput.push(aValue);
-}
-
-function outputRole(aAccessible)
-{
-  output(accRetrieval.getStringRole(aAccessible.role));
-}
-
-function outputStates(aAccessible)
-{
-  var stateObj = {}, extraStateObj = {};
-  aAccessible.getState(stateObj, extraStateObj);
-  var states = accRetrieval.getStringStates(stateObj.value,
-                                            extraStateObj.value);
-
-  var list = [];
-  for (let i = 0; i < states.length; i++) {
-    list.push(states.item(i));
-  }
-
-  output(list.join());
-}
-
-function outputAttrs(aAccessible)
-{
-  var str = "";
-  var attrs = aAccessible.attributes;
-  if (attrs) {
-    var enumerate = attrs.enumerate();
-    while (enumerate.hasMoreElements()) {
-      var prop = XPCU.QI(enumerate.getNext(), nsIPropertyElement);
-      str += prop.key + ": " + prop.value + "; ";
-    }
-
-    if (str)
-      output(str);
-  }
-}
-
-function outputTree(aAccessible, aHighlightList)
-{
-  var treeObj = {
-    cols: {
-      outputtreeRole: {
-        name: gBundle.getString("role"),
-        flex: 2,
-        isPrimary: true
-      },
-      outputtreeName: {
-        name: gBundle.getString("name"),
-        flex: 2
-      },
-      outputtreeNodename: {
-        name: gBundle.getString("nodeName"),
-        flex: 1
-      },
-      outputtreeId:{
-        name: gBundle.getString("id"),
-        flex: 1
-      }
-    },
-    view: new inAccTreeView(aAccessible, aHighlightList)
-  };
-
-  output(treeObj);
-}
-
-function outputDOMAttrs(aAccessible)
-{
-  var DOMNode = QIAccessNode(aAccessible).DOMNode;
-  var DOMAttributes = DOMNode.attributes;
-  for (let i = 0; i < DOMAttributes.length; i++) {
-    var DOMAttribute = DOMAttributes.item(i);
-    output(DOMAttribute.name + ": " + DOMAttribute.value);
-  }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//// Private functions.
-
-function inAccTreeView(aAccessible, aHighlightList)
-{
-  inDataTreeView.call(this);
-
-  var list = this.generateChildren(aAccessible, aHighlightList);
-  if (list) {
-    this.expandNodes(list);
-  }
-}
-
-inAccTreeView.prototype = new inDataTreeView();
-
-// nsITreeView
-inAccTreeView.prototype.getRowProperties =
-  function inAccTreeView_getRowProperties(aRowIdx)
-{
-  var data = this.getDataAt(aRowIdx);
-  if (data && data.properties) {
-    return data.properties.join(" ");
-  }
-
-  return "";
-};
-
-inAccTreeView.prototype.getCellProperties =
-  function inAccTreeView_getCellProperties(aRowIdx, aCol)
-{
-  return this.getRowProperties(aRowIdx);
-};
-
-// Initialization
-inAccTreeView.prototype.generateChildren =
-  function inAccTreeView_generateChildren(aAccessible, aHighlightList, aParent,
-                                          aIsUnattached)
-{
-  var data = {
-    properties: []
-  };
-
-  var accessible = QIAccessNode(aAccessible);
-
-  // Highlight the row for accessible from the list.
-  var isHighlighted =
-    aHighlightList && aHighlightList.indexOf(aAccessible) != -1;
-  if (isHighlighted) {
-    data.properties.push("highlight");
-  }
-
-  // Gray out the row for accessible unattached from the tree.
-  if (aIsUnattached) {
-    data.properties.push("grayout");
-  }
-
-  // Add cells data.
-  data["outputtreeRole"] = accRetrieval.getStringRole(aAccessible.role);
-  data["outputtreeName"] = aAccessible.name;
-  data["outputtreeNodename"] = accessible.DOMNode.nodeName;
-  data["outputtreeId"] =
-    ("id" in accessible.DOMNode ? accessible.DOMNode.id : "");
-
-  var parent = this.appendChild(aParent, data);
-  var nodesToExpand = null;
-
-  // Insert highlighted row for target of handled hide event if it's specified
-  // in the list (works for Gecko versions higher 13).
-  var containsUnattached = false;
-  var accBeforeUnattached = null;
-  if ("nsIAccessibleHideEvent" in Ci &&
-      gEvent instanceof Ci.nsIAccessibleHideEvent &&
-      gEvent.targetParent == aAccessible) {
-    containsUnattached = true;
-    try {
-      if (gEvent.targetNextSibling.parent == aAccessible) {
-        accBeforeUnattached = gEvent.targetNextSibling;
-      }
-    } catch (e) {
-    }
-    try {
-      if (!accBeforeUnattached &&
-          gEvent.targetPrevSibling.parent == aAccessible) {
-        accBeforeUnattached = gEvent.targetPrevSibling.nextSibling;
-      }
-    } catch (e) {
-    }
-  }
-
-  // Add children.
-  var childCount = aAccessible.childCount;
-  for (let i = 0; i < childCount; i++) {
-    var child = aAccessible.getChildAt(i);
-
-    // Add unattached child before current child.
-    if (accBeforeUnattached == child) {
-      var list =
-        this.generateChildren(gEvent.accessible, aHighlightList, parent, true);
-      if (list) {
-        nodesToExpand = list.concat(nodesToExpand || []);
-      }
-    }
-
-    var list =
-      this.generateChildren(child, aHighlightList, parent);
-    if (list) {
-      nodesToExpand = list.concat(nodesToExpand || []);
-    }
-  }
-
-  // Put unattached child as last child of the parent, we don't have good guess
-  // about its hierarchy position.
-  if (containsUnattached && !accBeforeUnattached) {
-    var list =
-      this.generateChildren(gEvent.accessible, aHighlightList, parent, true);
-    if (list) {
-      nodesToExpand = list.concat(nodesToExpand || []);
-    }
-  }
-
-  return nodesToExpand ? nodesToExpand.concat(parent) : isHighlighted && [];
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.xul b/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/accessibleEvents.xul
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleEvents.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleEvents/accessibleEvents.css"?>
-
-<page id="winAccessibleEvents"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inDataTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleEvents/accessibleEvents.js"/>
-
-  <stringbundle id="accessiblePropsBundle"
-                src="chrome://inspector/locale/viewers/accessibleEvents.properties"/>
-
-  <tabbox flex="1">
-    <tabs>
-      <tab label="&eventList.label;"/>
-      <tab label="&watchedEvents.label;"/>
-    </tabs>
-    <tabpanels flex="1">
-
-      <!-- Event list -->
-      <vbox>
-        <label value="&handledEvents.label;" control="olAccessibleEvents"/>
-        <tree id="olAccessibleEvents"
-              flex="1"
-              onselect="viewer.onItemSelected()">
-
-          <treecols>
-            <treecol id="olcEventType"
-                     label="&eventType.label;"
-                     primary="true"
-                     persist="width,hidden,ordinal"
-                     flex="2"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcEventTargetRole"
-                     label="&eventTargetRole.label;"
-                     hidden="true"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcEventTargetName"
-                     label="&eventTargetName.label;"
-                     hidden="true"
-                     persist="width,hidden,ordinal"
-                     flex="2"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcEventTargetNodeName"
-                     label="&eventTargetNodeName.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcEventTargetNodeID"
-                     label="&eventTargetNodeID.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcEventTime"
-                     label="&eventTime.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-          </treecols>
-          <treechildren id="olbAccessibleEvents"
-                        alternatingbackground="true"/>
-        </tree>
-        <hbox align="end">
-          <button label="&clearEventList.label;"
-                  oncommand="viewer.clearEventsList();"/>
-        </hbox>
-      </vbox>
-
-      <!-- Watched events -->
-      <vbox>
-        <vbox flex="1">
-          <label value="&chooseEventsToWatch.label;" control="watchEventList"/>
-          <tree id="watchEventList"
-                flex="1"
-                editable="true"
-                onselect="viewer.onWatchViewItemSelected();"
-                onkeypress="viewer.onWatchViewKeyPressed(event);"
-                seltype="single">
-            <treecols>
-              <treecol id="welEventType"
-                       label="&eventType.label;"
-                       primary="true"
-                       persist="width,hidden,ordinal"
-                       flex="1"/>
-              <splitter class="tree-splitter"/>
-              <treecol id="welIsWatched"
-                       label="&isWatched.label;"
-                       type="checkbox"
-                       editable="true"
-                       persist="width,hidden,ordinal"/>
-              <splitter class="tree-splitter"/>
-              <treecol id="welIsHandlerEnabled"
-                       label="&isHandlerEnabled.label;"
-                       type="checkbox"
-                       editable="true"
-                       persist="width,hidden,ordinal"
-                       hidden="true"/>
-            </treecols>
-            <treechildren/>
-          </tree>
-        </vbox>
-        <hbox align="right">
-          <button label="&watchAll.label;"
-                  oncommand="viewer.watchAllEvents(true);"/>
-          <button label="&watchNone.label;"
-                  oncommand="viewer.watchAllEvents(false);"/>
-        </hbox>
-        <splitter state="collapsed" collapse="after" persist="state"
-                  resizebefore="farthest" id="welSplitter">
-          <toolbarbutton label="&editHandler.label;" id="welGrippyButton"
-                         oncommand="viewer.toggleHandlerEditor(this.parentNode);"/>
-        </splitter>
-        <vbox>
-          <hbox align="baseline">
-            <label control="welHandlerEditor"
-                   id="welHandlerEditorLabel"
-                   flex="1">&handlerEditorNoEvent.label;</label>
-            <checkbox id="welHandlerState" hidden="true"
-                      oncommand="viewer.onWatchViewHandlerStateChanged(this.checked);"
-                      flex="1"/>
-            <toolbarbutton label="&contextHelp.label;"
-                           oncommand="viewer.showWatchViewHandlerHelp();"/>
-          </hbox>
-          <textbox id="welHandlerEditor" multiline="true" rows="8" flex="1"/>
-        </vbox>
-      </vbox>
-    </tabpanels>
-  </tabbox>
-
-</page>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/handlerHelpDialog.xul b/suite/extensions/inspector/resources/content/viewers/accessibleEvents/handlerHelpDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleEvents/handlerHelpDialog.xul
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE dialog [
-  <!ENTITY % dtd1 SYSTEM
-    "chrome://inspector/locale/viewers/accessibleEventsHandlerHelpDialog.dtd">
-  %dtd1;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin"?>
-
-<dialog id="winEvalJS"
-        title="&helpDialog.title;"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        buttons="accept"
-        style="width: 30em;">
-
-  <description>&general.descr;</description>
-  <description>&helpers.descr;</description>
-  <grid>
-    <columns>
-      <column/>
-      <column flex="1"/>
-    </columns>
-    <rows>
-      <row>
-        <description value="event"/>
-        <description>&event.descr;</description>
-      </row>
-      <row>
-        <description value="target"/>
-        <description>&target.descr;</description>
-      </row>
-      <row>
-        <description value="accRetrieval"/>
-        <description>&accRetrieval.descr;</description>
-      </row>
-      <row>
-        <description value="output(string)"/>
-        <description>&output.descr;</description>
-      </row>
-      <row>
-        <description value="outputAttrs(accessible)"/>
-        <description>&outputAttrs.descr;</description>
-      </row>
-      <row>
-        <description value="outputRole(accessible)"/>
-        <description>&outputRole.descr;</description>
-      </row>
-      <row>
-        <description value="outputStates(accessible)"/>
-        <description>&outputStates.descr;</description>
-      </row>
-      <row>
-        <description value="outputTree(accessible, hightlightList)"/>
-        <description>&outputTree.descr;</description>
-      </row>
-      <row>
-        <description value="outputDOMAttrs(accessible)"/>
-        <description>&outputDOMAttrs.descr;</description>
-      </row>
-    </rows>
-  </grid>
-
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.js b/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.js
+++ /dev/null
@@ -1,59 +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/. */
-
-/***************************************************************
-* AccessibleObjectViewer --------------------------------------------
-*  The viewer for the accessible object.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/events/ObserverManager.js
-****************************************************************/
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var bundle;
-var accService;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
-const nsIAccessible = Components.interfaces.nsIAccessible;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization/Destruction
-
-window.addEventListener("load", AccessibleObjectViewer_initialize, false);
-
-function AccessibleObjectViewer_initialize()
-{
-  bundle = document.getElementById("inspector-bundle");
-  accService = XPCU.getService(kAccessibleRetrievalCID, nsIAccessibleRetrieval);
-
-  viewer = new JSObjectViewer();
-
-  viewer.__defineGetter__(
-    "uid",
-    function uidGetter()
-    {
-      return "accessibleObject";
-    }
-  );
-
-  viewer.__defineSetter__(
-    "subject",
-    function subjectSetter(aObject)
-    {
-      var accObject = aObject instanceof nsIAccessible ?
-        aObject : accService.getAccessibleFor(aObject);
-      this.setSubject(accObject);
-    }
-   );
-
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.xul b/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleObject/accessibleObject.xul
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<?xul-overlay href="chrome://inspector/content/viewers/jsObject/jsObjectViewer.xul"?>
-
-<page id="winAccessibleObject"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleObject/accessibleObject.js"/>
-
-  <stringbundle id="inspector-bundle"/>
-  <commandset id="cmdsJSObjectViewer"/>
-
-  <popupset>
-    <menupopup id="popupContext"/>
-  </popupset>
-  <tree id="treeJSObject" treelines="true" class="plain"/>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js b/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessiblePropViewerMgr.js
+++ /dev/null
@@ -1,619 +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/. */
-
-////////////////////////////////////////////////////////////////////////////////
-//// Global
-
-const nsIAccessibleText = Components.interfaces.nsIAccessibleText;
-const nsIAccessibleTableCell = Components.interfaces.nsIAccessibleTableCell;
-
-
-////////////////////////////////////////////////////////////////////////////////
-//// Accessible property viewer manager
-
-/**
- * Used to show additional properties of the accessible in tabbox.
- *
- * @param aPaneElm
- *        A pane element where the view is hosted.
- */
-function accessiblePropViewerMgr(aPaneElm)
-{
-  /**
-   * Updates all property views for the given accessible.
-   *
-   * @param aAccessible
-   *        The given accessible
-   */
-  this.updateViews = function accessiblePropViewerMgr_updateViews(aAccessible)
-  {
-    for (var id in this.viewers)
-    {
-      var tab = document.getElementById("tab_" + id);
-      tab.hidden = !this.viewers[id].update(aAccessible);
-    }
-
-    this.tabboxElm.selectedIndex = this.getCurrentViewerIdx();
-  }
-
-  /**
-   * Clear the data of property views.
-   */
-  this.clearViews = function accessiblePropViewerMgr_clearViews()
-  {
-    for (var id in this.viewers)
-    {
-      this.viewers[id].clear();
-
-      var tab = document.getElementById("tab_" + id);
-      tab.hidden = true;
-    }
-  }
-
-  this.isCommandEnabled =
-    function accessiblePropViewerMgr_isCommandEnabled(aCommand)
-  {
-    var tab = this.tabboxElm.selectedTab;
-    var viewerid = tab.id.replace("tab_", "");
-    var viewer = this.viewers[viewerid];
-    if ("isCommandEnabled" in viewer) {
-      return viewer.isCommandEnabled(aCommand);
-    }
-    return false;
-  },
-
-  /**
-   * Process 'inspectInNewView' command for selected property view.
-   */
-  this.inspectInNewView = function accessiblePropViewerMgr_inspectInNewView()
-  {
-    var tab = this.tabboxElm.selectedTab;
-    var viewerid = tab.id.replace("tab_", "");
-    var viewer = this.viewers[viewerid];
-    if ("inspectInNewView" in viewer)
-      viewer.inspectInNewView();
-  }
-
-  this.doCommand = function accessiblePropViewerMgr_doCommand(aCommandId)
-  {
-    var tab = this.tabboxElm.selectedTab;
-    var viewerid = tab.id.replace("tab_", "");
-    var viewer = this.viewers[viewerid];
-    if ("doCommand" in viewer)
-      viewer.doCommand(aCommandId);
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
-  //// private
-
-  this.handleEvent = function accessiblePropViewerMgr_handleEvent(aEvent)
-  {
-    this.setCurrentViewerIdx(this.tabboxElm.selectedIndex);
-    viewer.pane.panelset.updateAllCommands();
-  }
-
-  this.setCurrentViewerIdx = function accessiblePropViewerMgr_setCurrentViewerIdx(aIdx)
-  {
-    this.paneElm.accessiblePropsCurrentViewerIdx = aIdx;
-  }
-
-  this.getCurrentViewerIdx = function accessiblePropViewerMgr_getCurrentViewerIdx()
-  {
-    var idx = this.paneElm.accessiblePropsCurrentViewerIdx;
-
-    idx = idx ? idx : 0;
-    var tab = this.tabsElm.children[idx];
-    if (tab.hidden)
-      return 0;
-
-    return idx;
-  }
-
-  this.viewers = {
-    "attributes": new attributesViewer(),
-    "actions": new actionViewer(),
-    "textattrs": new textAttrsViewer(),
-    "tablecell": new tableCellViewer()
-  };
-
-  this.tabboxElm = document.getElementById("tabviewers");
-  this.tabsElm = this.tabboxElm.tabs;
-  this.tabsElm.addEventListener("select", this, false);
-  this.paneElm = aPaneElm;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-//// Accessible property viewers
-
-/**
- * Object attribute property view. Used to display accessible attributes.
- */
-function attributesViewer()
-{
-  /**
-   * Updates the view for the given accessible.
-   *
-   * @param aAccessible
-   *        The given accessible
-   */
-  this.update = function attributesViewer_update(aAccessible)
-  {
-    var attrs = aAccessible.attributes;
-    if (attrs) {
-      var enumerate = attrs.enumerate();
-      while (enumerate.hasMoreElements())
-        this.addAttribute(enumerate.getNext());
-    }
-
-    return true;
-  }
-
-  /**
-   * Clear the view's data.
-   */
-  this.clear = function attributesViewer_clear()
-  {
-    var trAttrBody = document.getElementById("trAttrBody");
-    while (trAttrBody.hasChildNodes())
-      trAttrBody.removeChild(trAttrBody.lastChild)
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
-  //// private
-
-  this.addAttribute = function attrbiutesViewer_addAttribute(aElement)
-  {
-    var prop = XPCU.QI(aElement, nsIPropertyElement);
-    
-    var trAttrBody = document.getElementById("trAttrBody");
-    
-    var ti = document.createElement("treeitem");
-    var tr = document.createElement("treerow");
-    
-    var tc = document.createElement("treecell");
-    tc.setAttribute("label", prop.key);
-    tr.appendChild(tc);
-    
-    tc = document.createElement("treecell");
-    tc.setAttribute("label", prop.value);
-    tr.appendChild(tc);
-    
-    ti.appendChild(tr);
-    
-    trAttrBody.appendChild(ti);
-  }
-}
-
-
-/**
- * Action property view.
- */
-function actionViewer()
-{
-  /**
-   * Updates the view for the given accessible.
-   *
-   * @param aAccessible
-   *        The given accessible
-   */
-  this.update = function actionViewer_update(aAccessible)
-  {
-    this.mAccessible = aAccessible;
-
-    // nsIAccessible::numActions was renamed to actionCount in Mozilla 15.
-    let count = ("actionCount" in aAccessible) ?
-      aAccessible.actionCount : aAccessible.numActions;
-    if (!count)
-      return false;
-
-    this.updateActionItem(this.mDefaultActionItem, 0);
-
-    for (let idx = 1; idx < count; idx++) {
-      let actionItem = this.mDefaultActionItem.cloneNode(true);
-      this.updateActionItem(actionItem, idx);
-      this.mActionItemContainer.appendChild(actionItem);
-    }
-
-    return true;
-  }
-
-  /**
-   * Clear the view's data.
-   */
-  this.clear = function actionViewer_clear()
-  {
-    this.mAccessible = null;
-
-    let cntr = this.mActionItemContainer;
-    while (cntr.firstChild != cntr.lastChild)
-      cntr.removeChild(cntr.lastChild);
-
-    this.setValues(this.mDefaultActionItem, "", "", "", "", "");
-  }
-
-  /**
-   * Performes a command.
-   */
-  this.doCommand = function actionViewer_doCommand(aCommandId)
-  {
-    this.mAccessible.doAction(aCommandId);
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
-  //// private
-
-  this.updateActionItem = function actionViewer_updateActionItem(aActionItem,
-                                                                 aActionIndex)
-  {
-    var index = (aActionIndex + 1) + ".";
-    var name = this.mAccessible.getActionName(aActionIndex);
-    var description = this.mAccessible.getActionDescription(aActionIndex);
-
-    var keysStr = "";
-    try {
-      let keys = this.mAccessible.getKeyBindings(aActionIndex);
-      for (let idx = 0; idx < keys.length; idx++)
-        keysStr += keys.item(idx);
-
-    } catch (e) { }
-
-    let jsCommand = "viewer.doCommand(" + aActionIndex + ");";
-
-    this.setValues(aActionItem, index, name, description, keysStr, jsCommand);
-  }
-
-  this.setValues = function actionViewer_setValues(aActionItem,
-                                                   aIndex, aName, aDescription,
-                                                   aKeyBindings, aJSCommand)
-  {
-    let elm = aActionItem.getElementsByAttribute("prop", "actionIndex")[0];
-    elm.textContent = aIndex;
-
-    elm = aActionItem.getElementsByAttribute("prop", "actionName")[0];
-    elm.textContent = aName;
-
-    elm = aActionItem.getElementsByAttribute("prop", "actionDescription")[0];
-    elm.textContent = aDescription;
-
-    elm = aActionItem.getElementsByAttribute("prop", "actionKeyBindings")[0];
-    elm.textContent = aKeyBindings;
-
-    elm = aActionItem.getElementsByAttribute("prop", "invokeAction")[0];
-    if (aJSCommand)
-      elm.setAttribute("oncommand", aJSCommand)
-    else
-      elm.removeAttribute("oncommand");
-  }
-
-  this.mAccessible = null;
-
-  this.mActionItemContainer = document.getElementById("actionItemContainer");
-  this.mDefaultActionItem = document.getElementById("actionItem");
-}
-
-
-/**
- * Text attributes property view.
- */
-function textAttrsViewer()
-{
-  /**
-   * Updates the view for the given accessible.
-   */
-  this.update = function textAttrsViewer_update(aAccessible)
-  {
-    if (!(aAccessible instanceof nsIAccessibleText))
-      return false;
-
-    // Default text attributes.
-    this.addAttributes(aAccessible.defaultTextAttributes,
-                       "textAttrs:default:treeBody");
-
-    // Generate text ranges.
-    var length = aAccessible.characterCount;
-    var offset = 0;
-    while (offset < length) {
-      const kHTMLNS = "http://www.w3.org/1999/xhtml";
-      var textRangeElm = document.createElementNS(kHTMLNS, "span");
-      textRangeElm.setAttribute("class", "textAttrsTextRange");
-
-      var endOffset = { };
-
-      textRangeElm.textAttrs =
-        aAccessible.getTextAttributes(false, offset, { }, endOffset);
-      textRangeElm.startOffset = offset;
-      textRangeElm.endOffset = endOffset.value;
-
-      var text = aAccessible.getText(offset, endOffset.value);
-      textRangeElm.textContent = text;
-
-      textRangeElm.addEventListener("focus", this, false);
-      textRangeElm.setAttribute("tabindex", 0);
-
-      document.getElementById("textAttrs:content").appendChild(textRangeElm);
-
-      offset = endOffset.value;
-    }
-
-    return true;
-  }
-
-  /**
-   * Clear the view's data.
-   */
-  this.clear = function textAttrsViewer_clear()
-  {
-    var content = document.getElementById("textAttrs:content");
-    while (content.hasChildNodes()) {
-      content.removeChild(content.lastChild);
-    }
-
-    var treeBody = document.getElementById("textAttrs:default:treeBody");
-    while (treeBody.hasChildNodes()) {
-      treeBody.removeChild(treeBody.lastChild);
-    }
-
-    document.getElementById("textAttrs:startOffset").textContent = "";
-    document.getElementById("textAttrs:endOffset").textContent = "";
-
-    treeBody = document.getElementById("textAttrs:treeBody");
-    while (treeBody.hasChildNodes()) {
-      treeBody.removeChild(treeBody.lastChild);
-    }
-  }
-
-  this.handleEvent = function textAttrsViewer_handleEvent(aEvent)
-  {
-    var treeBody = document.getElementById("textAttrs:treeBody");
-    while (treeBody.hasChildNodes()) {
-      treeBody.removeChild(treeBody.lastChild);
-    }
-
-    if (this.mLastElm) {
-      this.mLastElm.removeAttribute("selected");
-    }
-
-    this.mLastElm = aEvent.target;
-    this.mLastElm.setAttribute("selected", "true");
-
-    document.getElementById("textAttrs:startOffset").textContent =
-      this.mLastElm.startOffset;
-    document.getElementById("textAttrs:endOffset").textContent =
-      this.mLastElm.endOffset;
-
-    this.addAttributes(this.mLastElm.textAttrs, "textAttrs:treeBody");
-  }
-
-  this.addAttributes = function textAttrsViewer_addAttributes(aTextAttrs,
-                                                              aTreeID)
-  {
-    var enumerate = aTextAttrs.enumerate();
-    while (enumerate.hasMoreElements()) {
-      var prop = XPCU.QI(enumerate.getNext(), nsIPropertyElement);
-
-      var treeBody = document.getElementById(aTreeID);
-
-      var ti = document.createElement("treeitem");
-      var tr = document.createElement("treerow");
-
-      var tc = document.createElement("treecell");
-      tc.setAttribute("label", prop.key);
-      tr.appendChild(tc);
-
-      tc = document.createElement("treecell");
-      tc.setAttribute("label", prop.value);
-      tr.appendChild(tc);
-
-      ti.appendChild(tr);
-
-      treeBody.appendChild(ti);
-    }
-  }
-
-  this.mLastElm = null;
-}
-
-
-/**
- * Table cell property view. Used to display table cell properties of the
- * accessible implementing nsIAccessibleTableCell.
- */
-function tableCellViewer()
-{
-  /**
-   * Updates the view for the given accessible.
-   *
-   * @param aAccessible
-   *        The given accessible
-   */
-  this.update = function tableCellViewer_update(aAccessible)
-  {
-    if (!(aAccessible instanceof nsIAccessibleTableCell))
-      return false;
-
-    // columnIndex
-    var columnIndex = aAccessible.columnIndex;
-    this.columnIndexElm.textContent = columnIndex;
-
-    // rowIndex
-    var rowIndex = aAccessible.rowIndex;
-    this.rowIndexElm.textContent = rowIndex;
-
-    // columnExtent
-    var columnExtent = aAccessible.columnExtent;
-    this.columnExtentElm.textContent = columnExtent;
-    
-    // rowIndex
-    var rowExtent = aAccessible.rowExtent;
-    this.rowExtentElm.textContent = rowExtent;
-
-    // isSelected
-    var isSelected = aAccessible.isSelected();
-    this.isSelectedElm.textContent = isSelected;
-
-    // table, columnHeaderCells, rowHeaderCells
-    this.addRelated(aAccessible);
-
-    return true;
-  }
-
-  /**
-   * Clear the view's data.
-   */
-  this.clear = function tableCellViewer_clear()
-  {
-    this.mTreeBox.view = null;
-
-    this.columnIndexElm.textContent = "";
-    this.rowIndexElm.textContent = "";
-    this.columnExtentElm.textContent = "";
-    this.rowExtentElm.textContent = "";
-    this.isSelectedElm.textContent = "";
-  }
-
-  this.isCommandEnabled = function tableCellViewer_isCommandEnable(aCommand)
-  {
-    if (aCommand == "cmdEditInspectInNewWindow") {
-      return this.mTreeView.selection.count == 1;
-    }
-    return false;
-  },
-
-  /**
-   * Prepares 'inspectInNewView' command.
-   */
-  this.inspectInNewView = function tableCellViewer_inspectInNewView()
-  {
-    if (this.mTreeView.selection.count == 1) {
-      var minAndMax = {};
-      this.mTreeView.selection.getRangeAt(0, minAndMax, minAndMax);
-      var node = this.mTreeView.getDOMNode(minAndMax.value);
-      if (node) {
-        inspectObject(node);
-      }
-    }
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
-  //// private
-
-  this.addRelated = function tableCellViewer_addRelated(aAccessible)
-  {
-    this.mTreeView = new TableCellTreeView(aAccessible);
-    this.mTreeBox.view = this.mTreeView;
-  }
-
-  this.mTree = document.getElementById("tableCell:accObjects");
-  this.mTreeBox = this.mTree.treeBoxObject;
-
-  this.columnIndexElm = document.getElementById("tableCell:columnIndex");
-  this.rowIndexElm = document.getElementById("tableCell:rowIndex");
-  this.columnExtentElm = document.getElementById("tableCell:columnExtent");
-  this.rowExtentElm = document.getElementById("tableCell:rowExtent");
-  this.isSelectedElm = document.getElementById("tableCell:isSelected");
-}
-
-
-///////////////////////////////////////////////////////////////////////////////
-//// TableCellTreeView. nsITreeView
-
-function TableCellTreeView(aTableCell)
-{
-  this.tableCell = aTableCell;
-  this.mRowCount = this.getRowCount();
-}
-
-TableCellTreeView.prototype = new inBaseTreeView();
-
-TableCellTreeView.prototype.getRowCount =
-  function TableCellTreeView_rowCount()
-{
-  this.columnHeaderCells = this.tableCell.columnHeaderCells;
-  this.columnHeaderCellsLen = (this.columnHeaderCells ?
-                               this.columnHeaderCells.length : 0);
-
-  this.rowHeaderCells = this.tableCell.rowHeaderCells;
-  this.rowHeaderCellsLen = (this.rowHeaderCells ?
-                            this.rowHeaderCells.length : 0);
-
-  return 1 + this.columnHeaderCellsLen + this.rowHeaderCellsLen;
-}
-
-TableCellTreeView.prototype.getCellText =
-  function TableCellTreeView_getCellText(aRow, aCol)
-{
-  var accessible = this.getAccessible(aRow);
-  if (!accessible)
-    return "";
-
-  if (aCol.id == "tableCell:property") {
-    return this.getPropertyName(aRow);
-
-  } else if (aCol.id == "tableCell:role") {
-    return gAccService.getStringRole(accessible.role);
-
-  } else if (aCol.id == "tableCell:name") {
-    return accessible.name;
-
-  } else if (aCol.id == "tableCell:nodeName") {
-    var node = this.getDOMNode(aRow);
-    if (node)
-      return node.nodeName;
-  }
-
-  return "";
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// TableCellTreeView. Utils
-
-/**
- * Return an accessible for the given row index.
- *
- * @param aRow
- *        Row index
- */
-TableCellTreeView.prototype.getAccessible =
-  function TableCellTreeView_getAccessible(aRow)
-{
-  if (aRow == 0)
-    return this.tableCell.table;
-
-  if (aRow <= this.columnHeaderCellsLen)
-    return this.columnHeaderCells.queryElementAt(aRow - 1, nsIAccessible);
-
-  return this.rowHeaderCells.queryElementAt(aRow - 1 - this.columnHeaderCellsLen, nsIAccessible);
-}
-
-/**
- * Retrun interface attribute name (property) used at the given row index.
- *
- * @param aRow
- *        Row index
- */
-TableCellTreeView.prototype.getPropertyName =
-  function TableCellTreeView_getPropertyName(aRow)
-{
-  if (aRow == 0)
-    return "table";
-  
-  if (aRow <= this.columnHeaderCellsLen)
-    return "column header cell";
-  
-  return "row header cell";
-}
-
-/**
- * Return DOM node at the given row index.
- *
- * @param aRow
- *        Row index
- */
-TableCellTreeView.prototype.getDOMNode =
-  function TableCellTreeView_getDOMNode(aRow)
-{
-  var accessNode = QIAccessNode(this.getAccessible(aRow));
-  return accessNode && accessNode.DOMNode;
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.js b/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.js
+++ /dev/null
@@ -1,241 +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/. */
-
-/*****************************************************************************
-* AccessiblePropsViewer ------------------------------------------------------
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/events/ObserverManager.js
-*   chrome://inspector/content/jsutil/system/PrefUtils.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/xul/FrameExchange.js
-*****************************************************************************/
- 
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var gBundle;
-var gAccService = null;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
-const nsIAccessible = Components.interfaces.nsIAccessible;
-
-const nsIPropertyElement = Components.interfaces.nsIPropertyElement;
-
-/**
- * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
- * prior to Gecko13.
- */
-function QIAccessNode(aAccessible)
-{
-  return "nsIAccessNode" in Components.interfaces ?
-    XPCU.QI(aAccessible, Components.interfaces.nsIAccessNode) : aAccessible;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization/Destruction
-
-window.addEventListener("load", AccessiblePropsViewer_initialize, false);
-
-function AccessiblePropsViewer_initialize()
-{
-  gBundle = document.getElementById("accessiblePropsBundle");
-
-  viewer = new AccessiblePropsViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class AccessiblePropsViewer
-function AccessiblePropsViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-
-  gAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                nsIAccessibleRetrieval);
-}
-
-AccessiblePropsViewer.prototype =
-{
-  mSubject: null,
-  mPane: null,
-  mAccSubject: null,
-  mAccService: null,
-  mPropViewerMgr: null,
-
-  get uid() { return "accessibleProps" },
-  get pane() { return this.mPane },
-
-  get subject() { return this.mSubject },
-  set subject(aObject)
-  {
-    this.mSubject = aObject;
-    this.updateView();
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-  },
-
-  initialize: function initialize(aPane)
-  {
-    this.mPropViewerMgr = new accessiblePropViewerMgr(aPane);
-
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  isCommandEnabled: function isCommandEnabled(aCommand)
-  {
-    return this.mPropViewerMgr.isCommandEnabled(aCommand);
-  },
-  
-  getCommand: function getCommand(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditInspectInNewWindow":
-        return new cmdEditInspectInNewWindow(this.mPropViewerMgr);
-    }
-    return null;
-  },
-
-  destroy: function destroy() {},
-
-  /////////////////////////
-  //// event dispatching
-
-  addObserver: function addObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-  removeObserver: function removeObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  /////////////////////////
-  //// utils
-
-  doCommand: function doCommand(aCommandId)
-  {
-    this.mPropViewerMgr.doCommand(aCommandId);
-  },
-
-  // private
-  updateView: function updateView()
-  {
-    this.clearView();
-
-    this.mAccSubject = this.mSubject instanceof nsIAccessible ?
-      this.mSubject : gAccService.getAccessibleFor(this.mSubject);
-
-    // accessible properties.
-    var propContainer = document.getElementById("mainPropContainer");
-    var containers = propContainer.getElementsByAttribute("prop", "*");
-
-    for (var i = 0; i < containers.length; ++i) {
-      var value = "";
-      try {
-        var prop = containers[i].getAttribute("prop");
-        value = this[prop];
-      } catch (e) {
-        dump("Accessibility " + prop + " property is not available.\n");
-      }
-
-      if (value instanceof Array)
-        containers[i].value = value.join(", ");
-      else
-        containers[i].value = value;
-    }
-
-    this.mPropViewerMgr.updateViews(this.mAccSubject);
-  },
-
-  clearView: function clearView()
-  {
-    var containers = document.getElementsByAttribute("prop", "*");
-    for (var i = 0; i < containers.length; ++i)
-      containers[i].textContent = "";
-
-    this.mPropViewerMgr.clearViews();
-  },
-
-  get role()
-  {
-    // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
-    var role = "finalRole" in this.mAccSubject ?
-      this.mAccSubject.finalRole : this.mAccSubject.role;
-    return gAccService.getStringRole(role);
-  },
-
-  get name()
-  {
-    return this.mAccSubject.name;
-  },
-
-  get description()
-  {
-    return this.mAccSubject.description;
-  },
-
-  get value()
-  {
-    return this.mAccSubject.value;
-  },
-
-  get state()
-  {
-    var stateObj = {value: null};
-    var extStateObj = {value: null};
-
-    // Since Firefox 3.1 nsIAccessible::getFinalState has been renamed to
-    // nsIAccessible::getState.
-    if ("getState" in this.mAccSubject)
-      this.mAccSubject.getState(stateObj, extStateObj);
-    else
-      this.mAccSubject.getFinalState(stateObj, extStateObj);
-
-    var list = [];
-
-    var states = gAccService.getStringStates(stateObj.value,
-                                             extStateObj.value);
-
-    for (var i = 0; i < states.length; i++)
-      list.push(states.item(i));
-    return list;
-  },
-
-  get bounds()
-  {
-    var x = { value: 0 };
-    var y = { value: 0 };
-    var width = { value: 0 };
-    var height = { value: 0 };
-    this.mAccSubject.getBounds(x, y, width, height);
-
-    return gBundle.getFormattedString("accBounds",
-                                      [x.value, y.value,
-                                       width.value, height.value]);
-  }
-};
-
-function cmdEditInspectInNewWindow(aMgr)
-{
-  this.mPropViewerMgr = aMgr;
-}
-
-cmdEditInspectInNewWindow.prototype = new inBaseCommand();
-
-cmdEditInspectInNewWindow.prototype.doTransaction =
-  function InspectInNewWindow_DoTransaction()
-{
-  if (this.mPropViewerMgr) {
-    this.mPropViewerMgr.inspectInNewView();
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.xul b/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleProps/accessibleProps.xul
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleProps.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleProps/accessibleProps.css"?>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<page id="winAccessibleProps"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleProps/accessibleProps.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleProps/accessiblePropViewerMgr.js"/>
-
-  <stringbundle id="accessiblePropsBundle"
-                src="chrome://inspector/locale/viewers/accessibleProps.properties"/>
-
-  <commandset id="cmdsEditingExtras"/>
-
-  <popupset>
-    <menupopup id="popupContext">
-      <menuitem id="mnEditInspectInNewWindow"/>
-    </menupopup>
-  </popupset>
-
-  <grid id="mainPropContainer">
-    <columns>
-      <column/>
-      <column flex="1"/>
-    </columns>
-    <rows>
-      <row>
-        <description>&descRole.label;</description>
-        <textbox prop="role" readonly="true" class="plain"/>
-      </row>
-      <row>
-        <description>&descName.label;</description>
-        <textbox prop="name" readonly="true" class="plain"/>
-      </row>
-      <row>
-        <description>&descDescription.label;</description>
-        <textbox prop="description" readonly="true" class="plain"/>
-      </row>
-      <row>
-        <description>&descValue.label;</description>
-        <textbox prop="value" readonly="true" class="plain"/>
-      </row>
-      <row>
-        <description>&descState.label;</description>
-        <textbox prop="state" readonly="true" class="plain"/>
-      </row>
-      <row>
-        <description>&descBounds.label;</description>
-        <textbox prop="bounds" readonly="true" class="plain"/>
-      </row>
-    </rows>
-  </grid>
-
-  <tabbox id="tabviewers" flex="1">
-    <tabs>
-      <tab id="tab_attributes" label="&tabAttrs.label;"/>
-      <tab id="tab_actions" label="&tabActions.label;"/>
-      <tab id="tab_textattrs" label="&tabTextAttrs.label;"/>
-      <tab id="tab_tablecell" label="&tabTableCell.label;"/>
-    </tabs>
-    <tabpanels flex="1">
-
-      <!-- Object attributes tab panel -->
-      <tree>
-        <treecols>
-          <treecol label="&colAttrName.label;" flex="1"/>
-          <treecol label="&colAttrValue.label;" flex="2"/>
-        </treecols>
-        <treechildren id="trAttrBody"/>
-      </tree>
-
-      <!-- Action properties tab panel -->
-      <vbox id="actionTabPanel">
-        <grid>
-          <columns>
-            <column/>
-            <column flex="1"/>
-          </columns>
-          <rows id="actionItemContainer">
-            <row id="actionItem">
-              <description prop="actionIndex"/>
-              <vbox>
-                <hbox>
-                  <label value="&descName.label;"/>
-                  <description prop="actionName"/>
-                </hbox>
-                <hbox>
-                  <label value="&descDescription.label;"/>
-                  <description prop="actionDescription"/>
-                </hbox>
-                <hbox>
-                  <label value="&descKeyBindings.label;"/>
-                  <description prop="actionKeyBindings"/>
-                </hbox>
-                <button label="&descInvoke.label;"
-                        prop="invokeAction"/>
-              </vbox>
-            </row>
-          </rows>
-        </grid>
-      </vbox>
-
-      <!-- Text attributes -->
-      <vbox id="textAttrsTabPanel">
-        <label control="textAttrs:default:tree"
-               value="&descDefaultAttrs.label;"/>
-        <tree flex="1" id="textAttrs:default:tree">
-          <treecols>
-            <treecol label="&colAttrName.label;" flex="2"/>
-            <splitter class="tree-splitter"/>
-            <treecol label="&colAttrValue.label;" flex="4"/>
-          </treecols>
-          <treechildren id="textAttrs:default:treeBody"/>
-        </tree>
-
-        <description id="textAttrs:content"/>
-
-        <hbox>
-          <description>&descStartOffset.label;</description>
-          <description id="textAttrs:startOffset"/>
-          <description>&descEndOffset.label;</description>
-          <description id="textAttrs:endOffset"/>
-        </hbox>
-
-        <tree flex="1" id="textAttrs:tree">
-          <treecols>
-            <treecol label="&colAttrName.label;" flex="2"/>
-            <splitter class="tree-splitter"/>
-            <treecol label="&colAttrValue.label;" flex="4"/>
-          </treecols>
-          <treechildren id="textAttrs:treeBody"/>
-        </tree>
-      </vbox>
-
-      <!-- Table cell properties tab panel -->
-      <vbox>
-        <grid>
-          <columns>
-            <column/>
-            <column flex="1"/>
-            <column/>
-            <column flex="1"/>
-          </columns>
-          <rows>
-            <row>
-              <description>&descColumnIdx.label;</description>
-              <description id="tableCell:columnIndex"/>
-
-              <description>&descRowIdx.label;</description>
-              <description id="tableCell:rowIndex"/>
-            </row>
-            <row>
-              <description>&descColumnExtent.label;</description>
-              <description id="tableCell:columnExtent"/>
-
-              <description>&descRowExtent.label;</description>
-              <description id="tableCell:rowExtent"/>
-            </row>
-            <row>
-              <description>&descIsSelected.label;</description>
-              <description id="tableCell:isSelected"/>
-            </row>
-          </rows>
-        </grid>
-
-        <tree id="tableCell:accObjects"
-              flex="1"
-              context="popupContext"
-              onselect="viewer.pane.panelset.updateAllCommands();">
-
-          <treecols>
-            <treecol id="tableCell:property"
-                     primary="true"
-                     label="&colProp.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="tableCell:role"
-                     label="&colRole.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="tableCell:name"
-                     label="&colName.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="tableCell:nodeName"
-                     label="&colNodeName.label;"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-          </treecols>
-          <treechildren/>
-        </tree>
-      </vbox>
-    </tabpanels>
-  </tabbox>
-</page>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.js b/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.js
+++ /dev/null
@@ -1,256 +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/. */
-
-/***************************************************************
-* AccessibleRelationsViewer --------------------------------------------
-*  The viewer for the accessible relations for the inspected accessible.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-****************************************************************/
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var gAccService = null;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
-const nsIAccessibleRelation = Components.interfaces.nsIAccessibleRelation;
-const nsIAccessible = Components.interfaces.nsIAccessible;
-
-/**
- * Used for compatibility with Gecko versions prior to Gecko13.
- */
-const nsIAccessNode = Components.interfaces.nsIAccessNode || nsIAccessible;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization
-
-window.addEventListener("load", AccessibleRelationsViewer_initialize, false);
-
-function AccessibleRelationsViewer_initialize()
-{
-  gAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                nsIAccessibleRetrieval);
-
-  viewer = new AccessibleRelationsViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class AccessibleRelationsViewer
-
-function AccessibleRelationsViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-
-  this.mTree = document.getElementById("olAccessibleRelations");
-  this.mTreeBox = this.mTree.treeBoxObject;
-
-  this.mTargetsTree = document.getElementById("olAccessibleTargets");
-  this.mTargetsTreeBox = this.mTargetsTree.treeBoxObject;
-}
-
-AccessibleRelationsViewer.prototype =
-{
-  /////////////////////////
-  //// initialization
-
-  mSubject: null,
-  mPane: null,
-  mView: null,
-  mTargetsView: null,
-
-  /////////////////////////
-  //// interface inIViewer
-
-  get uid() { return "accessibleRelations"; },
-  get pane() { return this.mPane; },
-  get selection() { return this.mSelection; },
-
-  get subject() { return this.mSubject; },
-  set subject(aObject)
-  {
-    this.mView = new AccessibleRelationsView(aObject);
-    this.mTreeBox.view = this.mView;
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-  },
-
-  initialize: function initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function destroy()
-  {
-    this.mTreeBox.view = null;
-    this.mTargetsTreeBox.view = null;
-  },
-
-  isCommandEnabled: function isCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditInspectInNewWindow":
-        return !!this.getSelectedTargetDOMNode();
-    }
-    return false;
-  },
-
-  getCommand: function getCommand(aCommand)
-  {
-    if (aCommand in window) {
-      return new window[aCommand]();
-    }
-    return null;
-  },
-
-  /////////////////////////
-  //// event dispatching
-
-  addObserver: function addObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-  removeObserver: function removeObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  /////////////////////////
-  //// utils
-
-  onItemSelected: function onItemSelected()
-  {
-    var idx = this.mTree.currentIndex;
-    var relation = this.mView.getRelationObject(idx);
-    this.mTargetsView = new AccessibleTargetsView(relation);
-    this.mTargetsTreeBox.view = this.mTargetsView;
-  },
-
-  getSelectedTargetDOMNode: function getSelectedTargetDOMNode()
-  {
-    return this.mTargetsView.getSelectedDOMNode();
-  }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleRelationsView
-
-function AccessibleRelationsView(aObject)
-{
-  this.mAccessible = aObject instanceof nsIAccessible ?
-    aObject : gAccService.getAccessibleFor(aObject);
-
-  this.mRelations = this.mAccessible.getRelations();
-}
-
-AccessibleRelationsView.prototype = new inBaseTreeView();
-
-AccessibleRelationsView.prototype.__defineGetter__("rowCount",
-function rowCount()
-{
-  return this.mRelations.length;
-});
-
-AccessibleRelationsView.prototype.getRelationObject =
-function getRelationObject(aRow)
-{
-  return this.mRelations.queryElementAt(aRow, nsIAccessibleRelation);
-}
-
-AccessibleRelationsView.prototype.getCellText =
-function getCellText(aRow, aCol)
-{
-  if (aCol.id == "olcRelationType") {
-    var relation = this.getRelationObject(aRow);
-    if (relation)
-      return gAccService.getStringRelationType(relation.relationType);
-  }
-
-  return "";
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleTargetsView
-
-function AccessibleTargetsView(aRelation)
-{
-  this.mRelation = aRelation;
-  this.mTargets = this.mRelation.getTargets();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleTargetsView. nsITreeView
-
-AccessibleTargetsView.prototype = new inBaseTreeView();
-
-AccessibleTargetsView.prototype.__defineGetter__("rowCount",
-function rowCount()
-{
-  return this.mTargets.length;
-});
-
-AccessibleTargetsView.prototype.getCellText =
-function getCellText(aRow, aCol)
-{
-  if (aCol.id == "olcRole") {
-    var accessible = this.getAccessible(aRow);
-    if (accessible) {
-      // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
-      var role = "finalRole" in accessible ?
-        accessible.finalRole : accessible.role;
-      return gAccService.getStringRole(role);
-    }
-  } else if (aCol.id == "olcNodeName") {
-    var node = this.getDOMNode(aRow);
-    if (node)
-      return node.nodeName;
-  }
-
-  return "";
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleTargetsView. Utils
-
-AccessibleTargetsView.prototype.getAccessible =
-function getAccessible(aRow)
-{
-  return this.mTargets.queryElementAt(aRow, nsIAccessible);
-}
-
-AccessibleTargetsView.prototype.getDOMNode =
-function getDOMNode(aRow)
-{
-  var accessNode = this.mTargets.queryElementAt(aRow, nsIAccessNode);
-  return accessNode && accessNode.DOMNode;
-}
-
-AccessibleTargetsView.prototype.getSelectedDOMNode =
-  function getSelectedDOMNode()
-{
-  if (this.selection.count == 1) {
-    var rangeMinAndMax = {};
-    this.selection.getRangeAt(0, rangeMinAndMax, rangeMinAndMax);
-    return this.getDOMNode(rangeMinAndMax.value);
-  }
-  return null;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Transactions
-
-function cmdEditInspectInNewWindow() {
-  this.mObject = viewer.getSelectedTargetDOMNode();
-}
-
-cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.xul b/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleRelations/accessibleRelations.xul
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleRelations.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<page id="winAccessibleEvents"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleRelations/accessibleRelations.js"/>
-
-  <commandset id="cmdsEditingExtras"/>
-
-  <popupset>
-    <menupopup id="popupContext">
-      <menuitem id="mnEditInspectInNewWindow"/>
-    </menupopup>
-  </popupset>
-
-  <label control="olAccessibleRelations"
-         value="&relations.label;"/>
-
-  <tree id="olAccessibleRelations"
-        class="plain"
-        flex="1"
-        onselect="viewer.onItemSelected()">
-
-    <treecols>
-      <treecol id="olcRelationType"
-               label="&relationType.label;"
-               primary="true"
-               flex="1"
-               persist="width,hidden,ordinal"/>
-    </treecols>
-    <treechildren id="olbAccessibleRelations"
-                  alternatingbackground="true"/>
-  </tree>
-
-  <label control="olAccessibleTargets"
-         value="&relationTargets.label;"/>
-
-  <tree id="olAccessibleTargets"
-        class="plain"
-        flex="1"
-        context="popupContext"
-        onselect="viewer.pane.panelset.updateAllCommands();">
-
-    <treecols>
-      <treecol id="olcRole"
-               primary="true"
-               label="&role.label;"
-               persist="width,hidden,ordinal"
-               flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcNodeName"
-               label="&nodeName.label;"
-               persist="width,hidden,ordinal"
-               flex="1"/>
-    </treecols>
-    <treechildren id="olbAccessibleTargets"
-                  alternatingbackground="true"/>
-  </tree>
-
-</page>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.js b/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.js
+++ /dev/null
@@ -1,595 +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/. */
-
-/***************************************************************
-* AccessibleEventsViewer --------------------------------------------
-*  The viewer for the accessible tree of a document.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/hooks.js
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/events/ObserverManager.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/xul/FrameExchange.js
-****************************************************************/
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kObserverServiceCID = "@mozilla.org/observer-service;1";
-const kAccessibleRetrievalCID = "@mozilla.org/accessibleRetrieval;1";
-
-const nsIObserverService = Components.interfaces.nsIObserverService;
-
-const nsIAccessibleRetrieval = Components.interfaces.nsIAccessibleRetrieval;
-const nsIAccessibleEvent = Components.interfaces.nsIAccessibleEvent;
-const nsIAccessible = Components.interfaces.nsIAccessible;
-
-const nsIDOMNode = Components.interfaces.nsIDOMNode;
-
-/**
- * QI nsIAccessNode interface if any, used for compatibility with Gecko versions
- * prior to Gecko13.
- */
-function QIAccessNode(aAccessible)
-{
-  return "nsIAccessNode" in Components.interfaces ?
-    XPCU.QI(aAccessible, Components.interfaces.nsIAccessNode) : aAccessible;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization
-
-window.addEventListener("load", AccessibleTreeViewer_initialize, false);
-
-function AccessibleTreeViewer_initialize()
-{
-  viewer = new AccessibleTreeViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// AccessibleEventsViewer
-
-function AccessibleTreeViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-
-  this.mTree = document.getElementById("olAccessibleTree");
-  this.mOlBox = this.mTree.treeBoxObject;
-}
-
-AccessibleTreeViewer.prototype =
-{
-  //Initialization
-
-  mSubject: null,
-  mPane: null,
-  mView: null,
-
-  // interface inIViewer
-
-  get uid() { return "accessibleTree"; },
-  get pane() { return this.mPane; },
-  get selection() { return this.mSelection; },
-
-  get subject() { return this.mSubject; },
-  set subject(aObject)
-  {
-    this.mView = new inAccTreeView(aObject);
-    this.mOlBox.view = this.mView;
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-    this.mView.selection.select(0);
-  },
-
-  initialize: function initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function destroy()
-  {
-    this.mView.destroy();
-    this.mOlBox.view = null;
-  },
-
-  isCommandEnabled: function isCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditInspectInNewWindow":
-        return this.mTree.view.selection.count == 1;
-    }
-    return false;
-  },
-
-  getCommand: function getCommand(aCommand)
-  {
-    if (aCommand in window) {
-      return new window[aCommand]();
-    }
-    return null;
-  },
-
-  // event dispatching
-
-  addObserver: function addObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-  removeObserver: function removeObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  // UI commands
-  cmdEvalJS: function cmdEvalJS()
-  {
-    var sel = this.getSelectedAccessible();
-    if (sel) {
-      var win = openDialog("chrome://inspector/content/viewers/accessibleTree/evalJSDialog.xul", 
-                           "_blank", "chrome,resizable=yes", sel, this.mView);
-    }
-  },
-
-  // stuff
-
-  onItemSelected: function onItemSelected()
-  {
-    var idx = this.mTree.currentIndex;
-    this.mSelection = this.mView.getObject(idx);
-    this.mObsMan.dispatchEvent("selectionChange",
-                               { selection: this.mSelection } );
-
-    if (this.mSelection) {
-      var node = this.mSelection.DOMNode;
-      if (node.nodeType == nsIDOMNode.ELEMENT_NODE) {
-        var flasher = this.mPane.panelset.flasher;
-        flasher.flashElementOnSelect(node);
-      }
-    }
-
-    viewer.pane.panelset.updateAllCommands();
-  },
-
-  getSelectedAccessible: function getSelectedAccessible()
-  {
-    if (this.mTree.view.selection.count == 1) {
-      var rangeMinAndMax = {};
-      this.mTree.view.selection.getRangeAt(0, rangeMinAndMax, rangeMinAndMax);
-      return this.mView.getAccessible(rangeMinAndMax.value);
-    }
-    return null;
-  }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeView
-
-function inAccTreeView(aObject)
-{
-  this.mNodes = [];
-
-  this.mAccService = XPCU.getService(kAccessibleRetrievalCID,
-                                     nsIAccessibleRetrieval);
-
-  this.mAccessible = aObject instanceof nsIAccessible ?
-    aObject : this.mAccService.getAccessibleFor(aObject);
-
-  this.mObserverService = XPCU.getService(kObserverServiceCID,
-                                          nsIObserverService);
-
-  this.mObserverService.addObserver(this, "accessible-event", false);
-
-  var node = this.createNode(this.mAccessible);
-  this.mNodes.push(node);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeView. nsITreeView interface
-
-inAccTreeView.prototype = new inBaseTreeView();
-
-inAccTreeView.prototype.__defineGetter__("rowCount",
-function rowCount()
-{
-  return this.mNodes.length;
-});
-
-inAccTreeView.prototype.getCellText =
-function getCellText(aRow, aCol)
-{
-  var node = this.rowToNode(aRow);
-  if (!node)
-    return "";
-
-  var accessible = node.accessible;
-
-  if (aCol.id == "olcRole") {
-    // 'finalRole' is replaced by 'role' property in Gecko 1.9.2.
-    var role = "finalRole" in accessible ?
-      accessible.finalRole : accessible.role;
-    return this.mAccService.getStringRole(role);
-  }
-
-  if (aCol.id == "olcName")
-    return accessible.name;
-
-  if (aCol.id == "olcNodeName") {
-    var node = QIAccessNode(accessible).DOMNode;
-    return node ? node.nodeName : "";
-  }
-
-  return "";
-}
-
-inAccTreeView.prototype.isContainer =
-function isContainer(aRow)
-{
-  var node = this.rowToNode(aRow);
-  return node ? node.isContainer : false;
-}
-
-inAccTreeView.prototype.isContainerOpen =
-function isContainerOpen(aRow)
-{
-  var node = this.rowToNode(aRow);
-  return node ? node.isOpen : false;
-}
-
-inAccTreeView.prototype.isContainerEmpty =
-function isContainerEmpty(aRow)
-{
-  return !this.isContainer(aRow);
-}
-
-inAccTreeView.prototype.getLevel =
-function getLevel(aRow)
-{
-  var node = this.rowToNode(aRow);
-  return node ? node.level : 0;
-}
-
-inAccTreeView.prototype.getParentIndex =
-function getParentIndex(aRow)
-{
-  var node = this.rowToNode(aRow);
-  if (!node)
-    return -1;
-
-  var checkNode = null;
-  var i = aRow - 1;
-  do {
-    checkNode = this.rowToNode(i);
-    if (!checkNode)
-      return -1;
-
-    if (checkNode == node.parent)
-      return i;
-    --i;
-  } while (checkNode);
-
-  return -1;
-}
-
-inAccTreeView.prototype.hasNextSibling =
-function hasNextSibling(aRow, aAfterRow)
-{
-  var node = this.rowToNode(aRow);
-  return node && (node.next != null);
-}
-
-inAccTreeView.prototype.toggleOpenState =
-function toggleOpenState(aRow)
-{
-  var node = this.rowToNode(aRow);
-  if (!node)
-    return;
-
-  var oldCount = this.rowCount;
-  if (node.isOpen)
-    this.collapseNode(aRow);
-  else
-    this.expandNode(aRow);
-
-  this.mTree.invalidateRow(aRow);
-  this.mTree.rowCountChanged(aRow + 1, this.rowCount - oldCount);
-}
-
-inAccTreeView.prototype.getRowProperties =
-function getRowProperties(aRowIdx)
-{
-  var node = this.rowToNode(aRowIdx);
-  if (node && node.highlighted) {
-    return "highlight";
-  }
-
-  return "";
-}
-
-inAccTreeView.prototype.getCellProperties =
-function getCellProperties(aRowIdx, aCol)
-{
-  return this.getRowProperties(aRowIdx);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeView. Public.
-
-/**
- * Destroy the view.
- */
-inAccTreeView.prototype.destroy =
-function inAccTreeView_destroy()
-{
-  this.mObserverService.removeObserver(this, "accessible-event");
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeView. Tree utils.
-
-/**
- * Expands a tree node on the given row.
- *
- * @param aRow - row index.
- */
-inAccTreeView.prototype.expandNode =
-function expandNode(aRow)
-{
-  var node = this.rowToNode(aRow);
-  if (!node)
-    return;
-
-  var kids = node.accessible.children;
-  var kidCount = kids.length;
-
-  var newNode = null;
-  var prevNode = null;
-
-  for (var i = 0; i < kidCount; ++i) {
-    var accessible = kids.queryElementAt(i, nsIAccessible);
-    newNode = this.createNode(accessible, node);
-    this.mNodes.splice(aRow + i + 1, 0, newNode);
-
-    if (prevNode)
-      prevNode.next = newNode;
-    newNode.previous = prevNode;
-    prevNode = newNode;
-  }
-
-  node.isOpen = true;
-}
-
-/**
- * Collapse a tree node on the given row.
- *
- * @param aRow - row index.
- */
-inAccTreeView.prototype.collapseNode =
-function collapseNode(aRow)
-{
-  var node = this.rowToNode(aRow);
-  if (!node)
-    return;
-
-  var row = this.getLastDescendantOf(node, aRow);
-  this.mNodes.splice(aRow + 1, row - aRow);
-
-  node.isOpen = false;
-}
-
-/**
- * Expand the tree and highlight accessibles in the given subtree that comply
- * to filter function.
- *
- * @param aRoot - the root accessible of subtree to search in
- * @param aFilterFunc - a function that returns true if the passed accessible
-                        complies to search criteria.
- */
-inAccTreeView.prototype.search =
-function search(aRoot, aFilterFunc)
-{
-  QIAccessNode(aRoot);
-  if (aFilterFunc(aRoot)) {
-    let chain = [];
-    let parent = aRoot;
-    do {
-      chain.push(parent);
-      if (parent == aRoot.document)
-        break;
-
-      parent = parent.parent;
-    } while (parent);
-
-    let current = chain.pop();
-    for (let idx = 0; idx < this.mNodes.length; idx++) {
-      let node = this.mNodes[idx];
-      if (node.accessible == current) {
-        if (chain.length == 0) {
-          node.highlighted = true;
-          this.mTree.invalidateRow(idx);
-        } else {
-          if (!node.isOpen)
-            this.toggleOpenState(idx);
-
-          current = chain.pop();
-        }
-      }
-    }
-  }
-
-  var count = aRoot.childCount;
-  for (let idx = 0; idx < count; idx++) {
-    let child = aRoot.getChildAt(idx);
-    this.search(child, aFilterFunc);
-  }
-}
-
-/**
- * Clear search results.
- */
-inAccTreeView.prototype.clearSearch =
-function clearSearch()
-{
-  for (let idx = 0; idx < this.mNodes.length; idx++) {
-    if (this.mNodes[idx].highlighted) {
-      this.mNodes[idx].highlighted = false;
-      this.mTree.invalidateRow(idx);
-    }
-  }
-}
-
-
-/**
- * Create a tree node.
- *
- * @param aAccessible - an accessible object associated with created tree node.
- * @param aParent - parent tree node for the created tree node.
- * @retrurn - tree node object for the given accesible.
- */
-inAccTreeView.prototype.createNode =
-function createNode(aAccessible, aParent)
-{
-  var node = new inAccTreeViewNode(aAccessible);
-  node.level = aParent ? aParent.level + 1 : 0;
-  node.parent = aParent;
-  node.isContainer = aAccessible.children.length > 0;
-
-  return node;
-}
-
-/**
- * Return row index of the last node that is a descendant of the given node.
- * If there is no required node then return the given row.
- *
- * @param aNode - tree node for that last descedant is searched.
- * @param aRow - row index of the given tree node.
- */
-inAccTreeView.prototype.getLastDescendantOf =
-function getLastDescendantOf(aNode, aRow)
-{
-  var rowCount = this.rowCount;
-
-  var row = aRow + 1;
-  for (; row < rowCount; ++row) {
-    if (this.mNodes[row].level <= aNode.level)
-      return row - 1;
-  }
-
-  return rowCount - 1;
-}
-
-/**
- * Return a tree node by the given row.
- *
- * @param aRow - row index.
- */
-inAccTreeView.prototype.rowToNode =
-function rowToNode(aRow)
-{
-  if (aRow < 0 || aRow >= this.rowCount)
-    return null;
-
-  return this.mNodes[aRow];
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeView. Accessibility utils.
-
-/**
- * Return DOM node for an accessible or accessible if there is no associated
- * DOM node by the tree node pointed by the given row index.
- *
- * @param aRow - row index.
- */
-inAccTreeView.prototype.getObject =
-function getObject(aRow)
-{
-  var node = this.mNodes[aRow];
-  return node && QIAccessNode(node.accessible);
-}
-
-/**
- * Return accessible of the tree node pointed by the given
- * row index.
- *
- * @param aRow - the row index to get the accessible from.
- * @returns the accessible for the given index.
- */
-inAccTreeView.prototype.getAccessible =
-function getAccessible(aRow)
-{
-  var node = this.mNodes[aRow];
-  if (!node)
-    return null;
-
-  return node.accessible;
-}
-
-inAccTreeView.prototype.observe =
-function inAccTreeView_observe(aSubject, aTopic, aData)
-{
-  let event = XPCU.QI(aSubject, nsIAccessibleEvent);
-
-  // Update the children if they were changed.
-  if (event.eventType != nsIAccessibleEvent.EVENT_REORDER)
-    return;
-
-  var accessible = event.accessible;
-  if (!accessible)
-    return;
-
-  // Ignore the event if its target is from anther document.
-  var parentAccessible = accessible;
-  while (parentAccessible != this.mAccessible) {
-    parentAccessible = parentAccessible.parent;
-    if (!parentAccessible) {
-      return;
-    }
-  }
-
-  for (let idx = 0; idx < this.mNodes.length; idx++) {
-    let node = this.mNodes[idx];
-    if (node.accessible == accessible) {
-      if (node.isOpen) {
-        // Toggle open state twice to update the children.
-        this.toggleOpenState(idx);
-        this.toggleOpenState(idx);
-      }
-      break;
-    }
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// inAccTreeViewNode
-
-function inAccTreeViewNode(aAccessible)
-{
-  this.accessible = aAccessible;
-
-  this.parent = null;
-  this.next = null;
-  this.previous = null;
-
-  this.level = 0;
-  this.isOpen = false;
-  this.isContainer = false;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Transactions
-
-function cmdEditInspectInNewWindow()
-{
-  this.mObject = viewer.getSelectedAccessible();
-}
-
-cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.xul b/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleTree/accessibleTree.xul
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/accessibleTree.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css"?>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<page id="winAccessibleTree"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleTree/accessibleTree.js"/>
-
-  <commandset id="cmdsAccTreeViewer">
-    <command id="cmdEvalJS" oncommand="viewer.cmdEvalJS();"/>
-  </commandset>
-  <commandset id="cmdsEditingExtras"/>
-
-  <popupset>
-    <menupopup id="popupContext">
-      <menuitem id="mnEditInspectInNewWindow"/>
-      <menuseparator/>
-      <menuitem label="&evaluateJS.label;" observes="cmdEvalJS"/>
-    </menupopup>
-  </popupset>
-
-  <tree id="olAccessibleTree" class="plain" treelines="true" flex="1"
-        onselect="viewer.onItemSelected()"
-        context="popupContext">
-    <treecols>
-      <treecol id="olcRole"
-               label="&role.label;"
-               persist="width,hidden,ordinal"
-               primary="true"
-               flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcName"
-               label="&name.label;"
-               persist="width,hidden,ordinal"
-               flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcNodeName"
-               label="&nodeName.label;"
-               persist="width,hidden,ordinal"
-               flex="1"/>
-    </treecols>
-    <treechildren id="olbAccessibleTree"
-                  alternatingbackground="true"/>
-  </tree>
-
-</page>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.js b/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.js
+++ /dev/null
@@ -1,89 +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/. */
- 
-var gAcc = window.arguments[0];
-var gTreeView = window.arguments[1];
-
-var gInputArea = null;
-var gOutputArea = null;
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-
-function load()
-{
-  gInputArea = document.getElementById("JSInputArea");
-  gOutputArea = document.getElementById("JSOutputArea");
-}
-
-function closeDialog()
-{
-  gTreeView.clearSearch();
-}
- 
-function execute()
-{
-  if (!gAcc)
-    return;
-
-  for (var idx = 0; idx < gAccInterfaces.length; idx++) {
-    if (gAcc instanceof gAccInterfaces[idx])
-      gAcc.QueryInterface(gAccInterfaces[idx]);
-  }
-
-  gOutputArea.value = "";
-
-  var expr = gInputArea.value;
-  try {
-    var f = Function("accessible", "tree", expr);
-    var result = f(gAcc, gTreeView);
-  } catch (ex) {
-      output(ex);
-  }
-}
-
-var gAccInterfaces =
-[
-  Ci.nsIAccessible,
-  Ci.nsIAccessibleDocument,
-  Ci.nsIAccessibleEditableText,
-  Ci.nsIAccessibleHyperLink,
-  Ci.nsIAccessibleHyperText,
-  Ci.nsIAccessibleImage,
-  Ci.nsIAccessibleSelectable,
-  Ci.nsIAccessibleTable,
-  Ci.nsIAccessibleTableCell,
-  Ci.nsIAccessibleText,
-  Ci.nsIAccessibleValue
-];
-
-// Used for compatibility with Gecko versions prior to Gecko13.
-if ("nsIAccessNode" in Ci)
-  gAccInterfaces.push(Ci.nsIAccessNode);
-
-function output(aValue)
-{
-  gOutputArea.value += aValue;
-}
-
-function outputTextAttrs(aAccessible, aOffset)
-{
-  if (aAccessible instanceof Ci.nsIAccessibleText) {
-    var startOffsetObj = {}, endOffsetObj = {};
-    var attrs = aAccessible.getTextAttributes(false, aOffset,
-                                              startOffsetObj, endOffsetObj);
-    if (attrs) {
-      var str = "Start offset: " + startOffsetObj.value;
-      str += ", end offset: " + endOffsetObj.value + "\nText attributes:\n";
-
-      var enumerator = attrs.enumerate();
-      while (enumerator.hasMoreElements()) {
-        var prop = enumerator.getNext().QueryInterface(Ci.nsIPropertyElement);
-        str += "\t" + prop.key + ": " + prop.value + ";\n";
-      }
-
-      output(str);
-    }
-  }
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.xul b/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/accessibleTree/evalJSDialog.xul
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE dialog [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/viewers/accessibleTreeEvalJSDialog.dtd"> %dtd1;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin"?>
-
-<dialog id="winEvalJS"
-        title="&evaluateDialog.title;"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        buttons="accept, extra1"
-        buttonlabelextra1="&btnEvaluateJS.label;"
-        buttonaccesskeyextra1="&btnEvaluateJS.accesskey;"
-        ondialogextra1="return execute();"
-        style="width: 30em;"
-        onload="load();"
-        ondialogaccept="closeDialog();">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/accessibleTree/evalJSDialog.js"/>
-
-  <label control="JSInputArea"
-         accesskey="&txtInputArea.accesskey;">&txtInputArea.label;</label>
-  <textbox id="JSInputArea"
-           flex="1"
-           multiline="true"
-           rows="10"/>
-
-  <label control="JSOutputArea"
-         value="&txtOutputArea.label;"
-         accesskey="&txtOutputArea.accesskey;"/>
-  <textbox id="JSOutputArea"
-           flex="1"
-           multiline="true"
-           readonly="true"
-           rows="8"/>
-
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.js b/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.js
+++ /dev/null
@@ -1,244 +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/. */
-
-/***************************************************************
-* BoxModelViewer --------------------------------------------
-*  The viewer for the boxModel and visual appearance of an element.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var viewer;
-
-//////////// global constants ////////////////////
-
-const kIMPORT_RULE = Components.interfaces.nsIDOMCSSRule.IMPORT_RULE;
-
-//////////////////////////////////////////////////
-
-window.addEventListener("load", BoxModelViewer_initialize, false);
-
-function BoxModelViewer_initialize()
-{
-  viewer = new BoxModelViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-////////////////////////////////////////////////////////////////////////////
-//// class BoxModelViewer
-
-function BoxModelViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-}
-
-BoxModelViewer.prototype = 
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-  
-  mSubject: null,
-  mPane: null,
-  
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  get uid() { return "boxModel" },
-  get pane() { return this.mPane },
-
-  get subject() { return this.mSubject },
-  set subject(aObject) 
-  {
-    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
-      aObject : aObject.DOMNode;
-    this.showStats();
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  initialize: function(aPane)
-  {
-    this.initGroups();
-
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  groupPosition:  {},
-  groupDimension: {},
-  groupMargin:    {},
-  groupBorder:    {},
-  groupPadding:   {},
-
-  initGroups: function()
-  {
-    this.groupPosition.x =    document.getElementById("positionXValue");
-    this.groupPosition.y =    document.getElementById("positionYValue");
-    this.groupPosition.screenX =
-                              document.getElementById("positionScreenXValue");
-    this.groupPosition.screenY =
-                              document.getElementById("positionScreenYValue");
-
-    this.groupDimension.width  =
-                              document.getElementById("dimensionWidthValue");
-    this.groupDimension.height =
-                              document.getElementById("dimensionHeightValue");
-
-    this.groupMargin.top =    document.getElementById("marginTopValue");
-    this.groupMargin.right =  document.getElementById("marginRightValue");
-    this.groupMargin.bottom = document.getElementById("marginBottomValue");
-    this.groupMargin.left =   document.getElementById("marginLeftValue");
-
-    this.groupBorder.top =    document.getElementById("borderTopValue");
-    this.groupBorder.right =  document.getElementById("borderRightValue");
-    this.groupBorder.bottom = document.getElementById("borderBottomValue");
-    this.groupBorder.left =   document.getElementById("borderLeftValue");
-
-    this.groupPadding.top =    document.getElementById("paddingTopValue");
-    this.groupPadding.right =  document.getElementById("paddingRightValue");
-    this.groupPadding.bottom = document.getElementById("paddingBottomValue");
-    this.groupPadding.left =   document.getElementById("paddingLeftValue");
-  },
-
-  destroy: function()
-  {
-  },
-
-  isCommandEnabled: function(aCommand)
-  {
-    return false;
-  },
-  
-  getCommand: function(aCommand)
-  {
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// event dispatching
-
-  addObserver: function(aEvent, aObserver) { this.mObsMan.addObserver(aEvent, aObserver); },
-  removeObserver: function(aEvent, aObserver) { this.mObsMan.removeObserver(aEvent, aObserver); },
-  
-  ////////////////////////////////////////////////////////////////////////////
-  //// statistical updates
-  
-  showStats: function()
-  {
-    this.showPositionStats();
-    this.showDimensionStats();
-    this.showMarginStats();
-    this.showBorderStats();
-    this.showPaddingStats();
-  },
-  
-  showStatistic: function(aElement,  aSize)
-  {
-    if (aSize == null) {
-        aSize = "";
-    }
-    var str = aSize.toString();
-    aElement.setAttribute("value", str);
-
-    var nonzero = aSize != 0 && str.indexOf("0px");
-    aElement.setAttribute("class", nonzero ? "plain nonzero" : "plain");
-
-    aElement.setAttribute("size", str.length + 1);
-  },
-  
-  showPositionStats: function()
-  {
-    var group = this.groupPosition;
-    if ("boxObject" in this.mSubject) { // xul elements
-      var bx = this.mSubject.boxObject;
-      this.showStatistic(group.x, bx.x);
-      this.showStatistic(group.y, bx.y);
-      this.showStatistic(group.screenX, bx.screenX);
-      this.showStatistic(group.screenY, bx.screenY);
-      group.screenX.parentNode.hidden = false;
-      group.screenY.parentNode.hidden = false;
-    } else { // html elements
-      this.showStatistic(group.x, this.mSubject.offsetLeft);
-      this.showStatistic(group.y, this.mSubject.offsetTop);
-      group.screenX.parentNode.hidden = true;
-      group.screenY.parentNode.hidden = true;
-    }
-  },
-  
-  showDimensionStats: function()
-  {
-    var group = this.groupDimension;
-    if ("boxObject" in this.mSubject) { // xul elements
-      var bx = this.mSubject.boxObject;
-      this.showStatistic(group.width,  bx.width);
-      this.showStatistic(group.height, bx.height);
-    } else { // html elements
-      this.showStatistic(group.width,  this.mSubject.offsetWidth);
-      this.showStatistic(group.height, this.mSubject.offsetHeight);
-    }
-  },
-
-  getSubjectComputedStyle: function()
-  {
-    var view = this.mSubject.ownerDocument.defaultView;
-    return view.getComputedStyle(this.mSubject, "");
-  },
-
-  showMarginStats: function()
-  {
-    var style = this.getSubjectComputedStyle();
-    var data = [this.readMarginStyle(style, "top"), this.readMarginStyle(style, "right"), 
-                this.readMarginStyle(style, "bottom"), this.readMarginStyle(style, "left")];
-    this.showSideStats(this.groupMargin, data);
-  },
-
-  showBorderStats: function()
-  {
-    var style = this.getSubjectComputedStyle();
-    var data = [this.readBorderStyle(style, "top"), this.readBorderStyle(style, "right"), 
-                this.readBorderStyle(style, "bottom"), this.readBorderStyle(style, "left")];
-    this.showSideStats(this.groupBorder, data);
-  },
-
-  showPaddingStats: function()
-  {
-    var style = this.getSubjectComputedStyle();
-    var data = [this.readPaddingStyle(style, "top"), this.readPaddingStyle(style, "right"), 
-                this.readPaddingStyle(style, "bottom"), this.readPaddingStyle(style, "left")];
-    this.showSideStats(this.groupPadding, data);
-  },
-
-  showSideStats: function(aGroup, aData)
-  {
-    this.showStatistic(aGroup.top,    aData[0]);
-    this.showStatistic(aGroup.right,  aData[1]);
-    this.showStatistic(aGroup.bottom, aData[2]);
-    this.showStatistic(aGroup.left,   aData[3]);
-  },
-  
-  readMarginStyle: function(aStyle, aSide)
-  {
-    return aStyle.getPropertyCSSValue("margin-"+aSide).cssText;
-  },
-  
-  readPaddingStyle: function(aStyle, aSide)
-  {
-    return aStyle.getPropertyCSSValue("padding-"+aSide).cssText;
-  },
-  
-  readBorderStyle: function(aStyle, aSide)
-  {
-    var style = aStyle.getPropertyCSSValue("border-"+aSide+"-style").cssText;
-    if (!style || !style.length) {
-      return "none";
-    } else {
-      return aStyle.getPropertyCSSValue("border-"+aSide+"-width").cssText + " " + 
-             style + " " +
-             aStyle.getPropertyCSSValue("border-"+aSide+"-color").cssText;
-    }
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.xul b/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/boxModel/boxModel.xul
+++ /dev/null
@@ -1,176 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/boxModel.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/boxModel/boxModel.css"?>
-<?xul-overlay href="chrome://global/content/globalOverlay.xul"?>
-
-<page id="winBoxModel"
-      orient="vertical"
-      xmlns:html="http://www.w3.org/1999/xhtml"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <script type="application/javascript" src="chrome://inspector/content/viewers/boxModel/boxModel.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>  
-
-  <vbox id="enclosingBox" flex="1">
-    <vbox>
-
-      <groupbox id="boxPosition">
-        <caption><label>&boxPosition.label;</label>
-        </caption>
-        <grid flex="1">
-          <columns>
-            <column/>
-            <column class="value-column"/>
-          </columns>
-          <rows>
-            <row>
-              <label id="positionXLabel" value="&xCoord.label;" class="title"/>
-              <textbox id="positionXValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="positionYLabel" value="&yCoord.label;" class="title"/>
-              <textbox id="positionYValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="positionScreenXLabel" value="&screenXCoord.label;"
-                     class="title"/>
-              <textbox id="positionScreenXValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="positionScreenYLabel" value="&screenYCoord.label;"
-                     class="title"/>
-              <textbox id="positionScreenYValue" readonly="true" class="plain"/>
-            </row>
-          </rows>
-        </grid>
-      </groupbox>
-
-      <groupbox id="boxDimension">
-        <caption><label>&boxDimension.label;</label>
-        </caption>
-        <grid flex="1">
-          <columns>
-            <column/>
-            <column class="value-column"/>
-          </columns>
-          <rows>
-            <row>
-              <label id="dimensionWidthLabel" value="&dimensionWidth.label;"
-                     class="title"/>
-              <textbox id="dimensionWidthValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="dimensionHeightLabel" value="&dimensionHeight.label;"
-                     class="title"/>
-              <textbox id="dimensionHeightValue" readonly="true" class="plain"/>
-            </row>
-          </rows>
-        </grid>
-      </groupbox>
-
-      <groupbox id="boxMargin">
-        <caption><label>&boxMargin.label;</label>
-        </caption>
-        <grid flex="1">
-          <columns>
-            <column/>
-            <column class="value-column"/>
-          </columns>
-          <rows>
-            <row>
-              <label id="marginTopLabel" value="margin-top" class="title"/>
-              <textbox id="marginTopValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="marginRightLabel" value="margin-right" class="title"/>
-              <textbox id="marginRightValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="marginBottomLabel" value="margin-bottom"
-                     class="title"/>
-              <textbox id="marginBottomValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="marginLeftLabel" value="margin-left" class="title"/>
-              <textbox id="marginLeftValue" readonly="true" class="plain"/>
-            </row>
-          </rows>
-        </grid>
-      </groupbox>
-
-      <groupbox id="boxBorder">
-        <caption><label>&boxBorder.label;</label>
-        </caption>
-        <grid flex="1">
-          <columns>
-            <column/>
-            <column class="value-column" flex="1"/>
-          </columns>
-          <rows>
-            <row>
-              <label id="borderTopLabel" value="border-top" class="title"/>
-              <textbox id="borderTopValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="borderRightLabel" value="border-right" class="title"/>
-              <textbox id="borderRightValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="borderBottomLabel" value="border-bottom"
-                     class="title"/>
-              <textbox id="borderBottomValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="borderLeftLabel" value="border-left" class="title"/>
-              <textbox id="borderLeftValue" readonly="true" class="plain"/>
-            </row>
-          </rows>
-        </grid>
-      </groupbox>
-
-      <groupbox id="boxPadding">
-        <caption><label>&boxPadding.label;</label>
-        </caption>
-        <grid flex="1">
-          <columns>
-            <column/>
-            <column class="value-column"/>
-          </columns>
-          <rows>
-            <row>
-              <label id="paddingTopLabel" value="padding-top" class="title"/>
-              <textbox id="paddingTopValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="paddingRightLabel" value="padding-right"
-                     class="title"/>
-              <textbox id="paddingRightValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="paddingBottomLabel" value="padding-bottom"
-                     class="title"/>
-              <textbox id="paddingBottomValue" readonly="true" class="plain"/>
-            </row>
-            <row>
-              <label id="paddingLeftLabel" value="padding-left" class="title"/>
-              <textbox id="paddingLeftValue" readonly="true" class="plain"/>
-            </row>
-          </rows>
-        </grid>
-      </groupbox>
-
-    </vbox>
-  </vbox>
-
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.js b/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.js
+++ /dev/null
@@ -1,197 +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/. */
-
-/*****************************************************************************
-* ComputedStyleViewer --------------------------------------------------------
-*  The viewer for the computed CSS styles on a DOM element.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/events/ObserverManager.js
-*   chrome://inspector/content/commands/baseCommands.js
-*   chrome://inspector/content/system/clipboardFlavors.js
-*   chrome://inspector/content/xul/inBaseTreeView.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", ComputedStyleViewer_initialize, false);
-
-function ComputedStyleViewer_initialize()
-{
-  viewer = new ComputedStyleViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// class ComputedStyleViewer
-
-function ComputedStyleViewer()
-{
-  this.mObsMan = new ObserverManager(this);
-  this.mURL = window.location;
-
-  this.mTree = document.getElementById("olStyles");
-}
-
-//XXX Don't use anonymous functions
-ComputedStyleViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPane: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  get uid()
-  {
-    return "computedStyle";
-  },
-
-  get pane()
-  {
-    return this.mPane;
-  },
-
-  get subject()
-  {
-    return this.mSubject;
-  },
-
-  set subject(aObject)
-  {
-    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
-      aObject : aObject.DOMNode;
-
-    var bo = this.mTree.treeBoxObject;
-    var firstVisibleRow = -1;
-    var selectedIndices;
-    var currentIndex;
-    if (this.mTreeView) {
-      firstVisibleRow = bo.getFirstVisibleRow();
-      selectedIndices = this.mTreeView.getSelectedIndices();
-      currentIndex = this.mTreeView.selection.currentIndex;
-    }
-
-    this.mTreeView = new ComputedStyleView(this.mSubject);
-    this.mTree.view = this.mTreeView;
-
-    if (firstVisibleRow >= 0) {
-      bo.beginUpdateBatch();
-      try {
-        bo.scrollToRow(firstVisibleRow);
-        let selection = this.mTreeView.selection;
-        for (let i = 0, n = selectedIndices.length; i < n; ++i) {
-          selection.toggleSelect(selectedIndices[i]);
-        }
-        selection.currentIndex = currentIndex;
-      }
-      catch (ex) {
-        Components.utils.reportError(ex);
-      }
-      bo.endUpdateBatch();
-    }
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  initialize: function CSVr_Initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function CSVr_Destroy()
-  {
-    // We need to remove the view at this time or else it will attempt to
-    // re-paint while the document is being deconstructed, resulting in some
-    // nasty XPConnect assertions
-    this.mTree.view = null;
-  },
-
-  isCommandEnabled: function CSVr_IsCommandEnabled(aCommand)
-  {
-    if (aCommand == "cmdEditCopy") {
-      return this.mTree.view.selection.count > 0;
-    }
-    return false;
-  },
-
-  getCommand: function CSVr_GetCommand(aCommand)
-  {
-    if (aCommand == "cmdEditCopy") {
-      return new cmdEditCopy(this.mTreeView.getSelectedRowObjects());
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// event dispatching
-
-  addObserver: function CSVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function CSVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Miscellaneous
-
-  onItemSelected: function CSVr_OnItemSelected()
-  {
-    // This will (eventually) call isCommandEnabled on Copy
-    viewer.pane.panelset.updateAllCommands();
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////
-//// ComputedStyleView
-
-function ComputedStyleView(aObject)
-{
-  var view = aObject.ownerDocument.defaultView;
-  this.mStyleList = view.getComputedStyle(aObject, "");
-  this.mRowCount = this.mStyleList.length;
-}
-
-ComputedStyleView.prototype = new inBaseTreeView();
-
-ComputedStyleView.prototype.getCellText = function CSV_GetCellText(aRow, aCol)
-{
-  var prop = this.mStyleList.item(aRow);
-  if (aCol.id == "olcStyleName") {
-    return prop;
-  }
-  else if (aCol.id == "olcStyleValue") {
-    return this.mStyleList.getPropertyValue(prop);
-  }
-
-  return null;
-}
-
-/**
-  * Returns a CSSProperty for the row in the tree corresponding to the passed
-  * index.
-  * @param aIndex
-  *        index of the row in the tree
-  * @return a CSSProperty
-  */
-ComputedStyleView.prototype.getRowObjectFromIndex =
-  function CSV_GetRowObjectFromIndex(aIndex)
-{
-  var prop = this.mStyleList.item(aIndex);
-  return new CSSProperty(prop, this.mStyleList.getPropertyValue(prop));
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.xul b/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/computedStyle/computedStyle.xul
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/computedStyle.dtd"> %dtd2;
-]>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-
-<page id="winComputedStyle"
-      orient="vertical"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/computedStyle/computedStyle.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
-
-  <commandset id="cmdsEditing"/>
-
-  <popupset id="psPopups">
-    <menupopup id="ppComputedStyleContext">
-      <menuitem id="mnEditCopy"/>
-    </menupopup>
-  </popupset>
-
-  <tree id="olStyles" flex="1" onselect="viewer.onItemSelected()"
-        class="plain" contextmenu="ppComputedStyleContext">
-    <treecols>
-      <treecol id="olcStyleName" label="&propertyName.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcStyleValue" label="&propertyValue.label;" flex="1"/>
-    </treecols>
-    <treechildren id="olbStyles" alternatingbackground="true"/>
-  </tree>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/FindDialog.js b/suite/extensions/inspector/resources/content/viewers/dom/FindDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/FindDialog.js
+++ /dev/null
@@ -1,144 +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/. */
-
-/***************************************************************
-* FindDialog ---------------------------------------------------
-*  Controls the dialog box used for searching the DOM.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/rdf/RDFU.js
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var dialog;
-
-//////////// global constants ////////////////////
-
-//////////////////////////////////////////////////
-
-window.addEventListener("load", FindDialog_initialize, false);
-
-function FindDialog_initialize()
-{
-  dialog = new FindDialog();
-}
-
-////////////////////////////////////////////////////////////////////////////
-//// class FindDialog
-
-function FindDialog()
-{
-  this.setDirection(window.arguments[1] ? window.arguments[1] : "down");
-  if (window.arguments[2]) {
-    this.setValue(window.arguments[2][0], window.arguments[2][1])
-  }
-  this.toggleType(window.arguments[0] ? window.arguments[0] : "id");
-  this.mOpener = window.opener.viewer;
-  
-  var txf = document.getElementById("tfText1");
-  txf.select();
-  txf.focus();
-}
-
-FindDialog.prototype = 
-{
-  mType: null,
-
-  ////////// Properties
-
-
-  ////////// Methods
-
-  doFind: function()
-  {
-    var el = document.getElementById("tfText1");
-    var dir = document.getElementById("rgDirection").value;
-    if (this.mType == "id") {
-      this.mOpener.startFind("id", dir, el.value);
-    } else if (this.mType == "tag") {
-      this.mOpener.startFind("tag", dir, el.value);
-    } else if (this.mType == "attr") {
-      var el2 = document.getElementById("tfText2");
-      this.mOpener.startFind("attr", dir, el.value, el2.value);
-    }
-  },
-
-  toggleType: function(aType)
-  {
-    this.mType = aType;
-
-    if (aType == "id") {
-      this.showDirection(false);
-      this.setLabel1(0);
-      this.showRow2(false);
-    } else if (aType == "tag") {
-      this.showDirection(true);
-      this.setLabel1(1);
-      this.showRow2(false);
-    } else if (aType == "attr") {
-      this.showDirection(true);
-      this.setLabel1(2);
-      this.showRow2(true);
-    }
-
-    var rd = document.getElementById("rdType_"+aType.toLowerCase());
-    if (rd) {
-      var rg = document.getElementById("rgType");
-      rg.selectedItem = rd;
-    }
-
-  },
-
-  setLabel1: function(aIndex)
-  {
-    var deck = document.getElementById("rwRow1Text");
-    
-    // We want to add a control attribute to the selected label so that 
-    // accessibility aids can get the textbox's label.
-    // Remove the control attribute from the old panel.
-    deck.selectedPanel.removeAttribute("control");
-
-    deck.selectedIndex = aIndex;
-    // Add the control attribute to the new panel.
-    deck.selectedPanel.control = "tfText1";
-  },
-
-  showRow2: function(aTruth)
-  {
-    var row = document.getElementById("rwRow2");
-    row.setAttribute("hide", !aTruth);
-  },
-  
-  setDirection: function(aMode)
-  {
-    var rd = document.getElementById("rdDir_"+aMode.toLowerCase());
-    if (rd) {
-      var rg = document.getElementById("rgDirection");
-      rg.selectedItem = rd;
-    }
-  },
-  
-  setValue: function(aValue1, aValue2)
-  {
-    var txf;
-    if (aValue1) {
-      txf = document.getElementById("tfText1");
-      txf.value = aValue1;
-    }
-    if (aValue2) {
-      txf = document.getElementById("tfText2");
-      txf.value = aValue2;
-    }
-  },
-  
-  showDirection: function(aTruth)
-  {
-    document.getElementById("rdDir_up").disabled = !aTruth;
-    document.getElementById("rdDir_down").disabled = !aTruth;
-  }
-
-};
-
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.js b/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.js
+++ /dev/null
@@ -1,219 +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/. */
-
-/***************************************************************
-* ColumnsDialog --------------------------------------------
-*  Dialog box for editing the columns in the DOM Viewer tree.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var dialog;
-
-var gColumnTitles = [
-  "nodeName",
-  "nodeValue",
-  "nodeType",
-  "prefix",
-  "localName",
-  "namespaceURI"
-];
-
-//////////// global constants ////////////////////
-
-//////////////////////////////////////////////////
-
-window.addEventListener("load", ColumnsDialog_initialize, false);
-window.addEventListener("unload", ColumnsDialog_destroy, false);
-
-function ColumnsDialog_initialize()
-{
-  dialog = new ColumnsDialog();
-  dialog.initialize();
-}
-
-function ColumnsDialog_destroy()
-{
-  dialog.destroy();
-}
-
-////////////////////////////////////////////////////////////////////////////
-//// class ColumnsDialog
-
-function ColumnsDialog()
-{
-  this.mViewer = window.arguments[0];
-  this.mColBoxHash = {};
-}
-
-ColumnsDialog.prototype = 
-{
-  mBox: null,
-  mDraggingBox: null,
-  
-  get box() { return this.mBox },
-  
-  initialize: function()
-  {
-    // bug 56270 - dragSession.sourceDocument is null --
-    // causes me to code this very temporary, very nasty hack
-    // to make sure I get notified when a column is dropped
-    opener.viewer.mDOMTree.onClientDrop = ColumnsDialogDropOut;
-    
-    this.buildContents();
-    
-    // notify the dom viewer that we've opened
-    this.mViewer.onColumnsDialogReady(this);
-  },
-  
-  destroy: function()
-  {
-    // notify the dom viewer that we're going away
-    this.mViewer.onColumnsDialogClose(this);
-  },
-  
-  buildContents: function()
-  {
-    var box = document.getElementById("bxColumns");
-    this.mBox = box;
-    
-    // create the special attribute box
-    var item = this.createAttrItem();
-    box.appendChild(item);
-    
-    // add all boxes except those that are already
-    // in the viewer
-    for (var i = 0; i < gColumnTitles.length; ++i)
-      if (!this.mViewer.hasColumn(gColumnTitles[i])) {
-        this.addItem(gColumnTitles[i]);
-      }  
-  },
-  
-  addItem: function(aValue)
-  {
-    if (!aValue || aValue.charAt(0) == "@") 
-      return null;
-      
-    item = this.createItem(aValue);
-    this.mColBoxHash[aValue] = item;
-    if (item) {
-      this.mBox.appendChild(item);
-      window.sizeToContent();
-    }
-  },
-  
-  removeItem: function(aValue)
-  {
-    if (!aValue || aValue.charAt(0) == "@")
-      return null;
-      
-    var colBox = this.mColBoxHash[aValue];
-    if (!colBox._isAttrCol) {
-      this.mBox.removeChild(colBox);
-      window.sizeToContent();
-    }
-  },
-  
-  createItem: function(aValue)
-  {
-    var text = document.createElementNS(kXULNSURI, "text");
-    text._ColValue = aValue;
-    text._isColBox = true;
-    text._isAttrCol = false;
-    text.setAttribute("class", "column-selector");
-    text.setAttribute("value", aValue);
-
-    return text;
-  },
-  
-  createAttrItem: function(aValue)
-  {
-    var box = document.createElementNS(kXULNSURI, "box");
-    box._isColBox = true;
-    box._isAttrCol = true;
-    box.setAttribute("class", "column-selector");
-    box.setAttribute("align", "center");
-
-    var text = document.createElementNS(kXULNSURI, "text");
-    text.setAttribute("value", "Attr");
-    box.appendChild(text);
-
-    var txf = document.createElementNS(kXULNSURI, "textbox");
-    txf.setAttribute("class", "attr-column-selector");
-    txf.setAttribute("flex", 1);
-    box.appendChild(txf);
-
-    return box;
-  },
-    
-  ////////////////////////////////////////////////////////////////////////////
-  //// Drag and Drop
-
-  onDragStart: function(aEvent)
-  {
-    var box = this.getBoxTarget(aEvent.target);
-    this.setDraggingBox(box);
-    if (!box) return false;
-    
-    var column = this.getColumnValue(box);
-    if (!column) return false;
-    
-    DNDUtils.invokeSession(aEvent.target, ["TreeBuilder/column-add"], [column]);
-    
-    return false;
-  },
-  
-  onDropOut: function()
-  {
-    var box = document.getElementById("bxColumns");
-    var value =  this.mDraggingBox._ColValue;
-    this.setDraggingBox(null);
-    this.removeItem(value);
-  },
-  
-  onDropIn: function(aEvent)
-  {
-    var data = DNDUtils.getData("TreeBuilder/column-remove", 0);
-    var string = XPCU.QI(data, "nsISupportsString");
-    this.addItem(string.data);
-  },
-
-  setDraggingBox: function(aBox)
-  {
-    if (this.mDraggingBox) {
-      this.mDraggingBox.removeAttribute("col-dragging");
-    }
-
-    this.mDraggingBox = aBox;
-
-    if (aBox)
-      aBox.setAttribute("col-dragging", "true");
-  },
-  
-  getBoxTarget: function(aNode)
-  {
-    var node = aNode;
-    while (node && !node._isColBox)
-      node = node.parentNode;
-    return node;
-  },
-  
-  getColumnValue: function(aColBox)
-  {
-    if (aColBox._isAttrCol) {
-      var txf = aColBox.getElementsByTagName("textbox")[0];
-      return "@" + txf.value;
-    } else {
-      return aColBox._ColValue;
-    }
-  }
-
-};
-
-function ColumnsDialogDropOut()
-{
-  dialog.onDropOut();
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.xul b/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/columnsDialog.xul
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE window SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/columnsDialog.css" type="text/css"?>
-
-<window id="winEditCols" class="color-dialog" 
-        title="&ColumnsDialog.title;"
-        persist="screenX screenY"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/columnsDialog.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/inTreeBuilder.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xul/DNDUtils.js"/>
-
-  <vbox id="bxColumns" flex="1"
-    ondrop="dialog.onDropIn(event);"
-    ondragstart="dialog.onDragStart(event);"/>
-</window>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/commandOverlay.xul b/suite/extensions/inspector/resources/content/viewers/dom/commandOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/commandOverlay.xul
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd1;
-]>
-
-<overlay id="ovDOMViewerCommands"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <commandset id="cmdsGlobalCommands">
-    <command id="cmd:selectByClick" viewer="dom"
-             oncommand="inspector.getViewer('dom').selectByClick()"/>
-
-    <command id="cmd:find" viewer="dom"
-             oncommand="inspector.getViewer('dom').showFindDialog()"/>
-
-    <command id="cmd:findAgain" viewer="dom"
-             oncommand="inspector.getViewer('dom').findNext()"/>
-
-    <command id="cmd:toggleAnon" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleAnonContent()"/>
-
-    <command id="cmd:toggleSubDocs" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleSubDocs()"/>
-
-    <command id="cmd:toggleAccessibleNodes" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleAccessibleNodes();"/>
-
-    <command id="cmd:toggleWhitespaceNodes" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleWhitespaceNodes()"/>
-
-    <command id="cmd:toggleProcessingInstructions" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleProcessingInstructions()"/>
-
-    <command id="cmd:toggleAttributes" viewer="dom"
-             oncommand="inspector.getViewer('dom').toggleAttributes()"/>
-  </commandset>
-
-</overlay>
-
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/dom.js b/suite/extensions/inspector/resources/content/viewers/dom/dom.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/dom.js
+++ /dev/null
@@ -1,2272 +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/. */
-
-/*****************************************************************************
-* DOMViewer ------------------------------------------------------------------
-*  Views all nodes within a document.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://global/content/XPCNativeWrapper.js
-*   chrome://inspector/content/hooks.js
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/events/ObserverManager.js
-*   chrome://inspector/content/jsutil/system/PrefUtils.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/xul/FrameExchange.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kDOMViewClassID             = "@mozilla.org/inspector/dom-view;1";
-const kPromptServiceClassID       = "@mozilla.org/embedcomp/prompt-service;1";
-const kAccessibleRetrievalClassID = "@mozilla.org/accessibleRetrieval;1";
-const kDOMUtilsClassID            = "@mozilla.org/inspector/dom-utils;1";
-const kDeepTreeWalkerClassID      = "@mozilla.org/inspector/deep-tree-walker;1";
-const nsIDOMNode                  = Components.interfaces.nsIDOMNode;
-const nsIDOMElement               = Components.interfaces.nsIDOMElement;
-const nsIDOMDocument              = Components.interfaces.nsIDOMDocument;
-const nsIDOMCharacterData         = Components.interfaces.nsIDOMCharacterData;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", DOMViewer_initialize, false);
-window.addEventListener("unload", DOMViewer_destroy, false);
-
-function DOMViewer_initialize()
-{
-  viewer = new DOMViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-function DOMViewer_destroy()
-{
-  PrefUtils.removeObserver("inspector", PrefChangeObserver);
-  viewer.removeClickListeners();
-  viewer = null;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// class DOMViewer
-
-function DOMViewer() // implements inIViewer
-{
-  this.mObsMan = new ObserverManager(this);
-
-  this.mDOMUtils = XPCU.getService(kDOMUtilsClassID, "inIDOMUtils");
-
-  this.mDOMTree = document.getElementById("trDOMTree");
-  this.mDOMTreeBody = document.getElementById("trDOMTreeBody");
-
-  // prepare and attach the DOM DataSource
-  this.mDOMView = XPCU.createInstance(kDOMViewClassID, "inIDOMView");
-  this.mDOMView.showSubDocuments = true;
-  // hide attribute nodes
-  this.mDOMView.whatToShow &= ~(NodeFilter.SHOW_ATTRIBUTE);
-  this.mDOMTree.treeBoxObject.view = this.mDOMView;
-
-  PrefUtils.addObserver("inspector", PrefChangeObserver);
-}
-
-DOMViewer.prototype =
-{
-  mSubject: null,
-  mDOMView: null,
-  // searching stuff
-  mFindResult: null,
-  mColumns: null,
-  mFindDir: null,
-  mFindParams: null,
-  mFindType: null,
-  mFindWalker: null,
-  mSelecting: false,
-
-  mSelectionBatchNest: 0,
-  mPendingSelection: null,
-
-  /**
-   * Prevent the viewer from dispatching selectionChange events while batches
-   * are underway.  The last change in selection while disabled is remembered,
-   * however, and when all batches have ended, an event is dispatched for it.
-   * To prevent this pending selectionChange from being dispatched, set
-   * mPendingSelection to null before calling endSelectionBatch.
-   *
-   * Nested batches are permitted.
-   */
-  beginSelectionBatch: function DVr_BeginSelectionBatch()
-  {
-    ++this.mSelectionBatchNest;
-  },
-
-  endSelectionBatch: function DVr_EndSelectionBatch()
-  {
-    --this.mSelectionBatchNest;
-    if (this.mSelectionBatchNest < 0) {
-      Components.utils.reportError("Attempted to end a selection batch " +
-                                   "that doesn't exist");
-    }
-    else if (!this.mSelectionBatchNest && this.mPendingSelection) {
-      this.changeSelection(this.mPendingSelection);
-      this.mPendingSelection = null;
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  //// attributes
-
-  get uid() {
-    return "dom"
-  },
-
-  get pane() {
-    return this.mPanel
-  },
-
-  get editable() {
-    return true;
-  },
-
-  get selection() {
-    return this.mSelection
-  },
-
-  get subject() {
-    return this.mSubject
-  },
-
-  set subject(aObject) {
-    this.mSubject = aObject;
-    this.mDOMView.rootNode = aObject;
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-    this.setInitialSelection(aObject);
-  },
-
-  //// methods
-
-  /**
-   * Properly sets up the DOM Viewer
-   *
-   * @param aPane
-   *        The panel this references.
-   */
-  initialize: function DVr_initialize(aPane)
-  {
-    this.mPanel = aPane;
-
-    this.setAnonContent(PrefUtils.getPref("inspector.dom.showAnon"));
-    this.setProcessingInstructions(
-      PrefUtils.getPref("inspector.dom.showProcessingInstructions")
-    );
-    this.setAccessibleNodes(
-      PrefUtils.getPref("inspector.dom.showAccessibleNodes")
-    );
-    this.setWhitespaceNodes(
-      PrefUtils.getPref("inspector.dom.showWhitespaceNodes")
-    );
-
-    this.pane.panelset.addTransactionListener(this);
-
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function DVr_Destroy()
-  {
-    this.mDOMTree.treeBoxObject.view = null;
-    this.pane.panelset.removeTransactionListener(this);
-  },
-
-  isCommandEnabled: function DVr_IsCommandEnabled(aCommand)
-  {
-    // NB: Don't confuse selected nodes and currentNode.  currentNode derives
-    // from currentIndex.  Think of currentIndex like the position of the
-    // cursor in a textbox.  Commands like Copy need text to be selected,
-    // while Paste and Insert need no selection, only that the cursor be in
-    // the area we're interested in.
-    // XXX Bring all commands around to handling multiple selection.
-    var clipboardNode = null;
-    var currentNode = null;
-    var parentNode = null;
-    var selectedNode = this.selectedNode;
-    if (/^cmdEditPaste/.test(aCommand)) {
-      if (this.mPanel.panelset.clipboardFlavor != "inspector/dom-node") {
-        return false;
-      }
-      clipboardNode = this.mPanel.panelset.getClipboardData();
-    }
-    if (/^cmdEdit(Paste|Insert)/.test(aCommand)) {
-      currentNode =
-        viewer.currentNode && new XPCNativeWrapper(viewer.currentNode);
-      parentNode = currentNode && currentNode.parentNode;
-    }
-    switch (aCommand) {
-      case "cmdEditPaste":
-      case "cmdEditPasteBefore":
-        // Paste before and after, like Insert, don't operate on a selection,
-        // but the other paste commands do.
-        return this.isValidChild(parentNode, clipboardNode);
-      case "cmdEditPasteReplace":
-        return !!selectedNode &&
-               this.isValidChild(parentNode, clipboardNode, selectedNode);
-      case "cmdEditPasteFirstChild":
-      case "cmdEditPasteLastChild":
-        return this.isValidChild(selectedNode, clipboardNode);
-      case "cmdEditPasteAsParent":
-        return !!selectedNode &&
-               this.isValidChild(clipboardNode, selectedNode) &&
-               this.isValidChild(parentNode, clipboardNode, selectedNode);
-      case "cmdEditInsertAfter":
-      case "cmdEditInsertBefore":
-      	return parentNode instanceof nsIDOMElement;
-      case "cmdEditInsertFirstChild":
-      case "cmdEditInsertLastChild":
-      	return selectedNode instanceof nsIDOMElement;
-      case "cmdEditCut":
-      case "cmdEditCopy":
-        return !!selectedNode;
-      case "cmdEditDelete":
-        // If at least one of the selected nodes can be deleted, allow it.
-        let selectedNodes = this.getSelectedNodes();
-        for (let i = 0, n = selectedNodes.length; i < n; ++i) {
-          if (cmdEditDelete.isDeletable(selectedNodes[i])) {
-            return true;
-          }
-        }
-        return false;
-      case "cmdInspectBrowser":
-        if (!(selectedNode instanceof nsIDOMElement)) {
-          return false;
-        }
-        let n = selectedNode.localName.toLowerCase();
-        return n == "tabbrowser" || n == "browser" || n == "iframe" ||
-               n == "frame" || n == "editor";
-      case "cmdBlink":
-        return selectedNode instanceof nsIDOMElement;
-      case "cmdCopyXML":
-      case "cmdShowPseudoClasses":
-        return true;
-      case "cmdEditInspectInNewWindow":
-        return this.mDOMTree.view.selection.count == 1;
-    }
-    return false;
-  },
-
- /**
-  * Determines whether the passed parent/child combination is valid.
-  * @param parent
-  * @param child
-  * @param replaced
-  *        the node the child is replacing (optional)
-  * @return whether the passed parent can have the passed child as a child,
-  */
-  isValidChild: function DVr_IsValidChild(parent, child, replaced)
-  {
-    // the document (fragment) node must be an only child and can't be
-    // replaced
-    if (parent == null) {
-      return false;
-    }
-    // the only types that can ever have children
-    if (parent.nodeType != nsIDOMNode.ELEMENT_NODE &&
-        parent.nodeType != nsIDOMNode.DOCUMENT_NODE &&
-        parent.nodeType != nsIDOMNode.DOCUMENT_FRAGMENT_NODE) {
-
-      return false;
-    }
-    // the only types that can't ever be children
-    if (child.nodeType == nsIDOMNode.DOCUMENT_NODE ||
-        child.nodeType == nsIDOMNode.DOCUMENT_FRAGMENT_NODE ||
-        child.nodeType == nsIDOMNode.ATTRIBUTE_NODE) {
-
-      return false;
-    }
-    // doctypes can only be the children of documents
-    if (child.nodeType == nsIDOMNode.DOCUMENT_TYPE_NODE &&
-        parent.nodeType != nsIDOMNode.DOCUMENT_NODE) {
-
-      return false;
-    }
-    // only elements and fragments can have text, cdata, and entities as
-    // children
-    if (parent.nodeType != nsIDOMNode.ELEMENT_NODE &&
-        parent.nodeType != nsIDOMNode.DOCUMENT_FRAGMENT_NODE &&
-        (child.nodeType == nsIDOMNode.TEXT_NODE ||
-         child.nodeType == nsIDOMNode.CDATA_NODE ||
-         child.nodeType == nsIDOMNode.ENTITY_NODE)) {
-
-      return false;
-    }
-    // documents can only have one document element or doctype
-    if (parent.nodeType == nsIDOMNode.DOCUMENT_NODE &&
-        (child.nodeType == nsIDOMNode.ELEMENT_NODE ||
-         child.nodeType == nsIDOMNode.DOCUMENT_TYPE_NODE) &&
-        (!replaced || child.nodeType != replaced.nodeType)) {
-
-      for (var i = 0; i < parent.childNodes.length; i++) {
-        if (parent.childNodes[i].nodeType == child.nodeType) {
-          return false;
-        }
-      }
-    }
-    return true;
-  },
-
-  getCommand: function DVr_GetCommand(aCommand)
-  {
-    if (aCommand in window) {
-      try {
-        return new window[aCommand]();
-      }
-      catch (ex) {
-        // User canceled the transaction.
-      }
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// nsITransactionListener implementation
-
-  willDo: function DVr_WillDo(aManager, aTransaction)
-  {
-    var command = aTransaction.wrappedJSObject;
-    if (command instanceof cmdEditDelete) {
-      let nodes = command.nodes;
-      let deletables = [];
-      for (let i = 0, n = nodes.length; i < n; ++i) {
-        let node = nodes[i];
-        if (cmdEditDelete.isDeletable(node)) {
-          deletables.push(node);
-        }
-      }
-
-      // Save the currentNode and the linked pane's current subject, but
-      // don't overwrite them on redo.
-      if (!("oldCurrentNode" in command)) {
-        command.oldCurrentNode = this.currentNode;
-        command.oldLinkedSubject = this.mSelection;
-      }
-
-      if (cmdEditDelete.isDeletable(this.mSelection)) {
-        command.newLinkedSubject =
-          this.getNextInNextBestChain(this.mSelection, undefined,
-                                      function DVr_WillDo_Filter(aNode)
-                                      {
-                                        return deletables.indexOf(aNode) >= 0;
-                                      });
-      }
-    }
-  },
-
-  didDo: function DVr_DidDo(aManager, aTransaction, aResult)
-  {
-    var command = aTransaction.wrappedJSObject;
-    if (command instanceof cmdEditDelete) {
-      if (!("newLinkedSubject" in command)) {
-        // The linked panel's old subject wasn't deletable, but the
-        // transaction went through because other selected nodes were.  Leave
-        // things alone and let the linked subject and any other non-deletable
-        // nodes remain selected.
-        return;
-      }
-      let newLinkedSubject = command.newLinkedSubject;
-      let selection = this.mDOMTree.view.selection;
-      if (selection.count > 0) {
-        // There are still some nodes selected (because they weren't
-        // deletable).  newLinkedSubject should be one of them.
-        let idx = this.getRowIndexFromNode(newLinkedSubject);
-        if (!selection.isSelected(idx)) {
-          debug("node chosen for new linked subject was apparently deletable");
-          return;
-        }
-        this.changeSelection(newLinkedSubject);
-      }
-      else {
-        this.showNodeInTree(newLinkedSubject);
-      }
-    }
-  },
-
-  willUndo: stubImpl,
-
-  didUndo: function DVr_DidUndo(aManager, aTransaction, aResult)
-  {
-    var command = aTransaction.wrappedJSObject;
-    if (command instanceof cmdEditDelete) {
-      // Find all "deleted" rows and select them, even any that weren't
-      // deletable.  We also want currentNode and mSelection to reflect the
-      // values they had before this transaction.
-      let nodes = command.nodes;
-      if (!nodes.length) {
-        return;
-      }
-
-      // Disable selectionChange events, because otherwise the linked pane's
-      // viewers will be flipping around, which is also computational overhead
-      // that we just don't need.
-      this.mDOMTree.treeBoxObject.beginUpdateBatch();
-      this.beginSelectionBatch();
-
-      this.mDOMTree.view.selection.clearSelection();
-      for (let i = nodes.length - 1; i >= 0; --i) {
-        this.showNodeInTree(nodes[i], true);
-      }
-      this.changeSelection(command.oldLinkedSubject);
-      this.mDOMTree.currentIndex =
-        this.getRowIndexFromNode(command.oldCurrentNode);
-
-      this.endSelectionBatch();
-      this.mDOMTree.treeBoxObject.endUpdateBatch();
-    }
-  },
-
-  willRedo: function DVr_WillRedo(aManager, aTransaction)
-  {
-    var command = aTransaction.wrappedJSObject;
-    if (command instanceof cmdEditDelete) {
-      this.willDo(aManager, aTransaction);
-    }
-  },
-
-  didRedo: function DVr_DidRedo(aManager, aTransaction, aResult)
-  {
-    var command = aTransaction.wrappedJSObject;
-    if (command instanceof cmdEditDelete) {
-      this.didDo(aManager, aTransaction, aResult);
-    }
-  },
-
-  willBeginBatch: stubImpl,
-
-  didBeginBatch: stubImpl,
-
-  willEndBatch: stubImpl,
-
-  didEndBatch: stubImpl,
-
-  willMerge: stubImpl,
-
-  didMerge: stubImpl,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function DVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function DVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// UI Commands
-
-  showFindDialog: function DVr_ShowFindDialog()
-  {
-    var win =
-      openDialog("chrome://inspector/content/viewers/dom/findDialog.xul",
-                 "_blank", "chrome,dependent", this.mFindType, this.mFindDir,
-                 this.mFindParams);
-  },
-
-  /**
-   * Toggles the setting for displaying anonymous content.
-   */
-  toggleAnonContent: function DVr_ToggleAnonContent()
-  {
-    var value = PrefUtils.getPref("inspector.dom.showAnon");
-    PrefUtils.setPref("inspector.dom.showAnon", !value);
-  },
-
-  /**
-   * Sets the UI and filters for anonymous content.
-   *
-   * @param aValue
-   *        The value that we should be setting things to.
-   */
-  setAnonContent: function DVr_SetAnonContent(aValue)
-  {
-    this.mDOMView.showAnonymousContent = aValue;
-    this.mPanel.panelset.setCommandAttribute("cmd:toggleAnon", "checked",
-                                             aValue);
-  },
-
-  toggleSubDocs: function DVr_ToggleSubDocs()
-  {
-    var val = !this.mDOMView.showSubDocuments;
-    this.mDOMView.showSubDocuments = val;
-    this.mPanel.panelset.setCommandAttribute("cmd:toggleSubDocs", "checked",
-                                             val);
-  },
-
-  /**
-   * Toggles the visibility of Processing Instructions.
-   */
-  toggleProcessingInstructions: function DVr_ToggleProcessingInstructions()
-  {
-    var value = PrefUtils.getPref("inspector.dom.showProcessingInstructions");
-    PrefUtils.setPref("inspector.dom.showProcessingInstructions", !value);
-  },
-
-  /**
-   * Sets the visibility of Processing Instructions.
-   *
-   * @param aValue
-   *        The visibility of the instructions.
-   */
-  setProcessingInstructions: function DVr_SetProcessingInstructions(aValue)
-  {
-    this.mPanel.panelset
-      .setCommandAttribute("cmd:toggleProcessingInstructions", "checked",
-                           aValue);
-    if (aValue) {
-      this.mDOMView.whatToShow |= NodeFilter.SHOW_PROCESSING_INSTRUCTION;
-    }
-    else {
-      this.mDOMView.whatToShow &= ~NodeFilter.SHOW_PROCESSING_INSTRUCTION;
-    }
-  },
-
-  /**
-   * Toggle state of 'Show Accessible Nodes' option.
-   */
-  toggleAccessibleNodes: function DVr_ToggleAccessibleNodes()
-  {
-    var value = PrefUtils.getPref("inspector.dom.showAccessibleNodes");
-    PrefUtils.setPref("inspector.dom.showAccessibleNodes", !value);
-  },
-
-  /**
-   * Set state of 'Show Accessible Nodes' option.
-   *
-   * @param aValue
-   *        if true then accessible nodes will be shown
-   */
-  setAccessibleNodes: function DVr_SetAccessibleNodes(aValue)
-  {
-    if (!(kAccessibleRetrievalClassID in Components.classes)) {
-      aValue = false;
-    }
-
-    this.mDOMView.showAccessibleNodes = aValue;
-    this.mPanel.panelset.setCommandAttribute("cmd:toggleAccessibleNodes",
-                                             "checked", aValue);
-  },
-
-  /**
-   * Return state of 'Show Accessible Nodes' option.
-   */
-  getAccessibleNodes: function DVr_GetAccessibleNodes()
-  {
-    return this.mDOMView.showAccessibleNodes;
-  },
-
-  /**
-   * Toggles the value for whitespace nodes.
-   */
-  toggleWhitespaceNodes: function DVr_ToggleWhitespaceNodes()
-  {
-    var value = PrefUtils.getPref("inspector.dom.showWhitespaceNodes");
-    PrefUtils.setPref("inspector.dom.showWhitespaceNodes", !value);
-  },
-
-  /**
-   * Sets the UI for displaying whitespace nodes.
-   *
-   * @param aValue
-   *        true if whitespace nodes should be shown
-   */
-  setWhitespaceNodes: function DVr_SetWhitespaceNodes(aValue)
-  {
-    this.mPanel.panelset.setCommandAttribute("cmd:toggleWhitespaceNodes",
-                                             "checked", aValue);
-    this.mDOMView.showWhitespaceNodes = aValue;
-  },
-
-  showColumnsDialog: function DVr_ShowColumnsDialog()
-  {
-    var win =
-      openDialog("chrome://inspector/content/viewers/dom/columnsDialog.xul",
-                 "_blank", "chrome,dependent", this);
-  },
-
-  cmdShowPseudoClasses: function DVr_CmdShowPseudoClasses()
-  {
-    var node = this.selectedNode;
-
-    if (node) {
-      openDialog("chrome://inspector/content/viewers/dom/" +
-                   "pseudoClassDialog.xul",
-                 "_blank", "chrome", node);
-    }
-  },
-
-  cmdBlink: function DVr_CmdBlink()
-  {
-    this.flashElement(this.selectedNode);
-  },
-
-  onTreeSelectionChange: function DVr_OnTreeSelectionChange()
-  {
-    // NB: We're called on deselection, too.
-    var currentIndex = this.mDOMTree.currentIndex;
-    var currentNode = this.currentNode;
-
-    if (this.mDOMTree.view.selection.isSelected(currentIndex)) {
-      this.changeSelection(currentNode);
-    }
-    // Otherwise, we were deselected.  We only care, though, if we're the
-    // object viewer's subject, and there are other nodes selected.  (If no
-    // nodes are selected, we'll leave mSelection alone and won't fire any
-    // events, because nobody wants to inspect null.)
-    else if (this.mSelection == currentNode &&
-             this.mDOMTree.view.selection.count) {
-      // Find closest nearby selected node and use that.
-      var nearestSelectedIndex =
-        InsUtil.getNearestIndex(currentIndex, this.getSelectedIndexes());
-      this.changeSelection(this.getNodeFromRowIndex(nearestSelectedIndex));
-    }
-
-    viewer.pane.panelset.updateAllCommands();
-  },
-
-  /**
-   * Change the viewer selection.  Note that "selection" here refers to the
-   * (not formalized) inIViewer::selection, *not* the tree selection.  See
-   * bug 570879.
-   * @param aNode
-   *        The new viewer selection.  If there is an object panel linked to
-   *        ours, this will be used for its subject.
-   */
-  changeSelection: function DVr_ChangeSelection(aNode)
-  {
-    if (this.mSelectionBatchNest) {
-      this.mPendingSelection = aNode;
-    }
-    else {
-      this.mSelection = aNode;
-      this.mObsMan.dispatchEvent("selectionChange", { selection: aNode } );
-      if (this.mSelection) {
-        this.flashElement(this.mSelection, true);
-      }
-    }
-  },
-
-  setInitialSelection: function DVr_SetInitialSelection(aObject)
-  {
-    var fireSelected = this.mDOMTree.currentIndex == 0;
-
-    if (this.mPanel.params) {
-      this.showNodeInTree(this.mPanel.params);
-    }
-    else {
-      this.showNodeInTree(aObject, false, true);
-    }
-
-    if (fireSelected) {
-      this.onTreeSelectionChange();
-    }
-  },
-
-  onPopupShowing: function DVr_OnPopupShowing(aPopup)
-  {
-    if (aPopup.id != "ppDOMContext") {
-      // This is a nested menupopup, and it should have been already taken
-      // care of.
-      return;
-    }
-    this.checkMenu(aPopup);
-  },
-
-  /**
-   * Recursively enable/disable descendants of a given popup, based on whether
-   * their commands are enabled or disabled.  If the descendant has a
-   * checkvalid attribute, the descendant will be hidden as well as disabled.
-   * Recursively checked menus will be enabled or disabled depending on
-   * whether there are one or more enabled children in their respective
-   * menupopups.
-   * @param aPopup
-   *        The menupopup at which to start checking.
-   * @return true if the popup contains any enabled items
-   */
-  checkMenu: function DVr_CheckMenu(aPopup) {
-    // We can't use XBL getters/setters here, because we're using recursion,
-    // and items in nested menus won't have CSS frames since they're not
-    // visible.
-    var hasEnabledItems = false;
-    for (let i = 0; i < aPopup.childNodes.length; ++i) {
-      let el = aPopup.childNodes[i];
-      if (el.localName == "menuseparator") {
-        continue;
-      }
-      let subject = el;
-      let isEnabled = false;
-      let checkValid = false;
-      if (el.hasAttribute("command")) {
-        let cmd = document.getElementById(el.getAttribute("command"));
-        if (cmd) {
-          checkValid = el.hasAttribute("checkvalid");
-          isEnabled = this.isCommandEnabled(cmd.id);
-          subject = cmd;
-        }
-      }
-      else if (el.localName == "menu") {
-        let kid = el.firstChild;
-        while (kid) {
-          if (kid.localName == "menupopup") {
-            // Disable this menu if none of the descendants are enabled.
-            isEnabled = this.checkMenu(kid);
-            break;
-          }
-          kid = kid.nextSibling;
-        }
-      }
-      else if (el.getAttribute("disabled") != "true") {
-        // There is no command here.  (Maybe we're being extended?)  We'll
-        // leave it up to third parties to manage enabling/disabling their own
-        // menuitems, and assume that they already reflect the correct state
-        // by the time we're called.
-        isEnabled = true;
-      }
-
-      if (isEnabled) {
-        hasEnabledItems = true;
-        subject.removeAttribute("disabled");
-      }
-      else {
-        subject.setAttribute("disabled", "true");
-      }
-
-      if (checkValid) {
-        el.hidden = !isEnabled;
-      }
-    }
-
-    return hasEnabledItems;
-  },
-
-  cmdInspectBrowser: function DVr_CmdInspectBrowser()
-  {
-    var node = this.selectedNode;
-    var n = node && node.localName.toLowerCase();
-    if (n == "iframe" || n == "frame" ||
-        (node.namespaceURI == kXULNSURI && (n == "browser" ||
-                                            n == "tabbrowser" ||
-                                            n == "editor"))) {
-      this.pane.subject = node.contentDocument;
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// XML Serialization
-
-  cmdCopySelectedXML: function DVr_CmdCopySelectedXML()
-  {
-    var node = this.selectedNode;
-    if (node) {
-      var xml = this.toXML(node);
-
-      var helper = XPCU.getService(kClipboardHelperClassID,
-                                   "nsIClipboardHelper");
-      helper.copyString(xml);
-    }
-  },
-
-  toXML: function DVr_ToXML(aNode)
-  {
-    return (new XMLSerializer()).serializeToString(aNode);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Click Selection
-
-  selectByClick: function DVr_SelectByClick()
-  {
-    if (this.mSelecting) {
-      this.stopSelectByClick();
-      this.removeClickListeners();
-    }
-    else {
-      // wait until after user releases the mouse after selecting this command
-      // from a UI element
-      window.setTimeout("viewer.startSelectByClick()", 10);
-    }
-  },
-
-  startSelectByClick: function DVr_StartSelectByClick()
-  {
-    this.mSelecting = true;
-    this.mSelectDocs = this.getAllDocuments();
-
-    for (var i = 0; i < this.mSelectDocs.length; ++i) {
-      var doc = this.mSelectDocs[i];
-      doc.addEventListener("mousedown", MouseDownListener, true);
-      doc.addEventListener("mouseup", EventCanceller, true);
-      doc.addEventListener("click", ListenerRemover, true);
-      // If user moves the mouse out of the original target area, there
-      // will be no onclick event fired.... so we have to deal with
-      // that.
-      doc.addEventListener("mouseout", ListenerRemover, true);
-    }
-    this.mPanel.panelset.setCommandAttribute("cmd:selectByClick", "checked",
-                                             "true");
-  },
-
-  doSelectByClick: function DVr_DoSelectByClick(aTarget)
-  {
-    if (aTarget.nodeType == nsIDOMNode.TEXT_NODE) {
-      aTarget = aTarget.parentNode;
-    }
-
-    this.stopSelectByClick();
-    this.showNodeInTree(aTarget);
-  },
-
-  stopSelectByClick: function DVr_StopSelectByClick()
-  {
-    this.mSelecting = false;
-
-    this.mPanel.panelset.setCommandAttribute("cmd:selectByClick", "checked",
-                                             null);
-  },
-
-  removeClickListeners: function DVr_RemoveClickListeners()
-  {
-    if (!this.mSelectDocs) { // we didn't select an element by click
-      return;
-    }
-
-    for (var i = 0; i < this.mSelectDocs.length; ++i) {
-      var doc = this.mSelectDocs[i];
-      doc.removeEventListener("mousedown", MouseDownListener, true);
-      doc.removeEventListener("mouseup", EventCanceller, true);
-      doc.removeEventListener("click", ListenerRemover, true);
-      doc.removeEventListener("mouseout", ListenerRemover, true);
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Find Methods
-
-  startFind: function DVr_StartFind(aType, aDir)
-  {
-    this.mFindResult = null;
-    this.mFindType = aType;
-    this.mFindDir = aDir;
-    this.mFindParams = [];
-    for (var i = 2; i < arguments.length; ++i) {
-      this.mFindParams[i-2] = arguments[i];
-    }
-
-    var fn = null;
-    switch (aType) {
-      case "id":
-        fn = "doFindElementById";
-        break;
-      case "tag":
-        fn = "doFindElementsByTagName";
-        break;
-      case "attr":
-        fn = "doFindElementsByAttr";
-        break;
-    };
-
-    this.mFindFn = fn;
-    this.mFindWalker = this.createDOMWalker(this.mDOMView.rootNode);
-    this.findNext();
-  },
-
-  findNext: function DVr_FindNext()
-  {
-    var walker = this.mFindWalker;
-    if (!walker) {
-      Components.utils.reportError("deep tree walker unavailable");
-      return;
-    }
-    var result = null;
-    var currentNode = walker.currentNode;
-    while (currentNode) {
-      if (this[this.mFindFn](walker)) {
-        result = walker.currentNode;
-        walker.nextNode();
-        break;
-      }
-      currentNode = walker.nextNode();
-    }
-
-    if (result && result != this.mFindResult) {
-      this.showNodeInTree(result);
-      this.mFindResult = result;
-      this.mDOMTree.focus();
-    }
-    else {
-      var bundle = this.mPanel.panelset.stringBundle;
-      var msg = bundle.getString("findNodesDocumentEnd.message");
-      var title = bundle.getString("findNodesDocumentEnd.title");
-
-      var promptService = XPCU.getService(kPromptServiceClassID,
-                                         "nsIPromptService");
-      promptService.alert(window, title, msg);
-    }
-  },
-
-  doFindElementById: function DVr_DoFindElementById(aWalker)
-  {
-    var re = new RegExp(this.mFindParams[0], "i");
-
-    // NB: In HTML getAttribute can return null, so we have to check that it's
-    // actually set; if we don't and the search string is "null", implicit
-    // toString conversion means that we'll match on every element without an
-    // ID.  Additionally, for elements without an ID, getAttribute returns an
-    // empty string in XUL (bug 232598), so our check must handle that...
-    return aWalker.currentNode &&
-           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
-           aWalker.currentNode.hasAttribute("id") &&
-           re.test(aWalker.currentNode.getAttribute("id"));
-  },
-
-  doFindElementsByTagName: function DVr_DoFindElementsByTagName(aWalker)
-  {
-    var re = new RegExp(this.mFindParams[0], "i");
-
-    return aWalker.currentNode &&
-           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
-           re.test(aWalker.currentNode.localName);
-  },
-
-  doFindElementsByAttr: function DVr_DoFindElementsByAttr(aWalker)
-  {
-    var re = new RegExp(this.mFindParams[1], "i");
-
-    return aWalker.currentNode &&
-           aWalker.currentNode.nodeType == nsIDOMNode.ELEMENT_NODE &&
-           aWalker.currentNode.hasAttribute(this.mFindParams[0]) &&
-           re.test(aWalker.currentNode.getAttribute(this.mFindParams[0]));
-  },
-
-  /**
-   * Makes sure each ancestor in the given node's ancestor chain is open, so
-   * so that there exists a row in the tree that represents the node.  That
-   * row will be selected and scrolled into view.  If that node doesn't have a
-   * row in the tree, the nearest ancestor is used as a fallback.  Further
-   * parameters allow finer control over what it means to "show" a node,
-   * including overriding the default behavior.
-   *
-   * @param aNode
-   *        Node to show.
-   * @param aAugment [optional]
-   *        true if selection should add to the current selection, false if it
-   *        should clear it and be the only row selected.  This has no effect
-   *        if aNoSelect is true.
-   * @param aExpand [optional]
-   *        true if the node's open state should be changed to open.
-   * @param aNoVisible [optional]
-   *        true if you don't care whether the given node is scrolled into
-   *        sight.
-   * @param aNoSelect [optional]
-   *        true if you don't want the given element to be selected.
-   * @return The current index of the given node in the tree.
-   */
-  showNodeInTree:
-    function DVr_ShowNodeInTree(aNode, aAugment, aExpand, aNoVisible,
-                                aNoSelect)
-  {
-    var bx = this.mDOMTree.treeBoxObject;
-
-    if (!aNode) {
-      if (!aAugment && !aNoSelect) {
-        bx.view.selection.select(-1);
-      }
-      return -1;
-    }
-
-    // Keep searching until a pre-created ancestor is found, and then open
-    // each ancestor until the row for the given node is created.
-    var line = [];
-    var parent = aNode;
-    var index = null;
-    while (parent) {
-      index = this.getRowIndexFromNode(parent);
-      line.push(parent);
-      if (index < 0) {
-        // The row for this node hasn't been created yet.
-        parent =
-          this.mDOMUtils.getParentForNode(parent,
-                                          this.mDOMView.showAnonymousContent);
-      }
-      else {
-        // The ancestor chain is already open above this point.
-        break;
-      }
-    }
-
-    // We've got all the ancestors, now open them one-by-one from the top
-    // down.
-    var view = bx.view;
-    var lastIndex;
-    for (let i = line.length - 1; i >= 0; --i) {
-      index = this.getRowIndexFromNode(line[i]);
-      if (index < 0)  {
-        index = -1;
-        break; // We can't find the row, so stop trying to descend.
-      }
-      if ((aExpand || i > 0) && !view.isContainerOpen(index)) {
-        view.toggleOpenState(index);
-      }
-      lastIndex = index;
-    }
-
-    if (lastIndex >= 0) {
-      if (!aNoVisible) {
-        bx.ensureRowIsVisible(lastIndex);
-      }
-      if (!aNoSelect) {
-        view.selection.rangedSelect(lastIndex, lastIndex, aAugment);
-      }
-    }
-
-    return index;
-  },
-
-  /**
-   * Rebuild the tree by re-opening previously opened rows, re-selecting
-   * previously selected rows, and restoring the viewer selection and the
-   * node previously at currentNode, if possible.
-   * @param aIncludeAnons [optional]
-   *        If a rebuild was triggered in response to a pref change for
-   *        showing anonymous content, this must be former pref value.
-   */
-  rebuild: function DVr_Rebuild(aIncludeAnons)
-  {
-    var selection = this.mDOMTree.view.selection;
-
-    // Remember all non-ignorable nodes of open rows.  Re-opening them will be
-    // the first step to recreating the tree's state.
-    var opened = [];
-    for (let i = 0, n = this.mDOMTree.view.rowCount; i < n; ++i) {
-      if (this.mDOMTree.view.isContainerOpen(i)) {
-        let node = this.getNodeFromRowIndex(i);
-        if (!this.isIgnorableNode(node)) {
-          opened.push(node);
-        }
-      }
-    }
-
-    // Remember all nodes of selected rows.  Also save the indexes of rows of
-    // non-ignorable nodes so we can determine the best viewer selection
-    // candidate below.
-    var ignorableSelectedNodes = [];
-    var nonIgnorableSelectedNodes = [];
-    var nonIgnorableSelectedIndexes = [];
-    let selectedIndexes = this.getSelectedIndexes();
-    for (let i = 0, n = selectedIndexes.length; i < n; ++i) {
-      let idx = selectedIndexes[i];
-      let node = this.getNodeFromRowIndex(idx);
-      if (this.isIgnorableNode(node)) {
-        ignorableSelectedNodes.push(node);
-      }
-      else {
-        nonIgnorableSelectedNodes.push(node);
-        nonIgnorableSelectedIndexes.push(idx);
-      }
-    }
-
-    // Remember the node showing in the object pane.  If the current node
-    // there is going to be filtered out, pick another one by using the same
-    // algorithm used when a row is deselected.
-    var viewerSelection = this.selection;
-    if (this.isIgnorableNode(viewerSelection)) {
-      let idx = this.getRowIndexFromNode(viewerSelection);
-      let nearestNonIgnorableSelectedIndex =
-        InsUtil.getNearestIndex(idx, nonIgnorableSelectedIndexes);
-      viewerSelection =
-        this.getNodeFromRowIndex(nearestNonIgnorableSelectedIndex);
-    }
-    if (!viewerSelection) {
-      // There was no nearest non-ignorable selected node (ostensibly, because
-      // there are no non-ignorable selected nodes), so find a fallback from
-      // the next-best chain.
-      if (nonIgnorableSelectedNodes.length) {
-        debug("some nodes are non-ignorable, but no suitable viewer " +
-              "selection was found");
-      }
-      viewerSelection =
-        this.getNextInNextBestChain(this.selection, aIncludeAnons);
-    }
-
-    // Remember currentNode.
-    var currentNode = this.currentNode;
-    if (this.isIgnorableNode(currentNode)) {
-      currentNode = this.getNextInNextBestChain(currentNode, aIncludeAnons);
-    }
-
-    selection.clearSelection();
-    this.mDOMView.rebuild();
-
-    // We're now operating under the new inIDOMView parameters.  Restore the
-    // previously opened rows.  This won't, however, ensure that all non-
-    // ignorable nodes which were previously exposed will be re-exposed.
-    // Consider the case of going from not showing anons to showing them, and
-    // where the ancestor of a previously exposed, non-ignorable node (or the
-    // node itself) is inserted as a "child" of an anonymous node.  See the
-    // comments below about re-selecting nodes for how we deal with this.
-    this.mDOMTree.treeBoxObject.beginUpdateBatch();
-    for (let i = 0, n = opened.length; i < n; ++i) {
-      let idx = 
-        this.showNodeInTree(opened[i], false, // Don't augment the selection.
-                                       true,  // Expand to show children.
-                                       true,  // The node need not be visible.
-                                       true); // Don't select it.
-      if (idx < 0) {
-        debug("previously opened node expected to be in tree but isn't");
-      }
-    }
-
-    // Re-select all rows for non-ignorable nodes which had been previously
-    // selected.
-    this.beginSelectionBatch();
-    for (let i = 0, n = nonIgnorableSelectedNodes.length; i < n; ++i) {
-      let idx = this.showNodeInTree(nonIgnorableSelectedNodes[i], true);
-      if (idx < 0) {
-        debug("previously selected node expected to have row in tree but " +
-              "doesn't");
-      }
-    }
-
-    // For rows of previously selected nodes which are ignorable, we call
-    // showNodeInTree on them without selecting them, in order to make sure as
-    // much of their ancestor chain is exposed as possible.  This two-phase
-    // system is necessary because it's not guaranteed that all non-ignorable
-    // rows which were exposed before are now exposed again.  See the above
-    // comments about re-opening nodes for why this is true.
-    for (let i = 0, n = ignorableSelectedNodes.length; i < n; ++i) {
-      let idx = this.showNodeInTree(ignorableSelectedNodes[i], false, false,
-                                    true, true);
-      if (idx >= 0) {
-        debug("previously selected node expected to be ignorable but still " +
-              "has a row in the tree");
-        // Well, I guess we'll go ahead and select it then...
-        selection.toggleSelect(idx);
-      }
-    }
-
-    // Restore the viewer selection.
-    if (!selection.count) {
-      // All previously selected nodes have been filtered out.  Select the
-      // fallback we found from the next-best chain.
-      this.showNodeInTree(viewerSelection);
-    }
-    else if (this.mPendingSelection != viewerSelection) {
-      // The previous viewer selection should now be one of the selected
-      // nodes, but it's not the one that was selected last.
-      if (this.getRowIndexFromNode(viewerSelection) >= 0) {
-        this.changeSelection(viewerSelection);
-      }
-      else {
-        debug("new viewer selection expected to have row in tree but " +
-              "doesn't");
-      }
-    }
-
-    // Attempt to restore currentIndex to the previous currentNode.
-    var currentIndex = this.showNodeInTree(currentNode, false, false, true,
-                                           true);
-    if (currentIndex >= 0) {
-      this.mDOMTree.currentIndex = currentIndex;
-    }
-    else if (currentNode) {
-      debug("currentNode expected to have row in tree but doesn't");
-    }
-
-    this.mDOMTree.treeBoxObject.endUpdateBatch();
-    this.endSelectionBatch();
-  },
-
-  /**
-   * Determine whether the given node will be displayed in the tree, based on
-   * the tree's current show parameters and node filters.
-   * @param aNode
-   *        A node contained within the subtree of the tree's root (including
-   *        any subdocuments and their children).
-   * @return A boolean indicating whether the node is ignorable
-   */
-  isIgnorableNode: function DVr_IsIgnorableNode(aNode)
-  {
-    if (!(aNode instanceof nsIDOMNode)) {
-      return true;
-    }
-
-    // The node filter doesn't actually get checked for documents in
-    // inDOMView.
-    if (!(aNode instanceof nsIDOMDocument)) {
-      let nodeTypeFilter = 1 << (aNode.nodeType - 1);
-      if (!(this.mDOMView.whatToShow & nodeTypeFilter)) {
-        return true;
-      }
-    }
-
-    if (aNode instanceof nsIDOMCharacterData &&
-        this.mDOMUtils.isIgnorableWhitespace(aNode) &&
-        !this.mDOMView.showWhitespaceNodes) {
-      return true;
-    }
-
-    if (aNode != this.mDOMView.rootNode) {
-      if (!this.mDOMView.showSubDocuments &&
-          aNode.ownerDocument != this.mDOMView.rootNode) {
-        return true;
-      }
-  
-      if (!this.mDOMView.showAnonymousContent) {
-        // Anonymous nodes are obviously ignorable,  but so are non-anonymous
-        // nodes in the contentDocument of an anonymous element (as is the
-        // contentDocument itself).
-        let current = aNode;
-        if (current instanceof nsIDOMDocument) {
-          current = this.mDOMUtils.getParentForNode(current, true);
-        }
-        while (current && current.ownerDocument) {
-          if (current.ownerDocument.getBindingParent(current)) {
-            return true;
-          }
-          if (current.ownerDocument == this.mDOMView.rootNode) {
-            break;
-          }
-          current = this.mDOMUtils.getParentForNode(current.ownerDocument, 
-                                                    true);
-        }
-      }
-    }
-
-    return false;
-  },
-
-  /**
-   * The next-best chain extending from a given node is defined as the next
-   * non-ignorable siblings in document order, followed the preceding non-
-   * ignorable siblings in reverse document order, followed by the parent node
-   * (if it's non-ignorable) and its non-ignorable siblings ordered similarly,
-   * continuing all the way up the ancestor chain.
-   * @param aNode
-   *        The node for which we'll traverse its next-best chain.
-   * @param aIncludeAnons [optional]
-   *        Whether to consider the effects of anonymous content on the chain
-   *        structure.  Note that this is not necessarily the same as the DOM
-   *        view's showAnonymousContent attribute, and even if true, won't
-   *        affect whether anonymous nodes can be returned.  However, the
-   *        default is whatever the showAnonymousContent attribute's value is.
-   * @param aFilterFn [optional]
-   *        If specified, when a node is considered, aFilterFn will be called
-   *        with that node as its only parameter.  A truthy return value will
-   *        disqualify the node's eligibility to be returned as the next in
-   *        the next-best chain.  NB: A falsy return value won't guarantee
-   *        that the node will positively appear in the chain; all nodes still
-   *        need to pass the isIgnorableNode check.
-   * @return The next node in the next-best chain.
-   */
-  getNextInNextBestChain:
-    function DVr_GetNextInNextBestChain(aNode, aIncludeAnons, aFilterFn)
-  {
-    if (!aNode) {
-      return null;
-    }
-
-    var withoutFilter = function DVr_GetNextInNextBestChain_IsIgnorable(aNode)
-    {
-      return viewer.isIgnorableNode(aNode);
-    };
-    var withFilter =
-      function DVr_GetNextInNextBestChain_FilteredIsIgnorable(aNode)
-    {
-      return viewer.isIgnorableNode(aNode) || aFilterFn(aNode);
-    };
-
-    var isIgnorable = aFilterFn ? withFilter : withoutFilter;
-    
-
-    // The approach is broken down as follows:
-    // 1. Locating the topmost ignorable node in the ancestor chain (including
-    //    the given node).
-    // 2. Locating the next non-ignorable sibling of that ancestor, beginning
-    //    by searching forward in the sibling group starting at that node then
-    //    backwards if we exhaust the list of all siblings that follow.
-    var showAnons = this.mDOMView.showAnonymousContent;
-    var ancestorChain = [];
-    var ancestor = aNode;
-    while (ancestor != this.mDOMView.rootNode) {
-      ancestor = this.mDOMUtils.getParentForNode(ancestor, showAnons);
-      if (!ancestor) {
-        break;
-      }
-      ancestorChain.push(ancestor);
-    }
-    var topmost = aNode;
-    for (let i = ancestorChain.length - 1; i >= 0; --i) {
-      // XXX This is O(h*d), where h is the node depth from the root, and d is
-      // the document nesting level of aNode's ownerDocument.  If the document
-      // consists entirely of nested iframes/browsers/what-have-you, that
-      // means it will technically be O(h^2).  There's room for optimization
-      // here, but d is expected to be much smaller than h in practice, i.e.,
-      // anywhere between 1 and something like 3, and I can't think of a good
-      // way to get around this right now without creating API awkwardness.
-      if (isIgnorable(ancestorChain[i])) {
-        topmost = ancestorChain[i];
-        break;
-      }
-    }
-    // Short circuit for rootNode; it won't have any siblings.
-    if (topmost == this.mDOMView.rootNode) {
-      // Just in case for some crazy reason the root node is ignorable...
-      return isIgnorable(topmost) ? null : topmost;
-    }
-
-    // Follow through on step 2.
-
-    // The nature of anonymous content means that the nodes around aNode can
-    // get completely rearranged, depending on whether we're showing anonymous
-    // content or not.  If we're getting called from a rebuild due to a pref
-    // change for showing anonymous content, showAnons is going to reflect the
-    // new value.  If that's why we are getting called, we want to select from
-    // the next-best chain based on the order nodes were visually presented
-    // when the user toggled the pref, which is is why we need the
-    // aIncludeAnons override, since showAnons is untrustworthy here.
-    var includeAnons =
-      aIncludeAnons === undefined ? showAnons : aIncludeAnons;
-    // NB: By allowing includeAnons to deviate from showAnons above, we can't
-    // guarantee that ancestor will be non-ignorable (it might be anonymous,
-    // and we're not showing anons), so we'll need to check for it later.
-    ancestor = this.mDOMUtils.getParentForNode(topmost, includeAnons);
-    // As a side-effect of special-casing the rootNode-as-topmost check
-    // earlier, we're guaranteed ancestor is non-null here.
-    var walker = this.createDOMWalker(ancestor, includeAnons);
-    var current = walker.firstChild();
-
-    // We have to relocate the walker over topmost by iterating over nodes
-    // until we get there.  We'll save the ones we pass up along the way so we
-    // can immediately begin looking at those preceding nodes in reverse order
-    // if we find that we've exhausted all of the nodes that follow.
-    var preceding = [];
-    while (current != topmost) {
-      preceding.push(current);
-      current = walker.nextSibling();
-      if (!current) {
-        debug("unexpected end of nodes");
-        return null;
-      }
-    }
-
-    // Look for the next non-ignorable in the nodes that follow topmost.
-    do {
-      current = walker.nextSibling();
-      if (!isIgnorable(current)) {
-        return current;
-      }
-    } while (current);
-
-    // Look for the next non-ignorable in the nodes that precede topmost.
-    for (let i = preceding.length - 1; i >= 0; --i) {
-      current = preceding[i];
-      if (!isIgnorable(current)) {
-        return current;
-      }
-    }
-
-    // All of the adjacent nodes are ignorable, too.  Use topmost's parent,
-    // which we know to be non-ignorable (by virtue of it being an ancestor of
-    // topmost).  Recall from before that we can't be sure that the ancestor
-    // we've got in |ancestor| is non-ignorable, though...
-    if (includeAnons != showAnons) {
-      ancestor = this.mDOMUtils.getParentForNode(topmost, showAnons);
-    }
-
-    return ancestor;
-  },
-
-  /**
-   * Convenience method for instantiating a deep tree walker, using much of
-   * the same preferences as the DOM view.
-   * @param aRoot
-   *        The root node to begin traversal.  See the W3 Traversal spec for
-   *        more information.
-   * @param aShowAnons [optional]
-   *        Whether to include anonymous content in the walk.  This is the
-   *        same as setting showAnonymousContent on an instantiated deep tree
-   *        walker.  The default is the value of the showAnonymousContent
-   *        attribute on the DOM view.
-   */
-  createDOMWalker:
-    function DVr_CreateDOMWalker(aRoot, aShowAnons)
-  {
-    var walker = XPCU.createInstance(kDeepTreeWalkerClassID,
-                                     "inIDeepTreeWalker");
-    walker.showAnonymousContent = aShowAnons === undefined ?
-                                    this.mDOMView.showAnonymousContent :
-                                    aShowAnons;
-    walker.showSubDocuments = this.mDOMView.showSubDocuments;
-    walker.init(aRoot, this.mDOMView.whatToShow);
-    return walker;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Columns
-
-  // XXX re-implement custom columns code someday
-
-  initColumns: function DVr_InitColumns()
-  {
-    var colPref = PrefUtils.getPref("inspector.dom.columns");
-    var cols = colPref.split(",")
-    this.mColumns = cols;
-    this.mColumnHash = {};
-  },
-
-  saveColumns: function DVr_SaveColumns()
-  {
-    var cols = this.mColumns.join(",");
-    PrefUtils.setPref("inspector.dom.columns", cols);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Flashing
-
-  flashElement: function DVr_FlashElement(aElement, aIsOnSelect)
-  {
-    // make sure we only try to flash element nodes, and don't
-    // flash the documentElement (it's too darn big!)
-    if (aElement.nodeType == nsIDOMNode.ELEMENT_NODE &&
-        aElement != aElement.ownerDocument.documentElement) {
-
-      var flasher = this.mPanel.panelset.flasher;
-      if (aIsOnSelect) {
-        flasher.flashElementOnSelect(aElement);
-      }
-      else {
-        flasher.flashElement(aElement);
-      }
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Prefs
-
-  /**
-   * Called by PrefChangeObserver.
-   *
-   * @param aName
-   *        The name of the preference that has been changed.
-   */
-  onPrefChanged: function DVr_OnPrefChanged(aName)
-  {
-    var value = PrefUtils.getPref(aName);
-    var includeAnons = undefined;
-
-    switch (aName) {
-      case "inspector.dom.showAnon":
-        includeAnons = this.mDOMView.showAnonymousContent;
-        this.setAnonContent(value);
-        break;
-
-      case "inspector.dom.showProcessingInstructions":
-        this.setProcessingInstructions(value);
-        break;
-
-      case "inspector.dom.showAccessibleNodes":
-        this.setAccessibleNodes(value);
-        break;
-
-      case "inspector.dom.showWhitespaceNodes":
-        this.setWhitespaceNodes(value);
-        break;
-
-      default:
-        return;
-    }
-
-    this.rebuild(includeAnons);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Uncategorized
-
-  getAllDocuments: function DVr_GetAllDocuments()
-  {
-    var doc = this.mDOMView.rootNode;
-    var results = [doc];
-    this.findDocuments(doc, results);
-    return results;
-  },
-
-  findDocuments: function DVr_FindDocuments(aDoc, aArray)
-  {
-    this.addKidsToArray(aDoc.getElementsByTagName("frame"), aArray);
-    this.addKidsToArray(aDoc.getElementsByTagName("iframe"), aArray);
-    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "browser"),
-                        aArray);
-    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "tabbrowser"),
-                        aArray);
-    this.addKidsToArray(aDoc.getElementsByTagNameNS(kXULNSURI, "editor"),
-                        aArray);
-  },
-
-  addKidsToArray: function DVr_AddKidsToArray(aKids, aArray)
-  {
-    for (var i = 0; i < aKids.length; ++i) {
-      try {
-        if (!aKids[i].contentDocument)
-          continue;
-        aArray.push(aKids[i].contentDocument);
-        // Now recurse down into the kid and look for documents there
-        this.findDocuments(aKids[i].contentDocument, aArray);
-      }
-      catch (ex) {
-        // if we can't access the content document, skip it
-      }
-    }
-  },
-
-  /**
-   * Get the node corresponding to the tree's currentIndex (the row with the
-   * focus rect).  NB: This is *not* a method to get the tree's selection.
-   * Use selectedNode or getSelectedNodes for that.
-   * @return the node corresponding to the tree's currentIndex, which may or
-   *         may not be a part of the tree's selection
-   */
-  get currentNode()
-  {
-    var index = this.mDOMTree.currentIndex;
-    return this.getNodeFromRowIndex(index);
-  },
-
-  /**
-   * Get the node represented by the tree's selection.
-   * @return The currently selected node, or null if zero or two or more nodes
-   *         are selected.
-   */
-  get selectedNode()
-  {
-    if (this.mDOMTree.view.selection.count == 1) {
-      var minAndMax = {};
-      this.mDOMTree.view.selection.getRangeAt(0, minAndMax, minAndMax);
-      return this.getNodeFromRowIndex(minAndMax.value);
-    }
-    return null;
-  },
-
-  /**
-   * Get the nodes corresponding to the tree's selected rows.
-   * @return An array of nodes.
-   */
-  getSelectedNodes: function DVr_GetSelectedNodes()
-  {
-    var nodes = [];
-    var indexes = this.getSelectedIndexes();
-    for (let i = 0, n = indexes.length; i < n; ++i) {
-      nodes.push(this.getNodeFromRowIndex(indexes[i]));
-    }
-    return nodes;
-  },
-
-  /**
-   * Determine the tree's selected rows.
-   * @return An array of row indexes.
-   */
-  getSelectedIndexes: function DVr_GetSelectedIndexes()
-  {
-    var indexes = [];
-    var selection = this.mDOMTree.view.selection;
-    for (let i = 0, n = selection.getRangeCount(); i < n; ++i) {
-      var min = {};
-      var max = {};
-      selection.getRangeAt(i, min, max);
-      for (let j = min.value; j <= max.value; ++j) {
-        indexes.push(j);
-      }
-    }
-    return indexes;
-  },
-
-  getNodeFromRowIndex: function DVr_GetNodeFromRowIndex(aIndex)
-  {
-    try {
-      return this.mDOMView.getNodeFromRowIndex(aIndex);
-    }
-    catch (ex) {
-      return null;
-    }
-  },
-
-  getRowIndexFromNode: function DVr_GetRowIndexFromNode(aNode)
-  {
-    try {
-      return this.mDOMView.getRowIndexFromNode(aNode);
-    }
-    catch (ex) {
-      return -1;
-    }
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Command Objects
-
-/**
- * Deletes one or more nodes from the tree.
- */
-function cmdEditDelete()
-{
-  // Approach:
-  // 1. Order the nodes with the primary criterion being the node depth, with
-  //    the nodes of greatest depth appearing near the beginning of the list.
-  //    The secondary (tiebreaker) criterion is applied only to nodes which
-  //    are siblings, and is the node order, corresponding to the nodes'
-  //    indexing in their parents' childNodes NodeLists.
-  // 2. Iterate over the list, storing the current node's parent and its next
-  //    sibling (or null if it's the last of its parent's children).
-  //
-  // Observe that after the nodes are deleted, this allows us to cleanly undo
-  // this transaction by working backwards and reinserting nodes.
-  var nodes = viewer.getSelectedNodes().sort(cmdEditDelete.sortComparator);
-
-  this.nodes = [];
-  this.mParents = [];
-  this.mSiblings = [];
-
-  var didPrompt = false;
-  for (let i = 0, n = nodes.length; i < n; ++i) {
-    let node = nodes[i];
-
-    // If we delete a descendant of an anonymous node and that anonymous
-    // node's binding parent, the nodes array and the mParents array (and
-    // potentially the mSiblings array) would continue to needlessly reference
-    // nodes from that anonymous subtree.  Even if the binding parent gets
-    // restored via undo, a new anonymous content tree will be created for it,
-    // so we can eliminate the references to the nodes in the old subtree.
-    let bindingParent = node.ownerDocument.getBindingParent(node);
-    if (bindingParent && cmdEditDelete.isDeletable(bindingParent) &&
-        nodes.indexOf(bindingParent, i) >= 0) { // XXX O(1/2 * n^2)
-      // Notify about the issue described above, and ask if it's okay to
-      // continue.
-      if (!didPrompt) {
-        let bundle = viewer.pane.panelset.stringBundle;
-        let msg = bundle.getString("irrecoverableSubtree.message");
-        let title = bundle.getString("irrecoverableSubtree.title");
-
-        let promptService = XPCU.getService(kPromptServiceClassID,
-                                            "nsIPromptService");
-        let confirmation = promptService.confirm(window, title, msg);
-
-        if (!confirmation) {
-          throw new Error("User canceled transaction");
-        }
-
-        didPrompt = true;
-      }
-    }
-    else {
-      this.nodes.push(node);
-      this.mParents.push(node.parentNode);
-      this.mSiblings.push(node.nextSibling);
-    }
-  }
-
-  this.wrappedJSObject = this;
-}
-
-cmdEditDelete.sortComparator = function Delete_SortComparator(a, b)
-{
-  // Sibling nodes get arranged by natural order.
-  if (a.parentNode && a.parentNode == b.parentNode) {
-    let kids = a.parentNode.childNodes;
-    for (let i = 0, n = kids.length; i < n; ++i) {
-      if (kids[i] == a) {
-        return -1;
-      }
-      if (kids[i] == b) {
-        break;
-      }
-    }
-    return 1;
-  }
-
-  // Otherwise, nodes at greatest depth appear first.
-  var rootNode = viewer.mDOMView.rootNode;
-  var showAnons = viewer.mDOMView.showAnonymousContent;
-  var aAncestor = viewer.mDOMUtils.getParentForNode(a, showAnons);
-  var bAncestor = viewer.mDOMUtils.getParentForNode(b, showAnons);
-
-  // Check for equivalence to the root node, too, because getParentForNode
-  // will walk all the way up the tree (e.g., out of a content document to a
-  // browser containing it).
-  while (aAncestor != bAncestor && aAncestor && bAncestor &&
-         aAncestor != rootNode && bAncestor != rootNode) {
-    aAncestor = viewer.mDOMUtils.getParentForNode(aAncestor, showAnons);
-    bAncestor = viewer.mDOMUtils.getParentForNode(bAncestor, showAnons);
-  }
-  if (!aAncestor || aAncestor == rootNode) {
-    return 1;
-  }
-  return -1;
-};
-
-/**
- * Determine if a node is deletable by our deletion methods.
- * @param aNode
- *        The node to check.
- * @param aFailure [optional]
- *        Outparam whose value will correspond to a cmdEditDelete error
- *        constant.  If the node is found to be deletable, aFailure will be
- *        not be altered.
- * @return Boolean indicating deletability.
- */
-cmdEditDelete.isDeletable = function Delete_IsDeletable(aNode, aFailure)
-{
-  var failure = aFailure || { };
-  if (!aNode) {
-    failure.value = this.NODE_NULL;
-    return false;
-  }
-  var parent = aNode.parentNode;
-  if (!parent) {
-    failure.value = this.NO_PARENT;
-    return false;
-  }
-  if (Array.indexOf(parent.childNodes, aNode) < 0) {
-    failure.value = this.NOT_EXPLICIT_CHILD;
-    return false;
-  }
-  return true;
-};
-
-cmdEditDelete.NODE_NULL = 1;
-cmdEditDelete.NO_PARENT = 2;
-cmdEditDelete.NOT_EXPLICIT_CHILD = 3;
-
-cmdEditDelete.prototype = new inBaseCommand(false);
-cmdEditDelete.prototype.constructor = cmdEditDelete;
-
-cmdEditDelete.prototype.nodes = null;
-
-cmdEditDelete.prototype.doTransaction = function Delete_DoTransaction()
-{
-  // Note that the "indexes" here refer to the given nodes' indexes in this
-  // instance's |nodes| array, not the row indexes of the view.
-  this.mDeletedIndexes = [];
-  for (let i = 0, n = this.nodes.length; i < n; ++i) {
-    let node = this.nodes[i];
-    let failure = {};
-    if (cmdEditDelete.isDeletable(node, failure)) {
-      try {
-        this.mParents[i].removeChild(node);
-        this.mDeletedIndexes.push(i);
-      }
-      catch (ex) {
-        Components.utils.reportError(node + " was expected to be deletable but isn't");
-      }
-    }
-    else {
-      let consoleMsg = node.toString();
-      switch (failure.value) {
-        case cmdEditDelete.NO_PARENT:
-          consoleMsg += " has no parent node and cannot be deleted.";
-          break;
-        case cmdEditDelete.NOT_EXPLICIT_CHILD:
-          consoleMsg += " is anonymous to its parent node and cannot be deleted.";
-          break;
-      }
-      this.logString(consoleMsg);
-    }
-  }
-};
-
-cmdEditDelete.prototype.logString = function Delete_LogString(aMessage)
-{
-  if (("mConsoleService" in this)) {
-    // This is not the first call.
-    if (this.mConsoleService) {
-      this.mConsoleService.logStringMessage(aMessage);
-    }
-    else {
-      dump(aMessage);
-    }
-  }
-  else {
-    try {
-      this.mConsoleService = XPCU.getService("@mozilla.org/consoleservice;1",
-                                             "nsIConsoleService");
-    }
-    catch (ex) {
-      // Null it out for the next call, so we can use our fallback.
-      this.mConsoleService = null;
-    }
-    this.logString(aMessage);
-  }
-};
-
-cmdEditDelete.prototype.undoTransaction = function Delete_UndoTransaction()
-{
-  // Recall that since not all nodes in this.nodes are necessarily deletable,
-  // this.mDeletedIndexes is a list of indexes into this.nodes where the node
-  // at each index is one which was found to be deletable and was successfully
-  // removed.
-  for (let i = this.mDeletedIndexes.length - 1; i >= 0; --i) {
-    let idx = this.mDeletedIndexes[i];
-    try {
-      this.mParents[idx].insertBefore(this.nodes[idx], this.mSiblings[idx]); 
-    }
-    catch (ex) {
-      // XXX allow recovery from external manipulation
-      Components.utils.reportError("Couldn't undo deletion for node " +
-                                   this.nodes[idx]);
-    }
-  }
-};
-
-function cmdEditCut() {}
-
-cmdEditCut.prototype = new inBaseCommand(false);
-
-cmdEditCut.prototype.cmdCopy = null;
-cmdEditCut.prototype.cmdDelete = null;
-
-cmdEditCut.prototype.doTransaction = function Cut_DoTransaction()
-{
-  if (!this.cmdCopy) {
-    this.cmdDelete = new cmdEditDelete();
-    this.cmdCopy = new cmdEditCopy();
-  }
-  this.cmdCopy.doTransaction();
-  this.cmdDelete.doTransaction();
-};
-
-cmdEditCut.prototype.undoTransaction = function Cut_UndoTransaction()
-{
-  this.cmdDelete.undoTransaction();
-};
-
-function cmdEditCopy() {
-  this.mNode = viewer.selectedNode;
-}
-
-cmdEditCopy.prototype = new inBaseCommand();
-
-cmdEditCopy.prototype.mNode = null;
-
-cmdEditCopy.prototype.doTransaction = function Copy_DoTransaction()
-{
-  if (this.mNode) {
-    viewer.pane.panelset.setClipboardData(this.mNode.cloneNode(true),
-                                          "inspector/dom-node", null);
-  }
-};
-
-/**
- * Pastes the node on the clipboard as the next sibling of the selected node.
- */
-function cmdEditPaste() {}
-
-cmdEditPaste.prototype = new inBaseCommand(false);
-
-cmdEditPaste.prototype.pastedNode = null;
-cmdEditPaste.prototype.pastedBefore = null;
-
-cmdEditPaste.prototype.doTransaction = function Paste_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var ref = this.pastedBefore || viewer.currentNode;
-  if (ref) {
-    this.pastedNode = node.cloneNode(true);
-    this.pastedBefore = ref;
-    ref.parentNode.insertBefore(this.pastedNode, ref.nextSibling);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPaste.prototype.undoTransaction = function Paste_UndoTransaction()
-{
-  if (this.pastedNode) {
-    this.pastedNode.parentNode.removeChild(this.pastedNode);
-  }
-};
-
-/**
- * Pastes the node on the clipboard as the previous sibling of the selected
- * node.
- */
-function cmdEditPasteBefore() {}
-
-cmdEditPasteBefore.prototype = new inBaseCommand(false);
-
-cmdEditPasteBefore.prototype.pastedNode = null;
-cmdEditPasteBefore.prototype.pastedBefore = null;
-
-cmdEditPasteBefore.prototype.doTransaction =
-  function PasteBefore_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var ref = this.pastedBefore || viewer.currentNode;
-  if (ref) {
-    this.pastedNode = node.cloneNode(true);
-    this.pastedBefore = ref;
-    ref.parentNode.insertBefore(this.pastedNode, ref);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPasteBefore.prototype.undoTransaction =
-  function PasteBefore_UndoTransaction()
-{
-  if (this.pastedNode) {
-    this.pastedNode.parentNode.removeChild(this.pastedNode);
-  }
-};
-
-/**
- * Pastes the node on the clipboard in the place of the selected node,
- * overwriting it.
- */
-function cmdEditPasteReplace() {}
-
-cmdEditPasteReplace.prototype = new inBaseCommand(false);
-
-cmdEditPasteReplace.prototype.pastedNode = null;
-cmdEditPasteReplace.prototype.originalNode = null;
-
-cmdEditPasteReplace.prototype.doTransaction =
-  function PasteReplace_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var selected = this.originalNode || viewer.selectedNode;
-  if (selected) {
-    this.pastedNode = node.cloneNode(true);
-    this.originalNode = selected;
-    selected.parentNode.replaceChild(this.pastedNode, selected);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPasteReplace.prototype.undoTransaction =
-  function PasteReplace_UndoTransaction()
-{
-  if (this.pastedNode) {
-    this.pastedNode.parentNode.replaceChild(this.originalNode,
-                                            this.pastedNode);
-  }
-};
-
-/**
- * Pastes the node on the clipboard as the first child of the selected node.
- */
-function cmdEditPasteFirstChild() {}
-
-cmdEditPasteFirstChild.prototype = new inBaseCommand(false);
-
-cmdEditPasteFirstChild.prototype.pastedNode = null;
-cmdEditPasteFirstChild.prototype.pastedBefore = null;
-
-cmdEditPasteFirstChild.prototype.doTransaction =
-  function PasteFirstChild_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var selected = this.pastedBefore || viewer.selectedNode;
-  if (selected) {
-    this.pastedNode = node.cloneNode(true);
-    this.pastedBefore = selected.firstChild;
-    selected.insertBefore(this.pastedNode, this.pastedBefore);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPasteFirstChild.prototype.undoTransaction =
-  function PasteFirstChild_UndoTransaction()
-{
-  if (this.pastedNode) {
-    this.pastedNode.parentNode.removeChild(this.pastedNode);
-  }
-};
-
-/**
- * Pastes the node on the clipboard as the last child of the selected node.
- */
-function cmdEditPasteLastChild() {}
-
-cmdEditPasteLastChild.prototype = new inBaseCommand(false);
-
-cmdEditPasteLastChild.prototype.pastedNode = null;
-cmdEditPasteLastChild.prototype.selectedNode = null;
-
-cmdEditPasteLastChild.prototype.doTransaction =
-  function PasteLastChild_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var selected = this.selectedNode || viewer.selectedNode;
-  if (selected) {
-    this.pastedNode = node.cloneNode(true);
-    this.selectedNode = selected;
-    selected.appendChild(this.pastedNode);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPasteLastChild.prototype.undoTransaction =
-  function PasteLastChild_UndoTransaction()
-{
-  if (this.selectedNode) {
-    this.selectedNode.removeChild(this.pastedNode);
-  }
-};
-
-/**
- * Pastes the node on the clipboard in the place of the selected node, making
- * the selected node its child.
- */
-function cmdEditPasteAsParent() {}
-
-cmdEditPasteAsParent.prototype = new inBaseCommand(false);
-
-cmdEditPasteAsParent.prototype.pastedNode = null;
-cmdEditPasteAsParent.prototype.originalNode = null;
-cmdEditPasteAsParent.prototype.originalParentNode = null;
-
-cmdEditPasteAsParent.prototype.doTransaction =
-  function PasteAsParent_DoTransaction()
-{
-  var node = this.pastedNode || viewer.pane.panelset.getClipboardData();
-  var selected = this.originalNode || viewer.selectedNode;
-  var parent = this.originalParentNode || selected.parentNode;
-  if (selected) {
-    this.pastedNode = node.cloneNode(true);
-    this.originalNode = selected;
-    this.originalParentNode = parent;
-    parent.replaceChild(this.pastedNode, selected);
-    this.pastedNode.appendChild(selected);
-    return false;
-  }
-  return true;
-};
-
-cmdEditPasteAsParent.prototype.undoTransaction =
-  function PasteAsParent_UndoTransaction()
-{
-  if (this.pastedNode) {
-    this.originalParentNode.replaceChild(this.originalNode,
-                                         this.pastedNode);
-  }
-};
-
-/**
- * Generic prototype for inserting a new node somewhere
- */
-function InsertNode() {}
-
-InsertNode.prototype = new inBaseCommand(false);
-
-InsertNode.prototype.insertedNode = null;
-InsertNode.prototype.originalNode = null;
-InsertNode.prototype.attr = null;
-
-InsertNode.prototype.insertNode = function Insert_InsertNode()
-{
-};
-
-InsertNode.prototype.createNode = function Insert_CreateNode()
-{
-  var doc = this.originalNode.ownerDocument;
-  if (!this.attr) {
-    this.attr = { type: null, value: null,
-                  namespaceURI: this.originalNode.namespaceURI,
-                  accepted: false,
-                  enableNamespaces: doc.contentType != "text/html" };
-
-    window.openDialog("chrome://inspector/content/viewers/dom/" +
-                        "insertDialog.xul",
-                      "insert", "chrome,modal,centerscreen", doc,
-                      this.attr);
-  }
-
-  if (this.attr.accepted) {
-    switch (this.attr.type) {
-      case nsIDOMNode.ELEMENT_NODE:
-        if (this.attr.enableNamespaces) {
-          this.insertedNode = doc.createElementNS(this.attr.namespaceURI,
-                                                  this.attr.value);
-        }
-        else {
-          this.insertedNode = doc.createElement(this.attr.value);
-        }
-        break;
-      case nsIDOMNode.TEXT_NODE:
-        this.insertedNode = doc.createTextNode(this.attr.value);
-        break;
-    }
-    return true;
-  }
-  return false;
-};
-
-InsertNode.prototype.doTransaction = function Insert_DoTransaction()
-{
-  if (this.originalNode) {
-    if (this.createNode()) {
-      this.insertNode();
-      return false;
-    }
-  }
-  return true;
-};
-
-InsertNode.prototype.undoTransaction = function Insert_UndoTransaction()
-{
-  if (this.insertedNode) {
-    this.insertedNode.parentNode.removeChild(this.insertedNode);
-  }
-};
-
-/**
- * Inserts a node after the selected node.
- */
-function cmdEditInsertAfter()
-{
-  this.originalNode = viewer.currentNode;
-}
-
-cmdEditInsertAfter.prototype = new InsertNode();
-
-cmdEditInsertAfter.prototype.insertNode = function InsertAfter_InsertNode()
-{
-  this.originalNode.parentNode.insertBefore(this.insertedNode,
-                                            this.originalNode.nextSibling);
-};
-
-/**
- * Inserts a node before the selected node.
- */
-function cmdEditInsertBefore()
-{
-  this.originalNode = viewer.currentNode;
-}
-
-cmdEditInsertBefore.prototype = new InsertNode();
-
-cmdEditInsertBefore.prototype.insertNode = function InsertBefore_InsertNode()
-{
-  this.originalNode.parentNode.insertBefore(this.insertedNode,
-                                            this.originalNode);
-};
-
-/**
- * Inserts a node as the first child of the selected node.
- */
-function cmdEditInsertFirstChild()
-{
-  this.originalNode = viewer.selectedNode;
-}
-
-cmdEditInsertFirstChild.prototype = new InsertNode();
-
-cmdEditInsertFirstChild.prototype.insertNode =
-  function InsertFirstChild_InsertNode()
-{
-  this.originalNode.insertBefore(this.insertedNode,
-                                 this.originalNode.firstChild);
-};
-
-/**
- * Inserts a node as the last child of the selected node.
- */
-function cmdEditInsertLastChild()
-{
-  this.originalNode = viewer.selectedNode;
-}
-
-cmdEditInsertLastChild.prototype = new InsertNode();
-
-cmdEditInsertLastChild.prototype.insertNode =
-  function InsertLastChild_InsertNode()
-{
-  this.originalNode.appendChild(this.insertedNode);
-};
-
-function cmdEditInspectInNewWindow()
-{
-  this.mObject = viewer.selectedNode;
-}
-
-cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
-
-//////////////////////////////////////////////////////////////////////////////
-//// Listener Objects
-
-var MouseDownListener = {
-  handleEvent: function MDL_HandleEvent(aEvent)
-  {
-    aEvent.stopPropagation();
-    aEvent.preventDefault();
-
-    var target = viewer.mDOMView.showAnonymousContent ?
-                                   aEvent.originalTarget :
-                                   aEvent.target;
-    viewer.doSelectByClick(target);
-  }
-};
-
-var EventCanceller = {
-  handleEvent: function EC_HandleEvent(aEvent)
-  {
-    aEvent.stopPropagation();
-    aEvent.preventDefault();
-  }
-};
-
-var ListenerRemover = {
-  handleEvent: function LR_HandleEvent(aEvent)
-  {
-    if (!viewer.mSelecting) {
-      if (aEvent.type == "click") {
-        aEvent.stopPropagation();
-        aEvent.preventDefault();
-      }
-      viewer.removeClickListeners();
-    }
-  }
-};
-
-var PrefChangeObserver = {
-  observe: function PCO_Observe(aSubject, aTopic, aData)
-  {
-    viewer.onPrefChanged(aData);
-  }
-};
-
-function gColumnAddListener(aIndex)
-{
-  viewer.onColumnAdd(aIndex);
-}
-
-function gColumnRemoveListener(aIndex)
-{
-  viewer.onColumnRemove(aIndex);
-}
-
-function dumpDOM2(aNode)
-{
-  dump(DOMViewer.prototype.toXML(aNode));
-}
-
-function stubImpl(aNode)
-{
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/dom.xul b/suite/extensions/inspector/resources/content/viewers/dom/dom.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/dom.xul
+++ /dev/null
@@ -1,198 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
-]>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/dom.css"?>
-
-<page id="winDOMViewer"
-      orient="vertical"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/PrefUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/dom/dom.js"/>
-
-  <!-- ============================ COMMANDS ============================= -->
-
-  <commandset id="cmdsEditing"/>
-  <commandset id="cmdsEditingExtras"/>
-
-  <commandset>
-    <command id="cmdInspectBrowser"
-             oncommand="viewer.cmdInspectBrowser()"/>
-
-    <command id="cmdCopyXML"
-             oncommand="viewer.cmdCopySelectedXML()"/>
-
-    <command id="cmdBlink"
-             oncommand="viewer.cmdBlink()"/>
-
-    <command id="cmdShowPseudoClasses"
-             oncommand="viewer.cmdShowPseudoClasses()"/>
-
-    <command id="cmdEditPasteBefore"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteBefore');"/>
-    <command id="cmdEditPasteReplace"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteReplace');"/>
-    <command id="cmdEditPasteFirstChild"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteFirstChild');"/>
-    <command id="cmdEditPasteLastChild"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteLastChild');"/>
-    <command id="cmdEditPasteAsParent"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditPasteAsParent');"/>
-
-    <command id="cmdEditInsertAfter"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertAfter');"/>
-    <command id="cmdEditInsertBefore"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertBefore');"/>
-    <command id="cmdEditInsertFirstChild"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertFirstChild');"/>
-    <command id="cmdEditInsertLastChild"
-             oncommand="viewer.pane.panelset.execCommand('cmdEditInsertLastChild');"/>
-
-  </commandset>
-
-  <!--============================= POPUPS ============================== -->
-
-  <popupset id="psPopups">
-    <menupopup id="ppDOMContext"
-               onpopupshowing="viewer.onPopupShowing(event.target)">
-      <menuitem id="mnEditInspectInNewWindow"/>
-      <menuitem id="mnInspectBrowser"
-                label="&cmdInspectBrowser.label;"
-                accesskey="&cmdInspectBrowser.accesskey;"
-                checkvalid="true"
-                command="cmdInspectBrowser"/>
-      <menuseparator/>
-      <menuitem id="mnEditCut"/>
-      <menuitem id="mnEditCopy"/>
-      <menu id="mnEditPasteMenu"
-            label="&mnEditPasteMenu.label;"
-            accesskey="&mnEditPasteMenu.accesskey;">
-        <menupopup>
-          <!-- keep older functionality of paste command for paste menu in DOM
-               Nodes viewer -->
-          <menuitem id="mnEditPasteAfter"
-                    label="&mnEditPasteAfter.label;"
-                    accesskey="&mnEditPasteAfter.accesskey;"
-                    command="cmdEditPaste"
-                    key="keyEditPaste"/>
-          <!-- other paste commands -->
-          <menuitem id="mnEditPasteBefore"
-                    label="&mnEditPasteBefore.label;"
-                    accesskey="&mnEditPasteBefore.accesskey;"
-                    command="cmdEditPasteBefore"/>
-          <menuitem id="mnEditPasteReplace"
-                    label="&mnEditPasteReplace.label;"
-                    accesskey="&mnEditPasteReplace.accesskey;"
-                    command="cmdEditPasteReplace"/>
-          <menuitem id="mnEditPasteFirstChild"
-                    label="&mnEditPasteFirstChild.label;"
-                    accesskey="&mnEditPasteFirstChild.accesskey;"
-                    command="cmdEditPasteFirstChild"/>
-          <menuitem id="mnEditPasteLastChild"
-                    label="&mnEditPasteLastChild.label;"
-                    accesskey="&mnEditPasteLastChild.accesskey;"
-                    command="cmdEditPasteLastChild"/>
-          <menuitem id="mnEditPasteAsParent"
-                    label="&mnEditPasteAsParent.label;"
-                    accesskey="&mnEditPasteAsParent.accesskey;"
-                    command="cmdEditPasteAsParent"/>
-        </menupopup>
-      </menu>
-      <menuseparator/>
-      <menu id="mnEditInsertMenu"
-            label="&mnEditInsertMenu.label;"
-            accesskey="&mnEditInsertMenu.accesskey;">
-        <menupopup>
-          <menuitem id="mnEditInsertAfter"
-                    label="&mnEditInsertAfter.label;"
-                    accesskey="&mnEditInsertAfter.accesskey;"
-                    command="cmdEditInsertAfter"/>
-          <menuitem id="mnEditInsertBefore"
-                    label="&mnEditInsertBefore.label;"
-                    accesskey="&mnEditInsertBefore.accesskey;"
-                    command="cmdEditInsertBefore"/>
-          <menuitem id="mnEditInsertFirstChild"
-                    label="&mnEditInsertFirstChild.label;"
-                    accesskey="&mnEditInsertFirstChild.accesskey;"
-                    command="cmdEditInsertFirstChild"/>
-          <menuitem id="mnEditInsertLastChild"
-                    label="&mnEditInsertLastChild.label;"
-                    accesskey="&mnEditInsertLastChild.accesskey;"
-                    command="cmdEditInsertLastChild"/>
-        </menupopup>
-      </menu>
-      <menuitem id="mnEditDelete"/>
-      <menuseparator/>
-      <menuitem id="mnCopyXML"
-                label="&cmdCopyXML.label;"
-                accesskey="&cmdCopyXML.accesskey;"
-                command="cmdCopyXML"/>
-      <menuseparator/>
-      <menuitem id="mnBlink"
-                label="&cmdBlink.label;"
-                accesskey="&cmdBlink.accesskey;"
-                checkvalid="true"
-                command="cmdBlink"/>
-      <menuitem id="mnShowPseudoClasses"
-                label="&cmdShowPseudoClasses.label;"
-                accesskey="&cmdShowPseudoClasses.accesskey;"
-                command="cmdShowPseudoClasses"/>
-    </menupopup>
-  </popupset>
-
-  <tree id="trDOMTree" class="plain" treelines="true" flex="1"
-        enableColumnDrag="true"
-        contextmenu="ppDOMContext"
-        onselect="viewer.onTreeSelectionChange(event);">
-    <treecols>
-      <!-- These labels don't need to be localized since they are defined by
-           DOM APIs -->
-      <treecol id="colNodeName" label="nodeName" primary="true"
-               persist="width,hidden,ordinal" flex="3"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colLocalName" label="localName" hidden="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colPrefix" label="prefix" hidden="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colNamespaceURI" label="namespaceURI" hidden="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colNodeType" label="nodeType" hidden="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colNodeValue" label="nodeValue" hidden="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="col@id" label="id" persist="width,hidden,ordinal"
-               flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="col@class" label="class" persist="width,hidden,ordinal"
-               flex="1"/>
-    </treecols>
-    <treechildren id="trDOMTreeBody"/>
-  </tree>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/findDialog.xul b/suite/extensions/inspector/resources/content/viewers/dom/findDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/findDialog.xul
+++ /dev/null
@@ -1,96 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE dialog [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/dom/findDialog.css"?>
-
-<dialog id="winFind" style="width: 30em;"
-        title="&findNodes.title;"
-        ondialogaccept="return dialog.doFind();"
-        persist="screenX screenY"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/FindDialog.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-
-  <hbox flex="1">
-    <vbox flex="1">
-      <grid>
-        <columns>
-          <column/>
-          <column flex="1"/>
-        </columns>
-        <rows>
-          <row id="rwRow1">
-            <deck id="rwRow1Text">
-            <!-- The script places a "control" attribute on the selected label 
-            so that accessibility aids can identify the proper label for the 
-            textbox. -->
-              <label id="txText1Id"
-                     value="&findNodesById.label;"
-                     accesskey="&findNodesById.accesskey;"/>
-              <label id="txText1Tag"
-                     value="&findNodesByTag.label;"
-                     accesskey="&findNodesByTag.accesskey;"/>
-              <label id="txText1Attr"
-                     value="&findNodesByAttr.label;"
-                     accesskey="&findNodesByAttr.accesskey;"/>
-            </deck>
-            <textbox id="tfText1"/>
-          </row>
-          <row id="rwRow2">
-            <label id="txText2"
-                   value="&findNodesByAttrValue.label;"
-                   accesskey="&findNodesByAttrValue.accesskey;"
-                   control="tfText2"/>
-            <textbox id="tfText2"/>
-          </row>
-        </rows>
-      </grid>
-      
-      <hbox>
-        <groupbox id="tbxType">
-          <caption label="&findNodesSearchBy.label;"/>
-          <radiogroup id="rgType">
-            <radio id="rdType_id" value="id"
-                   label="&findNodesById.label;"
-                   accesskey="&findNodesById.accesskey2;"
-                   oncommand="dialog.toggleType('id')"/>
-            <radio id="rdType_tag" value="tag"
-                   label="&findNodesByTag.label;"
-                   accesskey="&findNodesByTag.accesskey2;"
-                   oncommand="dialog.toggleType('tag')"/>
-            <radio id="rdType_attr" value="attr"
-                   label="&findNodesByAttr.label;"
-                   accesskey="&findNodesByAttr.accesskey2;"
-                   oncommand="dialog.toggleType('attr')"/>
-          </radiogroup>
-        </groupbox>
-        <groupbox id="tbxDirection" hide="true">
-          <caption label="&findNodesDirection.label;"/>
-          <radiogroup id="rgDirection">
-            <radio id="rdDir_up" value="up"
-                   label="&findNodesDirectionUp.label;"
-                   accesskey="&findNodesDirectionUp.accesskey;"/>
-            <radio id="rdDir_down" value="down"
-                   label="&findNodesDirectionDown.label;"
-                   accesskey="&findNodesDirectionDown.accesskey;"/>
-          </radiogroup>
-        </groupbox>
-      </hbox>
-    </vbox>
-  
-    <vbox>
-      <button label="&findNodesFind.label;" dlgtype="accept" default="true"/>
-      <button label="&findNodesCancel.label;" dlgtype="cancel"/>
-    </vbox>
-  </hbox>
-  
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.js b/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.js
+++ /dev/null
@@ -1,136 +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/. */
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var dialog;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization/Destruction
-
-window.addEventListener("load", InsertDialog_initialize, false);
-
-function InsertDialog_initialize()
-{
-  dialog = new InsertDialog();
-  dialog.initialize();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class InsertDialog
-
-function InsertDialog()
-{
-  this.mDoc  = window.arguments[0];
-  this.mData = window.arguments[1];
-
-  this.nodeType  = document.getElementById("ml_nodeType");
-  this.tagName = document.getElementById("tx_tagName");
-  this.nodeValue = document.getElementById("tx_nodeValue");
-  this.namespace = document.getElementById("tx_namespace");
-  this.menulist  = document.getElementById("ml_namespace");
-  this.customNS  = document.getElementById("mi_custom");
-}
-
-InsertDialog.prototype =
-{
- /**
-  * This function initializes the content of the dialog.
-  */
-  initialize: function initialize()
-  {
-    var menulist   = this.menulist;
-    var menuitems  = menulist.firstChild.childNodes;
-    var defaultNS  = document.getElementById("mi_namespace");
-    var accept     = document.documentElement.getButton("accept");
-
-    menulist.disabled = !this.mData.enableNamespaces;
-    defaultNS.value        = this.mDoc.documentElement.namespaceURI;
-
-    if (this.mData.enableNamespaces) {
-      let uri = this.mData.namespaceURI;
-      menulist.value = uri;
-      if (!menulist.selectedItem) {
-        // The original node's namespace isn't one listed in the menulist.
-        this.customNS.value = uri;
-        menulist.selectedItem = this.customNS;
-      }
-    }
-    this.updateNamespace();
-    this.updateType();
-    this.tagName.focus();
-  },
-
- /**
-  * The function that is called on accept.  Sets data.
-  */
-  accept: function accept()
-  {
-    switch (this.nodeType.value)
-    {
-      case "element":
-      	this.mData.type     = Components.interfaces.nsIDOMNode.ELEMENT_NODE;
-        this.mData.value    = this.tagName.value;
-        break;
-      case "text":
-      	this.mData.type     = Components.interfaces.nsIDOMNode.TEXT_NODE;
-        this.mData.value    = this.nodeValue.value;
-        break;
-    }
-    this.mData.namespaceURI = this.namespace.value;
-    this.mData.accepted     = true;
-    return true;
-  },
-
- /**
-  * updateType changes the visibility of rows based on the node type.
-  */
-  updateType: function updateType()
-  {
-    switch (dialog.nodeType.value)
-    {
-      case "text":
-        document.getElementById("row_text").hidden = false;
-        document.getElementById("row_element").hidden = true;
-        break;
-      case "element":
-        document.getElementById("row_text").hidden = true;
-        document.getElementById("row_element").hidden = false;
-        break;
-    }
-    dialog.toggleAccept();
-  },
-
- /**
-  * updateNamespace updates the namespace textbox based on the namespace menu.
-  */
-  updateNamespace: function updateNamespace()
-  {
-    this.namespace.disabled = dialog.menulist.selectedItem != this.customNS;
-    this.namespace.value    = dialog.menulist.value;
-  },
-
-  /**
-   * Change the "Custom" menuitem's value to reflect the namespace textbox's
-   * value.
-   *
-   * This fires on input events, so if the user switches away from the
-   * "Custom" menuitem and then back, the previously-entered value remains.
-   */
-  updateCustom: function updateCustom()
-  {
-    this.customNS.value = this.namespace.value;
-  },
-
- /**
-  * toggleAccept enables/disables the Accept button when there is/isn't an
-  *   attribute name.
-  */
-  toggleAccept: function toggleAccept()
-  {
-    document.documentElement.getButton("accept").disabled = 
-      (dialog.tagName.value == "") && (dialog.nodeType.selectedItem.value == "element");
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.xul b/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/insertDialog.xul
+++ /dev/null
@@ -1,110 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/.
--->
-<!DOCTYPE dialog SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
-<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
-
-<dialog id="InsertNode"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        title="&insertNode.title;"
-        buttons="accept,cancel"
-        ondialogaccept="dialog.accept();">
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/dom/insertDialog.js"/>
-  <grid>
-    <columns>
-      <column/>
-      <column flex="1"/>
-    </columns>
-    <rows>
-      <row align="center">
-        <label value="&nodeType.label;"
-               accesskey="&nodeType.accesskey;"
-               control="ml_nodeType"/>
-        <menulist id="ml_nodeType" oncommand="dialog.updateType();">
-          <menupopup id="mp_nodetypes">
-            <menuitem label="&nodeType.element.label;"
-                      id="mi_Element"
-                      value="element"/>
-            <menuitem label="&nodeType.text.label;"
-                      id="mi_Text"
-                      value="text"/>
-          </menupopup>
-        </menulist>
-      </row>
-	    <rows id="row_element">
-	      <row align="center">
-         <label value="&namespaceURI.label;"
-                accesskey="&namespaceURI.accesskey;"
-                control="ml_namespace"/>
-	        <menulist id="ml_namespace" oncommand="dialog.updateNamespace();">
-	          <menupopup id="mp_namespaces">
-	            <!-- This must be first, and must have the value attribute set to
-	                 "" in order for it to work properly -->
-	            <menuitem label="&namespaceTitle.null.label;"
-	                      id="mi_NullNS"
-	                      value=""/>
-	            <menuitem label="&namespaceTitle.XMLNS.label;"
-	                      id="mi_XMLNSNS"
-	                      value="http://www.w3.org/2000/xmlns/"/>
-	            <menuitem label="&namespaceTitle.XML.label;"
-	                      id="mi_XMLNS"
-	                      value="http://www.w3.org/XML/1998/namespace"/>
-	            <menuitem label="&namespaceTitle.XHTML.label;"
-	                      id="mi_XHTMLNS"
-	                      value="http://www.w3.org/1999/xhtml"/>
-	            <menuitem label="&namespaceTitle.XLink.label;"
-	                      id="mi_XLinkNS"
-	                      value="http://www.w3.org/1999/xlink"/>
-	            <menuitem label="&namespaceTitle.XSLT.label;"
-	                      id="mi_XSLTNS"
-	                      value="http://www.w3.org/1999/XSL/Transform"/>
-	            <menuitem label="&namespaceTitle.XBL.label;"
-	                      id="mi_XBLNS"
-	                      value="http://www.mozilla.org/xbl"/>
-	            <menuitem label="&namespaceTitle.MathML.label;"
-	                      id="mi_MathMLNS"
-	                      value="http://www.w3.org/1998/Math/MathML"/>
-	            <menuitem label="&namespaceTitle.RDF.label;"
-	                      id="mi_RDFNS"
-	                      value="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>
-	            <menuitem label="&namespaceTitle.XUL.label;"
-	                      id="mi_XULNS"
-	                      value="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
-	            <menuitem label="&namespaceTitle.SVG.label;"
-	                      id="mi_SVGNS"
-	                      value="http://www.w3.org/2000/svg"/>
-	            <menuitem label="&namespaceTitle.XMLEvents.label;"
-	                      id="mi_XMLEventsNS"
-	                      value="http://www.w3.org/2001/xml-events"/>
-	            <!-- Value set onload -->
-	            <menuitem label="&namespaceTitle.default.label;"
-	                      id="mi_namespace"/>
-	            <!-- Value set onload -->
-	            <menuitem label="&namespaceTitle.custom.label;"
-	                      id="mi_custom"/>
-	          </menupopup>
-	        </menulist>
-	      </row>
-	      <row>
-	        <spacer/>
-	        <textbox id="tx_namespace" oninput="dialog.updateCustom();"/>
-	      </row>
-	      <row>
-         <label value="&tagName.label;"
-                accesskey="&tagName.accesskey;"
-                control="tx_tagName"/>
-	        <textbox id="tx_tagName" oninput="dialog.toggleAccept()"/>
-	      </row>
-	    </rows>
-      <row id="row_text" flex="1">
-        <label value="&nodeValue.label;"
-               accesskey="&nodeValue.accesskey;"
-               control="tx_nodeValue"/>
-        <textbox id="tx_nodeValue" multiline="true"/>
-      </row>
-    </rows>
-  </grid>
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/keysetOverlay.xul b/suite/extensions/inspector/resources/content/viewers/dom/keysetOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/keysetOverlay.xul
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
-
-<overlay id="ovDOMViewerKeyset"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <keyset id="ksGlobalKeyset">
-    <key id="key:find" key="&cmdShowFindDialog.key;" observes="cmd:find"
-         modifiers="accel"/>
-    <key id="key:findAgain" key="&cmdFindAgain.key;" observes="cmd:findAgain"
-         modifiers="accel"/>
-    <key id="key:findAgain2" keycode="VK_F3" observes="cmd:findAgain"/>
-  </keyset>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/popupOverlay.xul b/suite/extensions/inspector/resources/content/viewers/dom/popupOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/popupOverlay.xul
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
-
-<overlay id="ovDOMViewerPopup"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <popupset id="ppsViewerPopupset">
-    <menupopup id="ppViewerContext-dom">
-      <menuitem id="item:findPp"
-                label="&cmdShowFindDialog.label;"
-                accesskey="&cmdShowFindDialog.accesskey;"
-                key="key:find"
-                observes="cmd:find"/>
-
-      <menuitem id="item:findAgainPp"
-                label="&cmdFindAgain.label;"
-                accesskey="&cmdFindAgain.accesskey;"
-                key="key:findAgain"
-                observes="cmd:findAgain"/>
-
-      <menuseparator/>
-
-      <menuitem id="item:toggleAttributes" hidden="true"
-                class="menuitem-iconic"
-                type="checkbox"
-                label="&cmdToggleAttributes.label;"
-                accesskey="&cmdToggleAttributes.accesskey;"
-                observes="cmd:toggleAttributes"/>
-
-      <menuitem id="item:toggleAnonPp"
-                class="menuitem-iconic"
-                type="checkbox"
-                label="&cmdToggleAnonContent.label;"
-                accesskey="&cmdToggleAnonContent.accesskey;"
-                observes="cmd:toggleAnon"/>
-
-      <menuitem id="item:toggleAccessibleNodesPp"
-                class="menuitem-iconic"
-                type="checkbox"
-                label="&cmdToggleAccessibleNodes.label;"
-                accesskey="&cmdToggleAccessibleNodes.accesskey;"
-                observes="cmd:toggleAccessibleNodes"/>
-
-      <menuitem id="item:toggleWhitespaceNodesPp"
-                class="menuitem-iconic"
-                type="checkbox"
-                label="&cmdToggleWhitespaceNodes.label;"
-                accesskey="&cmdToggleWhitespaceNodes.accesskey;"
-                observes="cmd:toggleWhitespaceNodes"/>
-
-      <menuitem id="item:toggleProcessingInstructionsPp"
-                class="menuitem-iconic"
-                type="checkbox"
-                label="&cmdToggleProcessingInstructions.label;"
-                accesskey="&cmdToggleProcessingInstructions.accesskey;"
-                observes="cmd:toggleProcessingInstructions"/>
-
-    </menupopup>
-  </popupset>
-
-  <menupopup id="mppEdit">
-
-    <menuseparator/>
-
-    <menuitem id="item:findMpp"
-              label="&cmdShowFindDialog.label;"
-              accesskey="&cmdShowFindDialog.accesskey;"
-              key="key:find"
-              observes="cmd:find"/>
-
-    <menuitem id="item:findAgainMpp"
-              label="&cmdFindAgain.label;"
-              accesskey="&cmdFindAgain.accesskey;"
-              key="key:findAgain"
-              observes="cmd:findAgain"/>
-
-    <menuseparator/>
-
-    <menuitem id="item:selectByClick"
-              label="&cmdSelectByClick.label;"
-              accesskey="&cmdSelectByClick.accesskey;"
-              observes="cmd:selectByClick"
-              type="checkbox"/>
-
-  </menupopup>
-
-  <menupopup id="mppView">
-    <menuitem id="item:toggleAnonMpp"
-              class="menuitem-iconic"
-              type="checkbox"
-              label="&cmdToggleAnonContent.label;"
-              accesskey="&cmdToggleAnonContent.accesskey;"
-              observes="cmd:toggleAnon"/>
-
-    <menuitem id="item:toggleAccessibleNodesMpp"
-              class="menuitem-iconic"
-              type="checkbox"
-              label="&cmdToggleAccessibleNodes.label;"
-              accesskey="&cmdToggleAccessibleNodes.accesskey;"
-              observes="cmd:toggleAccessibleNodes"/>
-
-    <menuitem id="item:toggleWhitespaceNodesMpp"
-              class="menuitem-iconic"
-              type="checkbox"
-              label="&cmdToggleWhitespaceNodes.label;"
-              accesskey="&cmdToggleWhitespaceNodes.accesskey;"
-              observes="cmd:toggleWhitespaceNodes"/>
-
-    <menuitem id="item:toggleProcessingInstructionsMpp"
-              class="menuitem-iconic"
-              type="checkbox"
-              label="&cmdToggleProcessingInstructions.label;"
-              accesskey="&cmdToggleProcessingInstructions.accesskey;"
-              observes="cmd:toggleProcessingInstructions"/>
-  </menupopup>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.js b/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.js
+++ /dev/null
@@ -1,97 +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/. */
-
-/***************************************************************
-* PseudoClassDialog --------------------------------------------
-*  A dialog for choosing the pseudo-classes that should be 
-*  imitated on the selected element.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var dialog;
-
-//////////// global constants ////////////////////
-
-const gCheckBoxIds = {
-  cbxStateHover: 4,
-  cbxStateActive: 1,
-  cbxStateFocus: 2
-};
-/////////////////////////////////////////////////
-
-window.addEventListener("load", PseudoClassDialog_initialize, false);
-
-function PseudoClassDialog_initialize()
-{
-  dialog = new PseudoClassDialog();
-  dialog.initialize();
-}
-
-////////////////////////////////////////////////////////////////////////////
-//// class PseudoClassDialog
-
-function PseudoClassDialog() 
-{
-  this.mOpener = window.opener.viewer;
-  this.mSubject = window.arguments[0];
-
-  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1", "inIDOMUtils");
-}
-
-PseudoClassDialog.prototype = 
-{
-  
-  initialize: function()
-  {
-    if ("hasPseudoClassLock" in this.mDOMUtils) {
-      for (var key in gCheckBoxIds) {
-        var cbx = document.getElementById(key);
-        if (this.mDOMUtils.hasPseudoClassLock(this.mSubject, cbx.label)) {
-          cbx.setAttribute("checked", "true");
-        }
-      }
-    }
-    else {
-      var state = this.mDOMUtils.getContentState(this.mSubject);
-
-      for (var key in gCheckBoxIds) {
-        if (gCheckBoxIds[key] & state) {
-          var cbx = document.getElementById(key);
-          cbx.setAttribute("checked", "true");
-        }
-      }
-    }
-  },
-  
-  onOk: function()
-  {
-    var el = this.mSubject;
-    var root = el.ownerDocument.documentElement;
-    
-    for (var key in gCheckBoxIds) {
-      var cbx = document.getElementById(key);
-      if (cbx.checked) {
-        if ("addPseudoClassLock" in this.mDOMUtils) {
-          this.mDOMUtils.addPseudoClassLock(el, cbx.label);
-        }
-        else {
-          this.mDOMUtils.setContentState(el, gCheckBoxIds[key]);
-        }
-      }
-      else {
-        if ("removePseudoClassLock" in this.mDOMUtils) {
-          this.mDOMUtils.removePseudoClassLock(el, cbx.label);
-        }
-        else {
-          this.mDOMUtils.setContentState(root, gCheckBoxIds[key]);
-        }
-      }
-    }
-  }
-  
-};
-
diff --git a/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.xul b/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/dom/pseudoClassDialog.xul
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE dialog [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/dom.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/styleRules/styleRules.css"?>
-
-<dialog id="winPseudoClasses"
-        title="&pseudoClasses.title;"
-        persist="screenX screenY width height"
-        ondialogaccept="return dialog.onOk()"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <!--============================= SCRIPTS ============================= -->
-
-  <script type="application/javascript" src="chrome://inspector/content/viewers/dom/pseudoClassDialog.js"/>
-  <script type="application/javascript" src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-
-  <keyset id="dialogKeys"/>
-
-  <groupbox style="width: 25em;">
-    <caption label="&pseudoClasses.title;"/>
-    <vbox>
-      <!--
-        The labels don't need to be localized, since they are CSS APIs,
-        but the access keys are localizable, because an English
-        keyboard may not always be available
-        see: https://bugzilla.mozilla.org/show_bug.cgi?id=398704#c1
-      -->
-      <checkbox id="cbxStateHover" label=":hover" accesskey="&cbxStateHover.accesskey;"/>
-      <checkbox id="cbxStateActive" label=":active" accesskey="&cbxStateActive.accesskey;"/>
-      <checkbox id="cbxStateFocus" label=":focus" accesskey="&cbxStateFocus.accesskey;"/>
-    </vbox>
-  </groupbox>
-
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/domNode/domNode.js b/suite/extensions/inspector/resources/content/viewers/domNode/domNode.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/domNode/domNode.js
+++ /dev/null
@@ -1,549 +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/. */
-
-/*****************************************************************************
-* DOMNodeViewer --------------------------------------------------------------
-*  The default viewer for DOM Nodes
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kDOMViewCID = "@mozilla.org/inspector/dom-view;1";
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var gPromptService;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", DOMNodeViewer_initialize, false);
-
-function DOMNodeViewer_initialize()
-{
-  viewer = new DOMNodeViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// DOMNodeViewer Class
-
-function DOMNodeViewer()  // implements inIViewer
-{
-  this.mObsMan = new ObserverManager(this);
-
-  this.mURL = window.location;
-  this.mAttrTree = document.getElementById("olAttr");
-  this.mAttrGroupBox = document.getElementById("grpAttr");
-
-  // prepare and attach the DOM DataSource
-  this.mDOMView = XPCU.createInstance(kDOMViewCID, "inIDOMView");
-  this.mDOMView.whatToShow = NodeFilter.SHOW_ATTRIBUTE;
-  this.mAttrTree.treeBoxObject.view = this.mDOMView;
-}
-
-DOMNodeViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mDOMView: null,
-  mSubject: null,
-  mPanel: null,
-
-  get selectedIndex()
-  {
-    return this.mAttrTree.currentIndex;
-  },
-
- /**
-  * Returns an array of the selected indices
-  */
-  get selectedIndices()
-  {
-    var indices = [];
-    var rangeCount = this.mAttrTree.view.selection.getRangeCount();
-    for (var i = 0; i < rangeCount; ++i) {
-      var start = {};
-      var end = {};
-      this.mAttrTree.view.selection.getRangeAt(i, start, end);
-      for (var c = start.value; c <= end.value; ++c) {
-        indices.push(c);
-      }
-    }
-    return indices;
-  },
-
- /**
-  * Returns a DOMAttribute from the selected index
-  */
-  get selectedAttribute()
-  {
-    var index = this.selectedIndex;
-    return index >= 0 ?
-      new DOMAttribute(this.mDOMView.getNodeFromRowIndex(index)) : null;
-  },
-
- /**
-  * Returns an array of DOMAttributes from the selected indices
-  */
-  get selectedAttributes()
-  {
-    var indices = this.selectedIndices;
-    var attrs = [];
-    for (var i = 0; i < indices.length; ++i) {
-      var idx = this.mDOMView.getNodeFromRowIndex(indices[i]);
-      attrs.push(new DOMAttribute(idx));
-    }
-    return attrs;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  //// attributes
-
-  get uid()
-  {
-    return "domNode"
-  },
-
-  get pane()
-  {
-    return this.mPanel
-  },
-
-
-  get selection()
-  {
-    return null
-  },
-
-
-  get subject()
-  {
-    return this.mSubject
-  },
-
-  set subject(aObject)
-  {
-    // the node value's textbox won't fire onchange when we change subjects, so
-    // let's fire it. this won't do anything if it wasn't actually changed
-    viewer.pane.panelset.execCommand('cmdEditTextValue');
-
-    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
-      aObject : aObject.DOMNode;
-    var deck = document.getElementById("dkContent");
-
-    switch (this.mSubject.nodeType) {
-      // things with useful nodeValues
-      case Node.TEXT_NODE:
-      case Node.CDATA_SECTION_NODE:
-      case Node.COMMENT_NODE:
-      case Node.PROCESSING_INSTRUCTION_NODE:
-        deck.selectedIndex = 1;
-        var txb = document.getElementById("txbTextNodeValue").value =
-                  this.mSubject.nodeValue;
-        break;
-      //XXX this view is designed for elements, write a more useful one for
-      // document nodes, etc.
-      default:
-        var bundle = this.pane.panelset.stringBundle;
-        deck.selectedIndex = 0;
-
-        this.setTextValue("localName", this.mSubject.localName);
-        this.setTextValue("nodeType", bundle.getString(this.mSubject.nodeType));
-        this.setTextValue("namespace", this.mSubject.namespaceURI);
-    }
-
-    var hideAttributes = this.mSubject.nodeType != Node.ELEMENT_NODE;
-    this.mAttrGroupBox.hidden = hideAttributes;
-    if (!hideAttributes && this.mSubject != this.mDOMView.rootNode) {
-      this.mDOMView.rootNode = this.mSubject;
-      this.mAttrTree.view.selection.select(-1);
-    }
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  // methods
-
-  initialize: function DNVr_Initialize(aPane)
-  {
-    this.mPanel = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function DNVr_Destroy()
-  {
-    // the node value's textbox won't fire onchange when we change views, so
-    // let's fire it. this won't do anything if it wasn't actually changed
-    viewer.pane.panelset.execCommand('cmdEditTextValue');
-  },
-
-  isCommandEnabled: function DNVr_IsCommandEnabled(aCommand)
-  {
-    // NB: This function can be fired before the subject is set.
-    switch (aCommand) {
-      case "cmdEditPaste":
-        var flavor = this.mPanel.panelset.clipboardFlavor;
-        return (flavor == "inspector/dom-attribute" ||
-                flavor == "inspector/dom-attributes");
-      case "cmdEditInsert":
-        return this.subject && this.subject.nodeType == Node.ELEMENT_NODE;
-      case "cmdEditCut":
-      case "cmdEditCopy":
-      case "cmdEditDelete":
-        return this.selectedAttribute != null;
-      case "cmdEditEdit":
-        return this.mAttrTree.currentIndex >= 0 &&
-                 this.mAttrTree.view.selection.count == 1;
-      case "cmdEditTextValue":
-        if (this.subject) {
-          // something with a useful nodeValue
-          if (this.subject.nodeType == Node.TEXT_NODE ||
-              this.subject.nodeType == Node.CDATA_SECTION_NODE ||
-              this.subject.nodeType == Node.COMMENT_NODE ||
-              this.subject.nodeType == Node.PROCESSING_INSTRUCTION_NODE) {
-            // did something change?
-            return this.subject.nodeValue !=
-                   document.getElementById("txbTextNodeValue").value;
-          }
-        }
-        return false;
-    }
-    return false;
-  },
-
-  getCommand: function DNVr_GetCommand(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCut":
-        return new cmdEditCut();
-      case "cmdEditCopy":
-        return new cmdEditCopy(this.selectedAttributes);
-      case "cmdEditPaste":
-        return new cmdEditPaste();
-      case "cmdEditInsert":
-        var command = new cmdEditInsert();
-        return command.promptFor();
-      case "cmdEditEdit":
-        var command = new cmdEditEdit();
-        return command.promptFor();
-      case "cmdEditDelete":
-        return new cmdEditDelete();
-      case "cmdEditTextValue":
-        return new cmdEditTextValue();
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function DNVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function DNVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Uncategorized
-
-  setTextValue: function DNVr_SetTextValue(aName, aText)
-  {
-    var field = document.getElementById("tx_" + aName);
-    if (field) {
-      field.value = aText;
-    }
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Command Objects
-
-function cmdEditCut() {}
-cmdEditCut.prototype = new inBaseCommand(false);
-
-cmdEditCut.prototype.cmdCopy = null,
-cmdEditCut.prototype.cmdDelete = null,
-
-cmdEditCut.prototype.doTransaction = function DNVr_Cut_DoTransaction()
-{
-  if (!this.cmdCopy) {
-    this.cmdDelete = new cmdEditDelete();
-    this.cmdCopy = new cmdEditCopy(viewer.selectedAttributes);
-    this.cmdCopy.doTransaction();
-  }
-  this.cmdDelete.doTransaction();
-};
-
-cmdEditCut.prototype.undoTransaction = function DVVr_Cut_UndoTransaction()
-{
-  this.cmdDelete.undoTransaction();
-};
-
-function cmdEditPaste() {}
-cmdEditPaste.prototype = new inBaseCommand(false);
-
-cmdEditPaste.prototype.pastedAttr = null;
-cmdEditPaste.prototype.previousAttrValue = null;
-cmdEditPaste.prototype.subject = null;
-cmdEditPaste.prototype.flavor = null;
-
-cmdEditPaste.prototype.doTransaction = function DNVr_Paste_DoTransaction()
-{
-  var subject, pastedAttr, flavor;
-  if (this.subject) {
-    subject = this.subject;
-    pastedAttr = this.pastedAttr;
-    flavor = this.flavor;
-  }
-  else {
-    subject = viewer.subject;
-    pastedAttr = viewer.pane.panelset.getClipboardData();
-    flavor = viewer.pane.panelset.clipboardFlavor;
-    this.pastedAttr = pastedAttr;
-    this.subject = subject;
-    this.flavor = flavor;
-    if (flavor == "inspector/dom-attributes") {
-      this.previousAttrValue = [];
-      for (var i = 0; i < pastedAttr.length; ++i) {
-        this.previousAttrValue[pastedAttr[i].node.nodeName] =
-          viewer.subject.getAttribute(pastedAttr[i].node.nodeName);
-      }
-    }
-    else if (flavor == "inspector/dom-attribute") {
-      this.previousAttrValue =
-        viewer.subject.getAttribute(pastedAttr.node.nodeName);
-    }
-  }
-
-  if (subject && pastedAttr) {
-    if (flavor == "inspector/dom-attributes") {
-      for (var i = 0; i < pastedAttr.length; ++i) {
-        subject.setAttribute(pastedAttr[i].node.nodeName,
-                             pastedAttr[i].node.nodeValue);
-      }
-    }
-    else if (flavor == "inspector/dom-attribute") {
-      subject.setAttribute(pastedAttr.node.nodeName,
-                           pastedAttr.node.nodeValue);
-    }
-  }
-};
-
-cmdEditPaste.prototype.undoTransaction = function DNVr_Paste_UndoTransaction()
-{
-  if (this.pastedAttr) {
-    if (this.flavor == "inspector/dom-attributes") {
-      for (var i = 0; i < this.pastedAttr.length; ++i) {
-        var attrNodeName = this.pastedAttr[i].node.nodeName;
-        if (this.previousAttrValue[attrNodeName]) {
-          this.subject.setAttribute(attrNodeName,
-                                    this.previousAttrValue[attrNodeName]);
-        }
-        else {
-          this.subject.removeAttribute(attrNodeName);
-        }
-      }
-    }
-    else if (this.flavor == "inspector/dom-attribute") {
-      if (this.previousAttrValue) {
-        this.subject.setAttribute(this.pastedAttr.node.nodeName,
-                                  this.previousAttrValue);
-      }
-      else {
-        this.subject.removeAttribute(this.pastedAttr.node.nodeName);
-      }
-    }
-  }
-};
-
-function cmdEditInsert() {}
-cmdEditInsert.prototype = new inBaseCommand(false);
-
-cmdEditInsert.prototype.attr = null;
-cmdEditInsert.prototype.subject = null;
-cmdEditInsert.prototype.name = null;
-cmdEditInsert.prototype.value = null;
-cmdEditInsert.prototype.namespaceURI = null;
-cmdEditInsert.prototype.accepted = false;
-
-cmdEditInsert.prototype.promptFor = function DNVr_Insert_PromptFor()
-{
-  var bundle = viewer.pane.panelset.stringBundle;
-  var title = bundle.getString("newAttribute.title");
-  var doc = viewer.subject.ownerDocument;
-
-  window.openDialog("chrome://inspector/content/viewers/domNode/" +
-                    "domNodeDialog.xul", "insert",
-                    "dialog,modal,centerscreen,resizable", this, title, doc);
-
-  this.subject = viewer.subject;
-
-  return this.accepted ? this : null;
-};
-
-cmdEditInsert.prototype.doTransaction = function DNVr_Insert_DoTransaction()
-{
-  this.subject.setAttributeNS(this.namespaceURI,
-                              this.name,
-                              this.value);
-};
-
-cmdEditInsert.prototype.undoTransaction =
-  function DNVr_Insert_UndoTransaction()
-{
-  if (this.subject == viewer.subject) {
-    this.subject.removeAttributeNS(this.namespaceURI,
-                                   this.name);
-  }
-};
-
-function cmdEditDelete() {}
-cmdEditDelete.prototype = new inBaseCommand(false);
-
-cmdEditDelete.prototype.attrs = null;
-cmdEditDelete.prototype.subject = null;
-
-cmdEditDelete.prototype.doTransaction = function DNVr_Delete_DoTransaction()
-{
-  var attrs = this.attrs ? this.attrs : viewer.selectedAttributes;
-  if (attrs) {
-    this.attrs = attrs;
-    this.subject = viewer.subject;
-    for (var i = 0; i < this.attrs.length; ++i) {
-      this.subject.removeAttribute(this.attrs[i].node.nodeName);
-    }
-  }
-};
-
-cmdEditDelete.prototype.undoTransaction =
-  function DNVr_Delete_UndoTransaction()
-{
-  if (this.attrs) {
-    for (var i = 0; i < this.attrs.length; ++i) {
-      this.subject.setAttribute(this.attrs[i].node.nodeName,
-                                this.attrs[i].node.nodeValue);
-    }
-  }
-};
-
-// XXX when editing the a attribute in this document:
-// data:text/xml,<x a="hi&#x0a;lo&#x0d;go"/>
-// You only get "hi" and not the mutltiline text (windows)
-// This seems to work on Linux, but not very usable
-function cmdEditEdit() {}
-cmdEditEdit.prototype = new inBaseCommand(false);
-
-cmdEditEdit.prototype.subject = null;
-cmdEditEdit.prototype.name = null;
-cmdEditEdit.prototype.value = null;
-cmdEditEdit.prototype.namespaceURI = null;
-cmdEditEdit.prototype.previousValue = null;
-cmdEditEdit.prototype.previousNamespaceURI = null;
-cmdEditEdit.prototype.accepted = false;
-
-cmdEditEdit.prototype.promptFor = function DNVr_Edit_PromptFor()
-{
-  var attr = viewer.selectedAttribute.node;
-  if (!attr) {
-    return null;
-  }
-  var bundle = viewer.pane.panelset.stringBundle;
-  var title = bundle.getString("editAttribute.title");
-  var doc = attr.ownerDocument;
-
-  this.subject              = viewer.subject;
-  this.name                 = attr.nodeName;
-  this.previousValue        = attr.nodeValue;
-  this.previousNamespaceURI = attr.namespaceURI;
-  this.value                = this.previousValue;
-  this.namespaceURI         = this.previousNamespaceURI;
-
-  window.openDialog("chrome://inspector/content/viewers/domNode/" +
-                    "domNodeDialog.xul", "edit",
-                    "dialog,modal,centerscreen,resizable", this, title, doc);
-
-  return this.accepted ? this : null;
-};
-
-cmdEditEdit.prototype.doTransaction = function DNVr_Edit_DoTransaction()
-{
-  if (this.previousNamespaceURI == this.namespaceURI) {
-    this.subject.setAttributeNS(this.previousNamespaceURI,
-                                this.name,
-                                this.value);
-  }
-  else {
-    this.subject.removeAttributeNS(this.previousNamespaceURI,
-                                   this.name);
-    this.subject.setAttributeNS(this.namespaceURI,
-                                this.name,
-                                this.value);
-  }
-};
-
-cmdEditEdit.prototype.undoTransaction = function DNVr_Edit_UndoTransaction()
-{
-  if (this.previousNamespaceURI == this.namespaceURI) {
-    this.subject.setAttributeNS(this.previousNamespaceURI,
-                                this.name,
-                                this.previousValue);
-  }
-  else {
-    this.subject.removeAttributeNS(this.namespaceURI,
-                                   this.name);
-    this.subject.setAttributeNS(this.previousNamespaceURI,
-                                this.name,
-                                this.previousValue);
-  }
-};
-
-/**
- * Handles editing of text nodes.
- */
-function cmdEditTextValue() {
-  this.newValue = document.getElementById("txbTextNodeValue").value;
-  this.subject = viewer.subject;
-  this.previousValue = this.subject.nodeValue;
-}
-
-cmdEditTextValue.prototype = new inBaseCommand(false);
-
-cmdEditTextValue.prototype.doTransaction =
-  function DNVr_EditText_DoTransaction()
-{
-  this.subject.nodeValue = this.newValue;
-};
-
-cmdEditTextValue.prototype.undoTransaction =
-  function DNVr_EditText_UndoTransaction()
-{
-  this.subject.nodeValue = this.previousValue;
-  this.refreshView();
-};
-
-cmdEditTextValue.prototype.redoTransaction =
-  function DNVr_EditText_RedoTransaction()
-{
-  this.doTransaction();
-  this.refreshView();
-};
-
-cmdEditTextValue.prototype.refreshView = function DNVr_EditText_RefreshView()
-{
-  // if we're still on the same subject, update the textbox
-  if (viewer.subject == this.subject) {
-    document.getElementById("txbTextNodeValue").value =
-             this.subject.nodeValue;
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/domNode/domNode.xul b/suite/extensions/inspector/resources/content/viewers/domNode/domNode.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/domNode/domNode.xul
+++ /dev/null
@@ -1,135 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/domNode.dtd"> %dtd2;
-]>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/domNode/domNode.css"?>
-
-<page id="winNodeDefault"
-      style="padding: 10px"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <!--============================= SCRIPTS ============================= -->
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/domNode/domNode.js"/>
-
-  <!--============================= CONTENT ============================== -->
-
-  <commandset id="cmdsEditing"/>  
-  
-  <popupset id="psPopups">
-    <menupopup id="ppAttrContext">
-      <menuitem id="mnEditCut"/>
-      <menuitem id="mnEditCopy"/>
-      <menuitem id="mnEditPaste"/>
-      <menuseparator/>
-      <menuitem id="mnEditEdit"/>
-      <menuitem id="mnEditInsert"/>
-      <menuitem id="mnEditDelete"/>
-    </menupopup>
-  </popupset>
- 
-  <deck id="dkContent" flex="1">
-    <vbox id="bxElement">
-      <grid id="olNodeInfo">
-        <columns>
-          <column/>
-          <column flex="1"/>
-        </columns>
-        <rows>
-          <row>
-            <label value="&localName.label;"
-                   control="tx_localName"
-                   class="olNodeInfoLabel"/>
-            <textbox id="tx_localName" readonly="true" class="plain"/>
-          </row>
-          <row>
-            <label value="&namespaceURI.label;"
-                   control="tx_namespace"
-                   class="olNodeInfoLabel"/>
-            <textbox id="tx_namespace" readonly="true" class="plain"/>
-          </row>
-          <row>
-            <label value="&nodeType.label;"
-                   control="tx_nodeType"
-                   class="olNodeInfoLabel"/>
-            <textbox id="tx_nodeType" readonly="true" class="plain"/>
-          </row>
-        </rows>
-      </grid>
-    
-      <groupbox id="grpAttr" flex="1">
-        <caption label="&grpAttr.label;"/>
-        <tree id="olAttr"
-              class="plain"
-              flex="1"
-              enableColumnDrag="true"
-              contextmenu="ppAttrContext"
-              onselect="viewer.pane.panelset.updateAllCommands()">
-          <treecols>
-            <!-- These labels don't need to be localized since they are defined
-                 by DOM APIs. For column headers labeled as |name| and |value|,
-                 even though we're really accessing the |nodeName| and |nodeValue|
-                 properties, it's fine because they're guaranteed to match
-                 the attributes' |name| and |value|, respectively. -->
-            <treecol id="colNodeName"
-                     label="name"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="colLocalName"
-                     hidden="true"
-                     label="localName"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="colPrefix"
-                     hidden="true"
-                     label="prefix"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="colNamespaceURI"
-                     hidden="true"
-                     label="namespaceURI"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="colNodeValue"
-                     label="value"
-                     persist="width,hidden,ordinal"
-                     flex="1"/>
-          </treecols>
-          <treechildren id="olAttrBody"
-                        alternatingbackground="true"
-                        ondblclick="viewer.pane.panelset.execCommand('cmdEditEdit');"/>
-        </tree>
-      </groupbox>
-
-    </vbox>
-
-    <vbox id="bxText">
-      <textbox id="txbTextNodeValue" multiline="true" flex="1"
-               onchange="viewer.pane.panelset.execCommand('cmdEditTextValue');"/>
-    </vbox>
-  </deck>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.js b/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.js
+++ /dev/null
@@ -1,101 +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/. */
-
-///////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var dialog;
-
-///////////////////////////////////////////////////////////////////////////////
-//// Initialization/Destruction
-
-window.addEventListener("load", DomNodeDialog_initialize, false);
-
-function DomNodeDialog_initialize()
-{
-  dialog = new DomNodeDialog();
-  dialog.initialize();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-//// class DomNodeDialog
-
-function DomNodeDialog()
-{
-  this.mData  = window.arguments[0];
-  this.mTitle = window.arguments[1];
-  this.mDoc   = window.arguments[2];
-
-  this.nodeName  = document.getElementById("tx_nodeName");
-  this.nodeValue = document.getElementById("tx_nodeValue");
-  this.namespace = document.getElementById("tx_namespace");
-  this.menulist  = document.getElementById("ml_namespace");
-}
-
-DomNodeDialog.prototype =
-{
- /**
-  * This function initializes the content of the dialog.
-  */
-  initialize: function initialize()
-  {
-    document.title = this.mTitle;
-    var defaultNS  = document.getElementById("mi_namespace");
-    var customNS   = document.getElementById("mi_custom");
-    var accept     = document.documentElement.getButton("accept");
-
-    accept.disabled        = this.mData.name == null;
-    this.nodeName.value    = this.mData.name || "";
-    this.nodeName.disabled = this.mData.name != null;
-    this.nodeValue.value   = this.mData.value || "";
-    this.menulist.disabled = !this.enableNamespaces();
-    defaultNS.value        = this.mDoc.documentElement.namespaceURI;
-    customNS.value         = this.mData.namespaceURI;
-    this.menulist.value    = this.mData.namespaceURI || "";
-
-    this.toggleNamespace();
-  },
-
- /**
-  * The function that is called on accept.  Sets data.
-  */
-  accept: function accept()
-  {
-    this.mData.name         = this.nodeName.value;
-    this.mData.value        = this.nodeValue.value;
-    this.mData.namespaceURI = this.namespace.value;
-    this.mData.accepted     = true;
-    return true;
-  },
-
- /**
-  * toggleNamespace toggles the namespace textbox based on the namespace menu.
-  */
-  toggleNamespace: function toggleNamespace()
-  {
-    dialog.namespace.disabled = dialog.menulist.selectedItem.id != "mi_custom";
-    dialog.namespace.value    = dialog.menulist.value;
-  },
-
- /**
-  * enableNamespaces determines if the document accepts namespaces or not
-  *
-  * @return True if the document can have namespaced attributes, false
-  *           otherwise.
-  */
-  enableNamespaces: function enableNamespaces()
-  {
-    return this.mDoc.contentType != "text/html";
-  },
-
- /**
-  * toggleAccept enables/disables the Accept button when there is/isn't an
-  *   attribute name.
-  */
-  toggleAccept: function toggleAccept()
-  {
-    document.documentElement.getButton("accept").disabled = 
-      dialog.nodeName.value == "";
-  }
-};
diff --git a/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.xul b/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/domNode/domNodeDialog.xul
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/.
--->
-<!DOCTYPE dialog SYSTEM "chrome://inspector/locale/viewers/domNode.dtd">
-<?xml-stylesheet type="text/css"
-                 href="chrome://inspector/skin/viewers/domNode/domNode.css"?>
-
-<dialog id="editInsertAttribute"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        style="min-width: 64ch;"
-        persist="width"
-        buttons="accept,cancel"
-        ondialogaccept="dialog.accept();">
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/domNode/domNodeDialog.js"/>
-  <grid flex="1">
-    <columns>
-      <column/>
-      <column flex="1"/>
-    </columns>
-    <rows>
-      <row align="center">
-        <label value="&nodeName.label;" control="tx_nodeName"/>
-        <textbox id="tx_nodeName" oninput="dialog.toggleAccept();"/>
-      </row>
-      <row align="center">
-        <label value="&nodeValue.label;" control="tx_nodeValue"/>
-        <textbox id="tx_nodeValue"/>
-      </row>
-      <row align="center">
-        <label value="&namespaceURI.label;" control="ml_namespace"/>
-        <menulist id="ml_namespace" oncommand="dialog.toggleNamespace();">
-          <menupopup id="mp_namespaces">
-            <!-- This must be first, and must have the value attribute set to
-                 "" in order for it to work properly -->
-            <menuitem label="&namespaceTitle.null.label;"
-                      id="mi_NullNS"
-                      value=""/>
-            <menuitem label="&namespaceTitle.XMLNS.label;"
-                      id="mi_XMLNSNS"
-                      value="http://www.w3.org/2000/xmlns/"/>
-            <menuitem label="&namespaceTitle.XML.label;"
-                      id="mi_XMLNS"
-                      value="http://www.w3.org/XML/1998/namespace"/>
-            <menuitem label="&namespaceTitle.XHTML.label;"
-                      id="mi_XHTMLNS"
-                      value="http://www.w3.org/1999/xhtml"/>
-            <menuitem label="&namespaceTitle.XLink.label;"
-                      id="mi_XLinkNS"
-                      value="http://www.w3.org/1999/xlink"/>
-            <menuitem label="&namespaceTitle.XSLT.label;"
-                      id="mi_XSLTNS"
-                      value="http://www.w3.org/1999/XSL/Transform"/>
-            <menuitem label="&namespaceTitle.XBL.label;"
-                      id="mi_XBLNS"
-                      value="http://www.mozilla.org/xbl"/>
-            <menuitem label="&namespaceTitle.MathML.label;"
-                      id="mi_MathMLNS"
-                      value="http://www.w3.org/1998/Math/MathML"/>
-            <menuitem label="&namespaceTitle.RDF.label;"
-                      id="mi_RDFNS"
-                      value="http://www.w3.org/1999/02/22-rdf-syntax-ns"/>
-            <menuitem label="&namespaceTitle.XUL.label;"
-                      id="mi_XULNS"
-                      value="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"/>
-            <menuitem label="&namespaceTitle.SVG.label;"
-                      id="mi_SVGNS"
-                      value="http://www.w3.org/2000/svg"/>
-            <menuitem label="&namespaceTitle.XMLEvents.label;"
-                      id="mi_XMLEventsNS"
-                      value="http://www.w3.org/2001/xml-events"/>
-            <!-- Value set onload -->
-            <menuitem label="&namespaceTitle.default.label;"
-                      id="mi_namespace"/>
-            <!-- Value set onload -->
-            <menuitem label="&namespaceTitle.custom.label;"
-                      id="mi_custom"/>
-          </menupopup>
-        </menulist>
-      </row>
-      <row>
-        <spacer/>
-        <textbox id="tx_namespace"/>
-      </row>
-    </rows>
-  </grid>
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.js b/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.js
+++ /dev/null
@@ -1,36 +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/. */
-
-/*****************************************************************************
-* EvalExprDialog -------------------------------------------------------------
-*   A dialog for entering javascript expression to evaluate and view in the JS
-*   Object Viewer.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-* chrome://inspector/content/jsutil/xpcom/XPCU.js
-*****************************************************************************/
-
-var gViewer = window.arguments[0];
-var gTarget = window.arguments[1];
-
-/**
- * Executes the JavaScript expression entered by the user.
- */
-function execute()
-{
-  var txf = document.getElementById("txfExprInput");
-  var rad = document.getElementById("inspect-new-window");
-  try {
-    gViewer.doEvalExpr(txf.value, gTarget, rad.selected);
-  }
-  catch (ex) {
-    // alert the user of an error in their expression, and don't close
-    let svc = XPCU.getService("@mozilla.org/embedcomp/prompt-service;1",
-                              "nsIPromptService");
-    svc.alert(window, ex.name, ex.message);
-
-    return false;
-  }
-  return true;
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.xul b/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/evalExprDialog.xul
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE dialog [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/jsObject.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin"?>
-
-<dialog id="winEvalExpr"
-        title="&evaluateDialog.title;"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-        ondialogaccept="return execute();"
-        buttonlabelaccept="&jsExecute.label;"
-        style="width: 30em;">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/jsObject/evalExprDialog.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-
-  <stringbundle id="strings"
-                src="chrome://inspector/locale/inspector.properties"/>
-
-  <description>&jsEval.desc;</description>
-
-  <textbox id="txfExprInput"/>
-
-  <groupbox>
-    <caption label="&inspectReturn.label;"/>
-    <radiogroup id="inspect-return-location">
-      <radio id="inspect-existing-window" label="&inspectReturnExisting.label;"
-             selected="true"/>
-      <radio id="inspect-new-window" label="&inspectReturnNew.label;"/>
-    </radiogroup>
-  </groupbox>
-
-</dialog>
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.js b/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.js
+++ /dev/null
@@ -1,27 +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/. */
-
-/***************************************************************
-* JSObjectViewer --------------------------------------------
-*  The viewer for all facets of a javascript object.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-****************************************************************/
-
-//////////// global variables /////////////////////
-
-var viewer;
-var bundle;
-
-//////////////////////////////////////////////////
-
-window.addEventListener("load", JSObjectViewer_initialize, false);
-
-function JSObjectViewer_initialize()
-{
-  bundle = document.getElementById("inspector-bundle");
-  viewer = new JSObjectViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.xul b/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObject.xul
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<?xul-overlay href="chrome://inspector/content/viewers/jsObject/jsObjectViewer.xul"?>
-
-<page id="winJSObject"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/jsObject/jsObject.js"/>
-
-  <stringbundle id="inspector-bundle"/>
-  <commandset id="cmdsEditingExtras"/>
-  <commandset id="cmdsJSObjectViewer"/>
-
-  <popupset>
-    <menupopup id="popupContext"/>
-  </popupset>
-  <tree id="treeJSObject" treelines="true" class="plain"/>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.js b/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.js
+++ /dev/null
@@ -1,617 +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/. */
-
-/*****************************************************************************
-* JSObjectViewer -------------------------------------------------------------
-*  The viewer for all facets of a javascript object.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/hooks.js
-*   chrome://inspector/content/jsutil/events/ObserverManager.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kClipboardHelperCID  = "@mozilla.org/widget/clipboardhelper;1";
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class JSObjectViewer
-
-function JSObjectViewer()
-{
-  this.mObsMan = new ObserverManager(this);
-}
-
-JSObjectViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPane: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  get uid()
-  {
-    return "jsObject";
-  },
-
-  get pane()
-  {
-    return this.mPane;
-  },
-
-  get selection()
-  {
-    return this.mSelection;
-  },
-
-  get subject()
-  {
-    return this.mSubject;
-  },
-
-  set subject(aObject)
-  {
-    var object =
-      "@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-      aObject instanceof Components.interfaces.nsIAccessible ?
-      aObject.DOMNode : aObject;
-
-    this.setSubject(object);
-  },
-
-  // The accessibleObject viewer extends JSObjectViewer.  This method is here
-  // (and not just inlined above) so that the accessibleObject viewer can get
-  // access to this function without having to use __lookupSetter__ before
-  // overriding with its own subject setter.
-  setSubject: function JSOVr_SetSubject(aObject)
-  {
-    this.mSubject = this.unwrapObject(aObject);
-    this.mView = new JSObjectView(this.mSubject);
-    this.mTree.view = this.mView;
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-
-    // If the user has just switched to us from another viewer in the document
-    // pane and we don't set the selection below, the object pane will
-    // continue to show whatever now-irrelevant thing it was showing before.
-    this.mView.selection.select(0);
-    this.mView.toggleOpenState(0);
-  },
-
-  initialize: function JSOVr_Initialize(aPane)
-  {
-    this.mPane = aPane;
-    this.mTree = document.getElementById("treeJSObject");
-
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function JSOVr_Destroy()
-  {
-  },
-
-  isCommandEnabled: function JSOVr_IsCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdCopyValue":
-      case "cmdEvalExpr":
-        return this.getSelectedCount() == 1;
-      case "cmdEditInspectInNewWindow":
-        if (this.getSelectedCount() != 1) {
-          return false;
-        }
-        let obj = this.getSelectedObject();
-        return cmdEditInspectInNewWindowBase.isInspectable(obj);
-    }
-    return false;
-  },
-
-  getCommand: function JSOVr_GetCommand(aCommand)
-  {
-    if (aCommand in window) {
-      return new window[aCommand]();
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function JSOVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function JSOVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// UI Commands
-
-  cmdCopyValue: function JSOVr_CmdCopyValue()
-  {
-    if (this.getSelectedCount() != 1) {
-      return;
-    }
-
-    var obj = this.getSelectedObject();
-    var helper = XPCU.getService(kClipboardHelperCID, "nsIClipboardHelper");
-    helper.copyString(obj);
-  },
-
-  cmdEvalExpr: function JSOVr_CmdEvalExpr()
-  {
-    if (this.getSelectedCount() != 1) {
-      return;
-    }
-
-    var obj = this.getSelectedObject();
-    openDialog("chrome://inspector/content/viewers/jsObject/evalExprDialog.xul",
-               "_blank", "chrome", this, obj);
-  },
-
-  doEvalExpr: function JSOVr_DoEvalExpr(aExpr, aTarget, aNewView)
-  {
-    // TODO: I should really write some C++ code to execute the js code in the
-    // js context of the inspected window
-
-    try {
-      var f = Function("target", aExpr);
-      var result = f(aTarget);
-
-      if (result) {
-        if (aNewView) {
-          inspectObject(result);
-        }
-        else {
-          this.subject = result;
-        }
-      }
-    }
-    catch (ex) {
-      dump("Error in expression.\n");
-      throw (ex);
-    }
-  },
-
-  getSelectedCount: function JSOVr_GetSelectedCount()
-  {
-    return this.mView.selection.count;
-  },
-
-  getSelectedObject: function JSOVr_GetSelectedObject()
-  {
-    if (this.getSelectedCount() != 1) {
-      throw new Error("Selection count not 1");
-    }
-    return this.mView.getSelectedRowObjects()[0];
-  },
-
-  onTreeSelectionChange: function JSOVr_OnTreeSelectionChange()
-  {
-    // NB: This function gets called on selection *and* deselection.
-    var view = this.mView;
-    var currentIndex = view.selection.currentIndex;
-    var currentValue = view.getRowObjectFromIndex(currentIndex);
-
-    if (view.selection.isSelected(currentIndex)) {
-      this.changeSelection(currentValue);
-    }
-    // Otherwise, the row at currentIndex was deselected.  If there are other
-    // rows selected, use the nearest one for mSelection.  If not, we'll leave
-    // mSelection alone and won't dispatch any event; if there's an object
-    // panel linked to ours, just let it keep inspecting the value from the
-    // deselected row.
-    else if (this.mSelection == currentValue && view.selection.count) {
-      var nearestSelectedIndex = 
-        InsUtil.getNearestIndex(currentIndex, view.getSelectedIndices());
-      this.changeSelection(view.getRowObjectFromIndex(nearestSelectedIndex));
-    }
-
-    this.updateAllCommands();
-  },
-
-  changeSelection: function JSOVr_ChangeSelection(aVal)
-  {
-    this.mSelection = aVal;
-    this.mObsMan.dispatchEvent("selectionChange", { selection: aVal });
-  },
-
-  updateAllCommands: function JSOVr_UpdateAllCommands()
-  {
-    this.pane.panelset.updateAllCommands();
-
-    // There's no need to worry about any other commands outside this
-    // commandset; cmdInspectInNewWindow is global, so it just got updated.
-    var commands = document.getElementById("cmdsJSObjectViewer").childNodes;
-    for (let i = 0, n = commands.length; i < n; ++i) {
-      let command = commands[i];
-      if (this.isCommandEnabled(command.id)) {
-        command.removeAttribute("disabled");
-      }
-      else {
-        command.setAttribute("disabled", true);
-      }
-    }
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Miscellaneous Utility Methods
-
-  unwrapObject: function JSOVr_UnwrapObject(aObject)
-  {
-    /* unwrap() throws for primitive values, so don't call it for those */
-    if (typeof(aObject) === "object" && aObject) {
-      aObject = XPCNativeWrapper.unwrap(aObject);
-    }
-    return aObject;
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// JSObjectView
-
-function JSObjectView(aObject)
-{
-  this.mKeys = [bundle.getString("root.title")];
-  this.mValues = [aObject];
-  this.mValueStrings = [this.jsValueToString(aObject)];
-
-  this.mLevels = [0];
-  this.mOpenStates = [false];
-
-  this.mRowCount = 1;
-}
-
-JSObjectView.prototype = new inBaseTreeView();
-
-JSObjectView.prototype.mLevels = null;
-JSObjectView.prototype.mValues = null;
-JSObjectView.prototype.mValueStrings = null;
-JSObjectView.prototype.mLevels = null;
-JSObjectView.prototype.mOpenStates = null;
-
-JSObjectView.prototype.jsValueToString = function JSOV_JSValueToString(aVal)
-{
-  var str;
-  try {
-    str = String(aVal);
-  }
-  catch (ex) {
-    str = Object.prototype.toString.call(aVal);
-  }
-
-  if (typeof(aVal) == "string") {
-    str = "\"" + str + "\"";
-  }
-
-  return str;
-};
-
-/**
- * Sort the keys for an object into the following order:
- * - constants with numeric values sorted numerically by value
- *   - sorted alphanumerically by key in the event of a tie
- * - constants with non-numeric values sorted alphanumerically by key
- * - other numeric key names (e.g., array indices) sorted numerically
- * - other key names sorted alphanumerically
- * @param aObject
- *        The object whose keys we're sorting.
- * @param aKeys
- *        The list of property names of aObject being sorted.
- */
-JSObjectView.prototype.sortKeys = function JSOV_SortKeys(aObject, aKeys)
-{
-  /**
-   * A sort comparator for numeric values. Numerics come before non-numerics.
-   * If both parameters are non-numeric, returns 0.
-   */
-  var numericSortComparator =
-    function JSOV_SortKeys_NumericSortComparator(a, b)
-  {
-    if (isNaN(a)) {
-      return isNaN(b) ? 0 : 1;
-    }
-    if (isNaN(b)) {
-      return -1;
-    }
-    return a - b;
-  };
-
-  var keySortComparator = function JSOV_SortKeys_KeySortComparator(a, b)
-  {
-    var aIsConstant = a == a.toUpperCase() && isNaN(a);
-    var bIsConstant = b == b.toUpperCase() && isNaN(b);
-    // constants come first
-    if (aIsConstant) {
-      if (bIsConstant) {
-        // both are constants. sort by numeric value, then non-numeric name
-        return numericSortComparator(aObject[a], aObject[b]) ||
-               a.localeCompare(b);
-      }
-      // a is constant, b is not
-      return -1;
-    }
-    if (bIsConstant) {
-      // b is constant, a is not
-      return 1;
-    }
-    // neither are constants. go by numeric property name, then non-numeric
-    // property name
-    return numericSortComparator(a, b) || a.localeCompare(b);
-  };
-
-  aKeys.sort(keySortComparator);
-};
-
-/**
- * Get the number of rows that are descendants of the given row.
- * @param aIndex
- *        The index of the row.
- * @return The number of descendants, as above.
- */
-JSObjectView.prototype.getDescendantCount =
-  function JSOV_GetDescendantCount(aIndex)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    return 0;
-  }
-
-  var level = this.mLevels[aIndex];
-  var currentIndex = aIndex + 1;
-  var rowCount = this.mRowCount;
-  while (this.mLevels[currentIndex] > level && currentIndex < rowCount) {
-    ++currentIndex;
-  }
-
-  return currentIndex - aIndex - 1;
-};
-
-JSObjectView.prototype.getRowObjectFromIndex =
-  function JSOV_GetRowObjectFromIndex(aIndex)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    throw new RangeError("Invalid index " + aIndex);
-  }
-
-  return this.mValues[aIndex];
-}
-
-JSObjectView.prototype.collapseRow = function JSOV_CollapseRow(aIndex)
-{
-  var rowsDeleted = this.getDescendantCount(aIndex);
-  if (rowsDeleted) {
-    let after = aIndex + 1;
-    this.mKeys.splice(after, rowsDeleted);
-    this.mValues.splice(after, rowsDeleted);
-    this.mValueStrings.splice(after, rowsDeleted);
-    this.mOpenStates.splice(after, rowsDeleted);
-    this.mLevels.splice(after, rowsDeleted);
-  }
-  return rowsDeleted;
-};
-
-JSObjectView.prototype.expandRow = function JSOV_ExpandRow(aIndex)
-{
-  var insertedKeys = [];
-  var insertedValues = [];
-  var insertedValueStrings = [];
-  var insertedOpenStates = [];
-  var insertedLevels = [];
-
-  // Get the new keys.
-  var obj = this.mValues[aIndex];
-  for (let key in obj) {
-    // Not pretty, but we need some way to weed out properties that throw.
-    // It's not as simple as just going ahead and caching the values now,
-    // because when we sort the keys, we'd lose the correspondence between
-    // array indices.
-    try {
-      let val = obj[key];
-      insertedKeys.push(key);
-    }
-    catch (ex) {
-      // Faked properties throw NOT_YET_IMPLEMENTED.  Discard them.
-    }
-  }
-  this.sortKeys(obj, insertedKeys);
-
-  // Get the new data.
-  var rowsInserted = insertedKeys.length;
-  var level = this.mLevels[aIndex] + 1;
-  for (let i = 0; i < rowsInserted; ++i) {
-    let val = viewer.unwrapObject(obj[insertedKeys[i]]);
-    insertedValues.push(val);
-    insertedValueStrings.push(this.jsValueToString(val));
-    insertedOpenStates.push(false);
-    insertedLevels.push(level);
-  }
-
-  // Splice in everything.
-  var after = aIndex + 1;
-  this.spliceFrom(this.mKeys, after, insertedKeys);
-  this.spliceFrom(this.mValues, after, insertedValues);
-  this.spliceFrom(this.mValueStrings, after, insertedValueStrings);
-  this.spliceFrom(this.mOpenStates, after, insertedOpenStates);
-  this.spliceFrom(this.mLevels, after, insertedLevels);
-
-  return rowsInserted;
-};
-
-/**
- * Splice elements copied from one array into another at the given index.
- * There is no way to specify that any elements should be removed.
- * @param aDestination
- *        The array the data should be spliced into.
- * @param aIndex
- *        The index into aDestination that the data should be copied to.
- * @param aSource
- *        The array that should be copied into aDestination at aIndex.
- */
-JSObjectView.prototype.spliceFrom =
-  function JSOV_SpliceFrom(aDestination, aIndex, aSource)
-{
-  Array.prototype.splice.apply(aDestination, ([aIndex, 0]).concat(aSource));
-};
-
-/**
- * Check if the purported row is outside the range of valid row indexes.
- * @param aIndex
- *        The index of the given row.
- * @return true iff aIndex is outside the range
- */
-JSObjectView.prototype.checkForBadIndex =
-  function JSOV_CheckForBadIndex(aIndex)
-{
-  if (aIndex < 0 || aIndex >= this.mRowCount) {
-    Components.utils.reportError("Bad index");
-    return true;
-  }
-
-  return false;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// JSObjectView nsITreeView Implementation
-
-JSObjectView.prototype.toggleOpenState = function JSOV_ToggleOpenState(aIndex)
-{
-  if (this.isContainerEmpty(aIndex)) {
-    return;
-  }
-
-  var rowCountChange = 0;
-  var isOpen = this.mOpenStates[aIndex];
-  if (isOpen) {
-    rowCountChange = -this.collapseRow(aIndex);
-  }
-  else {
-    rowCountChange = this.expandRow(aIndex);
-  }
-  this.mOpenStates[aIndex] = !isOpen;
-
-  this.mRowCount += rowCountChange;
-
-  // Notify the box object.
-  var bo = this.mTree;
-  if (bo) {
-    bo.rowCountChanged(aIndex + 1, rowCountChange);
-    bo.invalidateRow(aIndex);
-  }
-};
-
-JSObjectView.prototype.getCellText = function JSOV_GetCellText(aIndex, aCol)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    return "";
-  }
-
-  switch (aCol.id) {
-    case "colProp":
-      return this.mKeys[aIndex];
-    case "colVal":
-      return this.mValueStrings[aIndex];
-  }
-  return "";
-};
-
-JSObjectView.prototype.getParentIndex = function JSOV_GetParentIndex(aIndex)
-{
-  if (this.checkForBadIndex(aIndex) || aIndex == 0) {
-    return -1;
-  }
-
-  var parentLevel = this.mLevels[aIndex] - 1;
-  for (let i = aIndex - 1; i >= 0; --i) {
-    if (this.mLevels[i] == parentLevel) {
-      return i;
-    }
-  }
-
-  Components.utils.reportError("Unrooted rows present");
-  return -1;
-};
-
-JSObjectView.prototype.hasNextSibling =
-  function JSOV_HasNextSibling(aIndex, aAfterIndex)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    return false;
-  }
-
-  var level = this.mLevels[aIndex];
-  for (let i = aAfterIndex + 1, n = this.mRowCount; i < n; ++i) {
-    if (this.mLevels[i] == level) {
-      return true;
-    }
-    if (this.mLevels[i] < level) {
-      break;
-    }
-  }
-
-  return false;
-};
-
-JSObjectView.prototype.getLevel = function JSOV_GetLevel(aIndex)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    return -1;
-  }
-
-  return this.mLevels[aIndex];
-};
-
-JSObjectView.prototype.isContainer = function JSOV_IsContainer(aIndex)
-{
-  if (this.checkForBadIndex(aIndex)) {
-    return false;
-  }
-
-  return cmdEditInspectInNewWindowBase.isInspectable(this.mValues[aIndex]);
-};
-
-JSObjectView.prototype.isContainerEmpty =
-  function JSOV_IsContainerEmpty(aIndex)
-{
-  if (!this.isContainer(aIndex)) {
-    return true;
-  }
-
-  var val = this.mValues[aIndex];
-  for (let key in val) {
-    return false;
-  }
-
-  return true;
-};
-
-JSObjectView.prototype.isContainerOpen = function JSOV_IsContainerOpen(aIndex)
-{
-  if (!this.isContainer(aIndex)) {
-    return false;
-  }
-
-  return this.mOpenStates[aIndex];
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Transactions
-
-function cmdEditInspectInNewWindow()
-{
-  if (viewer.getSelectedCount() == 1) {
-    this.mObject = viewer.getSelectedObject();
-  }
-}
-
-cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.xul b/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/jsObject/jsObjectViewer.xul
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0"?>
-
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/jsObject.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/inspector.css"?>
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/jsObject/jsObjectViewer.js"/>
-
-  <stringbundle id="inspector-bundle"
-                src="chrome://inspector/locale/inspector.properties"/>
-
-  <commandset id="cmdsEditingExtras"/>
-  <commandset id="cmdsJSObjectViewer">
-    <command id="cmdCopyValue" oncommand="viewer.cmdCopyValue();"/>
-    <command id="cmdEvalExpr" oncommand="viewer.cmdEvalExpr();"/>
-  </commandset>
-
-  <menupopup id="popupContext">
-    <!-- mnEditInspectInNewWindow is overlaid by editingOverlay.xul -->
-    <menuitem id="mnEditInspectInNewWindow"/>
-    <menuseparator/>
-    <menuitem label="&jsCopyValue.label;" command="cmdCopyValue"/>
-    <menuitem label="&jsEval.label;" command="cmdEvalExpr"/>
-  </menupopup>
-
-  <tree id="treeJSObject" flex="1" context="popupContext"
-        onselect="viewer.onTreeSelectionChange();">
-    <treecols>
-      <treecol id="colProp" flex="1" primary="true"
-               label="&jsProperty.label;"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="colVal" flex="1" label="&jsValue.label;"/>
-    </treecols>
-
-    <treechildren id="trchJSObject"/>
-  </tree>
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/viewers/styleRules/commandOverlay.xul b/suite/extensions/inspector/resources/content/viewers/styleRules/commandOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/styleRules/commandOverlay.xul
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
-
-<overlay id="ovStyleRulesViewerCommands"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <commandset id="cmdsGlobalCommands">
-
-  </commandset>
-
-</overlay>
-
-        
diff --git a/suite/extensions/inspector/resources/content/viewers/styleRules/keysetOverlay.xul b/suite/extensions/inspector/resources/content/viewers/styleRules/keysetOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/styleRules/keysetOverlay.xul
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/dom.dtd">
-
-<overlay id="ovDOMViewerKeyset"
-         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <keyset id="ksGlobalKeyset">
-    <key id="key:find" key="&cmdShowFindDialog.accelkey;" observes="cmd:find"
-         modifiers="accel"/>
-    <key id="key:findNext" keycode="VK_F3" observes="cmd:findNext"/>
-  </keyset>
-
-</overlay>
diff --git a/suite/extensions/inspector/resources/content/viewers/styleRules/popupOverlay.xul b/suite/extensions/inspector/resources/content/viewers/styleRules/popupOverlay.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/styleRules/popupOverlay.xul
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE overlay SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
-
-<overlay id="ovStyleRulesViewerPopup"
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  
-  <popupset id="ppsViewerPopupset">
-    <!--
-    <menupopup id="ppViewerContext-styleRules">
-    </menupopup>
-    -->
-  </popupset>
-
-</overlay>
-
-        
diff --git a/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.js b/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.js
+++ /dev/null
@@ -1,806 +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/. */
-
-/*****************************************************************************
-* StyleRulesViewer -----------------------------------------------------------
-*  The viewer for CSS style rules that apply to a DOM element.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/jsutil/rdf/RDFU.js
-*   chrome://global/content/viewSourceUtils.js
-*   chrome://inspector/content/jsutil/commands/baseCommands.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-var gPromptService;
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kDOMUtilsCID = "@mozilla.org/inspector/dom-utils;1";
-const kPromptServiceCID = "@mozilla.org/embedcomp/prompt-service;1";
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", StyleRulesViewer_initialize, false);
-
-function StyleRulesViewer_initialize()
-{
-  viewer = new StyleRulesViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-
-  gPromptService = XPCU.getService(kPromptServiceCID, "nsIPromptService");
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class StyleRulesViewer
-
-function StyleRulesViewer() // implements inIViewer
-{
-  this.mObsMan = new ObserverManager(this);
-
-  this.mURL = window.location;
-  this.mRuleTree = document.getElementById("olStyleRules");
-  this.mRuleBoxObject = this.mRuleTree.treeBoxObject;
-  this.mPropsTree = document.getElementById("olStyleProps");
-  this.mPropsBoxObject = this.mPropsTree.treeBoxObject;
-  this.mFocusedTree = null;
-  this.mDOMUtils = XPCU.getService(kDOMUtilsCID, "inIDOMUtils");
-}
-
-StyleRulesViewer.prototype =
-{
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPanel: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Interface inIViewer
-
-  get uid()
-  {
-    return "styleRules"
-  },
-
-  get pane()
-  {
-    return this.mPanel
-  },
-
-  get selection()
-  {
-    return null
-  },
-
-  get subject()
-  {
-    return this.mSubject
-  },
-
-  set subject(aObject)
-  {
-    this.mSubject =
-      ("@mozilla.org/accessibleRetrieval;1" in Components.classes &&
-       aObject instanceof Components.interfaces.nsIAccessible) ?
-      aObject.DOMNode : aObject;
-
-    // update the rule tree
-    this.mRuleView = new StyleRuleView(this.mSubject);
-    this.mRuleBoxObject.view = this.mRuleView;
-    // clear the props tree
-    this.mPropsTree.disabled = true;
-    this.mPropsTree.contextMenu = null;
-    this.mPropsView = null;
-    this.mPropsBoxObject.view = null;
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  initialize: function SRVr_Initialize(aPane)
-  {
-    this.mPanel = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function SRVr_Destroy()
-  {
-    // We need to remove the views at this time or else they will attempt to
-    // re-paint while the document is being deconstructed, resulting in
-    // some nasty XPConnect assertions
-    this.mRuleBoxObject.view = null;
-    this.mPropsBoxObject.view = null;
-  },
-
-  isCommandEnabled: function SRVr_IsCommandEnabled(aCommand)
-  {
-    var rule = this.getSelectedRule();
-    var fileURI = rule && rule.parentStyleSheet && rule.parentStyleSheet.href;
-    // XXX can't edit resource: stylesheets because of bug 343508, and
-    // CSSFontFaceRules because of bug 443978
-    var isEditable = !(/^resource:/.test(fileURI) ||
-                       rule instanceof CSSFontFaceRule);
-
-    var propFocus = this.mFocusedTree == this.mPropsTree;
-    var propCount = this.mPropsTree.view.selection.count;
-
-    switch (aCommand) {
-      // ppStylePropsContext
-      // The first three of these are context-sensitive; until they are
-      // supported for the rule pane, they are meaningless when it has focus.
-      case "cmdEditCopy":
-        return propFocus && propCount > 0;
-      case "cmdEditDelete":
-        return isEditable && propFocus && propCount > 0;
-      case "cmdEditInsert":
-        return isEditable && propFocus;
-      case "cmdTogglePriority":
-        return isEditable && propCount > 0;
-      case "cmdEditEdit":
-        return isEditable && propCount == 1;
-      // ppStyleRulesContext
-      case "cmdEditCopyFileURI":
-      case "cmdEditViewFileURI":
-        return !!fileURI;
-    }
-    return false;
-  },
-
-  getCommand: function SRVr_GetCommand(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCopy":
-        return new cmdEditCopy(this.mPropsView.getSelectedRowObjects());
-      case "cmdEditDelete":
-        return new cmdEditDelete(this.getSelectedDec(),
-                                 this.mPropsView.getSelectedRowObjects());
-      case "cmdEditInsert":
-        var bundle = this.mPanel.panelset.stringBundle;
-        var msg = bundle.getString("styleRulePropertyName.message");
-        var title = bundle.getString("styleRuleNewProperty.title");
-
-        var property = { value: "" };
-        var value = { value: "" };
-        var dummy = { value: false };
-
-        if (!gPromptService.prompt(window, title, msg, property, null,
-                                   dummy)) {
-          return null;
-        }
-
-        msg = bundle.getString("styleRulePropertyValue.message");
-        if (!gPromptService.prompt(window, title, msg, value, null, dummy)) {
-          return null;
-        }
-
-        return new cmdEditInsert(this.getSelectedDec(), property.value,
-                                  value.value, "");
-      case "cmdEditEdit":
-        var rule = this.getSelectedDec();
-        var property = this.getSelectedProp();
-        var priority = rule.getPropertyPriority(property);
-
-        var bundle = this.mPanel.panelset.stringBundle;
-        var msg = bundle.getString("styleRulePropertyValue.message");
-        var title = bundle.getString("styleRuleEditProperty.title");
-
-        var value = { value: rule.getPropertyValue(property) };
-        var dummy = { value: false };
-
-        if (!gPromptService.prompt(window, title, msg, value, null, dummy)) {
-          return null;
-        }
-
-        return new cmdEditEdit(rule, property, value.value, priority);
-      case "cmdTogglePriority":
-        return new cmdTogglePriority(this.getSelectedDec(),
-                                     this.mPropsView.getSelectedRowObjects());
-      case "cmdEditCopyFileURI":
-        return new cmdEditCopyFileURI(this.getSelectedRule());
-      case "cmdEditViewFileURI":
-        return new cmdEditViewFileURI(this.getSelectedRule());
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function SRVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function SRVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Uncategorized
-
-  get DOMUtils() {
-    return this.mDOMUtils;
-  },
-
-  getSelectedDec: function SRVr_GetSelectedDec()
-  {
-    var idx = this.mRuleTree.currentIndex;
-    return this.mRuleView.selection.count == 1 ?
-             this.mRuleView.getDecAt(idx) :
-             null;
-  },
-
-  getSelectedProp: function SRVr_GetSelectedProp()
-  {
-    if (this.mPropsView.selection.count != 1) {
-      return null;
-    }
-    var dec = this.getSelectedDec();
-    // API awkwardness
-    var min = {}, max = {};
-    this.mPropsView.selection.getRangeAt(0, min, max);
-    return dec.item(min.value);
-  },
-
-  getSelectedRule: function SRVr_GetSelectedRule()
-  {
-    var idx = this.mRuleTree.currentIndex;
-    return this.mRuleView.selection.count == 1 ?
-             this.mRuleView.getRuleAt(idx) :
-             null;
-  },
-
-  onRuleSelect: function SRVr_OnRuleSelect()
-  {
-    var dec = this.getSelectedDec();
-    this.mPropsView = new StylePropsView(dec);
-    this.mPropsBoxObject.view = this.mPropsView;
-    viewer.pane.panelset.updateAllCommands();
-    // for non-style rules, change props tree depending on its relevance
-    this.mPropsTree.disabled = !dec;
-    this.mPropsTree.contextMenu = dec ? "ppStylePropsContext" : null;
-  },
-
-  onPropSelect: function SRVr_OnPropSelect()
-  {
-    viewer.pane.panelset.updateAllCommands();
-  },
-
-  onTreeFocus: function SRVr_OnTreeFocus(aTree)
-  {
-    this.mFocusedTree = aTree;
-    viewer.pane.panelset.updateAllCommands();
-  },
-
-  onPopupShowing: function SRVr_OnPopupShowing(aCommandSetId)
-  {
-    var commandset = document.getElementById(aCommandSetId);
-    for (let i = 0; i < commandset.childNodes.length; i++) {
-      var command = commandset.childNodes[i];
-      command.setAttribute("disabled", !viewer.isCommandEnabled(command.id));
-    }
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// StyleRuleView
-
-function StyleRuleView(aObject)
-{
-  this.mLevel = [];
-  this.mOpen = [];
-  if (aObject instanceof Components.interfaces.nsIDOMCSSStyleSheet) {
-    document.getElementById("olcRule").setAttribute("primary", "true");
-    this.mSheetRules = [];
-    for (let i = 0; i < aObject.cssRules.length; i++) {
-      this.mSheetRules[i] = aObject.cssRules[i];
-      this.mLevel[i] = 0;
-      this.mOpen[i] = false;
-    }
-  }
-  else {
-    document.getElementById("olcRule").removeAttribute("primary");
-    this.mRules = viewer.DOMUtils.getCSSStyleRules(aObject);
-    if (aObject.hasAttribute("style")) {
-      try {
-        this.mStyleAttribute =
-          new XPCNativeWrapper(aObject, "style").style;
-      }
-      catch (ex) {
-      }
-    }
-  }
-}
-
-StyleRuleView.prototype = new inBaseTreeView();
-
-StyleRuleView.prototype.mSheetRules = null;
-StyleRuleView.prototype.mLevel = null;
-StyleRuleView.prototype.mOpen = null;
-StyleRuleView.prototype.mRules = null;
-StyleRuleView.prototype.mStyleAttribute = null;
-
-StyleRuleView.prototype.getRuleAt = function SRV_GetRuleAt(aRow)
-{
-  if (aRow >= 0) {
-    if (this.mRules) {
-      var rule = this.mRules.GetElementAt(aRow);
-      try {
-        return XPCU.QI(rule, "nsIDOMCSSStyleRule");
-      }
-      catch (ex) {
-      }
-    }
-    else {
-      return this.mSheetRules[aRow];
-    }
-  }
-  return null;
-}
-
-StyleRuleView.prototype.getDecAt = function SRV_GetDecAt(aRow)
-{
-  if (aRow >= 0) {
-    if (this.mRules) {
-      if (this.mStyleAttribute && aRow == this.mRules.Count()) {
-        return this.mStyleAttribute;
-      }
-      var rule = this.mRules.GetElementAt(aRow);
-      try {
-        return XPCU.QI(rule, "nsIDOMCSSStyleRule").style;
-      }
-      catch (ex) {
-      }
-    }
-    // for CSSStyleRule, CSSFontFaceRule, CSSPageRule, and
-    // ElementCSSInlineStyle
-    else if ("style" in this.mSheetRules[aRow]) {
-      return this.mSheetRules[aRow].style;
-    }
-  }
-  return null;
-}
-
-StyleRuleView.prototype.getChildCount = function SRV_GetChildCount(aRow)
-{
-  if (aRow >= 0) {
-    var rule = this.mSheetRules[aRow];
-    if (rule instanceof CSSImportRule) {
-      return rule.styleSheet ? rule.styleSheet.cssRules.length : 0;
-    }
-    if (rule instanceof CSSMediaRule ||
-        rule instanceof CSSMozDocumentRule) {
-      return rule.cssRules.length;
-    }
-  }
-  return 0;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Interface nsITreeView (Override inBaseTreeView)
-
-StyleRuleView.prototype.__defineGetter__("rowCount", function()
-{
-  if (this.mRules) {
-    return this.mRules.Count() + (this.mStyleAttribute ? 1 : 0);
-  }
-  if (this.mSheetRules) {
-    return this.mSheetRules.length;
-  }
-  return 0;
-});
-
-StyleRuleView.prototype.getCellText = function SRV_GetCellText(aRow, aCol)
-{
-  if (aRow > this.rowCount) {
-    return "";
-  }
-
-  // special case for the style attribute
-  if (this.mStyleAttribute && aRow == this.mRules.Count()) {
-    if (aCol.id == "olcRule") {
-      return 'style=""';
-    }
-
-    if (aCol.id == "olcFileURL") {
-      // we ought to be able to get to the URL...
-      return "";
-    }
-
-    if (aCol.id == "olcLine") {
-      return "";
-    }
-    return "";
-  }
-
-  var rule = this.getRuleAt(aRow);
-  if (!rule) {
-    return "";
-  }
-
-  if (aCol.id == "olcRule") {
-    if (rule instanceof CSSStyleRule) {
-      return rule.selectorText;
-    }
-    if (rule instanceof CSSFontFaceRule) {
-      return "@font-face";
-    }
-    if (rule instanceof CSSMediaRule ||
-        rule instanceof CSSMozDocumentRule) {
-      // get rule text up until the block begins, and trim off whitespace
-      return rule.cssText.replace(/\s*{[\s\S]*/, "");
-    }
-    return rule.cssText;
-  }
-
-  if (aCol.id == "olcFileURL") {
-    return rule.parentStyleSheet ? rule.parentStyleSheet.href : "";
-  }
-
-  if (aCol.id == "olcLine") {
-    return rule.type == CSSRule.STYLE_RULE ?
-                          viewer.DOMUtils.getRuleLine(rule) :
-                          "";
-  }
-
-  return "";
-}
-
-StyleRuleView.prototype.getLevel = function SRV_GetLevel(aRow)
-{
-  if (aRow in this.mLevel) {
-    return this.mLevel[aRow];
-  }
-  return 0;
-}
-
-StyleRuleView.prototype.getParentIndex = function SRV_GetParentIndex(aRow)
-{
-  var level = this.getLevel(aRow);
-  for (let i = aRow - 1; i >= 0; --i) {
-    if (this.getLevel(i) < level) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-StyleRuleView.prototype.hasNextSibling =
-  function SRV_HasNextSibling(aRow, aAfter)
-{
-  var baseLevel = this.getLevel(aRow);
-  var rowCount = this.rowCount; // quick access since this property is dynamic
-  for (let i = aAfter + 1; i < rowCount; ++i) {
-    if (this.getLevel(i) < baseLevel) {
-      break;
-    }
-    if (this.getLevel(i) == baseLevel) {
-      return true;
-    }
-  }
-  return false;
-}
-
-StyleRuleView.prototype.isContainer = function SRV_IsContainer(aRow)
-{
-  if (this.mSheetRules) {
-    if (this.mSheetRules[aRow] instanceof CSSImportRule ||
-        this.mSheetRules[aRow] instanceof CSSMediaRule ||
-        this.mSheetRules[aRow] instanceof CSSMozDocumentRule) {
-      return true;
-    }
-  }
-  return false;
-}
-
-StyleRuleView.prototype.isContainerEmpty = function SRV_IsContainerEmpty(aRow)
-{
-  return !this.getChildCount(aRow);
-}
-
-StyleRuleView.prototype.isContainerOpen = function SRV_IsContainerOpen(aRow)
-{
-  return this.mOpen[aRow];
-}
-
-StyleRuleView.prototype.toggleOpenState = function SRV_ToggleOpenState(aRow)
-{
-  var oldLength = this.mSheetRules.length;
-  var childLevel = this.mLevel[aRow] + 1;
-  if (this.mOpen[aRow]) {
-    // find the number of children and other descendants
-    let count = this.mSheetRules.length - aRow - 1;
-    for (let i = aRow + 1, n = this.mSheetRules.length; i < n; ++i) {
-      if (this.mLevel[i] < childLevel) {
-        count = i - aRow - 1;
-        break;
-      }
-    }
-    this.mSheetRules.splice(aRow + 1, count);
-    this.mLevel.splice(aRow + 1, count);
-    this.mOpen.splice(aRow + 1, count);
-  }
-  else {
-    var inserts = [];
-    var rule = this.mSheetRules[aRow];
-    if (rule instanceof CSSImportRule) {
-      // @import is tricky, because its styleSheet property is allowed to be
-      // null if its media-type qualifier isn't supported, among other
-      // reasons.
-      inserts = rule.styleSheet ? rule.styleSheet.cssRules : [];
-    }
-    else if (rule instanceof CSSMediaRule ||
-             rule instanceof CSSMozDocumentRule) {
-      inserts = rule.cssRules;
-    }
-    // make space for children
-    var count = this.getChildCount(aRow);
-    for (let i = this.rowCount - 1; i > aRow; --i) {
-      this.mSheetRules[i + count] = this.mSheetRules[i];
-      this.mLevel[i + count] = this.mLevel[i];
-      this.mOpen[i + count] = this.mOpen[i];
-    }
-    // fill in children
-    for (let i = 0; i < inserts.length; ++i) {
-      this.mSheetRules[aRow + 1 + i] = inserts[i];
-      this.mLevel[aRow + 1 + i] = childLevel;
-      this.mOpen[aRow + 1 + i] = false;
-    }
-  }
-  this.mOpen[aRow] = !this.mOpen[aRow];
-  viewer.mRuleTree.treeBoxObject.rowCountChanged(aRow + 1,
-    this.mSheetRules.length - oldLength);
-  viewer.mRuleTree.treeBoxObject.invalidateRow(aRow);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// StylePropsView
-
-function StylePropsView(aDec)
-{
-  this.mDec = aDec;
-}
-
-StylePropsView.prototype = new inBaseTreeView();
-
-StylePropsView.prototype.__defineGetter__("rowCount", function()
-{
-  return this.mDec ? this.mDec.length : 0;
-});
-
-StylePropsView.prototype.getCellProperties =
-  function SPV_GetCellProperties(aRow, aCol)
-{
-  if (aCol.id == "olcPropPriority") {
-    var prop = this.mDec.item(aRow);
-    if (this.mDec.getPropertyPriority(prop) == "important") {
-      return "important";
-    }
-  }
-
-  return "";
-}
-
-StylePropsView.prototype.getCellText = function SPV_GetCellText(aRow, aCol)
-{
-  var prop = this.mDec.item(aRow);
-
-  if (aCol.id == "olcPropName") {
-    return prop;
-  }
-  else if (aCol.id == "olcPropValue") {
-    return this.mDec.getPropertyValue(prop)
-  }
-
-  return null;
-}
-
-/**
- * Returns a CSSProperty for the row in the tree corresponding to the
- * passed index.
- * @param aIndex
- *        index of the row in the tree
- * @return a CSSProperty
- */
-StylePropsView.prototype.getRowObjectFromIndex =
-  function SPV_GetRowObjectFromIndex(aIndex)
-{
-  var prop = this.mDec.item(aIndex);
-  return new CSSProperty(prop, this.mDec.getPropertyValue(prop),
-                         this.mDec.getPropertyPriority(prop));
-}
-
-/**
- * Handles inserting a CSS property
- * @param aRule
- *        the rule that will contain the new property
- * @param aProperty
- *        the name of the new property
- * @param aValue
- *        the value of the new property
- * @param aPriority
- *        the priority of the new property ("important" or "")
- */
-function cmdEditInsert(aRule, aProperty, aValue, aPriority)
-{
-  this.rule = aRule;
-  this.property = aProperty;
-  this.value = aValue;
-  this.priority = aPriority;
-}
-
-cmdEditInsert.prototype = new inBaseCommand(false);
-
-cmdEditInsert.prototype.doTransaction = function Insert_DoTransaction()
-{
-  viewer.mPropsBoxObject.beginUpdateBatch();
-  try {
-    this.rule.setProperty(this.property, this.value, this.priority);
-  }
-  finally {
-    viewer.mPropsBoxObject.endUpdateBatch();
-  }
-};
-
-cmdEditInsert.prototype.undoTransaction = function Insert_UndoTransaction()
-{
-  this.rule.removeProperty(this.property);
-  viewer.mPropsBoxObject.invalidate();
-};
-
-/**
- * Handles deleting CSS properties
- * @param aRule
- *        the rule containing the properties
- * @param aProperties
- *        an array of CSSPropertys to delete
- */
-function cmdEditDelete(aRule, aProperties)
-{
-  this.rule = aRule;
-  this.properties = aProperties;
-}
-
-cmdEditDelete.prototype = new inBaseCommand(false);
-
-cmdEditDelete.prototype.doTransaction = function Delete_DoTransaction()
-{
-  viewer.mPropsBoxObject.beginUpdateBatch();
-  for (let i = 0; i < this.properties.length; i++) {
-    this.rule.removeProperty(this.properties[i].property);
-  }
-  viewer.mPropsBoxObject.endUpdateBatch();
-};
-
-cmdEditDelete.prototype.undoTransaction = function Delete_UndoTransaction()
-{
-  viewer.mPropsBoxObject.beginUpdateBatch();
-  try {
-    for (let i = 0; i < this.properties.length; i++) {
-      this.rule.setProperty(this.properties[i].property,
-                            this.properties[i].value,
-                            this.properties[i].important ?
-                              "important" :
-                              "");
-    }
-  }
-  finally {
-    viewer.mPropsBoxObject.endUpdateBatch();
-  }
-};
-
-/**
- * Handles editing CSS properties
- * @param aRule
- *        the rule containing the property
- * @param aProperty
- *        the property to change
- * @param aNewValue
- *        the new value for the property
- * @param aNewPriority
- *        the new priority for the property ("important" or "")
- */
-function cmdEditEdit(aRule, aProperty, aNewValue, aNewPriority)
-{
-  this.rule = aRule;
-  this.property = aProperty;
-  this.oldValue = aRule.getPropertyValue(aProperty);
-  this.newValue = aNewValue;
-  this.oldPriority = aRule.getPropertyPriority(aProperty);
-  this.newPriority = aNewPriority;
-}
-
-cmdEditEdit.prototype = new inBaseCommand(false);
-
-cmdEditEdit.prototype.doTransaction = function Edit_DoTransaction()
-{
-  this.rule.setProperty(this.property, this.newValue,
-                        this.newPriority);
-  viewer.mPropsBoxObject.invalidate();
-};
-
-cmdEditEdit.prototype.undoTransaction = function Edit_UndoTransaction()
-{
-  this.rule.setProperty(this.property, this.oldValue,
-                        this.oldPriority);
-  viewer.mPropsBoxObject.invalidate();
-};
-
-/**
- * Handles toggling CSS !important.
- * @param aRule
- *        the rule containing the properties
- * @param aProperties
- *        an array of CSSPropertys to toggle
- */
-function cmdTogglePriority(aRule, aProperties)
-{
-  this.rule = aRule;
-  this.properties = aProperties;
-}
-
-cmdTogglePriority.prototype = new inBaseCommand(false);
-
-cmdTogglePriority.prototype.doTransaction =
-  function TogglePriority_DoTransaction()
-{
-  for (let i = 0; i < this.properties.length; i++) {
-    // XXX bug 305761 means we can't make something not important, so
-    // instead we'll delete this property and make a new one at the proper
-    // priority.  This method also sucks because the property gets moved to
-    // the bottom.
-    var property = this.properties[i].property;
-    var value = this.properties[i].value;
-    var newPriority = this.rule.getPropertyPriority(property) == "" ?
-                        "important" : "";
-    this.rule.removeProperty(property);
-    this.rule.setProperty(property, value, newPriority);
-  }
-  viewer.mPropsBoxObject.invalidate();
-};
-
-cmdTogglePriority.prototype.undoTransaction =
-  function TogglePriority_UndoTransaction()
-{
-  this.doTransaction();
-};
-
-/**
- * Copy the URI for a CSS rule's parent style sheet onto the clipboard.
- * @param aRule
- *        The nsIDOMCSSRule whose parent style sheet's URI should be copied.
- */
-function cmdEditCopyFileURI(aRule)
-{
-  this.mString = aRule && aRule.parentStyleSheet &&
-                 aRule.parentStyleSheet.href;
-}
-
-cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
-
-/**
- * Open a source view on a CSS rule's parent style sheet.  This will attempt
- * open the file at the line that the rule appears on.
- * @param aRule
- *        The source view will open on nsIDOMCSSRule aRule's parent style
- *        sheet.  If aRule is an nsIDOMCSSStyleRule, the source view will open
- *        to the line in the style sheet that aRule appears on.
- */
-function cmdEditViewFileURI(aRule)
-{
-  this.mURI = aRule && aRule.parentStyleSheet && aRule.parentStyleSheet.href;
-  if (aRule.type == CSSRule.STYLE_RULE) {
-    this.mLineNumber = viewer.DOMUtils.getRuleLine(aRule);
-  }
-}
-
-cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.xul b/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/styleRules/styleRules.xul
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page SYSTEM "chrome://inspector/locale/viewers/styleRules.dtd">
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/viewers/styleRules/styleRules.css"?>
-
-<page id="winStyleRules"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <!--============================= SCRIPTS ============================= -->
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/styleRules/styleRules.js"/>
-  <script type="application/javascript"
-          src="chrome://global/content/XPCNativeWrapper.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/rdf/RDFU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
-  <script type="application/javascript"
-          src="chrome://global/content/viewSourceUtils.js"/>
-
-  <!--============================ COMMANDS ============================= -->
-
-  <commandset id="cmdsEditing"/>
-  <commandset id="cmdsEditingExtras"/>
-  <commandset id="cmdsProps">
-    <command id="cmdTogglePriority"
-             oncommand="viewer.pane.panelset.execCommand('cmdTogglePriority')"/>
-  </commandset>
-
-  <!--============================= POPUPS ============================== -->
-
-  <popupset id="psPopups">
-    <menupopup id="ppStyleRulesContext"
-               onpopupshowing="return viewer.onPopupShowing('cmdsEditingExtras')">
-      <menuitem id="mnEditCopyFileURI"/>
-      <menuitem id="mnEditViewFileURI"/>
-    </menupopup>
-
-    <menupopup id="ppStylePropsContext"
-               onpopupshowing="viewer.onPopupShowing('cmdsProps')">
-      <menuitem id="mnEditCopy"/>
-      <menuseparator/>
-      <menuitem id="mnEditInsert"/>
-      <menuitem id="mnEditEdit"/>
-      <menuitem id="mnEditDelete"/>
-      <menuseparator/>
-      <menuitem label="&toggleSelectedImportant.label;"
-                command="cmdTogglePriority"/>
-    </menupopup>
-  </popupset>
-
-  <!--============================= CONTENT ============================== -->
-
-  <tree id="olStyleRules" class="plain" flex="1" persist="height"
-        seltype="single" onselect="viewer.onRuleSelect()"
-        contextmenu="ppStyleRulesContext" onfocus="viewer.onTreeFocus(this)">
-    <treecols>
-      <treecol id="olcRule" label="&styleRule.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcFileURL" label="&styleRuleURI.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcLine" label="&styleRuleLineNumber.label;"/>
-    </treecols>
-    <treechildren id="olbStyleRules"
-                  alternatingbackground="true"/>
-  </tree>
-
-  <splitter id="splTrees" collapse="after" persist="state">
-    <grippy/>
-  </splitter>
-
-  <tree id="olStyleProps"
-        class="plain"
-        flex="1"
-        persist="height"
-        onselect="viewer.onPropSelect()"
-        onfocus="viewer.onTreeFocus(this)">
-    <treecols>
-      <treecol id="olcPropPriority" label="&styleRulePropPriority.label;"
-               class="treecol-image"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcPropName" label="&styleRulePropName.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcPropValue" label="&styleRulePropValue.label;" flex="1"/>
-    </treecols>
-    <treechildren id="olbStyleProps"
-                  alternatingbackground="true"
-                  ondblclick="viewer.pane.panelset.execCommand('cmdEditEdit')"/>
-  </tree>
-
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.js b/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.js
+++ /dev/null
@@ -1,359 +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/. */
-
-/*****************************************************************************
-* StyleSheetsViewer ----------------------------------------------------------
-*  The viewer for the style sheets loaded by a document.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/utils.js
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://global/content/viewSourceUtils.js
-*   chrome://inspector/content/jsutil/commands/baseCommands.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", StyleSheetsViewer_initialize, false);
-
-function StyleSheetsViewer_initialize()
-{
-  viewer = new StyleSheetsViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class StyleSheetsViewer
-
-function StyleSheetsViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-
-  this.mTree = document.getElementById("olStyleSheets");
-  this.mOlBox = this.mTree.treeBoxObject;
-}
-
-StyleSheetsViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPane: null,
-  mView: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Interface inIViewer
-
-  get uid()
-  {
-    return "stylesheets";
-  },
-
-  get pane()
-  {
-    return this.mPane;
-  },
-
-  get selection()
-  {
-    return this.mSelection;
-  },
-
-  get subject()
-  {
-    return this.mSubject;
-  },
-
-  set subject(aObject)
-  {
-    this.mView = new StyleSheetsView(aObject);
-    this.mOlBox.view = this.mView;
-    this.mObsMan.dispatchEvent("subjectChange", { subject: aObject });
-    this.mView.selection.select(0);
-  },
-
-  initialize: function SSVr_Initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function SSVr_Destroy()
-  {
-    this.mOlBox.view = null;
-  },
-
-  isCommandEnabled: function SSVr_IsCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCopyFileURI":
-      case "cmdEditViewFileURI":
-      case "cmdEditInspectInNewWindow":
-        return !!this.getSelectedSheet();
-    }
-    return false;
-  },
-
-  getCommand: function SSVr_GetCommand(aCommand)
-  {
-    if (aCommand in window) {
-      return new window[aCommand]();
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function SSVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function SSVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Stuff
-
-  onItemSelected: function SSVr_OnItemSelected()
-  {
-    this.pane.panelset.updateAllCommands();
-
-    var idx = this.mTree.currentIndex;
-    this.mSelection = this.mView.getSheet(idx);
-    this.mObsMan.dispatchEvent("selectionChange",
-                               { selection: this.mSelection });
-  },
-
-  getSelectedSheet: function SSVr_GetSelectedSheet()
-  {
-    if (this.mView.selection.count == 1) {
-      let minAndMax = {};
-      this.mView.selection.getRangeAt(0, minAndMax, minAndMax);
-      return this.mView.getSheet(minAndMax.value);
-    }
-    return null;
-  },
-
-  onPopupShowing: function SRVr_OnPopupShowing(aCommandSetId)
-  {
-    // cmdEditInspectInNewWindow should already be up to date, but we need to
-    // make sure the others are as well.
-    var commandset = document.getElementById(aCommandSetId);
-    for (let i = 0; i < commandset.childNodes.length; i++) {
-      var command = commandset.childNodes[i];
-      if (viewer.isCommandEnabled(command.id)) {
-        command.removeAttribute("disabled");
-      }
-      else {
-        command.setAttribute("disabled", "true");
-      }
-    }
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// StyleSheetsView
-
-function StyleSheetsView(aDocument)
-{
-  this.mDocument = aDocument;
-  this.mSheets = [];
-  this.mLevels = [];
-  this.mOpen = [];
-  this.mChildCount = [];
-  this.mRowCount = 0;
-
-  var ss = aDocument.styleSheets;
-  for (let i = 0; i < ss.length; ++i) {
-    this.insertSheet(ss[i], 0, -1);
-  }
-}
-
-StyleSheetsView.prototype = new inBaseTreeView();
-
-StyleSheetsView.prototype.getSheet =
-function SSV_GetSheet(aRow)
-{
-  return this.mSheets[aRow];
-}
-
-StyleSheetsView.prototype.insertSheet =
-function SSV_InsertSheet(aSheet, aLevel, aRow)
-{
-  var row = aRow < 0 ? this.mSheets.length : aRow;
-
-  this.mSheets[row] = aSheet;
-  this.mLevels[row] = aLevel;
-  this.mOpen[row] = false;
-
-  var count = 0;
-  var rules = aSheet.cssRules;
-  for (let i = 0; i < rules.length; ++i) {
-    if (rules[i].type == CSSRule.IMPORT_RULE) {
-      ++count;
-    }
-  }
-  this.mChildCount[row] = count;
-  ++this.mRowCount;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Interface nsITreeView
-
-StyleSheetsView.prototype.getCellText =
-function SSV_GetCellText(aRow, aCol)
-{
-  var rule = this.mSheets[aRow];
-  if (aCol.id == "olcHref") {
-    if (rule.href) {
-      return rule.href;
-    }
-    // fall back for style elements
-    if (rule.ownerNode && rule.ownerNode.ownerDocument) {
-      return rule.ownerNode.ownerDocument.documentURI;
-    }
-  }
-  else if (aCol.id == "olcRules") {
-    return this.mSheets[aRow].cssRules.length;
-  }
-  return "";
-}
-
-StyleSheetsView.prototype.getLevel =
-function SSV_GetLevel(aRow)
-{
-  return this.mLevels[aRow];
-}
-
-StyleSheetsView.prototype.isContainer =
-function SSV_IsContainer(aRow)
-{
-  return this.mChildCount[aRow] > 0;
-}
-
-StyleSheetsView.prototype.isContainerEmpty =
-function SSV_IsContainerEmpty(aRow)
-{
-  return !this.isContainer(aRow);
-}
-
-StyleSheetsView.prototype.getParentIndex =
-function SSV_GetParentIndex(aRow)
-{
-  var baseLevel = this.mLevels[aRow];
-  for (let i = aRow - 1; i >= 0; --i) {
-    if (this.mLevels[i] < baseLevel) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-StyleSheetsView.prototype.hasNextSibling =
-function SSV_HasNextSibling(aRow, aAfter)
-{
-  var baseLevel = this.mLevels[aRow];
-  for (let i = aAfter + 1; i < this.mRowCount; ++i) {
-    if (this.mLevels[i] < baseLevel) {
-      break;
-    }
-    if (this.mLevels[i] == baseLevel) {
-      return true;
-    }
-  }
-  return false;
-}
-
-StyleSheetsView.prototype.isContainerOpen =
-function SSV_IsContainerOpen(aRow)
-{
-  return this.mOpen[aRow];
-}
-
-StyleSheetsView.prototype.toggleOpenState =
-function SSV_ToggleOpenState(aRow)
-{
-  var changeCount = 0;
-  if (this.mOpen[aRow]) {
-    var baseLevel = this.mLevels[aRow];
-    for (let i = aRow + 1; i < this.mRowCount; ++i) {
-      if (this.mLevels[i] <= baseLevel) {
-        break;
-      }
-      ++changeCount;
-    }
-    // shift data up
-    this.mSheets.splice(aRow + 1, changeCount);
-    this.mLevels.splice(aRow + 1, changeCount);
-    this.mOpen.splice(aRow + 1, changeCount);
-    this.mChildCount.splice(aRow + 1, changeCount);
-    changeCount = -changeCount;
-    this.mRowCount += changeCount;
-  }
-  else {
-    // for quick access
-    var rules = this.mSheets[aRow].cssRules;
-    var level = this.mLevels[aRow] + 1;
-    var childCount = this.mChildCount[aRow];
-    // shift data down
-    for (let i = this.mRowCount - 1; i > aRow; --i) {
-      this.mSheets[i + childCount] = this.mSheets[i];
-      this.mLevels[i + childCount] = this.mLevels[i];
-      this.mOpen[i + childCount] = this.mOpen[i];
-      this.mChildCount[i + childCount] = this.mChildCount[i];
-    }
-    // fill in new rows
-    for (let i = 0; i < rules.length; ++i) {
-      if (rules[i].type == CSSRule.IMPORT_RULE) {
-        ++changeCount;
-        this.insertSheet(rules[i].styleSheet, level, aRow + changeCount);
-      }
-      else if (rules[i].type != CSSRule.CHARSET_RULE) {
-        // only @charset and other @imports may precede @import, so exit now
-        break;
-      }
-    }
-  }
-
-  this.mOpen[aRow] = !this.mOpen[aRow];
-  this.mTree.rowCountChanged(aRow + 1, changeCount);
-  this.mTree.invalidateRow(aRow);
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Transactions
-
-function cmdEditInspectInNewWindow()
-{
-  this.mObject = viewer.getSelectedSheet();
-}
-
-cmdEditInspectInNewWindow.prototype = new cmdEditInspectInNewWindowBase();
-
-function cmdEditCopyFileURI()
-{
-  var sheet = viewer.getSelectedSheet();
-  this.mString = sheet && sheet.href;
-}
-
-cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
-
-function cmdEditViewFileURI()
-{
-  var sheet = viewer.getSelectedSheet();
-  this.mURI = sheet && sheet.href;
-}
-
-cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.xul b/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/stylesheets/stylesheets.xul
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/stylesheets.dtd"> %dtd2;
-]>
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<page id="winStylesheets"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://global/content/viewSourceUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/stylesheets/stylesheets.js"/>
-
-  <commandset id="cmdsEditingExtras"/>
-
-  <popupset id="psPopups">
-    <menupopup id="ppStyleSheetsContext"
-               onpopupshowing="viewer.onPopupShowing('cmdsEditingExtras');">
-      <menuitem id="mnEditInspectInNewWindow"/>
-      <menuseparator/>
-      <menuitem id="mnEditCopyFileURI"/>
-      <menuitem id="mnEditViewFileURI"/>
-    </menupopup>
-  </popupset>
-
-  <tree id="olStyleSheets" class="plain" treelines="true" flex="1"
-        seltype="single" onselect="viewer.onItemSelected()"
-        context="ppStyleSheetsContext">
-    <treecols>
-      <treecol id="olcHref" label="&sheetLocation.label;" primary="true"
-               persist="width,hidden,ordinal" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcRules" label="&sheetRules.label;"
-               persist="width,hidden,ordinal" style="width: 4em"/>
-    </treecols>
-    <treechildren id="olbStyleSheets"
-                  alternatingbackground="true"/>
-  </tree>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.js b/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.js
+++ /dev/null
@@ -1,229 +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/. */
-
-/*****************************************************************************
-* UsedFontFacesViewer --------------------------------------------------------
-*  The viewer for the font faces used for a DOM node.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*   chrome://inspector/content/events/ObserverManager.js
-*   chrome://inspector/content/commands/baseCommands.js
-*   chrome://inspector/content/system/clipboardFlavors.js
-*   chrome://inspector/content/xul/inBaseTreeView.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", UsedFontFacesViewer_initialize, false);
-
-function UsedFontFacesViewer_initialize()
-{
-  viewer = new UsedFontFacesViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// class UsedFontFacesViewer
-
-function UsedFontFacesViewer()
-{
-  this.mObsMan = new ObserverManager(this);
-
-  this.mDOMUtils = XPCU.getService("@mozilla.org/inspector/dom-utils;1",
-                                   "inIDOMUtils");
-
-  this.mTree = document.getElementById("olFonts");
-}
-
-UsedFontFacesViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPane: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// interface inIViewer
-
-  get uid()
-  {
-    return "usedFontFaces";
-  },
-
-  get pane()
-  {
-    return this.mPane;
-  },
-
-  get subject()
-  {
-    return this.mSubject;
-  },
-
-  set subject(aObject)
-  {
-    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
-      aObject : aObject.DOMNode;
-    this.mTreeView = new UsedFontFacesView(this.mSubject);
-    this.mTree.view = this.mTreeView;
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  initialize: function UFFVr_Initialize(aPane)
-  {
-    this.mPane = aPane;
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function UFFVr_Destroy()
-  {
-    // We need to remove the view at this time or else it will attempt to
-    // re-paint while the document is being deconstructed, resulting in some
-    // nasty XPConnect assertions
-    this.mTree.view = null;
-  },
-
-  isCommandEnabled: function UFFVr_IsCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      // ppUsedFontFacesContext
-      case "cmdEditCopy":
-        return this.mTree.view.selection.count > 0;
-      case "cmdEditCopyFileURI":
-        return this.mTreeView.getSelectedRowObjects()
-                             .some(function(aFont) { return !!aFont.URI; });
-    }
-    return false;
-  },
-
-  getCommand: function UFFVr_GetCommand(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCopy":
-        return new cmdEditCopy(this.mTreeView.getSelectedRowObjects());
-      case "cmdEditCopyFileURI":
-        return new cmdEditCopyFileURI(this.mTreeView.getSelectedRowObjects());
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// event dispatching
-
-  addObserver: function UFFVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function UFFVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Miscellaneous
-
-  onItemSelected: function UFFVr_OnItemSelected()
-  {
-    // This will (eventually) call isCommandEnabled on Copy
-    viewer.pane.panelset.updateAllCommands();
-  },
-
-  onPopupShowing: function UFFVr_OnPopupShowing(aCommandSetId)
-  {
-    var commandset = document.getElementById(aCommandSetId);
-    for (let i = 0; i < commandset.childNodes.length; i++) {
-      var command = commandset.childNodes[i];
-      command.setAttribute("disabled", !viewer.isCommandEnabled(command.id));
-    }
-  }
-};
-
-////////////////////////////////////////////////////////////////////////////
-//// UsedFontFacesView
-
-function UsedFontFacesView(aObject)
-{
-  // XXX Can't create a range for a DocumentType object
-  if (aObject instanceof Components.interfaces.nsIDOMDocumentType) {
-    this.mFontList = [];
-    this.mRowCount = 0;
-  }
-  else {
-    var range = (aObject.ownerDocument || aObject).createRange();
-    range.selectNodeContents(aObject);
-    this.mFontList = viewer.mDOMUtils.getUsedFontFaces(range);
-    this.mRowCount = this.mFontList.length;
-  }
-}
-
-UsedFontFacesView.prototype = new inBaseTreeView();
-
-UsedFontFacesView.prototype.getCellText = function UFFV_GetCellText(aRow, aCol)
-{
-  var font = this.mFontList.item(aRow);
-  if (aCol.id == "olcFontName") {
-    return font.name;
-  }
-  else if (aCol.id == "olcCSSFamilyName") {
-    return font.CSSFamilyName;
-  }
-  else if (aCol.id == "olcURI") {
-    return font.URI;
-  }
-  else if (aCol.id == "olcLocalName") {
-    return font.localName;
-  }
-  else if (aCol.id == "olcFormat") {
-    return font.format;
-  }
-
-  return null;
-};
-
-/**
-  * Returns a FontFace for the row in the tree corresponding to the passed
-  * index.
-  * @param aIndex
-  *        index of the row in the tree
-  * @return a FontFace
-  */
-UsedFontFacesView.prototype.getRowObjectFromIndex =
-  function UFFV_GetRowObjectFromIndex(aIndex)
-{
-  return this.mFontList.item(aIndex);
-};
-
-/**
- * Copy the names of fonts onto the clipboard.
- * @param aFonts
- *        The font faces whose names should be copied.
- */
-function cmdEditCopy(aFonts)
-{
-  this.mString = aFonts.map(function(aFont) { return aFont.name; }).join("\n");
-}
-
-cmdEditCopy.prototype = new cmdEditCopySimpleStringBase();
-
-/**
- * Copy the URIs for downloaded fonts onto the clipboard.
- * @param aFonts
- *        The font faces whose URIs should be copied.
- */
-function cmdEditCopyFileURI(aFonts)
-{
-  this.mString = aFonts.map(function(aFont) { return aFont.URI; })
-                       .filter(function(aURI) { return !!aURI; })
-                       .join("\n");
-}
-
-cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
diff --git a/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.xul b/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/usedFontFaces/usedFontFaces.xul
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!DOCTYPE page [
-  <!ENTITY % dtd1 SYSTEM "chrome://inspector/locale/inspector.dtd"> %dtd1;
-  <!ENTITY % dtd2 SYSTEM "chrome://inspector/locale/viewers/usedFontFaces.dtd"> %dtd2;
-]>
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet href="chrome://inspector/skin/"?>
-
-<page id="winUsedFontFaces"
-      orient="vertical"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <!--============================= SCRIPTS ============================= -->
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/usedFontFaces/usedFontFaces.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/system/clipboardFlavors.js"/>
-
-  <!--============================ COMMANDS ============================= -->
-
-  <commandset id="cmdsEditing"/>
-  <commandset id="cmdsEditingExtras"/>
-
-  <!--============================= POPUPS ============================== -->
-
-  <popupset id="psPopups">
-    <menupopup id="ppUsedFontFacesContext"
-               onpopupshowing="return viewer.onPopupShowing('cmdsEditingExtras')">
-      <menuitem id="mnEditCopy"/>
-      <menuitem id="mnEditCopyFileURI"/>
-    </menupopup>
-  </popupset>
-
-  <!--============================= CONTENT ============================== -->
-
-  <tree id="olFonts" flex="1" onselect="viewer.onItemSelected()"
-        class="plain" contextmenu="ppUsedFontFacesContext">
-    <treecols>
-      <treecol id="olcFontName" label="&fontName.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcCSSFamilyName" label="&cssFamilyName.label;" flex="1"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcURI" label="&uri.label;" flex="1" hidden="true"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcLocalName" label="&localName.label;" flex="1" hidden="true"/>
-      <splitter class="tree-splitter"/>
-      <treecol id="olcFormat" label="&format.label;" flex="1" hidden="true"/>
-    </treecols>
-    <treechildren id="olbFonts" alternatingbackground="true"/>
-  </tree>
-</page>
diff --git a/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.js b/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.js
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.js
+++ /dev/null
@@ -1,730 +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/. */
-
-/*****************************************************************************
-* XBLBindingsViewer ----------------------------------------------------------
-*  Inspects the XBL bindings for a given element, including anonymous content,
-*  methods, properties, event handlers, and resources.
-* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-* REQUIRED IMPORTS:
-*   chrome://inspector/content/jsutil/xpcom/XPCU.js
-*****************************************************************************/
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Variables
-
-var viewer;
-
-//////////////////////////////////////////////////////////////////////////////
-//// Global Constants
-
-const kDOMViewContractID = "@mozilla.org/inspector/dom-view;1";
-const kDOMUtilsContractID = "@mozilla.org/inspector/dom-utils;1";
-const kXBLNSURI = "http://www.mozilla.org/xbl";
-
-//////////////////////////////////////////////////////////////////////////////
-
-window.addEventListener("load", XBLBindingsViewer_initialize, false);
-
-function XBLBindingsViewer_initialize()
-{
-  viewer = new XBLBindingsViewer();
-  viewer.initialize(parent.FrameExchange.receiveData(window));
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// Class XBLBindingsViewer
-
-function XBLBindingsViewer()
-{
-  this.mURL = window.location;
-  this.mObsMan = new ObserverManager(this);
-  this.mDOMUtils = XPCU.getService(kDOMUtilsContractID, "inIDOMUtils");
-
-  this.mBindingsList = document.getElementById("mlBindings");
-
-  this.mContentTree = document.getElementById("olContent");
-  this.mMethodTree = document.getElementById("olMethods");
-  this.mPropTree = document.getElementById("olProps");
-  this.mHandlerTree = document.getElementById("olHandlers");
-  this.mResourceTree = document.getElementById("olResources");
-
-  this.mTreeViews = {};
-
-  this.generateViewGetterAndSetter("contentView", this.mContentTree);
-  this.generateViewGetterAndSetter("methodView", this.mMethodTree);
-  this.generateViewGetterAndSetter("propView", this.mPropTree);
-  this.generateViewGetterAndSetter("handlerView", this.mHandlerTree);
-  this.generateViewGetterAndSetter("resourceView", this.mResourceTree);
-
-  this.mControllers = {};
-
-  this.addController(this.mBindingsList, BindingsListController);
-  this.addController(this.mResourceTree, ResourceTreeController);
-
-  // prepare and attach the content DOM datasource
-  var contentView = XPCU.createInstance(kDOMViewContractID, "inIDOMView");
-  contentView.whatToShow &= ~(NodeFilter.SHOW_TEXT);
-  XPCU.QI(contentView, "nsITreeView");
-  this.contentView = contentView;
-}
-
-XBLBindingsViewer.prototype =
-{
-  ////////////////////////////////////////////////////////////////////////////
-  //// Initialization
-
-  mSubject: null,
-  mPane: null,
-  mControllers: null,
-  mTreeViews: null,
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Interface inIViewer
-
-  get uid()
-  {
-    return "xblBindings";
-  },
-
-  get pane()
-  {
-    return this.mPane;
-  },
-
-  get subject()
-  {
-    return this.mSubject;
-  },
-
-  set subject(aObject)
-  {
-    this.mSubject = aObject instanceof Components.interfaces.nsIDOMNode ?
-      aObject : aObject.DOMNode;
-
-    this.populateBindings();
-
-    this.displayBinding(this.mBindingsList.value);
-
-    this.mObsMan.dispatchEvent("subjectChange", { subject: this.mSubject });
-  },
-
-  initialize: function XBLBVr_Initialize(aPane)
-  {
-    this.mPane = aPane;
-
-    aPane.notifyViewerReady(this);
-  },
-
-  destroy: function XBLBVr_Destroy()
-  {
-    this.contentView = null;
-    this.methodView = null;
-    this.propView = null;
-    this.handlerView = null;
-    this.resourceView = null;
-  },
-
-  isCommandEnabled: function XBLBVr_IsCommandEnabled(aCommand)
-  {
-    var controller =
-      document.commandDispatcher.getControllerForCommand(aCommand);
-    return !!controller && controller.isCommandEnabled(aCommand);
-  },
-
-  getCommand: function XBLBVr_GetCommand(aCommand)
-  {
-    var controller =
-      this.mControllers[document.commandDispatcher.focusedElement.id];
-    if (controller) {
-      return controller.getCommand(aCommand);
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Event Dispatching
-
-  addObserver: function XBLBVr_AddObserver(aEvent, aObserver)
-  {
-    this.mObsMan.addObserver(aEvent, aObserver);
-  },
-
-  removeObserver: function XBLBVr_RemoveObserver(aEvent, aObserver)
-  {
-    this.mObsMan.removeObserver(aEvent, aObserver);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Displaying Binding Info
-
-  populateBindings: function XBLBVr_PopulateBindings()
-  {
-    var urls = this.mDOMUtils.getBindingURLs(this.mSubject);
-
-    this.mBindingsList.removeAllItems();
-
-    for (let i = 0, n = urls.length; i < n; ++i) {
-      var url = urls.queryElementAt(i, Components.interfaces.nsIURI).spec;
-      var currentItem = this.mBindingsList.appendItem(url, url);
-      currentItem.crop = "center";
-      currentItem.tooltipText = url;
-    }
-
-    this.mBindingsList.selectedIndex = 0;
-  },
-
-  displayBinding: function XBLBVr_DisplayBinding(aURL)
-  {
-    this.mBindingsList.tooltipText = aURL;
-    this.mBindingURL = aURL;
-    if (aURL) {
-      var req = new XMLHttpRequest();
-      req.addEventListener("load", gDocLoadListener, true);
-      req.open("GET", aURL);
-      req.overrideMimeType("application/xml");
-      req.send(null);
-    }
-    else {
-      this.doDisplayBinding(null);
-    }
-  },
-
-  doDisplayBinding: function XBLBVr_DoDisplayBinding(doc)
-  {
-    if (doc) {
-      var url = this.mBindingURL;
-      var poundPt = url.indexOf("#");
-      var id = url.substr(poundPt + 1);
-      var bindings = doc.getElementsByTagNameNS(kXBLNSURI, "binding");
-      var binding = null;
-      for (var i = 0; i < bindings.length; ++i) {
-        if (bindings[i].getAttribute("id") == id) {
-          binding = bindings[i];
-          break;
-        }
-      }
-      this.mBinding = binding;
-    }
-    else {
-      this.mBinding = null;
-    }
-
-    this.displayContent();
-    this.displayMethods();
-    this.displayProperties();
-    this.displayHandlers();
-    this.displayResources();
-
-    // switch to the first non-disabled tab if the one that's showing is
-    // disabled, otherwise, you can't use the keyboard to switch tabs
-    var tabbox = document.getElementById("bxBindingAspects");
-    if (tabbox.selectedTab.disabled) {
-      for (let i = 0; i < tabbox.tabs.childNodes.length; ++i) {
-         if (!tabbox.tabs.childNodes[i].disabled) {
-           tabbox.selectedTab = tabbox.tabs.childNodes[i];
-           break;
-         }
-      }
-    }
-
-    this.mBindingsList.disabled = !this.mBinding;
-  },
-
-  displayContent: function XBLBVr_DisplayContent()
-  {
-    this.contentView.rootNode = this.mBinding &&
-      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "content").item(0);
-    this.mContentTree.disabled = !this.contentView.rootNode;
-    document.getElementById("tbContent").disabled =
-      !this.contentView.rootNode;
-    if (this.contentView.rootNode) {
-      this.contentView.selection.select(0);
-    }
-  },
-
-  displayMethods: function XBLBVr_DisplayMethods()
-  {
-    this.methodView =
-      this.mBinding ? new MethodTreeView(this.mBinding) : null;
-
-    var active = this.mBinding &&
-      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "method").length > 0;
-    this.mMethodTree.disabled = !active;
-    document.getElementById("tbMethods").disabled = !active;
-    if (active && this.methodView.rowCount) {
-      this.methodView.selection.select(0);
-    }
-  },
-
-  displayProperties: function XBLBVr_DisplayProperties()
-  {
-    this.propView =
-      this.mBinding ? new PropTreeView(this.mBinding) : null;
-
-    var active = this.mBinding &&
-      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "property").length > 0;
-    this.mPropTree.disabled = !active;
-    document.getElementById("tbProps").disabled = !active;
-    if (active && this.propView.rowCount) {
-      this.propView.selection.select(0);
-    }
-  },
-
-  displayHandlers: function XBLBVr_DisplayHandlers()
-  {
-    this.handlerView =
-      this.mBinding ? new HandlerTreeView(this.mBinding) : null;
-
-    var active = this.mBinding &&
-      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "handler").length > 0;
-    this.mHandlerTree.disabled = !active;
-    document.getElementById("tbHandlers").disabled = !active;
-    if (active && this.handlerView.rowCount) {
-      this.handlerView.selection.select(0);
-    }
-  },
-
-  displayResources: function XBLBVr_DisplayResources()
-  {
-    this.resourceView =
-      this.mBinding ? new ResourceTreeView(this.mBinding) : null;
-
-    var active = this.mBinding &&
-      this.mBinding.getElementsByTagNameNS(kXBLNSURI, "resources").length > 0;
-    document.getElementById("tbResources").disabled = !active;
-    this.mResourceTree.disabled = !active;
-  },
-
-  displayMethod: function XBLBVr_DisplayMethod(aMethod)
-  {
-    var body = aMethod.getElementsByTagNameNS(kXBLNSURI, "body").item(0);
-    document.getElementById("txbMethodCode").value = 
-      this.justifySource(this.readDOMText(body));
-  },
-
-  displayProperty: function XBLBVr_DisplayProperty(aProp)
-  {
-    var rgroup = document.getElementById("rgPropGetterSetter");
-    var getradio = document.getElementById("raPropGetter");
-    var setradio = document.getElementById("raPropSetter");
-
-    // disable/enable radio buttons
-    getradio.disabled =
-      !aProp || !(aProp.hasAttribute("onget") ||
-                  aProp.getElementsByTagName("getter").length);
-    setradio.disabled =
-      !aProp || !(aProp.hasAttribute("onset") ||
-                  aProp.getElementsByTagName("setter").length);
-
-    // make sure a valid radio button is selected
-    if (rgroup.selectedIndex < 0) {
-      rgroup.selectedIndex = 0;
-    }
-    if (rgroup.selectedItem.disabled) {
-      var other = rgroup.getItemAtIndex((rgroup.selectedIndex + 1) % 2);
-      if (!other.disabled) {
-        rgroup.selectedItem = other;
-      }
-    }
-
-    // display text
-    var et = rgroup.value;
-    var text = "";
-    if (et && aProp) {
-      text = aProp.getAttribute("on" + et);
-      if (!text) {
-        let kids = aProp.getElementsByTagNameNS(kXBLNSURI, et + "ter");
-        text = this.readDOMText(kids.item(0));
-      }
-    }
-    document.getElementById("txbPropCode").value = this.justifySource(text);
-  },
-
-  displayHandler: function XBLBVr_DisplayHandler(aHandler)
-  {
-    var text = "";
-    if (aHandler) {
-      text = aHandler.getAttribute("action") || this.readDOMText(aHandler);
-    }
-    document.getElementById("txbHandlerCode").value =
-      this.justifySource(text);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Selection
-
-  onMethodSelected: function XBLBVr_OnMethodSelected()
-  {
-    var idx = this.mMethodTree.currentIndex;
-    var methods = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "method");
-    var method = methods[idx];
-    this.displayMethod(method);
-  },
-
-  onPropSelected: function XBLBVr_OnPropSelected()
-  {
-    var idx = this.mPropTree.currentIndex;
-    var props = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "property");
-    var prop = props[idx];
-    this.displayProperty(prop);
-  },
-
-  onHandlerSelected: function XBLBVr_OnHandlerSelected()
-  {
-    var idx = this.mHandlerTree.currentIndex;
-    var handlers = this.mBinding.getElementsByTagNameNS(kXBLNSURI, "handler");
-    var handler = handlers[idx];
-    this.displayHandler(handler);
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// Misc
-
-  /**
-   * Generates getter and setter methods for property named by the given
-   * identifier.  The setter will set the tree's view and cache it.  The
-   * getter will recall the cached view.
-   * @param aIdentifier
-   *        The name of the property where the getter and setter should live.
-   * @param aTree
-   *        The tree whose view should be set in the setter.
-   */
-  generateViewGetterAndSetter:
-    function XBLBVr_GenerateViewGetterAndSetter(aIdentifier, aTree)
-  {
-    this.__defineSetter__(aIdentifier, function(aVal)
-      {
-	aTree.view = aVal;
-	return this.mTreeViews[aIdentifier] = aVal;
-      });
-    this.__defineGetter__(aIdentifier, function()
-      {
-	return this.mTreeViews[aIdentifier];
-      });
-  },
-
-  /**
-   * Creates a controller, registers it with this viewer, and appends it to
-   * the controllers of the given element.
-   * @param aEl
-   *        The element to which we should add the controller.  aEl.id must be
-   *        non-empty.
-   * @param aControllerConstructor
-   *        A constructor function whose instances will implement
-   *        nsIController.  aEl will be passed as the first parameter during
-   *        construction.
-   */
-  addController: function XBLBVr_AddController(aEl, aControllerConstructor) {
-    var controller = new aControllerConstructor(aEl);
-    this.mControllers[aEl.id] = controller;
-    aEl.controllers.appendController(controller);
-  },
-
-
-  onPopupShowing: function XBLBVr_OnPopupShowing(aPopup)
-  {
-    var kids = aPopup.childNodes;
-    for (let i = 0, n = kids.length; i < n; ++i) {
-      let command = document.getElementById(kids[i].command);
-      if (this.isCommandEnabled(command.id)) {
-        command.removeAttribute("disabled");
-      }
-      else {
-        command.setAttribute("disabled", "true");
-      }
-    }
-  },
-
-  readDOMText: function XBLBVr_ReadDOMText(aEl)
-  {
-    if (!aEl) {
-      return "";
-    }
-
-    var text = aEl.nodeValue || "";
-    for (var i = 0; i < aEl.childNodes.length; ++i) {
-      text += this.readDOMText(aEl.childNodes[i]);
-    }
-    return text;
-  },
-
-  // Remove newlines at the beginning of the string and the lowest level of
-  // indentation from the beginning of each line, since most XBL getters,
-  // setters, methods, and handlers are handwritten CDATA.
-  justifySource: function XBLBVr_JustifySource(aStr)
-  {
-    // convert indentation to use spaces
-    while (/^ *\t/m.test(aStr)) {
-      aStr = aStr.replace(/^((        )*) {0,7}\t/gm, "$1        ");
-    }
-    // remove trailing spaces from all lines
-    aStr = aStr.replace(/ +$/gm, "");
-    // lose the trailing blank lines
-    aStr = aStr.replace(/\n*$/, "");
-    // lose the initial blank lines
-    aStr = aStr.replace(/^\n*/, "");
-    // now check if, for some crazy reason, there are lines in the rest of the
-    // source at a lower indentation level than the first line
-    var indentations = aStr.match(/^ *(?=[^\n])/gm);
-    if (indentations) {
-      indentations.sort();
-      if (indentations[0]) {
-        aStr = aStr.replace(RegExp("^" + indentations[0], "gm"), "");
-      }
-    }
-    return aStr;
-  }
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Controllers
-
-function BindingsListController(aBindingsList) {}
-
-BindingsListController.prototype = {
-
-  commands: {
-    cmdEditCopyFileURI: function BLC_CopyFileURI()
-    {
-      this.mString = document.popupNode.value;
-    },
-
-    cmdEditViewFileURI: function BLC_ViewFileURI()
-    {
-      this.mURI = document.popupNode.value;
-    }
-  },
-
-  getCommand: function BLC_GetCommand(aCommand)
-  {
-    if (this.supportsCommand(aCommand)) {
-      return new this.commands[aCommand]();
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// nsIController Implementation
-
-  isCommandEnabled: function BLC_IsCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCopyFileURI":
-      case "cmdEditViewFileURI":
-        return !!document.popupNode.value;
-    }
-    return false;
-  },
-
-  supportsCommand: function BLC_SupportsCommand(aCommand)
-  {
-    return aCommand in this.commands;
-  },
-
-  doCommand: function BLC_DoCommand(aCommand) {},
-
-  onEvent: function BLC_OnEvent(aEvent) {}
-}
-
-let commands = BindingsListController.prototype.commands;
-commands.cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
-commands.cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
-
-function ResourceTreeController(aTree) {}
-
-ResourceTreeController.prototype = {
-
-  commands: {
-    cmdEditCopyFileURI: function RTC_CopyFileURI()
-    {
-      this.mString = viewer.resourceView.getSelectedResourceURI();
-    },
-  
-    cmdEditViewFileURI: function RTC_ViewFileURI()
-    {
-      this.mURI = viewer.resourceView.getSelectedResourceURI();
-    }
-  },
-
-  getCommand: function RTC_GetCommand(aCommand)
-  {
-    if (this.supportsCommand(aCommand)) {
-      return new this.commands[aCommand]();
-    }
-    return null;
-  },
-
-  ////////////////////////////////////////////////////////////////////////////
-  //// nsIController Implementation
-
-  isCommandEnabled: function RTC_IsCommandEnabled(aCommand)
-  {
-    switch (aCommand) {
-      case "cmdEditCopyFileURI":
-        return !!viewer.resourceView.getSelectedResourceURI();
-      case "cmdEditViewFileURI":
-        return !!viewer.resourceView.getSelectedResourceURI() &&
-               viewer.resourceView.getSelectedResourceType() != "image";
-    }
-    return false;
-  },
-
-  supportsCommand: function RTC_SupportsCommand(aCommand)
-  {
-    return aCommand in this.commands;
-  },
-
-  doCommand: function RTC_DoCommand(aCommand) {},
-
-  onEvent: function RTC_OnEvent(aEvent) {}
-}
-
-commands = ResourceTreeController.prototype.commands;
-commands.cmdEditCopyFileURI.prototype = new cmdEditCopySimpleStringBase();
-commands.cmdEditViewFileURI.prototype = new cmdEditViewFileURIBase();
-
-//////////////////////////////////////////////////////////////////////////////
-//// MethodTreeView
-
-function MethodTreeView(aBinding)
-{
-  this.mMethods = aBinding.getElementsByTagNameNS(kXBLNSURI, "method");
-  this.mRowCount = this.mMethods ? this.mMethods.length : 0;
-}
-
-MethodTreeView.prototype = new inBaseTreeView();
-
-MethodTreeView.prototype.getCellText =
-function MTV_GetCellText(aRow, aCol)
-{
-  if (aCol.id == "olcMethodName") {
-    var method = this.mMethods[aRow];
-    var name = method.getAttribute("name");
-    var params = method.getElementsByTagNameNS(kXBLNSURI, "parameter");
-    var pstr = "";
-    if (params.length) {
-      pstr += params[0].getAttribute("name");
-    }
-    for (var i = 1; i < params.length; ++i) {
-      pstr += ", " + params[i].getAttribute("name");
-    }
-    return name + "(" + pstr + ")";
-  }
-
-  return "";
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// PropTreeView
-
-function PropTreeView(aBinding)
-{
-  this.mProps = aBinding.getElementsByTagNameNS(kXBLNSURI, "property");
-  this.mRowCount = this.mProps ? this.mProps.length : 0;
-}
-
-PropTreeView.prototype = new inBaseTreeView();
-
-PropTreeView.prototype.getCellText =
-function PTV_GetCellText(aRow, aCol)
-{
-  if (aCol.id == "olcPropName") {
-    return this.mProps[aRow].getAttribute("name");
-  }
-
-  return "";
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// HandlerTreeView
-
-function HandlerTreeView(aBinding)
-{
-  this.mHandlers = aBinding.getElementsByTagNameNS(kXBLNSURI, "handler");
-  this.mRowCount = this.mHandlers ? this.mHandlers.length : 0;
-}
-
-HandlerTreeView.prototype = new inBaseTreeView();
-
-HandlerTreeView.prototype.getCellText =
-function HTV_GetCellText(aRow, aCol)
-{
-  var handler = this.mHandlers[aRow];
-  if (aCol.id == "olcHandlerEvent") {
-    return handler.getAttribute("event");
-  }
-  else if (aCol.id == "olcHandlerPhase") {
-    return handler.getAttribute("phase");
-  }
-
-  return "";
-}
-
-//////////////////////////////////////////////////////////////////////////////
-//// ResourceTreeView
-
-function ResourceTreeView(aBinding)
-{
-  this.mResources = [];
-  var res = aBinding.getElementsByTagNameNS(kXBLNSURI, "resources").item(0);
-  if (res) {
-    var kids = res.childNodes;
-    for (var i = 0; i < kids.length; ++i) {
-      if (kids[i].nodeType == Node.ELEMENT_NODE) {
-        this.mResources.push(kids[i]);
-      }
-    }
-  }
-
-  this.mRowCount = this.mResources.length;
-
-  this.wrappedJSObject = this;
-}
-
-ResourceTreeView.prototype = new inBaseTreeView();
-
-ResourceTreeView.prototype.getCellText =
-function RTV_GetCellText(aRow, aCol)
-{
-  var resource = this.mResources[aRow];
-  if (aCol.id == "olcResourceType") {
-    return resource.localName;
-  }
-  else if (aCol.id == "olcResourceSrc") {
-    return resource.getAttribute("src");
-  }
-
-  return "";
-}
-
-ResourceTreeView.prototype.getSelectedResourceURI =
-  function RTV_GetSelectedResourceURI()
-{
-  if (this.selection.count == 1) {
-    let minAndMax = {};
-    this.selection.getRangeAt(0, minAndMax, minAndMax);
-    return this.mResources[minAndMax.value].getAttribute("src");
-  }
-  return null;
-};
-
-ResourceTreeView.prototype.getSelectedResourceType =
-  function RTV_GetSelectedResourceType()
-{
-  if (this.selection.count == 1) {
-    let minAndMax = {};
-    this.selection.getRangeAt(0, minAndMax, minAndMax);
-    return this.mResources[minAndMax.value].localName;
-  }
-  return null;
-};
-
-//////////////////////////////////////////////////////////////////////////////
-//// Event Listeners
-
-function gDocLoadListener(event)
-{
-  viewer.doDisplayBinding(event.target.responseXML);
-}
diff --git a/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.xul b/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.xul
deleted file mode 100644
--- a/suite/extensions/inspector/resources/content/viewers/xblBindings/xblBindings.xul
+++ /dev/null
@@ -1,167 +0,0 @@
-<?xml version="1.0"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-
-<!DOCTYPE page SYSTEM "chrome://inspector/locale/viewers/xblBindings.dtd">
-
-<?xul-overlay href="chrome://inspector/content/editingOverlay.xul"?>
-
-<?xml-stylesheet
-    href="chrome://inspector/skin/viewers/xblBindings/xblBindings.css"?>
-
-<page id="winXBLBindings"
-      orient="vertical"
-      xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xul/inBaseTreeView.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/utils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/hooks.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/xpcom/XPCU.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/events/ObserverManager.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/jsutil/commands/baseCommands.js"/>
-  <script type="application/javascript"
-          src="chrome://global/content/viewSourceUtils.js"/>
-  <script type="application/javascript"
-          src="chrome://inspector/content/viewers/xblBindings/xblBindings.js"/>
-
-  <commandset id="cmdsEditingExtras"/>
-
-  <popupset id="psPopups">
-    <!-- Just split this if it's ever at all specialized. -->
-    <menupopup id="ppSharedContext"
-               onpopupshowing="viewer.onPopupShowing(this);">
-      <menuitem id="mnEditCopyFileURI"/>
-      <menuitem id="mnEditViewFileURI"/>
-    </menupopup>
-  </popupset>
-
-  <menulist id="mlBindings" oncommand="viewer.displayBinding(this.value)"
-            crop="center" contextmenu="ppSharedContext">
-    <menupopup id="mpBindings"/>
-  </menulist>
-
-  <tabbox id="bxBindingAspects" flex="1">
-    <tabs>
-      <tab id="tbContent" label="&bindingContent.label;"
-           disabled="true"/>
-      <tab id="tbMethods" label="&bindingMethods.label;"
-           disabled="true"/>
-      <tab id="tbProps" label="&bindingProperties.label;"
-           disabled="true"/>
-      <tab id="tbHandlers" label="&bindingHandlers.label;"
-           disabled="true"/>
-      <tab id="tbResources" label="&bindingResources.label;"
-           disabled="true"/>
-    </tabs>
-    <tabpanels flex="1">
-      <tree id="olContent" seltype="single" treelines="true">
-        <treecols>
-          <!-- Don't localize these DOM API names -->
-          <treecol id="colNodeName" primary="true" label="nodeName" flex="1"/>
-          <splitter class="tree-splitter"/>
-          <treecol id="colNodeValue" label="nodeValue" flex="1"/>
-        </treecols>
-        <treechildren id="olbContent"/>
-      </tree>
-
-      <vbox>
-        <tree id="olMethods" seltype="single"
-              hidecolumnpicker="true"
-              flex="1"
-              onselect="viewer.onMethodSelected()"
-              persist="height">
-          <treecols>
-            <treecol id="olcMethodName" label="&bindingMethodName.label;"
-                     flex="1"/>
-          </treecols>
-          <treechildren id="olbMethods" alternatingbackground="true"/>
-        </tree>
-        <splitter id="splMethods" orient="vertical" collapse="after"
-                  persist="state">
-          <grippy/>
-        </splitter>
-        <groupbox id="gbMethods" flex="1" persist="height">
-          <caption label="Source Code"/>
-          <textbox id="txbMethodCode" readonly="true" multiline="true"
-                   flex="1"/>
-        </groupbox>
-      </vbox>
-
-      <vbox>
-        <vbox id="bxProps" flex="1" persist="height">
-          <tree id="olProps" seltype="single"
-                hidecolumnpicker="true"
-                flex="1"
-                onselect="viewer.onPropSelected()">
-            <treecols>
-              <treecol id="olcPropName" label="&bindingProperty.label;"
-                       flex="1"/>
-            </treecols>
-            <treechildren id="olbProps" alternatingbackground="true"/>
-          </tree>
-          <radiogroup id="rgPropGetterSetter" orient="horizontal">
-            <radio id="raPropGetter" label="&bindingGetter.label;"
-                   value="get" oncommand="viewer.onPropSelected()"
-                   selected="true"/>
-            <radio id="raPropSetter" label="&bindingSetter.label;"
-                   value="set" oncommand="viewer.onPropSelected()"/>
-          </radiogroup>
-        </vbox>
-        <splitter id="splProps" orient="vertical" collapse="after"
-                  persist="state">
-          <grippy/>
-        </splitter>
-        <groupbox id="gbProps" flex="1" persist="height">
-          <caption label="Source Code"/>
-          <textbox id="txbPropCode" readonly="true" multiline="true"
-                   flex="1"/>
-        </groupbox>
-      </vbox>
-
-      <vbox>
-        <tree id="olHandlers" seltype="single"
-              flex="1"
-              onselect="viewer.onHandlerSelected()"
-              persist="height">
-          <treecols>
-            <treecol id="olcHandlerEvent" label="&bindingHandlerEvent.label;"
-                     flex="1"/>
-            <splitter class="tree-splitter"/>
-            <treecol id="olcHandlerPhase"
-                     label="&bindingHandlerPhase.label;"/>
-          </treecols>
-          <treechildren id="olbHandlers" alternatingbackground="true"/>
-        </tree>
-        <splitter id="splHandlers" orient="vertical" collapse="after"
-                  persist="state">
-          <grippy/>
-        </splitter>
-        <groupbox id="gbHandlers" flex="1" persist="height">
-          <caption label="Source Code"/>
-          <textbox id="txbHandlerCode" readonly="true" multiline="true"
-                   flex="1"/>
-        </groupbox>
-      </vbox>
-
-      <tree id="olResources" seltype="single"
-            contextmenu="ppSharedContext">
-        <treecols>
-          <treecol id="olcResourceType" label="&bindingResourceType.label;"
-                   flex="1"/>
-          <splitter class="tree-splitter"/>
-          <treecol id="olcResourceSrc" label="&bindingResourceSrc.label;"
-                   flex="2"/>
-        </treecols>
-        <treechildren id="olbResources" alternatingbackground="true"/>
-      </tree>
-    </tabpanels>
-  </tabbox>
-</page>
diff --git a/suite/extensions/inspector/resources/locale/en-US/editing.dtd b/suite/extensions/inspector/resources/locale/en-US/editing.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/editing.dtd
+++ /dev/null
@@ -1,27 +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/. -->
-
-<!ENTITY mnEditUndo.label "Undo">
-<!ENTITY mnEditUndo.accesskey "u">
-<!ENTITY mnEditRedo.label "Redo">
-<!ENTITY mnEditRedo.accesskey "r">
-<!ENTITY mnEditCut.label "Cut">
-<!ENTITY mnEditCut.accesskey "t">
-<!ENTITY mnEditCopy.label "Copy">
-<!ENTITY mnEditCopy.accesskey "c">
-<!ENTITY mnEditPaste.label "Paste">
-<!ENTITY mnEditPaste.accesskey "p">
-<!ENTITY mnEditInsert.label "Insert">
-<!ENTITY mnEditInsert.accesskey "i">
-<!ENTITY mnEditEdit.label "Edit">
-<!ENTITY mnEditEdit.accesskey "e">
-<!ENTITY mnEditDelete.label "Delete">
-<!ENTITY mnEditDelete.accesskey "d">
-<!ENTITY mnEditInspectInNewWindow.label "Inspect in New Window">
-<!ENTITY mnEditInspectInNewWindow.accesskey "N">
-<!ENTITY mnEditInspectInNewWindow.key "I">
-<!ENTITY mnEditCopyFileURI.label "Copy URI">
-<!ENTITY mnEditCopyFileURI.accesskey "U">
-<!ENTITY mnEditViewFileURI.label "View File">
-<!ENTITY mnEditViewFileURI.accesskey "V">
diff --git a/suite/extensions/inspector/resources/locale/en-US/inspector.dtd b/suite/extensions/inspector/resources/locale/en-US/inspector.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/inspector.dtd
+++ /dev/null
@@ -1,67 +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/. -->
-
-
-<!ENTITY Inspector.title "DOM Inspector">
-
-<!ENTITY thDOMNodes.label "DOM Nodes">
-<!ENTITY btnInspect.label "Inspect">
-<!ENTITY btnInspect.accesskey "I">
-<!ENTITY bxDocPanel.title "Document">
-<!ENTITY bxObjectPanel.title "Object">
-<!ENTITY btnSelecting.tooltip "Find a node to inspect by clicking on it">
-<!ENTITY btnFind.tooltip "Find a node to inspect by id, tag, or attribute">
-
-<!-- MAIN MENU ITEMS -->
-
-<!ENTITY mnFile.label "File">
-<!ENTITY mnFile.accesskey "F">
-  <!ENTITY mnInspectContentDocument.label "Inspect Content Document">
-  <!ENTITY mnInspectContentDocument.accesskey "O">
-  <!ENTITY mnInspectChromeDocument.label "Inspect Chrome Document">
-  <!ENTITY mnInspectChromeDocument.accesskey "H">
-  <!ENTITY mnInspectApplicationAccessible.label "Inspect Application Accessible">
-  <!ENTITY mnInspectApplicationAccessible.accesskey "A">
-  <!ENTITY cmdEnterLocation.label "Inspect a URL">
-  <!ENTITY cmdEnterLocation.accesskey "U">
-  <!ENTITY cmdEnterLocation.key "L">
-  <!ENTITY cmdEnterLocation.key2 "D">
-  <!ENTITY cmdSave.label "Save DOM As…">
-  <!ENTITY cmdSave.accesskey "S">
-  <!ENTITY cmdClose.label "Close">
-  <!ENTITY cmdClose.accesskey "C">
-  <!ENTITY cmdExit.label "Exit">
-  <!ENTITY cmdExit.accesskey "x">
-
-<!ENTITY mnEdit.label "Edit">
-<!ENTITY mnEdit.accesskey "E">
-  <!ENTITY cmdUndo.label "Undo">
-  <!ENTITY cmdUndo.accesskey "U">
-  <!ENTITY cmdRedo.label "Redo">
-  <!ENTITY cmdRedo.accesskey "R">
-  <!ENTITY cmdCut.label "Cut">
-  <!ENTITY cmdCut.accesskey "t">
-  <!ENTITY cmdCopy.label "Copy">
-  <!ENTITY cmdCopy.accesskey "C">
-  <!ENTITY cmdPaste.label "Paste">
-  <!ENTITY cmdPaste.accesskey "P">
-  <!ENTITY cmdDelete.label "Delete">
-  <!ENTITY cmdDelete.accesskey "D">
-
-<!ENTITY mnView.label "View">
-<!ENTITY mnView.accesskey "v">
-  <!ENTITY mnDocViewerList.label "Document Viewer">
-  <!ENTITY mnDocViewerList.accesskey "D">
-  <!ENTITY mnObjectViewerList.label "Object Viewer">
-  <!ENTITY mnObjectViewerList.accesskey "O">
-  <!ENTITY cmdToggleDocument.label "Show Document in Browser Pane">
-  <!ENTITY cmdToggleDocument.accesskey "B">
-  <!ENTITY cmdToggleSearch.label "Search Results">
-  <!ENTITY cmdFlashOnSelect.label "Blink Selected Element">
-  <!ENTITY cmdFlashOnSelect.accesskey "S">
-
-<!ENTITY browserPanel.label "Browser">
-
-<!ENTITY saveCmd.key "S">
-<!ENTITY closeCmd.key "W">
diff --git a/suite/extensions/inspector/resources/locale/en-US/inspector.properties b/suite/extensions/inspector/resources/locale/en-US/inspector.properties
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/inspector.properties
+++ /dev/null
@@ -1,37 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-applicationAccesible.title = Application Accessible
-inspectWindow.noDocuments.message = (None)
-styleRuleNewProperty.title = New Style Rule
-styleRuleEditProperty.title = Edit Style Rule
-styleRulePropertyValue.message = Enter the property value:
-styleRulePropertyName.message = Enter the property name:
-sidebar.title = DOM Inspector
-sidebarInstalled = The sidebar is installed.
-newAttribute.title = New Attribute
-editAttribute.title = Edit Attribute
-findNodesDocumentEnd.message = End of document reached.
-findNodesDocumentEnd.title = Find Nodes
-# LOCALIZATION NOTE (root.title) label displayed for the tree head of the
-# JavaScript Object tree
-root.title = Subject
-
-irrecoverableSubtree.message = Some of the selected nodes are part of an anonymous subtree that will be destroyed. Deleting these nodes cannot be undone. Do you want to delete the selected nodes?
-irrecoverableSubtree.title = Delete Anonymous Subtree
-
-# The following items correspond to the node types defined by the W3C DOM Core
-# specification.
-1 = Element
-2 = Attribute
-3 = Text
-4 = CDATA Section
-5 = Entity Reference
-6 = Entity
-7 = Processing Instruction
-8 = Comment
-9 = Document
-10 = Document Type
-11 = Document Fragment
-12 = Notation
diff --git a/suite/extensions/inspector/resources/locale/en-US/prefs.dtd b/suite/extensions/inspector/resources/locale/en-US/prefs.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/prefs.dtd
+++ /dev/null
@@ -1,26 +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/. -->
-
-<!ENTITY Inspector.label "DOM Inspector">
-<!ENTITY Sidebar.label "Sidebar">
-<!ENTITY elementBlinking.label "Element Blinking">
-<!ENTITY blinkSelectedElement.label "Blink Selected Element">
-<!ENTITY blinkSelectedElement.accesskey "B">
-<!ENTITY borderColor.label "Border Color">
-<!ENTITY borderColor.accesskey "C">
-<!ENTITY borderWidth.label "Border Width">
-<!ENTITY borderWidth.accesskey "W">
-<!ENTITY px.label "(px)">
-<!ENTITY blinkDuration.label "Blink Duration">
-<!ENTITY blinkDuration.accesskey "D">
-<!ENTITY ms.label "(ms)">
-<!ENTITY blinkSpeed.label "Blink Speed">
-<!ENTITY blinkSpeed.accesskey "S">
-<!ENTITY invertColors.label "Invert Colors">
-<!ENTITY invertColors.accesskey "v">
-<!ENTITY installHowTo.label "The DOM Inspector Sidebar is not currently installed.  Click the 'Install' button to add it to your Sidebar.">
-<!ENTITY install.label "Install">
-<!ENTITY install.accesskey "I">
-<!ENTITY addNavigatorHooks.label "Add contextual menus to Navigator">
-<!ENTITY addNavigatorHooks.accesskey "m">
diff --git a/suite/extensions/inspector/resources/locale/en-US/tasksOverlay.dtd b/suite/extensions/inspector/resources/locale/en-US/tasksOverlay.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/tasksOverlay.dtd
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY inspectorTaskCmd.label "DOM Inspector">
-<!ENTITY inspectorTaskCmd.commandkey "i">
-<!ENTITY inspectorTaskCmd.accesskey "I">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewer-registry.dtd b/suite/extensions/inspector/resources/locale/en-US/viewer-registry.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewer-registry.dtd
+++ /dev/null
@@ -1,19 +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/. -->
-
-<!ENTITY dom.label "DOM Nodes">
-<!ENTITY stylesheets.label "Style Sheets">
-<!ENTITY domNode.label "DOM Node">
-<!ENTITY boxModel.label "Box Model">
-<!ENTITY xblBindings.label "XBL Bindings">
-<!ENTITY styleRules.label "CSS Rules">
-<!ENTITY computedStyle.label "Computed Style">
-<!ENTITY usedFontFaces.label "Used Font Faces">
-<!ENTITY jsObject.label "JavaScript Object">
-<!ENTITY accessibleEvent.label "Accessible Event">
-<!ENTITY accessibleObject.label "Accessible Object">
-<!ENTITY accessibleProps.label "Accessible Properties">
-<!ENTITY accessibleRelations.label "Accessible Relations">
-<!ENTITY accessibleEvents.label "Accessible Events">
-<!ENTITY accessibleTree.label "Accessible Tree">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvent.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvent.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvent.dtd
+++ /dev/null
@@ -1,13 +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/. -->
-
-<!ENTITY descIsFromUserInput.label "Is from user input: ">
-<!ENTITY descState.label "State: ">
-<!ENTITY descIsEnabled.label "Is state enabled: ">
-<!ENTITY descStartOffset.label "Start offset: ">
-<!ENTITY descLength.label "Length: ">
-<!ENTITY descIsInserted.label "Is text inserted: ">
-<!ENTITY descModifiedText.label "Modified text: ">
-<!ENTITY descCaretOffset.label "Caret offset: ">
-<!ENTITY descrHandlerOutput.label "Event handler output: ">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.dtd
+++ /dev/null
@@ -1,23 +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/. -->
-
-<!ENTITY eventList.label "Event List">
-<!ENTITY watchedEvents.label "Watched Events">
-<!ENTITY handledEvents.label "Handled events:">
-<!ENTITY eventType.label "Event Type">
-<!ENTITY eventTime.label "Time">
-<!ENTITY eventTargetNodeName.label "Node Name">
-<!ENTITY eventTargetNodeID.label "ID">
-<!ENTITY eventTargetRole.label "Role">
-<!ENTITY eventTargetName.label "Name">
-<!ENTITY isWatched.label "Watched">
-<!ENTITY isHandlerEnabled.label "Handler Enabled">
-<!ENTITY clearEventList.label "Clear Event List">
-<!ENTITY chooseEventsToWatch.label "Choose events to watch.">
-<!ENTITY watchAll.label "Watch All">
-<!ENTITY watchNone.label "Watch None">
-<!ENTITY editHandler.label "Edit Handler">
-<!ENTITY contextHelp.label "?">
-<!ENTITY handlerEditorNoEvent.label "Choose event type to add a handler.">
-
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.properties b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.properties
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEvents.properties
+++ /dev/null
@@ -1,22 +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/.
-
-mutationEvents = mutation events
-changeEvents = change events
-notificationEvents = notification events
-selectionEvents = selection events
-menuEvents = menu events
-documentEvents = document events
-textEvents = text events
-tableEvents = table events
-windowEvents = window events
-hyperLinkEvents = hyper link events
-hyperTextEvents = hyper text events
-
-handlerEditorLabel = Enable "%S" event handler.
-
-role = Role
-name = Name
-nodeName = Node Name
-id = ID
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEventsHandlerHelpDialog.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEventsHandlerHelpDialog.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleEventsHandlerHelpDialog.dtd
+++ /dev/null
@@ -1,18 +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/. -->
-
-  <!ENTITY helpDialog.title "Handler help dialog">
-
-  <!ENTITY general.descr "Write and attach an accessibility event handler. When the event occurs, you can select it in the events list and see the result of the handler evaluation in the linked Accessible Event viewer.">
-  <!ENTITY helpers.descr "The following objects and functions can be used within handler editor:">
-
-  <!ENTITY event.descr "accessibility event object">
-  <!ENTITY target.descr "accessibility target object">
-  <!ENTITY accRetrieval.descr "nsIAccessibleRetrieval accessibility service">
-  <!ENTITY output.descr "prints the given string">
-  <!ENTITY outputAttrs.descr "prints object attributes of the given accessible object">
-  <!ENTITY outputRole.descr "prints role of the given accessible object">
-  <!ENTITY outputStates.descr "prints states of the given accessible object">
-  <!ENTITY outputTree.descr "prints tree for the given accessible object, highlighting accessibles from the given array">
-  <!ENTITY outputDOMAttrs.descr "prints DOM attributes of the given accessible object">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.dtd
+++ /dev/null
@@ -1,29 +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/. -->
-<!ENTITY descRole.label "Role:">
-<!ENTITY descName.label "Name:">
-<!ENTITY descDescription.label "Description:">
-<!ENTITY descValue.label "Value:">
-<!ENTITY descState.label "State:">
-<!ENTITY descBounds.label "Bounds:">
-<!ENTITY tabAttrs.label "Object attributes">
-<!ENTITY colAttrName.label "Name">
-<!ENTITY colAttrValue.label "Value">
-<!ENTITY tabActions.label "Actions">
-<!ENTITY descKeyBindings.label "Key bindings:">
-<!ENTITY descInvoke.label "Invoke">
-<!ENTITY tabTextAttrs.label "Text attributes">
-<!ENTITY descDefaultAttrs.label "Default attributes:">
-<!ENTITY descStartOffset.label "Start offset:">
-<!ENTITY descEndOffset.label "End offset:">
-<!ENTITY tabTableCell.label "Table cell">
-<!ENTITY descColumnIdx.label "Column index:">
-<!ENTITY descRowIdx.label "Row index:">
-<!ENTITY descColumnExtent.label "Column extent:">
-<!ENTITY descRowExtent.label "Row extent:">
-<!ENTITY descIsSelected.label "Is selected:">
-<!ENTITY colProp.label "Property">
-<!ENTITY colRole.label "Role">
-<!ENTITY colName.label "Name">
-<!ENTITY colNodeName.label "Node name">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.properties b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.properties
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleProps.properties
+++ /dev/null
@@ -1,5 +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/.
-
-accBounds = x: %S;  y: %S;  width: %S;  height: %S;
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleRelations.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleRelations.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleRelations.dtd
+++ /dev/null
@@ -1,10 +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/. -->
-
-<!ENTITY relationType.label "Relation Type">
-<!ENTITY role.label "Role">
-<!ENTITY nodeName.label "Node Name">
-<!ENTITY relations.label "Relations: ">
-<!ENTITY relationTargets.label "Relation Targets: ">
-
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTree.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTree.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTree.dtd
+++ /dev/null
@@ -1,10 +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/. -->
-
-<!ENTITY role.label "Role">
-<!ENTITY name.label "Name">
-<!ENTITY nodeName.label "Node Name">
-
-<!ENTITY evaluateJS.label "Evaluate JavaScript">
-
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTreeEvalJSDialog.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTreeEvalJSDialog.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/accessibleTreeEvalJSDialog.dtd
+++ /dev/null
@@ -1,13 +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/. -->
-
-  <!ENTITY evaluateDialog.title "Evaluate JavaScript Dialog">
-
-  <!ENTITY btnEvaluateJS.label "Evaluate">
-  <!ENTITY btnEvaluateJS.accesskey "E">
-  
-  <!ENTITY txtInputArea.label "Input Area (use 'accessible' variable to operate with the selected accessible and 'output' function to write into 'Output Area' window, 'tree.search(accessible, filterfunc)' to search and 'tree.clearSearch()' to clear search results): ">
-  <!ENTITY txtInputArea.accesskey "I">
-  <!ENTITY txtOutputArea.label "Output Area: ">
-  <!ENTITY txtOutputArea.accesskey "O">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/boxModel.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/boxModel.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/boxModel.dtd
+++ /dev/null
@@ -1,17 +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/. -->
-
-<!ENTITY boxPosition.label "Position">
-<!ENTITY boxDimension.label "Dimensions">
-<!ENTITY boxMargin.label "Margin">
-<!ENTITY boxBorder.label "Border">
-<!ENTITY boxPadding.label "Padding">
-
-<!ENTITY xCoord.label "x">
-<!ENTITY yCoord.label "y">
-<!ENTITY screenXCoord.label "screen x">
-<!ENTITY screenYCoord.label "screen y">
-
-<!ENTITY dimensionWidth.label  "box width">
-<!ENTITY dimensionHeight.label "box height">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/computedStyle.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/computedStyle.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/computedStyle.dtd
+++ /dev/null
@@ -1,6 +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/. -->
-
-<!ENTITY propertyName.label "Property">
-<!ENTITY propertyValue.label "Value">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/dom.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/dom.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/dom.dtd
+++ /dev/null
@@ -1,138 +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/. -->
-
-  <!ENTITY cmdShowFindDialog.label "Find Nodes…">
-  <!ENTITY cmdShowFindDialog.accesskey "f">
-  <!ENTITY cmdShowFindDialog.key "f">
-
-  <!ENTITY cmdFindAgain.label "Find Again">
-  <!ENTITY cmdFindAgain.accesskey "g">
-  <!ENTITY cmdFindAgain.key "G">
-
-  <!ENTITY cmdToggleAnonContent.label "Show Anonymous Content">
-  <!ENTITY cmdToggleAnonContent.accesskey "a">
-
-  <!ENTITY cmdToggleWhitespaceNodes.label "Show Whitespace Nodes">
-  <!ENTITY cmdToggleWhitespaceNodes.accesskey "W">
-
-  <!ENTITY cmdToggleAccessibleNodes.label "Show Accessible Nodes">
-  <!ENTITY cmdToggleAccessibleNodes.accesskey "c">
-
-  <!ENTITY cmdToggleProcessingInstructions.label "Show Processing Instructions">
-  <!ENTITY cmdToggleProcessingInstructions.accesskey "P">
-
-  <!ENTITY cmdToggleAttributes.label "Show Attributes">
-  <!ENTITY cmdToggleAttributes.accesskey "r">
-
-  <!ENTITY cmdSelectByClick.label "Select Element By Click">
-  <!ENTITY cmdSelectByClick.accesskey "s">
-
-  <!ENTITY ColumnsDialog.title "Columns">
-
-  <!ENTITY cmdShowColumnsDialog.label "Columns…">
-  <!ENTITY cmdShowColumnsDialog.accesskey "c">
-
-  <!ENTITY cmdInsertNode.label "Insert…">
-  <!ENTITY cmdDeleteNode.label "Delete">
-  <!ENTITY cmdCopyXML.label "Copy XML">
-  <!ENTITY cmdCopyXML.accesskey "X">
-  <!ENTITY cmdBlink.label "Blink Element">
-  <!ENTITY cmdBlink.accesskey "B">
-  <!ENTITY cmdInspectBrowser.label "Inspect Contained Document">
-  <!ENTITY cmdInspectBrowser.accesskey "e">
-
-  <!ENTITY cmdShowPseudoClasses.label "Set Pseudo-classes…">
-  <!ENTITY cmdShowPseudoClasses.accesskey "S">
-
-  <!ENTITY pseudoClasses.title "Pseudo-classes">
-
-  <!ENTITY findNodes.title "Find Nodes">
-  <!ENTITY findNodesById.label "Id">
-  <!ENTITY findNodesById.accesskey "I">
-  <!ENTITY findNodesById.accesskey2 "d">
-  <!ENTITY findNodesByTag.label "Tag">
-  <!ENTITY findNodesByTag.accesskey "T">
-  <!ENTITY findNodesByTag.accesskey2 "g">
-  <!ENTITY findNodesByAttr.label "Attr">
-  <!ENTITY findNodesByAttr.accesskey "A">
-  <!ENTITY findNodesByAttr.accesskey2 "r">
-  <!ENTITY findNodesByAttrValue.label "Value">
-  <!ENTITY findNodesByAttrValue.accesskey "V">
-  <!ENTITY findNodesSearchBy.label "Search By">
-  <!ENTITY findNodesDirection.label "Direction">
-  <!ENTITY findNodesDirectionUp.label "Up">
-  <!ENTITY findNodesDirectionUp.accesskey "U">
-  <!ENTITY findNodesDirectionDown.label "Down">
-  <!ENTITY findNodesDirectionDown.accesskey "w">
-  <!ENTITY findNodesFind.label "Find">
-  <!ENTITY findNodesCancel.label "Cancel">
-
-  <!ENTITY mnEditPasteMenu.label "Paste">
-  <!ENTITY mnEditPasteMenu.accesskey "P">
-  <!ENTITY mnEditPasteBefore.label "Before">
-  <!ENTITY mnEditPasteBefore.accesskey "B">
-  <!ENTITY mnEditPasteAfter.label "After">
-  <!ENTITY mnEditPasteAfter.accesskey "A">
-  <!ENTITY mnEditPasteReplace.label "In place of (Replace)">
-  <!ENTITY mnEditPasteReplace.accesskey "I">
-  <!ENTITY mnEditPasteFirstChild.label "As first child">
-  <!ENTITY mnEditPasteFirstChild.accesskey "f">
-  <!ENTITY mnEditPasteLastChild.label "As last child">
-  <!ENTITY mnEditPasteLastChild.accesskey "c">
-  <!ENTITY mnEditPasteAsParent.label "As parent">
-  <!ENTITY mnEditPasteAsParent.accesskey "r">
-
-  <!ENTITY mnEditInsertMenu.label "Insert">
-  <!ENTITY mnEditInsertMenu.accesskey "I">
-  <!ENTITY mnEditInsertAfter.label "After">
-  <!ENTITY mnEditInsertAfter.accesskey "A">
-  <!ENTITY mnEditInsertBefore.label "Before">
-  <!ENTITY mnEditInsertBefore.accesskey "B">
-  <!ENTITY mnEditInsertFirstChild.label "As first child">
-  <!ENTITY mnEditInsertFirstChild.accesskey "f">
-  <!ENTITY mnEditInsertLastChild.label "As last child">
-  <!ENTITY mnEditInsertLastChild.accesskey "c">
-
-  <!ENTITY insertNode.title "Insert Node">
-  <!ENTITY nodeType.label "Node Type:">
-  <!ENTITY nodeType.accesskey "T">
-  <!ENTITY nodeType.element.label "Element">
-  <!ENTITY nodeType.text.label "Text">
-  <!ENTITY namespaceURI.label "Namespace URI:">
-  <!ENTITY namespaceURI.accesskey "U">
-  <!ENTITY tagName.label "Tag Name:">
-  <!ENTITY tagName.accesskey "N">
-  <!ENTITY nodeValue.label "Node Value:">
-  <!ENTITY nodeValue.accesskey "V">
-
-  <!ENTITY namespaceTitle.null.label "null">
-  <!ENTITY namespaceTitle.default.label "Document Default">
-  <!ENTITY namespaceTitle.custom.label "Custom">
-
-  <!-- LOCALIZATION NOTE: The following entities are names of W3C
-       specifications.  Please consult
-       http://www.w3.org/Consortium/Translation/ for appropriate translation
-       or leave unchanged. -->
-  <!ENTITY namespaceTitle.XMLNS.label "XMLNS">
-  <!ENTITY namespaceTitle.XML.label "XML">
-  <!ENTITY namespaceTitle.XHTML.label "XHTML">
-  <!ENTITY namespaceTitle.XLink.label "XLink">
-  <!ENTITY namespaceTitle.XSLT.label "XSLT">
-  <!ENTITY namespaceTitle.XBL.label "XBL">
-  <!ENTITY namespaceTitle.MathML.label "MathML">
-  <!ENTITY namespaceTitle.RDF.label "RDF">
-  <!ENTITY namespaceTitle.XUL.label "XUL">
-  <!ENTITY namespaceTitle.SVG.label "SVG">
-  <!ENTITY namespaceTitle.XMLEvents.label "XML Events">
-  <!ENTITY namespaceTitle.WAIRoles.label "WAI Roles">
-  <!ENTITY namespaceTitle.WAIProperties.label "WAI Properties">
-
-  <!-- LOCALIZATION NOTE: Localizers can choose not to translate the following
-       access keys. For a discussion about the pros and cons of such a
-       decision, see https://bugzilla.mozilla.org/show_bug.cgi?id=398704,
-       comments 1 and 2. -->
-  <!ENTITY cbxStateHover.accesskey "h">
-  <!ENTITY cbxStateActive.accesskey "a">
-  <!ENTITY cbxStateFocus.accesskey "f">
-
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/domNode.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/domNode.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/domNode.dtd
+++ /dev/null
@@ -1,31 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY nodeName.label "Node Name:">
-<!ENTITY localName.label "Local Name:">
-<!ENTITY namespaceURI.label "Namespace URI:">
-<!ENTITY nodeType.label "Node Type:">
-<!ENTITY nodeValue.label "Node Value:">
-<!ENTITY grpAttr.label "Attributes">
-
-<!ENTITY namespaceTitle.null.label "null">
-<!ENTITY namespaceTitle.default.label "Document Default">
-<!ENTITY namespaceTitle.custom.label "Custom">
-
-<!-- LOCALIZATION NOTE: The following entities are names of W3C specifications.
-                        Please consult http://www.w3.org/Consortium/Translation/
-                        for appropriate translation or leave unchanged. -->
-<!ENTITY namespaceTitle.XMLNS.label "XMLNS">
-<!ENTITY namespaceTitle.XML.label "XML">
-<!ENTITY namespaceTitle.XHTML.label "XHTML">
-<!ENTITY namespaceTitle.XLink.label "XLink">
-<!ENTITY namespaceTitle.XSLT.label "XSLT">
-<!ENTITY namespaceTitle.XBL.label "XBL">
-<!ENTITY namespaceTitle.MathML.label "MathML">
-<!ENTITY namespaceTitle.RDF.label "RDF">
-<!ENTITY namespaceTitle.XUL.label "XUL">
-<!ENTITY namespaceTitle.SVG.label "SVG">
-<!ENTITY namespaceTitle.XMLEvents.label "XML Events">
-<!ENTITY namespaceTitle.WAIRoles.label "WAI Roles">
-<!ENTITY namespaceTitle.WAIProperties.label "WAI Properties">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/jsObject.dtd
+++ /dev/null
@@ -1,16 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY jsCopyValue.label "Copy Value">
-<!ENTITY jsEval.label "Evaluate JavaScript…">
-
-<!ENTITY jsProperty.label "Property">
-<!ENTITY jsValue.label "Value">
-
-<!ENTITY evaluateDialog.title "Evaluate Expression">
-<!ENTITY jsEval.desc "Enter a JavaScript expression.  The variable &quot;target&quot; is the property that is currently selected.">
-<!ENTITY jsExecute.label "Execute">
-<!ENTITY inspectReturn.label "Inspect return in">
-<!ENTITY inspectReturnNew.label "New window">
-<!ENTITY inspectReturnExisting.label "Existing window">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/styleRules.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/styleRules.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/styleRules.dtd
+++ /dev/null
@@ -1,21 +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/. -->
-
-<!ENTITY miFindCSSRules.label "Find CSS Rules…">
-<!ENTITY miFindCSSRules.accesskey "F">
-
-<!ENTITY newRules.label "New">
-<!ENTITY deleteSelectedRules.label "Delete">
-<!ENTITY disableSelectedRules.label "Disable">
-
-<!-- LOCALIZATION NOTE: DO NOT LOCALIZE "!important" since it is a CSS API -->
-<!ENTITY toggleSelectedImportant.label "Toggle !important">
-
-<!ENTITY styleRule.label "Rule">
-<!ENTITY styleRuleURI.label "File">
-<!ENTITY styleRuleLineNumber.label "Line">
-
-<!ENTITY styleRulePropPriority.label "Priority">
-<!ENTITY styleRulePropName.label "Property">
-<!ENTITY styleRulePropValue.label "Value">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/stylesheets.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/stylesheets.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/stylesheets.dtd
+++ /dev/null
@@ -1,7 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY sheetLocation.label "Style Sheet">
-<!ENTITY sheetRules.label "Rules">
-
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/usedFontFaces.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/usedFontFaces.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/usedFontFaces.dtd
+++ /dev/null
@@ -1,9 +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/. -->
-
-<!ENTITY fontName.label "Font Name">
-<!ENTITY cssFamilyName.label "Family Name">
-<!ENTITY uri.label "URI">
-<!ENTITY localName.label "Local Name">
-<!ENTITY format.label "Format">
diff --git a/suite/extensions/inspector/resources/locale/en-US/viewers/xblBindings.dtd b/suite/extensions/inspector/resources/locale/en-US/viewers/xblBindings.dtd
deleted file mode 100644
--- a/suite/extensions/inspector/resources/locale/en-US/viewers/xblBindings.dtd
+++ /dev/null
@@ -1,18 +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/. -->
-
-<!ENTITY bindingContent.label      "Content">
-<!ENTITY bindingMethods.label      "Methods">
-<!ENTITY bindingMethodName.label   "Method Name">
-<!ENTITY bindingProperties.label   "Properties">
-<!ENTITY bindingGetter.label       "Getter">
-<!ENTITY bindingSetter.label       "Setter">
-<!ENTITY bindingProperty.label     "Property">
-<!ENTITY bindingHandlers.label     "Handlers">
-<!ENTITY bindingHandlerEvent.label "Event">
-<!ENTITY bindingHandlerPhase.label "Phase">
-<!ENTITY bindingResources.label    "Resources">
-<!ENTITY bindingResourceType.label "Type">
-<!ENTITY bindingResourceSrc.label  "Source">
-<!ENTITY bindingSourceCode.label   "Source Code">
diff --git a/suite/extensions/inspector/resources/moz.build b/suite/extensions/inspector/resources/moz.build
deleted file mode 100644
--- a/suite/extensions/inspector/resources/moz.build
+++ /dev/null
@@ -1,7 +0,0 @@
-# vim: set filetype=python:
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-CONFIGURE_SUBST_FILES += ['locale/Makefile']
-
diff --git a/suite/extensions/inspector/resources/skin/classic/ImageSearchItem.png b/suite/extensions/inspector/resources/skin/classic/ImageSearchItem.png
deleted file mode 100644
index 3d87f6e09f8254e01b57f0284e037ac3ddb4207b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/btnFind-dis.png b/suite/extensions/inspector/resources/skin/classic/btnFind-dis.png
deleted file mode 100644
index 1b15cbe74ef77e6ec75bbe6da0c6a17e070149ec..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/btnFind.png b/suite/extensions/inspector/resources/skin/classic/btnFind.png
deleted file mode 100644
index 5b3f8900e1fd7feca5023bc95d9cdede969ccbcf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/btnSelecting-act.png b/suite/extensions/inspector/resources/skin/classic/btnSelecting-act.png
deleted file mode 100644
index 8d5b15a2b92541cbbfe4d2dcac504fc3be70e8a9..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/btnSelecting-dis.png b/suite/extensions/inspector/resources/skin/classic/btnSelecting-dis.png
deleted file mode 100644
index ea5a86de7a3ef8737dd0a7fb451ca87cb122d500..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/btnSelecting.png b/suite/extensions/inspector/resources/skin/classic/btnSelecting.png
deleted file mode 100644
index 8a07ebda104baea282a594a516841db801ca9bb5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/iconImportant.png b/suite/extensions/inspector/resources/skin/classic/iconImportant.png
deleted file mode 100644
index b8d483849448e986eff6fd9614f1abe163e97a57..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/iconViewerList-dis.png b/suite/extensions/inspector/resources/skin/classic/iconViewerList-dis.png
deleted file mode 100644
index df6c2f34b119504b517258b8a891d495ee0bbb92..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/iconViewerList.png b/suite/extensions/inspector/resources/skin/classic/iconViewerList.png
deleted file mode 100644
index b2958336fdc54e000cd4b7be34026d7c54964406..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/inspector.css b/suite/extensions/inspector/resources/skin/classic/inspector.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/inspector.css
+++ /dev/null
@@ -1,6 +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/. */
-
-@import url("chrome://global/skin");
-@import url("chrome://inspector/content/inspector.css");
diff --git a/suite/extensions/inspector/resources/skin/classic/inspectorWindow.css b/suite/extensions/inspector/resources/skin/classic/inspectorWindow.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/inspectorWindow.css
+++ /dev/null
@@ -1,45 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://navigator/skin");
-@import url("chrome://browser/skin");
-
-#bxURLBar {
-  padding: 2px;
-}
-
-#bxSearch {
-  height: 150px;
-}
-
-#splPanels {
-  width: 5px;
-}
-
-/* ::::: toolbar buttons ::::: */
-
-#btnSelecting {
-  list-style-image: url("chrome://inspector/skin/btnSelecting.png");
-}
-
-#btnSelecting[checked="true"] {
-  list-style-image: url("chrome://inspector/skin/btnSelecting-act.png");
-}
-
-#btnSelecting[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/btnSelecting-dis.png");
-}
-
-#btnFind {
-  list-style-image: url("chrome://inspector/skin/btnFind.png");
-}
-
-#btnFind[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/btnFind-dis.png");
-}
-
-.viewer-list, .viewer-menu {
-  -moz-user-focus: ignore;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/panelset.css b/suite/extensions/inspector/resources/skin/classic/panelset.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/panelset.css
+++ /dev/null
@@ -1,34 +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/. */
-
-panel[disabled="true"] > .viewer-pane-box-1 {
-  visibility: collapse;
-}
-
-.viewer-menu, .viewer-list {
-  -moz-user-focus: normal;
-}
-
-.viewer-list {
-  list-style-image: url("chrome://inspector/skin/iconViewerList.png");
-}
-
-.viewer-list[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/iconViewerList-dis.png");
-}
-
-.viewer-pane-toolbox {
-  border-right: none;
-}
-
-.viewer-pane-box-2 {
-  border-left: 1px solid ThreeDShadow;
-  border-right: 1px solid ThreeDShadow;
-}
-
-.viewer-pane-toolbox {
-  border-top: none;
-  border-bottom: none;
-}
-
diff --git a/suite/extensions/inspector/resources/skin/classic/sidebar.css b/suite/extensions/inspector/resources/skin/classic/sidebar.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/sidebar.css
+++ /dev/null
@@ -1,9 +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/. */
-
-@import url("chrome://inspector/skin");
-
-tabpanels {
-  padding: 0px;
-}
\ No newline at end of file
diff --git a/suite/extensions/inspector/resources/skin/classic/titledSplitter.css b/suite/extensions/inspector/resources/skin/classic/titledSplitter.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/titledSplitter.css
+++ /dev/null
@@ -1,53 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-.titled-splitter {
-  border-top: 1px outset InactiveCaption;
-  border-bottom: 1px outset InactiveCaption;
-  background-color: InactiveCaption;
-  color: InactiveCaptionText;
-  cursor: default;
-}
-
-box[orient="vertical"] > .titled-splitter {
-  cursor: default;
-}
-
-.titledsplitter-container {
-  padding-bottom: 2px;
-}
-
-.titledsplitter-dragbar {
-  min-height: 2px;
-  cursor: n-resize !important;
-}
-
-.titledsplitter-titlebox {
-  padding: 0px 5px 0px 5px;
-}
-
-.titledsplitter-text {
-  margin: 0px !important;
-  font-weight: bold;
-}
-
-.titledsplitter-closebutton {
-  -moz-binding: none;
-  margin: 1px;
-  border: 1px outset ThreeDFace;
-  padding: 2px;
-  min-width: 0px;
-  background-color: ThreeDFace;
-}
-
-.titledsplitter-closeimage {
-  list-style-image: url("chrome://inspector/skin/titledsplitter-close.png");
-}
-
-.titledsplitter-closebutton:hover:active {
-  border-style: inset;
-  padding: 3px 1px 1px 3px;
-}
-
-
diff --git a/suite/extensions/inspector/resources/skin/classic/titledsplitter-close.png b/suite/extensions/inspector/resources/skin/classic/titledsplitter-close.png
deleted file mode 100644
index 72cdd217411d13a258b2b9488e05de697c777dca..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css b/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvent/accessibleEvent.css
+++ /dev/null
@@ -1,9 +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/. */
-
-@import url("chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css");
-
-#handlerOutput {
-  overflow: auto;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css b/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleEvents/accessibleEvents.css
+++ /dev/null
@@ -1,21 +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/. */
-
-@import url("chrome://inspector/skin");
-
-treechildren::-moz-tree-checkbox(checked) {
-  list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
-}
-
-#welHandlerEditor {
-  font-family: monospace;
-}
-
-#welGrippyButton {
-  cursor: default;
-}
-
-#welSplitter {
-  -moz-appearance: none;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleProps/accessibleProps.css b/suite/extensions/inspector/resources/skin/classic/viewers/accessibleProps/accessibleProps.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleProps/accessibleProps.css
+++ /dev/null
@@ -1,22 +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/. */
-
-@import url("chrome://inspector/skin");
-
-.textAttrsTextRange {
-  border-bottom: medium dotted blue;
-  padding: 7px;
-  border-bottom-left-radius: 16px;
-  border-bottom-right-radius: 16px;
-  line-height: 250%;
-  margin: 2px;
-}
-
-.textAttrsTextRange:hover {
-  border-bottom: medium dotted red;
-}
-
-.textAttrsTextRange[selected] {
-  border-bottom: medium groove purple;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleTree/accessibleTree.css b/suite/extensions/inspector/resources/skin/classic/viewers/accessibleTree/accessibleTree.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/accessibleTree/accessibleTree.css
+++ /dev/null
@@ -1,22 +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/. */
-
-@import url("chrome://inspector/skin");
-
-treechildren::-moz-tree-row(highlight) {
-  background-color: #feeecd;
-}
-
-treechildren::-moz-tree-row(selected, highlight) {
-  background-color: #c0ffff;
-}
-
-treechildren::-moz-tree-cell-text(highlight) {
-  color: black;
-}
-
-treechildren::-moz-tree-cell-text(grayout) {
-  color: gray;
-  font-weight: bold;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/boxModel/boxModel.css b/suite/extensions/inspector/resources/skin/classic/viewers/boxModel/boxModel.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/boxModel/boxModel.css
+++ /dev/null
@@ -1,23 +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/. */
-
-@import url("chrome://inspector/skin");
-
-/* ::::: statistics ::::: */
-
-.nonzero {
-  font-weight: bold;
-}
-
-groupbox:not(#boxBorder) textbox {
-  text-align: right;
-}
-
-row {
-  -moz-box-align: baseline;
-}
-
-#enclosingBox {
-  overflow: auto;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/dom/columnsDialog.css b/suite/extensions/inspector/resources/skin/classic/viewers/dom/columnsDialog.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/dom/columnsDialog.css
+++ /dev/null
@@ -1,26 +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/. */
-
-@import url("chrome://inspector/skin");
-
-#trColumns {
-  background-color: ThreeDFace;
-}
-
-.column-selector {
-  border: 1px outset ThreeDFace;
-  padding: 2px;
-  background-color: ThreeDFace;
-  vertical-align: middle;
-}
-
-.attr-column-selector,
-.attr-column-selector[focused="true"] {
-  margin: 0;
-  border: none;
-}
-
-[col-dragging="true"] {
-  border: 1px solid ButtonText;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/dom/dom.css b/suite/extensions/inspector/resources/skin/classic/viewers/dom/dom.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/dom/dom.css
+++ /dev/null
@@ -1,58 +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/. */
-
-@import url("chrome://inspector/skin");
-
-/* :::::::: node type color coding :::::::: */
-
-treechildren::-moz-tree-cell-text(ACCESSIBLE_NODE) {
-  font-weight: bold;
-}
-
-treechildren::-moz-tree-cell-text(ELEMENT_NODE) {
-  color: #000000;
-}
-
-treechildren::-moz-tree-cell-text(ATTRIBUTE_NODE) {
-  color: #556b2f;
-}
-
-treechildren::-moz-tree-cell-text(CDATA_SECTION_NODE),
-treechildren::-moz-tree-cell-text(TEXT_NODE) {
-  color: #0000AA;
-}
-
-treechildren::-moz-tree-cell-text(COMMENT_NODE) {
-  color: #228b22;
-}
-
-treechildren::-moz-tree-cell-text(DOCUMENT_NODE) {
-  color: #800080;
-}
-
-treechildren::-moz-tree-cell-text(DOCUMENT_TYPE_NODE) {
-  color: #606000;
-}
-
-treechildren::-moz-tree-cell-text(PROCESSING_INSTRUCTION_NODE) {
-  color: #808080;
-}
-
-treechildren::-moz-tree-cell-text(anonymous) {
-  color: #ff0000;
-}
-
-treechildren::-moz-tree-cell-text(selected, focus) {
-  color: #FFFFFF;
-}
-
-/* :::::::: drag and drop insertion indicators :::::::: */
-
-treechildren::-moz-tree-column(dnd-insert-before) {
-  border-left: 2px solid #000000;
-}
-
-treechildren::-moz-tree-column(dnd-insert-after) {
-  border-right: 2px solid #000000;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/dom/findDialog.css b/suite/extensions/inspector/resources/skin/classic/viewers/dom/findDialog.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/dom/findDialog.css
+++ /dev/null
@@ -1,5 +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/. */
-
-@import url("chrome://inspector/skin");
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/domNode/domNode.css b/suite/extensions/inspector/resources/skin/classic/viewers/domNode/domNode.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/domNode/domNode.css
+++ /dev/null
@@ -1,13 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://inspector/content/extensions/treeEditable.css");
-
-.olNodeInfoLabel {
-  padding-right: 0.5em;
-}
-#olNodeInfo {
-  padding-bottom: 0.5em;
-}
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/styleRules/styleRules.css b/suite/extensions/inspector/resources/skin/classic/viewers/styleRules/styleRules.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/styleRules/styleRules.css
+++ /dev/null
@@ -1,21 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://inspector/content/extensions/treeEditable.css");
-
-#olcPropPriority {
-  list-style-image: url("chrome://inspector/skin/iconImportant.png");
-}
-
-#olbStyleProps::-moz-tree-image(olcPropPriority, important) {
-  list-style-image: url("chrome://inspector/skin/iconImportant.png");
-}
-
-/* ::::: default column widths ::::: */
-
-#olcLine {
-  width: 5em;
-}
-
diff --git a/suite/extensions/inspector/resources/skin/classic/viewers/xblBindings/xblBindings.css b/suite/extensions/inspector/resources/skin/classic/viewers/xblBindings/xblBindings.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/classic/viewers/xblBindings/xblBindings.css
+++ /dev/null
@@ -1,6 +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/. */
-
-@import url("chrome://inspector/skin/");
-@import url("chrome://inspector/skin/viewers/dom/dom.css");
diff --git a/suite/extensions/inspector/resources/skin/modern/ImageSearchItem.png b/suite/extensions/inspector/resources/skin/modern/ImageSearchItem.png
deleted file mode 100644
index 3d87f6e09f8254e01b57f0284e037ac3ddb4207b..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/btnFind-dis.png b/suite/extensions/inspector/resources/skin/modern/btnFind-dis.png
deleted file mode 100644
index 1b15cbe74ef77e6ec75bbe6da0c6a17e070149ec..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/btnFind.png b/suite/extensions/inspector/resources/skin/modern/btnFind.png
deleted file mode 100644
index 5b3f8900e1fd7feca5023bc95d9cdede969ccbcf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/btnSelecting-act.png b/suite/extensions/inspector/resources/skin/modern/btnSelecting-act.png
deleted file mode 100644
index 8d5b15a2b92541cbbfe4d2dcac504fc3be70e8a9..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/btnSelecting-dis.png b/suite/extensions/inspector/resources/skin/modern/btnSelecting-dis.png
deleted file mode 100644
index ea5a86de7a3ef8737dd0a7fb451ca87cb122d500..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/btnSelecting.png b/suite/extensions/inspector/resources/skin/modern/btnSelecting.png
deleted file mode 100644
index 8a07ebda104baea282a594a516841db801ca9bb5..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/iconImportant.png b/suite/extensions/inspector/resources/skin/modern/iconImportant.png
deleted file mode 100644
index b8d483849448e986eff6fd9614f1abe163e97a57..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/iconViewerList-dis.png b/suite/extensions/inspector/resources/skin/modern/iconViewerList-dis.png
deleted file mode 100644
index 43b0b62863e83493dd84e8441fd28ec64cf13fd7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/iconViewerList.png b/suite/extensions/inspector/resources/skin/modern/iconViewerList.png
deleted file mode 100644
index 8033b4bc738e47b1d92714dd977436553990f6cf..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/iconViewerMenu-dis.png b/suite/extensions/inspector/resources/skin/modern/iconViewerMenu-dis.png
deleted file mode 100644
index 1cd257e9de269bfb3d35e02d4e10d04511398d82..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/iconViewerMenu.png b/suite/extensions/inspector/resources/skin/modern/iconViewerMenu.png
deleted file mode 100644
index 0fceed0b235bdd7dcccfd91827867233c05c3862..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/inspector.css b/suite/extensions/inspector/resources/skin/modern/inspector.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/inspector.css
+++ /dev/null
@@ -1,6 +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/. */
-
-@import url("chrome://global/skin");
-@import url("chrome://inspector/content/inspector.css");
diff --git a/suite/extensions/inspector/resources/skin/modern/inspectorWindow.css b/suite/extensions/inspector/resources/skin/modern/inspectorWindow.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/inspectorWindow.css
+++ /dev/null
@@ -1,45 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://navigator/skin");
-@import url("chrome://browser/skin");
-
-#tbxInsToolbox {
-  border-bottom: none;
-}
-
-#bxURLBar {
-  padding: 2px;
-}
-
-#bxSearch {
-  height: 150px;
-}
-
-/* ::::: toolbar buttons ::::: */
-
-#btnSelecting {
-  list-style-image: url("chrome://inspector/skin/btnSelecting.png");
-}
-
-#btnSelecting[checked="true"] {
-  list-style-image: url("chrome://inspector/skin/btnSelecting-act.png");
-}
-
-#btnSelecting[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/btnSelecting-dis.png");
-}
-
-#btnFind {
-  list-style-image: url("chrome://inspector/skin/btnFind.png");
-}
-
-#btnFind[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/btnFind-dis.png");
-}
-
-.viewer-list, .viewer-menu {
-  -moz-user-focus: ignore;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/panelset.css b/suite/extensions/inspector/resources/skin/modern/panelset.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/panelset.css
+++ /dev/null
@@ -1,37 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-domi-panel[disabled="true"] > .viewer-pane-box-1 {
-  visibility: collapse;
-}
-
-.viewer-menu, .viewer-list {
-  -moz-user-focus: normal;
-}
-
-.viewer-list {
-  list-style-image: url("chrome://inspector/skin/iconViewerList.png");
-}
-
-.viewer-list[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/iconViewerList-dis.png");
-}
-
-.viewer-menu {
-  list-style-image: url("chrome://inspector/skin/iconViewerMenu.png");
-}
-
-.viewer-menu[disabled="true"] {
-  list-style-image: url("chrome://inspector/skin/iconViewerMenu-dis.png");
-}
-
-.viewer-menu > .toolbarbutton-menu-dropmarker {
-  display: none;   
-}
-
-.viewer-pane-toolbox {
-  border-top: none;
-  border-bottom: none;
-}
-
diff --git a/suite/extensions/inspector/resources/skin/modern/sidebar.css b/suite/extensions/inspector/resources/skin/modern/sidebar.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/sidebar.css
+++ /dev/null
@@ -1,9 +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/. */
-
-@import url("chrome://inspector/skin");
-
-tabpanels {
-  padding: 0px;
-}
\ No newline at end of file
diff --git a/suite/extensions/inspector/resources/skin/modern/titledSplitter.css b/suite/extensions/inspector/resources/skin/modern/titledSplitter.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/titledSplitter.css
+++ /dev/null
@@ -1,54 +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/. */
-
-.titled-splitter {
-  border: 1px solid #000000;
-  background-color: #5B7693;
-  cursor: default;
-}
-
-box[orient="vertical"] > .titled-splitter {
-  cursor: default;
-}
-
-.titledsplitter-container {
-  padding-bottom: 2px;
-}
-
-.titledsplitter-dragbar {
-  border-top: 1px solid #92ABC9;
-  min-height: 2px;
-  cursor: n-resize;
-}
-
-.titledsplitter-titlebox {
-  padding: 0px 5px 0px 5px;
-}
-
-.titledsplitter-text {
-  margin: 0px !important;
-  font-weight: bold;
-  color: #ffffff;
-}
-
-.titledsplitter-closebutton {
-  -moz-binding: none;
-  margin: 1px;
-  border: 1px outset #C7D0D9;
-  -moz-border-radius: 0px !important;
-  padding: 2px;
-  min-width: 0px;
-  background-color: #C7D0D9;
-}
-
-.titledsplitter-closeimage {
-  list-style-image: url("chrome://inspector/skin/titledsplitter-close.png");
-}
-
-.titledsplitter-closebutton:hover:active {
-  border-style: inset;
-  padding: 3px 1px 1px 3px;
-}
-
-
diff --git a/suite/extensions/inspector/resources/skin/modern/titledsplitter-close.gif b/suite/extensions/inspector/resources/skin/modern/titledsplitter-close.gif
deleted file mode 100644
index a53eddd05915e614f8da16fef143b90bed243de7..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/titledsplitter-close.png b/suite/extensions/inspector/resources/skin/modern/titledsplitter-close.png
deleted file mode 100644
index 72cdd217411d13a258b2b9488e05de697c777dca..0000000000000000000000000000000000000000
GIT binary patch
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css b/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvent/accessibleEvent.css
+++ /dev/null
@@ -1,5 +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/. */
-
-@import url("chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css");
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css b/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleEvents/accessibleEvents.css
+++ /dev/null
@@ -1,21 +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/. */
-
-@import url("chrome://inspector/skin");
-
-treechildren::-moz-tree-checkbox {
-  list-style-image: url("chrome://global/skin/checkbox/cbox.gif");
-}
-
-treechildren::-moz-tree-checkbox(checked) {
-  list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
-}
-
-#welHandlerEditor {
-  font-family: monospace;
-}
-
-#welGrippyButton {
-  cursor: default;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleProps/accessibleProps.css b/suite/extensions/inspector/resources/skin/modern/viewers/accessibleProps/accessibleProps.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleProps/accessibleProps.css
+++ /dev/null
@@ -1,22 +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/. */
-
-@import url("chrome://inspector/skin");
-
-.textAttrsTextRange {
-  border-bottom: medium dotted blue;
-  padding: 7px;
-  border-bottom-left-radius: 16px;
-  border-bottom-right-radius: 16px;
-  line-height: 250%;
-  margin: 2px;
-}
-
-.textAttrsTextRange:hover {
-  border-bottom: medium dotted red;
-}
-
-.textAttrsTextRange[selected] {
-  border-bottom: medium groove purple;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleTree/accessibleTree.css b/suite/extensions/inspector/resources/skin/modern/viewers/accessibleTree/accessibleTree.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/accessibleTree/accessibleTree.css
+++ /dev/null
@@ -1,22 +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/. */
-
-@import url("chrome://inspector/skin");
-
-treechildren::-moz-tree-row(highlight) {
-  background-color: #feeecd;
-}
-
-treechildren::-moz-tree-row(selected, highlight) {
-  background-color: #c0ffff;
-}
-
-treechildren::-moz-tree-cell-text(highlight) {
-  color: black;
-}
-
-treechildren::-moz-tree-cell-text(grayout) {
-  color: gray;
-  font-weight: bold;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/boxModel/boxModel.css b/suite/extensions/inspector/resources/skin/modern/viewers/boxModel/boxModel.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/boxModel/boxModel.css
+++ /dev/null
@@ -1,23 +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/. */
-
-@import url("chrome://inspector/skin");
-
-/* ::::: statistics ::::: */
-
-.nonzero {
-  font-weight: bold;
-}
-
-groupbox:not(#boxBorder) textbox {
-  text-align: right;
-}
-
-row {
-  -moz-box-align: baseline;
-}
-
-#enclosingBox {
-  overflow: auto;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/dom/columnsDialog.css b/suite/extensions/inspector/resources/skin/modern/viewers/dom/columnsDialog.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/dom/columnsDialog.css
+++ /dev/null
@@ -1,26 +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/. */
-
-@import url("chrome://inspector/skin");
-
-#trColumns {
-  background-color: #C7D0D9;
-}
-
-.column-selector {
-  border: 1px outset #C7D0D9;
-  padding: 2px;
-  background-color: #C7D0D9;
-  vertical-align: middle;
-}
-
-.attr-column-selector,
-.attr-column-selector[focused="true"] {
-  margin: 0;
-  border: none;
-}
-
-[col-dragging="true"] {
-  border: 1px solid black;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/dom/dom.css b/suite/extensions/inspector/resources/skin/modern/viewers/dom/dom.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/dom/dom.css
+++ /dev/null
@@ -1,59 +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/. */
-
-@import url("chrome://inspector/skin");
-
-/* :::::::: node type color coding :::::::: */
-
-treechildren::-moz-tree-cell-text(ACCESSIBLE_NODE) {
-  font-weight: bold;
-}
-
-treechildren::-moz-tree-cell-text(ELEMENT_NODE) {
-  color: #000000;
-}
-
-treechildren::-moz-tree-cell-text(ATTRIBUTE_NODE) {
-  color: #556b2f;
-}
-
-treechildren::-moz-tree-cell-text(CDATA_SECTION_NODE),
-treechildren::-moz-tree-cell-text(TEXT_NODE) {
-  color: #0000AA;
-}
-
-treechildren::-moz-tree-cell-text(COMMENT_NODE) {
-  color: #228b22;
-}
-
-treechildren::-moz-tree-cell-text(DOCUMENT_NODE) {
-  color: #800080;
-}
-
-treechildren::-moz-tree-cell-text(DOCUMENT_TYPE_NODE) {
-  color: #606000;
-}
-
-treechildren::-moz-tree-cell-text(PROCESSING_INSTRUCTION_NODE) {
-  color: #808080;
-}
-
-treechildren::-moz-tree-cell-text(anonymous) {
-  color: #ff0000;
-}
-
-treechildren::-moz-tree-cell-text(selected, focus) {
-  color: #FFFFFF;
-}
-
-/* :::::::: drag and drop insertion indicators :::::::: */
-
-treechildren::-moz-tree-column(dnd-insert-before) {
-  border-left: 2px solid #000000;
-}
-
-treechildren::-moz-tree-column(dnd-insert-after) {
-  border-right: 2px solid #000000;
-}
-
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/dom/findDialog.css b/suite/extensions/inspector/resources/skin/modern/viewers/dom/findDialog.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/dom/findDialog.css
+++ /dev/null
@@ -1,5 +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/. */
-
-@import url("chrome://inspector/skin");
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/domNode/domNode.css b/suite/extensions/inspector/resources/skin/modern/viewers/domNode/domNode.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/domNode/domNode.css
+++ /dev/null
@@ -1,13 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://inspector/content/extensions/treeEditable.css");
-
-.olNodeInfoLabel {
-  padding-right: 0.5em;
-}
-#olNodeInfo {
-  padding-bottom: 0.5em;
-}
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/styleRules/styleRules.css b/suite/extensions/inspector/resources/skin/modern/viewers/styleRules/styleRules.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/styleRules/styleRules.css
+++ /dev/null
@@ -1,21 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://inspector/content/extensions/treeEditable.css");
-
-#olcPropPriority {
-  list-style-image: url("chrome://inspector/skin/iconImportant.png");
-}
-
-#olbStyleProps::-moz-tree-image(olcPropPriority, important) {
-  list-style-image: url("chrome://inspector/skin/iconImportant.png");
-}
-
-/* ::::: default column widths ::::: */
-
-#olcLine {
-  width: 5em;
-}
-
diff --git a/suite/extensions/inspector/resources/skin/modern/viewers/xblBindings/xblBindings.css b/suite/extensions/inspector/resources/skin/modern/viewers/xblBindings/xblBindings.css
deleted file mode 100644
--- a/suite/extensions/inspector/resources/skin/modern/viewers/xblBindings/xblBindings.css
+++ /dev/null
@@ -1,6 +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/. */
-
-@import url("chrome://inspector/skin");
-@import url("chrome://inspector/skin/viewers/dom/dom.css");
diff --git a/suite/extensions/moz.build b/suite/extensions/moz.build
--- a/suite/extensions/moz.build
+++ b/suite/extensions/moz.build
@@ -7,13 +7,8 @@ if CONFIG['MOZ_DEBUGQA']:
     DIRS += [
         'debugQA',
     ]
 
 if CONFIG['MOZ_IRC']:
     DIRS += [
         'irc',
     ]
-
-if CONFIG['MOZ_DOMINSPECTOR']:
-    DIRS += [
-        'inspector',
-    ]
diff --git a/suite/installer/package-manifest.in b/suite/installer/package-manifest.in
--- a/suite/installer/package-manifest.in
+++ b/suite/installer/package-manifest.in
@@ -392,16 +392,19 @@
 @RESPATH@/components/UAOverridesBootstrapper.js
 @RESPATH@/components/UAOverridesBootstrapper.manifest
 @RESPATH@/components/WellKnownOpportunisticUtils.js
 @RESPATH@/components/WellKnownOpportunisticUtils.manifest
 @RESPATH@/components/FeedWriter.js
 @RESPATH@/components/folderLookupService.js
 @RESPATH@/components/htmlMenuBuilder.js
 @RESPATH@/components/htmlMenuBuilder.manifest
+@RESPATH@/components/inspector-cmdline.js
+@RESPATH@/components/inspector-startup.js
+@RESPATH@/components/InspectorComponents.manifest
 @RESPATH@/components/jsconsole-clhandler.js
 @RESPATH@/components/jsconsole-clhandler.manifest
 @RESPATH@/components/mozProtocolHandler.js
 @RESPATH@/components/mozProtocolHandler.manifest
 @RESPATH@/components/addoncompat.manifest
 @RESPATH@/components/multiprocessShims.js
 ; https://bugzilla.mozilla.org/show_bug.cgi?id=1164014
 @RESPATH@/components/defaultShims.js
@@ -619,16 +622,17 @@
 @RESPATH@/chrome/icons/default/winInspectorMain.ico
 @RESPATH@/chrome/icons/default/xml-file.ico
 @RESPATH@/chrome/icons/default/xul-file.ico
 #endif
 
 ; [Default Preferences]
 ; All the browser/general pref files must be part of base to prevent migration bugs
 @RESPATH@/@PREF_DIR@/suite-prefs.js
+@RESPATH@/@PREF_DIR@/inspector-prefs.js
 @RESPATH@/@PREF_DIR@/composer.js
 @RESPATH@/greprefs.js
 @RESPATH@/defaults/autoconfig/prefcalls.js
 @RESPATH@/defaults/permissions
 @RESPATH@/defaults/blocklists
 @RESPATH@/defaults/pinning
 ; Warning: changing the path to channel-prefs.js can cause bugs. (Bug 756325)
 @RESPATH@/defaults/pref/channel-prefs.js
@@ -898,21 +902,16 @@ bin/libfreebl_32int64_3.so
 @RESPATH@/components/SanityTest.js
 #endif
 
 [chatzilla]
 #ifdef MOZ_IRC
 @RESPATH@/extensions/{59c81df5-4b7a-477b-912d-4e0fdf64e5f2}.xpi
 #endif
 
-[inspector]
-#ifdef MOZ_DOMINSPECTOR
-@RESPATH@/extensions/inspector@mozilla.org.xpi
-#endif
-
 [debugqa]
 #ifdef MOZ_PACKAGE_DEBUGQA
 @RESPATH@/extensions/debugQA@mozilla.org.xpi
 #endif
 
 #ifdef MOZ_CALENDAR
 [calendar]
 @RESPATH@/extensions/{e2fda1a4-762b-4020-b5ad-a41df1933103}.xpi
diff --git a/suite/locales/en-US/chrome/inspector/editing.dtd b/suite/locales/en-US/chrome/inspector/editing.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/editing.dtd
@@ -0,0 +1,27 @@
+<!-- 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/. -->
+
+<!ENTITY mnEditUndo.label "Undo">
+<!ENTITY mnEditUndo.accesskey "u">
+<!ENTITY mnEditRedo.label "Redo">
+<!ENTITY mnEditRedo.accesskey "r">
+<!ENTITY mnEditCut.label "Cut">
+<!ENTITY mnEditCut.accesskey "t">
+<!ENTITY mnEditCopy.label "Copy">
+<!ENTITY mnEditCopy.accesskey "c">
+<!ENTITY mnEditPaste.label "Paste">
+<!ENTITY mnEditPaste.accesskey "p">
+<!ENTITY mnEditInsert.label "Insert">
+<!ENTITY mnEditInsert.accesskey "i">
+<!ENTITY mnEditEdit.label "Edit">
+<!ENTITY mnEditEdit.accesskey "e">
+<!ENTITY mnEditDelete.label "Delete">
+<!ENTITY mnEditDelete.accesskey "d">
+<!ENTITY mnEditInspectInNewWindow.label "Inspect in New Window">
+<!ENTITY mnEditInspectInNewWindow.accesskey "N">
+<!ENTITY mnEditInspectInNewWindow.key "I">
+<!ENTITY mnEditCopyFileURI.label "Copy URI">
+<!ENTITY mnEditCopyFileURI.accesskey "U">
+<!ENTITY mnEditViewFileURI.label "View File">
+<!ENTITY mnEditViewFileURI.accesskey "V">
diff --git a/suite/locales/en-US/chrome/inspector/inspector.dtd b/suite/locales/en-US/chrome/inspector/inspector.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/inspector.dtd
@@ -0,0 +1,67 @@
+<!-- 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/. -->
+
+
+<!ENTITY Inspector.title "DOM Inspector">
+
+<!ENTITY thDOMNodes.label "DOM Nodes">
+<!ENTITY btnInspect.label "Inspect">
+<!ENTITY btnInspect.accesskey "I">
+<!ENTITY bxDocPanel.title "Document">
+<!ENTITY bxObjectPanel.title "Object">
+<!ENTITY btnSelecting.tooltip "Find a node to inspect by clicking on it">
+<!ENTITY btnFind.tooltip "Find a node to inspect by id, tag, or attribute">
+
+<!-- MAIN MENU ITEMS -->
+
+<!ENTITY mnFile.label "File">
+<!ENTITY mnFile.accesskey "F">
+  <!ENTITY mnInspectContentDocument.label "Inspect Content Document">
+  <!ENTITY mnInspectContentDocument.accesskey "O">
+  <!ENTITY mnInspectChromeDocument.label "Inspect Chrome Document">
+  <!ENTITY mnInspectChromeDocument.accesskey "H">
+  <!ENTITY mnInspectApplicationAccessible.label "Inspect Application Accessible">
+  <!ENTITY mnInspectApplicationAccessible.accesskey "A">
+  <!ENTITY cmdEnterLocation.label "Inspect a URL">
+  <!ENTITY cmdEnterLocation.accesskey "U">
+  <!ENTITY cmdEnterLocation.key "L">
+  <!ENTITY cmdEnterLocation.key2 "D">
+  <!ENTITY cmdSave.label "Save DOM As…">
+  <!ENTITY cmdSave.accesskey "S">
+  <!ENTITY cmdClose.label "Close">
+  <!ENTITY cmdClose.accesskey "C">
+  <!ENTITY cmdExit.label "Exit">
+  <!ENTITY cmdExit.accesskey "x">
+
+<!ENTITY mnEdit.label "Edit">
+<!ENTITY mnEdit.accesskey "E">
+  <!ENTITY cmdUndo.label "Undo">
+  <!ENTITY cmdUndo.accesskey "U">
+  <!ENTITY cmdRedo.label "Redo">
+  <!ENTITY cmdRedo.accesskey "R">
+  <!ENTITY cmdCut.label "Cut">
+  <!ENTITY cmdCut.accesskey "t">
+  <!ENTITY cmdCopy.label "Copy">
+  <!ENTITY cmdCopy.accesskey "C">
+  <!ENTITY cmdPaste.label "Paste">
+  <!ENTITY cmdPaste.accesskey "P">
+  <!ENTITY cmdDelete.label "Delete">
+  <!ENTITY cmdDelete.accesskey "D">
+
+<!ENTITY mnView.label "View">
+<!ENTITY mnView.accesskey "v">
+  <!ENTITY mnDocViewerList.label "Document Viewer">
+  <!ENTITY mnDocViewerList.accesskey "D">
+  <!ENTITY mnObjectViewerList.label "Object Viewer">
+  <!ENTITY mnObjectViewerList.accesskey "O">
+  <!ENTITY cmdToggleDocument.label "Show Document in Browser Pane">
+  <!ENTITY cmdToggleDocument.accesskey "B">
+  <!ENTITY cmdToggleSearch.label "Search Results">
+  <!ENTITY cmdFlashOnSelect.label "Blink Selected Element">
+  <!ENTITY cmdFlashOnSelect.accesskey "S">
+
+<!ENTITY browserPanel.label "Browser">
+
+<!ENTITY saveCmd.key "S">
+<!ENTITY closeCmd.key "W">
diff --git a/suite/locales/en-US/chrome/inspector/inspector.properties b/suite/locales/en-US/chrome/inspector/inspector.properties
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/inspector.properties
@@ -0,0 +1,37 @@
+# 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/.
+
+applicationAccesible.title = Application Accessible
+inspectWindow.noDocuments.message = (None)
+styleRuleNewProperty.title = New Style Rule
+styleRuleEditProperty.title = Edit Style Rule
+styleRulePropertyValue.message = Enter the property value:
+styleRulePropertyName.message = Enter the property name:
+sidebar.title = DOM Inspector
+sidebarInstalled = The sidebar is installed.
+newAttribute.title = New Attribute
+editAttribute.title = Edit Attribute
+findNodesDocumentEnd.message = End of document reached.
+findNodesDocumentEnd.title = Find Nodes
+# LOCALIZATION NOTE (root.title) label displayed for the tree head of the
+# JavaScript Object tree
+root.title = Subject
+
+irrecoverableSubtree.message = Some of the selected nodes are part of an anonymous subtree that will be destroyed. Deleting these nodes cannot be undone. Do you want to delete the selected nodes?
+irrecoverableSubtree.title = Delete Anonymous Subtree
+
+# The following items correspond to the node types defined by the W3C DOM Core
+# specification.
+1 = Element
+2 = Attribute
+3 = Text
+4 = CDATA Section
+5 = Entity Reference
+6 = Entity
+7 = Processing Instruction
+8 = Comment
+9 = Document
+10 = Document Type
+11 = Document Fragment
+12 = Notation
diff --git a/suite/locales/en-US/chrome/inspector/prefs.dtd b/suite/locales/en-US/chrome/inspector/prefs.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/prefs.dtd
@@ -0,0 +1,26 @@
+<!-- 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/. -->
+
+<!ENTITY Inspector.label "DOM Inspector">
+<!ENTITY Sidebar.label "Sidebar">
+<!ENTITY elementBlinking.label "Element Blinking">
+<!ENTITY blinkSelectedElement.label "Blink Selected Element">
+<!ENTITY blinkSelectedElement.accesskey "B">
+<!ENTITY borderColor.label "Border Color">
+<!ENTITY borderColor.accesskey "C">
+<!ENTITY borderWidth.label "Border Width">
+<!ENTITY borderWidth.accesskey "W">
+<!ENTITY px.label "(px)">
+<!ENTITY blinkDuration.label "Blink Duration">
+<!ENTITY blinkDuration.accesskey "D">
+<!ENTITY ms.label "(ms)">
+<!ENTITY blinkSpeed.label "Blink Speed">
+<!ENTITY blinkSpeed.accesskey "S">
+<!ENTITY invertColors.label "Invert Colors">
+<!ENTITY invertColors.accesskey "v">
+<!ENTITY installHowTo.label "The DOM Inspector Sidebar is not currently installed.  Click the 'Install' button to add it to your Sidebar.">
+<!ENTITY install.label "Install">
+<!ENTITY install.accesskey "I">
+<!ENTITY addNavigatorHooks.label "Add contextual menus to Navigator">
+<!ENTITY addNavigatorHooks.accesskey "m">
diff --git a/suite/locales/en-US/chrome/inspector/tasksOverlay.dtd b/suite/locales/en-US/chrome/inspector/tasksOverlay.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/tasksOverlay.dtd
@@ -0,0 +1,7 @@
+<!-- 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/. -->
+
+<!ENTITY inspectorTaskCmd.label "DOM Inspector">
+<!ENTITY inspectorTaskCmd.commandkey "i">
+<!ENTITY inspectorTaskCmd.accesskey "I">
diff --git a/suite/locales/en-US/chrome/inspector/viewer-registry.dtd b/suite/locales/en-US/chrome/inspector/viewer-registry.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewer-registry.dtd
@@ -0,0 +1,19 @@
+<!-- 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/. -->
+
+<!ENTITY dom.label "DOM Nodes">
+<!ENTITY stylesheets.label "Style Sheets">
+<!ENTITY domNode.label "DOM Node">
+<!ENTITY boxModel.label "Box Model">
+<!ENTITY xblBindings.label "XBL Bindings">
+<!ENTITY styleRules.label "CSS Rules">
+<!ENTITY computedStyle.label "Computed Style">
+<!ENTITY usedFontFaces.label "Used Font Faces">
+<!ENTITY jsObject.label "JavaScript Object">
+<!ENTITY accessibleEvent.label "Accessible Event">
+<!ENTITY accessibleObject.label "Accessible Object">
+<!ENTITY accessibleProps.label "Accessible Properties">
+<!ENTITY accessibleRelations.label "Accessible Relations">
+<!ENTITY accessibleEvents.label "Accessible Events">
+<!ENTITY accessibleTree.label "Accessible Tree">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleEvent.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvent.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvent.dtd
@@ -0,0 +1,13 @@
+<!-- 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/. -->
+
+<!ENTITY descIsFromUserInput.label "Is from user input: ">
+<!ENTITY descState.label "State: ">
+<!ENTITY descIsEnabled.label "Is state enabled: ">
+<!ENTITY descStartOffset.label "Start offset: ">
+<!ENTITY descLength.label "Length: ">
+<!ENTITY descIsInserted.label "Is text inserted: ">
+<!ENTITY descModifiedText.label "Modified text: ">
+<!ENTITY descCaretOffset.label "Caret offset: ">
+<!ENTITY descrHandlerOutput.label "Event handler output: ">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.dtd
@@ -0,0 +1,23 @@
+<!-- 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/. -->
+
+<!ENTITY eventList.label "Event List">
+<!ENTITY watchedEvents.label "Watched Events">
+<!ENTITY handledEvents.label "Handled events:">
+<!ENTITY eventType.label "Event Type">
+<!ENTITY eventTime.label "Time">
+<!ENTITY eventTargetNodeName.label "Node Name">
+<!ENTITY eventTargetNodeID.label "ID">
+<!ENTITY eventTargetRole.label "Role">
+<!ENTITY eventTargetName.label "Name">
+<!ENTITY isWatched.label "Watched">
+<!ENTITY isHandlerEnabled.label "Handler Enabled">
+<!ENTITY clearEventList.label "Clear Event List">
+<!ENTITY chooseEventsToWatch.label "Choose events to watch.">
+<!ENTITY watchAll.label "Watch All">
+<!ENTITY watchNone.label "Watch None">
+<!ENTITY editHandler.label "Edit Handler">
+<!ENTITY contextHelp.label "?">
+<!ENTITY handlerEditorNoEvent.label "Choose event type to add a handler.">
+
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.properties b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.properties
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleEvents.properties
@@ -0,0 +1,22 @@
+# 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/.
+
+mutationEvents = mutation events
+changeEvents = change events
+notificationEvents = notification events
+selectionEvents = selection events
+menuEvents = menu events
+documentEvents = document events
+textEvents = text events
+tableEvents = table events
+windowEvents = window events
+hyperLinkEvents = hyper link events
+hyperTextEvents = hyper text events
+
+handlerEditorLabel = Enable "%S" event handler.
+
+role = Role
+name = Name
+nodeName = Node Name
+id = ID
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleEventsHandlerHelpDialog.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleEventsHandlerHelpDialog.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleEventsHandlerHelpDialog.dtd
@@ -0,0 +1,18 @@
+<!-- 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/. -->
+
+  <!ENTITY helpDialog.title "Handler help dialog">
+
+  <!ENTITY general.descr "Write and attach an accessibility event handler. When the event occurs, you can select it in the events list and see the result of the handler evaluation in the linked Accessible Event viewer.">
+  <!ENTITY helpers.descr "The following objects and functions can be used within handler editor:">
+
+  <!ENTITY event.descr "accessibility event object">
+  <!ENTITY target.descr "accessibility target object">
+  <!ENTITY accRetrieval.descr "nsIAccessibleRetrieval accessibility service">
+  <!ENTITY output.descr "prints the given string">
+  <!ENTITY outputAttrs.descr "prints object attributes of the given accessible object">
+  <!ENTITY outputRole.descr "prints role of the given accessible object">
+  <!ENTITY outputStates.descr "prints states of the given accessible object">
+  <!ENTITY outputTree.descr "prints tree for the given accessible object, highlighting accessibles from the given array">
+  <!ENTITY outputDOMAttrs.descr "prints DOM attributes of the given accessible object">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.dtd
@@ -0,0 +1,29 @@
+<!-- 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/. -->
+<!ENTITY descRole.label "Role:">
+<!ENTITY descName.label "Name:">
+<!ENTITY descDescription.label "Description:">
+<!ENTITY descValue.label "Value:">
+<!ENTITY descState.label "State:">
+<!ENTITY descBounds.label "Bounds:">
+<!ENTITY tabAttrs.label "Object attributes">
+<!ENTITY colAttrName.label "Name">
+<!ENTITY colAttrValue.label "Value">
+<!ENTITY tabActions.label "Actions">
+<!ENTITY descKeyBindings.label "Key bindings:">
+<!ENTITY descInvoke.label "Invoke">
+<!ENTITY tabTextAttrs.label "Text attributes">
+<!ENTITY descDefaultAttrs.label "Default attributes:">
+<!ENTITY descStartOffset.label "Start offset:">
+<!ENTITY descEndOffset.label "End offset:">
+<!ENTITY tabTableCell.label "Table cell">
+<!ENTITY descColumnIdx.label "Column index:">
+<!ENTITY descRowIdx.label "Row index:">
+<!ENTITY descColumnExtent.label "Column extent:">
+<!ENTITY descRowExtent.label "Row extent:">
+<!ENTITY descIsSelected.label "Is selected:">
+<!ENTITY colProp.label "Property">
+<!ENTITY colRole.label "Role">
+<!ENTITY colName.label "Name">
+<!ENTITY colNodeName.label "Node name">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.properties b/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.properties
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleProps.properties
@@ -0,0 +1,5 @@
+# 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/.
+
+accBounds = x: %S;  y: %S;  width: %S;  height: %S;
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleRelations.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleRelations.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleRelations.dtd
@@ -0,0 +1,10 @@
+<!-- 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/. -->
+
+<!ENTITY relationType.label "Relation Type">
+<!ENTITY role.label "Role">
+<!ENTITY nodeName.label "Node Name">
+<!ENTITY relations.label "Relations: ">
+<!ENTITY relationTargets.label "Relation Targets: ">
+
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleTree.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleTree.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleTree.dtd
@@ -0,0 +1,10 @@
+<!-- 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/. -->
+
+<!ENTITY role.label "Role">
+<!ENTITY name.label "Name">
+<!ENTITY nodeName.label "Node Name">
+
+<!ENTITY evaluateJS.label "Evaluate JavaScript">
+
diff --git a/suite/locales/en-US/chrome/inspector/viewers/accessibleTreeEvalJSDialog.dtd b/suite/locales/en-US/chrome/inspector/viewers/accessibleTreeEvalJSDialog.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/accessibleTreeEvalJSDialog.dtd
@@ -0,0 +1,13 @@
+<!-- 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/. -->
+
+  <!ENTITY evaluateDialog.title "Evaluate JavaScript Dialog">
+
+  <!ENTITY btnEvaluateJS.label "Evaluate">
+  <!ENTITY btnEvaluateJS.accesskey "E">
+  
+  <!ENTITY txtInputArea.label "Input Area (use 'accessible' variable to operate with the selected accessible and 'output' function to write into 'Output Area' window, 'tree.search(accessible, filterfunc)' to search and 'tree.clearSearch()' to clear search results): ">
+  <!ENTITY txtInputArea.accesskey "I">
+  <!ENTITY txtOutputArea.label "Output Area: ">
+  <!ENTITY txtOutputArea.accesskey "O">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/boxModel.dtd b/suite/locales/en-US/chrome/inspector/viewers/boxModel.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/boxModel.dtd
@@ -0,0 +1,17 @@
+<!-- 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/. -->
+
+<!ENTITY boxPosition.label "Position">
+<!ENTITY boxDimension.label "Dimensions">
+<!ENTITY boxMargin.label "Margin">
+<!ENTITY boxBorder.label "Border">
+<!ENTITY boxPadding.label "Padding">
+
+<!ENTITY xCoord.label "x">
+<!ENTITY yCoord.label "y">
+<!ENTITY screenXCoord.label "screen x">
+<!ENTITY screenYCoord.label "screen y">
+
+<!ENTITY dimensionWidth.label  "box width">
+<!ENTITY dimensionHeight.label "box height">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/computedStyle.dtd b/suite/locales/en-US/chrome/inspector/viewers/computedStyle.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/computedStyle.dtd
@@ -0,0 +1,6 @@
+<!-- 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/. -->
+
+<!ENTITY propertyName.label "Property">
+<!ENTITY propertyValue.label "Value">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/dom.dtd b/suite/locales/en-US/chrome/inspector/viewers/dom.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/dom.dtd
@@ -0,0 +1,138 @@
+<!-- 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/. -->
+
+  <!ENTITY cmdShowFindDialog.label "Find Nodes…">
+  <!ENTITY cmdShowFindDialog.accesskey "f">
+  <!ENTITY cmdShowFindDialog.key "f">
+
+  <!ENTITY cmdFindAgain.label "Find Again">
+  <!ENTITY cmdFindAgain.accesskey "g">
+  <!ENTITY cmdFindAgain.key "G">
+
+  <!ENTITY cmdToggleAnonContent.label "Show Anonymous Content">
+  <!ENTITY cmdToggleAnonContent.accesskey "a">
+
+  <!ENTITY cmdToggleWhitespaceNodes.label "Show Whitespace Nodes">
+  <!ENTITY cmdToggleWhitespaceNodes.accesskey "W">
+
+  <!ENTITY cmdToggleAccessibleNodes.label "Show Accessible Nodes">
+  <!ENTITY cmdToggleAccessibleNodes.accesskey "c">
+
+  <!ENTITY cmdToggleProcessingInstructions.label "Show Processing Instructions">
+  <!ENTITY cmdToggleProcessingInstructions.accesskey "P">
+
+  <!ENTITY cmdToggleAttributes.label "Show Attributes">
+  <!ENTITY cmdToggleAttributes.accesskey "r">
+
+  <!ENTITY cmdSelectByClick.label "Select Element By Click">
+  <!ENTITY cmdSelectByClick.accesskey "s">
+
+  <!ENTITY ColumnsDialog.title "Columns">
+
+  <!ENTITY cmdShowColumnsDialog.label "Columns…">
+  <!ENTITY cmdShowColumnsDialog.accesskey "c">
+
+  <!ENTITY cmdInsertNode.label "Insert…">
+  <!ENTITY cmdDeleteNode.label "Delete">
+  <!ENTITY cmdCopyXML.label "Copy XML">
+  <!ENTITY cmdCopyXML.accesskey "X">
+  <!ENTITY cmdBlink.label "Blink Element">
+  <!ENTITY cmdBlink.accesskey "B">
+  <!ENTITY cmdInspectBrowser.label "Inspect Contained Document">
+  <!ENTITY cmdInspectBrowser.accesskey "e">
+
+  <!ENTITY cmdShowPseudoClasses.label "Set Pseudo-classes…">
+  <!ENTITY cmdShowPseudoClasses.accesskey "S">
+
+  <!ENTITY pseudoClasses.title "Pseudo-classes">
+
+  <!ENTITY findNodes.title "Find Nodes">
+  <!ENTITY findNodesById.label "Id">
+  <!ENTITY findNodesById.accesskey "I">
+  <!ENTITY findNodesById.accesskey2 "d">
+  <!ENTITY findNodesByTag.label "Tag">
+  <!ENTITY findNodesByTag.accesskey "T">
+  <!ENTITY findNodesByTag.accesskey2 "g">
+  <!ENTITY findNodesByAttr.label "Attr">
+  <!ENTITY findNodesByAttr.accesskey "A">
+  <!ENTITY findNodesByAttr.accesskey2 "r">
+  <!ENTITY findNodesByAttrValue.label "Value">
+  <!ENTITY findNodesByAttrValue.accesskey "V">
+  <!ENTITY findNodesSearchBy.label "Search By">
+  <!ENTITY findNodesDirection.label "Direction">
+  <!ENTITY findNodesDirectionUp.label "Up">
+  <!ENTITY findNodesDirectionUp.accesskey "U">
+  <!ENTITY findNodesDirectionDown.label "Down">
+  <!ENTITY findNodesDirectionDown.accesskey "w">
+  <!ENTITY findNodesFind.label "Find">
+  <!ENTITY findNodesCancel.label "Cancel">
+
+  <!ENTITY mnEditPasteMenu.label "Paste">
+  <!ENTITY mnEditPasteMenu.accesskey "P">
+  <!ENTITY mnEditPasteBefore.label "Before">
+  <!ENTITY mnEditPasteBefore.accesskey "B">
+  <!ENTITY mnEditPasteAfter.label "After">
+  <!ENTITY mnEditPasteAfter.accesskey "A">
+  <!ENTITY mnEditPasteReplace.label "In place of (Replace)">
+  <!ENTITY mnEditPasteReplace.accesskey "I">
+  <!ENTITY mnEditPasteFirstChild.label "As first child">
+  <!ENTITY mnEditPasteFirstChild.accesskey "f">
+  <!ENTITY mnEditPasteLastChild.label "As last child">
+  <!ENTITY mnEditPasteLastChild.accesskey "c">
+  <!ENTITY mnEditPasteAsParent.label "As parent">
+  <!ENTITY mnEditPasteAsParent.accesskey "r">
+
+  <!ENTITY mnEditInsertMenu.label "Insert">
+  <!ENTITY mnEditInsertMenu.accesskey "I">
+  <!ENTITY mnEditInsertAfter.label "After">
+  <!ENTITY mnEditInsertAfter.accesskey "A">
+  <!ENTITY mnEditInsertBefore.label "Before">
+  <!ENTITY mnEditInsertBefore.accesskey "B">
+  <!ENTITY mnEditInsertFirstChild.label "As first child">
+  <!ENTITY mnEditInsertFirstChild.accesskey "f">
+  <!ENTITY mnEditInsertLastChild.label "As last child">
+  <!ENTITY mnEditInsertLastChild.accesskey "c">
+
+  <!ENTITY insertNode.title "Insert Node">
+  <!ENTITY nodeType.label "Node Type:">
+  <!ENTITY nodeType.accesskey "T">
+  <!ENTITY nodeType.element.label "Element">
+  <!ENTITY nodeType.text.label "Text">
+  <!ENTITY namespaceURI.label "Namespace URI:">
+  <!ENTITY namespaceURI.accesskey "U">
+  <!ENTITY tagName.label "Tag Name:">
+  <!ENTITY tagName.accesskey "N">
+  <!ENTITY nodeValue.label "Node Value:">
+  <!ENTITY nodeValue.accesskey "V">
+
+  <!ENTITY namespaceTitle.null.label "null">
+  <!ENTITY namespaceTitle.default.label "Document Default">
+  <!ENTITY namespaceTitle.custom.label "Custom">
+
+  <!-- LOCALIZATION NOTE: The following entities are names of W3C
+       specifications.  Please consult
+       http://www.w3.org/Consortium/Translation/ for appropriate translation
+       or leave unchanged. -->
+  <!ENTITY namespaceTitle.XMLNS.label "XMLNS">
+  <!ENTITY namespaceTitle.XML.label "XML">
+  <!ENTITY namespaceTitle.XHTML.label "XHTML">
+  <!ENTITY namespaceTitle.XLink.label "XLink">
+  <!ENTITY namespaceTitle.XSLT.label "XSLT">
+  <!ENTITY namespaceTitle.XBL.label "XBL">
+  <!ENTITY namespaceTitle.MathML.label "MathML">
+  <!ENTITY namespaceTitle.RDF.label "RDF">
+  <!ENTITY namespaceTitle.XUL.label "XUL">
+  <!ENTITY namespaceTitle.SVG.label "SVG">
+  <!ENTITY namespaceTitle.XMLEvents.label "XML Events">
+  <!ENTITY namespaceTitle.WAIRoles.label "WAI Roles">
+  <!ENTITY namespaceTitle.WAIProperties.label "WAI Properties">
+
+  <!-- LOCALIZATION NOTE: Localizers can choose not to translate the following
+       access keys. For a discussion about the pros and cons of such a
+       decision, see https://bugzilla.mozilla.org/show_bug.cgi?id=398704,
+       comments 1 and 2. -->
+  <!ENTITY cbxStateHover.accesskey "h">
+  <!ENTITY cbxStateActive.accesskey "a">
+  <!ENTITY cbxStateFocus.accesskey "f">
+
diff --git a/suite/locales/en-US/chrome/inspector/viewers/domNode.dtd b/suite/locales/en-US/chrome/inspector/viewers/domNode.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/domNode.dtd
@@ -0,0 +1,31 @@
+<!-- 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/. -->
+
+<!ENTITY nodeName.label "Node Name:">
+<!ENTITY localName.label "Local Name:">
+<!ENTITY namespaceURI.label "Namespace URI:">
+<!ENTITY nodeType.label "Node Type:">
+<!ENTITY nodeValue.label "Node Value:">
+<!ENTITY grpAttr.label "Attributes">
+
+<!ENTITY namespaceTitle.null.label "null">
+<!ENTITY namespaceTitle.default.label "Document Default">
+<!ENTITY namespaceTitle.custom.label "Custom">
+
+<!-- LOCALIZATION NOTE: The following entities are names of W3C specifications.
+                        Please consult http://www.w3.org/Consortium/Translation/
+                        for appropriate translation or leave unchanged. -->
+<!ENTITY namespaceTitle.XMLNS.label "XMLNS">
+<!ENTITY namespaceTitle.XML.label "XML">
+<!ENTITY namespaceTitle.XHTML.label "XHTML">
+<!ENTITY namespaceTitle.XLink.label "XLink">
+<!ENTITY namespaceTitle.XSLT.label "XSLT">
+<!ENTITY namespaceTitle.XBL.label "XBL">
+<!ENTITY namespaceTitle.MathML.label "MathML">
+<!ENTITY namespaceTitle.RDF.label "RDF">
+<!ENTITY namespaceTitle.XUL.label "XUL">
+<!ENTITY namespaceTitle.SVG.label "SVG">
+<!ENTITY namespaceTitle.XMLEvents.label "XML Events">
+<!ENTITY namespaceTitle.WAIRoles.label "WAI Roles">
+<!ENTITY namespaceTitle.WAIProperties.label "WAI Properties">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/jsObject.dtd b/suite/locales/en-US/chrome/inspector/viewers/jsObject.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/jsObject.dtd
@@ -0,0 +1,16 @@
+<!-- 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/. -->
+
+<!ENTITY jsCopyValue.label "Copy Value">
+<!ENTITY jsEval.label "Evaluate JavaScript…">
+
+<!ENTITY jsProperty.label "Property">
+<!ENTITY jsValue.label "Value">
+
+<!ENTITY evaluateDialog.title "Evaluate Expression">
+<!ENTITY jsEval.desc "Enter a JavaScript expression.  The variable &quot;target&quot; is the property that is currently selected.">
+<!ENTITY jsExecute.label "Execute">
+<!ENTITY inspectReturn.label "Inspect return in">
+<!ENTITY inspectReturnNew.label "New window">
+<!ENTITY inspectReturnExisting.label "Existing window">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/styleRules.dtd b/suite/locales/en-US/chrome/inspector/viewers/styleRules.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/styleRules.dtd
@@ -0,0 +1,21 @@
+<!-- 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/. -->
+
+<!ENTITY miFindCSSRules.label "Find CSS Rules…">
+<!ENTITY miFindCSSRules.accesskey "F">
+
+<!ENTITY newRules.label "New">
+<!ENTITY deleteSelectedRules.label "Delete">
+<!ENTITY disableSelectedRules.label "Disable">
+
+<!-- LOCALIZATION NOTE: DO NOT LOCALIZE "!important" since it is a CSS API -->
+<!ENTITY toggleSelectedImportant.label "Toggle !important">
+
+<!ENTITY styleRule.label "Rule">
+<!ENTITY styleRuleURI.label "File">
+<!ENTITY styleRuleLineNumber.label "Line">
+
+<!ENTITY styleRulePropPriority.label "Priority">
+<!ENTITY styleRulePropName.label "Property">
+<!ENTITY styleRulePropValue.label "Value">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/stylesheets.dtd b/suite/locales/en-US/chrome/inspector/viewers/stylesheets.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/stylesheets.dtd
@@ -0,0 +1,7 @@
+<!-- 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/. -->
+
+<!ENTITY sheetLocation.label "Style Sheet">
+<!ENTITY sheetRules.label "Rules">
+
diff --git a/suite/locales/en-US/chrome/inspector/viewers/usedFontFaces.dtd b/suite/locales/en-US/chrome/inspector/viewers/usedFontFaces.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/usedFontFaces.dtd
@@ -0,0 +1,9 @@
+<!-- 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/. -->
+
+<!ENTITY fontName.label "Font Name">
+<!ENTITY cssFamilyName.label "Family Name">
+<!ENTITY uri.label "URI">
+<!ENTITY localName.label "Local Name">
+<!ENTITY format.label "Format">
diff --git a/suite/locales/en-US/chrome/inspector/viewers/xblBindings.dtd b/suite/locales/en-US/chrome/inspector/viewers/xblBindings.dtd
new file mode 100644
--- /dev/null
+++ b/suite/locales/en-US/chrome/inspector/viewers/xblBindings.dtd
@@ -0,0 +1,18 @@
+<!-- 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/. -->
+
+<!ENTITY bindingContent.label      "Content">
+<!ENTITY bindingMethods.label      "Methods">
+<!ENTITY bindingMethodName.label   "Method Name">
+<!ENTITY bindingProperties.label   "Properties">
+<!ENTITY bindingGetter.label       "Getter">
+<!ENTITY bindingSetter.label       "Setter">
+<!ENTITY bindingProperty.label     "Property">
+<!ENTITY bindingHandlers.label     "Handlers">
+<!ENTITY bindingHandlerEvent.label "Event">
+<!ENTITY bindingHandlerPhase.label "Phase">
+<!ENTITY bindingResources.label    "Resources">
+<!ENTITY bindingResourceType.label "Type">
+<!ENTITY bindingResourceSrc.label  "Source">
+<!ENTITY bindingSourceCode.label   "Source Code">
diff --git a/suite/locales/jar.mn b/suite/locales/jar.mn
--- a/suite/locales/jar.mn
+++ b/suite/locales/jar.mn
@@ -4,16 +4,17 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 
 @AB_CD@.jar:
 % locale branding @AB_CD@ %locale/@AB_CD@/branding/
 % locale communicator @AB_CD@ %locale/@AB_CD@/communicator/
 % locale editor @AB_CD@ %locale/@AB_CD@/editor/
 % locale help @AB_CD@ %locale/@AB_CD@/helpviewer/
+% locale inspector @AB_CD@ %locale/@AB_CD@/inspector/
 % locale messenger @AB_CD@ %locale/@AB_CD@/messenger/
 % locale messenger-mapi @AB_CD@ %locale/@AB_CD@/messenger-mapi/
 % locale messenger-region @AB_CD@ %locale/@AB_CD@/messenger-region/
 % locale messenger-smime @AB_CD@ %locale/@AB_CD@/messenger-smime/
 % locale messenger-newsblog @AB_CD@ %locale/@AB_CD@/messenger-newsblog/
 % locale mozldap @AB_CD@ %locale/@AB_CD@/mozldap/
 % locale navigator @AB_CD@ %locale/@AB_CD@/navigator/
 % locale navigator-region @AB_CD@ %locale/@AB_CD@/navigator-region/
@@ -236,16 +237,40 @@
   locale/@AB_CD@/editor/EditorSpellCheck.dtd                                (%chrome/editor/dialogs/EditorSpellCheck.dtd)
   locale/@AB_CD@/editor/EditorTableProperties.dtd                           (%chrome/editor/dialogs/EditorTableProperties.dtd)
   locale/@AB_CD@/editor/EditorTextAreaProperties.dtd                        (%chrome/editor/dialogs/EditorTextAreaProperties.dtd)
   locale/@AB_CD@/editor/EditConflict.dtd                                    (%chrome/editor/dialogs/EditConflict.dtd)
   locale/@AB_CD@/editor/EdNamedAnchorProperties.dtd                         (%chrome/editor/dialogs/EdNamedAnchorProperties.dtd)
   locale/@AB_CD@/editor/editorPrefsOverlay.dtd                              (%chrome/editor/prefs/editorPrefsOverlay.dtd)
   locale/@AB_CD@/editor/pref-composer.dtd                                   (%chrome/editor/prefs/pref-composer.dtd)
   locale/@AB_CD@/editor/pref-editing.dtd                                    (%chrome/editor/prefs/pref-editing.dtd)
+  locale/@AB_CD@/inspector/inspector.dtd                                  (%chrome/inspector/inspector.dtd)
+  locale/@AB_CD@/inspector/prefs.dtd                                      (%chrome/inspector/prefs.dtd)
+  locale/@AB_CD@/inspector/editing.dtd                                    (%chrome/inspector/editing.dtd)
+  locale/@AB_CD@/inspector/tasksOverlay.dtd                               (%chrome/inspector/tasksOverlay.dtd)
+  locale/@AB_CD@/inspector/viewer-registry.dtd                            (%chrome/inspector/viewer-registry.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleEvent.dtd                    (%chrome/inspector/viewers/accessibleEvent.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleEvents.dtd                   (%chrome/inspector/viewers/accessibleEvents.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleEvents.properties            (%chrome/inspector/viewers/accessibleEvents.properties)
+  locale/@AB_CD@/inspector/viewers/accessibleEventsHandlerHelpDialog.dtd  (%chrome/inspector/viewers/accessibleEventsHandlerHelpDialog.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleProps.dtd                    (%chrome/inspector/viewers/accessibleProps.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleProps.properties             (%chrome/inspector/viewers/accessibleProps.properties)
+  locale/@AB_CD@/inspector/viewers/accessibleRelations.dtd                (%chrome/inspector/viewers/accessibleRelations.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleTree.dtd                     (%chrome/inspector/viewers/accessibleTree.dtd)
+  locale/@AB_CD@/inspector/viewers/accessibleTreeEvalJSDialog.dtd         (%chrome/inspector/viewers/accessibleTreeEvalJSDialog.dtd)
+  locale/@AB_CD@/inspector/viewers/dom.dtd                                (%chrome/inspector/viewers/dom.dtd)
+  locale/@AB_CD@/inspector/viewers/domNode.dtd                            (%chrome/inspector/viewers/domNode.dtd)
+  locale/@AB_CD@/inspector/viewers/styleRules.dtd                         (%chrome/inspector/viewers/styleRules.dtd)
+  locale/@AB_CD@/inspector/viewers/stylesheets.dtd                        (%chrome/inspector/viewers/stylesheets.dtd)
+  locale/@AB_CD@/inspector/viewers/xblBindings.dtd                        (%chrome/inspector/viewers/xblBindings.dtd)
+  locale/@AB_CD@/inspector/viewers/boxModel.dtd                           (%chrome/inspector/viewers/boxModel.dtd)
+  locale/@AB_CD@/inspector/viewers/computedStyle.dtd                      (%chrome/inspector/viewers/computedStyle.dtd)
+  locale/@AB_CD@/inspector/viewers/usedFontFaces.dtd                      (%chrome/inspector/viewers/usedFontFaces.dtd)
+  locale/@AB_CD@/inspector/viewers/jsObject.dtd                           (%chrome/inspector/viewers/jsObject.dtd)
+  locale/@AB_CD@/inspector/inspector.properties                           (%chrome/inspector/inspector.properties)
   locale/@AB_CD@/messenger/AccountManager.dtd                               (%chrome/mailnews/pref/AccountManager.dtd)
   locale/@AB_CD@/messenger/AccountWizard.dtd                                (%chrome/mailnews/pref/AccountWizard.dtd)
   locale/@AB_CD@/messenger/addressbook/abAddressBookNameDialog.dtd          (%chrome/mailnews/addressbook/abAddressBookNameDialog.dtd)
   locale/@AB_CD@/messenger/addressbook/abCardOverlay.dtd                    (%chrome/mailnews/addressbook/abCardOverlay.dtd)
   locale/@AB_CD@/messenger/addressbook/abMailListDialog.dtd                 (%chrome/mailnews/addressbook/abMailListDialog.dtd)
   locale/@AB_CD@/messenger/addressbook/abMainWindow.dtd                     (%chrome/mailnews/addressbook/abMainWindow.dtd)
   locale/@AB_CD@/messenger/addressbook/abNewCardDialog.dtd                  (%chrome/mailnews/addressbook/abNewCardDialog.dtd)
   locale/@AB_CD@/messenger/addressbook/abResultsPaneOverlay.dtd             (%chrome/mailnews/addressbook/abResultsPaneOverlay.dtd)
diff --git a/suite/moz.configure b/suite/moz.configure
--- a/suite/moz.configure
+++ b/suite/moz.configure
@@ -92,28 +92,16 @@ option('--enable-irc', default=False,
 
 @depends_if('--enable-irc')
 def irc(arg):
     return True
 
 set_config('MOZ_IRC', irc)
 
 # =========================================================
-# = DOM Inspector extension
-# =========================================================
-option('--enable-dominspector', default=False,
-       help='Enable building of the DOM Inspector extension')
-
-@depends_if('--enable-dominspector')
-def dominspector(arg):
-    return True
-
-set_config('MOZ_DOMINSPECTOR', dominspector)
-
-# =========================================================
 # = DebugQA extension
 # =========================================================
 option('--enable-debugqa', default=False,
        help='Enable building of the DebugQA extension')
 
 @depends_if('--enable-debugqa')
 def debugqa(arg):
     return True
diff --git a/suite/themes/classic/inspector/ImageSearchItem.png b/suite/themes/classic/inspector/ImageSearchItem.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d87f6e09f8254e01b57f0284e037ac3ddb4207b
GIT binary patch
diff --git a/suite/themes/classic/inspector/btnFind-dis.png b/suite/themes/classic/inspector/btnFind-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b15cbe74ef77e6ec75bbe6da0c6a17e070149ec
GIT binary patch
diff --git a/suite/themes/classic/inspector/btnFind.png b/suite/themes/classic/inspector/btnFind.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b3f8900e1fd7feca5023bc95d9cdede969ccbcf
GIT binary patch
diff --git a/suite/themes/classic/inspector/btnSelecting-act.png b/suite/themes/classic/inspector/btnSelecting-act.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d5b15a2b92541cbbfe4d2dcac504fc3be70e8a9
GIT binary patch
diff --git a/suite/themes/classic/inspector/btnSelecting-dis.png b/suite/themes/classic/inspector/btnSelecting-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea5a86de7a3ef8737dd0a7fb451ca87cb122d500
GIT binary patch
diff --git a/suite/themes/classic/inspector/btnSelecting.png b/suite/themes/classic/inspector/btnSelecting.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a07ebda104baea282a594a516841db801ca9bb5
GIT binary patch
diff --git a/suite/themes/classic/inspector/iconImportant.png b/suite/themes/classic/inspector/iconImportant.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8d483849448e986eff6fd9614f1abe163e97a57
GIT binary patch
diff --git a/suite/themes/classic/inspector/iconViewerList-dis.png b/suite/themes/classic/inspector/iconViewerList-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..df6c2f34b119504b517258b8a891d495ee0bbb92
GIT binary patch
diff --git a/suite/themes/classic/inspector/iconViewerList.png b/suite/themes/classic/inspector/iconViewerList.png
new file mode 100644
index 0000000000000000000000000000000000000000..b2958336fdc54e000cd4b7be34026d7c54964406
GIT binary patch
diff --git a/suite/themes/classic/inspector/inspector.css b/suite/themes/classic/inspector/inspector.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/inspector.css
@@ -0,0 +1,6 @@
+/* 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/. */
+
+@import url("chrome://global/skin");
+@import url("chrome://inspector/content/inspector.css");
diff --git a/suite/themes/classic/inspector/inspectorWindow.css b/suite/themes/classic/inspector/inspectorWindow.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/inspectorWindow.css
@@ -0,0 +1,45 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://navigator/skin");
+@import url("chrome://browser/skin");
+
+#bxURLBar {
+  padding: 2px;
+}
+
+#bxSearch {
+  height: 150px;
+}
+
+#splPanels {
+  width: 5px;
+}
+
+/* ::::: toolbar buttons ::::: */
+
+#btnSelecting {
+  list-style-image: url("chrome://inspector/skin/btnSelecting.png");
+}
+
+#btnSelecting[checked="true"] {
+  list-style-image: url("chrome://inspector/skin/btnSelecting-act.png");
+}
+
+#btnSelecting[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/btnSelecting-dis.png");
+}
+
+#btnFind {
+  list-style-image: url("chrome://inspector/skin/btnFind.png");
+}
+
+#btnFind[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/btnFind-dis.png");
+}
+
+.viewer-list, .viewer-menu {
+  -moz-user-focus: ignore;
+}
diff --git a/suite/themes/classic/inspector/panelset.css b/suite/themes/classic/inspector/panelset.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/panelset.css
@@ -0,0 +1,34 @@
+/* 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/. */
+
+panel[disabled="true"] > .viewer-pane-box-1 {
+  visibility: collapse;
+}
+
+.viewer-menu, .viewer-list {
+  -moz-user-focus: normal;
+}
+
+.viewer-list {
+  list-style-image: url("chrome://inspector/skin/iconViewerList.png");
+}
+
+.viewer-list[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/iconViewerList-dis.png");
+}
+
+.viewer-pane-toolbox {
+  border-right: none;
+}
+
+.viewer-pane-box-2 {
+  border-left: 1px solid ThreeDShadow;
+  border-right: 1px solid ThreeDShadow;
+}
+
+.viewer-pane-toolbox {
+  border-top: none;
+  border-bottom: none;
+}
+
diff --git a/suite/themes/classic/inspector/sidebar.css b/suite/themes/classic/inspector/sidebar.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/sidebar.css
@@ -0,0 +1,9 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+tabpanels {
+  padding: 0px;
+}
\ No newline at end of file
diff --git a/suite/themes/classic/inspector/titledSplitter.css b/suite/themes/classic/inspector/titledSplitter.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/titledSplitter.css
@@ -0,0 +1,53 @@
+/* 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/. */
+
+.titled-splitter {
+  border-top: 1px outset InactiveCaption;
+  border-bottom: 1px outset InactiveCaption;
+  background-color: InactiveCaption;
+  color: InactiveCaptionText;
+  cursor: default;
+}
+
+box[orient="vertical"] > .titled-splitter {
+  cursor: default;
+}
+
+.titledsplitter-container {
+  padding-bottom: 2px;
+}
+
+.titledsplitter-dragbar {
+  min-height: 2px;
+  cursor: n-resize !important;
+}
+
+.titledsplitter-titlebox {
+  padding: 0px 5px 0px 5px;
+}
+
+.titledsplitter-text {
+  margin: 0px !important;
+  font-weight: bold;
+}
+
+.titledsplitter-closebutton {
+  -moz-binding: none;
+  margin: 1px;
+  border: 1px outset ThreeDFace;
+  padding: 2px;
+  min-width: 0px;
+  background-color: ThreeDFace;
+}
+
+.titledsplitter-closeimage {
+  list-style-image: url("chrome://inspector/skin/titledsplitter-close.png");
+}
+
+.titledsplitter-closebutton:hover:active {
+  border-style: inset;
+  padding: 3px 1px 1px 3px;
+}
+
+
diff --git a/suite/themes/classic/inspector/titledsplitter-close.png b/suite/themes/classic/inspector/titledsplitter-close.png
new file mode 100644
index 0000000000000000000000000000000000000000..72cdd217411d13a258b2b9488e05de697c777dca
GIT binary patch
diff --git a/suite/themes/classic/inspector/viewers/accessibleEvent/accessibleEvent.css b/suite/themes/classic/inspector/viewers/accessibleEvent/accessibleEvent.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/accessibleEvent/accessibleEvent.css
@@ -0,0 +1,9 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css");
+
+#handlerOutput {
+  overflow: auto;
+}
diff --git a/suite/themes/classic/inspector/viewers/accessibleEvents/accessibleEvents.css b/suite/themes/classic/inspector/viewers/accessibleEvents/accessibleEvents.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/accessibleEvents/accessibleEvents.css
@@ -0,0 +1,21 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+treechildren::-moz-tree-checkbox(checked) {
+  list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
+}
+
+#welHandlerEditor {
+  font-family: monospace;
+}
+
+#welGrippyButton {
+  cursor: default;
+}
+
+#welSplitter {
+  -moz-appearance: none;
+}
diff --git a/suite/themes/classic/inspector/viewers/accessibleProps/accessibleProps.css b/suite/themes/classic/inspector/viewers/accessibleProps/accessibleProps.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/accessibleProps/accessibleProps.css
@@ -0,0 +1,22 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+.textAttrsTextRange {
+  border-bottom: medium dotted blue;
+  padding: 7px;
+  border-bottom-left-radius: 16px;
+  border-bottom-right-radius: 16px;
+  line-height: 250%;
+  margin: 2px;
+}
+
+.textAttrsTextRange:hover {
+  border-bottom: medium dotted red;
+}
+
+.textAttrsTextRange[selected] {
+  border-bottom: medium groove purple;
+}
diff --git a/suite/themes/classic/inspector/viewers/accessibleTree/accessibleTree.css b/suite/themes/classic/inspector/viewers/accessibleTree/accessibleTree.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/accessibleTree/accessibleTree.css
@@ -0,0 +1,22 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+treechildren::-moz-tree-row(highlight) {
+  background-color: #feeecd;
+}
+
+treechildren::-moz-tree-row(selected, highlight) {
+  background-color: #c0ffff;
+}
+
+treechildren::-moz-tree-cell-text(highlight) {
+  color: black;
+}
+
+treechildren::-moz-tree-cell-text(grayout) {
+  color: gray;
+  font-weight: bold;
+}
diff --git a/suite/themes/classic/inspector/viewers/boxModel/boxModel.css b/suite/themes/classic/inspector/viewers/boxModel/boxModel.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/boxModel/boxModel.css
@@ -0,0 +1,23 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+/* ::::: statistics ::::: */
+
+.nonzero {
+  font-weight: bold;
+}
+
+groupbox:not(#boxBorder) textbox {
+  text-align: right;
+}
+
+row {
+  -moz-box-align: baseline;
+}
+
+#enclosingBox {
+  overflow: auto;
+}
diff --git a/suite/themes/classic/inspector/viewers/dom/columnsDialog.css b/suite/themes/classic/inspector/viewers/dom/columnsDialog.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/dom/columnsDialog.css
@@ -0,0 +1,26 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+#trColumns {
+  background-color: ThreeDFace;
+}
+
+.column-selector {
+  border: 1px outset ThreeDFace;
+  padding: 2px;
+  background-color: ThreeDFace;
+  vertical-align: middle;
+}
+
+.attr-column-selector,
+.attr-column-selector[focused="true"] {
+  margin: 0;
+  border: none;
+}
+
+[col-dragging="true"] {
+  border: 1px solid ButtonText;
+}
diff --git a/suite/themes/classic/inspector/viewers/dom/dom.css b/suite/themes/classic/inspector/viewers/dom/dom.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/dom/dom.css
@@ -0,0 +1,58 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+/* :::::::: node type color coding :::::::: */
+
+treechildren::-moz-tree-cell-text(ACCESSIBLE_NODE) {
+  font-weight: bold;
+}
+
+treechildren::-moz-tree-cell-text(ELEMENT_NODE) {
+  color: #000000;
+}
+
+treechildren::-moz-tree-cell-text(ATTRIBUTE_NODE) {
+  color: #556b2f;
+}
+
+treechildren::-moz-tree-cell-text(CDATA_SECTION_NODE),
+treechildren::-moz-tree-cell-text(TEXT_NODE) {
+  color: #0000AA;
+}
+
+treechildren::-moz-tree-cell-text(COMMENT_NODE) {
+  color: #228b22;
+}
+
+treechildren::-moz-tree-cell-text(DOCUMENT_NODE) {
+  color: #800080;
+}
+
+treechildren::-moz-tree-cell-text(DOCUMENT_TYPE_NODE) {
+  color: #606000;
+}
+
+treechildren::-moz-tree-cell-text(PROCESSING_INSTRUCTION_NODE) {
+  color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(anonymous) {
+  color: #ff0000;
+}
+
+treechildren::-moz-tree-cell-text(selected, focus) {
+  color: #FFFFFF;
+}
+
+/* :::::::: drag and drop insertion indicators :::::::: */
+
+treechildren::-moz-tree-column(dnd-insert-before) {
+  border-left: 2px solid #000000;
+}
+
+treechildren::-moz-tree-column(dnd-insert-after) {
+  border-right: 2px solid #000000;
+}
diff --git a/suite/themes/classic/inspector/viewers/dom/findDialog.css b/suite/themes/classic/inspector/viewers/dom/findDialog.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/dom/findDialog.css
@@ -0,0 +1,5 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
diff --git a/suite/themes/classic/inspector/viewers/domNode/domNode.css b/suite/themes/classic/inspector/viewers/domNode/domNode.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/domNode/domNode.css
@@ -0,0 +1,13 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://inspector/content/extensions/treeEditable.css");
+
+.olNodeInfoLabel {
+  padding-right: 0.5em;
+}
+#olNodeInfo {
+  padding-bottom: 0.5em;
+}
diff --git a/suite/themes/classic/inspector/viewers/styleRules/styleRules.css b/suite/themes/classic/inspector/viewers/styleRules/styleRules.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/styleRules/styleRules.css
@@ -0,0 +1,21 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://inspector/content/extensions/treeEditable.css");
+
+#olcPropPriority {
+  list-style-image: url("chrome://inspector/skin/iconImportant.png");
+}
+
+#olbStyleProps::-moz-tree-image(olcPropPriority, important) {
+  list-style-image: url("chrome://inspector/skin/iconImportant.png");
+}
+
+/* ::::: default column widths ::::: */
+
+#olcLine {
+  width: 5em;
+}
+
diff --git a/suite/themes/classic/inspector/viewers/xblBindings/xblBindings.css b/suite/themes/classic/inspector/viewers/xblBindings/xblBindings.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/classic/inspector/viewers/xblBindings/xblBindings.css
@@ -0,0 +1,6 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin/");
+@import url("chrome://inspector/skin/viewers/dom/dom.css");
diff --git a/suite/themes/classic/jar.mn b/suite/themes/classic/jar.mn
--- a/suite/themes/classic/jar.mn
+++ b/suite/themes/classic/jar.mn
@@ -1,15 +1,16 @@
 # 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/.
 
 classic.jar:
 % skin communicator classic/1.0 %skin/classic/communicator/
 % skin editor classic/1.0 %skin/classic/editor/
+% skin inspector classic/1.0 %skin/classic/inspector/
 % skin messenger classic/1.0 %skin/classic/messenger/
 % skin navigator classic/1.0 %skin/classic/navigator/
 % skin messenger-newsblog classic/1.0 %skin/classic/messenger-newsblog/
 % style chrome://global/content/customizeToolbar.xul chrome://navigator/skin/navigator.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/primaryToolbar.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/messengercompose/messengercompose.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/smime/msgCompSMIMEOverlay.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/addressbook/addressbook.css
@@ -230,16 +231,42 @@ classic.jar:
   skin/classic/editor/icons/img-align-middle.png                        (editor/icons/img-align-middle.png)
   skin/classic/editor/icons/img-align-right.png                         (editor/icons/img-align-right.png)
   skin/classic/editor/icons/img-align-top.png                           (editor/icons/img-align-top.png)
   skin/classic/editor/icons/btn2.png                                    (editor/icons/btn2.png)
   skin/classic/editor/icons/multicolor.png                              (editor/icons/multicolor.png)
   skin/classic/editor/icons/progress-busy.png                           (editor/icons/progress-busy.png)
   skin/classic/editor/icons/progress-done.png                           (editor/icons/progress-done.png)
   skin/classic/editor/icons/progress-failed.png                         (editor/icons/progress-failed.png)
+  skin/classic/inspector/btnFind.png                                    (inspector/btnFind.png)
+  skin/classic/inspector/btnFind-dis.png                                (inspector/btnFind-dis.png)
+  skin/classic/inspector/btnSelecting.png                               (inspector/btnSelecting.png)
+  skin/classic/inspector/btnSelecting-act.png                           (inspector/btnSelecting-act.png)
+  skin/classic/inspector/btnSelecting-dis.png                           (inspector/btnSelecting-dis.png)
+  skin/classic/inspector/ImageSearchItem.png                            (inspector/ImageSearchItem.png)
+  skin/classic/inspector/iconImportant.png                              (inspector/iconImportant.png)
+  skin/classic/inspector/iconViewerList.png                             (inspector/iconViewerList.png)
+  skin/classic/inspector/inspector.css                                  (inspector/inspector.css)
+  skin/classic/inspector/inspectorWindow.css                            (inspector/inspectorWindow.css)
+  skin/classic/inspector/titledSplitter.css                             (inspector/titledSplitter.css)
+  skin/classic/inspector/titledsplitter-close.png                       (inspector/titledsplitter-close.png)
+  skin/classic/inspector/panelset.css                                   (inspector/panelset.css)
+  skin/classic/inspector/sidebar.css                                    (inspector/sidebar.css)
+  skin/classic/inspector/iconViewerList-dis.png                         (inspector/iconViewerList-dis.png)
+  skin/classic/inspector/viewers/accessibleEvent/accessibleEvent.css    (inspector/viewers/accessibleEvent/accessibleEvent.css)
+  skin/classic/inspector/viewers/accessibleEvents/accessibleEvents.css  (inspector/viewers/accessibleEvents/accessibleEvents.css)
+  skin/classic/inspector/viewers/accessibleProps/accessibleProps.css    (inspector/viewers/accessibleProps/accessibleProps.css)
+  skin/classic/inspector/viewers/accessibleTree/accessibleTree.css      (inspector/viewers/accessibleTree/accessibleTree.css)
+  skin/classic/inspector/viewers/boxModel/boxModel.css                  (inspector/viewers/boxModel/boxModel.css)
+  skin/classic/inspector/viewers/dom/columnsDialog.css                  (inspector/viewers/dom/columnsDialog.css)
+  skin/classic/inspector/viewers/dom/dom.css                            (inspector/viewers/dom/dom.css)
+  skin/classic/inspector/viewers/dom/findDialog.css                     (inspector/viewers/dom/findDialog.css)
+  skin/classic/inspector/viewers/domNode/domNode.css                    (inspector/viewers/domNode/domNode.css)
+  skin/classic/inspector/viewers/styleRules/styleRules.css              (inspector/viewers/styleRules/styleRules.css)
+  skin/classic/inspector/viewers/xblBindings/xblBindings.css            (inspector/viewers/xblBindings/xblBindings.css)
 #ifdef XP_MACOSX
   skin/classic/messenger/accountManage.css                              (mac/messenger/accountManage.css)
   skin/classic/messenger/browserRequest.css                             (mac/messenger/browserRequest.css)
   skin/classic/messenger/filterDialog.css                               (mac/messenger/filterDialog.css)
   skin/classic/messenger/mailWindow1.css                                (mac/messenger/mailWindow1.css)
   skin/classic/messenger/messageHeader.css                              (mac/messenger/messageHeader.css)
   skin/classic/messenger/messageQuotes.css                              (mac/messenger/messageQuotes.css)
   skin/classic/messenger/primaryToolbar.css                             (mac/messenger/primaryToolbar.css)
diff --git a/suite/themes/modern/inspector/ImageSearchItem.png b/suite/themes/modern/inspector/ImageSearchItem.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d87f6e09f8254e01b57f0284e037ac3ddb4207b
GIT binary patch
diff --git a/suite/themes/modern/inspector/btnFind-dis.png b/suite/themes/modern/inspector/btnFind-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b15cbe74ef77e6ec75bbe6da0c6a17e070149ec
GIT binary patch
diff --git a/suite/themes/modern/inspector/btnFind.png b/suite/themes/modern/inspector/btnFind.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b3f8900e1fd7feca5023bc95d9cdede969ccbcf
GIT binary patch
diff --git a/suite/themes/modern/inspector/btnSelecting-act.png b/suite/themes/modern/inspector/btnSelecting-act.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d5b15a2b92541cbbfe4d2dcac504fc3be70e8a9
GIT binary patch
diff --git a/suite/themes/modern/inspector/btnSelecting-dis.png b/suite/themes/modern/inspector/btnSelecting-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea5a86de7a3ef8737dd0a7fb451ca87cb122d500
GIT binary patch
diff --git a/suite/themes/modern/inspector/btnSelecting.png b/suite/themes/modern/inspector/btnSelecting.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a07ebda104baea282a594a516841db801ca9bb5
GIT binary patch
diff --git a/suite/themes/modern/inspector/iconImportant.png b/suite/themes/modern/inspector/iconImportant.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8d483849448e986eff6fd9614f1abe163e97a57
GIT binary patch
diff --git a/suite/themes/modern/inspector/iconViewerList-dis.png b/suite/themes/modern/inspector/iconViewerList-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..43b0b62863e83493dd84e8441fd28ec64cf13fd7
GIT binary patch
diff --git a/suite/themes/modern/inspector/iconViewerList.png b/suite/themes/modern/inspector/iconViewerList.png
new file mode 100644
index 0000000000000000000000000000000000000000..8033b4bc738e47b1d92714dd977436553990f6cf
GIT binary patch
diff --git a/suite/themes/modern/inspector/iconViewerMenu-dis.png b/suite/themes/modern/inspector/iconViewerMenu-dis.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cd257e9de269bfb3d35e02d4e10d04511398d82
GIT binary patch
diff --git a/suite/themes/modern/inspector/iconViewerMenu.png b/suite/themes/modern/inspector/iconViewerMenu.png
new file mode 100644
index 0000000000000000000000000000000000000000..0fceed0b235bdd7dcccfd91827867233c05c3862
GIT binary patch
diff --git a/suite/themes/modern/inspector/inspector.css b/suite/themes/modern/inspector/inspector.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/inspector.css
@@ -0,0 +1,6 @@
+/* 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/. */
+
+@import url("chrome://global/skin");
+@import url("chrome://inspector/content/inspector.css");
diff --git a/suite/themes/modern/inspector/inspectorWindow.css b/suite/themes/modern/inspector/inspectorWindow.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/inspectorWindow.css
@@ -0,0 +1,45 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://navigator/skin");
+@import url("chrome://browser/skin");
+
+#tbxInsToolbox {
+  border-bottom: none;
+}
+
+#bxURLBar {
+  padding: 2px;
+}
+
+#bxSearch {
+  height: 150px;
+}
+
+/* ::::: toolbar buttons ::::: */
+
+#btnSelecting {
+  list-style-image: url("chrome://inspector/skin/btnSelecting.png");
+}
+
+#btnSelecting[checked="true"] {
+  list-style-image: url("chrome://inspector/skin/btnSelecting-act.png");
+}
+
+#btnSelecting[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/btnSelecting-dis.png");
+}
+
+#btnFind {
+  list-style-image: url("chrome://inspector/skin/btnFind.png");
+}
+
+#btnFind[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/btnFind-dis.png");
+}
+
+.viewer-list, .viewer-menu {
+  -moz-user-focus: ignore;
+}
diff --git a/suite/themes/modern/inspector/panelset.css b/suite/themes/modern/inspector/panelset.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/panelset.css
@@ -0,0 +1,37 @@
+/* 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/. */
+
+domi-panel[disabled="true"] > .viewer-pane-box-1 {
+  visibility: collapse;
+}
+
+.viewer-menu, .viewer-list {
+  -moz-user-focus: normal;
+}
+
+.viewer-list {
+  list-style-image: url("chrome://inspector/skin/iconViewerList.png");
+}
+
+.viewer-list[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/iconViewerList-dis.png");
+}
+
+.viewer-menu {
+  list-style-image: url("chrome://inspector/skin/iconViewerMenu.png");
+}
+
+.viewer-menu[disabled="true"] {
+  list-style-image: url("chrome://inspector/skin/iconViewerMenu-dis.png");
+}
+
+.viewer-menu > .toolbarbutton-menu-dropmarker {
+  display: none;   
+}
+
+.viewer-pane-toolbox {
+  border-top: none;
+  border-bottom: none;
+}
+
diff --git a/suite/themes/modern/inspector/sidebar.css b/suite/themes/modern/inspector/sidebar.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/sidebar.css
@@ -0,0 +1,9 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+tabpanels {
+  padding: 0px;
+}
\ No newline at end of file
diff --git a/suite/themes/modern/inspector/titledSplitter.css b/suite/themes/modern/inspector/titledSplitter.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/titledSplitter.css
@@ -0,0 +1,54 @@
+/* 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/. */
+
+.titled-splitter {
+  border: 1px solid #000000;
+  background-color: #5B7693;
+  cursor: default;
+}
+
+box[orient="vertical"] > .titled-splitter {
+  cursor: default;
+}
+
+.titledsplitter-container {
+  padding-bottom: 2px;
+}
+
+.titledsplitter-dragbar {
+  border-top: 1px solid #92ABC9;
+  min-height: 2px;
+  cursor: n-resize;
+}
+
+.titledsplitter-titlebox {
+  padding: 0px 5px 0px 5px;
+}
+
+.titledsplitter-text {
+  margin: 0px !important;
+  font-weight: bold;
+  color: #ffffff;
+}
+
+.titledsplitter-closebutton {
+  -moz-binding: none;
+  margin: 1px;
+  border: 1px outset #C7D0D9;
+  -moz-border-radius: 0px !important;
+  padding: 2px;
+  min-width: 0px;
+  background-color: #C7D0D9;
+}
+
+.titledsplitter-closeimage {
+  list-style-image: url("chrome://inspector/skin/titledsplitter-close.png");
+}
+
+.titledsplitter-closebutton:hover:active {
+  border-style: inset;
+  padding: 3px 1px 1px 3px;
+}
+
+
diff --git a/suite/themes/modern/inspector/titledsplitter-close.gif b/suite/themes/modern/inspector/titledsplitter-close.gif
new file mode 100644
index 0000000000000000000000000000000000000000..a53eddd05915e614f8da16fef143b90bed243de7
GIT binary patch
diff --git a/suite/themes/modern/inspector/titledsplitter-close.png b/suite/themes/modern/inspector/titledsplitter-close.png
new file mode 100644
index 0000000000000000000000000000000000000000..72cdd217411d13a258b2b9488e05de697c777dca
GIT binary patch
diff --git a/suite/themes/modern/inspector/viewers/accessibleEvent/accessibleEvent.css b/suite/themes/modern/inspector/viewers/accessibleEvent/accessibleEvent.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/accessibleEvent/accessibleEvent.css
@@ -0,0 +1,5 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin/viewers/accessibleTree/accessibleTree.css");
diff --git a/suite/themes/modern/inspector/viewers/accessibleEvents/accessibleEvents.css b/suite/themes/modern/inspector/viewers/accessibleEvents/accessibleEvents.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/accessibleEvents/accessibleEvents.css
@@ -0,0 +1,21 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+treechildren::-moz-tree-checkbox {
+  list-style-image: url("chrome://global/skin/checkbox/cbox.gif");
+}
+
+treechildren::-moz-tree-checkbox(checked) {
+  list-style-image: url("chrome://global/skin/checkbox/cbox-check.gif");
+}
+
+#welHandlerEditor {
+  font-family: monospace;
+}
+
+#welGrippyButton {
+  cursor: default;
+}
diff --git a/suite/themes/modern/inspector/viewers/accessibleProps/accessibleProps.css b/suite/themes/modern/inspector/viewers/accessibleProps/accessibleProps.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/accessibleProps/accessibleProps.css
@@ -0,0 +1,22 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+.textAttrsTextRange {
+  border-bottom: medium dotted blue;
+  padding: 7px;
+  border-bottom-left-radius: 16px;
+  border-bottom-right-radius: 16px;
+  line-height: 250%;
+  margin: 2px;
+}
+
+.textAttrsTextRange:hover {
+  border-bottom: medium dotted red;
+}
+
+.textAttrsTextRange[selected] {
+  border-bottom: medium groove purple;
+}
diff --git a/suite/themes/modern/inspector/viewers/accessibleTree/accessibleTree.css b/suite/themes/modern/inspector/viewers/accessibleTree/accessibleTree.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/accessibleTree/accessibleTree.css
@@ -0,0 +1,22 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+treechildren::-moz-tree-row(highlight) {
+  background-color: #feeecd;
+}
+
+treechildren::-moz-tree-row(selected, highlight) {
+  background-color: #c0ffff;
+}
+
+treechildren::-moz-tree-cell-text(highlight) {
+  color: black;
+}
+
+treechildren::-moz-tree-cell-text(grayout) {
+  color: gray;
+  font-weight: bold;
+}
diff --git a/suite/themes/modern/inspector/viewers/boxModel/boxModel.css b/suite/themes/modern/inspector/viewers/boxModel/boxModel.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/boxModel/boxModel.css
@@ -0,0 +1,23 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+/* ::::: statistics ::::: */
+
+.nonzero {
+  font-weight: bold;
+}
+
+groupbox:not(#boxBorder) textbox {
+  text-align: right;
+}
+
+row {
+  -moz-box-align: baseline;
+}
+
+#enclosingBox {
+  overflow: auto;
+}
diff --git a/suite/themes/modern/inspector/viewers/dom/columnsDialog.css b/suite/themes/modern/inspector/viewers/dom/columnsDialog.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/dom/columnsDialog.css
@@ -0,0 +1,26 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+#trColumns {
+  background-color: #C7D0D9;
+}
+
+.column-selector {
+  border: 1px outset #C7D0D9;
+  padding: 2px;
+  background-color: #C7D0D9;
+  vertical-align: middle;
+}
+
+.attr-column-selector,
+.attr-column-selector[focused="true"] {
+  margin: 0;
+  border: none;
+}
+
+[col-dragging="true"] {
+  border: 1px solid black;
+}
diff --git a/suite/themes/modern/inspector/viewers/dom/dom.css b/suite/themes/modern/inspector/viewers/dom/dom.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/dom/dom.css
@@ -0,0 +1,59 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+
+/* :::::::: node type color coding :::::::: */
+
+treechildren::-moz-tree-cell-text(ACCESSIBLE_NODE) {
+  font-weight: bold;
+}
+
+treechildren::-moz-tree-cell-text(ELEMENT_NODE) {
+  color: #000000;
+}
+
+treechildren::-moz-tree-cell-text(ATTRIBUTE_NODE) {
+  color: #556b2f;
+}
+
+treechildren::-moz-tree-cell-text(CDATA_SECTION_NODE),
+treechildren::-moz-tree-cell-text(TEXT_NODE) {
+  color: #0000AA;
+}
+
+treechildren::-moz-tree-cell-text(COMMENT_NODE) {
+  color: #228b22;
+}
+
+treechildren::-moz-tree-cell-text(DOCUMENT_NODE) {
+  color: #800080;
+}
+
+treechildren::-moz-tree-cell-text(DOCUMENT_TYPE_NODE) {
+  color: #606000;
+}
+
+treechildren::-moz-tree-cell-text(PROCESSING_INSTRUCTION_NODE) {
+  color: #808080;
+}
+
+treechildren::-moz-tree-cell-text(anonymous) {
+  color: #ff0000;
+}
+
+treechildren::-moz-tree-cell-text(selected, focus) {
+  color: #FFFFFF;
+}
+
+/* :::::::: drag and drop insertion indicators :::::::: */
+
+treechildren::-moz-tree-column(dnd-insert-before) {
+  border-left: 2px solid #000000;
+}
+
+treechildren::-moz-tree-column(dnd-insert-after) {
+  border-right: 2px solid #000000;
+}
+
diff --git a/suite/themes/modern/inspector/viewers/dom/findDialog.css b/suite/themes/modern/inspector/viewers/dom/findDialog.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/dom/findDialog.css
@@ -0,0 +1,5 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
diff --git a/suite/themes/modern/inspector/viewers/domNode/domNode.css b/suite/themes/modern/inspector/viewers/domNode/domNode.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/domNode/domNode.css
@@ -0,0 +1,13 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://inspector/content/extensions/treeEditable.css");
+
+.olNodeInfoLabel {
+  padding-right: 0.5em;
+}
+#olNodeInfo {
+  padding-bottom: 0.5em;
+}
diff --git a/suite/themes/modern/inspector/viewers/styleRules/styleRules.css b/suite/themes/modern/inspector/viewers/styleRules/styleRules.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/styleRules/styleRules.css
@@ -0,0 +1,21 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://inspector/content/extensions/treeEditable.css");
+
+#olcPropPriority {
+  list-style-image: url("chrome://inspector/skin/iconImportant.png");
+}
+
+#olbStyleProps::-moz-tree-image(olcPropPriority, important) {
+  list-style-image: url("chrome://inspector/skin/iconImportant.png");
+}
+
+/* ::::: default column widths ::::: */
+
+#olcLine {
+  width: 5em;
+}
+
diff --git a/suite/themes/modern/inspector/viewers/xblBindings/xblBindings.css b/suite/themes/modern/inspector/viewers/xblBindings/xblBindings.css
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/inspector/viewers/xblBindings/xblBindings.css
@@ -0,0 +1,6 @@
+/* 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/. */
+
+@import url("chrome://inspector/skin");
+@import url("chrome://inspector/skin/viewers/dom/dom.css");
diff --git a/suite/themes/modern/jar.mn b/suite/themes/modern/jar.mn
--- a/suite/themes/modern/jar.mn
+++ b/suite/themes/modern/jar.mn
@@ -5,16 +5,17 @@
 modern.jar:
 % override chrome://mozapps/skin/places/defaultFavicon.svg chrome://communicator/skin/places/bookmark-item.svg
 % skin communicator modern/1.0 %skin/modern/communicator/
 % skin editor modern/1.0 %skin/modern/editor/
 % skin global modern/1.0 %skin/modern/global/
 % skin global-platform modern/1.0 %skin/modern/global/gtk/
 % skin global-platform modern/1.0 %skin/modern/global/mac/ os=Darwin
 % skin global-platform modern/1.0 %skin/modern/global/win/ os=WINNT
+% skin inspector modern/1.0 %skin/modern/inspector/
 % skin messenger modern/1.0 %skin/modern/messenger/
 % skin mozapps modern/1.0 %skin/modern/mozapps/
 % skin navigator modern/1.0 %skin/modern/navigator/
 % skin messenger-newsblog modern/1.0 %skin/modern/messenger-newsblog/
 % style chrome://global/content/customizeToolbar.xul chrome://navigator/skin/navigator.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/primaryToolbar.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/messengercompose/messengercompose.css
 % style chrome://global/content/customizeToolbar.xul chrome://messenger/skin/smime/msgCompSMIMEOverlay.css
@@ -382,16 +383,44 @@ modern.jar:
   skin/modern/global/mac/tree/sort-dsc.png                         (global/tree/sort-asc.png)
   skin/modern/global/gtk/tree/sort-asc.png                         (global/tree/sort-asc.png)
   skin/modern/global/gtk/tree/sort-dsc.png                         (global/tree/sort-dsc.png)
   skin/modern/global/win/tree/sort-asc.png                         (global/tree/sort-dsc.png)
   skin/modern/global/win/tree/sort-dsc.png                         (global/tree/sort-asc.png)
   skin/modern/global/tree/twisty-clsd.png                          (global/tree/twisty-clsd.png)
   skin/modern/global/tree/twisty-open.png                          (global/tree/twisty-open.png)
   skin/modern/global/tree/columnpicker.png                         (global/tree/columnpicker.png)
+  skin/modern/inspector/btnFind.png                                     (inspector/btnFind.png)
+  skin/modern/inspector/btnFind-dis.png                                 (inspector/btnFind-dis.png)
+  skin/modern/inspector/btnSelecting.png                                (inspector/btnSelecting.png)
+  skin/modern/inspector/btnSelecting-act.png                            (inspector/btnSelecting-act.png)
+  skin/modern/inspector/btnSelecting-dis.png                            (inspector/btnSelecting-dis.png)
+  skin/modern/inspector/ImageSearchItem.png                             (inspector/ImageSearchItem.png)
+  skin/modern/inspector/iconImportant.png                               (inspector/iconImportant.png)
+  skin/modern/inspector/iconViewerMenu-dis.png                          (inspector/iconViewerMenu-dis.png)
+  skin/modern/inspector/inspector.css                                   (inspector/inspector.css)
+  skin/modern/inspector/inspectorWindow.css                             (inspector/inspectorWindow.css)
+  skin/modern/inspector/titledSplitter.css                              (inspector/titledSplitter.css)
+  skin/modern/inspector/titledsplitter-close.png                        (inspector/titledsplitter-close.png)
+  skin/modern/inspector/panelset.css                                    (inspector/panelset.css)
+  skin/modern/inspector/sidebar.css                                     (inspector/sidebar.css)
+  skin/modern/inspector/iconViewerMenu.png                              (inspector/iconViewerMenu.png)
+  skin/modern/inspector/iconViewerList.png                              (inspector/iconViewerList.png)
+  skin/modern/inspector/iconViewerList-dis.png                          (inspector/iconViewerList-dis.png)
+  skin/modern/inspector/viewers/accessibleEvent/accessibleEvent.css     (inspector/viewers/accessibleEvent/accessibleEvent.css)
+  skin/modern/inspector/viewers/accessibleEvents/accessibleEvents.css   (inspector/viewers/accessibleEvents/accessibleEvents.css)
+  skin/modern/inspector/viewers/accessibleProps/accessibleProps.css     (inspector/viewers/accessibleProps/accessibleProps.css)
+  skin/modern/inspector/viewers/accessibleTree/accessibleTree.css       (inspector/viewers/accessibleTree/accessibleTree.css)
+  skin/modern/inspector/viewers/boxModel/boxModel.css                   (inspector/viewers/boxModel/boxModel.css)
+  skin/modern/inspector/viewers/dom/columnsDialog.css                   (inspector/viewers/dom/columnsDialog.css)
+  skin/modern/inspector/viewers/dom/dom.css                             (inspector/viewers/dom/dom.css)
+  skin/modern/inspector/viewers/dom/findDialog.css                      (inspector/viewers/dom/findDialog.css)
+  skin/modern/inspector/viewers/domNode/domNode.css                     (inspector/viewers/domNode/domNode.css)
+  skin/modern/inspector/viewers/styleRules/styleRules.css               (inspector/viewers/styleRules/styleRules.css)
+  skin/modern/inspector/viewers/xblBindings/xblBindings.css             (inspector/viewers/xblBindings/xblBindings.css)
   skin/modern/messenger/threadPaneLabels.css                       (messenger/threadPaneLabels.css)
   skin/modern/messenger/accountCentral.css                         (messenger/accountCentral.css)
   skin/modern/messenger/accountManage.css                          (messenger/accountManage.css)
   skin/modern/messenger/accountWizard.css                          (messenger/accountWizard.css)
   skin/modern/messenger/addressingWidget.css                       (messenger/addressingWidget.css)
   skin/modern/messenger/browserRequest.css                         (messenger/browserRequest.css)
   skin/modern/messenger/dialogs.css                                (messenger/dialogs.css)
   skin/modern/messenger/filterDialog.css                           (messenger/filterDialog.css)
