Index: third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js b/third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js |
index 40c57590953542fb5f39dbb1c92aae913e42ddd1..d699ac7ab4ae2f8344bf17043dd920dd55d44fdf 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js |
+++ b/third_party/WebKit/Source/devtools/front_end/components/RemoteObjectPreviewFormatter.js |
@@ -16,14 +16,22 @@ Components.RemoteObjectPreviewFormatter = class { |
parentElement.appendChild(this.renderPropertyPreview(preview.type, preview.subtype, description)); |
return; |
} |
- if (description && preview.subtype !== 'array' && preview.subtype !== 'typedarray') { |
+ var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray'; |
+ if (description && !isArray) { |
var text = preview.subtype ? description : this._abbreviateFullQualifiedClassName(description); |
parentElement.createTextChildren(text, ' '); |
} |
+ |
+ parentElement.createTextChild(isArray ? '[' : '{'); |
if (preview.entries) |
this._appendEntriesPreview(parentElement, preview); |
+ else if (isArray) |
+ this._appendArrayPropertiesPreview(parentElement, preview, objectForAccessing); |
else |
this._appendPropertiesPreview(parentElement, preview, objectForAccessing); |
+ if (preview.overflow) |
+ parentElement.createChild('span').textContent = '\u2026'; |
+ parentElement.createTextChild(isArray ? ']' : '}'); |
} |
/** |
@@ -43,13 +51,7 @@ Components.RemoteObjectPreviewFormatter = class { |
* @param {!SDK.RemoteObject=} objectForAccessing |
*/ |
_appendPropertiesPreview(parentElement, preview, objectForAccessing) { |
- var isArray = preview.subtype === 'array' || preview.subtype === 'typedarray'; |
- var arrayLength = SDK.RemoteObject.arrayLength(preview); |
- var properties = preview.properties; |
- if (isArray) |
- properties = properties.slice().stableSort(compareIndexesFirst); |
- else |
- properties = properties.slice().stableSort(compareFunctionsLast); |
+ var properties = preview.properties.slice().stableSort(compareFunctionsLast); |
/** |
* @param {!Protocol.Runtime.PropertyPreview} a |
@@ -63,6 +65,59 @@ Components.RemoteObjectPreviewFormatter = class { |
return 0; |
} |
+ for (var i = 0; i < properties.length; ++i) { |
+ if (i > 0) |
+ parentElement.createTextChild(', '); |
+ |
+ var property = properties[i]; |
+ var name = property.name; |
+ if (/^\s|\s$|^$|\n/.test(name)) |
+ parentElement.createChild('span', 'name').createTextChildren('"', name.replace(/\n/g, '\u21B5'), '"'); |
+ else |
+ parentElement.createChild('span', 'name').textContent = name; |
+ parentElement.createTextChild(': '); |
+ parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing)); |
+ } |
+ } |
+ |
+ /** |
+ * @param {!Element} parentElement |
+ * @param {!Protocol.Runtime.ObjectPreview} preview |
+ * @param {!SDK.RemoteObject=} objectForAccessing |
+ */ |
+ _appendArrayPropertiesPreview(parentElement, preview, objectForAccessing) { |
+ var arrayLength = SDK.RemoteObject.arrayLength(preview); |
+ var properties = preview.properties.slice().stableSort(compareIndexesFirst); |
+ var lastNonEmptyArrayIndex = -1; |
+ for (var i = 0; i < properties.length; ++i) { |
+ var property = properties[i]; |
+ var name = property.name; |
+ if (isNaN(name)) |
+ continue; |
+ if (i > 0) |
+ parentElement.createTextChild(', '); |
+ var index = parseInt(name, 10); |
+ if (index - lastNonEmptyArrayIndex > 1) { |
+ appendUndefined(index); |
+ parentElement.createTextChild(', '); |
+ } |
+ parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing)); |
+ lastNonEmptyArrayIndex = index; |
+ } |
+ if (lastNonEmptyArrayIndex > -1 && arrayLength - lastNonEmptyArrayIndex > 1) { |
+ parentElement.createTextChild(', '); |
+ appendUndefined(arrayLength); |
+ } |
+ |
+ /** |
+ * @param {number} index |
+ */ |
+ function appendUndefined(index) { |
+ var span = parentElement.createChild('span', 'object-value-undefined'); |
+ var gapSize = index - lastNonEmptyArrayIndex - 1; |
+ span.textContent = gapSize > 1 ? Common.UIString('undefined × %d', gapSize) : Common.UIString('undefined'); |
+ } |
+ |
/** |
* @param {!Protocol.Runtime.PropertyPreview} a |
* @param {!Protocol.Runtime.PropertyPreview} b |
@@ -85,27 +140,6 @@ Components.RemoteObjectPreviewFormatter = class { |
return index; |
return -1; |
} |
- |
- parentElement.createTextChild(isArray ? '[' : '{'); |
- for (var i = 0; i < properties.length; ++i) { |
- if (i > 0) |
- parentElement.createTextChild(', '); |
- |
- var property = properties[i]; |
- var name = property.name; |
- if (!isArray || name !== String(i) || i >= arrayLength) { |
- if (/^\s|\s$|^$|\n/.test(name)) |
- parentElement.createChild('span', 'name').createTextChildren('"', name.replace(/\n/g, '\u21B5'), '"'); |
- else |
- parentElement.createChild('span', 'name').textContent = name; |
- parentElement.createTextChild(': '); |
- } |
- |
- parentElement.appendChild(this.renderPropertyPreviewOrAccessor([property], objectForAccessing)); |
- } |
- if (preview.overflow) |
- parentElement.createChild('span').textContent = '\u2026'; |
- parentElement.createTextChild(isArray ? ']' : '}'); |
} |
/** |
@@ -113,7 +147,6 @@ Components.RemoteObjectPreviewFormatter = class { |
* @param {!Protocol.Runtime.ObjectPreview} preview |
*/ |
_appendEntriesPreview(parentElement, preview) { |
- parentElement.createTextChild('{'); |
for (var i = 0; i < preview.entries.length; ++i) { |
if (i > 0) |
parentElement.createTextChild(', '); |
@@ -125,9 +158,6 @@ Components.RemoteObjectPreviewFormatter = class { |
} |
this.appendObjectPreview(parentElement, entry.value); |
} |
- if (preview.overflow) |
- parentElement.createChild('span').textContent = '\u2026'; |
- parentElement.createTextChild('}'); |
} |
/** |