+2017-07-25 Joseph Pecoraro <pecoraro@apple.com>
+
+ Web Inspector: Inline multiple console log values if they are simple
+ https://bugs.webkit.org/show_bug.cgi?id=174746
+ <rdar://problem/33469376>
+
+ Reviewed by Matt Baker.
+
+ * UserInterface/Models/IssueMessage.js:
+ * UserInterface/Protocol/RemoteObject.js:
+ (WebInspector.RemoteObject.type): Deleted.
+ Remove this as it isn't as useful as directly checking the type.
+
+ * UserInterface/Views/ConsoleMessageView.js:
+ (WebInspector.ConsoleMessageView.prototype._appendExtraParameters):
+ (WebInspector.ConsoleMessageView.prototype._appendFormattedArguments):
+ (WebInspector.ConsoleMessageView.prototype._hasSimpleDisplay):
+ (WebInspector.ConsoleMessageView.prototype._isStackTrace):
+ For leading primitive/simple values, display them inline on the console message.
+
+ * UserInterface/Views/FormattedValue.js:
+ (WebInspector.FormattedValue.hasSimpleDisplay):
+ Provide a helper to determine if a formatted value will be simple.
+
2017-07-25 Nikita Vasilyev <nvasilyev@apple.com>
Web Inspector: Styles: Add a switch for Spreadsheet model style editor to experimental settings
this._makeExpandable();
- // Auto-expand if there are multiple objects.
+ // Auto-expand if there are multiple objects or if there were simple parameters.
if (this._extraParameters.length > 1)
this.expand();
if (!parameters.length)
return;
- for (var i = 0; i < parameters.length; ++i)
+ for (let i = 0; i < parameters.length; ++i)
parameters[i] = this._createRemoteObjectIfNeeded(parameters[i]);
- var builderElement = element.appendChild(document.createElement("span"));
- var shouldFormatWithStringSubstitution = WebInspector.RemoteObject.type(parameters[0]) === "string" && this._message.type !== WebInspector.ConsoleMessage.MessageType.Result;
+ let builderElement = element.appendChild(document.createElement("span"));
+ let shouldFormatWithStringSubstitution = parameters[0].type === "string" && this._message.type !== WebInspector.ConsoleMessage.MessageType.Result;
// Single object (e.g. console result or logging a non-string object).
if (parameters.length === 1 && !shouldFormatWithStringSubstitution) {
// Format string / message / default message.
if (shouldFormatWithStringSubstitution) {
- var result = this._formatWithSubstitutionString(parameters, builderElement);
+ let result = this._formatWithSubstitutionString(parameters, builderElement);
parameters = result.unusedSubstitutions;
this._extraParameters = parameters;
} else {
- var defaultMessage = WebInspector.UIString("No message");
+ let defaultMessage = WebInspector.UIString("No message");
builderElement.append(defaultMessage);
}
- // Trailing parameters.
+ // Trailing inline parameters.
if (parameters.length) {
- let enclosedElement = document.createElement("span");
+ let simpleParametersCount = 0;
+ for (let parameter of parameters) {
+ if (!this._hasSimpleDisplay(parameter))
+ break;
+ simpleParametersCount++;
+ }
+
+ // Show one or more simple parameters inline on the message line.
+ if (simpleParametersCount) {
+ let simpleParameters = parameters.splice(0, simpleParametersCount);
+ this._extraParameters = parameters;
+
+ for (let parameter of simpleParameters) {
+ let enclosedElement = builderElement.appendChild(document.createElement("span"));
+ enclosedElement.classList.add("console-message-preview-divider", "inline-lossless");
+ enclosedElement.textContent = ` ${enDash} `;
+
+ let previewContainer = builderElement.appendChild(document.createElement("span"));
+ previewContainer.classList.add("inline-lossless");
+
+ let preview = WebInspector.FormattedValue.createObjectPreviewOrFormattedValueForRemoteObject(parameter, WebInspector.ObjectPreviewView.Mode.Brief);
+ let isPreviewView = preview instanceof WebInspector.ObjectPreviewView;
+
+ if (isPreviewView)
+ preview.setOriginatingObjectInfo(parameter, null);
+
+ let previewElement = isPreviewView ? preview.element : preview;
+ previewContainer.appendChild(previewElement);
+
+ // Simple displayable parameters should pretty much always be lossless.
+ // An exception might be a truncated string.
+ console.assert((isPreviewView && preview.lossless) || (!isPreviewView && this._shouldConsiderObjectLossless(parameter)));
+ }
+ }
+ // If there is a single non-simple parameter after simple paramters, show it inline.
if (parameters.length === 1 && !this._isStackTrace(parameters[0])) {
let parameter = parameters[0];
- // Single object. Show a preview.
- builderElement.append(enclosedElement);
+ let enclosedElement = builderElement.appendChild(document.createElement("span"));
enclosedElement.classList.add("console-message-preview-divider");
- enclosedElement.textContent = " \u2013 ";
+ enclosedElement.textContent = ` ${enDash} `;
- var previewContainer = builderElement.appendChild(document.createElement("span"));
+ let previewContainer = builderElement.appendChild(document.createElement("span"));
previewContainer.classList.add("console-message-preview");
- var preview = WebInspector.FormattedValue.createObjectPreviewOrFormattedValueForRemoteObject(parameter, WebInspector.ObjectPreviewView.Mode.Brief);
- var isPreviewView = preview instanceof WebInspector.ObjectPreviewView;
+ let preview = WebInspector.FormattedValue.createObjectPreviewOrFormattedValueForRemoteObject(parameter, WebInspector.ObjectPreviewView.Mode.Brief);
+ let isPreviewView = preview instanceof WebInspector.ObjectPreviewView;
if (isPreviewView)
preview.setOriginatingObjectInfo(parameter, null);
- var previewElement = isPreviewView ? preview.element : preview;
+ let previewElement = isPreviewView ? preview.element : preview;
previewContainer.appendChild(previewElement);
// If this preview is effectively lossless, we can avoid making this console message expandable.
enclosedElement.classList.add("inline-lossless");
previewContainer.classList.add("inline-lossless");
}
- } else {
- // Multiple objects. Show an indicator.
+ } else if (parameters.length) {
+ // Multiple remaining objects. Show an indicator and they will be appended as extra parameters.
+ let enclosedElement = document.createElement("span");
builderElement.append(" ", enclosedElement);
enclosedElement.classList.add("console-message-enclosed");
enclosedElement.textContent = "(" + parameters.length + ")";
}
}
- _isStackTrace(parameter)
+ _hasSimpleDisplay(parameter)
{
console.assert(parameter instanceof WebInspector.RemoteObject);
- if (WebInspector.RemoteObject.type(parameter) !== "string")
- return false;
+ return WebInspector.FormattedValue.hasSimpleDisplay(parameter) && !this._isStackTrace(parameter);
+ }
+
+ _isStackTrace(parameter)
+ {
+ console.assert(parameter instanceof WebInspector.RemoteObject);
- return WebInspector.StackTrace.isLikelyStackTrace(parameter.description);
+ return parameter.type === "string" && WebInspector.StackTrace.isLikelyStackTrace(parameter.description);
}
_shouldConsiderObjectLossless(object)