blob: abcd93a58d3ed7c01b8c637eaf1082abe2264ba2 [file] [log] [blame]
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
var currentStepIndex = 0;
var steps = [
// Special:
// Null / undefined
{expression: "null"},
{expression: "undefined"},
// Symbol
{expression: "Symbol()"},
{expression: "Symbol('test')"},
// Primatives:
// Boolean
{expression: "true"},
{expression: "false"},
// Number
{expression: "0"},
{expression: "-0"},
{expression: "1"},
{expression: "-1"},
{expression: "1.234"},
{expression: "-1.234"},
{expression: "1e3"},
{expression: "Number.MAX_VALUE"},
{expression: "Number.MIN_VALUE"},
{expression: "NaN"},
{expression: "Infinity"},
{expression: "-Infinity"},
// Strings
{expression: "''"},
{expression: "'\"'"}, // a single quote
{expression: "\"'\""}, // a double quote
{expression: "'string'"},
{expression: "'Unicodeā€¦'"},
{expression: "'I wish I had something to put here.'"},
// Function
{expression: "(function(){})"},
{expression: "function foo(){}; foo"},
{expression: "function myFunction(a, b) { console.log(a, b); }; myFunction"},
{expression: "function myTarget(a, b) { console.log(a, b); }; myTarget.bind(null)"}, // bound function
{expression: "Array.prototype.push"}, // native (ECMAScript)
{expression: "window.setTimeout"}, // native (DOM)
{expression: "Object.getOwnPropertyDescriptor({ get getter() { return 1 } }, 'getter').get"}, // getter
{expression: "Object.getOwnPropertyDescriptor({ set setter(v) { console.log(v); } }, 'setter').set"}, // setter
// Objects:
// Date
{expression: "new Date(99)", browserOnly: true},
{expression: "new Date(1421903245871)", browserOnly: true},
// Regexp
{expression: "/ /"},
{expression: "/(?:)/"},
{expression: "/^r(e)g[e]{1,}x+/"},
{expression: "/^r(e)g[e]{1,}x+/ig"},
{expression: "new RegExp('')"},
{expression: "new RegExp('test', 'i')"},
// Array
{expression: "[]"},
{expression: "[0, -0, 1, 2]"},
{expression: "[[1],[2],[3]]"},
{expression: "[true, 1, 1.234, 'string', /regex/]"},
{expression: "[[null]]"},
{expression: "[[undefined]]"},
{expression: "[{a:1}, {b:2}, {c:2}]"},
{expression: "[[{a:1}, {b:2}, {c:2}]]"},
{expression: "arr = []; arr[0] = arr; arr"}, // cyclic
{expression: "arr = []; arr.length = 100; arr"}, // 100 empty elements
{expression: "arr = []; arr.length = 100; arr.fill(1)"}, // 100 full elements
{expression: "arr = []; arr.length = 100; arr[10] = 1; arr"}, // sparse
// Array-like (Arguments, TypedArrays)
{expression: "a = null; (function() { a = arguments; })(1, '2', /3/); a"},
{expression: "new Int32Array(new ArrayBuffer(16))"},
{expression: "var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i < intArray.length; ++i) intArray[i] = i; intArray"},
{expression: "var buffer = new ArrayBuffer(10000000); var int8View = new Int8Array(buffer); int8View"}, // 10000000 elements.
// Object
{expression: "({})"},
{expression: "({a: 1})"},
{expression: "({a: 1, b: 0, c: -0})"},
{expression: "({a: 1, b: \"string\", c: /regex/, d: Symbol('sym')})"},
{expression: "o = {a:1}; o.b = o; o"}, // cyclic
{expression: "({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})"},
{expression: "function Foo() {}; new Foo"},
{expression: "var Foo2 = function() {}; new Foo2"},
{expression: "var namespace = {}; namespace.Foo3 = function() {}; new namespace.Foo3"},
{expression: "function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar"},
{expression: "function Bar2() { this._x = 5 }; Bar.prototype = {get x() {return this._x;}}; new Bar2"},
{expression: "window.loadEvent"}, // window.loadEvent is set inside of <body onload="..."> below.
{expression: "new ArrayBuffer(16)"},
{expression: "new DataView(new ArrayBuffer(16))"},
{expression: "obj = {}; obj['prop'] = 1; obj[Symbol()] = 2; obj[Symbol('sym')] = 3; obj[Symbol('sym')] = 4; obj[Symbol.iterator] = Symbol(); obj"}, // Symbol properties
// Node
{expression: "document.body"},
{expression: "div = document.createElement('div'); div.className = 'foo bar'; div"},
{expression: "span = document.createElement('span'); span.id = 'foo'; span"},
{expression: "input = document.createElement('input'); input.type = 'password'; input"},
{expression: "text = document.createTextNode('text content'); text"},
{expression: "comment = document.createComment('comment content'); comment"},
{expression: "svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'rect'); svgElement.classList.add('test'); svgElement"},
{expression: "[document.body, div, span, input, text, comment, svgElement]"},
// Node Collections (NodeLists / Collections)
{expression: "document.all", browserOnly: true}, // HTMLAllCollection
{expression: "document.head.children"}, // HTMLCollection
{expression: "document.getElementsByClassName('my-test')"}, // NodeList
{expression: "document.querySelectorAll('.my-test')"}, // Non-Live NodeList
// Error
{expression: "error = null; try { [].x.x; } catch (e) { error = e; }; error"},
{expression: "error = null; try { eval('if()'); } catch (e) { error = e; }; error"},
{expression: "error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error"},
// Map / WeakMap
{expression: "new Map"},
{expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map"},
{expression: "map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map"},
{expression: "map = new Map; for (var i = 0; i <= 100; i++) map.set(i, i); map"},
{expression: "map = new Map; map.set(map, map); map"},
{expression: "map = new WeakMap; strongKey = {id:1}; map.set(strongKey, [1,2]); map"},
// Set / WeakSet
{expression: "new Set"},
{expression: "set = new Set; set.add(1); set.add(2); set.add('key'); set"},
{expression: "set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set"},
{expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set"},
{expression: "set = new Set; set.add(set); set"},
{expression: "set = new WeakSet; strongKey = {id:1}; set.add(strongKey); set"},
// Iterators
{expression: "'a'[Symbol.iterator]()"},
{expression: "'long string'[Symbol.iterator]()"},
{expression: "[][Symbol.iterator]()"},
{expression: "[1][Symbol.iterator]()"},
{expression: "[1, 'two', 3, 'four', 5, 'size'][Symbol.iterator]()"},
{expression: "[1, 'two', 3, 'four', 5, 'size'].keys()"},
{expression: "[1, 'two', 3, 'four', 5, 'size'].entries()"},
{expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map.values()"},
{expression: "map.keys()"},
{expression: "map.entries()"},
{expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set.values()"},
{expression: "map.entries()"},
{expression: "x = undefined; (function() { x = arguments; })(1, 'two'); x[Symbol.iterator]()"},
{expression: "Reflect.enumerate({a:1, b:2, c:3})"},
{expression: "Reflect.enumerate([1, 2, 3, 4, 5, 6, 7])"},
// Promise
{expression: "new Promise(function(){})"},
{expression: "Promise.reject()"},
{expression: "Promise.reject('result')"},
{expression: "Promise.resolve()"},
{expression: "Promise.resolve({result:1})"},
// Proxy
{expression: "new Proxy({x:1, y:1}, {handler: true})"},
// Classes
{expression: "Person = class Person { constructor(name){} get fullName(){} methodName(p1, p2){} }; Person"}, // Constructor => class type
{expression: "Person.prototype.methodName"}, // Method => just a function type
{expression: "Alpha = class A { methodA(){} }; Beta = class B extends Alpha { methodB(){} }; Beta"},
{expression: "[Beta]"},
// Improveable:
// Sealed / Frozen objects.
{expression: "Object.seal({})"},
{expression: "Object.freeze({})"},
];
if (!window.WebInspector) {
window.steps = steps;
return;
}
function remoteObjectJSONFilter(key, value)
{
if (key === "_objectId")
return "<filtered>";
if (key === "_hasChildren")
return undefined;
return value;
}
function runSteps() {
function afterStep() {
if (++currentStepIndex >= steps.length)
InspectorTest.completeTest();
}
function runStep(step) {
if (step.browserOnly) {
afterStep();
return;
}
WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, "test", false, true, false, true, false, function(remoteObject, wasThrown) {
InspectorTest.log("");
InspectorTest.log("-----------------------------------------------------");
InspectorTest.log("EXPRESSION: " + step.expression);
InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
InspectorTest.log(JSON.stringify(remoteObject, remoteObjectJSONFilter, " "));
afterStep();
});
}
for (var step of steps)
runStep(step);
}
runSteps();
}
function runInBrowserTest()
{
if (window.testRunner)
return;
test(); // get steps.
for (var step of steps) {
console.info("EXPRESSION", step.expression);
try {
console.log(eval(step.expression));
} catch (e) {
console.log("EXCEPTION: " + e);
}
}
}
</script>
</head>
<body onload="window.loadEvent = event; runTest(); runInBrowserTest();">
<p class="my-test"></p><p class="my-test"></p><p class="my-test"></p>
</body>
</html>