Web Inspector: Regression: Preview for [[null]] shouldn't be []
[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: "[[null]]"},
79         {expression: "[[undefined]]"},
80         {expression: "[{a:1}, {b:2}, {c:2}]"},
81         {expression: "[[{a:1}, {b:2}, {c:2}]]"},
82         {expression: "arr = []; arr.length = 100; arr"}, // 100 empty elements
83         {expression: "arr = []; arr.length = 100; arr.fill(1)"}, // 100 full elements
84         {expression: "arr = []; arr.length = 100; arr[10] = 1; arr"}, // sparse
85
86         // Array-like (Arguments, TypedArrays)
87         {expression: "a = null; (function() { a = arguments; })(1, '2', /3/); a"},
88         {expression: "new Int32Array(new ArrayBuffer(16))"},
89         {expression: "var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i < intArray.length; ++i) intArray[i] = i; intArray"},
90
91         // Object
92         {expression: "({})"},
93         {expression: "({a: 1})"},
94         {expression: "({a: 1, b: 0, c: -0})"},
95         {expression: "({a: 1, b: \"string\", c: /regex/, d: Symbol('sym')})"},
96         {expression: "o = {a:1}; o.b = o; o"}, // Cyclic.
97         {expression: "({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})"},
98         {expression: "function Foo() {}; new Foo"},
99         {expression: "var Foo2 = function() {}; new Foo2"},
100         {expression: "var namespace = {}; namespace.Foo3 = function() {}; new namespace.Foo3"},
101         {expression: "function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar"},
102         {expression: "function Bar2() { this._x = 5 }; Bar.prototype = {get x() {return this._x;}}; new Bar2"},
103         {expression: "window.loadEvent"}, // window.loadEvent is set inside of <body onload="..."> below.
104         {expression: "new ArrayBuffer(16)"},
105         {expression: "new DataView(new ArrayBuffer(16))"},
106
107         // Node
108         {expression: "document.body"},
109         {expression: "div = document.createElement('div'); div.className = 'foo bar'; div"},
110         {expression: "span = document.createElement('span'); span.id = 'foo'; span"},
111         {expression: "document.createTextNode('text')"},
112
113         // Node Collections (NodeLists / Collections)
114         {expression: "document.all", browserOnly: true}, // HTMLAllCollection
115         {expression: "document.head.children"}, // HTMLCollection
116         {expression: "document.getElementsByClassName('my-test')"}, // NodeList
117         {expression: "document.querySelectorAll('.my-test')"}, // Non-Live NodeList
118
119         // Error
120         {expression: "error = null; try { [].x.x; } catch (e) { error = e; }; error"},
121         {expression: "error = null; try { eval('if()'); } catch (e) { error = e; }; error"},
122         {expression: "error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error"},
123
124         // Map / WeakMap
125         {expression: "new Map"},
126         {expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map"},
127         {expression: "map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map"},
128         {expression: "map = new Map; for (var i = 0; i <= 100; i++) map.set(i, i); map"},
129         {expression: "map = new WeakMap; strongKey = {id:1}; map.set(strongKey, [1,2]); map"},
130
131         // Set
132         {expression: "new Set"},
133         {expression: "set = new Set; set.add(1); set.add(2); set.add('key'); set"},
134         {expression: "set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set"},
135         {expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set"},
136
137         // Iterators
138         {expression: "'a'[Symbol.iterator]()"},
139         {expression: "'long string'[Symbol.iterator]()"},
140         {expression: "[][Symbol.iterator]()"},
141         {expression: "[1][Symbol.iterator]()"},
142         {expression: "[1, 'two', 3, 'four', 5, 'size'][Symbol.iterator]()"},
143         {expression: "[1, 'two', 3, 'four', 5, 'size'].keys()"},
144         {expression: "[1, 'two', 3, 'four', 5, 'size'].entries()"},
145         {expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map.values()"},
146         {expression: "map.keys()"},
147         {expression: "map.entries()"},
148         {expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set.values()"},
149         {expression: "map.entries()"},
150         {expression: "x = undefined; (function() { x = arguments; })(1, 'two'); x[Symbol.iterator]()"},
151
152         // Promise
153         {expression: "new Promise(function(){})"},
154         {expression: "Promise.reject()"},
155         {expression: "Promise.reject('result')"},
156         {expression: "Promise.resolve()"},
157         {expression: "Promise.resolve({result:1})"},
158
159     // Classes
160
161         {expression: "Person = class Person { constructor(){} get fullName(){} methodName(p1, p2){} }; Person"}, // Constructor => class type
162         {expression: "Person.prototype.methodName"}, // Method => just a function type
163         {expression: "Alpha = class A { methodA(){} }; Beta = class B extends Alpha { methodB(){} }; Beta"},
164         {expression: "[Beta]"},
165
166     // Improveable:
167
168         // Sealed / Frozen objects.
169         {expression: "Object.seal({})"},
170         {expression: "Object.freeze({})"},
171     ];
172
173     if (!window.WebInspector) {
174         window.steps = steps;
175         return;
176     }
177
178     function remoteObjectJSONFilter(key, value)
179     {
180         if (key === "_objectId")
181             return "<filtered>";
182
183         if (key === "_hasChildren")
184             return undefined;
185
186         return value;
187     }
188
189     function runSteps() {
190
191         function afterStep() {
192             if (++currentStepIndex >= steps.length)
193                 InspectorTest.completeTest();
194         }
195
196         function runStep(step) {
197             if (step.browserOnly) {
198                 afterStep();
199                 return;
200             }
201
202             WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, "test", false, true, false, true, false, function(remoteObject, wasThrown) {
203                 InspectorTest.log("");
204                 InspectorTest.log("-----------------------------------------------------");
205                 InspectorTest.log("EXPRESSION: " + step.expression);
206                 InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
207                 InspectorTest.log(JSON.stringify(remoteObject, remoteObjectJSONFilter, "  "));
208                 afterStep();
209             });
210         }
211
212         for (var step of steps)
213             runStep(step);
214     }
215
216     runSteps();
217 }
218
219 function runInBrowserTest()
220 {
221     if (window.testRunner)
222         return;
223  
224     test(); // get steps.
225
226     for (var step of steps) {
227         console.info("EXPRESSION", step.expression);
228         try {
229             console.log(eval(step.expression));
230         } catch (e) {
231             console.log("EXCEPTION: " + e);
232         }
233     }
234 }
235 </script>
236 </head>
237 <body onload="window.loadEvent = event; runTest(); runInBrowserTest();">
238     <p class="my-test"></p><p class="my-test"></p><p class="my-test"></p>
239 </body>
240 </html>