| // 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("Tests that Runtime.evaluate works with awaitPromise flag."); | 
 |  | 
 | contextGroup.addScript(` | 
 | function createPromiseAndScheduleResolve() | 
 | { | 
 |   var resolveCallback; | 
 |   var promise = new Promise((resolve) => resolveCallback = resolve); | 
 |   setTimeout(resolveCallback.bind(null, { a : 239 }), 0); | 
 |   return promise; | 
 | } | 
 |  | 
 | function throwError() | 
 | { | 
 |   function foo() { | 
 |     throw new Error('MyError'); | 
 |   } | 
 |   foo(); | 
 | } | 
 |  | 
 | function throwSyntaxError() | 
 | { | 
 |   function foo() { | 
 |     eval('}'); | 
 |   } | 
 |   foo(); | 
 | } | 
 | `); | 
 |  | 
 | InspectorTest.runAsyncTestSuite([ | 
 |   async function testResolvedPromise() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "Promise.resolve(239)", | 
 |       awaitPromise: true, | 
 |       generatePreview: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testRejectedPromise() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "Promise.reject(239)", | 
 |       awaitPromise: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testRejectedPromiseWithError() | 
 |   { | 
 |     Protocol.Runtime.enable(); | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "Promise.resolve().then(throwError)", | 
 |       awaitPromise: true | 
 |     })); | 
 |     await Protocol.Runtime.disable(); | 
 |   }, | 
 |  | 
 |   async function testRejectedPromiseWithSyntaxError() | 
 |   { | 
 |     Protocol.Runtime.enable(); | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "Promise.resolve().then(throwSyntaxError)", | 
 |       awaitPromise: true | 
 |     })); | 
 |     await Protocol.Runtime.disable(); | 
 |   }, | 
 |  | 
 |   async function testPrimitiveValueInsteadOfPromise() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "true", | 
 |       awaitPromise: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testObjectInsteadOfPromise() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "({})", | 
 |       awaitPromise: true, | 
 |       returnByValue: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testPendingPromise() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "createPromiseAndScheduleResolve()", | 
 |       awaitPromise: true, | 
 |       returnByValue: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testExceptionInEvaluate() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: "throw 239", | 
 |       awaitPromise: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testThenableJob() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: '({then: resolve => resolve(42)})', | 
 |       awaitPromise: true})); | 
 |   }, | 
 |  | 
 |   async function testLastEvaluatedResult() | 
 |   { | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: 'Promise.resolve(42)', | 
 |       awaitPromise: true, | 
 |       objectGroup: 'console' | 
 |     })); | 
 |     InspectorTest.logMessage(await Protocol.Runtime.evaluate({ | 
 |       expression: '$_', | 
 |       includeCommandLineAPI: true | 
 |     })); | 
 |   }, | 
 |  | 
 |   async function testRuntimeDisable() | 
 |   { | 
 |     await Protocol.Runtime.enable(); | 
 |     Protocol.Runtime.evaluate({ | 
 |       expression: 'new Promise(r1 => r = r1)', | 
 |       awaitPromise: true }).then(InspectorTest.logMessage); | 
 |     await Protocol.Runtime.disable(); | 
 |     InspectorTest.log('Resolving promise..'); | 
 |     await Protocol.Runtime.evaluate({expression: 'r({a:1})'}); | 
 |     InspectorTest.log('Promise resolved'); | 
 |   }, | 
 |  | 
 |   async function testImmediatelyResolvedAfterAfterContextDestroyed() | 
 |   { | 
 |     Protocol.Runtime.evaluate({ | 
 |       expression: 'new Promise(() => 42)', | 
 |       awaitPromise: true }).then(InspectorTest.logMessage); | 
 |     InspectorTest.log('Destroying context..'); | 
 |     await Protocol.Runtime.evaluate({expression: 'inspector.fireContextDestroyed()'}); | 
 |     InspectorTest.log('Context destroyed'); | 
 |     InspectorTest.log('Triggering weak callback..'); | 
 |     await Protocol.HeapProfiler.collectGarbage(); | 
 |   } | 
 | ]); |