Skip to content
This repository was archived by the owner on Sep 21, 2021. It is now read-only.

Commit e0cf2f0

Browse files
committed
Move the function related to load properties to their own file
1 parent 2fd4ad7 commit e0cf2f0

File tree

4 files changed

+208
-160
lines changed

4 files changed

+208
-160
lines changed

packages/devtools-reps/src/object-inspector/index.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ const {
2222
MODE,
2323
} = require("../reps/constants");
2424

25+
const Utils = require("./utils");
26+
2527
const {
2628
getChildren,
2729
getClosestGripNode,
@@ -39,8 +41,11 @@ const {
3941
nodeIsPrototype,
4042
nodeIsSetter,
4143
nodeIsWindow,
44+
} = Utils.node;
45+
46+
const {
4247
loadItemProperties,
43-
} = require("./utils/node");
48+
} = Utils.loadProperties;
4449

4550
import type {
4651
CachedNodes,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
const client = require("./client");
6+
const loadProperties = require("./load-properties");
7+
const node = require("./node");
8+
9+
module.exports = {
10+
client,
11+
loadProperties,
12+
node,
13+
};
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
/* This Source Code Form is subject to the terms of the Mozilla Public
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this
3+
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4+
5+
const {
6+
enumEntries,
7+
enumIndexedProperties,
8+
enumNonIndexedProperties,
9+
getPrototype,
10+
enumSymbols,
11+
} = require("./client");
12+
13+
const {
14+
getClosestGripNode,
15+
getClosestNonBucketNode,
16+
getValue,
17+
nodeHasAccessors,
18+
nodeHasAllEntriesInPreview,
19+
nodeHasProperties,
20+
nodeIsBucket,
21+
nodeIsDefaultProperties,
22+
nodeIsEntries,
23+
nodeIsMapEntry,
24+
nodeIsPrimitive,
25+
nodeIsProxy,
26+
nodeNeedsNumericalBuckets,
27+
} = require("./node");
28+
29+
import type {
30+
GripProperties,
31+
LoadedProperties,
32+
Node,
33+
NodeContents,
34+
ObjectClient,
35+
RdpGrip,
36+
} from "../types";
37+
38+
function loadItemProperties(
39+
item: Node,
40+
createObjectClient: (RdpGrip | NodeContents) => ObjectClient,
41+
loadedProperties: LoadedProperties
42+
) : Promise<GripProperties> | null {
43+
const [start, end] = item.meta
44+
? [item.meta.startIndex, item.meta.endIndex]
45+
: [];
46+
47+
let objectClient;
48+
const getObjectClient = () => {
49+
if (objectClient) {
50+
return objectClient;
51+
}
52+
53+
const gripItem = getClosestGripNode(item);
54+
const value = getValue(gripItem);
55+
return createObjectClient(value);
56+
};
57+
58+
let loadingPromises = [];
59+
if (shouldLoadItemIndexedProperties(item, loadedProperties)) {
60+
loadingPromises.push(enumIndexedProperties(getObjectClient(), start, end));
61+
}
62+
63+
if (shouldLoadItemNonIndexedProperties(item, loadedProperties)) {
64+
loadingPromises.push(enumNonIndexedProperties(getObjectClient(), start, end));
65+
}
66+
67+
if (shouldLoadItemEntries(item, loadedProperties)) {
68+
loadingPromises.push(enumEntries(getObjectClient(), start, end));
69+
}
70+
71+
if (shouldLoadItemPrototype(item, loadedProperties)) {
72+
loadingPromises.push(getPrototype(getObjectClient()));
73+
}
74+
75+
if (shouldLoadItemSymbols(item, loadedProperties)) {
76+
loadingPromises.push(enumSymbols(getObjectClient(), start, end));
77+
}
78+
79+
if (loadingPromises.length === 0) {
80+
return null;
81+
}
82+
83+
return Promise.all(loadingPromises)
84+
.then(responses => responses.reduce((accumulator, res) => {
85+
// Let's loop through the responses to build a single response object.
86+
Object.entries(res).forEach(([k, v]) => {
87+
if (accumulator.hasOwnProperty(k)) {
88+
if (Array.isArray(accumulator[k])) {
89+
accumulator[k].push(...v);
90+
} else if (typeof accumulator[k] === "object") {
91+
accumulator[k] = Object.assign({}, accumulator[k], v);
92+
}
93+
} else {
94+
accumulator[k] = v;
95+
}
96+
});
97+
return accumulator;
98+
}, {}));
99+
}
100+
101+
function shouldLoadItemIndexedProperties(
102+
item: Node,
103+
loadedProperties: LoadedProperties = new Map()
104+
) : boolean {
105+
const gripItem = getClosestGripNode(item);
106+
const value = getValue(gripItem);
107+
108+
return value
109+
&& nodeHasProperties(gripItem)
110+
&& !loadedProperties.has(item.path)
111+
&& !nodeIsProxy(item)
112+
&& !nodeNeedsNumericalBuckets(item)
113+
&& !nodeIsEntries(getClosestNonBucketNode(item))
114+
// The data is loaded when expanding the window node.
115+
&& !nodeIsDefaultProperties(item);
116+
}
117+
118+
function shouldLoadItemNonIndexedProperties(
119+
item: Node,
120+
loadedProperties: LoadedProperties = new Map()
121+
) : boolean {
122+
const gripItem = getClosestGripNode(item);
123+
const value = getValue(gripItem);
124+
125+
return value
126+
&& nodeHasProperties(gripItem)
127+
&& !loadedProperties.has(item.path)
128+
&& !nodeIsProxy(item)
129+
&& !nodeIsEntries(getClosestNonBucketNode(item))
130+
&& !nodeIsBucket(item)
131+
// The data is loaded when expanding the window node.
132+
&& !nodeIsDefaultProperties(item);
133+
}
134+
135+
function shouldLoadItemEntries(
136+
item: Node,
137+
loadedProperties: LoadedProperties = new Map()
138+
) : boolean {
139+
const gripItem = getClosestGripNode(item);
140+
const value = getValue(gripItem);
141+
142+
return value
143+
&& nodeIsEntries(getClosestNonBucketNode(item))
144+
&& !nodeHasAllEntriesInPreview(gripItem)
145+
&& !loadedProperties.has(item.path)
146+
&& !nodeNeedsNumericalBuckets(item);
147+
}
148+
149+
function shouldLoadItemPrototype(
150+
item: Node,
151+
loadedProperties: LoadedProperties = new Map()
152+
) : boolean {
153+
const value = getValue(item);
154+
155+
return value
156+
&& !loadedProperties.has(item.path)
157+
&& !nodeIsBucket(item)
158+
&& !nodeIsMapEntry(item)
159+
&& !nodeIsEntries(item)
160+
&& !nodeIsDefaultProperties(item)
161+
&& !nodeHasAccessors(item)
162+
&& !nodeIsPrimitive(item);
163+
}
164+
165+
function shouldLoadItemSymbols(
166+
item: Node,
167+
loadedProperties: LoadedProperties = new Map()
168+
) : boolean {
169+
const value = getValue(item);
170+
171+
return value
172+
&& !loadedProperties.has(item.path)
173+
&& !nodeIsBucket(item)
174+
&& !nodeIsMapEntry(item)
175+
&& !nodeIsEntries(item)
176+
&& !nodeIsDefaultProperties(item)
177+
&& !nodeHasAccessors(item)
178+
&& !nodeIsPrimitive(item)
179+
&& !nodeIsProxy(item);
180+
}
181+
182+
module.exports = {
183+
loadItemProperties,
184+
shouldLoadItemEntries,
185+
shouldLoadItemIndexedProperties,
186+
shouldLoadItemNonIndexedProperties,
187+
shouldLoadItemPrototype,
188+
shouldLoadItemSymbols,
189+
};

0 commit comments

Comments
 (0)