Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(552)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js

Issue 2515913002: DevTools: object formatter renders arrays the same way as printArrayResult() (Closed)
Patch Set: DevTools: object formatter renders arrays the same way as printArrayResult() Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/debugger-inline-values-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 * @param {!SDK.RemoteObject=} objectForAccessing
12 */ 12 */
13 appendObjectPreview(parentElement, preview, objectForAccessing) { 13 appendObjectPreview(parentElement, preview, objectForAccessing) {
14 var description = preview.description; 14 var description = preview.description;
15 if (preview.type !== 'object' || preview.subtype === 'null') { 15 if (preview.type !== 'object' || preview.subtype === 'null') {
16 parentElement.appendChild(this.renderPropertyPreview(preview.type, preview .subtype, description)); 16 parentElement.appendChild(this.renderPropertyPreview(preview.type, preview .subtype, description));
17 return; 17 return;
18 } 18 }
19 if (description && preview.subtype !== 'array' && preview.subtype !== 'typed array') { 19 var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray ';
20 if (description && !isArray) {
20 var text = preview.subtype ? description : this._abbreviateFullQualifiedCl assName(description); 21 var text = preview.subtype ? description : this._abbreviateFullQualifiedCl assName(description);
21 parentElement.createTextChildren(text, ' '); 22 parentElement.createTextChildren(text, ' ');
22 } 23 }
24
25 parentElement.createTextChild(isArray ? '[' : '{');
23 if (preview.entries) 26 if (preview.entries)
24 this._appendEntriesPreview(parentElement, preview); 27 this._appendEntriesPreview(parentElement, preview);
28 else if (isArray)
29 this._appendArrayPropertiesPreview(parentElement, preview, objectForAccess ing);
25 else 30 else
26 this._appendPropertiesPreview(parentElement, preview, objectForAccessing); 31 this._appendPropertiesPreview(parentElement, preview, objectForAccessing);
32 if (preview.overflow)
33 parentElement.createChild('span').textContent = '\u2026';
34 parentElement.createTextChild(isArray ? ']' : '}');
27 } 35 }
28 36
29 /** 37 /**
30 * @param {string} description 38 * @param {string} description
31 * @return {string} 39 * @return {string}
32 */ 40 */
33 _abbreviateFullQualifiedClassName(description) { 41 _abbreviateFullQualifiedClassName(description) {
34 var abbreviatedDescription = description.split('.'); 42 var abbreviatedDescription = description.split('.');
35 for (var i = 0; i < abbreviatedDescription.length - 1; ++i) 43 for (var i = 0; i < abbreviatedDescription.length - 1; ++i)
36 abbreviatedDescription[i] = abbreviatedDescription[i].trimMiddle(3); 44 abbreviatedDescription[i] = abbreviatedDescription[i].trimMiddle(3);
37 return abbreviatedDescription.join('.'); 45 return abbreviatedDescription.join('.');
38 } 46 }
39 47
40 /** 48 /**
41 * @param {!Element} parentElement 49 * @param {!Element} parentElement
42 * @param {!Protocol.Runtime.ObjectPreview} preview 50 * @param {!Protocol.Runtime.ObjectPreview} preview
43 * @param {!SDK.RemoteObject=} objectForAccessing 51 * @param {!SDK.RemoteObject=} objectForAccessing
44 */ 52 */
45 _appendPropertiesPreview(parentElement, preview, objectForAccessing) { 53 _appendPropertiesPreview(parentElement, preview, objectForAccessing) {
46 var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray '; 54 var properties = preview.properties.slice().stableSort(compareFunctionsLast) ;
47 var arrayLength = SDK.RemoteObject.arrayLength(preview);
48 var properties = preview.properties;
49 if (isArray)
50 properties = properties.slice().stableSort(compareIndexesFirst);
51 else
52 properties = properties.slice().stableSort(compareFunctionsLast);
53 55
54 /** 56 /**
55 * @param {!Protocol.Runtime.PropertyPreview} a 57 * @param {!Protocol.Runtime.PropertyPreview} a
56 * @param {!Protocol.Runtime.PropertyPreview} b 58 * @param {!Protocol.Runtime.PropertyPreview} b
57 */ 59 */
58 function compareFunctionsLast(a, b) { 60 function compareFunctionsLast(a, b) {
59 if (a.type !== 'function' && b.type === 'function') 61 if (a.type !== 'function' && b.type === 'function')
60 return -1; 62 return -1;
61 if (a.type === 'function' && b.type !== 'function') 63 if (a.type === 'function' && b.type !== 'function')
62 return 1; 64 return 1;
63 return 0; 65 return 0;
64 } 66 }
65 67
68 for (var i = 0; i < properties.length; ++i) {
69 if (i > 0)
70 parentElement.createTextChild(', ');
71
72 var property = properties[i];
73 var name = property.name;
74 if (/^\s|\s$|^$|\n/.test(name))
75 parentElement.createChild('span', 'name').createTextChildren('"', name.r eplace(/\n/g, '\u21B5'), '"');
76 else
77 parentElement.createChild('span', 'name').textContent = name;
78 parentElement.createTextChild(': ');
79 parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing));
80 }
81 }
82
83 /**
84 * @param {!Element} parentElement
85 * @param {!Protocol.Runtime.ObjectPreview} preview
86 * @param {!SDK.RemoteObject=} objectForAccessing
87 */
88 _appendArrayPropertiesPreview(parentElement, preview, objectForAccessing) {
89 var arrayLength = SDK.RemoteObject.arrayLength(preview);
90 var properties = preview.properties.slice().stableSort(compareIndexesFirst);
91 var lastNonEmptyArrayIndex = -1;
92 for (var i = 0; i < properties.length; ++i) {
93 var property = properties[i];
94 var name = property.name;
95 if (isNaN(name))
96 continue;
97 if (i > 0)
98 parentElement.createTextChild(', ');
99 var index = parseInt(name, 10);
100 if (index - lastNonEmptyArrayIndex > 1) {
101 appendUndefined(index);
102 parentElement.createTextChild(', ');
103 }
104 parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing));
105 lastNonEmptyArrayIndex = index;
106 }
107 if (lastNonEmptyArrayIndex > -1 && arrayLength - lastNonEmptyArrayIndex > 1) {
108 parentElement.createTextChild(', ');
109 appendUndefined(arrayLength);
110 }
111
112 /**
113 * @param {number} index
114 */
115 function appendUndefined(index) {
116 var span = parentElement.createChild('span', 'object-value-undefined');
117 var gapSize = index - lastNonEmptyArrayIndex - 1;
118 span.textContent = gapSize > 1 ? Common.UIString('undefined × %d', gapSize ) : Common.UIString('undefined');
119 }
120
66 /** 121 /**
67 * @param {!Protocol.Runtime.PropertyPreview} a 122 * @param {!Protocol.Runtime.PropertyPreview} a
68 * @param {!Protocol.Runtime.PropertyPreview} b 123 * @param {!Protocol.Runtime.PropertyPreview} b
69 */ 124 */
70 function compareIndexesFirst(a, b) { 125 function compareIndexesFirst(a, b) {
71 var index1 = toArrayIndex(a.name); 126 var index1 = toArrayIndex(a.name);
72 var index2 = toArrayIndex(b.name); 127 var index2 = toArrayIndex(b.name);
73 if (index1 < 0) 128 if (index1 < 0)
74 return index2 < 0 ? 0 : 1; 129 return index2 < 0 ? 0 : 1;
75 return index2 < 0 ? -1 : index1 - index2; 130 return index2 < 0 ? -1 : index1 - index2;
76 } 131 }
77 132
78 /** 133 /**
79 * @param {string} name 134 * @param {string} name
80 * @return {number} 135 * @return {number}
81 */ 136 */
82 function toArrayIndex(name) { 137 function toArrayIndex(name) {
83 var index = name >>> 0; 138 var index = name >>> 0;
84 if (String(index) === name && index < arrayLength) 139 if (String(index) === name && index < arrayLength)
85 return index; 140 return index;
86 return -1; 141 return -1;
87 } 142 }
88
89 parentElement.createTextChild(isArray ? '[' : '{');
90 for (var i = 0; i < properties.length; ++i) {
91 if (i > 0)
92 parentElement.createTextChild(', ');
93
94 var property = properties[i];
95 var name = property.name;
96 if (!isArray || name !== String(i) || i >= arrayLength) {
97 if (/^\s|\s$|^$|\n/.test(name))
98 parentElement.createChild('span', 'name').createTextChildren('"', name .replace(/\n/g, '\u21B5'), '"');
99 else
100 parentElement.createChild('span', 'name').textContent = name;
101 parentElement.createTextChild(': ');
102 }
103
104 parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing));
105 }
106 if (preview.overflow)
107 parentElement.createChild('span').textContent = '\u2026';
108 parentElement.createTextChild(isArray ? ']' : '}');
109 } 143 }
110 144
111 /** 145 /**
112 * @param {!Element} parentElement 146 * @param {!Element} parentElement
113 * @param {!Protocol.Runtime.ObjectPreview} preview 147 * @param {!Protocol.Runtime.ObjectPreview} preview
114 */ 148 */
115 _appendEntriesPreview(parentElement, preview) { 149 _appendEntriesPreview(parentElement, preview) {
116 parentElement.createTextChild('{');
117 for (var i = 0; i < preview.entries.length; ++i) { 150 for (var i = 0; i < preview.entries.length; ++i) {
118 if (i > 0) 151 if (i > 0)
119 parentElement.createTextChild(', '); 152 parentElement.createTextChild(', ');
120 153
121 var entry = preview.entries[i]; 154 var entry = preview.entries[i];
122 if (entry.key) { 155 if (entry.key) {
123 this.appendObjectPreview(parentElement, entry.key); 156 this.appendObjectPreview(parentElement, entry.key);
124 parentElement.createTextChild(' => '); 157 parentElement.createTextChild(' => ');
125 } 158 }
126 this.appendObjectPreview(parentElement, entry.value); 159 this.appendObjectPreview(parentElement, entry.value);
127 } 160 }
128 if (preview.overflow)
129 parentElement.createChild('span').textContent = '\u2026';
130 parentElement.createTextChild('}');
131 } 161 }
132 162
133 /** 163 /**
134 * @param {!Array.<!Protocol.Runtime.PropertyPreview>} propertyPath 164 * @param {!Array.<!Protocol.Runtime.PropertyPreview>} propertyPath
135 * @param {!SDK.RemoteObject=} objectForAccessing 165 * @param {!SDK.RemoteObject=} objectForAccessing
136 * @return {!Element} 166 * @return {!Element}
137 */ 167 */
138 renderPropertyPreviewOrAccessor(propertyPath, objectForAccessing) { 168 renderPropertyPreviewOrAccessor(propertyPath, objectForAccessing) {
139 var property = propertyPath.peekLast(); 169 var property = propertyPath.peekLast();
140 if (property.type === 'accessor' && objectForAccessing) 170 if (property.type === 'accessor' && objectForAccessing)
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 else 240 else
211 description = result.description.trimEnd(maxLength); 241 description = result.description.trimEnd(maxLength);
212 } 242 }
213 rootElement.appendChild(this.renderPropertyPreview(type, subtype, descri ption)); 243 rootElement.appendChild(this.renderPropertyPreview(type, subtype, descri ption));
214 } 244 }
215 } 245 }
216 246
217 return rootElement; 247 return rootElement;
218 } 248 }
219 }; 249 };
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/inspector/sources/debugger-ui/debugger-inline-values-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698