updates
authorDave Camp <dcamp@mozilla.com>
Wed, 17 Jul 2013 08:44:46 -0700
changeset 14 d8075e02936f0f83b20c47a5399f97624f4a6813
parent 13 d178fa3c570108d79814471bb17c5f5e2a3bed57
child 15 707fea7a45e804f73efbc0afe60a85be356b71bf
push id15
push userdcamp@campd.org
push dateWed, 17 Jul 2013 15:44:57 +0000
updates
android-browser.diff
copy-html.diff
delete-nodes.diff
inspector-delete-node.diff
inspector-panel-default-node.diff
inspector-remote-delete-node.diff
remote-edit-attributes.diff
remote-edit-value.diff
remote-markup.diff
search-box-remote.diff
series
style-actor.diff
warning-fixes.diff
window-targets.diff
--- a/android-browser.diff
+++ b/android-browser.diff
@@ -1,20 +1,20 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1372178155 25200
 #      Tue Jun 25 09:35:55 2013 -0700
-# Node ID 42bd9e0aa209aa6a36fe343fe7e20efaf286c730
-# Parent  ca1a3b610988fcf9d867dcc0bc6a8f020a2be000
-imported patch android-crap.diff
+# Node ID 948bcf0c688a226117e9b94ac61bd95336f1ec95
+# Parent  d3a25c9a42f47a6d070afc2e15d3e494ad792197
+Bug 888492 - Use the tab actor's _browser rather than _tabbrowser for load notifications. r=jwalker
 
 diff --git a/toolkit/devtools/server/actors/inspector.js b/toolkit/devtools/server/actors/inspector.js
 --- a/toolkit/devtools/server/actors/inspector.js
 +++ b/toolkit/devtools/server/actors/inspector.js
