| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script src="resources/audit-utilities.js"></script> |
| <script> |
| if (window.internals) |
| window.internals.settings.setUnhandledPromiseRejectionToConsoleEnabled(false); |
| |
| function test() |
| { |
| let savedResultCount = 0; |
| |
| let suite = InspectorTest.createAsyncSuite("Runtime.awaitPromise"); |
| |
| function addTest(name, expression, options = {}, callback) { |
| suite.addTestCase({ |
| name, |
| async test() { |
| let evaluateResponse = await RuntimeAgent.evaluate(expression); |
| InspectorTest.assert(evaluateResponse.result.type === "object"); |
| InspectorTest.assert(evaluateResponse.result.className === "Promise"); |
| |
| let awaitPromiseResponse = await RuntimeAgent.awaitPromise(evaluateResponse.result.objectId, options.returnByValue, options.generatePreview, options.saveResult); |
| |
| if (!awaitPromiseResponse.wasThrown && options.saveResult) |
| InspectorTest.assert(++savedResultCount === awaitPromiseResponse.savedResultIndex, "savedResultIndex should match."); |
| |
| await callback(WI.RemoteObject.fromPayload(awaitPromiseResponse.result), awaitPromiseResponse.wasThrown, awaitPromiseResponse.savedResultIndex); |
| }, |
| }); |
| } |
| |
| function addResolveTest(name, value, options = {}) { |
| let expression = `new Promise((resolve, reject) => setTimeout(resolve, 0, ${JSON.stringify(value)}))`; |
| addTest(name, expression, options, async (remoteObject, wasThrown) => { |
| InspectorTest.assert(!wasThrown, "There should be no error."); |
| if (options.returnByValue) { |
| if (value && typeof value === "object") |
| InspectorTest.expectShallowEqual(remoteObject.value, value, "The resolved value should be " + JSON.stringify(value)); |
| else |
| InspectorTest.expectEqual(remoteObject.value, value, "The resolved value should be " + JSON.stringify(value)); |
| } else { |
| InspectorTest.expectEqual(remoteObject.type, value.type, "The type should be " + value.type); |
| InspectorTest.expectEqual(remoteObject.subtype, value.subtype, "The subtype should be " + value.subtype); |
| InspectorTest.expectEqual(remoteObject.description, value.description, "The description should be " + value.description); |
| } |
| }); |
| } |
| |
| function addRejectTest(name, value, options = {}) { |
| let expression = `new Promise((resolve, reject) => setTimeout(reject, 0, ${JSON.stringify(value)}))`; |
| addTest(name, expression, options, async (remoteObject, wasThrown) => { |
| InspectorTest.assert(wasThrown, "There should be an error."); |
| if (value && typeof value === "object") { |
| let propertyDescriptors = await new Promise((resolve) => remoteObject.getPropertyDescriptorsAsObject(resolve)); |
| let properties = Array.isArray(value) ? [] : {}; |
| for (let key in value) |
| properties[key] = propertyDescriptors[key].value.value; |
| InspectorTest.expectShallowEqual(properties, value, "The rejected value should be " + JSON.stringify(value)); |
| } else |
| InspectorTest.expectEqual(remoteObject.value, value, "The rejected value should be " + JSON.stringify(value)); |
| }); |
| } |
| |
| addResolveTest("Runtime.awaitPromise.Resolve.Undefined", undefined, {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.Null", null, {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.Boolean", true, {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.Number", 42, {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.String", "foo", {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.Array", [0, 1], {returnByValue: true, saveResult: true}); |
| addResolveTest("Runtime.awaitPromise.Resolve.Object", {a: 1, b: 2}, {returnByValue: true, saveResult: true}); |
| |
| addTest("Runtime.awaitPromise.Resolve.Chain", `Promise.resolve(1).then(() => 2).then(() => 3)`, {returnByValue: true, saveResult: true}, async (remoteObject, wasThrown) => { |
| InspectorTest.assert(!wasThrown, "There should be no error."); |
| InspectorTest.expectEqual(remoteObject.value, 3, "The resolved value should be 3."); |
| }); |
| |
| addRejectTest("Runtime.awaitPromise.Reject.Undefined", undefined); |
| addRejectTest("Runtime.awaitPromise.Reject.Null", null); |
| addRejectTest("Runtime.awaitPromise.Reject.Boolean", true); |
| addRejectTest("Runtime.awaitPromise.Reject.Number", 42); |
| addRejectTest("Runtime.awaitPromise.Reject.String", "foo"); |
| addRejectTest("Runtime.awaitPromise.Reject.Array", [0, 1]); |
| addRejectTest("Runtime.awaitPromise.Reject.Object", {a: 1, b: 2}); |
| |
| addTest("Runtime.awaitPromise.Reject.Chain", `Promise.reject(1).catch(() => Promise.reject(2)).catch(() => Promise.reject(3))`, {}, async (remoteObject, wasThrown) => { |
| InspectorTest.assert(wasThrown, "There should be an error."); |
| InspectorTest.expectEqual(remoteObject.value, 3, "The rejected value should be 3."); |
| }); |
| |
| suite.addTestCase({ |
| name: "Runtime.awaitPromise.Error.NonPromiseObjectId", |
| test(resolve, reject) { |
| RuntimeAgent.evaluate("window") |
| .then((response) => RuntimeAgent.awaitPromise(response.result.objectId)) |
| .then((response) => { |
| InspectorTest.fail("Should not be able to call awaitPromise for a non-Promise object."); |
| resolve(); |
| }) |
| .catch((error) => { |
| InspectorTest.expectThat(error, "Should produce an error."); |
| InspectorTest.log("Error: " + error); |
| resolve(); |
| }); |
| }, |
| }); |
| |
| suite.addTestCase({ |
| name: "Runtime.awaitPromise.Error.InvalidPromiseObjectId", |
| test(resolve, reject) { |
| const promiseObjectId = "DOES_NOT_EXIST"; |
| RuntimeAgent.awaitPromise(promiseObjectId, (error) => { |
| InspectorTest.expectThat(error, "Should produce an error."); |
| InspectorTest.log("Error: " + error); |
| resolve(); |
| }); |
| }, |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <p>Tests functionality of Runtime.awaitPromise.</p> |
| </body> |
| </html> |