// 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()
{
    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);
        }
    };
    return new Proxy({ a : 1}, handler);
}`);

Protocol.Runtime.evaluate({ expression: "testFunction()"}).then(requestProperties);

function requestProperties(result)
{
  Protocol.Runtime.getProperties({ objectId: result.result.objectId, generatePreview: true }).then(checkCounter);
}

function checkCounter(result)
{
  Protocol.Runtime.evaluate({ expression: "self.counter" }).then(dumpCounter);
}

function dumpCounter(result)
{
  InspectorTest.logMessage(result);
  InspectorTest.completeTest();
}