<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
var passphrase = "coldwater";

function test()
{
    let suite = InspectorTest.createAsyncSuite("RuntimeManager.activeExecutionContext");

    suite.addTestCase({
        name: "InitialScriptExecutionContext",
        description: "Test that the initial value of activeExecutionContext is the main context.",
        test(resolve, reject) {
            InspectorTest.expectThat(WI.runtimeManager.activeExecutionContext === WI.mainTarget.executionContext, "The initial active execution context should be the main execution context.");
            resolve();
        }
    });

    suite.addTestCase({
        name: "ScriptExecutionContextMainContext",
        description: "Test that evaluateInInspectedWindow works when activeExecutionContext is the main execution context.",
        test(resolve, reject) {
            WI.runtimeManager.evaluateInInspectedWindow("passphrase", {objectGroup: "test"}, (remoteObject, wasThrown, savedResultIndex) => {
                InspectorTest.log("Passphrase in selected frame: " + remoteObject.value);
                InspectorTest.expectEqual(remoteObject.value, "coldwater", "The passphrase should match the phrase defined in the main frame.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ScriptExecutionContextMainFrameContext",
        description: "Test that evaluateInInspectedWindow works when activeExecutionContext is the main frame execution context. This is equivalent to the main context.",
        test(resolve, reject) {
            WI.runtimeManager.activeExecutionContext = WI.networkManager.mainFrame.pageExecutionContext;
            WI.runtimeManager.evaluateInInspectedWindow("passphrase", {objectGroup: "test"}, (remoteObject, wasThrown, savedResultIndex) => {
                InspectorTest.log("Passphrase in selected frame: " + remoteObject.value);
                InspectorTest.expectEqual(remoteObject.value, "coldwater", "The passphrase should match the phrase defined in the main frame.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ScriptExecutionContextSubFrame",
        description: "Test that evaluateInInspectedWindow works when activeExecutionContext is a subframe context.",
        test(resolve, reject) {
            let mainFrame = WI.networkManager.mainFrame;
            let subframes = WI.networkManager.frames.filter((frame) => frame !== mainFrame);
            InspectorTest.expectEqual(subframes.length, 1, "The test page should only have one sub-frame.");

            WI.runtimeManager.activeExecutionContext = subframes[0].pageExecutionContext;
            WI.runtimeManager.evaluateInInspectedWindow("passphrase", {objectGroup: "test"}, (remoteObject, wasThrown, savedResultIndex) => {
                InspectorTest.log("Passphrase in selected frame: " + remoteObject.value);
                InspectorTest.expectEqual(remoteObject.value, "rosewater", "The passphrase should match the phrase defined in the subframe.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ScriptExecutionContextMainFrameAgain",
        description: "Test that evaluateInInspectedWindow works when activeExecutionContext switches back to the main frame execution context.",
        test(resolve, reject) {
            let mainFrame = WI.networkManager.mainFrame;

            WI.runtimeManager.activeExecutionContext = mainFrame.pageExecutionContext;
            WI.runtimeManager.evaluateInInspectedWindow("passphrase", {objectGroup: "test"}, (remoteObject, wasThrown, savedResultIndex) => {
                InspectorTest.log("Passphrase in selected frame: " + remoteObject.value);
                InspectorTest.expectEqual(remoteObject.value, "coldwater", "The passphrase should match the phrase defined in the main frame.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ScriptExecutionContextRemoveSubframe",
        description: "Test that evaluateInInspectedWindow works when the activeExecutionContext is destroyed and reverts to the top-level context.",
        test(resolve, reject) {
            let mainFrame = WI.networkManager.mainFrame;
            let subframes = WI.networkManager.frames.filter((frame) => frame !== mainFrame);
            InspectorTest.expectEqual(subframes.length, 1, "The test page should only have one sub-frame.");

            // Set the execution context to the subframe so we can switch away from it when the frame is detached.
            WI.runtimeManager.activeExecutionContext = subframes[0].pageExecutionContext;

            // Force-override the contextId, otherwise we won't be able to access the iframe's DOM element when evaluating in the iframe execution context.
            let expression = `document.getElementById("subframe").remove();`;
            let objectGroup = "test";
            let contextId = WI.RuntimeManager.TopLevelExecutionContextIdentifier;
            RuntimeAgent.evaluate.invoke({expression, objectGroup, contextId}, () => {
                InspectorTest.expectEqual(WI.networkManager.frames.length, 1, "The test page should now have no sub-frames.");
                InspectorTest.expectEqual(WI.runtimeManager.activeExecutionContext.id, WI.RuntimeManager.TopLevelExecutionContextIdentifier, "When a selected non-top-level execution context is removed, the active execution context should revert to the main frame context.");
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body>
<iframe id="subframe" src="resources/change-execution-context-identifier-subframe.html" onload="runTest()"></iframe>
<p>Test that RuntimeManager.evaluateInInspectedWindow respects the selected execution context.</p>
</body>
</html>
