Web Inspector: Create Separate Model and View Objects for RemoteObjects / ObjectPrevi...
[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
40         // Strings
41         {expression: "''"},
42         {expression: "'\"'"}, // a single quote
43         {expression: "\"'\""}, // a double quote
44         {expression: "'string'"},
45         {expression: "'Unicodeā€¦'"},
46         {expression: "'I wish I had something to put here.'"},
47
48         // Function
49         {expression: "(function(){})"},
50         {expression: "function foo(){}; foo"},
51         {expression: "function myFunction(a, b) { console.log(a, b); }; myFunction"},
52         {expression: "function myTarget(a, b) { console.log(a, b); }; myTarget.bind(null)"}, // bound function
53         {expression: "Array.prototype.push"}, // native (ECMAScript)
54         {expression: "window.setTimeout"}, // native (DOM)
55         {expression: "Object.getOwnPropertyDescriptor({ get getter() { return 1 } }, 'getter').get"}, // getter
56         {expression: "Object.getOwnPropertyDescriptor({ set setter(v) { console.log(v); } }, 'setter').set"}, // setter
57
58     // Objects:
59
60         // Date
61         {expression: "new Date(99)", browserOnly: true},
62         {expression: "new Date(1421903245871)", browserOnly: true},
63
64         // Regexp
65         {expression: "/ /"},
66         {expression: "/(?:)/"},
67         {expression: "/^r(e)g[e]{1,}x+/"},
68         {expression: "/^r(e)g[e]{1,}x+/ig"},
69         {expression: "new RegExp('')"},
70         {expression: "new RegExp('test', 'i')"},
71
72         // Array
73         {expression: "[]"},
74         {expression: "[1, 2]"},
75         {expression: "[[1],[2],[3]]"},
76         {expression: "[true, 1, 1.234, 'string', /regex/]"},
77         {expression: "[{a:1}, {b:2}, {c:2}]"},
78         {expression: "[[{a:1}, {b:2}, {c:2}]]"},
79         {expression: "arr = []; arr.length = 100; arr"}, // 100 empty elements
80         {expression: "arr = []; arr.length = 100; arr.fill(1)"}, // 100 full elements
81         {expression: "arr = []; arr.length = 100; arr[10] = 1; arr"}, // sparse
82
83         // Array-like (Arguments, TypedArrays)
84         {expression: "a = null; (function() { a = arguments; })(1, '2', /3/); a"},
85         {expression: "new Int32Array(new ArrayBuffer(16))"},
86         {expression: "var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i < intArray.length; ++i) intArray[i] = i; intArray"},
87
88         // Object
89         {expression: "({})"},
90         {expression: "({a: 1})"},
91         {expression: "({a: 1, b: \"string\", c: /regex/, d: Symbol('sym')})"},
92         {expression: "({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})"},
93         {expression: "function Foo() {}; new Foo"},
94         {expression: "var Foo2 = function() {}; new Foo2"},
95         {expression: "var namespace = {}; namespace.Foo3 = function() {}; new namespace.Foo3"},
96         {expression: "function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar"},
97         {expression: "function Bar2() { this._x = 5 }; Bar.prototype = {get x() {return this._x;}}; new Bar2"},
98         {expression: "window.loadEvent"}, // window.loadEvent is set inside of <body onload="..."> below.
99         {expression: "new ArrayBuffer(16)"},
100         {expression: "new DataView(new ArrayBuffer(16))"},
101
102         // Node
103         {expression: "document.body"},
104         {expression: "div = document.createElement('div'); div.className = 'foo bar'; div"},
105         {expression: "span = document.createElement('span'); span.id = 'foo'; span"},
106         {expression: "document.createTextNode('text')"},
107
108         // Node Collections (NodeLists / Collections)
109         {expression: "document.all", browserOnly: true}, // HTMLAllCollection
110         {expression: "document.head.children"}, // HTMLCollection
111         {expression: "document.getElementsByClassName('my-test')"}, // NodeList
112         {expression: "document.querySelectorAll('.my-test')"}, // Non-Live NodeList
113
114         // Error
115         {expression: "error = null; try { [].x.x; } catch (e) { error = e; }; error"},
116         {expression: "error = null; try { eval('if()'); } catch (e) { error = e; }; error"},
117         {expression: "error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error"},
118
119     // Improveable:
120
121         // Sealed / Frozen objects.
122         {expression: "Object.seal({})"},
123         {expression: "Object.freeze({})"},
124
125         // Map / WeakMap
126         {expression: "new Map"},
127         {expression: "map = new Map; map.set(1, 2); map.set('key', 'value'); map"},
128         {expression: "map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map"},
129         {expression: "map = new Map; for (var i = 0; i <= 100; i++) map.set(i, i); map"},
130         {expression: "map = new WeakMap; strongKey = {id:1}; map.set(strongKey, [1,2]); map"},
131
132         // Set
133         {expression: "new Set"},
134         {expression: "set = new Set; set.add(1); set.add(2); set.add('key'); set"},
135         {expression: "set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set"},
136         {expression: "set = new Set; for (var i = 0; i <= 100; i++) set.add(i); set"},
137
138         // Promise
139         {expression: "new Promise(function(){})"},
140         {expression: "Promise.reject()"},
141         {expression: "Promise.reject('result')"},
142         {expression: "Promise.resolve()"},
143         {expression: "Promise.resolve({result:1})"},
144
145     ];
146
147     if (!window.WebInspector) {
148         window.steps = steps;
149         return;
150     }
151
152     function remoteObjectJSONFilter(key, value)
153     {
154         if (key === "_objectId")
155             return "<filtered>";
156
157         if (key === "_hasChildren")
158             return undefined;
159
160         return value;
161     }
162
163     function runNextStep() {
164         if (currentStepIndex >= steps.length) {
165             InspectorTest.completeTest();
166             return;
167         }
168
169         var step = steps[currentStepIndex++];
170         if (step.browserOnly) {
171             runNextStep();
172             return;
173         }
174
175         InspectorTest.log("");
176         InspectorTest.log("-----------------------------------------------------");
177         InspectorTest.log("EXPRESSION: " + step.expression);
178
179         WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, "test", false, true, false, true, function(remoteObject, wasThrown) {
180             InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
181             InspectorTest.log(JSON.stringify(remoteObject, remoteObjectJSONFilter, "  "));
182             runNextStep();
183         });
184     }
185
186     runNextStep();
187 }
188
189 function runInBrowserTest()
190 {
191     if (window.testRunner)
192         return;
193  
194     test(); // get steps.
195
196     for (var step of steps) {
197         console.info("EXPRESSION", step.expression);
198         console.log(eval(step.expression));
199     }
200 }
201 </script>
202 </head>
203 <body onload="window.loadEvent = event; runTest(); runInBrowserTest();">
204     <p class="my-test"></p><p class="my-test"></p><p class="my-test"></p>
205 </body>
206 </html>