diff options
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.js | 138 |
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(); +}); |