diff --git a/devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js b/devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js
index 186b494ee57b..87faae35a9ff 100644
--- a/devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js
+++ b/devtools/client/inspector/markup/test/browser_markup_tag_delete_whitespace_node.js
@@ -11,26 +11,20 @@
const HTML =
`
`;
const TEST_URL = "data:text/html;charset=utf-8," + encodeURIComponent(HTML);
-add_task(function* () {
+add_task(function* deleteNodeAfterWhitespace() {
let {inspector} = yield openInspectorForURL(TEST_URL);
info("Test deleting a node that will modify the whitespace nodes rendered in the " +
"markup view.");
- info("Select node #after-whitespace and make sure it is focused");
- yield selectNode("#after-whitespace", inspector);
- yield clickContainer("#after-whitespace", inspector);
-
- info("Delete the node with the delete key");
- let mutated = inspector.once("markupmutation");
- EventUtils.sendKey("delete", inspector.panelWin);
- yield Promise.all([mutated, inspector.once("inspector-updated")]);
+ yield selectAndFocusNode("#after-whitespace", inspector);
+ yield deleteCurrentSelection(inspector);
// TODO: There is still an issue with selection here. When the span is deleted, the
// selection goes to text-node. But since the text-node gets removed from the markup
@@ -48,4 +42,32 @@ add_task(function* () {
yield undoChange(inspector);
node = yield getNodeFront("#after-whitespace", inspector);
ok(node, "The node is back");
+
+ info("Test deleting the node before the whitespace and performing an undo preserves " +
+ "the node order");
+
+ yield selectAndFocusNode("#before-whitespace", inspector);
+ yield deleteCurrentSelection(inspector);
+
+ info("Undo the deletion to restore the original markup");
+ yield undoChange(inspector);
+ node = yield getNodeFront("#before-whitespace", inspector);
+ ok(node, "The node is back");
+
+ let nextSibling = yield getNodeFront("#before-whitespace + *", inspector);
+ let afterWhitespace = yield getNodeFront("#after-whitespace", inspector);
+ is(nextSibling, afterWhitespace, "Order has been preserved after restoring the node");
});
+
+function* selectAndFocusNode(selector, inspector) {
+ info(`Select node ${selector} and make sure it is focused`);
+ yield selectNode(selector, inspector);
+ yield clickContainer(selector, inspector);
+}
+
+function* deleteCurrentSelection(inspector) {
+ info("Delete the node with the delete key");
+ let mutated = inspector.once("markupmutation");
+ EventUtils.sendKey("delete", inspector.panelWin);
+ yield Promise.all([mutated, inspector.once("inspector-updated")]);
+}
diff --git a/devtools/server/actors/inspector.js b/devtools/server/actors/inspector.js
index 04166216be81..980de1cfe5bc 100644
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -3123,12 +3123,12 @@ DocumentWalker.prototype = {
previous = previous && previous.previousSibling;
next = next && next.nextSibling;
- if (this.filter(previous) === nodeFilterConstants.FILTER_ACCEPT) {
+ if (previous && this.filter(previous) === nodeFilterConstants.FILTER_ACCEPT) {
// A valid node was found in the previous siblings of the node.
return previous;
}
- if (this.filter(next) === nodeFilterConstants.FILTER_ACCEPT) {
+ if (next && this.filter(next) === nodeFilterConstants.FILTER_ACCEPT) {
// A valid node was found in the next siblings of the node.
return next;
}