| Index: test/inspector/runtime/get-properties.js | 
| diff --git a/test/inspector/runtime/get-properties.js b/test/inspector/runtime/get-properties.js | 
| index af5e8a67b5a081bb8f0544e05f0e7dc0c9f8bed1..2c1222b5818877a0e4529425727b47ddff41d1d7 100644 | 
| --- a/test/inspector/runtime/get-properties.js | 
| +++ b/test/inspector/runtime/get-properties.js | 
| @@ -2,235 +2,73 @@ | 
| // Use of this source code is governed by a BSD-style license that can be | 
| // found in the LICENSE file. | 
|  | 
| -// A general-purpose engine for sending a sequence of protocol commands. | 
| -// The clients provide requests and response handlers, while the engine catches | 
| -// errors and makes sure that once there's nothing to do completeTest() is called. | 
| -// @param step is an object with command, params and callback fields | 
| -function runRequestSeries(step) | 
| -{ | 
| -  processStep(step); | 
| - | 
| -  function processStep(s) | 
| -  { | 
| -    try { | 
| -      processStepOrFail(s); | 
| -    } catch (e) { | 
| -      InspectorTest.log(e.stack); | 
| -      InspectorTest.completeTest(); | 
| -    } | 
| -  } | 
| - | 
| -  function processStepOrFail(s) | 
| -  { | 
| -    if (!s) { | 
| -      InspectorTest.completeTest(); | 
| -      return; | 
| -    } | 
| -    if (!s.command) { | 
| -      // A simple loopback step. | 
| -      var next = s.callback(); | 
| -      processStep(next); | 
| -      return; | 
| -    } | 
| - | 
| -    var innerCallback = function(response) | 
| -    { | 
| -      if ("error" in response) { | 
| -        InspectorTest.log(response.error.message); | 
| -        InspectorTest.completeTest(); | 
| -        return; | 
| -      } | 
| -      var next; | 
| -      try { | 
| -        next = s.callback(response.result); | 
| -      } catch (e) { | 
| -        InspectorTest.log(e.stack); | 
| -        InspectorTest.completeTest(); | 
| -        return; | 
| -      } | 
| -      processStep(next); | 
| -    } | 
| -    var command = s.command.split("."); | 
| -    Protocol[command[0]][command[1]](s.params).then(innerCallback); | 
| -  } | 
| -} | 
| - | 
| -var firstStep = { callback: callbackStart5 }; | 
| - | 
| -runRequestSeries(firstStep); | 
| - | 
| -// 'Object5' section -- check properties of '5' wrapped as object  (has an internal property). | 
| - | 
| -function callbackStart5() | 
| -{ | 
| -  // Create an wrapper object with additional property. | 
| -  var expression = "(function(){var r = Object(5); r.foo = 'cat';return r;})()"; | 
| - | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEval5 }; | 
| -} | 
| -function callbackEval5(result) | 
| -{ | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true}, callback: callbackProperties5 | 
| -  }; | 
| -} | 
| -function callbackProperties5(result) | 
| -{ | 
| -  logGetPropertiesResult("Object(5)", result); | 
| -  return { callback: callbackStartNotOwn }; | 
| -} | 
| - | 
| - | 
| -// 'Not own' section -- check all properties of the object, including ones from it prototype chain. | 
| - | 
| -function callbackStartNotOwn() | 
| -{ | 
| -  // Create an wrapper object with additional property. | 
| -  var expression = "({ a: 2, set b(_) {}, get b() {return 5;}, __proto__: { a: 3, c: 4, get d() {return 6;} }})"; | 
| - | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalNotOwn }; | 
| -} | 
| -function callbackEvalNotOwn(result) | 
| -{ | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: false}, callback: callbackPropertiesNotOwn | 
| -  }; | 
| -} | 
| -function callbackPropertiesNotOwn(result) | 
| -{ | 
| -  logGetPropertiesResult("Not own properties", result); | 
| -  return { callback: callbackStartAccessorsOnly }; | 
| -} | 
| - | 
| - | 
| -// 'Accessors only' section -- check only accessor properties of the object. | 
| - | 
| -function callbackStartAccessorsOnly() | 
| -{ | 
| -  // Create an wrapper object with additional property. | 
| -  var expression = "({ a: 2, set b(_) {}, get b() {return 5;}, c: 'c', set d(_){} })"; | 
| - | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalAccessorsOnly }; | 
| -} | 
| -function callbackEvalAccessorsOnly(result) | 
| -{ | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true, accessorPropertiesOnly: true}, callback: callbackPropertiesAccessorsOnly | 
| -  }; | 
| -} | 
| -function callbackPropertiesAccessorsOnly(result) | 
| -{ | 
| -  logGetPropertiesResult("Accessor only properties", result); | 
| -  return { callback: callbackStartArray }; | 
| -} | 
| - | 
| - | 
| -// 'Array' section -- check properties of an array. | 
| - | 
| -function callbackStartArray() | 
| -{ | 
| -  var expression = "['red', 'green', 'blue']"; | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalArray }; | 
| -} | 
| -function callbackEvalArray(result) | 
| -{ | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true}, callback: callbackPropertiesArray | 
| -  }; | 
| -} | 
| -function callbackPropertiesArray(result) | 
| -{ | 
| -  logGetPropertiesResult("array", result); | 
| -  return { callback: callbackStartBound }; | 
| -} | 
| - | 
| - | 
| -// 'Bound' section -- check properties of a bound function (has a bunch of internal properties). | 
| - | 
| -function callbackStartBound() | 
| -{ | 
| -  var expression = "Number.bind({}, 5)"; | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalBound }; | 
| -} | 
| -function callbackEvalBound(result) | 
| -{ | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true}, callback: callbackPropertiesBound | 
| -  }; | 
| -} | 
| -function callbackPropertiesBound(result) | 
| -{ | 
| -  logGetPropertiesResult("Bound function", result); | 
| -  return { callback: callbackStartObjectThrowsLength }; | 
| -} | 
| - | 
| - | 
| -// Object throws on length access | 
| - | 
| -function callbackStartObjectThrowsLength() { | 
| -  var expression = "({get length() { throw 'Length called'; }})"; | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalObjectThrowsLength }; | 
| -} | 
| -function callbackEvalObjectThrowsLength(result) { | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true}, callback: callbackPropertiesObjectThrowsLength | 
| -  }; | 
| -} | 
| -function callbackPropertiesObjectThrowsLength(result) { | 
| -  logGetPropertiesResult("Object that throws on length access", result); | 
| -  return { callback: callbackStartTypedArrayWithoutLength }; | 
| -} | 
| - | 
| - | 
| -// Typed array without length | 
| - | 
| -function callbackStartTypedArrayWithoutLength() { | 
| -  var expression = "({__proto__: Uint8Array.prototype})"; | 
| -  return { command: "Runtime.evaluate", params: {expression: expression}, callback: callbackEvalTypedArrayWithoutLength }; | 
| -} | 
| -function callbackEvalTypedArrayWithoutLength(result) { | 
| -  var id = result.result.objectId; | 
| -  if (id === undefined) | 
| -    throw new Error("objectId is expected"); | 
| -  return { | 
| -    command: "Runtime.getProperties", params: {objectId: id, ownProperties: true}, callback: callbackPropertiesTypedArrayWithoutLength | 
| -  }; | 
| -} | 
| -function callbackPropertiesTypedArrayWithoutLength(result) { | 
| -  logGetPropertiesResult("TypedArray without length", result); | 
| -  return; // End of test | 
| -} | 
| - | 
| -// A helper function that dumps object properties and internal properties in sorted order. | 
| -function logGetPropertiesResult(title, protocolResult) | 
| -{ | 
| -  function hasGetterSetter(property, fieldName) | 
| -  { | 
| +InspectorTest.log('Checks Runtime.getProperties method'); | 
| + | 
| +InspectorTest.runAsyncTestSuite([ | 
| +  async function testObject5() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '(function(){var r = Object(5); r.foo = \'cat\';return r;})()' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testNotOwn() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '({ a: 2, set b(_) {}, get b() {return 5;}, __proto__: { a: 3, c: 4, get d() {return 6;} }})' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: false }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testAccessorsOnly() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '({ a: 2, set b(_) {}, get b() {return 5;}, c: \'c\', set d(_){} })' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true, accessorPropertiesOnly: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testArray() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '[\'red\', \'green\', \'blue\']' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testBound() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: 'Number.bind({}, 5)' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testObjectThrowsLength() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '({get length() { throw \'Length called\'; }})' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| + | 
| +  async function testTypedArrayWithoutLength() { | 
| +    let objectId = (await Protocol.Runtime.evaluate({ | 
| +      expression: '({__proto__: Uint8Array.prototype})' | 
| +    })).result.result.objectId; | 
| +    let props = await Protocol.Runtime.getProperties({ objectId, ownProperties: true }); | 
| +    logGetPropertiesResult(props.result); | 
| +  }, | 
| +]); | 
| + | 
| +function logGetPropertiesResult(protocolResult) { | 
| +  function hasGetterSetter(property, fieldName) { | 
| var v = property[fieldName]; | 
| -    if (!v) | 
| -      return false; | 
| +    if (!v) return false; | 
| return v.type !== "undefined" | 
| } | 
|  | 
| -  InspectorTest.log("Properties of " + title); | 
| var propertyArray = protocolResult.result; | 
| propertyArray.sort(NamedThingComparator); | 
| for (var i = 0; i < propertyArray.length; i++) { | 
| @@ -254,8 +92,7 @@ function logGetPropertiesResult(title, protocolResult) | 
| } | 
| } | 
|  | 
| -  function NamedThingComparator(o1, o2) | 
| -  { | 
| +  function NamedThingComparator(o1, o2) { | 
| return o1.name === o2.name ? 0 : (o1.name < o2.name ? -1 : 1); | 
| } | 
| } | 
|  |