<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script src="../../http/tests/inspector/resources/stable-id-map.js"></script>
<script>
function createIsolatedWorld() {
    const name = "InspectorTestInternalIsolatedWorld";
    function source() { return 42; }

    if (window.internals)
        window.internals.evaluateInWorldIgnoringException(name, source.toString());
}

function test()
{
    ProtocolTest.debug();

    let suite = ProtocolTest.createAsyncSuite("Runtime.executionContextCreated.IsolatedWorld");

    suite.addTestCase({
        name: "Runtime.executionContextCreated.IsolatedWorld.Internal",
        description: "Test that Runtime.executionContextCreated events are dispatched for internal isolated worlds.",
        async test() {
            let completion = new WI.WrappedPromise;

            let listener = InspectorProtocol.addEventListener("Runtime.executionContextCreated", (messageObject) => {
                let {id, name, type} = messageObject.params.context;
                if (name !== "InspectorTestInternalIsolatedWorld")
                    return;

                InspectorProtocol.removeEventListener("Runtime.executionContextCreated", listener);

                ProtocolTest.pass("Received event for internal isolated world.");
                ProtocolTest.expectEqual(type, "internal", "Execution context should be internal.");

                completion.resolve();
            });

            await Promise.all([
                InspectorProtocol.awaitCommand({method: "Page.enable"}),
                InspectorProtocol.awaitCommand({method: "Runtime.enable"}),
            ]);

            await InspectorProtocol.awaitCommand({
                method: "Runtime.evaluate",
                params: {
                    expression: `createIsolatedWorld()`,
                },
            });

            await completion.promise;
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body>
<iframe id="subframe" src="resources/change-execution-context-identifier-subframe.html" onload="runTest()"></iframe>
<p>Test that exactly one Runtime.executionContextCreated event is fired for each existing context when Runtime.enable is called.</p>
</body>
</html>
