summaryrefslogtreecommitdiffstats
path: root/devtools/client/performance/test/browser_perf-tree-abstract-02.js
blob: 62db4cfd6de2684c1723381ae3affb9780b18e44 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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();
});