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

Commit c5cbfea

Browse files
committed
Fix issue with Object containing a __proto__ property.
This was caused because we used Object.assign which calls setters and stripped the __proto__ property. Fixes #986.
1 parent b6aa4ab commit c5cbfea

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

packages/devtools-reps/src/reps/grip.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ function propIterator(props, object, max) {
153153
let propertiesLength = getPropertiesLength(object);
154154

155155
if (object.preview && object.preview.safeGetterValues) {
156-
properties = Object.assign({}, properties, object.preview.safeGetterValues);
156+
properties = {...properties, ...object.preview.safeGetterValues};
157157
}
158158

159159
let indexes = getPropIndexes(properties, max, isInterestingProp);

packages/devtools-reps/src/reps/stubs/grip.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,4 +1004,43 @@ stubs.set("DeadObject", {
10041004
"sealed": false
10051005
});
10061006

1007+
// Packet for :
1008+
// var obj = Object.create(null); obj.__proto__ = []; obj;
1009+
stubs.set("ObjectWith__proto__Property", {
1010+
"type": "object",
1011+
"actor": "server1.conn1.child1/obj31",
1012+
"class": "Object",
1013+
"extensible": true,
1014+
"frozen": false,
1015+
"sealed": false,
1016+
"ownPropertyLength": 1,
1017+
"preview": {
1018+
"kind": "Object",
1019+
"ownProperties": {
1020+
["__proto__"]: {
1021+
"configurable": true,
1022+
"enumerable": true,
1023+
"writable": true,
1024+
"value": {
1025+
"type": "object",
1026+
"actor": "server1.conn1.child1/obj32",
1027+
"class": "Array",
1028+
"extensible": true,
1029+
"frozen": false,
1030+
"sealed": false,
1031+
"ownPropertyLength": 1,
1032+
"preview": {
1033+
"kind": "ArrayLike",
1034+
"length": 0
1035+
}
1036+
}
1037+
}
1038+
},
1039+
"ownSymbols": [],
1040+
"ownPropertiesLength": 1,
1041+
"ownSymbolsLength": 0,
1042+
"safeGetterValues": {}
1043+
}
1044+
});
1045+
10071046
module.exports = stubs;

packages/devtools-reps/src/reps/tests/grip.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
const { shallow } = require("enzyme");
88
const {
99
getRep,
10+
Rep,
1011
} = require("../rep");
1112
const Grip = require("../grip");
1213
const { MODE } = require("../constants");
@@ -21,9 +22,10 @@ const {
2122
const {maxLengthMap} = Grip;
2223

2324
function shallowRenderRep(object, props = {}) {
24-
return shallow(Grip.rep(Object.assign({
25+
return shallow(Grip.rep({
2526
object,
26-
}, props)));
27+
...props
28+
}));
2729
}
2830

2931
describe("Grip - empty object", () => {
@@ -603,3 +605,21 @@ describe("Grip - DeadObject object", () => {
603605
expect(renderRep({ mode: MODE.LONG }).text()).toBe(defaultOutput);
604606
});
605607
});
608+
609+
describe("Grip - Object with __proto__ property", () => {
610+
const object = stubs.get("ObjectWith__proto__Property");
611+
612+
it("correctly selects Grip Rep", () => {
613+
expect(getRep(object)).toBe(Grip.rep);
614+
});
615+
616+
it("renders as expected", () => {
617+
const renderRep = (props) => shallow(Rep({object, ...props}));
618+
const defaultOutput = "Object { __proto__: [] }";
619+
620+
expect(renderRep({ mode: undefined }).text()).toBe(defaultOutput);
621+
expect(renderRep({ mode: MODE.TINY }).text()).toBe("{…}");
622+
expect(renderRep({ mode: MODE.SHORT }).text()).toBe(defaultOutput);
623+
expect(renderRep({ mode: MODE.LONG }).text()).toBe(defaultOutput);
624+
});
625+
});

0 commit comments

Comments
 (0)