| <!DOCTYPE html> |
| <html> |
| <head> |
| <script src="../../http/tests/inspector/resources/inspector-test.js"></script> |
| <script> |
| var varGlobalVariable = 1; |
| let letGlobalVariable = 2; |
| const constGlobalVariable = 3; |
| var varGlobalFunctionVariable = 4; |
| |
| function test() |
| { |
| const objectGroup = "test"; |
| const includeCommandLineAPI = true; |
| const returnByValue = true; |
| |
| function testEvaluate(expression, callback) { |
| RuntimeAgent.evaluate.invoke({expression, objectGroup, includeCommandLineAPI, returnByValue}, (error, resultValue, wasThrown) => { |
| InspectorTest.assert(!error, "Should not be a protocol error."); |
| InspectorTest.assert(!wasThrown, "Should not be a runtime error."); |
| if (callback) |
| callback(resultValue.value); |
| }); |
| } |
| |
| function testEvaluateThrow(expression, callback) { |
| RuntimeAgent.evaluate.invoke({expression, objectGroup, includeCommandLineAPI, returnByValue}, (error, resultValue, wasThrown) => { |
| InspectorTest.assert(!error, "Should not be a protocol error."); |
| InspectorTest.assert(wasThrown, "Should be a runtime error."); |
| if (callback) |
| callback(wasThrown); |
| }); |
| } |
| |
| let suite = InspectorTest.createAsyncSuite("Runtime.evaluate.CommandLineAPI"); |
| |
| suite.addTestCase({ |
| name: "AccessCommandLineAPI", |
| description: "Test evaluate can access CommandLineAPI methods.", |
| test(resolve, reject) { |
| testEvaluate("keys.toString()", (resultValue) => { |
| InspectorTest.expectThat(resultValue.includes("[Command Line API]"), "CommandLineAPI `keys` can be accessed."); |
| }); |
| testEvaluate("keys({a:1, b:2})", (resultValue) => { |
| InspectorTest.expectThat(resultValue.length === 2 && resultValue[0] === "a" && resultValue[1] === "b", "CommandLineAPI `keys` should work with a simple object."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "AccessGlobalVariable", |
| description: "Test evaluate can access global variables.", |
| test(resolve, reject) { |
| testEvaluate("varGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 1, "Should be able to access var in global scope."); |
| }); |
| testEvaluate("letGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 2, "Should be able to access let in global scope."); |
| }); |
| testEvaluate("constGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 3, "Should be able to access const in global scope."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "CreateGlobalVariable", |
| description: "Test evaluate can create global variables.", |
| test(resolve, reject) { |
| testEvaluate(` |
| var createdVarGlobalVariable = 1; |
| let createdLetGlobalVariable = 2; |
| const createdConstGlobalVariable = 3; |
| `); |
| testEvaluate("createdVarGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 1, "Should be able to access created var in global scope."); |
| }); |
| testEvaluate("createdLetGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 2, "Should be able to access created let in global scope."); |
| }); |
| testEvaluate("createdConstGlobalVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 3, "Should be able to access created const in global scope."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "CreateGlobalClass", |
| description: "Test evaluate can create a class.", |
| test(resolve, reject) { |
| testEvaluate(` |
| class Foo { |
| static staticMethod() { |
| return 42; |
| } |
| } |
| `); |
| testEvaluate("Foo.staticMethod()", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 42, "Should be able to access class created in earlier evaluation."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "ExpectedExceptionCreatingDuplicateLexicalGlobalVariables", |
| description: "Test evaluate produces expected exception creating duplicate lexical global variables across evaluations.", |
| test(resolve, reject) { |
| testEvaluate(`let duplicateGlobalVariable = 1`); |
| testEvaluateThrow(`let duplicateGlobalVariable = 1`, (wasThrown) => { |
| InspectorTest.expectThat(wasThrown, "Should be an exception defining a lexical global multiple times."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "NonStrictAndStrictEvaluations", |
| description: "Test evaluate can run strict and non-strict programs.", |
| test(resolve, reject) { |
| testEvaluate(` |
| // Not strict, this is okay. |
| (function f() { |
| return arguments.callee.name; |
| })(); |
| `, (resultValue) => { |
| InspectorTest.expectThat(resultValue === "f", "Non-strict evaluation. Should be able to access arguments.callee."); |
| }); |
| testEvaluateThrow(`"use strict"; |
| // Strict, this throw an exception. |
| (function() { |
| return arguments.callee; |
| })();` |
| , (wasThrown) => { |
| InspectorTest.expectThat(wasThrown, "Script evaluation. Should not be able to access arguments.callee."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "CommandLineAPIDoesNotShadowVariables", |
| description: "Test CommandLineAPI does not shadow global variables.", |
| test(resolve, reject) { |
| testEvaluate("keys.toString()", (resultValue) => { |
| InspectorTest.expectThat(resultValue.includes("[Command Line API]"), "`keys` is currently CommandLineAPI function."); |
| }); |
| testEvaluate("var keys = 123; keys", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 123, "Creating global `keys` variable should be okay."); |
| }); |
| testEvaluate("keys", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 123, "Global `keys` variable should not be shadowed by CommandLineAPI function."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "CommandLineAPIDoesNotShadowGlobalObjectProperties", |
| description: "Test CommandLineAPI does not shadow global object properties.", |
| test(resolve, reject) { |
| testEvaluate("values.toString()", (resultValue) => { |
| InspectorTest.expectThat(resultValue === "[object HTMLDivElement]", "`values` should be `window.values` and not shadowed by CommandLineAPI `values` function."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.addTestCase({ |
| name: "NonStrictEvalHoistEvaluations", |
| description: "Test CommandLineAPI does not shadow global object variable that hoisted from eval.", |
| test(resolve, reject) { |
| testEvaluate("varGlobalFunctionVariable", (resultValue) => { |
| InspectorTest.expectThat(resultValue === 4, "Should be able to access var in global scope."); |
| }); |
| testEvaluate(` |
| let noError = varGlobalFunctionVariable === 4; |
| eval('eval(" { function varGlobalFunctionVariable() { }; } ")'); |
| typeof varGlobalFunctionVariable === 'function' && noError; |
| `, (resultValue) => { |
| InspectorTest.expectThat(resultValue, "Should be able to hoist function to var in global scope."); |
| }); |
| testEvaluate("varGlobalFunctionVariable", (resultValue) => { |
| InspectorTest.expectThat(typeof resultValue, "Should be able to hoist function to var in global scope and keep it."); |
| resolve(); |
| }); |
| } |
| }); |
| |
| suite.runTestCasesAndFinish(); |
| } |
| </script> |
| </head> |
| <body onload="runTest()"> |
| <div id="values"></div> <!-- This introduces the named property `window.values` on the window global object. --> |
| <p>Tests for the Runtime.evaluate with the Command Line API.</p> |
| </body> |
| </html> |