OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 /** | 4 /** |
5 * @unrestricted | 5 * @unrestricted |
6 */ | 6 */ |
7 Components.RemoteObjectPreviewFormatter = class { | 7 Components.RemoteObjectPreviewFormatter = class { |
8 /** | 8 /** |
9 * @param {!Element} parentElement | 9 * @param {!Element} parentElement |
10 * @param {!Protocol.Runtime.ObjectPreview} preview | 10 * @param {!Protocol.Runtime.ObjectPreview} preview |
| 11 * @param {!SDK.RemoteObject=} objectForAccessing |
11 */ | 12 */ |
12 appendObjectPreview(parentElement, preview) { | 13 appendObjectPreview(parentElement, preview, objectForAccessing) { |
13 var description = preview.description; | 14 var description = preview.description; |
14 if (preview.type !== 'object' || preview.subtype === 'null') { | 15 if (preview.type !== 'object' || preview.subtype === 'null') { |
15 parentElement.appendChild(this.renderPropertyPreview(preview.type, preview
.subtype, description)); | 16 parentElement.appendChild(this.renderPropertyPreview(preview.type, preview
.subtype, description)); |
16 return; | 17 return; |
17 } | 18 } |
18 if (description && preview.subtype !== 'array' && preview.subtype !== 'typed
array') { | 19 if (description && preview.subtype !== 'array' && preview.subtype !== 'typed
array') { |
19 var text = preview.subtype ? description : this._abbreviateFullQualifiedCl
assName(description); | 20 var text = preview.subtype ? description : this._abbreviateFullQualifiedCl
assName(description); |
20 parentElement.createTextChildren(text, ' '); | 21 parentElement.createTextChildren(text, ' '); |
21 } | 22 } |
22 if (preview.entries) | 23 if (preview.entries) |
23 this._appendEntriesPreview(parentElement, preview); | 24 this._appendEntriesPreview(parentElement, preview); |
24 else | 25 else |
25 this._appendPropertiesPreview(parentElement, preview); | 26 this._appendPropertiesPreview(parentElement, preview, objectForAccessing); |
26 } | 27 } |
27 | 28 |
28 /** | 29 /** |
29 * @param {string} description | 30 * @param {string} description |
30 * @return {string} | 31 * @return {string} |
31 */ | 32 */ |
32 _abbreviateFullQualifiedClassName(description) { | 33 _abbreviateFullQualifiedClassName(description) { |
33 var abbreviatedDescription = description.split('.'); | 34 var abbreviatedDescription = description.split('.'); |
34 for (var i = 0; i < abbreviatedDescription.length - 1; ++i) | 35 for (var i = 0; i < abbreviatedDescription.length - 1; ++i) |
35 abbreviatedDescription[i] = abbreviatedDescription[i].trimMiddle(3); | 36 abbreviatedDescription[i] = abbreviatedDescription[i].trimMiddle(3); |
36 return abbreviatedDescription.join('.'); | 37 return abbreviatedDescription.join('.'); |
37 } | 38 } |
38 | 39 |
39 /** | 40 /** |
40 * @param {!Element} parentElement | 41 * @param {!Element} parentElement |
41 * @param {!Protocol.Runtime.ObjectPreview} preview | 42 * @param {!Protocol.Runtime.ObjectPreview} preview |
| 43 * @param {!SDK.RemoteObject=} objectForAccessing |
42 */ | 44 */ |
43 _appendPropertiesPreview(parentElement, preview) { | 45 _appendPropertiesPreview(parentElement, preview, objectForAccessing) { |
44 var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray
'; | 46 var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray
'; |
45 var arrayLength = SDK.RemoteObject.arrayLength(preview); | 47 var arrayLength = SDK.RemoteObject.arrayLength(preview); |
46 var properties = preview.properties; | 48 var properties = preview.properties; |
47 if (isArray) | 49 if (isArray) |
48 properties = properties.slice().stableSort(compareIndexesFirst); | 50 properties = properties.slice().stableSort(compareIndexesFirst); |
49 else | 51 else |
50 properties = properties.slice().stableSort(compareFunctionsLast); | 52 properties = properties.slice().stableSort(compareFunctionsLast); |
51 | 53 |
52 /** | 54 /** |
53 * @param {!Protocol.Runtime.PropertyPreview} a | 55 * @param {!Protocol.Runtime.PropertyPreview} a |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 var property = properties[i]; | 94 var property = properties[i]; |
93 var name = property.name; | 95 var name = property.name; |
94 if (!isArray || name !== String(i) || i >= arrayLength) { | 96 if (!isArray || name !== String(i) || i >= arrayLength) { |
95 if (/^\s|\s$|^$|\n/.test(name)) | 97 if (/^\s|\s$|^$|\n/.test(name)) |
96 parentElement.createChild('span', 'name').createTextChildren('"', name
.replace(/\n/g, '\u21B5'), '"'); | 98 parentElement.createChild('span', 'name').createTextChildren('"', name
.replace(/\n/g, '\u21B5'), '"'); |
97 else | 99 else |
98 parentElement.createChild('span', 'name').textContent = name; | 100 parentElement.createChild('span', 'name').textContent = name; |
99 parentElement.createTextChild(': '); | 101 parentElement.createTextChild(': '); |
100 } | 102 } |
101 | 103 |
102 parentElement.appendChild(this._renderPropertyPreviewOrAccessor([property]
)); | 104 parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property],
objectForAccessing)); |
103 } | 105 } |
104 if (preview.overflow) | 106 if (preview.overflow) |
105 parentElement.createChild('span').textContent = '\u2026'; | 107 parentElement.createChild('span').textContent = '\u2026'; |
106 parentElement.createTextChild(isArray ? ']' : '}'); | 108 parentElement.createTextChild(isArray ? ']' : '}'); |
107 } | 109 } |
108 | 110 |
109 /** | 111 /** |
110 * @param {!Element} parentElement | 112 * @param {!Element} parentElement |
111 * @param {!Protocol.Runtime.ObjectPreview} preview | 113 * @param {!Protocol.Runtime.ObjectPreview} preview |
112 */ | 114 */ |
(...skipping 10 matching lines...) Expand all Loading... |
123 } | 125 } |
124 this.appendObjectPreview(parentElement, entry.value); | 126 this.appendObjectPreview(parentElement, entry.value); |
125 } | 127 } |
126 if (preview.overflow) | 128 if (preview.overflow) |
127 parentElement.createChild('span').textContent = '\u2026'; | 129 parentElement.createChild('span').textContent = '\u2026'; |
128 parentElement.createTextChild('}'); | 130 parentElement.createTextChild('}'); |
129 } | 131 } |
130 | 132 |
131 /** | 133 /** |
132 * @param {!Array.<!Protocol.Runtime.PropertyPreview>} propertyPath | 134 * @param {!Array.<!Protocol.Runtime.PropertyPreview>} propertyPath |
| 135 * @param {!SDK.RemoteObject=} objectForAccessing |
133 * @return {!Element} | 136 * @return {!Element} |
134 */ | 137 */ |
135 _renderPropertyPreviewOrAccessor(propertyPath) { | 138 renderPropertyPreviewOrAccessor(propertyPath, objectForAccessing) { |
136 var property = propertyPath.peekLast(); | 139 var property = propertyPath.peekLast(); |
| 140 if (property.type === 'accessor' && objectForAccessing) |
| 141 return this.formatAsAccessorProperty([property.name], objectForAccessing); |
137 return this.renderPropertyPreview(property.type, /** @type {string} */ (prop
erty.subtype), property.value); | 142 return this.renderPropertyPreview(property.type, /** @type {string} */ (prop
erty.subtype), property.value); |
138 } | 143 } |
139 | 144 |
140 /** | 145 /** |
141 * @param {string} type | 146 * @param {string} type |
142 * @param {string=} subtype | 147 * @param {string=} subtype |
143 * @param {string=} description | 148 * @param {string=} description |
144 * @return {!Element} | 149 * @return {!Element} |
145 */ | 150 */ |
146 renderPropertyPreview(type, subtype, description) { | 151 renderPropertyPreview(type, subtype, description) { |
(...skipping 16 matching lines...) Expand all Loading... |
163 } | 168 } |
164 | 169 |
165 if (type === 'object' && !subtype) { | 170 if (type === 'object' && !subtype) { |
166 span.textContent = this._abbreviateFullQualifiedClassName(description); | 171 span.textContent = this._abbreviateFullQualifiedClassName(description); |
167 return span; | 172 return span; |
168 } | 173 } |
169 | 174 |
170 span.textContent = description; | 175 span.textContent = description; |
171 return span; | 176 return span; |
172 } | 177 } |
| 178 |
| 179 /** |
| 180 * @param {!Array.<string>} propertyPath |
| 181 * @param {?SDK.RemoteObject} object |
| 182 * @return {!Element} |
| 183 */ |
| 184 formatAsAccessorProperty(propertyPath, object) { |
| 185 var rootElement = Components.ObjectPropertyTreeElement.createRemoteObjectAcc
essorPropertySpan( |
| 186 object, propertyPath, onInvokeGetterClick.bind(this)); |
| 187 |
| 188 /** |
| 189 * @param {?SDK.RemoteObject} result |
| 190 * @param {boolean=} wasThrown |
| 191 * @this {Components.RemoteObjectPreviewFormatter} |
| 192 */ |
| 193 function onInvokeGetterClick(result, wasThrown) { |
| 194 if (!result) |
| 195 return; |
| 196 rootElement.removeChildren(); |
| 197 if (wasThrown) { |
| 198 var element = rootElement.createChild('span'); |
| 199 element.textContent = Common.UIString('<exception>'); |
| 200 element.title = /** @type {string} */ (result.description); |
| 201 } else { |
| 202 // Make a PropertyPreview from the RemoteObject similar to the backend l
ogic. |
| 203 const maxLength = 100; |
| 204 var type = result.type; |
| 205 var subtype = result.subtype; |
| 206 var description = ''; |
| 207 if (type !== 'function' && result.description) { |
| 208 if (type === 'string' || subtype === 'regexp') |
| 209 description = result.description.trimMiddle(maxLength); |
| 210 else |
| 211 description = result.description.trimEnd(maxLength); |
| 212 } |
| 213 rootElement.appendChild(this.renderPropertyPreview(type, subtype, descri
ption)); |
| 214 } |
| 215 } |
| 216 |
| 217 return rootElement; |
| 218 } |
173 }; | 219 }; |
OLD | NEW |