<!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>[171866] 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/171866">171866</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2014-07-31 10:34:48 -0700 (Thu, 31 Jul 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: console.profile missing profile information
https://bugs.webkit.org/show_bug.cgi?id=135432

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2014-07-31
Reviewed by Timothy Hatcher.

Source/WebCore:
By switching console.profile to start/stop the timeline we would
not have a chance to recompile JS functions with profiling information.
This used to work because whenever the inspector was open we would
have profiling information enabled. Go back to that behavior.

* inspector/InspectorController.cpp:
(WebCore::InspectorController::profilerEnabled):
Instead of checking if the timeline agent has started, check if the
timeline agent has been created. Going back to the normal behavior
of always having profiling information when the inspector is open.

* inspector/InspectorTimelineAgent.h:
* inspector/InspectorTimelineAgent.cpp:
(WebCore::InspectorTimelineAgent::didCreateFrontendAndBackend):
Recompile initializing the timeline agent to include profiling information.

(WebCore::InspectorTimelineAgent::willDestroyFrontendAndBackend):
Recompile destrying the timeline agent, only if needed.

(WebCore::InspectorTimelineAgent::willCallFunction):
(WebCore::InspectorTimelineAgent::didCallFunction):
(WebCore::InspectorTimelineAgent::willEvaluateScript):
(WebCore::InspectorTimelineAgent::didEvaluateScript):
Using a boolean to track nested calls would not give expected
behavior when un-nesting. Switch to a counter to ensure that
as we start profiling in the outermost level we then stop
profiling at that same level and not inside an inner nesting.

