7fd472c633d67d5609c5c60174b422ea90d797ee
[WebKit-https.git] / LayoutTests / inspector / model / remote-object.html
1 <!doctype html>
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5 <script type="text/javascript" src="../../http/tests/inspector/inspector-test.js"></script>
6 <script>
7 function test()
8 {
9     var currentStepIndex = 0;
10     var steps = [
11     // Special:
12
13         // Null / undefined
14         {expression: "null"},
15         {expression: "undefined"},
16
17         // Symbol
18         {expression: "Symbol()"},
19         {expression: "Symbol('test')"},
20
21     // Primatives:
22
23         // Boolean
24         {expression: "true"},
25         {expression: "false"},
26
27         // Number
28         {expression: "0"},
29         {expression: "-0"},
30         {expression: "1"},
31         {expression: "-1"},
32         {expression: "1.234"},
33         {expression: "-1.234"},
34         {expression: "1e3"},
35         {expression: "Number.MAX_VALUE"},
36         {expression: "Number.MIN_VALUE"},
37         {expression: "NaN"},
38         {expression: "Infinity"},
39         {expression: "-Infinity"},
40
41         // Strings
42         {expression: "''"},
43         {expression: "'\"'"}, // a single quote
44         {expression: "\"'\""}, // a double quote
45         {expression: "'string'"},
46         {expression: "'Unicodeā€¦'"},
47         {expression: "'I wish I had something to put here.'"},
48
49         // Function
50         {expression: "(function(){})"},
51         {expression: "function foo(){}; foo"},
52         {expression: "function myFunction(a, b) { console.log(a, b); }; myFunction"},
53         {expression: "function myTarget(a, b) { console.log(a, b); }; myTarget.bind(null)"}, // bound function
54         {expression: "Array.prototype.push"}, // native (ECMAScript)
55         {expression: "window.setTimeout"}, // native (DOM)
56         {expression: "Object.getOwnPropertyDescriptor({ get getter() { return 1 } }, 'getter').get"}, // getter
57         {expression: "Object.getOwnPropertyDescriptor({ set setter(v) { console.log(v); } }, 'setter').set"}, // setter
58
59     // Objects:
60
61         // Date
62         {expression: "new Date(99)", browserOnly: true},
63         {expression: "new Date(1421903245871)", browserOnly: true},
64
65         // Regexp
66         {expression: "/ /"},
67         {expression: "/(?:)/"},
68         {expression: "/^r(e)g[e]{1,}x+/"},
69         {expression: "/^r(e)g[e]{1,}x+/ig"},
70         {expression: "new RegExp('')"},
71         {expression: "new RegExp('test', 'i')"},
72
73         // Array
74         {expression: "[]"},
75         {expression: "[0, -0, 1, 2]"},
76         {expression: "[[1],[2],[3]]"},
77         {expression: "[true, 1, 1.234, 'string', /regex/]"},
78         {expression: "[{a:1}, {b:2}, {c:2}]"},
79         {expression: "[[{a:1}, {b:2}, {c:2}]]"},
80         {expression: "arr = []; arr.length = 100; arr"}, // 100 empty elements
81         {expression: "arr = []; arr.length = 100; arr.fill(1)"}, // 100 full elements
82         {expression: "arr = []; arr.length = 100; arr[10] = 1; arr"}, // sparse
83
84         // Array-like (Arguments, TypedArrays)
85         {expression: "a = null; (function() { a = arguments; })(1, '2', /3/); a"},
86         {expression: "new Int32Array(new ArrayBuffer(16))"},
87         {expression: "var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i < intArray.length; ++i) intArray[i] = i; intArray"},
88
89         // Object
90         {expression: "({})"},
91         {expression: "({a: 1})"},
92         {expression: "({a: 1, b: 0, c: -0})"},
93         {expression: "({a: 1, b: \"string\", c: /regex/, d: Symbol('sym')})"},
94         {expression: "o = {a:1}; o.b = o; o"}, // Cyclic.
95         {expression: "({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})"},
96         {expression: "function Foo() {}; new Foo"},
97         {expression: "var Foo2 = function() {}; new Foo2"},
98         {expression: "var namespace = {}; namespace.Foo3 = function() {}; new namespace.Foo3"},
99         {expression: "function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar"},
100         {expression: "function Bar2() { this._x = 5 }; Bar.prototype = {get x() {return this._x;}}; new Bar2"},
101         {expression: "window.loadEvent"}, // window.loadEvent is set inside of <body onload="..."> below.
102         {expression: "new ArrayBuffer(16)"},
103         {expression: "new DataView(new ArrayBuffer(16))"},
104
105         // Node
106         {expression: "document.body"},
107         {expression: "div = document.createElement('div'); div.className = 'foo bar'; div"},
108         {expression: "span = document.createElement('span'); span.id = 'foo'; span"},
109         {expression: "document.createTextNode('text')"},
110
111         // Node Collections (NodeLists / Collections)
112         {expression: "document.all", browserOnly: true}, // HTMLAllCollection
113         {expression: "document.head.children"}, // HTMLCollection
114         {expression: "document.getElementsByClassName('my-test')"}, // NodeList
115         {expression: "document.querySelectorAll('.my-test')"}, // Non-Live NodeList
116
117         // Error
118         {expression: "error = null; try { [].x.x; } catch (e) { error = e; }; error"},
119         {expression: "error = null; try { eval('if()'); } catch (e) { error = e; }; error"},
120         {expression: "error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error"},
121
122         // Map / WeakMap
123         {expression: "new Map"},
124         {expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map"},
125         {expression: "map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map"},
126         {expression: "map = new Map; for (var i = 0; i <= 100; i++) map.set(i, i); map"},
127         {expression: "map = new WeakMap; strongKey = {id:1}; map.set(strongKey, [1,2]); map"},
128
129         // Set
130         {expression: "new Set"},
131         {expression: "set = new Set; set.add(1); set.add(2); set.add('key'); set"},
132         {expression: "set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set"},
133         {expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set"},
134
135         // Iterators
136         {expression: "'a'[Symbol.iterator]()"},
137         {expression: "'long string'[Symbol.iterator]()"},
138         {expression: "[][Symbol.iterator]()"},
139         {expression: "[1][Symbol.iterator]()"},
140         {expression: "[1, 'two', 3, 'four', 5, 'size'][Symbol.iterator]()"},
141         {expression: "[1, 'two', 3, 'four', 5, 'size'].keys()"},
142         {expression: "[1, 'two', 3, 'four', 5, 'size'].entries()"},
143         {expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map.values()"},
144         {expression: "map.keys()"},
145         {expression: "map.entries()"},
146         {expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set.values()"},
147         {expression: "map.entries()"},
148         {expression: "x = undefined; (function() { x = arguments; })(1, 'two'); x[Symbol.iterator]()"},
149
150         // Promise
151         {expression: "new Promise(function(){})"},
152         {expression: "Promise.reject()"},
153         {expression: "Promise.reject('result')"},
154         {expression: "Promise.resolve()"},
155         {expression: "Promise.resolve({result:1})"},
156
157     // Classes
158
159         {expression: "Person = class Person { constructor(){} get fullName(){} methodName(p1, p2){} }; Person"}, // Constructor => class type
160         {expression: "Person.prototype.methodName"}, // Method => just a function type
161         {expression: "Alpha = class A { methodA(){} }; Beta = class B extends Alpha { methodB(){} }; Beta"},
162         {expression: "[Beta]"},
163
164     // Improveable:
165
166         // Sealed / Frozen objects.
167         {expression: "Object.seal({})"},
168         {expression: "Object.freeze({})"},
169     ];
170
171     if (!window.WebInspector) {
172         window.steps = steps;
173         return;
174     }
175
176     function remoteObjectJSONFilter(key, value)
177     {
178         if (key === "_objectId")
179             return "<filtered>";
180
181         if (key === "_hasChildren")
182             return undefined;
183
184         return value;
185     }
186
187     function runSteps() {
188
189         function afterStep() {
190             if (++currentStepIndex >= steps.length)
191                 InspectorTest.completeTest();
192         }
193
194         function runStep(step) {
195             if (step.browserOnly) {
196                 afterStep();
197                 return;
198             }
199
200             WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, "test", false, true, false, true, false, function(remoteObject, wasThrown) {
201                 InspectorTest.log("");
202                 InspectorTest.log("-----------------------------------------------------");
203                 InspectorTest.log("EXPRESSION: " + step.expression);
204                 InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
205                 InspectorTest.log(JSON.stringify(remoteObject, remoteObjectJSONFilter, "  "));
206                 afterStep();
207             });
208         }
209
210         for (var step of steps)
211             runStep(step);
212     }
213
214     runSteps();
215 }
216
217 function runInBrowserTest()
218 {
219     if (window.testRunner)
220         return;
221  
222     test(); // get steps.
223
224     for (var step of steps) {
225         console.info("EXPRESSION", step.expression);
226         try {
227             console.log(eval(step.expression));
228         } catch (e) {
229             console.log("EXCEPTION: " + e);
230         }
231     }
232 }
233 </script>
234 </head>
235 <body onload="window.loadEvent = event; runTest(); runInBrowserTest();">
236     <p class="my-test"></p><p class="my-test"></p><p class="my-test"></p>
237 </body>
238 </html>