<!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>[188687] trunk/Source</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/188687">188687</a></dd>
<dt>Author</dt> <dd>bburg@apple.com</dd>
<dt>Date</dt> <dd>2015-08-20 09:43:53 -0700 (Thu, 20 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: add TestHarness option to tee all commands to system console
https://bugs.webkit.org/show_bug.cgi?id=148181

Reviewed by Joseph Pecoraro.

Source/WebCore:

* inspector/InspectorFrontendHost.cpp:
(WebCore::InspectorFrontendHost::unbufferedLog): Remove log prefix so output
to stderr can be diffed against expected results without processing.

Source/WebInspectorUI:

It is currently difficult to trace what's going on when a test times out
on a buildbot instance. The existing option for forcing debug logging can
still drop messages that don't make it from the inspector to the test page.

This patch adds an option which logs all TestHarness commands directly to
stderr in the Inspector instance using InspectorFrontendHost::unbufferedLog.

Clean up how existing harness logging code calls into each other. Extract
the stringifying code that is duplicated everywhere.

* UserInterface/Test.html: Reorganize options and add new option.
* UserInterface/Test/FrontendTestHarness.js:
(FrontendTestHarness.prototype.completeTest):
(FrontendTestHarness.prototype.addResult):
(FrontendTestHarness.prototype.debugLog):
(FrontendTestHarness.prototype.testPageDidLoad):
(FrontendTestHarness.prototype._resendResults):
(FrontendTestHarness):
* UserInterface/Test/ProtocolTestHarness.js:
(ProtocolTestHarness.prototype.completeTest):
(ProtocolTestHarness.prototype.addResult):
(ProtocolTestHarness.prototype.debugLog):
* UserInterface/Test/TestHarness.js:
(TestHarness.prototype.log):
(TestHarness.prototype.assert):
(TestHarness.prototype.expectThat):
(TestHarness.messageAsString):
(TestHarness):
* UserInterface/TestStub.html: Reorganize options and add new option.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorFrontendHostcpp">trunk/Source/WebCore/inspector/InspectorFrontendHost.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestFrontendTestHarnessjs">trunk/Source/WebInspectorUI/UserInterface/Test/FrontendTestHarness.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestProtocolTestHarnessjs">trunk/Source/WebInspectorUI/UserInterface/Test/ProtocolTestHarness.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestTestHarnessjs">trunk/Source/WebInspectorUI/UserInterface/Test/TestHarness.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTesthtml">trunk/Source/WebInspectorUI/UserInterface/Test.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestStubhtml">trunk/Source/WebInspectorUI/UserInterface/TestStub.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebCore/ChangeLog        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2015-08-19  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Inspector: add TestHarness option to tee all commands to system console
+        https://bugs.webkit.org/show_bug.cgi?id=148181
+
+        Reviewed by Joseph Pecoraro.
+
+        * inspector/InspectorFrontendHost.cpp:
+        (WebCore::InspectorFrontendHost::unbufferedLog): Remove log prefix so output
+        to stderr can be diffed against expected results without processing.
+
</ins><span class="cx"> 2015-08-19  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Unreviewed build fix after r188663.
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorFrontendHostcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorFrontendHost.cpp (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorFrontendHost.cpp        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebCore/inspector/InspectorFrontendHost.cpp        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -308,7 +308,7 @@
</span><span class="cx"> void InspectorFrontendHost::unbufferedLog(const String&amp; message)
</span><span class="cx"> {
</span><span class="cx">     // This is used only for debugging inspector tests.
</span><del>-    WTFLogAlways(&quot;InspectorTest: %s&quot;, message.utf8().data());
</del><ins>+    WTFLogAlways(&quot;%s&quot;, message.utf8().data());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorFrontendHost::beep()
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -1,3 +1,40 @@
</span><ins>+2015-08-19  Brian Burg  &lt;bburg@apple.com&gt;
+
+        Web Inspector: add TestHarness option to tee all commands to system console
+        https://bugs.webkit.org/show_bug.cgi?id=148181
+
+        Reviewed by Joseph Pecoraro.
+
+        It is currently difficult to trace what's going on when a test times out
+        on a buildbot instance. The existing option for forcing debug logging can
+        still drop messages that don't make it from the inspector to the test page.
+
+        This patch adds an option which logs all TestHarness commands directly to
+        stderr in the Inspector instance using InspectorFrontendHost::unbufferedLog.
+
+        Clean up how existing harness logging code calls into each other. Extract
+        the stringifying code that is duplicated everywhere.
+
+        * UserInterface/Test.html: Reorganize options and add new option.
+        * UserInterface/Test/FrontendTestHarness.js:
+        (FrontendTestHarness.prototype.completeTest):
+        (FrontendTestHarness.prototype.addResult):
+        (FrontendTestHarness.prototype.debugLog):
+        (FrontendTestHarness.prototype.testPageDidLoad):
+        (FrontendTestHarness.prototype._resendResults):
+        (FrontendTestHarness):
+        * UserInterface/Test/ProtocolTestHarness.js:
+        (ProtocolTestHarness.prototype.completeTest):
+        (ProtocolTestHarness.prototype.addResult):
+        (ProtocolTestHarness.prototype.debugLog):
+        * UserInterface/Test/TestHarness.js:
+        (TestHarness.prototype.log):
+        (TestHarness.prototype.assert):
+        (TestHarness.prototype.expectThat):
+        (TestHarness.messageAsString):
+        (TestHarness):
+        * UserInterface/TestStub.html: Reorganize options and add new option.
+
</ins><span class="cx"> 2015-08-20  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Remove unused temporary variable
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestFrontendTestHarnessjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test/FrontendTestHarness.js (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test/FrontendTestHarness.js        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/UserInterface/Test/FrontendTestHarness.js        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -37,8 +37,8 @@
</span><span class="cx"> 
</span><span class="cx">     completeTest()
</span><span class="cx">     {
</span><del>-        if (this.forceSyncDebugLogging)
-            InspectorFrontendHost.unbufferedLog(&quot;FrontendTestHarness.completeTest()&quot;);
</del><ins>+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(&quot;completeTest()&quot;);
</ins><span class="cx"> 
</span><span class="cx">         // Wait for results to be resent before requesting completeTest(). Otherwise, messages will be
</span><span class="cx">         // queued after pending dispatches run to zero and the test page will quit before processing them.
</span><span class="lines">@@ -52,18 +52,25 @@
</span><span class="cx"> 
</span><span class="cx">     addResult(message)
</span><span class="cx">     {
</span><del>-        this._results.push(message);
</del><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
</ins><span class="cx"> 
</span><del>-        if (this.forceSyncDebugLogging)
-            InspectorFrontendHost.unbufferedLog(&quot;addResult: &quot; + message);
</del><ins>+        // Save the stringified message, since message may be a DOM element that won't survive reload.
+        this._results.push(stringifiedMessage);
</ins><span class="cx"> 
</span><ins>+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(stringifiedMessage);
+
</ins><span class="cx">         if (!this._testPageIsReloading)
</span><del>-            this.evaluateInPage(`TestPage.addResult(unescape(&quot;${escape(message)}&quot;))`);
</del><ins>+            this.evaluateInPage(`TestPage.addResult(unescape(&quot;${escape(stringifiedMessage)}&quot;))`);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     debugLog(message)
</span><span class="cx">     {
</span><del>-        let stringifiedMessage = typeof message !== &quot;string&quot; ? JSON.stringify(message) : message;
</del><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
+
+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(stringifiedMessage);
+
</ins><span class="cx">         this.evaluateInPage(`TestPage.debugLog(unescape(&quot;${escape(stringifiedMessage)}&quot;));`);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -92,6 +99,9 @@
</span><span class="cx"> 
</span><span class="cx">     testPageDidLoad()
</span><span class="cx">     {
</span><ins>+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(&quot;testPageDidLoad()&quot;);
+
</ins><span class="cx">         this._testPageIsReloading = false;
</span><span class="cx">         this._resendResults();
</span><span class="cx"> 
</span><span class="lines">@@ -163,6 +173,9 @@
</span><span class="cx">         console.assert(this._shouldResendResults);
</span><span class="cx">         this._shouldResendResults = false;
</span><span class="cx"> 
</span><ins>+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(&quot;_resendResults()&quot;);
+
</ins><span class="cx">         for (let result of this._results)
</span><span class="cx">             this.evaluateInPage(`TestPage.addResult(unescape(&quot;${escape(result)}&quot;))`);
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestProtocolTestHarnessjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test/ProtocolTestHarness.js (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test/ProtocolTestHarness.js        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/UserInterface/Test/ProtocolTestHarness.js        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -29,20 +29,31 @@
</span><span class="cx"> 
</span><span class="cx">     completeTest()
</span><span class="cx">     {
</span><ins>+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(&quot;completeTest()&quot;);
+
</ins><span class="cx">         this.evaluateInPage(&quot;TestPage.closeTest();&quot;);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     addResult(message)
</span><span class="cx">     {
</span><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
+
+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(stringifiedMessage);
+
</ins><span class="cx">         // Unfortunately, every string argument must be escaped because tests are not consistent
</span><span class="cx">         // with respect to escaping with single or double quotes. Some exceptions use single quotes.
</span><del>-        let stringifiedMessage = typeof message !== &quot;string&quot; ? JSON.stringify(message) : message;
</del><span class="cx">         this.evaluateInPage(`TestPage.log(unescape(&quot;${escape(stringifiedMessage)}&quot;));`);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     debugLog(message)
</span><span class="cx">     {
</span><del>-        let stringifiedMessage = typeof message !== &quot;string&quot; ? JSON.stringify(message) : message;
</del><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
+
+        if (this.dumpActivityToSystemConsole)
+            InspectorFrontendHost.unbufferedLog(stringifiedMessage);
+
</ins><span class="cx">         this.evaluateInPage(`TestPage.debugLog(unescape(&quot;${escape(stringifiedMessage)}&quot;));`);
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestTestHarnessjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test/TestHarness.js (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test/TestHarness.js        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/UserInterface/Test/TestHarness.js        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -71,7 +71,7 @@
</span><span class="cx">     {
</span><span class="cx">         ++this._logCount;
</span><span class="cx"> 
</span><del>-        if (this.forceSyncDebugLogging)
</del><ins>+        if (this.forceDebugLogging)
</ins><span class="cx">             this.debugLog(message);
</span><span class="cx">         else
</span><span class="cx">             this.addResult(message);
</span><span class="lines">@@ -82,14 +82,24 @@
</span><span class="cx">         if (condition)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        let stringifiedMessage = typeof message !== &quot;object&quot; ? message : JSON.stringify(message);
-        this.addResult(&quot;ASSERT: &quot; + stringifiedMessage);
</del><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
+        this.log(&quot;ASSERT: &quot; + stringifiedMessage);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     expectThat(condition, message)
</span><span class="cx">     {
</span><span class="cx">         let prefix = condition ? &quot;PASS&quot; : &quot;FAIL&quot;;
</span><del>-        let stringifiedMessage = typeof message !== &quot;object&quot; ? message : JSON.stringify(message);
-        this.addResult(`${prefix}: ${stringifiedMessage}`);
</del><ins>+        let stringifiedMessage = TestHarness.messageAsString(message);
+        this.log(`${prefix}: ${stringifiedMessage}`);
</ins><span class="cx">     }
</span><ins>+
+    // Protected
+
+    static messageAsString(message)
+    {
+        if (message instanceof Element)
+            return message.textContent;
+        
+        return (typeof message !== &quot;string&quot;) ? JSON.stringify(message) : message;
+    }
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTesthtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test.html (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test.html        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/UserInterface/Test.html        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -147,12 +147,14 @@
</span><span class="cx">     &lt;script type=&quot;text/javascript&quot;&gt;
</span><span class="cx">         WebInspector.loaded();
</span><span class="cx"> 
</span><del>-        // Not reliable unless console messages are dumped to stderr.
-        // See wiki for details &lt;https://http://trac.webkit.org/wiki/WebInspectorDebugging&gt;.
</del><ins>+        // Debug logging is synchronous on the test page.
+        InspectorTest.forceDebugLogging = false;
+
+        // Tee all TestHarness commands to stderr from within the Inspector.
+        InspectorTest.dumpActivityToSystemConsole = false;
+
+        // Best used in combination with dumpActivityToSystemConsole.
</ins><span class="cx">         InspectorBackend.dumpInspectorProtocolMessages = false;
</span><del>-
-        // Synchronous logging may produce more output prior to a timeout.
-        InspectorTest.forceSyncDebugLogging = false;
</del><span class="cx">     &lt;/script&gt;
</span><span class="cx"> &lt;/head&gt;
</span><span class="cx"> &lt;body&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestStubhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/TestStub.html (188686 => 188687)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/TestStub.html        2015-08-20 15:11:07 UTC (rev 188686)
+++ trunk/Source/WebInspectorUI/UserInterface/TestStub.html        2015-08-20 16:43:53 UTC (rev 188687)
</span><span class="lines">@@ -40,12 +40,14 @@
</span><span class="cx"> 
</span><span class="cx">     &lt;script src=&quot;Test/TestStub.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script&gt;
</span><del>-        // Not reliable unless console messages are dumped to console.
-        // See wiki for details &lt;https://http://trac.webkit.org/wiki/WebInspectorDebugging&gt;.
-        ProtocolTest.dumpInspectorProtocolMessages = false;
</del><ins>+        // Debug logging is synchronous on the test page.
+        ProtocolTest.forceDebugLogging = false;
</ins><span class="cx"> 
</span><del>-        // Synchronous logging may produce more output prior to a timeout.
-        ProtocolTest.forceSyncDebugLogging = false;
</del><ins>+        // Tee all TestHarness commands to stderr from within the Inspector.
+        ProtocolTest.dumpActivityToSystemConsole = false;
+
+        // Best used in combination with dumpActivityToSystemConsole.
+        InspectorProtocol.dumpInspectorProtocolMessages = false;
</ins><span class="cx">     &lt;/script&gt;
</span><span class="cx"> &lt;/head&gt;
</span><span class="cx"> &lt;/html&gt;
</span></span></pre>
</div>
</div>

</body>
</html>