<!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>[200262] trunk/Source/WebInspectorUI</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/200262">200262</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-04-29 14:08:43 -0700 (Fri, 29 Apr 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Jump to Line in auto formatted JavaScript does not work the first time
https://bugs.webkit.org/show_bug.cgi?id=157194
&lt;rdar://problem/26008471&gt;

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2016-04-29
Reviewed by Timothy Hatcher.

When doing asynchronous formatting we set the content of the editor
twice. First to prime the editors back/foward list with the original
content, and then again after we get the formatted content from the
Worker, and then display the content.

The TextEditor attempts to reveal a position when the initial string
has been set. Back when autoformatting was synchronous this was fine.
Asynchronously however, this ends up happening between the original
and formatted value. Also, the TextEditor has no idea that the
SourceCodeTextEditor is going to format / defer displaying the
contents. Add a &quot;defer&quot; property to the TextEditor that the
SourceCodeTextEditor can use in this circumstance.

* UserInterface/Views/SourceCodeTextEditor.js:
(WebInspector.SourceCodeTextEditor.prototype._populateWithContent):
Avoid revealing a position when setting the original content. We will
be formatting and we will want to reveal the position afterwards.

* UserInterface/Views/TextEditor.js:
(WebInspector.TextEditor):
(WebInspector.TextEditor.prototype.set deferReveal):
Provide another reason to defer revealing.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTextEditorjs">trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTextEditorjs">trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (200261 => 200262)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2016-04-29 20:33:48 UTC (rev 200261)
+++ trunk/Source/WebInspectorUI/ChangeLog        2016-04-29 21:08:43 UTC (rev 200262)
</span><span class="lines">@@ -1,3 +1,34 @@
</span><ins>+2016-04-29  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Jump to Line in auto formatted JavaScript does not work the first time
+        https://bugs.webkit.org/show_bug.cgi?id=157194
+        &lt;rdar://problem/26008471&gt;
+
+        Reviewed by Timothy Hatcher.
+
+        When doing asynchronous formatting we set the content of the editor
+        twice. First to prime the editors back/foward list with the original
+        content, and then again after we get the formatted content from the
+        Worker, and then display the content.
+
+        The TextEditor attempts to reveal a position when the initial string
+        has been set. Back when autoformatting was synchronous this was fine.
+        Asynchronously however, this ends up happening between the original
+        and formatted value. Also, the TextEditor has no idea that the
+        SourceCodeTextEditor is going to format / defer displaying the
+        contents. Add a &quot;defer&quot; property to the TextEditor that the
+        SourceCodeTextEditor can use in this circumstance.
+
+        * UserInterface/Views/SourceCodeTextEditor.js:
+        (WebInspector.SourceCodeTextEditor.prototype._populateWithContent):
+        Avoid revealing a position when setting the original content. We will
+        be formatting and we will want to reveal the position afterwards.
+
+        * UserInterface/Views/TextEditor.js:
+        (WebInspector.TextEditor):
+        (WebInspector.TextEditor.prototype.set deferReveal):
+        Provide another reason to defer revealing.
+
</ins><span class="cx"> 2016-04-28  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: FormatterWorker fails to find &quot;External/Esprima.js&quot; in Production builds
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTextEditorjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js (200261 => 200262)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js        2016-04-29 20:33:48 UTC (rev 200261)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTextEditor.js        2016-04-29 21:08:43 UTC (rev 200262)
</span><span class="lines">@@ -394,7 +394,9 @@
</span><span class="cx">         if (this._autoFormat) {
</span><span class="cx">             console.assert(!this.formatted);
</span><span class="cx">             this._autoFormat = false;
</span><ins>+            this.deferReveal = true;
</ins><span class="cx">             this.string = content;
</span><ins>+            this.deferReveal = false;
</ins><span class="cx">             this.updateFormattedState(true).then(() =&gt; {
</span><span class="cx">                 this._proceedPopulateWithContent(this.string);
</span><span class="cx">             });
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTextEditorjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js (200261 => 200262)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js        2016-04-29 20:33:48 UTC (rev 200261)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TextEditor.js        2016-04-29 21:08:43 UTC (rev 200262)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx">         this._formatted = false;
</span><span class="cx">         this._formattingPromise = null;
</span><span class="cx">         this._formatterSourceMap = null;
</span><ins>+        this._deferReveal = false;
</ins><span class="cx"> 
</span><span class="cx">         this._delegate = delegate || null;
</span><span class="cx">     }
</span><span class="lines">@@ -254,6 +255,11 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    set deferReveal(defer)
+    {
+        this._deferReveal = defer;
+    }
+
</ins><span class="cx">     performSearch(query)
</span><span class="cx">     {
</span><span class="cx">         if (this._searchQuery === query)
</span><span class="lines">@@ -423,7 +429,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var lineHandle = this._codeMirror.getLineHandle(position.lineNumber);
</span><del>-        if (!lineHandle || !this._visible || this._initialStringNotSet) {
</del><ins>+        if (!lineHandle || !this._visible || this._initialStringNotSet || this._deferReveal) {
</ins><span class="cx">             // If we can't get a line handle or are not visible then we wait to do the reveal.
</span><span class="cx">             this._positionToReveal = position;
</span><span class="cx">             this._textRangeToSelect = textRangeToSelect;
</span></span></pre>
</div>
</div>

</body>
</html>