| <!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> |