-@@ -2006,17 +2006,17 @@ var InspectorActor = protocol.ActorClass
+@@ -1984,17 +1984,17 @@ var InspectorActor = protocol.ActorClass
    getWalker: method(function(options={}) {
      let deferred = promise.defer();
  
      let window = this.window;
  
      var domReady = () => {
        let tabActor = this.tabActor;
        window.removeEventListener("DOMContentLoaded", domReady, true);
--- a/copy-html.diff
+++ b/copy-html.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477175 25200
 #      Mon Jun 17 06:52:55 2013 -0700
-# Node ID 532e9ff4a7f442cda71c5ecca75a9868a245857e
-# Parent 4ffe34db39e7f507d4642b3136d1ce722b2f823d
+# Node ID c7c02144a5f57bba0435dca17b98b653b1427d52
+# Parent  71b348a1ba083f8d9febd362b6b6af4b0f2559f2
 imported patch copy-html.diff
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
 @@ -630,34 +630,38 @@ InspectorPanel.prototype = {
    /**
     * Copy the innerHTML of the selected Node to the clipboard.
new file mode 100644
--- /dev/null
+++ b/delete-nodes.diff
@@ -0,0 +1,297 @@
+# HG changeset patch
+# User Dave Camp <dcamp@mozilla.com>
+# Date 1371477173 25200
+#      Mon Jun 17 06:52:53 2013 -0700
+# Node ID 9876c67d28d20a69cf5397424979f8e8bec33013
+# Parent 60e5fd5a379caaf2cb6dd42e701cc98a78797ded
+Bug 888528 - Add node deletion/insertion to the walker actor. r=jwalker
+
+diff --git a/toolkit/devtools/server/actors/inspector.js b/toolkit/devtools/server/actors/inspector.js
+--- a/toolkit/devtools/server/actors/inspector.js
++++ b/toolkit/devtools/server/actors/inspector.js
+@@ -1377,16 +1377,56 @@ var WalkerActor = protocol.ActorClass({
+       node: Arg(0, "domnode")
+     },
+     response: {
+       value: RetVal("longstring")
+     }
+   }),
+ 
+   /**
++   * Removes a node from its parent node.
++   *
++   * @returns The node's nextSibling before it was removed.
++   */
++  removeNode: method(function(node) {
++    if ((node.rawNode.ownerDocument &&
++         node.rawNode.ownerDocument.documentElement === this.rawNode) ||
++         node.rawNode.nodeType === Ci.nsIDOMNode.DOCUMENT_NODE) {
++      throw Error("Cannot remove document or document elements.");
++    }
++    let nextSibling = this.nextSibling(node);
++    if (node.rawNode.parentNode) {
++      node.rawNode.parentNode.removeChild(node.rawNode);
++      // Mutation events will take care of the rest.
++    }
++    return nextSibling;
++  }, {
++    request: {
++      node: Arg(0, "domnode")
++    },
++    response: {
++      nextSibling: RetVal("domnode", { optional: true })
++    }
++  }),
++
++  /**
++   * Insert a node into the DOM.
++   */
++  insertBefore: method(function(node, parent, sibling) {
++    parent.rawNode.insertBefore(node.rawNode, sibling ? sibling.rawNode : null);
++  }, {
++    request: {
++      node: Arg(0, "domnode"),
++      parent: Arg(1, "domnode"),
++      sibling: Arg(2, "domnode", { optional: true })
++    },
++    response: {}
++  }),
++
++  /**
+    * Get any pending mutation records.  Must be called by the client after
+    * the `new-mutations` notification is received.  Returns an array of
+    * mutation records.
+    *
+    * Mutation records have a basic structure:
+    *
+    * {
+    *   type: attributes|characterData|childList,
+diff --git a/toolkit/devtools/server/tests/mochitest/Makefile.in b/toolkit/devtools/server/tests/mochitest/Makefile.in
+--- a/toolkit/devtools/server/tests/mochitest/Makefile.in
++++ b/toolkit/devtools/server/tests/mochitest/Makefile.in
+@@ -11,21 +11,23 @@ relativesrcdir	= @relativesrcdir@
+ 
+ include $(DEPTH)/config/autoconf.mk
+ 
+ MOCHITEST_CHROME_FILES	= \
+ 	inspector-helpers.js \
+ 	inspector-traversal-data.html \
+ 	test_inspector-changeattrs.html \
+ 	test_inspector-changevalue.html \
++	test_inspector-insert.html \
+ 	test_inspector-mutations-attr.html \
+ 	test_inspector-mutations-childlist.html \
+ 	test_inspector-mutations-frameload.html \
+ 	test_inspector-mutations-value.html \
+ 	test_inspector-release.html \
++	test_inspector-remove.html \
+ 	test_inspector-retain.html \
+ 	test_inspector-pseudoclass-lock.html \
+ 	test_inspector-traversal.html \
+ 	test_unsafeDereference.html \
+ 	nonchrome_unsafeDereference.html \
+ 	$(NULL)
+ 
+ include $(topsrcdir)/config/rules.mk
+diff --git a/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html b/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html
+new file mode 100644
+--- /dev/null
++++ b/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html
+@@ -0,0 +1,96 @@
++<!DOCTYPE HTML>
++<html>
++<!--
++https://bugzilla.mozilla.org/show_bug.cgi?id=
++-->
++<head>
++  <meta charset="utf-8">
++  <title>Test for Bug </title>
++
++  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
++  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
++  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
++  <script type="application/javascript;version=1.8">
++Components.utils.import("resource://gre/modules/devtools/Loader.jsm");
++
++const promise = devtools.require("sdk/core/promise");
++const inspector = devtools.require("devtools/server/actors/inspector");
++
++window.onload = function() {
++  SimpleTest.waitForExplicitFinish();
++  runNextTest();
++}
++
++var gWalker = null;
++var gClient = null;
++
++function assertOwnership() {
++  return assertOwnershipTrees(gWalker);
++}
++
++addTest(function setup() {
++  let url = document.getElementById("inspectorContent").href;
++  attachURL(url, function(err, client, tab, doc) {
++    gInspectee = doc;
++    let {InspectorFront} = devtools.require("devtools/server/actors/inspector");
++    let inspector = InspectorFront(client, tab);
++    promiseDone(inspector.getWalker().then(walker => {
++      ok(walker, "getWalker() should return an actor.");
++      gClient = client;
++      gWalker = walker;
++    }).then(runNextTest));
++  });
++});
++
++addTest(function testRearrange() {
++  let longlist = null;
++  let nodeA = null;
++  let nextNode = null;
++
++  promiseDone(gWalker.querySelector(gWalker.rootNode, "#longlist").then(listFront => {
++    longlist = listFront;
++  }).then(() => {
++    return gWalker.children(longlist);
++  }).then(response => {
++    nodeA = response.nodes[0];
++    is(nodeA.id, "a", "Got the expected node.");
++    // Move nodeA to the end of the list.
++    return gWalker.insertBefore(nodeA, longlist, null);
++  }).then(() => {
++    ok(!gInspectee.querySelector("#a").nextSibling, "a should now be at the end of the list.");
++    return gWalker.children(longlist);
++  }).then(response => {
++    is(nodeA, response.nodes[response.nodes.length - 1], "a should now be the last returned child.");
++    // Now move it to the middle of the list.
++    nextNode = response.nodes[13];
++    return gWalker.insertBefore(nodeA, longlist, nextNode);
++  }).then(response => {
++    let sibling = inspector._documentWalker(gInspectee.querySelector("#a")).nextSibling();
++    is(sibling, nextNode.rawNode(), "Node should match the expected next node.");
++    return gWalker.children(longlist);
++  }).then(response => {
++    is(nodeA, response.nodes[13], "a should be where we expect it.");
++    is(nextNode, response.nodes[14], "next node should be where we expect it.");
++  }).then(runNextTest));
++});
++
++addTest(function cleanup() {
++  delete gWalker;
++  delete gClient;
++  runNextTest();
++});
++
++
++  </script>
++</head>
++<body>
++<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
++<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
++<p id="display"></p>
++<div id="content" style="display: none">
++
++</div>
++<pre id="test">
++</pre>
++</body>
++</html>
+diff --git a/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html b/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html
+new file mode 100644
+--- /dev/null
++++ b/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html
+@@ -0,0 +1,96 @@
++<!DOCTYPE HTML>
++<html>
++<!--
++https://bugzilla.mozilla.org/show_bug.cgi?id=
++-->
++<head>
++  <meta charset="utf-8">
++  <title>Test for Bug </title>
++
++  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
++  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
++  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
++  <script type="application/javascript;version=1.8">
++Components.utils.import("resource://gre/modules/devtools/Loader.jsm");
++
++const promise = devtools.require("sdk/core/promise");
++const inspector = devtools.require("devtools/server/actors/inspector");
++
++window.onload = function() {
++  SimpleTest.waitForExplicitFinish();
++  runNextTest();
++}
++
++var gWalker = null;
++var gClient = null;
++
++function assertOwnership() {
++  return assertOwnershipTrees(gWalker);
++}
++
++addTest(function setup() {
++  let url = document.getElementById("inspectorContent").href;
++  attachURL(url, function(err, client, tab, doc) {
++    gInspectee = doc;
++    let {InspectorFront} = devtools.require("devtools/server/actors/inspector");
++    let inspector = InspectorFront(client, tab);
++    promiseDone(inspector.getWalker().then(walker => {
++      ok(walker, "getWalker() should return an actor.");
++      gClient = client;
++      gWalker = walker;
++    }).then(runNextTest));
++  });
++});
++
++addTest(function testRemoveSubtree() {
++  let originalOwnershipSize = 0;
++  let longlist = null;
++  let longlistID = null;
++
++  let nextSibling = gInspectee.querySelector("#longlist").nextSibling;
++  // Duplicate the walker logic to skip blank nodes...
++  while (nextSibling && nextSibling.nodeType === Components.interfaces.nsIDOMNode.TEXT_NODE && !/[^\s]/.exec(nextSibling.nodeValue)) {
++    nextSibling = nextSibling.nextSibling;
++  }
++
++  promiseDone(gWalker.querySelector(gWalker.rootNode, "#longlist").then(listFront => {
++    longlist = listFront;
++    longlistID = longlist.actorID;
++  }).then(() => {
++    return gWalker.children(longlist);
++  }).then((items)=> {
++    originalOwnershipSize = assertOwnership();
++    ok(originalOwnershipSize > 26, "Should have at least 26 items in our ownership tree");
++    return gWalker.removeNode(longlist);
++  }).then(nextSiblingFront => {
++    is(nextSiblingFront.rawNode(), nextSibling, "Should have returned the next sibling.");
++    return waitForMutation(gWalker, isChildList);
++  }).then(() => {
++    // Our ownership size should now be 26 fewer (we forgot about #longlist + 26 children, but learned about #longlist's next sibling)
++    let newOwnershipSize = assertOwnership();
++    is(newOwnershipSize, originalOwnershipSize - 26, "Ownership tree should have dropped by 27 nodes");
++    // Now verify that some nodes have gone away
++    return checkMissing(gClient, longlistID);
++  }).then(runNextTest));
++});
++
++addTest(function cleanup() {
++  delete gWalker;
++  delete gClient;
++  runNextTest();
++});
++
++
++  </script>
++</head>
++<body>
++<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
++<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
++<p id="display"></p>
++<div id="content" style="display: none">
++
++</div>
++<pre id="test">
++</pre>
++</body>
++</html>
deleted file mode 100644
--- a/inspector-delete-node.diff
+++ /dev/null
@@ -1,319 +0,0 @@
-# HG changeset patch
-# User Dave Camp <dcamp@mozilla.com>
-# Date 1371477173 25200
-#      Mon Jun 17 06:52:53 2013 -0700
-# Node ID 877aba69dfd4ad1f638be4691802b721d6ee54c0
-# Parent 0346910d331ca63edf112851e7efe2213c436bf3
-imported patch inspector-delete-node.diff
-
-diff --git a/toolkit/devtools/server/actors/inspector.js b/toolkit/devtools/server/actors/inspector.js
---- a/toolkit/devtools/server/actors/inspector.js
-+++ b/toolkit/devtools/server/actors/inspector.js
-@@ -1377,16 +1377,56 @@ var WalkerActor = protocol.ActorClass({
-       node: Arg(0, "domnode")
-     },
-     response: {
-       value: RetVal("longstring")
-     }
-   }),
- 
-   /**
-+   * Removes a node from its parent node.
-+   *   
-+   * @returns The node's nextSibling before it was removed.
-+   */
-+  removeNode: method(function(node) {
-+    if ((node.rawNode.ownerDocument &&
-+         node.rawNode.ownerDocument.documentElement === this.rawNode) ||
-+         node.rawNode.nodeType === Ci.nsIDOMNode.DOCUMENT_NODE) {
-+      throw Error("Cannot remove document or document elements.");
-+    }
-+    let nextSibling = this.nextSibling(node);
-+    if (node.rawNode.parentNode) {
-+      node.rawNode.parentNode.removeChild(node.rawNode);
-+      // Mutation events will take care of the rest.
-+    }
-+    return nextSibling;
-+  }, {
-+    request: {
-+      node: Arg(0, "domnode")
-+    },
-+    response: {
-+      nextSibling: RetVal("domnode", { optional: true })
-+    }
-+  }),
-+
-+  /**
-+   * Insert a node into the DOM.
-+   */
-+  insertBefore: method(function(node, parent, sibling) {
-+    parent.rawNode.insertBefore(node.rawNode, sibling ? sibling.rawNode : null);
-+  }, {
-+    request: {
-+      node: Arg(0, "domnode"),
-+      parent: Arg(1, "domnode"),
-+      sibling: Arg(2, "domnode", { optional: true })
-+    },
-+    response: {}
-+  }),
-+
-+  /**
-    * Get any pending mutation records.  Must be called by the client after
-    * the `new-mutations` notification is received.  Returns an array of
-    * mutation records.
-    *
-    * Mutation records have a basic structure:
-    *
-    * {
-    *   type: attributes|characterData|childList,
-diff --git a/toolkit/devtools/server/tests/mochitest/Makefile.in b/toolkit/devtools/server/tests/mochitest/Makefile.in
---- a/toolkit/devtools/server/tests/mochitest/Makefile.in
-+++ b/toolkit/devtools/server/tests/mochitest/Makefile.in
-@@ -11,21 +11,23 @@ relativesrcdir	= @relativesrcdir@
- 
- include $(DEPTH)/config/autoconf.mk
- 
- MOCHITEST_CHROME_FILES	= \
- 	inspector-helpers.js \
- 	inspector-traversal-data.html \
- 	test_inspector-changeattrs.html \
- 	test_inspector-changevalue.html \
-+	test_inspector-insert.html \
- 	test_inspector-mutations-attr.html \
- 	test_inspector-mutations-childlist.html \
- 	test_inspector-mutations-frameload.html \
- 	test_inspector-mutations-value.html \
- 	test_inspector-release.html \
-+	test_inspector-remove.html \
- 	test_inspector-retain.html \
- 	test_inspector-pseudoclass-lock.html \
- 	test_inspector-traversal.html \
- 	test_unsafeDereference.html \
- 	nonchrome_unsafeDereference.html \
- 	$(NULL)
- 
- include $(topsrcdir)/config/rules.mk
-diff --git a/toolkit/devtools/server/tests/mochitest/inspector-helpers.js b/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
---- a/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
-+++ b/toolkit/devtools/server/tests/mochitest/inspector-helpers.js
-@@ -150,16 +150,18 @@ function ownershipTreeSize(tree) {
-   return size;
- }
- 
- function assertOwnershipTrees(walker) {
-   let serverTree = serverOwnershipTree(walker);
-   let clientTree = clientOwnershipTree(walker);
-   is(JSON.stringify(clientTree, null, ' '), JSON.stringify(serverTree, null, ' '), "Server and client ownership trees should match.");
- 
-+  dump("ownership tree: " + JSON.stringify(clientTree, null, ' ') + "\n");
-+
-   return ownershipTreeSize(clientTree.root);
- }
- 
- // Verify that an actorID is inaccessible both from the client library and the server.
- function checkMissing(client, actorID) {
-   let deferred = Promise.defer();
-   let front = client.getActor(actorID);
-   ok(!front, "Front shouldn't be accessible from the client for actorID: " + actorID);
-diff --git a/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html b/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html
-new file mode 100644
---- /dev/null
-+++ b/toolkit/devtools/server/tests/mochitest/test_inspector-insert.html
-@@ -0,0 +1,96 @@
-+<!DOCTYPE HTML>
-+<html>
-+<!--
-+https://bugzilla.mozilla.org/show_bug.cgi?id=
-+-->
-+<head>
-+  <meta charset="utf-8">
-+  <title>Test for Bug </title>
-+
-+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
-+  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
-+  <script type="application/javascript;version=1.8">
-+Components.utils.import("resource://gre/modules/devtools/Loader.jsm");
-+
-+const Promise = devtools.require("sdk/core/promise");
-+const inspector = devtools.require("devtools/server/actors/inspector");
-+
-+window.onload = function() {
-+  SimpleTest.waitForExplicitFinish();
-+  runNextTest();
-+}
-+
-+var gWalker = null;
-+var gClient = null;
-+
-+function assertOwnership() {
-+  return assertOwnershipTrees(gWalker);
-+}
-+
-+addTest(function setup() {
-+  let url = document.getElementById("inspectorContent").href;
-+  attachURL(url, function(err, client, tab, doc) {
-+    gInspectee = doc;
-+    let {InspectorFront} = devtools.require("devtools/server/actors/inspector");
-+    let inspector = InspectorFront(client, tab);
-+    promiseDone(inspector.getWalker().then(walker => {
-+      ok(walker, "getWalker() should return an actor.");
-+      gClient = client;
-+      gWalker = walker;
-+    }).then(runNextTest));
-+  });
-+});
-+
-+addTest(function testRearrange() {
-+  let longlist = null;
-+  let nodeA = null;
-+  let nextNode = null;
-+
-+  promiseDone(gWalker.querySelector(gWalker.rootNode, "#longlist").then(listFront => {
-+    longlist = listFront;
-+  }).then(() => {
-+    return gWalker.children(longlist);
-+  }).then(response => {
-+    nodeA = response.nodes[0];
-+    is(nodeA.id, "a", "Got the expected node.");
-+    // Move nodeA to the end of the list.
-+    return gWalker.insertBefore(nodeA, longlist, null);
-+  }).then(() => {
-+    ok(!gInspectee.querySelector("#a").nextSibling, "a should now be at the end of the list.");
-+    return gWalker.children(longlist);
-+  }).then(response => {
-+    is(nodeA, response.nodes[response.nodes.length - 1], "a should now be the last returned child.");
-+    // Now move it to the middle of the list.
-+    nextNode = response.nodes[13];
-+    return gWalker.insertBefore(nodeA, longlist, nextNode);
-+  }).then(response => {
-+    let sibling = inspector._documentWalker(gInspectee.querySelector("#a")).nextSibling();
-+    is(sibling, nextNode.rawNode(), "Node should match the expected next node.");
-+    return gWalker.children(longlist);
-+  }).then(response => {
-+    is(nodeA, response.nodes[13], "a should be where we expect it.");
-+    is(nextNode, response.nodes[14], "next node should be where we expect it.");
-+  }).then(runNextTest));
-+});
-+
-+addTest(function cleanup() {
-+  delete gWalker;
-+  delete gClient;
-+  runNextTest();
-+});
-+
-+
-+  </script>
-+</head>
-+<body>
-+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
-+<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
-+<p id="display"></p>
-+<div id="content" style="display: none">
-+
-+</div>
-+<pre id="test">
-+</pre>
-+</body>
-+</html>
-diff --git a/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html b/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html
-new file mode 100644
---- /dev/null
-+++ b/toolkit/devtools/server/tests/mochitest/test_inspector-remove.html
-@@ -0,0 +1,96 @@
-+<!DOCTYPE HTML>
-+<html>
-+<!--
-+https://bugzilla.mozilla.org/show_bug.cgi?id=
-+-->
-+<head>
-+  <meta charset="utf-8">
-+  <title>Test for Bug </title>
-+
-+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
-+  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
-+  <script type="application/javascript;version=1.8">
-+Components.utils.import("resource://gre/modules/devtools/Loader.jsm");
-+
-+const Promise = devtools.require("sdk/core/promise");
-+const inspector = devtools.require("devtools/server/actors/inspector");
-+
-+window.onload = function() {
-+  SimpleTest.waitForExplicitFinish();
-+  runNextTest();
-+}
-+
-+var gWalker = null;
-+var gClient = null;
-+
-+function assertOwnership() {
-+  return assertOwnershipTrees(gWalker);
-+}
-+
-+addTest(function setup() {
-+  let url = document.getElementById("inspectorContent").href;
-+  attachURL(url, function(err, client, tab, doc) {
-+    gInspectee = doc;
-+    let {InspectorFront} = devtools.require("devtools/server/actors/inspector");
-+    let inspector = InspectorFront(client, tab);
-+    promiseDone(inspector.getWalker().then(walker => {
-+      ok(walker, "getWalker() should return an actor.");
-+      gClient = client;
-+      gWalker = walker;
-+    }).then(runNextTest));
-+  });
-+});
-+
-+addTest(function testRemoveSubtree() {
-+  let originalOwnershipSize = 0;
-+  let longlist = null;
-+  let longlistID = null;
-+
-+  let nextSibling = gInspectee.querySelector("#longlist").nextSibling;
-+  // Duplicate the walker logic to skip blank nodes...
-+  while (nextSibling && nextSibling.nodeType === Components.interfaces.nsIDOMNode.TEXT_NODE && !/[^\s]/.exec(nextSibling.nodeValue)) {
-+    nextSibling = nextSibling.nextSibling;
-+  }
-+
-+  promiseDone(gWalker.querySelector(gWalker.rootNode, "#longlist").then(listFront => {
-+    longlist = listFront;
-+    longlistID = longlist.actorID;
-+  }).then(() => {
-+    return gWalker.children(longlist);
-+  }).then((items)=> {
-+    originalOwnershipSize = assertOwnership();
-+    ok(originalOwnershipSize > 26, "Should have at least 26 items in our ownership tree");
-+    return gWalker.removeNode(longlist);
-+  }).then(nextSiblingFront => {
-+    is(nextSiblingFront.rawNode(), nextSibling, "Should have returned the next sibling.");
-+    return waitForMutation(gWalker, isChildList);
-+  }).then(() => {
-+    // Our ownership size should now be 26 fewer (we forgot about #longlist + 26 children, but learned about #longlist's next sibling)
-+    let newOwnershipSize = assertOwnership();
-+    is(newOwnershipSize, originalOwnershipSize - 26, "Ownership tree should have dropped by 27 nodes");
-+    // Now verify that some nodes have gone away
-+    return checkMissing(gClient, longlistID);
-+  }).then(runNextTest));
-+});
-+
-+addTest(function cleanup() {
-+  delete gWalker;
-+  delete gClient;
-+  runNextTest();
-+});
-+
-+
-+  </script>
-+</head>
-+<body>
-+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=">Mozilla Bug </a>
-+<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
-+<p id="display"></p>
-+<div id="content" style="display: none">
-+
-+</div>
-+<pre id="test">
-+</pre>
-+</body>
-+</html>
--- a/inspector-panel-default-node.diff
+++ b/inspector-panel-default-node.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477174 25200
 #      Mon Jun 17 06:52:54 2013 -0700
-# Node ID 00aba1b028d43fb8dc1604f6fa3c1df3243feae0
-# Parent  8e69c05917c43407a091f2086aa429d9b054fef2
+# Node ID 71b348a1ba083f8d9febd362b6b6af4b0f2559f2
+# Parent  948bcf0c688a226117e9b94ac61bd95336f1ec95
 imported patch inspector-panel-default-node.diff
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
 @@ -152,24 +152,34 @@ InspectorPanel.prototype = {
  
      return deferred.promise;
@@ -41,17 +41,17 @@ diff --git a/browser/devtools/inspector/
    },
  
    /**
     * Selection object (read only)
     */
    get selection() {
      return this._selection;
    },
-@@ -272,16 +282,17 @@ InspectorPanel.prototype = {
+@@ -271,16 +281,17 @@ InspectorPanel.prototype = {
  
    /**
     * Reset the inspector on navigate away.
     */
    onNavigatedAway: function InspectorPanel_onNavigatedAway(event, payload) {
      let newWindow = payload._navPayload || payload;
      this.walker.release().then(null, console.error);
      this.walker = null;
@@ -59,17 +59,17 @@ diff --git a/browser/devtools/inspector/
      this.selection.setNodeFront(null);
      this.selection.setWalker(null);
      this._destroyMarkup();
      this.isDirty = false;
  
      this.target.inspector.getWalker().then(walker => {
        if (this._destroyPromise) {
          walker.release().then(null, console.error);
-@@ -387,17 +398,17 @@ InspectorPanel.prototype = {
+@@ -386,17 +397,17 @@ InspectorPanel.prototype = {
    },
  
    /**
     * When a node is deleted, select its parent node.
     */
    onDetached: function InspectorPanel_onDetached(event, parentNode) {
      this.cancelLayoutChange();
      this.breadcrumbs.cutAfter(this.breadcrumbs.indexOf(parentNode));
--- a/inspector-remote-delete-node.diff
+++ b/inspector-remote-delete-node.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477175 25200
 #      Mon Jun 17 06:52:55 2013 -0700
-# Node ID d226c8a4645c57624d721ab57c3b8fb1c98d8822
-# Parent 39dfcd31bc12451e6ba0c7eab89fc34e28682c59
+# Node ID 9ba44475ec4e354f39d5cf98c7d7508100c46815
+# Parent  9a904486f94ac45b441f170aafd933161e5a39e7
 imported patch inspector-remote-delete-node.diff
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
 @@ -685,18 +685,17 @@ InspectorPanel.prototype = {
      }
  
--- a/remote-edit-attributes.diff
+++ b/remote-edit-attributes.diff
@@ -1,20 +1,20 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477175 25200
 #      Mon Jun 17 06:52:55 2013 -0700
-# Node ID 477d7b2c7c75daf444a25ae728c0057c2b93487d
-# Parent  532e9ff4a7f442cda71c5ecca75a9868a245857e
+# Node ID 9f3e138ac09f11cdbc7030ff1fd771609ff7330b
+# Parent  e551874cce8589cdab23bf7aa255bc312a34fdd8
 imported patch remote-edit-attributes.diff
 
 diff --git a/browser/devtools/markupview/markup-view.js b/browser/devtools/markupview/markup-view.js
 --- a/browser/devtools/markupview/markup-view.js
 +++ b/browser/devtools/markupview/markup-view.js
-@@ -1104,47 +1104,53 @@ function ElementEditor(aContainer, aNode
+@@ -1101,47 +1101,53 @@ function ElementEditor(aContainer, aNode
      this.template("elementContentSummary", this);
    }
  
    // Create the closing tag
    this.template("elementClose", this);
  
    this.rawNode = aNode.rawNode();
  
@@ -83,17 +83,17 @@ diff --git a/browser/devtools/markupview
    let tagName = this.node.nodeName.toLowerCase();
    this.tag.textContent = tagName;
    this.closeTag.textContent = tagName;
  
    this.update();
  }
  
  ElementEditor.prototype = {
-@@ -1173,16 +1179,20 @@ ElementEditor.prototype = {
+@@ -1170,16 +1176,20 @@ ElementEditor.prototype = {
      for (let i = 0; i < attrs.length; i++) {
        let attr = this._createAttribute(attrs[i]);
        if (!attr.inplaceEditor) {
          attr.style.removeProperty("display");
        }
      }
    },
  
@@ -104,17 +104,17 @@ diff --git a/browser/devtools/markupview
    _createAttribute: function EE_createAttribute(aAttr, aBefore)
    {
      if (this.attrs.indexOf(aAttr.name) !== -1) {
        var attr = this.attrs[aAttr.name];
        var name = attr.querySelector(".attrname");
        var val = attr.querySelector(".attrvalue");
      } else {
        // Create the template editor, which will save some variables here.
-@@ -1197,59 +1207,61 @@ ElementEditor.prototype = {
+@@ -1194,59 +1204,61 @@ ElementEditor.prototype = {
        if (aAttr.name == "id") {
          before = this.attrList.firstChild;
        } else if (aAttr.name == "class") {
          let idNode = this.attrs["id"];
          before = idNode ? idNode.nextSibling : this.attrList.firstChild;
        }
        this.attrList.insertBefore(attr, before);
  
@@ -207,17 +207,17 @@ diff --git a/browser/devtools/markupview
  
        this.attrs[aAttr.name] = attr;
      }
  
      name.textContent = aAttr.name;
      val.textContent = aAttr.value;
  
      return attr;
-@@ -1259,94 +1271,45 @@ ElementEditor.prototype = {
+@@ -1256,94 +1268,45 @@ ElementEditor.prototype = {
     * Parse a user-entered attribute string and apply the resulting
     * attributes to the node.  This operation is undoable.
     *
     * @param string aValue the user-entered value.
     * @param Element aAttrNode the attribute editor that created this
     *        set of attributes, used to place new attributes where the
     *        user put them.
     */
--- a/remote-edit-value.diff
+++ b/remote-edit-value.diff
@@ -1,20 +1,20 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477175 25200
 #      Mon Jun 17 06:52:55 2013 -0700
-# Node ID 8a0888a06e3fa6534c0bf8ebe1aa600a1e7852b0
-# Parent 22cacc2cf7356dfafddb93b5a6265ef1c7dad2b0
+# Node ID d3a25c9a42f47a6d070afc2e15d3e494ad792197
+# Parent  9f3e138ac09f11cdbc7030ff1fd771609ff7330b
 imported patch remote-edit-value.diff
 
 diff --git a/browser/devtools/markupview/markup-view.js b/browser/devtools/markupview/markup-view.js
 --- a/browser/devtools/markupview/markup-view.js
 +++ b/browser/devtools/markupview/markup-view.js
-@@ -1006,38 +1006,42 @@ function DoctypeEditor(aContainer, aNode
+@@ -1003,38 +1003,42 @@ function DoctypeEditor(aContainer, aNode
   */
  function TextEditor(aContainer, aNode, aTemplate)
  {
    this.node = aNode;
    this._selected = false;
  
    aContainer.markup.template(aTemplate, this);
  
--- a/remote-markup.diff
+++ b/remote-markup.diff
@@ -1,19 +1,15 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1370924326 25200
 #      Mon Jun 10 21:18:46 2013 -0700
-# Node ID 0499ca738e7d86f14f81beb3978bddac8841329e
-# Parent  eb6cf1052d776cb61c5a6189a72e39613e29d8ec
-imported patch remote-markup.diff
-* * *
-imported patch markup-fixes.diff
-* * *
-[mq]: fucking-around.diff
+# Node ID e551874cce8589cdab23bf7aa255bc312a34fdd8
+# Parent  9876c67d28d20a69cf5397424979f8e8bec33013
+Bug 886032 - Port the markup view to the inspector actor (readonly). r=paul
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
 @@ -136,17 +136,17 @@ InspectorPanel.prototype = {
  
        // All the components are initialized. Let's select a node.
        this._selection.setNodeFront(defaultSelection);
@@ -386,17 +382,17 @@ diff --git a/browser/devtools/markupview
      let doc = nodeDocument(aNode);
      if (aNode === doc ||
          aNode === doc.documentElement ||
          aNode.nodeType == Ci.nsIDOMNode.DOCUMENT_TYPE_NODE) {
        return;
      }
  
      let parentNode = aNode.parentNode;
-@@ -264,129 +278,129 @@ MarkupView.prototype = {
+@@ -264,136 +278,129 @@ MarkupView.prototype = {
     */
    navigate: function MT__navigate(aContainer, aIgnoreFocus)
    {
      if (!aContainer) {
        return;
      }
  
      let node = aContainer.node;
@@ -443,21 +439,23 @@ diff --git a/browser/devtools/markupview
 -    let walker = documentWalker(aNode);
 -    let parent = walker.parentNode();
 -    if (parent) {
 -      var container = new MarkupContainer(this, aNode);
 -    } else {
 +    if (aNode === this.walker.rootNode) {
        var container = new RootContainer(this, aNode);
        this._elt.appendChild(container.elt);
+-
+-      if (this._rootNode) {
+-        this._rootNode.removeEventListener("load", this, true);
+-      }
+-
        this._rootNode = aNode;
--      aNode.addEventListener("load", function MP_watch_contentLoaded(aEvent) {
--        // Fake a childList mutation here.
--        this._mutationObserver([{target: aEvent.target, type: "childList"}]);
--      }.bind(this), true);
+-      aNode.addEventListener("load", this, true);
 +    } else {
 +      var container = new MarkupContainer(this, aNode);
      }
  
      this._containers.set(aNode, container);
 -    // FIXME: set an expando to prevent the the wrapper from disappearing
 -    // See bug 819131 for details.
 -    aNode.__preserveHack = true;
@@ -468,17 +466,21 @@ diff --git a/browser/devtools/markupview
      this._updateChildren(container);
  
 -    if (parent) {
 -      this.importNode(parent, true);
 -    }
      return container;
    },
  
-+
+-  handleEvent: function MT_handleEvent(aEvent) {
+-    // Fake a childList mutation here.
+-    this._mutationObserver([{target: aEvent.target, type: "childList"}]);
+-  },
+ 
    /**
     * Mutation observer used for included nodes.
     */
    _mutationObserver: function MT__mutationObserver(aMutations)
    {
      for (let mutation of aMutations) {
 -      let container = this._containers.get(mutation.target);
 +      let type = mutation.type;
@@ -558,17 +560,17 @@ diff --git a/browser/devtools/markupview
    },
  
    /**
     * Expand the node's children.
     */
    expandNode: function MT_expandNode(aNode)
    {
      let container = this._containers.get(aNode);
-@@ -395,45 +409,57 @@ MarkupView.prototype = {
+@@ -402,45 +409,57 @@ MarkupView.prototype = {
  
    /**
     * Expand the entire tree beneath a container.
     *
     * @param aContainer The container to expand.
     */
    _expandAll: function MT_expandAll(aContainer)
    {
@@ -623,17 +625,17 @@ diff --git a/browser/devtools/markupview
    /**
     * Mark the given node selected.
     */
    markNodeAsSelected: function MT_markNodeAsSelected(aNode)
    {
      let container = this._containers.get(aNode);
      if (this._selectedContainer === container) {
        return false;
-@@ -441,40 +467,37 @@ MarkupView.prototype = {
+@@ -448,40 +467,37 @@ MarkupView.prototype = {
      if (this._selectedContainer) {
        this._selectedContainer.selected = false;
      }
      this._selectedContainer = container;
      if (aNode) {
        this._selectedContainer.selected = true;
      }
  
@@ -667,17 +669,17 @@ diff --git a/browser/devtools/markupview
    },
  
    /**
     * Unmark selected node (no node selected).
     */
    unmarkSelectedNode: function MT_unmarkSelectedNode()
    {
      if (this._selectedContainer) {
-@@ -489,181 +512,199 @@ MarkupView.prototype = {
+@@ -496,186 +512,199 @@ MarkupView.prototype = {
    nodeChanged: function MT_nodeChanged(aNode)
    {
      if (aNode === this._inspector.selection) {
        this._inspector.change("markupview");
      }
    },
  
    /**
@@ -961,40 +963,45 @@ diff --git a/browser/devtools/markupview
 +
 +    if (this._boundResizePreview) {
 +      this._frame.contentWindow.removeEventListener("resize", this._boundResizePreview, true);
 +      this._frame.contentWindow.removeEventListener("overflow", this._boundResizePreview, true);
 +      this._frame.contentWindow.removeEventListener("underflow", this._boundResizePreview, true);
 +      delete this._boundResizePreview;
 +    }
  
-     this._frame.contentWindow.removeEventListener("keydown", this._boundKeyDown, true);
+     this._frame.contentWindow.removeEventListener("keydown", this._boundKeyDown, false);
      delete this._boundKeyDown;
  
 -    this._inspector.selection.off("new-node", this._boundOnNewSelection);
 +    this._inspector.selection.off("new-node-front", this._boundOnNewSelection);
      delete this._boundOnNewSelection;
  
 +    this.walker.off("mutations", this._boundMutationObserver)
 +    delete this._boundMutationObserver;
 +
      delete this._elt;
  
      delete this._containers;
 -    this._observer.disconnect();
 -    delete this._observer;
+-
+-    if (this._rootNode) {
+-      this._rootNode.removeEventListener("load", this, true);
+-      delete this._rootNode;
+-    }
    },
  
    /**
     * Initialize the preview panel.
     */
    _initPreview: function MT_initPreview()
    {
      if (!Services.prefs.getBoolPref("devtools.inspector.markupPreview")) {
-@@ -773,25 +814,22 @@ function MarkupContainer(aMarkupView, aN
+@@ -785,25 +814,22 @@ function MarkupContainer(aMarkupView, aN
  
    // The template will fill the following properties
    this.elt = null;
    this.expander = null;
    this.codeBox = null;
    this.children = null;
    this.markup.template("container", this);
    this.elt.container = this;
@@ -1012,17 +1019,17 @@ diff --git a/browser/devtools/markupview
    }.bind(this));
  
    this.codeBox.insertBefore(this.editor.elt, this.children);
  
    this.editor.elt.addEventListener("mousedown", function(evt) {
      this.markup.navigate(this);
    }.bind(this), false);
  
-@@ -804,20 +842,21 @@ function MarkupContainer(aMarkupView, aN
+@@ -816,20 +842,21 @@ function MarkupContainer(aMarkupView, aN
    }
  
    if (this.editor.closeElt) {
      this.editor.closeElt.addEventListener("mousedown", function(evt) {
        this.markup.navigate(this);
      }.bind(this), false);
      this.codeBox.appendChild(this.editor.closeElt);
    }
@@ -1035,17 +1042,17 @@ diff --git a/browser/devtools/markupview
    /**
     * True if the current node has children.  The MarkupView
     * will set this attribute for the MarkupContainer.
     */
    _hasChildren: false,
  
    get hasChildren() {
      return this._hasChildren;
-@@ -827,16 +866,20 @@ MarkupContainer.prototype = {
+@@ -839,16 +866,20 @@ MarkupContainer.prototype = {
      this._hasChildren = aValue;
      if (aValue) {
        this.expander.style.visibility = "visible";
      } else {
        this.expander.style.visibility = "hidden";
      }
    },
  
@@ -1056,17 +1063,17 @@ diff --git a/browser/devtools/markupview
    /**
     * True if the node has been visually expanded in the tree.
     */
    get expanded() {
      return this.children.hasAttribute("expanded");
    },
  
    set expanded(aValue) {
-@@ -869,16 +912,17 @@ MarkupContainer.prototype = {
+@@ -881,16 +912,17 @@ MarkupContainer.prototype = {
    _selected: false,
  
    get selected() {
      return this._selected;
    },
  
    set selected(aValue) {
      this._selected = aValue;
@@ -1074,17 +1081,17 @@ diff --git a/browser/devtools/markupview
      if (this._selected) {
        this.editor.elt.classList.add("theme-selected");
        if (this.editor.closeElt) {
          this.editor.closeElt.classList.add("theme-selected");
        }
      } else {
        this.editor.elt.classList.remove("theme-selected");
        if (this.editor.closeElt) {
-@@ -912,18 +956,20 @@ MarkupContainer.prototype = {
+@@ -924,18 +956,20 @@ MarkupContainer.prototype = {
  
  /**
   * Dummy container node used for the root document element.
   */
  function RootContainer(aMarkupView, aNode)
  {
    this.doc = aMarkupView.doc;
    this.elt = this.doc.createElement("ul");
@@ -1095,17 +1102,17 @@ diff --git a/browser/devtools/markupview
  }
  
  /**
   * Creates an editor for simple nodes.
   */
  function GenericEditor(aContainer, aNode)
  {
    this.elt = aContainer.doc.createElement("span");
-@@ -953,46 +999,77 @@ function DoctypeEditor(aContainer, aNode
+@@ -965,46 +999,77 @@ function DoctypeEditor(aContainer, aNode
   *
   * @param MarkupContainer aContainer The container owning this editor.
   * @param DOMNode aNode The node being edited.
   * @param string aTemplate The template id to use to build the editor.
   */
  function TextEditor(aContainer, aNode, aTemplate)
  {
    this.node = aNode;
@@ -1193,17 +1200,17 @@ diff --git a/browser/devtools/markupview
    }
  };
  
  /**
   * Creates an editor for an Element node.
   *
   * @param MarkupContainer aContainer The container owning this editor.
   * @param Element aNode The node being edited.
-@@ -1014,53 +1091,57 @@ function ElementEditor(aContainer, aNode
+@@ -1026,53 +1091,57 @@ function ElementEditor(aContainer, aNode
    this.attrList = null;
    this.newAttr = null;
    this.summaryElt = null;
    this.closeElt = null;
  
    // Create the main editor
    this.template("element", this);
  
@@ -1274,17 +1281,17 @@ diff --git a/browser/devtools/markupview
    let tagName = this.node.nodeName.toLowerCase();
    this.tag.textContent = tagName;
    this.closeTag.textContent = tagName;
  
    this.update();
  }
  
  ElementEditor.prototype = {
-@@ -1113,56 +1194,59 @@ ElementEditor.prototype = {
+@@ -1125,56 +1194,59 @@ ElementEditor.prototype = {
        if (aAttr.name == "id") {
          before = this.attrList.firstChild;
        } else if (aAttr.name == "class") {
          let idNode = this.attrs["id"];
          before = idNode ? idNode.nextSibling : this.attrList.firstChild;
        }
        this.attrList.insertBefore(attr, before);
  
@@ -1372,17 +1379,17 @@ diff --git a/browser/devtools/markupview
  
        this.attrs[aAttr.name] = attr;
      }
  
      name.textContent = aAttr.name;
      val.textContent = aAttr.value;
  
      return attr;
-@@ -1185,17 +1269,17 @@ ElementEditor.prototype = {
+@@ -1197,17 +1269,17 @@ ElementEditor.prototype = {
  
      for (let attr of attrs) {
        let attribute = {
          name: attr.name,
          value: attr.value
        };
        // Create an attribute editor next to the current attribute if needed.
        this._createAttribute(attribute, aAttrNode ? aAttrNode.nextSibling : null);
@@ -1391,17 +1398,17 @@ diff --git a/browser/devtools/markupview
      }
  
      this.undo.endBatch();
    },
  
    /**
     * Helper function for _setAttribute and _removeAttribute,
     * returns a function that puts an attribute back the way it was.
-@@ -1242,187 +1326,93 @@ ElementEditor.prototype = {
+@@ -1254,187 +1326,93 @@ ElementEditor.prototype = {
     * Handler for the new attribute editor.
     */
    _onNewAttribute: function EE_onNewAttribute(aValue, aCommit)
    {
      if (!aValue || !aCommit) {
        return;
      }
  
--- a/search-box-remote.diff
+++ b/search-box-remote.diff
@@ -1,24 +1,24 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1370924326 25200
 #      Mon Jun 10 21:18:46 2013 -0700
-# Node ID 2ccc31df1f64ef58ad9db4f76a2a5caa5507d141
-# Parent  0499ca738e7d86f14f81beb3978bddac8841329e
+# Node ID 35ffcc040b8c3de7b5659a02f1c04cb782b2d467
+# Parent  c7c02144a5f57bba0435dca17b98b653b1427d52
 imported patch search-box-remote.diff
 * * *
 imported patch search-fixes-2.diff
 * * *
 imported patch selector-search-fix.diff
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
-@@ -209,28 +209,29 @@ InspectorPanel.prototype = {
+@@ -219,28 +219,29 @@ InspectorPanel.prototype = {
     */
    setupSearchBox: function InspectorPanel_setupSearchBox() {
      let searchDoc;
      if (this.target.isLocalTab) {
        searchDoc = this.browser.contentDocument;
      } else if (this.target.window) {
        searchDoc = this.target.window.document;
      } else {
@@ -456,17 +456,17 @@ diff --git a/browser/devtools/inspector/
           ? actualSuggestions.length: 0, suggestions.length,
           "There are expected number of suggestions at " + state + "th step.");
        actualSuggestions = actualSuggestions.reverse();
        for (let i = 0; i < suggestions.length; i++) {
          is(suggestions[i][0], actualSuggestions[i].label,
 diff --git a/toolkit/devtools/server/actors/inspector.js b/toolkit/devtools/server/actors/inspector.js
 --- a/toolkit/devtools/server/actors/inspector.js
 +++ b/toolkit/devtools/server/actors/inspector.js
-@@ -1998,17 +1998,17 @@ function nodeDocument(node) {
+@@ -2038,17 +2038,17 @@ function nodeDocument(node) {
   * Similar to a TreeWalker, except will dig in to iframes and it doesn't
   * implement the good methods like previousNode and nextNode.
   *
   * See TreeWalker documentation for explanations of the methods.
   */
  function DocumentWalker(aNode, aShow, aFilter, aExpandEntityReferences)
  {
    let doc = nodeDocument(aNode);
--- a/series
+++ b/series
@@ -1,13 +1,13 @@
-android-browser.diff
-inspector-delete-node.diff
+delete-nodes.diff
 remote-markup.diff
 remote-edit-attributes.diff
 remote-edit-value.diff
+android-browser.diff
 inspector-panel-default-node.diff
 copy-html.diff
 search-box-remote.diff
 warning-fixes.diff
 inspector-remote-delete-node.diff
 style-actor.diff
 window-targets.diff
 inspector-retain-root.diff #+obsolete
--- a/style-actor.diff
+++ b/style-actor.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371506345 25200
 #      Mon Jun 17 14:59:05 2013 -0700
-# Node ID ca1a3b610988fcf9d867dcc0bc6a8f020a2be000
-# Parent  8a0888a06e3fa6534c0bf8ebe1aa600a1e7852b0
+# Node ID 8a4b0125b290258e96c38168f01493575cf50658
+# Parent  9ba44475ec4e354f39d5cf98c7d7508100c46815
 [mq]: style-actor.diff
 * * *
 [mq]: computed-view-remote.diff
 
 diff --git a/browser/devtools/inspector/inspector-panel.js b/browser/devtools/inspector/inspector-panel.js
 --- a/browser/devtools/inspector/inspector-panel.js
 +++ b/browser/devtools/inspector/inspector-panel.js
 @@ -40,22 +40,18 @@ function InspectorPanel(iframeWindow, to
@@ -30,17 +30,17 @@ diff --git a/browser/devtools/inspector/
 +    }).then(() => {
        return this._getDefaultNodeForSelection();
      }).then(defaultSelection => {
        return this._deferredOpen(defaultSelection);
      }).then(null, console.error);
    },
  
    _deferredOpen: function(defaultSelection) {
-     let deferred = Promise.defer();
+     let deferred = promise.defer();
 @@ -275,37 +271,53 @@ InspectorPanel.prototype = {
  
      let ruleViewTab = this.sidebar.getTab("ruleview");
      ruleViewTab.addEventListener("mouseover", this.toggleHighlighter, false);
      ruleViewTab.addEventListener("mouseout", this.toggleHighlighter, false);
  
      this.sidebar.show();
    },
@@ -132,17 +132,17 @@ diff --git a/browser/devtools/inspector/
      if (this._destroyPromise) {
        return this._destroyPromise;
      }
      if (this.walker) {
        this._destroyPromise = this.walker.release().then(null, console.error);
        delete this.walker;
 +      delete this.nodeStyle;
      } else {
-       this._destroyPromise = Promise.resolve(null);
+       this._destroyPromise = promise.resolve(null);
      }
  
      this.cancelUpdate();
      this.cancelLayoutChange();
  
      if (this.browser) {
 diff --git a/browser/devtools/inspector/selection.js b/browser/devtools/inspector/selection.js
 --- a/browser/devtools/inspector/selection.js
@@ -6054,17 +6054,17 @@ diff --git a/toolkit/devtools/server/pro
   * deserialization.
   *
   * This is called by getType() when passed an 'actorType#detail' string.
   *
   * @param string name
 diff --git a/toolkit/devtools/server/transport.js b/toolkit/devtools/server/transport.js
 --- a/toolkit/devtools/server/transport.js
 +++ b/toolkit/devtools/server/transport.js
-@@ -225,17 +225,21 @@ LocalDebuggerTransport.prototype = {
+@@ -227,17 +227,21 @@ LocalDebuggerTransport.prototype = {
        }
      }
      this._deepFreeze(aPacket);
      let other = this.other;
      if (other) {
        Services.tm.currentThread.dispatch(makeInfallible(function() {
          // Avoid the cost of JSON.stringify() when logging is disabled.
          if (wantLogging) {
--- a/warning-fixes.diff
+++ b/warning-fixes.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1371477174 25200
 #      Mon Jun 17 06:52:54 2013 -0700
-# Node ID 8e69c05917c43407a091f2086aa429d9b054fef2
-# Parent  877aba69dfd4ad1f638be4691802b721d6ee54c0
+# Node ID 9a904486f94ac45b441f170aafd933161e5a39e7
+# Parent  35ffcc040b8c3de7b5659a02f1c04cb782b2d467
 imported patch warning-fixes.diff
 
 diff --git a/browser/devtools/shared/inplace-editor.js b/browser/devtools/shared/inplace-editor.js
 --- a/browser/devtools/shared/inplace-editor.js
 +++ b/browser/devtools/shared/inplace-editor.js
 @@ -398,17 +398,17 @@ InplaceEditor.prototype = {
              --selStart;
            }
--- a/window-targets.diff
+++ b/window-targets.diff
@@ -1,14 +1,14 @@
 # HG changeset patch
 # User Dave Camp <dcamp@mozilla.com>
 # Date 1372178155 25200
 #      Tue Jun 25 09:35:55 2013 -0700
-# Node ID ac23bf71ac37438be024cf00cb3c6cef7524d6fa
-# Parent  42bd9e0aa209aa6a36fe343fe7e20efaf286c730
+# Node ID 77bd617cdc65d41724b065d35023bf1c10e9ca01
+# Parent  8a4b0125b290258e96c38168f01493575cf50658
 imported patch window-targets.diff
 * * *
 imported patch custom-windows.diff
 
 diff --git a/browser/devtools/framework/target.js b/browser/devtools/framework/target.js
 --- a/browser/devtools/framework/target.js
 +++ b/browser/devtools/framework/target.js
 @@ -77,17 +77,19 @@ exports.TargetFactory = {
@@ -131,17 +131,17 @@ diff --git a/browser/devtools/framework/
     * for tools that support the Remote Debugging Protocol even for local
     * connections.
     */
    makeRemote: function TabTarget_makeRemote() {
      if (this._remote) {
        return this._remote.promise;
      }
  
-     this._remote = Promise.defer();
+     this._remote = promise.defer();
  
 -    if (this.isLocalTab) {
 +    if (this.isLocalTab || this.isWindow) {
        // Since a remote protocol connection will be made, let's start the
        // DebuggerServer here, once and for all tools.
        if (!DebuggerServer.initialized) {
          DebuggerServer.init();
          DebuggerServer.addBrowserActors();
@@ -220,17 +220,17 @@ diff --git a/toolkit/devtools/server/act
    },
  
    destroy: function() {
      this.webProgress.removeProgressListener(this);
    },
  
    onStateChange: makeInfallible(function stateChange(progress, request, flag, status) {
      let isWindow = flag & Ci.nsIWebProgressListener.STATE_IS_WINDOW;
-@@ -2003,20 +2003,27 @@ var InspectorActor = protocol.ActorClass
+@@ -2011,20 +2011,27 @@ var InspectorActor = protocol.ActorClass
      return null;
    },
  
    getWalker: method(function(options={}) {
      let deferred = promise.defer();
  
      let window = this.window;
  
@@ -252,17 +252,17 @@ diff --git a/toolkit/devtools/server/act
        window.addEventListener("DOMContentLoaded", domReady, true);
      } else {
        domReady();
      }
  
 diff --git a/toolkit/devtools/server/actors/styleeditor.js b/toolkit/devtools/server/actors/styleeditor.js
 --- a/toolkit/devtools/server/actors/styleeditor.js
 +++ b/toolkit/devtools/server/actors/styleeditor.js
-@@ -403,17 +403,17 @@ StyleSheetActor.prototype = {
+@@ -402,17 +402,17 @@ StyleSheetActor.prototype = {
        title: this.styleSheet.title,
        styleSheetIndex: this.styleSheetIndex,
        text: this.text
      }
  
      // get parent actor if this sheet was @imported
      let parent = this.styleSheet.parentStyleSheet;
      if (parent) {