blob: e6ed679cf8239e155e2bc3125f8be132bae27c7d [file] [log] [blame]
<!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>