summaryrefslogtreecommitdiffstats
path: root/devtools/client/performance/test/browser_perf-tree-abstract-02.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/performance/test/browser_perf-tree-abstract-02.js')
-rw-r--r--devtools/client/performance/test/browser_perf-tree-abstract-02.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/devtools/client/performance/test/browser_perf-tree-abstract-02.js b/devtools/client/performance/test/browser_perf-tree-abstract-02.js
new file mode 100644
index 000000000..62db4cfd6
--- /dev/null
+++ b/devtools/client/performance/test/browser_perf-tree-abstract-02.js
@@ -0,0 +1,138 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+"use strict";
+
+/**
+ * Tests if the abstract tree base class for the profiler's tree view
+ * has a functional public API.
+ */
+
+const { appendAndWaitForPaint } = require("devtools/client/performance/test/helpers/dom-utils");
+const { synthesizeCustomTreeClass } = require("devtools/client/performance/test/helpers/synth-utils");
+
+add_task(function* () {
+ let { MyCustomTreeItem, myDataSrc } = synthesizeCustomTreeClass();
+
+ let container = document.createElement("vbox");
+ yield appendAndWaitForPaint(gBrowser.selectedBrowser.parentNode, container);
+
+ // Populate the tree and test the root item...
+
+ let treeRoot = new MyCustomTreeItem(myDataSrc, { parent: null });
+ treeRoot.autoExpandDepth = 1;
+ treeRoot.attachTo(container);
+
+ ok(treeRoot.expanded,
+ "The root node should now be expanded.");
+ ok(treeRoot.populated,
+ "The root node should now be populated.");
+
+ let fooItem = treeRoot.getChild(0);
+ let barItem = treeRoot.getChild(1);
+ ok(!fooItem.expanded && !barItem.expanded,
+ "The 'foo' and 'bar' nodes should not be expanded yet.");
+ ok(!fooItem.populated && !barItem.populated,
+ "The 'foo' and 'bar' nodes should not be populated yet.");
+
+ fooItem.expand();
+ barItem.expand();
+ ok(fooItem.expanded && barItem.expanded,
+ "The 'foo' and 'bar' nodes should now be expanded.");
+ ok(!fooItem.populated,
+ "The 'foo' node should not be populated because it's empty.");
+ ok(barItem.populated,
+ "The 'bar' node should now be populated.");
+
+ let bazItem = barItem.getChild(0);
+ ok(!bazItem.expanded,
+ "The 'bar' node should not be expanded yet.");
+ ok(!bazItem.populated,
+ "The 'bar' node should not be populated yet.");
+
+ bazItem.expand();
+ ok(bazItem.expanded,
+ "The 'baz' node should now be expanded.");
+ ok(!bazItem.populated,
+ "The 'baz' node should not be populated because it's empty.");
+
+ ok(!treeRoot.getChild(-1) && !treeRoot.getChild(2),
+ "Calling `getChild` with out of bounds indices will return null (1).");
+ ok(!fooItem.getChild(-1) && !fooItem.getChild(0),
+ "Calling `getChild` with out of bounds indices will return null (2).");
+ ok(!barItem.getChild(-1) && !barItem.getChild(1),
+ "Calling `getChild` with out of bounds indices will return null (3).");
+ ok(!bazItem.getChild(-1) && !bazItem.getChild(0),
+ "Calling `getChild` with out of bounds indices will return null (4).");
+
+ // Finished expanding all nodes in the tree...
+ // Continue checking.
+
+ is(container.childNodes.length, 4,
+ "The container node should now have four children available.");
+ is(container.childNodes[0], treeRoot.target,
+ "The root node's target is a child of the container node.");
+ is(container.childNodes[1], fooItem.target,
+ "The 'foo' node's target is a child of the container node.");
+ is(container.childNodes[2], barItem.target,
+ "The 'bar' node's target is a child of the container node.");
+ is(container.childNodes[3], bazItem.target,
+ "The 'baz' node's target is a child of the container node.");
+
+ treeRoot.collapse();
+ is(container.childNodes.length, 1,
+ "The container node should now have one children available.");
+
+ ok(!treeRoot.expanded,
+ "The root node should not be expanded anymore.");
+ ok(fooItem.expanded && barItem.expanded && bazItem.expanded,
+ "The 'foo', 'bar' and 'baz' nodes should still be expanded.");
+ ok(treeRoot.populated && barItem.populated,
+ "The root and 'bar' nodes should still be populated.");
+ ok(!fooItem.populated && !bazItem.populated,
+ "The 'foo' and 'baz' nodes should still not be populated because they're empty.");
+
+ treeRoot.expand();
+ is(container.childNodes.length, 4,
+ "The container node should now have four children available again.");
+
+ ok(treeRoot.expanded && fooItem.expanded && barItem.expanded && bazItem.expanded,
+ "The root, 'foo', 'bar' and 'baz' nodes should now be reexpanded.");
+ ok(treeRoot.populated && barItem.populated,
+ "The root and 'bar' nodes should still be populated.");
+ ok(!fooItem.populated && !bazItem.populated,
+ "The 'foo' and 'baz' nodes should still not be populated because they're empty.");
+
+ // Test `focus` on the root node...
+
+ treeRoot.focus();
+ is(document.commandDispatcher.focusedElement, treeRoot.target,
+ "The root node is now focused.");
+
+ // Test `focus` on a leaf node...
+
+ bazItem.focus();
+ is(document.commandDispatcher.focusedElement, bazItem.target,
+ "The 'baz' node is now focused.");
+
+ // Test `remove`...
+
+ barItem.remove();
+ is(container.childNodes.length, 2,
+ "The container node should now have two children available.");
+ is(container.childNodes[0], treeRoot.target,
+ "The root node should be the first in the container node.");
+ is(container.childNodes[1], fooItem.target,
+ "The 'foo' node should be the second in the container node.");
+
+ fooItem.remove();
+ is(container.childNodes.length, 1,
+ "The container node should now have one children available.");
+ is(container.childNodes[0], treeRoot.target,
+ "The root node should be the only in the container node.");
+
+ treeRoot.remove();
+ is(container.childNodes.length, 0,
+ "The container node should now have no children available.");
+
+ container.remove();
+});