Source/WebInspectorUI:
* UserInterface/Models/ScriptTimelineRecord.js:
Delete the payload information as soon as it has been processed.
It is no longer needed anymore and can be garbage collected.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorControllercpp">trunk/Source/WebCore/inspector/InspectorController.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorTimelineAgentcpp">trunk/Source/WebCore/inspector/InspectorTimelineAgent.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorTimelineAgenth">trunk/Source/WebCore/inspector/InspectorTimelineAgent.h</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsScriptTimelineRecordjs">trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebCore/ChangeLog        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -1,3 +1,38 @@
</span><ins>+2014-07-31  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: console.profile missing profile information
+        https://bugs.webkit.org/show_bug.cgi?id=135432
+
+        Reviewed by Timothy Hatcher.
+
+        By switching console.profile to start/stop the timeline we would
+        not have a chance to recompile JS functions with profiling information.
+        This used to work because whenever the inspector was open we would
+        have profiling information enabled. Go back to that behavior.
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::profilerEnabled):
+        Instead of checking if the timeline agent has started, check if the
+        timeline agent has been created. Going back to the normal behavior
+        of always having profiling information when the inspector is open.
+
+        * inspector/InspectorTimelineAgent.h:
+        * inspector/InspectorTimelineAgent.cpp:
+        (WebCore::InspectorTimelineAgent::didCreateFrontendAndBackend):
+        Recompile initializing the timeline agent to include profiling information.
+
+        (WebCore::InspectorTimelineAgent::willDestroyFrontendAndBackend):
+        Recompile destrying the timeline agent, only if needed.
+
+        (WebCore::InspectorTimelineAgent::willCallFunction):
+        (WebCore::InspectorTimelineAgent::didCallFunction):
+        (WebCore::InspectorTimelineAgent::willEvaluateScript):
+        (WebCore::InspectorTimelineAgent::didEvaluateScript):
+        Using a boolean to track nested calls would not give expected
+        behavior when un-nesting. Switch to a counter to ensure that
+        as we start profiling in the outermost level we then stop
+        profiling at that same level and not inside an inner nesting.
+
</ins><span class="cx"> 2014-07-31  Wenson Hsieh  &lt;wenson_hsieh@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refactor EventHandler to call ScrollAnimator::handleWheelEvent for overflow scrolling
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorController.cpp (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorController.cpp        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebCore/inspector/InspectorController.cpp        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -380,7 +380,7 @@
</span><span class="cx"> 
</span><span class="cx"> bool InspectorController::profilerEnabled() const
</span><span class="cx"> {
</span><del>-    return m_instrumentingAgents-&gt;inspectorTimelineAgent();
</del><ins>+    return m_instrumentingAgents-&gt;persistentInspectorTimelineAgent();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorController::setProfilerEnabled(bool enable)
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorTimelineAgentcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorTimelineAgent.cpp (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorTimelineAgent.cpp        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebCore/inspector/InspectorTimelineAgent.cpp        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -76,15 +76,23 @@
</span><span class="cx">     m_backendDispatcher = InspectorTimelineBackendDispatcher::create(backendDispatcher, this);
</span><span class="cx"> 
</span><span class="cx">     m_instrumentingAgents-&gt;setPersistentInspectorTimelineAgent(this);
</span><ins>+
+    if (m_scriptDebugServer)
+        m_scriptDebugServer-&gt;recompileAllJSFunctions();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void InspectorTimelineAgent::willDestroyFrontendAndBackend(InspectorDisconnectReason)
</del><ins>+void InspectorTimelineAgent::willDestroyFrontendAndBackend(InspectorDisconnectReason reason)
</ins><span class="cx"> {
</span><span class="cx">     m_frontendDispatcher = nullptr;
</span><span class="cx">     m_backendDispatcher.clear();
</span><span class="cx"> 
</span><span class="cx">     m_instrumentingAgents-&gt;setPersistentInspectorTimelineAgent(nullptr);
</span><span class="cx"> 
</span><ins>+    if (reason != InspectorDisconnectReason::InspectedTargetDestroyed) {
+        if (m_scriptDebugServer)
+            m_scriptDebugServer-&gt;recompileAllJSFunctions();
+    }
+
</ins><span class="cx">     ErrorString error;
</span><span class="cx">     stop(&amp;error);
</span><span class="cx"> }
</span><span class="lines">@@ -209,26 +217,29 @@
</span><span class="cx"> {
</span><span class="cx">     pushCurrentRecord(TimelineRecordFactory::createFunctionCallData(scriptName, scriptLine), TimelineRecordType::FunctionCall, true, frame);
</span><span class="cx"> 
</span><del>-    if (frame &amp;&amp; !m_recordingProfile) {
-        m_recordingProfile = true;
</del><ins>+    if (frame &amp;&amp; !m_recordingProfileDepth) {
+        ++m_recordingProfileDepth;
</ins><span class="cx">         startProfiling(frame, ASCIILiteral(&quot;Timeline FunctionCall&quot;));
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorTimelineAgent::didCallFunction(Frame* frame)
</span><span class="cx"> {
</span><del>-    if (frame &amp;&amp; m_recordingProfile) {
-        if (m_recordStack.isEmpty())
-            return;
</del><ins>+    if (frame &amp;&amp; m_recordingProfileDepth) {
+        --m_recordingProfileDepth;
+        ASSERT(m_recordingProfileDepth &gt;= 0);
</ins><span class="cx"> 
</span><del>-        TimelineRecordEntry&amp; entry = m_recordStack.last();
-        ASSERT(entry.type == TimelineRecordType::FunctionCall);
</del><ins>+        if (!m_recordingProfileDepth) {
+            if (m_recordStack.isEmpty())
+                return;
</ins><span class="cx"> 
</span><del>-        RefPtr&lt;JSC::Profile&gt; profile = stopProfiling(frame, ASCIILiteral(&quot;Timeline FunctionCall&quot;));
-        if (profile)
-            TimelineRecordFactory::appendProfile(entry.data.get(), profile.release());
</del><ins>+            TimelineRecordEntry&amp; entry = m_recordStack.last();
+            ASSERT(entry.type == TimelineRecordType::FunctionCall);
</ins><span class="cx"> 
</span><del>-        m_recordingProfile = false;
</del><ins>+            RefPtr&lt;JSC::Profile&gt; profile = stopProfiling(frame, ASCIILiteral(&quot;Timeline FunctionCall&quot;));
+            if (profile)
+                TimelineRecordFactory::appendProfile(entry.data.get(), profile.release());
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     didCompleteCurrentRecord(TimelineRecordType::FunctionCall);
</span><span class="lines">@@ -380,26 +391,29 @@
</span><span class="cx"> {
</span><span class="cx">     pushCurrentRecord(TimelineRecordFactory::createEvaluateScriptData(url, lineNumber), TimelineRecordType::EvaluateScript, true, frame);
</span><span class="cx"> 
</span><del>-    if (frame &amp;&amp; !m_recordingProfile) {
-        m_recordingProfile = true;
</del><ins>+    if (frame &amp;&amp; !m_recordingProfileDepth) {
+        ++m_recordingProfileDepth;
</ins><span class="cx">         startProfiling(frame, ASCIILiteral(&quot;Timeline EvaluateScript&quot;));
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void InspectorTimelineAgent::didEvaluateScript(Frame* frame)
</span><span class="cx"> {
</span><del>-    if (frame &amp;&amp; m_recordingProfile) {
-        if (m_recordStack.isEmpty())
-            return;
</del><ins>+    if (frame &amp;&amp; m_recordingProfileDepth) {
+        --m_recordingProfileDepth;
+        ASSERT(m_recordingProfileDepth &gt;= 0);
+        
+        if (!m_recordingProfileDepth) {
+            if (m_recordStack.isEmpty())
+                return;
</ins><span class="cx"> 
</span><del>-        TimelineRecordEntry&amp; entry = m_recordStack.last();
-        ASSERT(entry.type == TimelineRecordType::EvaluateScript);
</del><ins>+            TimelineRecordEntry&amp; entry = m_recordStack.last();
+            ASSERT(entry.type == TimelineRecordType::EvaluateScript);
</ins><span class="cx"> 
</span><del>-        RefPtr&lt;JSC::Profile&gt; profile = stopProfiling(frame, ASCIILiteral(&quot;Timeline EvaluateScript&quot;));
-        if (profile)
-            TimelineRecordFactory::appendProfile(entry.data.get(), profile.release());
-
-        m_recordingProfile = false;
</del><ins>+            RefPtr&lt;JSC::Profile&gt; profile = stopProfiling(frame, ASCIILiteral(&quot;Timeline EvaluateScript&quot;));
+            if (profile)
+                TimelineRecordFactory::appendProfile(entry.data.get(), profile.release());
+        }
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     didCompleteCurrentRecord(TimelineRecordType::EvaluateScript);
</span><span class="lines">@@ -666,8 +680,8 @@
</span><span class="cx">     , m_maxCallStackDepth(5)
</span><span class="cx">     , m_inspectorType(type)
</span><span class="cx">     , m_client(client)
</span><ins>+    , m_recordingProfileDepth(0)
</ins><span class="cx">     , m_enabled(false)
</span><del>-    , m_recordingProfile(false)
</del><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorTimelineAgenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorTimelineAgent.h (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorTimelineAgent.h        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebCore/inspector/InspectorTimelineAgent.h        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -282,8 +282,8 @@
</span><span class="cx"> 
</span><span class="cx">     Vector&lt;TimelineRecordEntry&gt; m_pendingConsoleProfileRecords;
</span><span class="cx"> 
</span><ins>+    int m_recordingProfileDepth;
</ins><span class="cx">     bool m_enabled;
</span><del>-    bool m_recordingProfile;
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebInspectorUI/ChangeLog        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2014-07-31  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: console.profile missing profile information
+        https://bugs.webkit.org/show_bug.cgi?id=135432
+
+        Reviewed by Timothy Hatcher.
+
+        * UserInterface/Models/ScriptTimelineRecord.js:
+        Delete the payload information as soon as it has been processed.
+        It is no longer needed anymore and can be garbage collected.
+
</ins><span class="cx"> 2014-07-30  Brian J. Burg  &lt;burg@cs.washington.edu&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: ProbeSetDetailsSection should not create live location links for unresolved breakpoints
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsScriptTimelineRecordjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js (171865 => 171866)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js        2014-07-31 17:24:38 UTC (rev 171865)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js        2014-07-31 17:34:48 UTC (rev 171866)
</span><span class="lines">@@ -284,6 +284,7 @@
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         var payload = this._profilePayload;
</span><ins>+        delete this._profilePayload;
</ins><span class="cx"> 
</span><span class="cx">         console.assert(payload.rootNodes instanceof Array);
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>