// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. let {session, contextGroup, Protocol} = InspectorTest.start("Check that while Runtime.getProperties call on proxy object no user defined trap will be executed."); contextGroup.addScript(` var self = this; function testFunction(revocable) { self.counter = 0; var handler = { get: function(target, name){ self.counter++; return Reflect.get.apply(this, arguments); }, set: function(target, name){ self.counter++; return Reflect.set.apply(this, arguments); }, getPrototypeOf: function(target) { self.counter++; return Reflect.getPrototypeOf.apply(this, arguments); }, setPrototypeOf: function(target) { self.counter++; return Reflect.setPrototypeOf.apply(this, arguments); }, isExtensible: function(target) { self.counter++; return Reflect.isExtensible.apply(this, arguments); }, isExtensible: function(target) { self.counter++; return Reflect.isExtensible.apply(this, arguments); }, isExtensible: function(target) { self.counter++; return Reflect.isExtensible.apply(this, arguments); }, preventExtensions: function() { self.counter++; return Reflect.preventExtensions.apply(this, arguments); }, getOwnPropertyDescriptor: function() { self.counter++; return Reflect.getOwnPropertyDescriptor.apply(this, arguments); }, defineProperty: function() { self.counter++; return Reflect.defineProperty.apply(this, arguments); }, has: function() { self.counter++; return Reflect.has.apply(this, arguments); }, get: function() { self.counter++; return Reflect.get.apply(this, arguments); }, set: function() { self.counter++; return Reflect.set.apply(this, arguments); }, deleteProperty: function() { self.counter++; return Reflect.deleteProperty.apply(this, arguments); }, ownKeys: function() { self.counter++; return Reflect.ownKeys.apply(this, arguments); }, apply: function() { self.counter++; return Reflect.apply.apply(this, arguments); }, construct: function() { self.counter++; return Reflect.construct.apply(this, arguments); } }; var obj = { a : 1 }; if (revocable) { var revocableProxy = Proxy.revocable(obj, handler); return [revocableProxy.proxy, revocableProxy.revoke] } else { return new Proxy(obj, handler); } }`); function getArrayElement(arrayObjectId, idx) { return Protocol.Runtime.callFunctionOn({ functionDeclaration: `function() { return this[${idx}]; }`, objectId: arrayObjectId }); } async function testRegular() { InspectorTest.logMessage("Testing regular Proxy"); var result = await Protocol.Runtime.evaluate({ expression: "testFunction(false)", generatePreview: true }); InspectorTest.logMessage(result); var proxyId = result.result.result.objectId; InspectorTest.logMessage(await Protocol.Runtime.getProperties({ objectId: proxyId, generatePreview: true })); } async function testRevocable() { InspectorTest.logMessage("Testing revocable Proxy"); var result = await Protocol.Runtime.evaluate({ expression: "testFunction(true)" }); var proxyInfo = await getArrayElement(result.result.result.objectId, 0); var revokeInfo = await getArrayElement(result.result.result.objectId, 1); var proxyId = proxyInfo.result.result.objectId; InspectorTest.logMessage(await Protocol.Runtime.callFunctionOn({ functionDeclaration: `function() { return this; }`, objectId: proxyId, generatePreview: true })) InspectorTest.logMessage(await Protocol.Runtime.getProperties({ objectId: proxyId, generatePreview: true })); await Protocol.Runtime.callFunctionOn({ functionDeclaration: `function() { this(); }`, objectId: revokeInfo.result.result.objectId }); InspectorTest.logMessage(await Protocol.Runtime.callFunctionOn({ functionDeclaration: `function() { return this; }`, objectId: proxyId, generatePreview: true })) InspectorTest.logMessage(await Protocol.Runtime.getProperties({ objectId: proxyId, generatePreview: true })); } async function checkCounter() { InspectorTest.logMessage("Checking counter"); var result = await Protocol.Runtime.evaluate({ expression: "self.counter" }); InspectorTest.logMessage(result); } (async function test() { await testRegular(); await testRevocable(); await checkCounter(); InspectorTest.completeTest(); })();