<!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>[174037] 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/174037">174037</a></dd>
<dt>Author</dt> <dd>burg@cs.washington.edu</dd>
<dt>Date</dt> <dd>2014-09-27 15:17:29 -0700 (Sat, 27 Sep 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Replay: Playback position updates should be sent before the next event loop input is dispatched
https://bugs.webkit.org/show_bug.cgi?id=137162

Reviewed by Timothy Hatcher.

Source/WebCore:

To drive playback position updates in the Inspector UI, we send playbackHitPosition protocol
messages as the replay backend dispatches inputs. However, right now the semantics of that
message are muddy. The update is sent *after* the input at the offset is dispatched. This leads
to unexpected results if the debugger pauses while the input is being dispatched: the frontend
will only know about the previous (stale) playback position when the debugger pauses.

With this patch, the backend sends the playbackHitPosition(segmentOffset=n, inputOffset=m)
message when backend is about to dispatch input m, but has not yet begun to do so. Thus, any
subsequent page execution events (profiling, debugger pauses, etc) until the next
playbackHitPosition are caused by input m's being dispatched.

* inspector/protocol/Replay.json: Clarify the message's semantics.
* replay/ReplayController.cpp:
(WebCore::ReplayController::willDispatchInput):
(WebCore::ReplayController::didDispatchInput):

Source/WebInspectorUI:

Pausing playback from the UI was broken because of a typo. Fix this, and rename
stopPlayback to cancelPlayback.

* UserInterface/Controllers/ReplayManager.js:
(WebInspector.ReplayManager.prototype.switchSession.if):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorprotocolReplayjson">trunk/Source/WebCore/inspector/protocol/Replay.json</a></li>
<li><a href="#trunkSourceWebCorereplayReplayControllercpp">trunk/Source/WebCore/replay/ReplayController.cpp</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersReplayManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (174036 => 174037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-09-27 20:27:59 UTC (rev 174036)
+++ trunk/Source/WebCore/ChangeLog        2014-09-27 22:17:29 UTC (rev 174037)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-09-27  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: Playback position updates should be sent before the next event loop input is dispatched
+        https://bugs.webkit.org/show_bug.cgi?id=137162
+
+        Reviewed by Timothy Hatcher.
+
+        To drive playback position updates in the Inspector UI, we send playbackHitPosition protocol
+        messages as the replay backend dispatches inputs. However, right now the semantics of that
+        message are muddy. The update is sent *after* the input at the offset is dispatched. This leads
+        to unexpected results if the debugger pauses while the input is being dispatched: the frontend
+        will only know about the previous (stale) playback position when the debugger pauses.
+
+        With this patch, the backend sends the playbackHitPosition(segmentOffset=n, inputOffset=m)
+        message when backend is about to dispatch input m, but has not yet begun to do so. Thus, any
+        subsequent page execution events (profiling, debugger pauses, etc) until the next
+        playbackHitPosition are caused by input m's being dispatched.
+
+        * inspector/protocol/Replay.json: Clarify the message's semantics.
+        * replay/ReplayController.cpp:
+        (WebCore::ReplayController::willDispatchInput):
+        (WebCore::ReplayController::didDispatchInput):
+
</ins><span class="cx"> 2014-09-27  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Chaining multiple :nth-child() does not work properly
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorprotocolReplayjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/protocol/Replay.json (174036 => 174037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/protocol/Replay.json        2014-09-27 20:27:59 UTC (rev 174036)
+++ trunk/Source/WebCore/inspector/protocol/Replay.json        2014-09-27 22:17:29 UTC (rev 174037)
</span><span class="lines">@@ -171,7 +171,7 @@
</span><span class="cx">         },
</span><span class="cx">         {
</span><span class="cx">             &quot;name&quot;: &quot;playbackHitPosition&quot;,
</span><del>-            &quot;description&quot;: &quot;A position was reached during playback of the session.&quot;,
</del><ins>+            &quot;description&quot;: &quot;Playback within the session has progressed up to this position, and is about to replay the input at the specified offset.&quot;,
</ins><span class="cx">             &quot;parameters&quot;: [
</span><span class="cx">                 { &quot;name&quot;: &quot;position&quot;, &quot;$ref&quot;: &quot;ReplayPosition&quot;, &quot;description&quot;: &quot;The playback position that was hit.&quot; },
</span><span class="cx">                 { &quot;name&quot;: &quot;timestamp&quot;, &quot;type&quot;: &quot;number&quot;, &quot;description&quot;: &quot;A timestamp for the event.&quot; }
</span></span></pre></div>
<a id="trunkSourceWebCorereplayReplayControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/replay/ReplayController.cpp (174036 => 174037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/replay/ReplayController.cpp        2014-09-27 20:27:59 UTC (rev 174036)
+++ trunk/Source/WebCore/replay/ReplayController.cpp        2014-09-27 22:17:29 UTC (rev 174037)
</span><span class="lines">@@ -510,6 +510,9 @@
</span><span class="cx">     ASSERT(m_segmentState == SegmentState::Dispatching);
</span><span class="cx"> 
</span><span class="cx">     m_currentPosition.inputOffset++;
</span><ins>+
+    InspectorInstrumentation::playbackHitPosition(&amp;m_page, m_currentPosition);
+
</ins><span class="cx">     if (m_currentPosition == m_targetPosition)
</span><span class="cx">         pausePlayback();
</span><span class="cx"> }
</span><span class="lines">@@ -518,8 +521,6 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(m_sessionState == SessionState::Replaying);
</span><span class="cx">     ASSERT(m_segmentState == SegmentState::Dispatching);
</span><del>-
-    InspectorInstrumentation::playbackHitPosition(&amp;m_page, m_currentPosition);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void ReplayController::didDispatchFinalInput()
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (174036 => 174037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2014-09-27 20:27:59 UTC (rev 174036)
+++ trunk/Source/WebInspectorUI/ChangeLog        2014-09-27 22:17:29 UTC (rev 174037)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2014-09-27  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
+
+        Web Replay: Playback position updates should be sent before the next event loop input is dispatched
+        https://bugs.webkit.org/show_bug.cgi?id=137162
+
+        Reviewed by Timothy Hatcher.
+
+        Pausing playback from the UI was broken because of a typo. Fix this, and rename
+        stopPlayback to cancelPlayback.
+
+        * UserInterface/Controllers/ReplayManager.js:
+        (WebInspector.ReplayManager.prototype.switchSession.if):
+
</ins><span class="cx"> 2014-09-26  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Automatic Inspection should continue once all breakpoints are loaded
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersReplayManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js (174036 => 174037)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js        2014-09-27 20:27:59 UTC (rev 174036)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/ReplayManager.js        2014-09-27 22:17:29 UTC (rev 174037)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (this.sessionState === WebInspector.ReplayManager.SessionState.Replaying) {
</span><span class="cx">             result = result.then(function() {
</span><del>-                return WebInspector.replayManager.stopPlayback();
</del><ins>+                return WebInspector.replayManager.cancelPlayback();
</ins><span class="cx">             });
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -244,7 +244,7 @@
</span><span class="cx"> 
</span><span class="cx">         if (this.sessionState === WebInspector.ReplayManager.SessionState.Replaying) {
</span><span class="cx">             result = result.then(function() {
</span><del>-                return WebInspector.replayManager.stopPlayback();
</del><ins>+                return WebInspector.replayManager.cancelPlayback();
</ins><span class="cx">             });
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -289,7 +289,7 @@
</span><span class="cx">         if (this.sessionState === WebInspector.ReplayManager.SessionState.Inactive)
</span><span class="cx">             return result; // Already stopped.
</span><span class="cx"> 
</span><del>-        if (this.sessionState !== WebInspector.ReplayManager.SegmentState.Dispatching)
</del><ins>+        if (this.segmentState !== WebInspector.ReplayManager.SegmentState.Dispatching)
</ins><span class="cx">             return result; // Already stopped.
</span><span class="cx"> 
</span><span class="cx">         result = result.then(function() {
</span><span class="lines">@@ -307,7 +307,7 @@
</span><span class="cx"> 
</span><span class="cx">     // Pause playback and unload the current session segment as soon as possible.
</span><span class="cx">     // Returns a promise that resolves when the current segment is unloaded.
</span><del>-    stopPlayback: function() // --&gt; ()
</del><ins>+    cancelPlayback: function() // --&gt; ()
</ins><span class="cx">     {
</span><span class="cx">         console.assert(this.sessionState !== WebInspector.ReplayManager.SessionState.Capturing, &quot;Cannot stop playback while capturing.&quot;);
</span><span class="cx"> 
</span><span class="lines">@@ -321,7 +321,7 @@
</span><span class="cx">                 console.assert(manager.sessionState === WebInspector.ReplayManager.SessionState.Replaying);
</span><span class="cx">                 console.assert(manager.segmentState !== WebInspector.ReplayManager.SegmentState.Appending);
</span><span class="cx"> 
</span><del>-                return ReplayAgent.stopPlayback();
</del><ins>+                return ReplayAgent.cancelPlayback();
</ins><span class="cx">             }).catch(function(error) {
</span><span class="cx">                 console.error(&quot;Failed to stop playback: &quot;, error);
</span><span class="cx">                 throw error;
</span></span></pre>
</div>
</div>

</body>
</html>