From 16954b49fdd10fbacf498e0b1fcc39b89936a85d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 10 Feb 2020 11:20:48 +0100 Subject: [PATCH] debt - careful with proxy, use type PropertyKey and not string --- .../workbench/api/common/extHostConfiguration.ts | 16 ++++++++-------- .../services/extensions/common/rpcProtocol.ts | 4 ++-- .../extensions/worker/extHost.services.ts | 2 +- .../test/browser/api/testRPCProtocol.ts | 5 +++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/vs/workbench/api/common/extHostConfiguration.ts b/src/vs/workbench/api/common/extHostConfiguration.ts index fb681cdc1b5..5c90db67dbf 100644 --- a/src/vs/workbench/api/common/extHostConfiguration.ts +++ b/src/vs/workbench/api/common/extHostConfiguration.ts @@ -198,7 +198,7 @@ export class ExtHostConfigProvider { }; return isObject(target) ? new Proxy(target, { - get: (target: any, property: string) => { + get: (target: any, property: PropertyKey) => { if (typeof property === 'string' && property.toLowerCase() === 'tojson') { cloneTarget(); return () => clonedTarget; @@ -213,21 +213,21 @@ export class ExtHostConfigProvider { } return result; }, - set: (_target: any, property: string, value: any) => { + set: (_target: any, property: PropertyKey, value: any) => { cloneTarget(); if (clonedTarget) { clonedTarget[property] = value; } return true; }, - deleteProperty: (_target: any, property: string) => { + deleteProperty: (_target: any, property: PropertyKey) => { cloneTarget(); if (clonedTarget) { delete clonedTarget[property]; } return true; }, - defineProperty: (_target: any, property: string, descriptor: any) => { + defineProperty: (_target: any, property: PropertyKey, descriptor: any) => { cloneTarget(); if (clonedTarget) { Object.defineProperty(clonedTarget, property, descriptor); @@ -284,10 +284,10 @@ export class ExtHostConfigProvider { const readonlyProxy = (target: any): any => { return isObject(target) ? new Proxy(target, { - get: (target: any, property: string) => readonlyProxy(target[property]), - set: (_target: any, property: string, _value: any) => { throw new Error(`TypeError: Cannot assign to read only property '${property}' of object`); }, - deleteProperty: (_target: any, property: string) => { throw new Error(`TypeError: Cannot delete read only property '${property}' of object`); }, - defineProperty: (_target: any, property: string) => { throw new Error(`TypeError: Cannot define property '${property}' for a readonly object`); }, + get: (target: any, property: PropertyKey) => readonlyProxy(target[property]), + set: (_target: any, property: PropertyKey, _value: any) => { throw new Error(`TypeError: Cannot assign to read only property '${String(property)}' of object`); }, + deleteProperty: (_target: any, property: PropertyKey) => { throw new Error(`TypeError: Cannot delete read only property '${String(property)}' of object`); }, + defineProperty: (_target: any, property: PropertyKey) => { throw new Error(`TypeError: Cannot define property '${String(property)}' for a readonly object`); }, setPrototypeOf: (_target: any) => { throw new Error(`TypeError: Cannot set prototype for a readonly object`); }, isExtensible: () => false, preventExtensions: () => true diff --git a/src/vs/workbench/services/extensions/common/rpcProtocol.ts b/src/vs/workbench/services/extensions/common/rpcProtocol.ts index d1464a513a3..c7d7600c6df 100644 --- a/src/vs/workbench/services/extensions/common/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/common/rpcProtocol.ts @@ -180,8 +180,8 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { private _createProxy(rpcId: number): T { let handler = { - get: (target: any, name: string) => { - if (!target[name] && name.charCodeAt(0) === CharCode.DollarSign) { + get: (target: any, name: PropertyKey) => { + if (typeof name === 'string' && !target[name] && name.charCodeAt(0) === CharCode.DollarSign) { target[name] = (...myArgs: any[]) => { return this._remoteCall(rpcId, name, myArgs); }; diff --git a/src/vs/workbench/services/extensions/worker/extHost.services.ts b/src/vs/workbench/services/extensions/worker/extHost.services.ts index bbb72e9511c..90568629458 100644 --- a/src/vs/workbench/services/extensions/worker/extHost.services.ts +++ b/src/vs/workbench/services/extensions/worker/extHost.services.ts @@ -43,7 +43,7 @@ function NotImplementedProxy(name: ServiceIdentifier): { new(): T } { return class { constructor() { return new Proxy({}, { - get(target: any, prop: string | number) { + get(target: any, prop: PropertyKey) { if (target[prop]) { return target[prop]; } diff --git a/src/vs/workbench/test/browser/api/testRPCProtocol.ts b/src/vs/workbench/test/browser/api/testRPCProtocol.ts index 7f8fc49d50e..16673942bd6 100644 --- a/src/vs/workbench/test/browser/api/testRPCProtocol.ts +++ b/src/vs/workbench/test/browser/api/testRPCProtocol.ts @@ -79,12 +79,13 @@ export class TestRPCProtocol implements IExtHostContext, IExtHostRpcService { private _createProxy(proxyId: string): T { let handler = { - get: (target: any, name: string) => { - if (!target[name] && name.charCodeAt(0) === CharCode.DollarSign) { + get: (target: any, name: PropertyKey) => { + if (typeof name === 'string' && !target[name] && name.charCodeAt(0) === CharCode.DollarSign) { target[name] = (...myArgs: any[]) => { return this._remoteCall(proxyId, name, myArgs); }; } + return target[name]; } };