<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[179019] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/179019">179019</a></dd>
<dt>Author</dt> <dd>joepeck@webkit.org</dd>
<dt>Date</dt> <dd>2015-01-23 12:05:44 -0800 (Fri, 23 Jan 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Object Previews in the Console
https://bugs.webkit.org/show_bug.cgi?id=129204

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

Update the very old, unused object preview code. Part of this comes from
the earlier WebKit legacy implementation, and the Blink implementation.

A RemoteObject may include a preview, if it is asked for, and if the
RemoteObject is an object. Previews are a shallow (single level) list
of a limited number of properties on the object. The previewed
properties are always stringified (even if primatives). Previews are
limited to just 5 properties or 100 indices. Previews are marked
as lossless if they are a complete snapshot of the object.

There is a path to make previews two levels deep, that is currently
unused but should soon be used for tables (e.g. IndexedDB).

* inspector/InjectedScriptSource.js:
- Move some code off of InjectedScript to be generic functions
usable by RemoteObject as well.
- Update preview generation to use

* inspector/protocol/Runtime.json:
- Add a new type, &quot;accessor&quot; for preview objects. This represents
a getter / setter. We currently don't get the value.

Source/WebInspectorUI:

* UserInterface/Controllers/JavaScriptLogViewController.js:
(WebInspector.JavaScriptLogViewController.prototype.consolePromptTextCommitted):
* UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js:
(get WebInspector.JavaScriptRuntimeCompletionProvider.prototype.):
Update RuntimeManager callsites that do not need object previews.

* UserInterface/Controllers/RuntimeManager.js:
(WebInspector.RuntimeManager.prototype.evalCallback):
(WebInspector.RuntimeManager.prototype.evaluateInInspectedWindow):
Update the main evaluate method to include a boolean parameter for
object previews. Most callers do not need them. Also, since previews
were not available on iOS 6, switch to invoke, to conditionally
include the command parameter.

* UserInterface/Protocol/RemoteObject.js:
(WebInspector.RemoteObject):
(WebInspector.RemoteObject.fromPayload):
(WebInspector.RemoteObject.prototype.get preview):
Store the preview from the payload.

* UserInterface/Views/ConsoleMessageImpl.js:
(WebInspector.ConsoleMessageImpl.prototype._format):
(WebInspector.ConsoleMessageImpl.prototype._formatParameter):
(WebInspector.ConsoleMessageImpl.prototype._formatParameterAsNode):
(WebInspector.ConsoleMessageImpl.prototype._formatParameterAsString):
(WebInspector.ConsoleMessageImpl.prototype._formatAsArrayEntry):
Pass an explicit false for most formatters to not use a preview if available.

(WebInspector.ConsoleMessageImpl.prototype._formatParameterAsArray):
(WebInspector.ConsoleMessageImpl.prototype._formatParameterAsObject):
Currently only object types are previewed. Though we request previews
for arrays, we don't use the preview because we show a better preview
by just immediately requesting for a full non-preview property list.

(WebInspector.ConsoleMessageImpl.prototype._appendObjectPreview):
Quickly output an object preview into the title element. The format
is &quot;ClassName {prop: value...}&quot;. Elide the class name if it is &quot;Object&quot;.
Also skip over certain preview properties that may not be useful
at a glance (like constructor, or accessors without values).

* UserInterface/Views/LogContentView.css:
(.console-object-preview):
(.console-formatted-array .console-object-preview):
(.console-object-preview-lossless):
(.expanded .console-object-preview):
Show lossy previews in italics.
Show lossless previews and array previews without italics.
Do not show the class name in the preview in italics when expanded.

(.console-object-preview .name):
Give preview property names the same color as ObjectPropertiesSection property names.

(.expanded .console-object-preview &gt; .console-object-preview-body):
When expanding an object, hide the preview.

(.console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object):
(.expanded .console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object):
For &quot;Object&quot; previews, hide the name &quot;Object&quot; when not expanded, and show it when expanded.

LayoutTests:

* inspector/debugger/command-line-api-exception-nested-catch.html:
* inspector/debugger/command-line-api-exception.html:
* inspector/model/remote-object-get-properties.html:
Update RuntimeManager callsites to not ask for previews when evaluating.

* inspector/model/remote-object-expected.txt: Added.
* inspector/model/remote-object.html: Added.
Add a test specifically for Remote Object. This test can also be
opened in a browser. It attempts to run the gamut of all different
types of objects and shows the RemoteObject constructed for it.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsTestExpectations">trunk/LayoutTests/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggercommandlineapiexceptionnestedcatchhtml">trunk/LayoutTests/inspector/debugger/command-line-api-exception-nested-catch.html</a></li>
<li><a href="#trunkLayoutTestsinspectordebuggercommandlineapiexceptionhtml">trunk/LayoutTests/inspector/debugger/command-line-api-exception.html</a></li>
<li><a href="#trunkLayoutTestsinspectormodelremoteobjectgetpropertieshtml">trunk/LayoutTests/inspector/model/remote-object-get-properties.html</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInjectedScriptSourcejs">trunk/Source/JavaScriptCore/inspector/InjectedScriptSource.js</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolRuntimejson">trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersJavaScriptLogViewControllerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptLogViewController.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersJavaScriptRuntimeCompletionProviderjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersRuntimeManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/RuntimeManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceProtocolRemoteObjectjs">trunk/Source/WebInspectorUI/UserInterface/Protocol/RemoteObject.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsConsoleMessageImpljs">trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageImpl.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsLogContentViewcss">trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.css</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsinspectormodelremoteobjectexpectedtxt">trunk/LayoutTests/inspector/model/remote-object-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectormodelremoteobjecthtml">trunk/LayoutTests/inspector/model/remote-object.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/LayoutTests/ChangeLog        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-01-23  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Object Previews in the Console
+        https://bugs.webkit.org/show_bug.cgi?id=129204
+
+        Reviewed by Timothy Hatcher.
+
+        * inspector/debugger/command-line-api-exception-nested-catch.html:
+        * inspector/debugger/command-line-api-exception.html:
+        * inspector/model/remote-object-get-properties.html:
+        Update RuntimeManager callsites to not ask for previews when evaluating.
+
+        * inspector/model/remote-object-expected.txt: Added.
+        * inspector/model/remote-object.html: Added.
+        Add a test specifically for Remote Object. This test can also be
+        opened in a browser. It attempts to run the gamut of all different
+        types of objects and shows the RemoteObject constructed for it.
+
</ins><span class="cx"> 2015-01-23  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Create a &quot;load and stall&quot; cgi that support byte ranges.
</span></span></pre></div>
<a id="trunkLayoutTestsTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/TestExpectations (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/TestExpectations        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/LayoutTests/TestExpectations        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -95,6 +95,7 @@
</span><span class="cx"> webkit.org/b/137130 inspector/replay [ Skip ]
</span><span class="cx"> webkit.org/b/137131 inspector/timeline [ Skip ]
</span><span class="cx"> inspector/model/remote-object-get-properties.html [ Skip ]
</span><ins>+inspector/model/remote-object.html [ Skip ]
</ins><span class="cx"> 
</span><span class="cx"> # Doesn't work yet, relies on network replay functionality (webkit.org/b/130728, webkit.org/b/129391)
</span><span class="cx"> webkit.org/b/131318 http/tests/inspector/replay/document-last-modified-fallback-value.html [ Skip ]
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggercommandlineapiexceptionnestedcatchhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/command-line-api-exception-nested-catch.html (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/command-line-api-exception-nested-catch.html        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/LayoutTests/inspector/debugger/command-line-api-exception-nested-catch.html        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -16,13 +16,13 @@
</span><span class="cx">     WebInspector.debuggerManager.allExceptionsBreakpoint.disabled = false;
</span><span class="cx"> 
</span><span class="cx">     function dumpCommandLineAPIValue(prefix) {
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception&quot;, &quot;test&quot;, true, true, false, function(result, wasThrown) {
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception&quot;, &quot;test&quot;, true, true, false, false, function(result, wasThrown) {
</ins><span class="cx">             InspectorTest.log(prefix + &quot;: $exception =&gt; &quot; + result.description);
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     function checkIfExceptionValueMatchesVariable(varName) {
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception === &quot; + varName, &quot;test&quot;, true, true, false, function(result, wasThrown) {
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception === &quot; + varName, &quot;test&quot;, true, true, false, false, function(result, wasThrown) {
</ins><span class="cx">             InspectorTest.log(&quot;  CATCH: $exception === &quot; + varName + &quot; ? &quot; + result.description);
</span><span class="cx">         });
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkLayoutTestsinspectordebuggercommandlineapiexceptionhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/debugger/command-line-api-exception.html (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/debugger/command-line-api-exception.html        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/LayoutTests/inspector/debugger/command-line-api-exception.html        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -40,13 +40,13 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     function dumpCommandLineAPIValue(prefix) {
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception&quot;, &quot;test&quot;, true, true, false, function(result, wasThrown) {
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception&quot;, &quot;test&quot;, true, true, false, false, function(result, wasThrown) {
</ins><span class="cx">             InspectorTest.log(prefix + &quot;: $exception =&gt; &quot; + result.description);
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     function checkIfExceptionValueMatchesCatchVariable() {
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception === e&quot;, &quot;test&quot;, true, true, false, function(result, wasThrown) {
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;$exception === e&quot;, &quot;test&quot;, true, true, false, false, function(result, wasThrown) {
</ins><span class="cx">             InspectorTest.log(&quot;STEPPED OUT TO CATCH BLOCK: $exception === e ? &quot; + result.description);
</span><span class="cx">         });
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkLayoutTestsinspectormodelremoteobjectexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/model/remote-object-expected.txt (0 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/model/remote-object-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/model/remote-object-expected.txt        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -0,0 +1,2062 @@
</span><ins>+
+-----------------------------------------------------
+EXPRESSION: null
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;null&quot;,
+  &quot;_description&quot;: &quot;null&quot;,
+  &quot;value&quot;: null
+}
+
+-----------------------------------------------------
+EXPRESSION: undefined
+{
+  &quot;_type&quot;: &quot;undefined&quot;,
+  &quot;_description&quot;: &quot;undefined&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: true
+{
+  &quot;_type&quot;: &quot;boolean&quot;,
+  &quot;_description&quot;: &quot;true&quot;,
+  &quot;value&quot;: true
+}
+
+-----------------------------------------------------
+EXPRESSION: false
+{
+  &quot;_type&quot;: &quot;boolean&quot;,
+  &quot;_description&quot;: &quot;false&quot;,
+  &quot;value&quot;: false
+}
+
+-----------------------------------------------------
+EXPRESSION: 0
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;0&quot;,
+  &quot;value&quot;: 0
+}
+
+-----------------------------------------------------
+EXPRESSION: -0
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;0&quot;,
+  &quot;value&quot;: 0
+}
+
+-----------------------------------------------------
+EXPRESSION: 1
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;1&quot;,
+  &quot;value&quot;: 1
+}
+
+-----------------------------------------------------
+EXPRESSION: -1
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;-1&quot;,
+  &quot;value&quot;: -1
+}
+
+-----------------------------------------------------
+EXPRESSION: 1.234
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;1.234&quot;,
+  &quot;value&quot;: 1.234
+}
+
+-----------------------------------------------------
+EXPRESSION: -1.234
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;-1.234&quot;,
+  &quot;value&quot;: -1.234
+}
+
+-----------------------------------------------------
+EXPRESSION: 1e3
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;1000&quot;,
+  &quot;value&quot;: 1000
+}
+
+-----------------------------------------------------
+EXPRESSION: Number.MAX_VALUE
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;1.7976931348623157e+308&quot;,
+  &quot;value&quot;: 1.7976931348623157e+308
+}
+
+-----------------------------------------------------
+EXPRESSION: Number.MIN_VALUE
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;5e-324&quot;,
+  &quot;value&quot;: 5e-324
+}
+
+-----------------------------------------------------
+EXPRESSION: NaN
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;NaN&quot;,
+  &quot;value&quot;: null
+}
+
+-----------------------------------------------------
+EXPRESSION: Infinity
+{
+  &quot;_type&quot;: &quot;number&quot;,
+  &quot;_description&quot;: &quot;Infinity&quot;,
+  &quot;value&quot;: null
+}
+
+-----------------------------------------------------
+EXPRESSION: ''
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;&quot;,
+  &quot;value&quot;: &quot;&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: '&quot;'
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;\&quot;&quot;,
+  &quot;value&quot;: &quot;\&quot;&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: &quot;'&quot;
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;'&quot;,
+  &quot;value&quot;: &quot;'&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: 'string'
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;string&quot;,
+  &quot;value&quot;: &quot;string&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: 'Unicode…'
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;Unicode…&quot;,
+  &quot;value&quot;: &quot;Unicode…&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: 'I wish I had something to put here.'
+{
+  &quot;_type&quot;: &quot;string&quot;,
+  &quot;_description&quot;: &quot;I wish I had something to put here.&quot;,
+  &quot;value&quot;: &quot;I wish I had something to put here.&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: (function(){})
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function () {}&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: function foo(){}; foo
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function foo() {}&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: function myFunction(a, b) { console.log(a, b); }; myFunction
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function myFunction(a, b) { console.log(a, b); }&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: Array.prototype.push
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function push() {\n    [native code]\n}&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: window.setTimeout
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function setTimeout() {\n    [native code]\n}&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: Object.getOwnPropertyDescriptor({ get getter() { return 1 } }, 'getter').get
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function () { return 1; }&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: Object.getOwnPropertyDescriptor({ set setter(v) { console.log(v); } }, 'setter').set
+{
+  &quot;_type&quot;: &quot;function&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;function (v) { console.log(v); }&quot;
+}
+
+-----------------------------------------------------
+EXPRESSION: / /
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/ /&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot; &quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: /(?:)/
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/(?:)/&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;(?:)&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: /^r(e)g[e]{1,}x+/
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/^r(e)g[e]{1,}x+/&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;^r(e)g[e]{1,}x+&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: /^r(e)g[e]{1,}x+/ig
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/^r(e)g[e]{1,}x+/gi&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;^r(e)g[e]{1,}x+&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new RegExp('')
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/(?:)/&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;(?:)&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new RegExp('test', 'i')
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;regexp&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;/test/i&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;lastIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;global&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;ignoreCase&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;multiline&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;false&quot;
+      },
+      {
+        &quot;name&quot;: &quot;source&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;test&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: []
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[0]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: [1, 2]
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[2]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;2&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: [[1],[2],[3]]
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[3]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;array&quot;,
+        &quot;value&quot;: &quot;Array[1]&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;array&quot;,
+        &quot;value&quot;: &quot;Array[1]&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;array&quot;,
+        &quot;value&quot;: &quot;Array[1]&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: [true, 1, 1.234, 'string', /regex/]
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[5]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1.234&quot;
+      },
+      {
+        &quot;name&quot;: &quot;3&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;string&quot;
+      },
+      {
+        &quot;name&quot;: &quot;4&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;regexp&quot;,
+        &quot;value&quot;: &quot;/regex/&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: arr = []; arr.length = 100; arr
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[100]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: arr = []; arr.length = 100; arr.fill(1)
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[100]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;3&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;4&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;5&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;6&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;7&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;8&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;9&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;10&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;11&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;12&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;13&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;14&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;15&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;16&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;17&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;18&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;19&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;20&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;21&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;22&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;23&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;24&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;25&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;26&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;27&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;28&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;29&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;30&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;31&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;32&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;33&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;34&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;35&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;36&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;37&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;38&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;39&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;40&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;41&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;42&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;43&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;44&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;45&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;46&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;47&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;48&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;49&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;50&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;51&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;52&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;53&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;54&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;55&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;56&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;57&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;58&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;59&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;60&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;61&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;62&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;63&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;64&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;65&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;66&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;67&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;68&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;69&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;70&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;71&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;72&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;73&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;74&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;75&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;76&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;77&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;78&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;79&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;80&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;81&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;82&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;83&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;84&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;85&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;86&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;87&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;88&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;89&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;90&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;91&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;92&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;93&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;94&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;95&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;96&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;97&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;98&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;99&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: arr = []; arr.length = 100; arr[10] = 1; arr
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Array[100]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;10&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: a = null; (function() { a = arguments; })(1, '2', /3/); a
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Arguments[3]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;2&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;regexp&quot;,
+        &quot;value&quot;: &quot;/3/&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new Int32Array(new ArrayBuffer(16))
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Int32Array[4]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;3&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;byteOffset&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;byteLength&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;16&quot;
+      },
+      {
+        &quot;name&quot;: &quot;buffer&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;ArrayBuffer&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i &lt; intArray.length; ++i) intArray[i] = i; intArray
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Int32Array[4]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;2&quot;
+      },
+      {
+        &quot;name&quot;: &quot;3&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;3&quot;
+      },
+      {
+        &quot;name&quot;: &quot;byteOffset&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;byteLength&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;16&quot;
+      },
+      {
+        &quot;name&quot;: &quot;buffer&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;ArrayBuffer&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: ({})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: ({a: 1})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;a&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: ({a: 1, b: &quot;string&quot;, c :/regex/})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;a&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;b&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;string&quot;
+      },
+      {
+        &quot;name&quot;: &quot;c&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;regexp&quot;,
+        &quot;value&quot;: &quot;/regex/&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: ({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;a&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;b&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;getter&quot;,
+        &quot;type&quot;: &quot;accessor&quot;
+      },
+      {
+        &quot;name&quot;: &quot;setter&quot;,
+        &quot;type&quot;: &quot;accessor&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: function Foo() {}; new Foo
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Foo&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Bar&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;_x&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;5&quot;
+      },
+      {
+        &quot;name&quot;: &quot;constructor&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;x&quot;,
+        &quot;type&quot;: &quot;accessor&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: window.loadEvent
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Event&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;clipboardData&quot;,
+        &quot;type&quot;: &quot;undefined&quot;,
+        &quot;value&quot;: &quot;undefined&quot;
+      },
+      {
+        &quot;name&quot;: &quot;type&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;load&quot;
+      },
+      {
+        &quot;name&quot;: &quot;target&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;#document&quot;
+      },
+      {
+        &quot;name&quot;: &quot;currentTarget&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;Window&quot;
+      },
+      {
+        &quot;name&quot;: &quot;eventPhase&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;2&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new ArrayBuffer(16)
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;ArrayBuffer&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;byteLength&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;16&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new DataView(new ArrayBuffer(16))
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;DataView&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;byteOffset&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;0&quot;
+      },
+      {
+        &quot;name&quot;: &quot;byteLength&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;16&quot;
+      },
+      {
+        &quot;name&quot;: &quot;buffer&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;ArrayBuffer&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: document.body
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;node&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;body&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;aLink&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;background&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;bgColor&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;link&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;text&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: div = document.createElement('div'); div.className = 'foo bar'; div
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;node&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;div.foo.bar&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;align&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;title&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;lang&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;translate&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;dir&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: span = document.createElement('span'); span.id = 'foo'; span
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;node&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;span#foo&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;title&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;lang&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;translate&quot;,
+        &quot;type&quot;: &quot;boolean&quot;,
+        &quot;value&quot;: &quot;true&quot;
+      },
+      {
+        &quot;name&quot;: &quot;dir&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;tabIndex&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;-1&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: document.createTextNode('text')
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;node&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;#text&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;wholeText&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;text&quot;
+      },
+      {
+        &quot;name&quot;: &quot;splitText&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;replaceWholeText&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;data&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;text&quot;
+      },
+      {
+        &quot;name&quot;: &quot;length&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;4&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: document.head.children
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;HTMLCollection[3]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;meta&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;script&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;script&quot;
+      },
+      {
+        &quot;name&quot;: &quot;item&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      },
+      {
+        &quot;name&quot;: &quot;namedItem&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: document.getElementsByClassName('my-test')
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;NodeList[3]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;constructor&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;NodeListConstructor&quot;
+      },
+      {
+        &quot;name&quot;: &quot;item&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: document.querySelectorAll('.my-test')
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;array&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;NodeList[3]&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;0&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;1&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;2&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;subtype&quot;: &quot;node&quot;,
+        &quot;value&quot;: &quot;p.my-test&quot;
+      },
+      {
+        &quot;name&quot;: &quot;constructor&quot;,
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;value&quot;: &quot;NodeListConstructor&quot;
+      },
+      {
+        &quot;name&quot;: &quot;item&quot;,
+        &quot;type&quot;: &quot;function&quot;,
+        &quot;value&quot;: &quot;&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: error = null; try { [].x.x; } catch (e) { error = e; }; error
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;error&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;TypeError: undefined is not an object (evaluating '[].x.x')&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;message&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;undefined is not an object (evaluating '[].x.x')&quot;
+      },
+      {
+        &quot;name&quot;: &quot;line&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;column&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;25&quot;
+      },
+      {
+        &quot;name&quot;: &quot;stack&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;eval code\neval@[native code]\n_evaluateOn\n_evaluateAndWrap\nevaluate&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: error = null; try { eval('if()'); } catch (e) { error = e; }; error
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;error&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;SyntaxError: Unexpected token ')'&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;message&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;Unexpected token ')'&quot;
+      },
+      {
+        &quot;name&quot;: &quot;line&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;column&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;25&quot;
+      },
+      {
+        &quot;name&quot;: &quot;stack&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;eval@[native code]\neval code\neval@[native code]\n_evaluateOn\n_evaluateAndWrap\nevaluate&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_subtype&quot;: &quot;error&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Error: IndexSizeError: DOM Exception 1&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: false,
+    &quot;overflow&quot;: true,
+    &quot;properties&quot;: [
+      {
+        &quot;name&quot;: &quot;code&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;name&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;IndexSizeError&quot;
+      },
+      {
+        &quot;name&quot;: &quot;message&quot;,
+        &quot;type&quot;: &quot;string&quot;,
+        &quot;value&quot;: &quot;IndexSizeError: DOM Exception 1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;line&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;1&quot;
+      },
+      {
+        &quot;name&quot;: &quot;column&quot;,
+        &quot;type&quot;: &quot;number&quot;,
+        &quot;value&quot;: &quot;58&quot;
+      }
+    ]
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: Object.seal({})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: Object.freeze({})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Object&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new Map
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Map&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: map = new Map; map.set(1, 2); map.set('key', 'value'); map
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Map&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Map&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: map = new Map; for (var i = 0; i &lt;= 100; i++) map.set(i, i); map
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Map&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: map = new WeakMap; map.set({id:1}, [1,2]); map
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;WeakMap&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new Set
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Set&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: set = new Set; set.add(1); set.add(2); set.add('key'); set
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Set&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Set&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: set = new Set; for (var i = 0; i &lt;= 100; i++) set.add(i); set
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Set&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: new Promise(function(){})
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Promise&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: Promise.reject()
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Promise&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
+-----------------------------------------------------
+EXPRESSION: Promise.resolve()
+{
+  &quot;_type&quot;: &quot;object&quot;,
+  &quot;_objectId&quot;: &quot;&lt;filtered&gt;&quot;,
+  &quot;_description&quot;: &quot;Promise&quot;,
+  &quot;_preview&quot;: {
+    &quot;lossless&quot;: true,
+    &quot;overflow&quot;: false,
+    &quot;properties&quot;: []
+  }
+}
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectormodelremoteobjectgetpropertieshtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/inspector/model/remote-object-get-properties.html (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/model/remote-object-get-properties.html        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/LayoutTests/inspector/model/remote-object-get-properties.html        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx">         InspectorTest.log(&quot;-----------------------------------------------------&quot;);
</span><span class="cx">         InspectorTest.log(&quot;EXPRESSION: &quot; + step.expression);
</span><span class="cx"> 
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, &quot;test&quot;, false, true, false, function(remoteObject, wasThrown) {
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, &quot;test&quot;, false, true, false, false, function(remoteObject, wasThrown) {
</ins><span class="cx">             InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
</span><span class="cx">             InspectorTest.log(&quot;type: &quot; + remoteObject.type);
</span><span class="cx">             if (remoteObject.subtype)
</span></span></pre></div>
<a id="trunkLayoutTestsinspectormodelremoteobjecthtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/model/remote-object.html (0 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/model/remote-object.html                                (rev 0)
+++ trunk/LayoutTests/inspector/model/remote-object.html        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -0,0 +1,193 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
+&lt;script type=&quot;text/javascript&quot; src=&quot;../../http/tests/inspector/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+function test()
+{
+    var currentStepIndex = 0;
+    var steps = [
+    // Special:
+
+        // Null / undefined
+        {expression: &quot;null&quot;},
+        {expression: &quot;undefined&quot;},
+
+    // Primatives:
+
+        // Boolean
+        {expression: &quot;true&quot;},
+        {expression: &quot;false&quot;},
+
+        // Number
+        {expression: &quot;0&quot;},
+        {expression: &quot;-0&quot;},
+        {expression: &quot;1&quot;},
+        {expression: &quot;-1&quot;},
+        {expression: &quot;1.234&quot;},
+        {expression: &quot;-1.234&quot;},
+        {expression: &quot;1e3&quot;},
+        {expression: &quot;Number.MAX_VALUE&quot;},
+        {expression: &quot;Number.MIN_VALUE&quot;},
+        {expression: &quot;NaN&quot;},
+        {expression: &quot;Infinity&quot;},
+
+        // Strings
+        {expression: &quot;''&quot;},
+        {expression: &quot;'\&quot;'&quot;}, // a single quote
+        {expression: &quot;\&quot;'\&quot;&quot;}, // a double quote
+        {expression: &quot;'string'&quot;},
+        {expression: &quot;'Unicode…'&quot;},
+        {expression: &quot;'I wish I had something to put here.'&quot;},
+
+        // Function
+        {expression: &quot;(function(){})&quot;},
+        {expression: &quot;function foo(){}; foo&quot;},
+        {expression: &quot;function myFunction(a, b) { console.log(a, b); }; myFunction&quot;},
+        {expression: &quot;Array.prototype.push&quot;}, // native (ECMAScript)
+        {expression: &quot;window.setTimeout&quot;}, // native (DOM)
+        {expression: &quot;Object.getOwnPropertyDescriptor({ get getter() { return 1 } }, 'getter').get&quot;}, // getter
+        {expression: &quot;Object.getOwnPropertyDescriptor({ set setter(v) { console.log(v); } }, 'setter').set&quot;}, // setter
+
+    // Objects:
+
+        // Date
+        {expression: &quot;new Date(99)&quot;, browserOnly: true},
+        {expression: &quot;new Date(1421903245871)&quot;, browserOnly: true},
+
+        // Regexp
+        {expression: &quot;/ /&quot;},
+        {expression: &quot;/(?:)/&quot;},
+        {expression: &quot;/^r(e)g[e]{1,}x+/&quot;},
+        {expression: &quot;/^r(e)g[e]{1,}x+/ig&quot;},
+        {expression: &quot;new RegExp('')&quot;},
+        {expression: &quot;new RegExp('test', 'i')&quot;},
+
+        // Array
+        {expression: &quot;[]&quot;},
+        {expression: &quot;[1, 2]&quot;},
+        {expression: &quot;[[1],[2],[3]]&quot;},
+        {expression: &quot;[true, 1, 1.234, 'string', /regex/]&quot;},
+        {expression: &quot;arr = []; arr.length = 100; arr&quot;}, // 100 empty elements
+        {expression: &quot;arr = []; arr.length = 100; arr.fill(1)&quot;}, // 100 full elements
+        {expression: &quot;arr = []; arr.length = 100; arr[10] = 1; arr&quot;}, // sparse
+
+        // Array-like (Arguments, TypedArrays)
+        {expression: &quot;a = null; (function() { a = arguments; })(1, '2', /3/); a&quot;},
+        {expression: &quot;new Int32Array(new ArrayBuffer(16))&quot;},
+        {expression: &quot;var intArray = new Int32Array(new ArrayBuffer(16)); for (var i = 0; i &lt; intArray.length; ++i) intArray[i] = i; intArray&quot;},
+
+        // Object
+        {expression: &quot;({})&quot;},
+        {expression: &quot;({a: 1})&quot;},
+        {expression: &quot;({a: 1, b: \&quot;string\&quot;, c :/regex/})&quot;},
+        {expression: &quot;({a:function a(){}, b:function b(){}, get getter(){}, set setter(v){}})&quot;},
+        {expression: &quot;function Foo() {}; new Foo&quot;},
+        {expression: &quot;function Bar() { this._x = 5 }; Bar.prototype = {constructor: Bar, get x() {return this._x;}}; new Bar&quot;},
+        {expression: &quot;window.loadEvent&quot;}, // window.loadEvent is set inside of &lt;body onload=&quot;...&quot;&gt; below.
+        {expression: &quot;new ArrayBuffer(16)&quot;},
+        {expression: &quot;new DataView(new ArrayBuffer(16))&quot;},
+
+        // Node
+        {expression: &quot;document.body&quot;},
+        {expression: &quot;div = document.createElement('div'); div.className = 'foo bar'; div&quot;},
+        {expression: &quot;span = document.createElement('span'); span.id = 'foo'; span&quot;},
+        {expression: &quot;document.createTextNode('text')&quot;},
+
+        // Node Collections (NodeLists / Collections)
+        {expression: &quot;document.all&quot;, browserOnly: true}, // HTMLAllCollection
+        {expression: &quot;document.head.children&quot;}, // HTMLCollection
+        {expression: &quot;document.getElementsByClassName('my-test')&quot;}, // NodeList
+        {expression: &quot;document.querySelectorAll('.my-test')&quot;}, // Non-Live NodeList
+
+        // Error
+        {expression: &quot;error = null; try { [].x.x; } catch (e) { error = e; }; error&quot;},
+        {expression: &quot;error = null; try { eval('if()'); } catch (e) { error = e; }; error&quot;},
+        {expression: &quot;error = null; try { document.createTextNode('').splitText(100); } catch (e) { error = e; }; error&quot;},
+
+    // Improveable:
+
+        // Sealed / Frozen objects.
+        {expression: &quot;Object.seal({})&quot;},
+        {expression: &quot;Object.freeze({})&quot;},
+
+        // Map / WeakMap
+        {expression: &quot;new Map&quot;},
+        {expression: &quot;map = new Map; map.set(1, 2); map.set('key', 'value'); map&quot;},
+        {expression: &quot;map = new Map; map.set({a:1}, {b:2}); map.set(document.body, [1,2]); map&quot;},
+        {expression: &quot;map = new Map; for (var i = 0; i &lt;= 100; i++) map.set(i, i); map&quot;},
+        {expression: &quot;map = new WeakMap; map.set({id:1}, [1,2]); map&quot;},
+
+        // Set
+        {expression: &quot;new Set&quot;},
+        {expression: &quot;set = new Set; set.add(1); set.add(2); set.add('key'); set&quot;},
+        {expression: &quot;set = new Set; set.add({a:1}); set.add(document.body); set.add([1,2]); set&quot;},
+        {expression: &quot;set = new Set; for (var i = 0; i &lt;= 100; i++) set.add(i); set&quot;},
+
+        // Promise
+        {expression: &quot;new Promise(function(){})&quot;},
+        {expression: &quot;Promise.reject()&quot;},
+        {expression: &quot;Promise.resolve()&quot;},
+    ];
+
+    if (!window.WebInspector) {
+        window.steps = steps;
+        return;
+    }
+
+    function remoteObjectJSONFilter(key, value)
+    {
+        if (key === &quot;_objectId&quot;)
+            return &quot;&lt;filtered&gt;&quot;;
+
+        if (key === &quot;_hasChildren&quot;)
+            return undefined;
+
+        return value;
+    }
+
+    function runNextStep() {
+        if (currentStepIndex &gt;= steps.length) {
+            InspectorTest.completeTest();
+            return;
+        }
+
+        var step = steps[currentStepIndex++];
+        if (step.browserOnly) {
+            runNextStep();
+            return;
+        }
+
+        InspectorTest.log(&quot;&quot;);
+        InspectorTest.log(&quot;-----------------------------------------------------&quot;);
+        InspectorTest.log(&quot;EXPRESSION: &quot; + step.expression);
+
+        WebInspector.runtimeManager.evaluateInInspectedWindow(step.expression, &quot;test&quot;, false, true, false, true, function(remoteObject, wasThrown) {
+            InspectorTest.assert(remoteObject instanceof WebInspector.RemoteObject);
+            InspectorTest.log(JSON.stringify(remoteObject, remoteObjectJSONFilter, &quot;  &quot;));
+            runNextStep();
+        });
+    }
+
+    runNextStep();
+}
+
+function runInBrowserTest()
+{
+    if (window.testRunner)
+        return;

+    test(); // get steps.
+
+    for (var step of steps) {
+        console.info(&quot;EXPRESSION&quot;, step.expression);
+        console.log(eval(step.expression));
+    }
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;window.loadEvent = event; runTest(); runInBrowserTest();&quot;&gt;
+    &lt;p class=&quot;my-test&quot;&gt;&lt;/p&gt;&lt;p class=&quot;my-test&quot;&gt;&lt;/p&gt;&lt;p class=&quot;my-test&quot;&gt;&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2015-01-23  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Object Previews in the Console
+        https://bugs.webkit.org/show_bug.cgi?id=129204
+
+        Reviewed by Timothy Hatcher.
+
+        Update the very old, unused object preview code. Part of this comes from
+        the earlier WebKit legacy implementation, and the Blink implementation.
+
+        A RemoteObject may include a preview, if it is asked for, and if the
+        RemoteObject is an object. Previews are a shallow (single level) list
+        of a limited number of properties on the object. The previewed
+        properties are always stringified (even if primatives). Previews are
+        limited to just 5 properties or 100 indices. Previews are marked
+        as lossless if they are a complete snapshot of the object.
+
+        There is a path to make previews two levels deep, that is currently
+        unused but should soon be used for tables (e.g. IndexedDB).
+
+        * inspector/InjectedScriptSource.js:
+        - Move some code off of InjectedScript to be generic functions
+        usable by RemoteObject as well.
+        - Update preview generation to use 
+
+        * inspector/protocol/Runtime.json:
+        - Add a new type, &quot;accessor&quot; for preview objects. This represents
+        a getter / setter. We currently don't get the value.
+
</ins><span class="cx"> 2015-01-23  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Immediate crash when setting JS breakpoint
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInjectedScriptSourcejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InjectedScriptSource.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InjectedScriptSource.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/JavaScriptCore/inspector/InjectedScriptSource.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -1,5 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2007, 2014 Apple Inc.  All rights reserved.
</span><ins>+ * Copyright (C) 2013 Google Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,6 +34,18 @@
</span><span class="cx"> // Protect against Object overwritten by the user code.
</span><span class="cx"> var Object = {}.constructor;
</span><span class="cx"> 
</span><ins>+function toString(obj)
+{
+    return &quot;&quot; + obj;
+}
+    
+function isUInt32(obj)
+{
+    if (typeof obj === &quot;number&quot;)
+        return obj &gt;&gt;&gt; 0 === obj &amp;&amp; (obj &gt; 0 || 1 / obj &gt; 0);
+    return &quot;&quot; + (obj &gt;&gt;&gt; 0) === obj;
+}
+
</ins><span class="cx"> var InjectedScript = function()
</span><span class="cx"> {
</span><span class="cx">     this._lastBoundObjectId = 1;
</span><span class="lines">@@ -80,7 +93,7 @@
</span><span class="cx">         if (this.isPrimitiveValue(object))
</span><span class="cx">             result.value = object;
</span><span class="cx">         else
</span><del>-            result.description = this._toString(object);
</del><ins>+            result.description = toString(object);
</ins><span class="cx">         return result;
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="lines">@@ -323,7 +336,7 @@
</span><span class="cx">     {
</span><span class="cx">         var remoteObject = this._wrapObject(value, objectGroup);
</span><span class="cx">         try {
</span><del>-            remoteObject.description = this._toString(value);
</del><ins>+            remoteObject.description = toString(value);
</ins><span class="cx">         } catch (e) {}
</span><span class="cx">         return {
</span><span class="cx">             wasThrown: true,
</span><span class="lines">@@ -479,7 +492,7 @@
</span><span class="cx">         // Modes:
</span><span class="cx">         //  - ownProperties - only own properties and __proto__
</span><span class="cx">         //  - ownAndGetterProperties - own properties, __proto__, and getters in the prototype chain
</span><del>-        //  - neither - get all properties in the prototype chain, exclude __proto__
</del><ins>+        //  - neither - get all properties in the prototype chain and __proto__
</ins><span class="cx"> 
</span><span class="cx">         var descriptors = [];
</span><span class="cx">         var nameProcessed = {};
</span><span class="lines">@@ -611,7 +624,6 @@
</span><span class="cx">         } catch (e) {
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // If owning frame has navigated to somewhere else window properties will be undefined.
</del><span class="cx">         return null;
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="lines">@@ -623,13 +635,13 @@
</span><span class="cx">         var subtype = this._subtype(obj);
</span><span class="cx"> 
</span><span class="cx">         if (subtype === &quot;regexp&quot;)
</span><del>-            return this._toString(obj);
</del><ins>+            return toString(obj);
</ins><span class="cx"> 
</span><span class="cx">         if (subtype === &quot;date&quot;)
</span><del>-            return this._toString(obj);
</del><ins>+            return toString(obj);
</ins><span class="cx"> 
</span><span class="cx">         if (subtype === &quot;error&quot;)
</span><del>-            return this._toString(obj);
</del><ins>+            return toString(obj);
</ins><span class="cx"> 
</span><span class="cx">         if (subtype === &quot;node&quot;) {
</span><span class="cx">             var description = obj.nodeName.toLowerCase();
</span><span class="lines">@@ -655,23 +667,16 @@
</span><span class="cx"> 
</span><span class="cx">         // NodeList in JSC is a function, check for array prior to this.
</span><span class="cx">         if (typeof obj === &quot;function&quot;)
</span><del>-            return this._toString(obj);
</del><ins>+            return toString(obj);
</ins><span class="cx"> 
</span><del>-        // FIXME: Can we remove this?
</del><ins>+        // If Object, try for a better name from the constructor.
</ins><span class="cx">         if (className === &quot;Object&quot;) {
</span><del>-            // In Chromium DOM wrapper prototypes will have Object as their constructor name,
-            // get the real DOM wrapper name from the constructor property.
</del><span class="cx">             var constructorName = obj.constructor &amp;&amp; obj.constructor.name;
</span><span class="cx">             if (constructorName)
</span><span class="cx">                 return constructorName;
</span><span class="cx">         }
</span><ins>+
</ins><span class="cx">         return className;
</span><del>-    },
-
-    _toString: function(obj)
-    {
-        // We don't use String(obj) because inspectedGlobalObject.String is undefined if owning frame navigated to another page.
-        return &quot;&quot; + obj;
</del><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -708,7 +713,7 @@
</span><span class="cx">     this.className = InjectedScriptHost.internalConstructorName(object);
</span><span class="cx">     this.description = injectedScript._describe(object);
</span><span class="cx"> 
</span><del>-    if (generatePreview &amp;&amp; (this.type === &quot;object&quot; || injectedScript._isHTMLAllCollection(object)))
</del><ins>+    if (generatePreview &amp;&amp; this.type === &quot;object&quot;)
</ins><span class="cx">         this.preview = this._generatePreview(object, undefined, columnNames);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -727,85 +732,122 @@
</span><span class="cx">             properties: isTableRowsRequest ? 1000 : Math.max(5, firstLevelKeysCount),
</span><span class="cx">             indexes: isTableRowsRequest ? 1000 : Math.max(100, firstLevelKeysCount)
</span><span class="cx">         };
</span><del>-        for (var o = object; injectedScript._isDefined(o); o = o.__proto__)
-            this._generateProtoPreview(o, preview, propertiesThreshold, firstLevelKeys, secondLevelKeys);
</del><ins>+
+        try {
+            // All properties.
+            var descriptors = injectedScript._propertyDescriptors(object);
+            this._appendPropertyDescriptors(preview, descriptors, propertiesThreshold, secondLevelKeys);
+            if (propertiesThreshold.indexes &lt; 0 || propertiesThreshold.properties &lt; 0)
+                return preview;
+
+            // FIXME: Internal properties.
+            // FIXME: Map/Set/Iterator entries.
+        } catch (e) {
+            preview.lossless = false;
+        }
+
</ins><span class="cx">         return preview;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _generateProtoPreview: function(object, preview, propertiesThreshold, firstLevelKeys, secondLevelKeys)
</del><ins>+    _appendPropertyDescriptors: function(preview, descriptors, propertiesThreshold, secondLevelKeys)
</ins><span class="cx">     {
</span><del>-        var propertyNames = firstLevelKeys ? firstLevelKeys : Object.keys(object);
-        try {
-            for (var i = 0; i &lt; propertyNames.length; ++i) {
-                if (!propertiesThreshold.properties || !propertiesThreshold.indexes) {
-                    preview.overflow = true;
-                    preview.lossless = false;
-                    break;
-                }
-                var name = propertyNames[i];
-                if (this.subtype === &quot;array&quot; &amp;&amp; name === &quot;length&quot;)
-                    continue;
</del><ins>+        for (var descriptor of descriptors) {
+            // Seen enough.
+            if (propertiesThreshold.indexes &lt; 0 || propertiesThreshold.properties &lt; 0)
+                break;
</ins><span class="cx"> 
</span><del>-                var descriptor = Object.getOwnPropertyDescriptor(object, name);
-                if (!(&quot;value&quot; in descriptor) || !descriptor.enumerable) {
-                    preview.lossless = false;
-                    continue;
-                }
</del><ins>+            // Error in descriptor.
+            if (descriptor.wasThrown) {
+                preview.lossless = false;
+                continue;
+            }
</ins><span class="cx"> 
</span><del>-                var value = descriptor.value;
-                if (value === null) {
-                    this._appendPropertyPreview(preview, { name: name, type: &quot;object&quot;, value: &quot;null&quot; }, propertiesThreshold);
-                    continue;
-                }
</del><ins>+            // Do not show &quot;__proto__&quot; in preview.
+            var name = descriptor.name;
+            if (name === &quot;__proto__&quot;)
+                continue;
</ins><span class="cx"> 
</span><del>-                const maxLength = 100;
-                var type = typeof value;
</del><ins>+            // Do not show &quot;length&quot; on array like objects in preview.
+            if (this.subtype === &quot;array&quot; &amp;&amp; name === &quot;length&quot;)
+                continue;
</ins><span class="cx"> 
</span><del>-                if (InjectedScript.primitiveTypes[type]) {
-                    if (type === &quot;string&quot;) {
-                        if (value.length &gt; maxLength) {
-                            value = this._abbreviateString(value, maxLength, true);
-                            preview.lossless = false;
-                        }
-                        value = value.replace(/\n/g, &quot;\u21B5&quot;);
-                    }
-                    this._appendPropertyPreview(preview, { name: name, type: type, value: value + &quot;&quot; }, propertiesThreshold);
-                    continue;
-                }
</del><ins>+            // Do not show non-enumerable non-own properties. Special case to allow array indexes that may be on the prototype.
+            if (!descriptor.enumerable &amp;&amp; !descriptor.isOwn &amp;&amp; !(this.subtype === &quot;array&quot; &amp;&amp; isUInt32(name)))
+                continue;
</ins><span class="cx"> 
</span><del>-                if (secondLevelKeys === null || secondLevelKeys) {
-                    var subPreview = this._generatePreview(value, secondLevelKeys || undefined);
-                    var property = { name: name, type: type, valuePreview: subPreview };
-                    this._appendPropertyPreview(preview, property, propertiesThreshold);
-                    if (!subPreview.lossless)
-                        preview.lossless = false;
-                    if (subPreview.overflow)
-                        preview.overflow = true;
-                    continue;
</del><ins>+            // Getter/setter.
+            if (!(&quot;value&quot; in descriptor)) {
+                preview.lossless = false;
+                this._appendPropertyPreview(preview, {name: name, type: &quot;accessor&quot;}, propertiesThreshold);
+                continue;
+            }
+
+            // Null value.
+            var value = descriptor.value;
+            if (value === null) {
+                this._appendPropertyPreview(preview, {name: name, type: &quot;object&quot;, subtype: &quot;null&quot;, value: &quot;null&quot;}, propertiesThreshold);
+                continue;
+            }
+
+            // Ignore non-enumerable functions.
+            var type = typeof value;
+            if (!descriptor.enumerable &amp;&amp; type === &quot;function&quot;)
+                continue;
+
+            // Fix type of document.all.
+            if (type === &quot;undefined&quot; &amp;&amp; injectedScript._isHTMLAllCollection(value))
+                type = &quot;object&quot;;
+
+            // Primitive.
+            const maxLength = 100;
+            if (InjectedScript.primitiveTypes[type]) {
+                if (type === &quot;string&quot; &amp;&amp; value.length &gt; maxLength) {
+                    value = this._abbreviateString(value, maxLength, true);
+                    preview.lossless = false;
</ins><span class="cx">                 }
</span><ins>+                this._appendPropertyPreview(preview, {name: name, type: type, value: toString(value)}, propertiesThreshold);
+                continue;
+            }
</ins><span class="cx"> 
</span><del>-                preview.lossless = false;
</del><ins>+            // Object.
+            var property = {name: name, type: type};
+            var subtype = injectedScript._subtype(value);
+            if (subtype)
+                property.subtype = subtype;
</ins><span class="cx"> 
</span><del>-                var subtype = injectedScript._subtype(value);
</del><ins>+            // Second level.
+            if (secondLevelKeys === null || secondLevelKeys) {
+                var subPreview = this._generatePreview(value, secondLevelKeys || undefined, undefined);
+                property.valuePreview = subPreview;
+                if (!subPreview.lossless)
+                    preview.lossless = false;
+                if (subPreview.overflow)
+                    preview.overflow = true;
+            } else {
</ins><span class="cx">                 var description = &quot;&quot;;
</span><span class="cx">                 if (type !== &quot;function&quot;)
</span><span class="cx">                     description = this._abbreviateString(injectedScript._describe(value), maxLength, subtype === &quot;regexp&quot;);
</span><ins>+                property.value = description;
+                preview.lossless = false;
+            }
</ins><span class="cx"> 
</span><del>-                var property = { name: name, type: type, value: description };
-                if (subtype)
-                    property.subtype = subtype;
-                this._appendPropertyPreview(preview, property, propertiesThreshold);
-            }
-        } catch (e) {
</del><ins>+            this._appendPropertyPreview(preview, property, propertiesThreshold);
</ins><span class="cx">         }
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _appendPropertyPreview: function(preview, property, propertiesThreshold)
</span><span class="cx">     {
</span><del>-        if (isNaN(property.name))
</del><ins>+        if (toString(property.name &gt;&gt;&gt; 0) === property.name)
+            propertiesThreshold.indexes--;
+        else
</ins><span class="cx">             propertiesThreshold.properties--;
</span><del>-        else
-            propertiesThreshold.indexes--;
</del><ins>+
+        if (propertiesThreshold.indexes &lt; 0 || propertiesThreshold.properties &lt; 0) {
+            preview.overflow = true;
+            preview.lossless = false;
+            return;
+        }
+
</ins><span class="cx">         preview.properties.push(property);
</span><span class="cx">     },
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolRuntimejson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Runtime.json        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">                 { &quot;name&quot;: &quot;value&quot;, &quot;type&quot;: &quot;any&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Remote object value (in case of primitive values or JSON values if it was requested).&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;description&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;String representation of the object.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;objectId&quot;, &quot;$ref&quot;: &quot;RemoteObjectId&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Unique object identifier (for non-primitive values).&quot; },
</span><del>-                { &quot;name&quot;: &quot;preview&quot;, &quot;$ref&quot;: &quot;ObjectPreview&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Preview containsing abbreviated property values.&quot; }
</del><ins>+                { &quot;name&quot;: &quot;preview&quot;, &quot;$ref&quot;: &quot;ObjectPreview&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Preview containing abbreviated property values. Specified for &lt;code&gt;object&lt;/code&gt; type values only.&quot; }
</ins><span class="cx">             ]
</span><span class="cx">         },
</span><span class="cx">         {
</span><span class="lines">@@ -36,10 +36,10 @@
</span><span class="cx">             &quot;type&quot;: &quot;object&quot;,
</span><span class="cx">             &quot;properties&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;name&quot;, &quot;type&quot;: &quot;string&quot;, &quot;description&quot;: &quot;Property name.&quot; },
</span><del>-                { &quot;name&quot;: &quot;type&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;object&quot;, &quot;function&quot;, &quot;undefined&quot;, &quot;string&quot;, &quot;number&quot;, &quot;boolean&quot;], &quot;description&quot;: &quot;Object type.&quot; },
</del><ins>+                { &quot;name&quot;: &quot;type&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;object&quot;, &quot;function&quot;, &quot;undefined&quot;, &quot;string&quot;, &quot;number&quot;, &quot;boolean&quot;, &quot;accessor&quot;], &quot;description&quot;: &quot;Object type.&quot; },
+                { &quot;name&quot;: &quot;subtype&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;enum&quot;: [&quot;array&quot;, &quot;null&quot;, &quot;node&quot;, &quot;regexp&quot;, &quot;date&quot;, &quot;error&quot;], &quot;description&quot;: &quot;Object subtype hint. Specified for &lt;code&gt;object&lt;/code&gt; type values only.&quot; },
</ins><span class="cx">                 { &quot;name&quot;: &quot;value&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;User-friendly property value string.&quot; },
</span><del>-                { &quot;name&quot;: &quot;valuePreview&quot;, &quot;$ref&quot;: &quot;ObjectPreview&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Nested value preview.&quot; },
-                { &quot;name&quot;: &quot;subtype&quot;, &quot;type&quot;: &quot;string&quot;, &quot;optional&quot;: true, &quot;enum&quot;: [&quot;array&quot;, &quot;null&quot;, &quot;node&quot;, &quot;regexp&quot;, &quot;date&quot;, &quot;error&quot;], &quot;description&quot;: &quot;Object subtype hint. Specified for &lt;code&gt;object&lt;/code&gt; type values only.&quot; }
</del><ins>+                { &quot;name&quot;: &quot;valuePreview&quot;, &quot;$ref&quot;: &quot;ObjectPreview&quot;, &quot;optional&quot;: true, &quot;description&quot;: &quot;Nested value preview.&quot; }
</ins><span class="cx">             ]
</span><span class="cx">         },
</span><span class="cx">         {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -1,3 +1,69 @@
</span><ins>+2015-01-23  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Object Previews in the Console
+        https://bugs.webkit.org/show_bug.cgi?id=129204
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Controllers/JavaScriptLogViewController.js:
+        (WebInspector.JavaScriptLogViewController.prototype.consolePromptTextCommitted):
+        * UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js:
+        (get WebInspector.JavaScriptRuntimeCompletionProvider.prototype.):
+        Update RuntimeManager callsites that do not need object previews.
+
+        * UserInterface/Controllers/RuntimeManager.js:
+        (WebInspector.RuntimeManager.prototype.evalCallback):
+        (WebInspector.RuntimeManager.prototype.evaluateInInspectedWindow):
+        Update the main evaluate method to include a boolean parameter for
+        object previews. Most callers do not need them. Also, since previews
+        were not available on iOS 6, switch to invoke, to conditionally
+        include the command parameter.
+
+        * UserInterface/Protocol/RemoteObject.js:
+        (WebInspector.RemoteObject):
+        (WebInspector.RemoteObject.fromPayload):
+        (WebInspector.RemoteObject.prototype.get preview):
+        Store the preview from the payload.
+
+        * UserInterface/Views/ConsoleMessageImpl.js:
+        (WebInspector.ConsoleMessageImpl.prototype._format):
+        (WebInspector.ConsoleMessageImpl.prototype._formatParameter):
+        (WebInspector.ConsoleMessageImpl.prototype._formatParameterAsNode):
+        (WebInspector.ConsoleMessageImpl.prototype._formatParameterAsString):
+        (WebInspector.ConsoleMessageImpl.prototype._formatAsArrayEntry):
+        Pass an explicit false for most formatters to not use a preview if available.
+        
+        (WebInspector.ConsoleMessageImpl.prototype._formatParameterAsArray):
+        (WebInspector.ConsoleMessageImpl.prototype._formatParameterAsObject):
+        Currently only object types are previewed. Though we request previews
+        for arrays, we don't use the preview because we show a better preview
+        by just immediately requesting for a full non-preview property list.
+        
+        (WebInspector.ConsoleMessageImpl.prototype._appendObjectPreview):
+        Quickly output an object preview into the title element. The format
+        is &quot;ClassName {prop: value...}&quot;. Elide the class name if it is &quot;Object&quot;.
+        Also skip over certain preview properties that may not be useful
+        at a glance (like constructor, or accessors without values).
+
+        * UserInterface/Views/LogContentView.css:
+        (.console-object-preview):
+        (.console-formatted-array .console-object-preview):
+        (.console-object-preview-lossless):
+        (.expanded .console-object-preview):
+        Show lossy previews in italics.
+        Show lossless previews and array previews without italics.
+        Do not show the class name in the preview in italics when expanded.
+
+        (.console-object-preview .name):
+        Give preview property names the same color as ObjectPropertiesSection property names.
+        
+        (.expanded .console-object-preview &gt; .console-object-preview-body):
+        When expanding an object, hide the preview.
+
+        (.console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object):
+        (.expanded .console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object):
+        For &quot;Object&quot; previews, hide the name &quot;Object&quot; when not expanded, and show it when expanded.
+
</ins><span class="cx"> 2015-01-23  Saam Barati  &lt;saambarati1@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Disable *Annotators on minified files that aren't pretty printed
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersJavaScriptLogViewControllerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptLogViewController.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptLogViewController.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptLogViewController.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -232,7 +232,7 @@
</span><span class="cx"> 
</span><span class="cx">         text += &quot;\n//# sourceURL=__WebInspectorConsole__\n&quot;;
</span><span class="cx"> 
</span><del>-        WebInspector.runtimeManager.evaluateInInspectedWindow(text, &quot;console&quot;, true, false, false, printResult.bind(this));
</del><ins>+        WebInspector.runtimeManager.evaluateInInspectedWindow(text, &quot;console&quot;, true, false, false, true, printResult.bind(this));
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     // Private
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersJavaScriptRuntimeCompletionProviderjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -104,7 +104,7 @@
</span><span class="cx">         if (!base &amp;&amp; activeCallFrame &amp;&amp; !this._alwaysEvaluateInWindowContext)
</span><span class="cx">             activeCallFrame.collectScopeChainVariableNames(receivedPropertyNames.bind(this));
</span><span class="cx">         else
</span><del>-            WebInspector.runtimeManager.evaluateInInspectedWindow(base, &quot;completion&quot;, true, true, false, evaluated.bind(this));
</del><ins>+            WebInspector.runtimeManager.evaluateInInspectedWindow(base, &quot;completion&quot;, true, true, false, false, evaluated.bind(this));
</ins><span class="cx"> 
</span><span class="cx">         function updateLastPropertyNames(propertyNames)
</span><span class="cx">         {
</span><span class="lines">@@ -155,7 +155,7 @@
</span><span class="cx">             if (result.type === &quot;object&quot; || result.type === &quot;function&quot;)
</span><span class="cx">                 result.callFunctionJSON(getCompletions, undefined, receivedPropertyNames.bind(this));
</span><span class="cx">             else if (result.type === &quot;string&quot; || result.type === &quot;number&quot; || result.type === &quot;boolean&quot;)
</span><del>-                WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;(&quot; + getCompletions + &quot;)(\&quot;&quot; + result.type + &quot;\&quot;)&quot;, &quot;completion&quot;, false, true, true, receivedPropertyNamesFromEvaluate.bind(this));
</del><ins>+                WebInspector.runtimeManager.evaluateInInspectedWindow(&quot;(&quot; + getCompletions + &quot;)(\&quot;&quot; + result.type + &quot;\&quot;)&quot;, &quot;completion&quot;, false, true, true, false, receivedPropertyNamesFromEvaluate.bind(this));
</ins><span class="cx">             else
</span><span class="cx">                 console.error(&quot;Unknown result type: &quot; + result.type);
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersRuntimeManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/RuntimeManager.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/RuntimeManager.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/RuntimeManager.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Public
</span><span class="cx"> 
</span><del>-    evaluateInInspectedWindow: function(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, callback)
</del><ins>+    evaluateInInspectedWindow: function(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, generatePreview, callback)
</ins><span class="cx">     {
</span><span class="cx">         if (!expression) {
</span><span class="cx">             // There is no expression, so the completion should happen against global properties.
</span><span class="lines">@@ -51,7 +51,7 @@
</span><span class="cx">         function evalCallback(error, result, wasThrown)
</span><span class="cx">         {
</span><span class="cx">             this.dispatchEventToListeners(WebInspector.RuntimeManager.Event.DidEvaluate);
</span><del>-            
</del><ins>+
</ins><span class="cx">             if (error) {
</span><span class="cx">                 console.error(error);
</span><span class="cx">                 callback(null, false);
</span><span class="lines">@@ -65,14 +65,16 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (WebInspector.debuggerManager.activeCallFrame) {
</span><del>-            DebuggerAgent.evaluateOnCallFrame(WebInspector.debuggerManager.activeCallFrame.id, expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, evalCallback.bind(this));
</del><ins>+            // COMPATIBILITY (iOS 6): &quot;generatePreview&quot; did not exist.
+            DebuggerAgent.evaluateOnCallFrame.invoke({callFrameId: WebInspector.debuggerManager.activeCallFrame.id, expression: expression, objectGroup: objectGroup, includeCommandLineAPI: includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole: doNotPauseOnExceptionsAndMuteConsole, returnByValue: returnByValue, generatePreview: generatePreview}, evalCallback.bind(this));
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // COMPATIBILITY (iOS 6): Execution context identifiers (contextId) did not exist
</span><span class="cx">         // in iOS 6. Fallback to including the frame identifier (frameId).
</span><ins>+        // COMPATIBILITY (iOS 6): &quot;generatePreview&quot; did not exist.
</ins><span class="cx">         var contextId = WebInspector.quickConsole.executionContextIdentifier;
</span><del>-        RuntimeAgent.evaluate.invoke({expression: expression, objectGroup: objectGroup, includeCommandLineAPI: includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole: doNotPauseOnExceptionsAndMuteConsole, contextId: contextId, frameId: contextId, returnByValue: returnByValue}, evalCallback.bind(this));
</del><ins>+        RuntimeAgent.evaluate.invoke({expression: expression, objectGroup: objectGroup, includeCommandLineAPI: includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole: doNotPauseOnExceptionsAndMuteConsole, contextId: contextId, frameId: contextId, returnByValue: returnByValue, generatePreview: generatePreview}, evalCallback.bind(this));
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     getPropertiesForRemoteObject: function(objectId, callback)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceProtocolRemoteObjectjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Protocol/RemoteObject.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Protocol/RemoteObject.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/RemoteObject.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx">  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-WebInspector.RemoteObject = function(objectId, type, subtype, value, description)
</del><ins>+WebInspector.RemoteObject = function(objectId, type, subtype, value, description, preview)
</ins><span class="cx"> {
</span><span class="cx">     this._type = type;
</span><span class="cx">     this._subtype = subtype;
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx">         this._objectId = objectId;
</span><span class="cx">         this._description = description;
</span><span class="cx">         this._hasChildren = true;
</span><ins>+        this._preview = preview;
</ins><span class="cx">     } else {
</span><span class="cx">         // Primitive or null object.
</span><span class="cx">         console.assert(type !== &quot;object&quot; || value === null);
</span><span class="lines">@@ -70,7 +71,7 @@
</span><span class="cx"> {
</span><span class="cx">     console.assert(typeof payload === &quot;object&quot;, &quot;Remote object payload should only be an object&quot;);
</span><span class="cx"> 
</span><del>-    return new WebInspector.RemoteObject(payload.objectId, payload.type, payload.subtype, payload.value, payload.description);
</del><ins>+    return new WebInspector.RemoteObject(payload.objectId, payload.type, payload.subtype, payload.value, payload.description, payload.preview);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebInspector.RemoteObject.type = function(remoteObject)
</span><span class="lines">@@ -111,6 +112,11 @@
</span><span class="cx">         return this._hasChildren;
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    get preview()
+    {
+        return this._preview;
+    },
+
</ins><span class="cx">     getOwnProperties: function(callback)
</span><span class="cx">     {
</span><span class="cx">         this._getProperties(true, false, callback);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsConsoleMessageImpljs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageImpl.js (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageImpl.js        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageImpl.js        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -237,14 +237,14 @@
</span><span class="cx">             if (shouldFormatMessage &amp;&amp; parameters[i].type === &quot;string&quot;)
</span><span class="cx">                 formattedResult.appendChild(document.createTextNode(parameters[i].description));
</span><span class="cx">             else
</span><del>-                formattedResult.appendChild(this._formatParameter(parameters[i]));
</del><ins>+                formattedResult.appendChild(this._formatParameter(parameters[i], false, true));
</ins><span class="cx">             if (i &lt; parameters.length - 1)
</span><span class="cx">                 formattedResult.appendChild(document.createTextNode(&quot; &quot;));
</span><span class="cx">         }
</span><span class="cx">         return formattedResult;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _formatParameter: function(output, forceObjectFormat)
</del><ins>+    _formatParameter: function(output, forceObjectFormat, includePreview)
</ins><span class="cx">     {
</span><span class="cx">         var type;
</span><span class="cx">         if (forceObjectFormat)
</span><span class="lines">@@ -262,7 +262,7 @@
</span><span class="cx"> 
</span><span class="cx">         var span = document.createElement(&quot;span&quot;);
</span><span class="cx">         span.className = &quot;console-formatted-&quot; + type + &quot; source-code&quot;;
</span><del>-        formatter.call(this, output, span);
</del><ins>+        formatter.call(this, output, span, includePreview);
</ins><span class="cx">         return span;
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="lines">@@ -271,11 +271,81 @@
</span><span class="cx">         elem.appendChild(document.createTextNode(val));
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _formatParameterAsObject: function(obj, elem)
</del><ins>+    _formatParameterAsObject: function(obj, elem, includePreview)
</ins><span class="cx">     {
</span><del>-        elem.appendChild(new WebInspector.ObjectPropertiesSection(obj, obj.description).element);
</del><ins>+        var titleElement = document.createElement(&quot;span&quot;);
+        if (includePreview &amp;&amp; obj.preview) {
+            titleElement.classList.add(&quot;console-object-preview&quot;);
+            var lossless = this._appendObjectPreview(titleElement, obj);
+            if (lossless) {
+                titleElement.classList.add(&quot;console-object-preview-lossless&quot;);
+                elem.appendChild(titleElement);
+                return;
+            }
+        } else
+            titleElement.appendChild(document.createTextNode(obj.description || &quot;&quot;));
+
+        var section = new WebInspector.ObjectPropertiesSection(obj, titleElement);
+        elem.appendChild(section.element);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    _appendObjectPreview: function(titleElement, obj)
+    {
+        var preview = obj.preview;
+        var isArray = obj.subtype === &quot;array&quot;;
+
+        if (obj.description &amp;&amp; !isArray) {
+            var previewObjectNameElement = document.createElement(&quot;span&quot;);
+            previewObjectNameElement.classList.add(&quot;console-object-preview-name&quot;);
+            if (obj.description === &quot;Object&quot;)
+                previewObjectNameElement.classList.add(&quot;console-object-preview-name-Object&quot;);
+
+            previewObjectNameElement.textContent = obj.description + &quot; &quot;;
+            titleElement.appendChild(previewObjectNameElement);
+        }
+
+        var bodyElement = titleElement.createChild(&quot;span&quot;, &quot;console-object-preview-body&quot;);
+        bodyElement.appendChild(document.createTextNode(isArray ? &quot;[&quot; : &quot;{&quot;));
+        for (var i = 0; i &lt; preview.properties.length; ++i) {
+            var property = preview.properties[i];
+
+            // FIXME: Better handle getter/setter accessors. Should we show getters in previews?
+            if (property.type === &quot;accessor&quot;)
+                continue;
+
+            // Constructor name is often already visible, so don't show it as a property.
+            if (property.name === &quot;constructor&quot;)
+                continue;
+
+            if (i &gt; 0)
+                bodyElement.appendChild(document.createTextNode(&quot;, &quot;));
+    
+            if (!isArray || property.name != i) {
+                bodyElement.createChild(&quot;span&quot;, &quot;name&quot;).textContent = property.name;
+                bodyElement.appendChild(document.createTextNode(&quot;: &quot;));
+            }
+
+            var span = bodyElement.createChild(&quot;span&quot;, &quot;console-formatted-&quot; + property.type);
+            if (property.type === &quot;object&quot;) {
+                if (property.subtype === &quot;node&quot;)
+                    span.classList.add(&quot;console-formatted-preview-node&quot;);
+                else if (property.subtype === &quot;regexp&quot;)
+                    span.classList.add(&quot;console-formatted-regexp&quot;);
+            }
+
+            if (property.type === &quot;string&quot;)
+                span.textContent = &quot;\&quot;&quot; + property.value + &quot;\&quot;&quot;;
+            else if (property.type === &quot;function&quot;)
+                span.textContent = &quot;function&quot;;
+            else
+                span.textContent = property.value;
+        }
+        if (preview.overflow)
+            bodyElement.createChild(&quot;span&quot;).textContent = &quot;\u2026&quot;;
+        bodyElement.appendChild(document.createTextNode(isArray ? &quot;]&quot; : &quot;}&quot;));
+        return preview.lossless;
+    },
+
</ins><span class="cx">     _formatParameterAsNode: function(object, elem)
</span><span class="cx">     {
</span><span class="cx">         function printNode(nodeId)
</span><span class="lines">@@ -283,7 +353,7 @@
</span><span class="cx">             if (!nodeId) {
</span><span class="cx">                 // Sometimes DOM is loaded after the sync message is being formatted, so we get no
</span><span class="cx">                 // nodeId here. So we fall back to object formatting here.
</span><del>-                this._formatParameterAsObject(object, elem);
</del><ins>+                this._formatParameterAsObject(object, elem, false);
</ins><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx">             var treeOutline = new WebInspector.DOMTreeOutline(false, false, true);
</span><span class="lines">@@ -299,6 +369,7 @@
</span><span class="cx"> 
</span><span class="cx">     _formatParameterAsArray: function(arr, elem)
</span><span class="cx">     {
</span><ins>+        // FIXME: Array previews look poor. Keep doing what we currently do for arrays.
</ins><span class="cx">         arr.getOwnProperties(this._printArray.bind(this, arr, elem));
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="lines">@@ -306,13 +377,12 @@
</span><span class="cx">     {
</span><span class="cx">         var span = document.createElement(&quot;span&quot;);
</span><span class="cx">         span.className = &quot;console-formatted-string source-code&quot;;
</span><ins>+        span.appendChild(document.createTextNode(&quot;\&quot;&quot;));
</ins><span class="cx">         span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
</span><ins>+        span.appendChild(document.createTextNode(&quot;\&quot;&quot;));
</ins><span class="cx"> 
</span><del>-        // Make black quotes.
-        elem.classList.remove(&quot;console-formatted-string&quot;);
-        elem.appendChild(document.createTextNode(&quot;\&quot;&quot;));
</del><ins>+        elem.classList.remove(&quot;console-formatted-string&quot;);        
</ins><span class="cx">         elem.appendChild(span);
</span><del>-        elem.appendChild(document.createTextNode(&quot;\&quot;&quot;));
</del><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _printArray: function(array, elem, properties)
</span><span class="lines">@@ -363,7 +433,7 @@
</span><span class="cx">     _formatAsArrayEntry: function(output)
</span><span class="cx">     {
</span><span class="cx">         // Prevent infinite expansion of cross-referencing arrays.
</span><del>-        return this._formatParameter(output, output.subtype &amp;&amp; output.subtype === &quot;array&quot;);
</del><ins>+        return this._formatParameter(output, output.subtype &amp;&amp; output.subtype === &quot;array&quot;, false);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     _formatWithSubstitutionString: function(parameters, formattedResult)
</span><span class="lines">@@ -372,7 +442,7 @@
</span><span class="cx"> 
</span><span class="cx">         function parameterFormatter(force, obj)
</span><span class="cx">         {
</span><del>-            return this._formatParameter(obj, force);
</del><ins>+            return this._formatParameter(obj, force, false);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         function stringFormatter(obj)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsLogContentViewcss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.css (179018 => 179019)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.css        2015-01-23 20:03:41 UTC (rev 179018)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/LogContentView.css        2015-01-23 20:05:44 UTC (rev 179019)
</span><span class="lines">@@ -267,6 +267,33 @@
</span><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.console-object-preview {
+    font-style: italic;
+}
+
+.console-object-preview-lossless,
+.console-formatted-array .console-object-preview,
+.expanded .console-object-preview {
+    font-style: normal;
+}
+
+.console-object-preview .name {
+ /* Match ObjectPropertiesSection name styles */
+    color: rgb(136, 19, 145);
+}
+
+.expanded .console-object-preview &gt; .console-object-preview-body {
+    display: none;
+}
+
+.console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object {
+    display: none;
+}
+
+.expanded .console-object-preview &gt; .console-object-preview-name.console-object-preview-name-Object {
+    display: inline;
+}
+
</ins><span class="cx"> .console-formatted-object, .console-formatted-node, .console-formatted-error {
</span><span class="cx">     position: relative;
</span><span class="cx">     display: inline-block;
</span></span></pre>
</div>
</div>

</body>
</html>