Skip to content

Commit 9a9ce0d

Browse files
JeanMechedylhunn
authored andcommitted
refactor(devtools): prevent exeception on state serializer (#55061)
`Object.getPrototypeOf(obj)` returns `null` if `obj` is an empty object. `Object.getOwnPropertyDescriptors` throws on `null`/`undefined` PR Close #55061
1 parent e02bcf8 commit 9a9ce0d

2 files changed

Lines changed: 9 additions & 1 deletion

File tree

‎devtools/projects/ng-devtools-backend/src/lib/state-serializer/object-utils.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ export function getKeys(obj: {}): string[] {
2121
obj = unwrapSignal(obj);
2222
const properties = Object.getOwnPropertyNames(obj);
2323

24-
const prototypeMembers = Object.getOwnPropertyDescriptors(Object.getPrototypeOf(obj));
24+
// Object.getPrototypeOf can return null, on empty objectwithout prototype for example
25+
const prototypeMembers = Object.getOwnPropertyDescriptors(Object.getPrototypeOf(obj) ?? {});
2526

2627
const ignoreList = ['__proto__'];
2728
const gettersAndSetters = Object.keys(prototypeMembers).filter((methodName) => {

‎devtools/projects/ng-devtools-backend/src/lib/state-serializer/state-serializer.spec.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,13 @@ describe('deeplySerializeSelectedProperties', () => {
531531
expect(getKeys(instance)).toEqual(['baz', 'foo', 'bar']);
532532
});
533533

534+
it('getKeys should not throw on empty object without prototype', () => {
535+
// creates an object without a prototype
536+
const instance = Object.create(null);
537+
538+
expect(getKeys(instance)).toEqual([]);
539+
});
540+
534541
it('getKeys would ignore getters and setters for "__proto__"', () => {
535542
const instance = {
536543
baz: 2,

0 commit comments

Comments
 (0)