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

Commit b8d5094

Browse files
committed
Wrap provided objectClient function calls in try/catch blocks.
Since we don't know what the ObjectClient we get looks like, it might happens that it doesn't have the method we try to call (e.g. connecting to an older server, you will miss the enumSymbols function). Wrapping everything in try/catch blocks mitigate the risk of crashing the ObjectInspector (in the beforementioned case, everything will be fine except we wouldn't get symbol properties, which seems acceptable).
1 parent a57f3e5 commit b8d5094

File tree

2 files changed

+55
-20
lines changed

2 files changed

+55
-20
lines changed

packages/devtools-reps/src/object-inspector/tests/component/create-object-client.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,16 @@ describe("createObjectClient", () => {
8181
}));
8282
expect(createObjectClient.mock.calls[0][0]).toBe(grip);
8383
});
84+
85+
it("does not fail if the ObjectClient does not have the expected functions", () => {
86+
const stub = gripRepStubs.get("testMoreThanMaxProps");
87+
const root = createNode(null, "root", "/", {value: stub});
88+
89+
const createObjectClient = x => ({});
90+
mount(ObjectInspector({
91+
autoExpandDepth: 1,
92+
roots: [root],
93+
createObjectClient,
94+
}));
95+
});
8496
});

packages/devtools-reps/src/object-inspector/utils/client.js

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,47 +13,70 @@ async function enumIndexedProperties(
1313
objectClient: ObjectClient,
1414
start: ?number,
1515
end: ?number
16-
) : Promise<{ownProperties: Object}> {
17-
const {iterator} = await objectClient
18-
.enumProperties({ignoreNonIndexedProperties: true});
19-
const response = await iteratorSlice(iterator, start, end);
20-
return response;
16+
) : Promise<{ownProperties?: Object}> {
17+
try {
18+
const {iterator} = await objectClient
19+
.enumProperties({ignoreNonIndexedProperties: true});
20+
const response = await iteratorSlice(iterator, start, end);
21+
return response;
22+
} catch (e) {
23+
console.warn("Error in enumIndexedProperties", e);
24+
return {};
25+
}
2126
}
2227

2328
async function enumNonIndexedProperties(
2429
objectClient: ObjectClient,
2530
start: ?number,
2631
end: ?number
27-
) : Promise<{ownProperties: Object}> {
28-
const {iterator} = await objectClient.enumProperties({ignoreIndexedProperties: true});
29-
30-
const response = await iteratorSlice(iterator, start, end);
31-
return response;
32+
) : Promise<{ownProperties?: Object}> {
33+
try {
34+
const {iterator} = await objectClient.enumProperties({ignoreIndexedProperties: true});
35+
const response = await iteratorSlice(iterator, start, end);
36+
return response;
37+
} catch (e) {
38+
console.warn("Error in enumNonIndexedProperties", e);
39+
return {};
40+
}
3241
}
3342

3443
async function enumEntries(
3544
objectClient: ObjectClient,
3645
start: ?number,
3746
end: ?number
38-
) : Promise<{ownProperties: Object}> {
39-
const {iterator} = await objectClient.enumEntries();
40-
const response = await iteratorSlice(iterator, start, end);
41-
return response;
47+
) : Promise<{ownProperties?: Object}> {
48+
try {
49+
const {iterator} = await objectClient.enumEntries();
50+
const response = await iteratorSlice(iterator, start, end);
51+
return response;
52+
} catch (e) {
53+
console.warn("Error in enumEntries", e);
54+
return {};
55+
}
4256
}
4357

4458
async function enumSymbols(
4559
objectClient: ObjectClient,
4660
start: ?number,
4761
end: ?number
48-
) : Promise<{ownSymbols: Array<Object>}> {
49-
const {iterator} = await objectClient.enumSymbols();
50-
const response = await iteratorSlice(iterator, start, end);
51-
return response;
62+
) : Promise<{ownSymbols?: Array<Object>}> {
63+
try {
64+
const {iterator} = await objectClient.enumSymbols();
65+
const response = await iteratorSlice(iterator, start, end);
66+
return response;
67+
} catch (e) {
68+
console.warn("Error in enumSymbols", e);
69+
return {};
70+
}
5271
}
5372

54-
function getPrototype(
73+
async function getPrototype(
5574
objectClient: ObjectClient
56-
) : ?Promise<{prototype: Object}> {
75+
) : ?Promise<{prototype?: Object}> {
76+
if (typeof objectClient.getPrototype !== "function") {
77+
console.warn("objectClient.getPrototype is not a function");
78+
return Promise.resolve({});
79+
}
5780
return objectClient.getPrototype();
5881
}
5982

0 commit comments

Comments
 (0)