| 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 |