Skip to content

Commit

Permalink
fix incompatible receiver error
Browse files Browse the repository at this point in the history
  • Loading branch information
mbostock committed Jan 20, 2021
1 parent ed6eb87 commit 6e23b65
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 8 deletions.
18 changes: 14 additions & 4 deletions src/collapsed.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,21 @@ export default function inspectCollapsed(object, shallow, name, proto) {
let tag, fields, next, n;

if (object instanceof Map) {
tag = `Map(${object.size})`;
fields = iterateMap;
if (object instanceof object.constructor) {
tag = `Map(${object.size})`;
fields = iterateMap;
} else { // avoid incompatible receiver error for prototype
tag = "Map()";
fields = iterateObject;
}
} else if (object instanceof Set) {
tag = `Set(${object.size})`;
fields = iterateSet;
if (object instanceof object.constructor) {
tag = `Set(${object.size})`;
fields = iterateSet;
} else { // avoid incompatible receiver error for prototype
tag = "Set()";
fields = iterateObject;
}
} else if (arrayish) {
tag = `${object.constructor.name}(${object.length})`;
fields = iterateArray;
Expand Down
18 changes: 14 additions & 4 deletions src/expanded.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,21 @@ export default function inspectExpanded(object, _, name, proto) {
let tag, fields, next, n;

if (object instanceof Map) {
tag = `Map(${object.size})`;
fields = iterateMap;
if (object instanceof object.constructor) {
tag = `Map(${object.size})`;
fields = iterateMap;
} else { // avoid incompatible receiver error for prototype
tag = "Map()";
fields = iterateObject;
}
} else if (object instanceof Set) {
tag = `Set(${object.size})`;
fields = iterateSet;
if (object instanceof object.constructor) {
tag = `Set(${object.size})`;
fields = iterateSet;
} else { // avoid incompatible receiver error for prototype
tag = "Set()";
fields = iterateObject;
}
} else if (arrayish) {
tag = `${object.constructor.name}(${object.length})`;
fields = iterateArray;
Expand Down
62 changes: 62 additions & 0 deletions test/__snapshots__/inspector.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -774,3 +774,65 @@ hi
</div>
</div>
`;
exports[`map and set proto map proto 1`] = `
<div>
<div
class="observablehq"
>
<span
class="observablehq--collapsed observablehq--inspect"
>
<a>
<svg
class="observablehq--caret"
height="8"
width="8"
>
<path
d="M7 4L1 8V0z"
fill="currentColor"
/>
</svg>
Map() {
</a>
}
</span>
</div>
</div>
`;
exports[`map and set proto set proto 1`] = `
<div>
<div
class="observablehq"
>
<span
class="observablehq--collapsed observablehq--inspect"
>
<a>
<svg
class="observablehq--caret"
height="8"
width="8"
>
<path
d="M7 4L1 8V0z"
fill="currentColor"
/>
</svg>
Set() {
</a>
}
</span>
</div>
</div>
`;
17 changes: 17 additions & 0 deletions test/inspector.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,23 @@ describe("into", () => {
});
});

describe("map and set proto", () => {
test("map proto", () => {
class SubMap extends Map {}
const container = document.createElement("div");
const inspector = Inspector.into(container)();
inspector.fulfilled(Object.getPrototypeOf(new SubMap()));
expect(container).toMatchSnapshot();
});
test("set proto", () => {
class SubSet extends Set {}
const container = document.createElement("div");
const inspector = Inspector.into(container)();
inspector.fulfilled(Object.getPrototypeOf(new SubSet()));
expect(container).toMatchSnapshot();
});
});

describe("immutable", () => {
let inspector, elem;
beforeEach(() => {
Expand Down

0 comments on commit 6e23b65

Please sign in to comment.