<!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>[190520] 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/190520">190520</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2015-10-02 13:40:47 -0700 (Fri, 02 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Web Inspector: Include Garbage Collection Event in Timeline
https://bugs.webkit.org/show_bug.cgi?id=142510

Patch by Joseph Pecoraro &lt;pecoraro@apple.com&gt; on 2015-10-02
Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

* CMakeLists.txt:
* DerivedSources.make:
* JavaScriptCore.xcodeproj/project.pbxproj:

* heap/HeapObserver.h:
* heap/Heap.cpp:
(JSC::Heap::willStartCollection):
(JSC::Heap::didFinishCollection):
* heap/Heap.h:
(JSC::Heap::addObserver):
(JSC::Heap::removeObserver):
Allow observers on heap to add hooks for starting / ending garbage collection.

* inspector/InspectorEnvironment.h:
* inspector/JSGlobalObjectInspectorController.cpp:
(Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
(Inspector::JSGlobalObjectInspectorController::vm):
* inspector/JSGlobalObjectInspectorController.h:
Access the VM through the InspectorEnvironment as it won't change.

* inspector/agents/InspectorHeapAgent.cpp: Added.
(Inspector::InspectorHeapAgent::InspectorHeapAgent):
(Inspector::InspectorHeapAgent::~InspectorHeapAgent):
(Inspector::InspectorHeapAgent::didCreateFrontendAndBackend):
(Inspector::InspectorHeapAgent::willDestroyFrontendAndBackend):
(Inspector::InspectorHeapAgent::enable):
(Inspector::InspectorHeapAgent::disable):
(Inspector::InspectorHeapAgent::gc):
(Inspector::protocolTypeForHeapOperation):
(Inspector::InspectorHeapAgent::willGarbageCollect):
(Inspector::InspectorHeapAgent::didGarbageCollect):
* inspector/agents/InspectorHeapAgent.h: Added.
* inspector/protocol/Heap.json: Added.
New domain and agent to handle tasks related to the JavaScriptCore heap.

Source/WebCore:

Tests: inspector/heap/garbageCollected.html
       inspector/heap/gc.html

* ForwardingHeaders/heap/HeapObserver.h: Added.
* ForwardingHeaders/inspector/agents/InspectorHeapAgent.h: Added.
* WebCore.vcxproj/WebCore.vcxproj:
* WebCore.vcxproj/WebCore.vcxproj.filters:
Forwarding headers.

* inspector/InspectorController.cpp:
(WebCore::InspectorController::InspectorController):
(WebCore::InspectorController::vm):
* inspector/InspectorController.h:
* inspector/WorkerInspectorController.cpp:
(WebCore::WorkerInspectorController::vm):
* inspector/WorkerInspectorController.h:
Implement InspectorEnvironment::vm and create a Heap agent for the
Page inspector controller.

Source/WebInspectorUI:

* UserInterface/Base/Utilities.js:
(Array.prototype.parition):
Helper to partition an Array into two arrays.

* UserInterface/Main.html:
* Localizations/en.lproj/localizedStrings.js:
* UserInterface/Base/Main.js:
(WebInspector.loaded):
* UserInterface/Test.html:
* UserInterface/Test/Test.js:
(WebInspector.loaded):
* UserInterface/Protocol/HeapObserver.js:
(WebInspector.HeapObserver.prototype.garbageCollected):
(WebInspector.HeapObserver):
Create the new observer and manager.

* UserInterface/Models/GarbageCollection.js:
(WebInspector.GarbageCollection):
(WebInspector.GarbageCollection.fromPayload):
(WebInspector.GarbageCollection.prototype.get type):
(WebInspector.GarbageCollection.prototype.get startTime):
(WebInspector.GarbageCollection.prototype.get endTime):
(WebInspector.GarbageCollection.prototype.get duration):
Model object for Heap.GarbageCollection.

* UserInterface/Controllers/HeapManager.js:
(WebInspector.HeapManager):
(WebInspector.HeapManager.prototype.garbageCollected):
Dispatch events with.

* UserInterface/Controllers/TimelineManager.js:
(WebInspector.TimelineManager):
(WebInspector.TimelineManager.prototype._garbageCollected):
Include new GC Timeline Events as Script events.

* UserInterface/Views/ScriptTimelineOverviewGraph.js:
(WebInspector.ScriptTimelineOverviewGraph.prototype.updateLayout):
For the Script overview, make two sets of bars, one for Scripts and one for GCs.
The GCs bar will be on top of the the Scripts bar. This is particularly useful
since a GC can happen during script execution.

* UserInterface/Views/ScriptTimelineDataGridNode.js:
(WebInspector.ScriptTimelineDataGridNode.prototype.get data):
(WebInspector.ScriptTimelineDataGridNode.prototype.createCellContent):
(WebInspector.ScriptTimelineDataGridNode):
Give a NaN call count to top level Script DataGridNodes.
In the UI, display the empty placeholder for NaN call counts.

* UserInterface/Images/TimelineRecordGarbageCollection.svg: Added.
* UserInterface/Models/ScriptTimelineRecord.js:
(WebInspector.ScriptTimelineRecord.prototype.isGarbageCollection):
(WebInspector.ScriptTimelineRecord.EventType.displayName):
* UserInterface/Views/ScriptTimelineView.js:
(WebInspector.ScriptTimelineView.prototype._processPendingRecords):
* UserInterface/Views/SourceCodeTimelineTreeElement.js:
(WebInspector.SourceCodeTimelineTreeElement):
* UserInterface/Views/TimelineIcons.css:
(.garbage-collection-profile-record .icon):
* UserInterface/Views/TimelineRecordBar.css:
(.timeline-record-bar.timeline-record-type-script.script-timeline-record-garbage-collected &gt; .segment):
UI for GC events.

* UserInterface/Views/TimelineRecordBar.js:
(WebInspector.TimelineRecordBar.createCombinedBars):
Simplify by storing start time into a variable.

* UserInterface/Views/TimelineRecordTreeElement.js:
(WebInspector.TimelineRecordTreeElement):
Icon for GC events.

LayoutTests:

* inspector/heap/garbageCollected-expected.txt: Added.
* inspector/heap/garbageCollected.html: Added.
* inspector/heap/gc-expected.txt: Added.
* inspector/heap/gc.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreDerivedSourcesmake">trunk/Source/JavaScriptCore/DerivedSources.make</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapcpp">trunk/Source/JavaScriptCore/heap/Heap.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeaph">trunk/Source/JavaScriptCore/heap/Heap.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapMarkedSpaceh">trunk/Source/JavaScriptCore/heap/MarkedSpace.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorInspectorEnvironmenth">trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllercpp">trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllerh">trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorControllercpp">trunk/Source/WebCore/inspector/InspectorController.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorInspectorControllerh">trunk/Source/WebCore/inspector/InspectorController.h</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerInspectorControllercpp">trunk/Source/WebCore/inspector/WorkerInspectorController.cpp</a></li>
<li><a href="#trunkSourceWebCoreinspectorWorkerInspectorControllerh">trunk/Source/WebCore/inspector/WorkerInspectorController.h</a></li>
<li><a href="#trunkSourceWebInspectorUIChangeLog">trunk/Source/WebInspectorUI/ChangeLog</a></li>
<li><a href="#trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs">trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseMainjs">trunk/Source/WebInspectorUI/UserInterface/Base/Main.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceBaseUtilitiesjs">trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersTimelineManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceMainhtml">trunk/Source/WebInspectorUI/UserInterface/Main.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsScriptTimelineRecordjs">trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTestTestjs">trunk/Source/WebInspectorUI/UserInterface/Test/Test.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceTesthtml">trunk/Source/WebInspectorUI/UserInterface/Test.html</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineDataGridNodejs">trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineDataGridNode.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineOverviewGraphjs">trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineOverviewGraph.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineViewjs">trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineView.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineIconscss">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineIcons.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordBarcss">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.css</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordBarjs">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordTreeElementjs">trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/LayoutTests/inspector/heap/</li>
<li><a href="#trunkLayoutTestsinspectorheapgarbageCollectedexpectedtxt">trunk/LayoutTests/inspector/heap/garbageCollected-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorheapgarbageCollectedhtml">trunk/LayoutTests/inspector/heap/garbageCollected.html</a></li>
<li><a href="#trunkLayoutTestsinspectorheapgcexpectedtxt">trunk/LayoutTests/inspector/heap/gc-expected.txt</a></li>
<li><a href="#trunkLayoutTestsinspectorheapgchtml">trunk/LayoutTests/inspector/heap/gc.html</a></li>
<li><a href="#trunkSourceJavaScriptCoreheapHeapObserverh">trunk/Source/JavaScriptCore/heap/HeapObserver.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorHeapAgentcpp">trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectoragentsInspectorHeapAgenth">trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreinspectorprotocolHeapjson">trunk/Source/JavaScriptCore/inspector/protocol/Heap.json</a></li>
<li><a href="#trunkSourceWebCoreForwardingHeadersheapHeapObserverh">trunk/Source/WebCore/ForwardingHeaders/heap/HeapObserver.h</a></li>
<li><a href="#trunkSourceWebCoreForwardingHeadersinspectoragentsInspectorHeapAgenth">trunk/Source/WebCore/ForwardingHeaders/inspector/agents/InspectorHeapAgent.h</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceControllersHeapManagerjs">trunk/Source/WebInspectorUI/UserInterface/Controllers/HeapManager.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceImagesTimelineRecordGarbageCollectionsvg">trunk/Source/WebInspectorUI/UserInterface/Images/TimelineRecordGarbageCollection.svg</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceModelsGarbageCollectionjs">trunk/Source/WebInspectorUI/UserInterface/Models/GarbageCollection.js</a></li>
<li><a href="#trunkSourceWebInspectorUIUserInterfaceProtocolHeapObserverjs">trunk/Source/WebInspectorUI/UserInterface/Protocol/HeapObserver.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/LayoutTests/ChangeLog        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -1,3 +1,15 @@
</span><ins>+2015-10-02  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Include Garbage Collection Event in Timeline
+        https://bugs.webkit.org/show_bug.cgi?id=142510
+
+        Reviewed by Geoffrey Garen.
+
+        * inspector/heap/garbageCollected-expected.txt: Added.
+        * inspector/heap/garbageCollected.html: Added.
+        * inspector/heap/gc-expected.txt: Added.
+        * inspector/heap/gc.html: Added.
+
</ins><span class="cx"> 2015-10-02  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Test gardening.
</span></span></pre></div>
<a id="trunkLayoutTestsinspectorheapgarbageCollectedexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/heap/garbageCollected-expected.txt (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/heap/garbageCollected-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/heap/garbageCollected-expected.txt        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,7 @@
</span><ins>+Test for the Heap.garbageCollected event.
+
+
+== Running test suite: Heap.garbageCollected
+-- Running test case: TriggerGCs
+PASS: Should see both a Partial and Full Garbage Collection.
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorheapgarbageCollectedhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/heap/garbageCollected.html (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/heap/garbageCollected.html                                (rev 0)
+++ trunk/LayoutTests/inspector/heap/garbageCollected.html        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+function triggerGCs()
+{
+    function allocateObjects() {
+        var list = [];
+        for (var i = 0; i &lt; 100; ++i)
+            list.push({x:i});
+        return list;
+    }
+
+    function allocateLargeList() {
+        var largeList = [];
+        for (var i = 0; i &lt; 100; ++i)
+            largeList.push(allocateObjects());
+        return largeList;
+    }
+
+    var partialList = [];
+    for (var i = 0; i &lt; 100; ++i)
+        partialList.push(allocateLargeList());
+}
+
+function periodicallyTriggerGCs()
+{
+    setInterval(triggerGCs, 20);
+}
+
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite(&quot;Heap.garbageCollected&quot;);
+
+    suite.addTestCase({
+        name: &quot;TriggerGCs&quot;,
+        description: &quot;Evaluating allocation heavy JavaScript should trigger Heap.garbageCollected events.&quot;,
+        test: (resolve, reject) =&gt; {
+            InspectorTest.evaluateInPage(&quot;periodicallyTriggerGCs()&quot;);
+
+            let seenFull = false;
+            let seenPartial = false;
+            WebInspector.heapManager.addEventListener(WebInspector.HeapManager.Event.GarbageCollected, (event) =&gt; {
+                if (seenFull &amp;&amp; seenPartial)
+                    return;
+
+                if (event.data.collection.type === WebInspector.GarbageCollection.Type.Full)
+                    seenFull = true;
+                else if (event.data.collection.type === WebInspector.GarbageCollection.Type.Partial)
+                    seenPartial = true;
+
+                if (seenFull &amp;&amp; seenPartial) {
+                    InspectorTest.log(&quot;PASS: Should see both a Partial and Full Garbage Collection.&quot;);
+                    resolve();
+                }
+            });
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Test for the Heap.garbageCollected event.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorheapgcexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/heap/gc-expected.txt (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/heap/gc-expected.txt                                (rev 0)
+++ trunk/LayoutTests/inspector/heap/gc-expected.txt        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+Test for the Heap.gc command.
+
+
+== Running test suite: Heap.gc
+-- Running test case: TriggerGCShouldCreateGCEvent
+PASS: Event should have GarbageCollection data.
+PASS: GarbageCollection type should be Full.
+
</ins></span></pre></div>
<a id="trunkLayoutTestsinspectorheapgchtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/inspector/heap/gc.html (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/inspector/heap/gc.html                                (rev 0)
+++ trunk/LayoutTests/inspector/heap/gc.html        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,30 @@
</span><ins>+&lt;!doctype html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../http/tests/inspector/resources/inspector-test.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+function test()
+{
+    let suite = InspectorTest.createAsyncSuite(&quot;Heap.gc&quot;);
+
+    suite.addTestCase({
+        name: &quot;TriggerGCShouldCreateGCEvent&quot;,
+        description: &quot;Calling Heap.gc should trigger Heap.garbageCollected event if enabled.&quot;,
+        test: (resolve, reject) =&gt; {
+            HeapAgent.gc();
+            WebInspector.heapManager.singleFireEventListener(WebInspector.HeapManager.Event.GarbageCollected, (event) =&gt; {
+                InspectorTest.expectThat(event.data.collection instanceof WebInspector.GarbageCollection, &quot;Event should have GarbageCollection data.&quot;);
+                InspectorTest.expectThat(event.data.collection.type === WebInspector.GarbageCollection.Type.Full, &quot;GarbageCollection type should be Full.&quot;);
+                resolve();
+            });
+        }
+    });
+
+    suite.runTestCasesAndFinish();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;p&gt;Test for the Heap.gc command.&lt;/p&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -347,6 +347,7 @@
</span><span class="cx">     inspector/agents/InspectorAgent.cpp
</span><span class="cx">     inspector/agents/InspectorConsoleAgent.cpp
</span><span class="cx">     inspector/agents/InspectorDebuggerAgent.cpp
</span><ins>+    inspector/agents/InspectorHeapAgent.cpp
</ins><span class="cx">     inspector/agents/InspectorRuntimeAgent.cpp
</span><span class="cx">     inspector/agents/JSGlobalObjectConsoleAgent.cpp
</span><span class="cx">     inspector/agents/JSGlobalObjectDebuggerAgent.cpp
</span><span class="lines">@@ -1026,6 +1027,7 @@
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Database.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Debugger.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/GenericTypes.json
</span><ins>+    ${JAVASCRIPTCORE_DIR}/inspector/protocol/Heap.json
</ins><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Inspector.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/LayerTree.json
</span><span class="cx">     ${JAVASCRIPTCORE_DIR}/inspector/protocol/Network.json
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -1,3 +1,45 @@
</span><ins>+2015-10-02  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Include Garbage Collection Event in Timeline
+        https://bugs.webkit.org/show_bug.cgi?id=142510
+
+        Reviewed by Geoffrey Garen.
+
+        * CMakeLists.txt:
+        * DerivedSources.make:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+
+        * heap/HeapObserver.h:        
+        * heap/Heap.cpp:
+        (JSC::Heap::willStartCollection):
+        (JSC::Heap::didFinishCollection):
+        * heap/Heap.h:
+        (JSC::Heap::addObserver):
+        (JSC::Heap::removeObserver):
+        Allow observers on heap to add hooks for starting / ending garbage collection.
+
+        * inspector/InspectorEnvironment.h:
+        * inspector/JSGlobalObjectInspectorController.cpp:
+        (Inspector::JSGlobalObjectInspectorController::JSGlobalObjectInspectorController):
+        (Inspector::JSGlobalObjectInspectorController::vm):
+        * inspector/JSGlobalObjectInspectorController.h:
+        Access the VM through the InspectorEnvironment as it won't change.
+
+        * inspector/agents/InspectorHeapAgent.cpp: Added.
+        (Inspector::InspectorHeapAgent::InspectorHeapAgent):
+        (Inspector::InspectorHeapAgent::~InspectorHeapAgent):
+        (Inspector::InspectorHeapAgent::didCreateFrontendAndBackend):
+        (Inspector::InspectorHeapAgent::willDestroyFrontendAndBackend):
+        (Inspector::InspectorHeapAgent::enable):
+        (Inspector::InspectorHeapAgent::disable):
+        (Inspector::InspectorHeapAgent::gc):
+        (Inspector::protocolTypeForHeapOperation):
+        (Inspector::InspectorHeapAgent::willGarbageCollect):
+        (Inspector::InspectorHeapAgent::didGarbageCollect):
+        * inspector/agents/InspectorHeapAgent.h: Added.
+        * inspector/protocol/Heap.json: Added.
+        New domain and agent to handle tasks related to the JavaScriptCore heap.
+
</ins><span class="cx"> 2015-10-01  Geoffrey Garen  &lt;ggaren@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, rolling out r190450
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreDerivedSourcesmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/DerivedSources.make (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/DerivedSources.make        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/DerivedSources.make        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -152,6 +152,7 @@
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/Database.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/Debugger.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/GenericTypes.json \
</span><ins>+    $(JavaScriptCore)/inspector/protocol/Heap.json \
</ins><span class="cx">     $(JavaScriptCore)/inspector/protocol/Inspector.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/LayerTree.json \
</span><span class="cx">     $(JavaScriptCore)/inspector/protocol/Network.json \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -1290,6 +1290,9 @@
</span><span class="cx">                 A532438C18568335002ED692 /* InspectorProtocolObjects.h in Headers */ = {isa = PBXBuildFile; fileRef = A532438618568317002ED692 /* InspectorProtocolObjects.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 A532439418569709002ED692 /* generate-combined-inspector-json.py in Headers */ = {isa = PBXBuildFile; fileRef = A5324391185696E6002ED692 /* generate-combined-inspector-json.py */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 A53243981856A489002ED692 /* CombinedDomains.json in Headers */ = {isa = PBXBuildFile; fileRef = A53243951856A475002ED692 /* CombinedDomains.json */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                A5339EC61BB399A60054F005 /* InspectorHeapAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = A5339EC51BB399900054F005 /* InspectorHeapAgent.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                A5339EC71BB399A90054F005 /* InspectorHeapAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A5339EC41BB399900054F005 /* InspectorHeapAgent.cpp */; };
+                A5339EC91BB4B4600054F005 /* HeapObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = A5339EC81BB4B4510054F005 /* HeapObserver.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 A53CE08518BC1A5600BEDF76 /* ConsolePrototype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A53CE08118BC1A5600BEDF76 /* ConsolePrototype.cpp */; };
</span><span class="cx">                 A53CE08618BC1A5600BEDF76 /* ConsolePrototype.h in Headers */ = {isa = PBXBuildFile; fileRef = A53CE08218BC1A5600BEDF76 /* ConsolePrototype.h */; };
</span><span class="cx">                 A53CE08718BC1A5600BEDF76 /* JSConsole.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A53CE08318BC1A5600BEDF76 /* JSConsole.cpp */; };
</span><span class="lines">@@ -3188,6 +3191,9 @@
</span><span class="cx">                 A5324391185696E6002ED692 /* generate-combined-inspector-json.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = &quot;generate-combined-inspector-json.py&quot;; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A53243951856A475002ED692 /* CombinedDomains.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = CombinedDomains.json; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A53243961856A475002ED692 /* InspectorBackendCommands.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = InspectorBackendCommands.js; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                A5339EC41BB399900054F005 /* InspectorHeapAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorHeapAgent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                A5339EC51BB399900054F005 /* InspectorHeapAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorHeapAgent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                A5339EC81BB4B4510054F005 /* HeapObserver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HeapObserver.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 A53CE08118BC1A5600BEDF76 /* ConsolePrototype.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConsolePrototype.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A53CE08218BC1A5600BEDF76 /* ConsolePrototype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConsolePrototype.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 A53CE08318BC1A5600BEDF76 /* JSConsole.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSConsole.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4276,6 +4282,7 @@
</span><span class="cx">                                 0F32BD0F1BB34F190093A57F /* HeapHelperPool.h */,
</span><span class="cx">                                 C2DA778218E259990066FCB6 /* HeapInlines.h */,
</span><span class="cx">                                 2AD8932917E3868F00668276 /* HeapIterationScope.h */,
</span><ins>+                                A5339EC81BB4B4510054F005 /* HeapObserver.h */,
</ins><span class="cx">                                 2A6F462517E959CE00C45C98 /* HeapOperation.h */,
</span><span class="cx">                                 14F97446138C853E00DA1C67 /* HeapRootVisitor.h */,
</span><span class="cx">                                 C24D31E0161CD695002AA4DB /* HeapStatistics.cpp */,
</span><span class="lines">@@ -5742,6 +5749,8 @@
</span><span class="cx">                                 A5FD0080189B191A00633231 /* InspectorConsoleAgent.h */,
</span><span class="cx">                                 A57D23E31890CEBF0031C7FA /* InspectorDebuggerAgent.cpp */,
</span><span class="cx">                                 A57D23E41890CEBF0031C7FA /* InspectorDebuggerAgent.h */,
</span><ins>+                                A5339EC41BB399900054F005 /* InspectorHeapAgent.cpp */,
+                                A5339EC51BB399900054F005 /* InspectorHeapAgent.h */,
</ins><span class="cx">                                 A50E4B5D18809DD50068A46D /* InspectorRuntimeAgent.cpp */,
</span><span class="cx">                                 A50E4B5E18809DD50068A46D /* InspectorRuntimeAgent.h */,
</span><span class="cx">                                 A5FD0083189B1B7E00633231 /* JSGlobalObjectConsoleAgent.cpp */,
</span><span class="lines">@@ -6420,6 +6429,7 @@
</span><span class="cx">                                 14BA7A9813AADFF8005B7C2C /* Heap.h in Headers */,
</span><span class="cx">                                 C2DA778318E259990066FCB6 /* HeapInlines.h in Headers */,
</span><span class="cx">                                 2AD8932B17E3868F00668276 /* HeapIterationScope.h in Headers */,
</span><ins>+                                A5339EC91BB4B4600054F005 /* HeapObserver.h in Headers */,
</ins><span class="cx">                                 2A6F462617E959CE00C45C98 /* HeapOperation.h in Headers */,
</span><span class="cx">                                 14F97447138C853E00DA1C67 /* HeapRootVisitor.h in Headers */,
</span><span class="cx">                                 C24D31E3161CD695002AA4DB /* HeapStatistics.h in Headers */,
</span><span class="lines">@@ -6462,6 +6472,7 @@
</span><span class="cx">                                 A5945595182479EB00CC3843 /* InspectorFrontendChannel.h in Headers */,
</span><span class="cx">                                 A532438A18568335002ED692 /* InspectorFrontendDispatchers.h in Headers */,
</span><span class="cx">                                 99F1A7011B98FBEC00463B26 /* InspectorFrontendRouter.h in Headers */,
</span><ins>+                                A5339EC61BB399A60054F005 /* InspectorHeapAgent.h in Headers */,
</ins><span class="cx">                                 E35E03601B7AB43E0073AD2A /* InspectorInstrumentationObject.h in Headers */,
</span><span class="cx">                                 E33B3E261B7ABD750048DB2E /* InspectorInstrumentationObject.lut.h in Headers */,
</span><span class="cx">                                 A532438C18568335002ED692 /* InspectorProtocolObjects.h in Headers */,
</span><span class="lines">@@ -7773,6 +7784,7 @@
</span><span class="cx">                                 A57D23E51890CEBF0031C7FA /* InspectorDebuggerAgent.cpp in Sources */,
</span><span class="cx">                                 A532438918568335002ED692 /* InspectorFrontendDispatchers.cpp in Sources */,
</span><span class="cx">                                 99F1A6FE1B8E6D9400463B26 /* InspectorFrontendRouter.cpp in Sources */,
</span><ins>+                                A5339EC71BB399A90054F005 /* InspectorHeapAgent.cpp in Sources */,
</ins><span class="cx">                                 E35E035F1B7AB43E0073AD2A /* InspectorInstrumentationObject.cpp in Sources */,
</span><span class="cx">                                 A532438B18568335002ED692 /* InspectorProtocolObjects.cpp in Sources */,
</span><span class="cx">                                 A50E4B6118809DD50068A46D /* InspectorRuntimeAgent.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.cpp (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.cpp        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/heap/Heap.cpp        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -38,10 +38,10 @@
</span><span class="cx"> #include &quot;HeapVerifier.h&quot;
</span><span class="cx"> #include &quot;IncrementalSweeper.h&quot;
</span><span class="cx"> #include &quot;Interpreter.h&quot;
</span><ins>+#include &quot;JSCInlines.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSLock.h&quot;
</span><span class="cx"> #include &quot;JSONObject.h&quot;
</span><del>-#include &quot;JSCInlines.h&quot;
</del><span class="cx"> #include &quot;JSVirtualMachineInternal.h&quot;
</span><span class="cx"> #include &quot;RecursiveAllocationScope.h&quot;
</span><span class="cx"> #include &quot;RegExpCache.h&quot;
</span><span class="lines">@@ -51,13 +51,12 @@
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="cx"> #include &quot;WeakSetInlines.h&quot;
</span><span class="cx"> #include &lt;algorithm&gt;
</span><del>-#include &lt;wtf/RAMSize.h&gt;
</del><span class="cx"> #include &lt;wtf/CurrentTime.h&gt;
</span><span class="cx"> #include &lt;wtf/ParallelVectorIterator.h&gt;
</span><span class="cx"> #include &lt;wtf/ProcessID.h&gt;
</span><ins>+#include &lt;wtf/RAMSize.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace std;
</span><del>-using namespace JSC;
</del><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -1173,6 +1172,9 @@
</span><span class="cx"> 
</span><span class="cx">     if (m_edenActivityCallback)
</span><span class="cx">         m_edenActivityCallback-&gt;willCollect();
</span><ins>+
+    for (auto* observer : m_observers)
+        observer-&gt;willGarbageCollect();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::flushOldStructureIDTables()
</span><span class="lines">@@ -1321,6 +1323,7 @@
</span><span class="cx"> {
</span><span class="cx">     GCPHASE(FinishingCollection);
</span><span class="cx">     double gcEndTime = WTF::monotonicallyIncreasingTime();
</span><ins>+    HeapOperation operation = m_operationInProgress;
</ins><span class="cx">     if (m_operationInProgress == FullCollection)
</span><span class="cx">         m_lastFullGCLength = gcEndTime - gcStartTime;
</span><span class="cx">     else
</span><span class="lines">@@ -1344,6 +1347,9 @@
</span><span class="cx">     RELEASE_ASSERT(m_operationInProgress == EdenCollection || m_operationInProgress == FullCollection);
</span><span class="cx">     m_operationInProgress = NoOperation;
</span><span class="cx">     JAVASCRIPTCORE_GC_END();
</span><ins>+
+    for (auto* observer : m_observers)
+        observer-&gt;didGarbageCollect(operation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void Heap::resumeCompilerThreads()
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeaph"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/Heap.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/Heap.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/heap/Heap.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #include &quot;GCIncomingRefCountedSet.h&quot;
</span><span class="cx"> #include &quot;HandleSet.h&quot;
</span><span class="cx"> #include &quot;HandleStack.h&quot;
</span><ins>+#include &quot;HeapObserver.h&quot;
</ins><span class="cx"> #include &quot;HeapOperation.h&quot;
</span><span class="cx"> #include &quot;JITStubRoutineSet.h&quot;
</span><span class="cx"> #include &quot;ListableHandler.h&quot;
</span><span class="lines">@@ -49,28 +50,24 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><ins>+class CodeBlock;
</ins><span class="cx"> class CopiedSpace;
</span><del>-class CodeBlock;
</del><ins>+class EdenGCActivityCallback;
</ins><span class="cx"> class ExecutableBase;
</span><del>-class EdenGCActivityCallback;
</del><span class="cx"> class FullGCActivityCallback;
</span><span class="cx"> class GCActivityCallback;
</span><span class="cx"> class GCAwareJITStubRoutine;
</span><del>-class GlobalCodeBlock;
</del><span class="cx"> class Heap;
</span><span class="cx"> class HeapRootVisitor;
</span><span class="cx"> class HeapVerifier;
</span><span class="cx"> class IncrementalSweeper;
</span><span class="cx"> class JITStubRoutine;
</span><span class="cx"> class JSCell;
</span><del>-class VM;
</del><span class="cx"> class JSStack;
</span><span class="cx"> class JSValue;
</span><del>-class LiveObjectIterator;
</del><span class="cx"> class LLIntOffsetsExtractor;
</span><span class="cx"> class MarkedArgumentBuffer;
</span><del>-class WeakGCHandlePool;
-class SlotVisitor;
</del><ins>+class VM;
</ins><span class="cx"> 
</span><span class="cx"> namespace DFG {
</span><span class="cx"> class Worklist;
</span><span class="lines">@@ -133,6 +130,9 @@
</span><span class="cx">     JS_EXPORT_PRIVATE IncrementalSweeper* sweeper();
</span><span class="cx">     JS_EXPORT_PRIVATE void setIncrementalSweeper(std::unique_ptr&lt;IncrementalSweeper&gt;);
</span><span class="cx"> 
</span><ins>+    void addObserver(HeapObserver* observer) { m_observers.append(observer); }
+    void removeObserver(HeapObserver* observer) { m_observers.removeFirst(observer); }
+
</ins><span class="cx">     // true if collection is in progress
</span><span class="cx">     bool isCollecting();
</span><span class="cx">     HeapOperation operationInProgress() { return m_operationInProgress; }
</span><span class="lines">@@ -411,7 +411,9 @@
</span><span class="cx">     RefPtr&lt;GCActivityCallback&gt; m_edenActivityCallback;
</span><span class="cx">     std::unique_ptr&lt;IncrementalSweeper&gt; m_sweeper;
</span><span class="cx">     Vector&lt;MarkedBlock*&gt; m_blockSnapshot;
</span><del>-    
</del><ins>+
+    Vector&lt;HeapObserver*&gt; m_observers;
+
</ins><span class="cx">     unsigned m_deferralDepth;
</span><span class="cx">     Vector&lt;DFG::Worklist*&gt; m_suspendedCompilerWorklists;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapHeapObserverhfromrev190519trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs"></a>
<div class="copfile"><h4>Copied: trunk/Source/JavaScriptCore/heap/HeapObserver.h (from rev 190519, trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js) (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/HeapObserver.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/heap/HeapObserver.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,42 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef HeapObserver_h
+#define HeapObserver_h
+
+#include &quot;HeapOperation.h&quot;
+
+namespace JSC {
+
+class HeapObserver {
+public:
+    virtual ~HeapObserver() { }
+    virtual void willGarbageCollect() = 0;
+    virtual void didGarbageCollect(HeapOperation) = 0;
+};
+
+} // namespace JSC
+
+#endif // HeapObserver_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreheapMarkedSpaceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/heap/MarkedSpace.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/heap/MarkedSpace.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -39,7 +39,6 @@
</span><span class="cx"> class Heap;
</span><span class="cx"> class HeapIterationScope;
</span><span class="cx"> class JSCell;
</span><del>-class LiveObjectIterator;
</del><span class="cx"> class LLIntOffsetsExtractor;
</span><span class="cx"> class WeakGCHandle;
</span><span class="cx"> class SlotVisitor;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorInspectorEnvironmenth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/inspector/InspectorEnvironment.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> namespace JSC {
</span><span class="cx"> class Exception;
</span><span class="cx"> class SourceCode;
</span><ins>+class VM;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace Inspector {
</span><span class="lines">@@ -53,6 +54,7 @@
</span><span class="cx">     virtual void didCallInjectedScriptFunction(JSC::ExecState*) = 0;
</span><span class="cx">     virtual void frontendInitialized() = 0;
</span><span class="cx">     virtual Ref&lt;WTF::Stopwatch&gt; executionStopwatch() = 0;
</span><ins>+    virtual JSC::VM&amp; vm() = 0;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace Inspector
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.cpp        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;InspectorBackendDispatcher.h&quot;
</span><span class="cx"> #include &quot;InspectorFrontendChannel.h&quot;
</span><span class="cx"> #include &quot;InspectorFrontendRouter.h&quot;
</span><ins>+#include &quot;InspectorHeapAgent.h&quot;
</ins><span class="cx"> #include &quot;JSGlobalObject.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectConsoleAgent.h&quot;
</span><span class="cx"> #include &quot;JSGlobalObjectConsoleClient.h&quot;
</span><span class="lines">@@ -62,13 +63,11 @@
</span><span class="cx"> namespace Inspector {
</span><span class="cx"> 
</span><span class="cx"> JSGlobalObjectInspectorController::JSGlobalObjectInspectorController(JSGlobalObject&amp; globalObject)
</span><del>-    : m_injectedScriptManager(std::make_unique&lt;InjectedScriptManager&gt;(*this, InjectedScriptHost::create()))
</del><ins>+    : m_globalObject(globalObject)
+    , m_injectedScriptManager(std::make_unique&lt;InjectedScriptManager&gt;(*this, InjectedScriptHost::create()))
</ins><span class="cx">     , m_executionStopwatch(Stopwatch::create())
</span><span class="cx">     , m_frontendRouter(FrontendRouter::create())
</span><span class="cx">     , m_backendDispatcher(BackendDispatcher::create(m_frontendRouter.copyRef()))
</span><del>-#if ENABLE(REMOTE_INSPECTOR)
-    , m_globalObject(globalObject)
-#endif
</del><span class="cx"> {
</span><span class="cx">     AgentContext baseContext = {
</span><span class="cx">         *this,
</span><span class="lines">@@ -86,9 +85,11 @@
</span><span class="cx">     auto runtimeAgent = std::make_unique&lt;JSGlobalObjectRuntimeAgent&gt;(context);
</span><span class="cx">     auto consoleAgent = std::make_unique&lt;JSGlobalObjectConsoleAgent&gt;(context);
</span><span class="cx">     auto debuggerAgent = std::make_unique&lt;JSGlobalObjectDebuggerAgent&gt;(context, consoleAgent.get());
</span><ins>+    auto heapAgent = std::make_unique&lt;InspectorHeapAgent&gt;(context);
</ins><span class="cx"> 
</span><span class="cx">     m_inspectorAgent = inspectorAgent.get();
</span><span class="cx">     m_debuggerAgent = debuggerAgent.get();
</span><ins>+    m_heapAgent = heapAgent.get();
</ins><span class="cx">     m_consoleAgent = consoleAgent.get();
</span><span class="cx">     m_consoleClient = std::make_unique&lt;JSGlobalObjectConsoleClient&gt;(m_consoleAgent);
</span><span class="cx"> 
</span><span class="lines">@@ -98,6 +99,7 @@
</span><span class="cx">     m_agents.append(WTF::move(runtimeAgent));
</span><span class="cx">     m_agents.append(WTF::move(consoleAgent));
</span><span class="cx">     m_agents.append(WTF::move(debuggerAgent));
</span><ins>+    m_agents.append(WTF::move(heapAgent));
</ins><span class="cx"> 
</span><span class="cx">     m_executionStopwatch-&gt;start();
</span><span class="cx"> }
</span><span class="lines">@@ -283,6 +285,11 @@
</span><span class="cx">     return m_executionStopwatch.copyRef();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+VM&amp; JSGlobalObjectInspectorController::vm()
+{
+    return m_globalObject.vm();
+}
+
</ins><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx"> void JSGlobalObjectInspectorController::appendExtraAgent(std::unique_ptr&lt;InspectorAgentBase&gt; agent)
</span><span class="cx"> {
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorJSGlobalObjectInspectorControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/JavaScriptCore/inspector/JSGlobalObjectInspectorController.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -41,7 +41,6 @@
</span><span class="cx"> class Stopwatch;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-
</del><span class="cx"> namespace JSC {
</span><span class="cx"> class ConsoleClient;
</span><span class="cx"> class Exception;
</span><span class="lines">@@ -58,6 +57,7 @@
</span><span class="cx"> class InspectorAgent;
</span><span class="cx"> class InspectorConsoleAgent;
</span><span class="cx"> class InspectorDebuggerAgent;
</span><ins>+class InspectorHeapAgent;
</ins><span class="cx"> class JSGlobalObjectConsoleClient;
</span><span class="cx"> class ScriptCallStack;
</span><span class="cx"> 
</span><span class="lines">@@ -97,6 +97,7 @@
</span><span class="cx">     virtual void didCallInjectedScriptFunction(JSC::ExecState*) override { }
</span><span class="cx">     virtual void frontendInitialized() override;
</span><span class="cx">     virtual Ref&lt;WTF::Stopwatch&gt; executionStopwatch() override;
</span><ins>+    virtual JSC::VM&amp; vm() override;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx">     virtual AugmentableInspectorControllerClient* augmentableInspectorControllerClient() const override { return m_augmentingClient; } 
</span><span class="lines">@@ -110,6 +111,7 @@
</span><span class="cx"> private:
</span><span class="cx">     void appendAPIBacktrace(ScriptCallStack* callStack);
</span><span class="cx"> 
</span><ins>+    JSC::JSGlobalObject&amp; m_globalObject;
</ins><span class="cx">     std::unique_ptr&lt;InjectedScriptManager&gt; m_injectedScriptManager;
</span><span class="cx">     std::unique_ptr&lt;JSGlobalObjectConsoleClient&gt; m_consoleClient;
</span><span class="cx">     Ref&lt;WTF::Stopwatch&gt; m_executionStopwatch;
</span><span class="lines">@@ -118,6 +120,7 @@
</span><span class="cx">     InspectorAgent* m_inspectorAgent { nullptr };
</span><span class="cx">     InspectorConsoleAgent* m_consoleAgent { nullptr };
</span><span class="cx">     InspectorDebuggerAgent* m_debuggerAgent { nullptr };
</span><ins>+    InspectorHeapAgent* m_heapAgent { nullptr };
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;FrontendRouter&gt; m_frontendRouter;
</span><span class="cx">     Ref&lt;BackendDispatcher&gt; m_backendDispatcher;
</span><span class="lines">@@ -125,10 +128,6 @@
</span><span class="cx">     bool m_includeNativeCallStackWithExceptions { false };
</span><span class="cx">     bool m_isAutomaticInspection { false };
</span><span class="cx"> 
</span><del>-#if ENABLE(REMOTE_INSPECTOR)
-    JSC::JSGlobalObject&amp; m_globalObject;
-#endif
-
</del><span class="cx"> #if ENABLE(INSPECTOR_ALTERNATE_DISPATCHERS)
</span><span class="cx">     AugmentableInspectorControllerClient* m_augmentingClient { nullptr };
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorHeapAgentcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.cpp (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.cpp        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,126 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;InspectorHeapAgent.h&quot;
+
+#include &quot;InspectorEnvironment.h&quot;
+#include &quot;VM.h&quot;
+#include &lt;wtf/Stopwatch.h&gt;
+
+using namespace JSC;
+
+namespace Inspector {
+
+InspectorHeapAgent::InspectorHeapAgent(AgentContext&amp; context)
+    : InspectorAgentBase(ASCIILiteral(&quot;Heap&quot;))
+    , m_frontendDispatcher(std::make_unique&lt;HeapFrontendDispatcher&gt;(context.frontendRouter))
+    , m_backendDispatcher(HeapBackendDispatcher::create(context.backendDispatcher, this))
+    , m_environment(context.environment)
+{
+}
+
+InspectorHeapAgent::~InspectorHeapAgent()
+{
+    ErrorString ignored;
+    disable(ignored);
+}
+
+void InspectorHeapAgent::didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*)
+{
+}
+
+void InspectorHeapAgent::willDestroyFrontendAndBackend(DisconnectReason)
+{
+}
+
+void InspectorHeapAgent::enable(ErrorString&amp;)
+{
+    if (m_enabled)
+        return;
+
+    m_enabled = true;
+
+    m_environment.vm().heap.addObserver(this);
+}
+
+void InspectorHeapAgent::disable(ErrorString&amp;)
+{
+    if (!m_enabled)
+        return;
+
+    m_enabled = false;
+
+    m_environment.vm().heap.removeObserver(this);
+}
+
+void InspectorHeapAgent::gc(ErrorString&amp;)
+{
+    VM&amp; vm = m_environment.vm();
+    JSLockHolder lock(vm);
+    sanitizeStackForVM(&amp;vm);
+    vm.heap.collectAllGarbage();
+}
+
+static Inspector::Protocol::Heap::GarbageCollection::Type protocolTypeForHeapOperation(HeapOperation operation)
+{
+    switch (operation) {
+    case FullCollection:
+        return Inspector::Protocol::Heap::GarbageCollection::Type::Full;
+    case EdenCollection:
+        return Inspector::Protocol::Heap::GarbageCollection::Type::Partial;
+    default:
+        ASSERT_NOT_REACHED();
+        return Inspector::Protocol::Heap::GarbageCollection::Type::Full;
+    }
+}
+
+void InspectorHeapAgent::willGarbageCollect()
+{
+    ASSERT(m_enabled);
+    ASSERT(std::isnan(m_gcStartTime));
+
+    m_gcStartTime = m_environment.executionStopwatch()-&gt;elapsedTime();
+}
+
+void InspectorHeapAgent::didGarbageCollect(HeapOperation operation)
+{
+    ASSERT(m_enabled);
+    ASSERT(!std::isnan(m_gcStartTime));
+
+    // FIXME: Include number of bytes freed by collection.
+
+    double endTime = m_environment.executionStopwatch()-&gt;elapsedTime();
+    auto collection = Inspector::Protocol::Heap::GarbageCollection::create()
+        .setType(protocolTypeForHeapOperation(operation))
+        .setStartTime(m_gcStartTime)
+        .setEndTime(endTime)
+        .release();
+
+    m_frontendDispatcher-&gt;garbageCollected(WTF::move(collection));
+    m_gcStartTime = NAN;
+}
+
+} // namespace Inspector
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectoragentsInspectorHeapAgenth"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.h (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/agents/InspectorHeapAgent.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef InspectorHeapAgent_h
+#define InspectorHeapAgent_h
+
+#include &quot;InspectorBackendDispatchers.h&quot;
+#include &quot;InspectorFrontendDispatchers.h&quot;
+#include &quot;heap/HeapObserver.h&quot;
+#include &quot;inspector/InspectorAgentBase.h&quot;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/Noncopyable.h&gt;
+
+namespace Inspector {
+
+typedef String ErrorString;
+
+class JS_EXPORT_PRIVATE InspectorHeapAgent final : public InspectorAgentBase, public HeapBackendDispatcherHandler, public JSC::HeapObserver {
+    WTF_MAKE_NONCOPYABLE(InspectorHeapAgent);
+public:
+    InspectorHeapAgent(AgentContext&amp;);
+    virtual ~InspectorHeapAgent();
+
+    virtual void didCreateFrontendAndBackend(FrontendRouter*, BackendDispatcher*) override;
+    virtual void willDestroyFrontendAndBackend(DisconnectReason) override;
+
+    // HeapBackendDispatcherHandler
+    virtual void enable(ErrorString&amp;) override;
+    virtual void disable(ErrorString&amp;) override;
+    virtual void gc(ErrorString&amp;) override;
+
+    // HeapObserver
+    virtual void willGarbageCollect() override;
+    virtual void didGarbageCollect(JSC::HeapOperation) override;
+
+private:
+    std::unique_ptr&lt;HeapFrontendDispatcher&gt; m_frontendDispatcher;
+    RefPtr&lt;HeapBackendDispatcher&gt; m_backendDispatcher;
+    InspectorEnvironment&amp; m_environment;
+    bool m_enabled { false };
+    double m_gcStartTime { NAN };
+};
+
+} // namespace Inspector
+
+#endif // InspectorHeapAgent_h
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCoreinspectorprotocolHeapjson"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/inspector/protocol/Heap.json (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/inspector/protocol/Heap.json                                (rev 0)
+++ trunk/Source/JavaScriptCore/inspector/protocol/Heap.json        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,39 @@
</span><ins>+{
+    &quot;domain&quot;: &quot;Heap&quot;,
+    &quot;description&quot;: &quot;Heap domain exposes JavaScript heap attributes and capabilities.&quot;,
+    &quot;types&quot;: [
+        {
+            &quot;id&quot;: &quot;GarbageCollection&quot;,
+            &quot;description&quot;: &quot;Information about a garbage collection.&quot;,
+            &quot;type&quot;: &quot;object&quot;,
+            &quot;properties&quot;: [
+                { &quot;name&quot;: &quot;type&quot;, &quot;type&quot;: &quot;string&quot;, &quot;enum&quot;: [&quot;full&quot;, &quot;partial&quot;], &quot;description&quot;: &quot;The type of garbage collection.&quot; },
+                { &quot;name&quot;: &quot;startTime&quot;, &quot;type&quot;: &quot;number&quot; },
+                { &quot;name&quot;: &quot;endTime&quot;, &quot;type&quot;: &quot;number&quot; }
+            ]
+        }
+    ],
+    &quot;commands&quot;: [
+        {
+            &quot;name&quot;: &quot;enable&quot;,
+            &quot;description&quot;: &quot;Enables Heap domain events.&quot;
+        },
+        {
+            &quot;name&quot;: &quot;disable&quot;,
+            &quot;description&quot;: &quot;Disables Heap domain events.&quot;
+        },
+        {
+            &quot;name&quot;: &quot;gc&quot;,
+            &quot;description&quot;: &quot;Trigger a full garbage collection.&quot;
+        }
+    ],
+    &quot;events&quot;: [
+        {
+            &quot;name&quot;: &quot;garbageCollected&quot;,
+            &quot;description&quot;: &quot;Information about the garbage collection.&quot;,
+            &quot;parameters&quot;: [
+                { &quot;name&quot;: &quot;collection&quot;, &quot;type&quot;: &quot;GarbageCollection&quot; }
+            ]
+        }
+    ]
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/ChangeLog        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2015-10-02  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Include Garbage Collection Event in Timeline
+        https://bugs.webkit.org/show_bug.cgi?id=142510
+
+        Reviewed by Geoffrey Garen.
+
+        Tests: inspector/heap/garbageCollected.html
+               inspector/heap/gc.html
+
+        * ForwardingHeaders/heap/HeapObserver.h: Added.
+        * ForwardingHeaders/inspector/agents/InspectorHeapAgent.h: Added.
+        * WebCore.vcxproj/WebCore.vcxproj:
+        * WebCore.vcxproj/WebCore.vcxproj.filters:
+        Forwarding headers.
+
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::InspectorController):
+        (WebCore::InspectorController::vm):
+        * inspector/InspectorController.h:
+        * inspector/WorkerInspectorController.cpp:
+        (WebCore::WorkerInspectorController::vm):
+        * inspector/WorkerInspectorController.h:
+        Implement InspectorEnvironment::vm and create a Heap agent for the
+        Page inspector controller.
+
</ins><span class="cx"> 2015-10-02  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [MSE] Browser crashes when appending invalid data to MSE source buffer
</span></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersheapHeapObserverh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/ForwardingHeaders/heap/HeapObserver.h (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/heap/HeapObserver.h                                (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/heap/HeapObserver.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+#ifndef WebCore_FWD_HeapObserver_h
+#define WebCore_FWD_HeapObserver_h
+#include &lt;JavaScriptCore/HeapObserver.h&gt;
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreForwardingHeadersinspectoragentsInspectorHeapAgenth"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/ForwardingHeaders/inspector/agents/InspectorHeapAgent.h (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ForwardingHeaders/inspector/agents/InspectorHeapAgent.h                                (rev 0)
+++ trunk/Source/WebCore/ForwardingHeaders/inspector/agents/InspectorHeapAgent.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,4 @@
</span><ins>+#ifndef WebCore_FWD_InspectorHeapAgent_h
+#define WebCore_FWD_InspectorHeapAgent_h
+#include &lt;JavaScriptCore/InspectorHeapAgent.h&gt;
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -20355,6 +20355,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\bindings\ScriptValue.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\AllocationSpace.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\Heap.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\HeapObserver.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\SlotVisitor.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\StrongInlines.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\Weak.h&quot; /&gt;
</span><span class="lines">@@ -20384,6 +20385,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorAgent.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorConsoleAgent.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorDebuggerAgent.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorHeapAgent.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorRuntimeAgent.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\masm\X86Assembler.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\parser\SourceCode.h&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxprojfilters"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj.filters        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -11789,6 +11789,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorDebuggerAgent.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ForwardingHeaders\inspector&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorHeapAgent.h&quot;&gt;
+      &lt;Filter&gt;ForwardingHeaders\inspector&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\inspector\agents\InspectorRuntimeAgent.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ForwardingHeaders\inspector&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><span class="lines">@@ -12069,6 +12072,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\Heap.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ForwardingHeaders\heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\HeapObserver.h&quot;&gt;
+      &lt;Filter&gt;ForwardingHeaders\heap&lt;/Filter&gt;
+    &lt;/ClInclude&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\ForwardingHeaders\heap\SlotVisitor.h&quot;&gt;
</span><span class="cx">       &lt;Filter&gt;ForwardingHeaders\heap&lt;/Filter&gt;
</span><span class="cx">     &lt;/ClInclude&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorController.cpp (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorController.cpp        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/inspector/InspectorController.cpp        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -70,6 +70,7 @@
</span><span class="cx"> #include &lt;inspector/InspectorFrontendDispatchers.h&gt;
</span><span class="cx"> #include &lt;inspector/InspectorFrontendRouter.h&gt;
</span><span class="cx"> #include &lt;inspector/agents/InspectorAgent.h&gt;
</span><ins>+#include &lt;inspector/agents/InspectorHeapAgent.h&gt;
</ins><span class="cx"> #include &lt;profiler/LegacyProfiler.h&gt;
</span><span class="cx"> #include &lt;runtime/JSLock.h&gt;
</span><span class="cx"> #include &lt;wtf/Stopwatch.h&gt;
</span><span class="lines">@@ -170,6 +171,7 @@
</span><span class="cx">     m_domDebuggerAgent = domDebuggerAgentPtr.get();
</span><span class="cx">     m_agents.append(WTF::move(domDebuggerAgentPtr));
</span><span class="cx"> 
</span><ins>+    m_agents.append(std::make_unique&lt;InspectorHeapAgent&gt;(pageContext));
</ins><span class="cx">     m_agents.append(std::make_unique&lt;InspectorApplicationCacheAgent&gt;(pageContext, pageAgent));
</span><span class="cx">     m_agents.append(std::make_unique&lt;InspectorWorkerAgent&gt;(pageContext));
</span><span class="cx">     m_agents.append(std::make_unique&lt;InspectorLayerTreeAgent&gt;(pageContext));
</span><span class="lines">@@ -474,6 +476,11 @@
</span><span class="cx">     return m_executionStopwatch.copyRef();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+JSC::VM&amp; InspectorController::vm()
+{
+    return JSDOMWindowBase::commonVM();
+}
+
</ins><span class="cx"> void InspectorController::didComposite(Frame&amp; frame)
</span><span class="cx"> {
</span><span class="cx">     InspectorInstrumentation::didComposite(frame);
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorInspectorControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/InspectorController.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/InspectorController.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/inspector/InspectorController.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -131,6 +131,7 @@
</span><span class="cx">     virtual void didCallInjectedScriptFunction(JSC::ExecState*) override;
</span><span class="cx">     virtual void frontendInitialized() override;
</span><span class="cx">     virtual Ref&lt;WTF::Stopwatch&gt; executionStopwatch() override;
</span><ins>+    virtual JSC::VM&amp; vm() override;
</ins><span class="cx"> 
</span><span class="cx">     WEBCORE_EXPORT void didComposite(Frame&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerInspectorControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/WorkerInspectorController.cpp (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerInspectorController.cpp        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/inspector/WorkerInspectorController.cpp        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -36,6 +36,7 @@
</span><span class="cx"> #include &quot;InspectorInstrumentation.h&quot;
</span><span class="cx"> #include &quot;InspectorTimelineAgent.h&quot;
</span><span class="cx"> #include &quot;InstrumentingAgents.h&quot;
</span><ins>+#include &quot;JSDOMWindowBase.h&quot;
</ins><span class="cx"> #include &quot;JSMainThreadExecState.h&quot;
</span><span class="cx"> #include &quot;WebInjectedScriptHost.h&quot;
</span><span class="cx"> #include &quot;WebInjectedScriptManager.h&quot;
</span><span class="lines">@@ -51,6 +52,7 @@
</span><span class="cx"> #include &lt;inspector/InspectorFrontendRouter.h&gt;
</span><span class="cx"> #include &lt;wtf/Stopwatch.h&gt;
</span><span class="cx"> 
</span><ins>+using namespace JSC;
</ins><span class="cx"> using namespace Inspector;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -195,4 +197,9 @@
</span><span class="cx">     return m_executionStopwatch.copyRef();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+VM&amp; WorkerInspectorController::vm()
+{
+    return JSDOMWindowBase::commonVM();
+}
+
</ins><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoreinspectorWorkerInspectorControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/inspector/WorkerInspectorController.h (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/inspector/WorkerInspectorController.h        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebCore/inspector/WorkerInspectorController.h        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -75,6 +75,7 @@
</span><span class="cx">     virtual void didCallInjectedScriptFunction(JSC::ExecState*) override;
</span><span class="cx">     virtual void frontendInitialized() override { }
</span><span class="cx">     virtual Ref&lt;WTF::Stopwatch&gt; executionStopwatch() override;
</span><ins>+    virtual JSC::VM&amp; vm() override;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     friend class InspectorInstrumentation;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/ChangeLog (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/ChangeLog        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/ChangeLog        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -1,3 +1,80 @@
</span><ins>+2015-10-02  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
+
+        Web Inspector: Include Garbage Collection Event in Timeline
+        https://bugs.webkit.org/show_bug.cgi?id=142510
+
+        Reviewed by Geoffrey Garen.
+
+        * UserInterface/Base/Utilities.js:
+        (Array.prototype.parition):
+        Helper to partition an Array into two arrays.
+
+        * UserInterface/Main.html:
+        * Localizations/en.lproj/localizedStrings.js:
+        * UserInterface/Base/Main.js:
+        (WebInspector.loaded):
+        * UserInterface/Test.html:
+        * UserInterface/Test/Test.js:
+        (WebInspector.loaded):
+        * UserInterface/Protocol/HeapObserver.js:
+        (WebInspector.HeapObserver.prototype.garbageCollected):
+        (WebInspector.HeapObserver):
+        Create the new observer and manager.
+
+        * UserInterface/Models/GarbageCollection.js:
+        (WebInspector.GarbageCollection):
+        (WebInspector.GarbageCollection.fromPayload):
+        (WebInspector.GarbageCollection.prototype.get type):
+        (WebInspector.GarbageCollection.prototype.get startTime):
+        (WebInspector.GarbageCollection.prototype.get endTime):
+        (WebInspector.GarbageCollection.prototype.get duration):
+        Model object for Heap.GarbageCollection.
+
+        * UserInterface/Controllers/HeapManager.js:
+        (WebInspector.HeapManager):
+        (WebInspector.HeapManager.prototype.garbageCollected):
+        Dispatch events with.
+
+        * UserInterface/Controllers/TimelineManager.js:
+        (WebInspector.TimelineManager):
+        (WebInspector.TimelineManager.prototype._garbageCollected):
+        Include new GC Timeline Events as Script events.
+
+        * UserInterface/Views/ScriptTimelineOverviewGraph.js:
+        (WebInspector.ScriptTimelineOverviewGraph.prototype.updateLayout):
+        For the Script overview, make two sets of bars, one for Scripts and one for GCs.
+        The GCs bar will be on top of the the Scripts bar. This is particularly useful
+        since a GC can happen during script execution.
+
+        * UserInterface/Views/ScriptTimelineDataGridNode.js:
+        (WebInspector.ScriptTimelineDataGridNode.prototype.get data):
+        (WebInspector.ScriptTimelineDataGridNode.prototype.createCellContent):
+        (WebInspector.ScriptTimelineDataGridNode):
+        Give a NaN call count to top level Script DataGridNodes.
+        In the UI, display the empty placeholder for NaN call counts.
+
+        * UserInterface/Images/TimelineRecordGarbageCollection.svg: Added.
+        * UserInterface/Models/ScriptTimelineRecord.js:
+        (WebInspector.ScriptTimelineRecord.prototype.isGarbageCollection):
+        (WebInspector.ScriptTimelineRecord.EventType.displayName):
+        * UserInterface/Views/ScriptTimelineView.js:
+        (WebInspector.ScriptTimelineView.prototype._processPendingRecords):
+        * UserInterface/Views/SourceCodeTimelineTreeElement.js:
+        (WebInspector.SourceCodeTimelineTreeElement):
+        * UserInterface/Views/TimelineIcons.css:
+        (.garbage-collection-profile-record .icon):
+        * UserInterface/Views/TimelineRecordBar.css:
+        (.timeline-record-bar.timeline-record-type-script.script-timeline-record-garbage-collected &gt; .segment):
+        UI for GC events.
+
+        * UserInterface/Views/TimelineRecordBar.js:
+        (WebInspector.TimelineRecordBar.createCombinedBars):
+        Simplify by storing start time into a variable.
+
+        * UserInterface/Views/TimelineRecordTreeElement.js:
+        (WebInspector.TimelineRecordTreeElement):
+        Icon for GC events.
+
</ins><span class="cx"> 2015-10-02  Nikita Vasilyev  &lt;nvasilyev@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Fix indentation of console message parameters
</span></span></pre></div>
<a id="trunkSourceWebInspectorUILocalizationsenlprojlocalizedStringsjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/Localizations/en.lproj/localizedStrings.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -291,9 +291,11 @@
</span><span class="cx"> localizedStrings[&quot;Frames&quot;] = &quot;Frames&quot;;
</span><span class="cx"> localizedStrings[&quot;Frames: %d   %d (%s   %s)&quot;] = &quot;Frames: %d   %d (%s   %s)&quot;;
</span><span class="cx"> localizedStrings[&quot;Frames: None Selected&quot;] = &quot;Frames: None Selected&quot;;
</span><ins>+localizedStrings[&quot;Full Garbage Collection&quot;] = &quot;Full Garbage Collection&quot;;
</ins><span class="cx"> localizedStrings[&quot;Full URL&quot;] = &quot;Full URL&quot;;
</span><span class="cx"> localizedStrings[&quot;Function&quot;] = &quot;Function&quot;;
</span><span class="cx"> localizedStrings[&quot;Function Name Variable&quot;] = &quot;Function Name Variable&quot;;
</span><ins>+localizedStrings[&quot;Garbage Collection&quot;] = &quot;Garbage Collection&quot;;
</ins><span class="cx"> localizedStrings[&quot;Getter&quot;] = &quot;Getter&quot;;
</span><span class="cx"> localizedStrings[&quot;Global Breakpoints&quot;] = &quot;Global Breakpoints&quot;;
</span><span class="cx"> localizedStrings[&quot;Global Variables&quot;] = &quot;Global Variables&quot;;
</span><span class="lines">@@ -433,6 +435,7 @@
</span><span class="cx"> localizedStrings[&quot;Paint&quot;] = &quot;Paint&quot;;
</span><span class="cx"> localizedStrings[&quot;Paints&quot;] = &quot;Paints&quot;;
</span><span class="cx"> localizedStrings[&quot;Parent&quot;] = &quot;Parent&quot;;
</span><ins>+localizedStrings[&quot;Partial Garbage Collection&quot;] = &quot;Partial Garbage Collection&quot;;
</ins><span class="cx"> localizedStrings[&quot;Path&quot;] = &quot;Path&quot;;
</span><span class="cx"> localizedStrings[&quot;Pause Playback&quot;] = &quot;Pause Playback&quot;;
</span><span class="cx"> localizedStrings[&quot;Pause Reason&quot;] = &quot;Pause Reason&quot;;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Main.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Main.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Main.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -68,6 +68,8 @@
</span><span class="cx">         InspectorBackend.registerDOMDispatcher(new WebInspector.DOMObserver);
</span><span class="cx">     if (InspectorBackend.registerDebuggerDispatcher)
</span><span class="cx">         InspectorBackend.registerDebuggerDispatcher(new WebInspector.DebuggerObserver);
</span><ins>+    if (InspectorBackend.registerHeapDispatcher)
+        InspectorBackend.registerHeapDispatcher(new WebInspector.HeapObserver);
</ins><span class="cx">     if (InspectorBackend.registerDatabaseDispatcher)
</span><span class="cx">         InspectorBackend.registerDatabaseDispatcher(new WebInspector.DatabaseObserver);
</span><span class="cx">     if (InspectorBackend.registerDOMStorageDispatcher)
</span><span class="lines">@@ -108,6 +110,7 @@
</span><span class="cx">     this.issueManager = new WebInspector.IssueManager;
</span><span class="cx">     this.analyzerManager = new WebInspector.AnalyzerManager;
</span><span class="cx">     this.runtimeManager = new WebInspector.RuntimeManager;
</span><ins>+    this.heapManager = new WebInspector.HeapManager;
</ins><span class="cx">     this.applicationCacheManager = new WebInspector.ApplicationCacheManager;
</span><span class="cx">     this.timelineManager = new WebInspector.TimelineManager;
</span><span class="cx">     this.debuggerManager = new WebInspector.DebuggerManager;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceBaseUtilitiesjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Base/Utilities.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -452,6 +452,23 @@
</span><span class="cx">     }
</span><span class="cx"> });
</span><span class="cx"> 
</span><ins>+Object.defineProperty(Array.prototype, &quot;partition&quot;,
+{
+    value: function(callback)
+    {
+        let positive = [];
+        let negative = [];
+        for (let i = 0; i &lt; this.length; ++i) {
+            let value = this[i];
+            if (callback(value))
+                positive.push(value);
+            else
+                negative.push(value);
+        }
+        return [positive, negative];
+    }
+});
+
</ins><span class="cx"> Object.defineProperty(String.prototype, &quot;trimMiddle&quot;,
</span><span class="cx"> {
</span><span class="cx">     value: function(maxLength)
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersHeapManagerjsfromrev190519trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebInspectorUI/UserInterface/Controllers/HeapManager.js (from rev 190519, trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js) (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/HeapManager.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/HeapManager.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.HeapManager = class HeapManager extends WebInspector.Object
+{
+    constructor()
+    {
+        super();
+
+        if (window.HeapAgent)
+            HeapAgent.enable();
+    }
+
+    // Public
+
+    garbageCollected(payload)
+    {
+        // Called from WebInspector.HeapObserver.
+
+        let collection = WebInspector.GarbageCollection.fromPayload(payload);
+        this.dispatchEventToListeners(WebInspector.HeapManager.Event.GarbageCollected, {collection});
+    }
+};
+
+WebInspector.HeapManager.Event = {
+    GarbageCollected: &quot;heap-manager-garbage-collected&quot;
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceControllersTimelineManagerjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/TimelineManager.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -33,6 +33,8 @@
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.MainResourceDidChange, this._mainResourceDidChange, this);
</span><span class="cx">         WebInspector.Frame.addEventListener(WebInspector.Frame.Event.ResourceWasAdded, this._resourceWasAdded, this);
</span><span class="cx"> 
</span><ins>+        WebInspector.heapManager.addEventListener(WebInspector.HeapManager.Event.GarbageCollected, this._garbageCollected, this);
+
</ins><span class="cx">         this._persistentNetworkTimeline = new WebInspector.NetworkTimeline;
</span><span class="cx"> 
</span><span class="cx">         this._isCapturing = false;
</span><span class="lines">@@ -593,6 +595,15 @@
</span><span class="cx"> 
</span><span class="cx">         this._addRecord(record);
</span><span class="cx">     }
</span><ins>+
+    _garbageCollected(event)
+    {
+        if (!this._isCapturing)
+            return;
+
+        let collection = event.data.collection;
+        this._addRecord(new WebInspector.ScriptTimelineRecord(WebInspector.ScriptTimelineRecord.EventType.GarbageCollected, collection.startTime, collection.endTime, null, null, collection));
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> WebInspector.TimelineManager.Event = {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceImagesTimelineRecordGarbageCollectionsvg"></a>
<div class="addfile"><h4>Added: trunk/Source/WebInspectorUI/UserInterface/Images/TimelineRecordGarbageCollection.svg (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Images/TimelineRecordGarbageCollection.svg                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Images/TimelineRecordGarbageCollection.svg        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,8 @@
</span><ins>+&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
+&lt;!-- Copyright Ā© 2015 Apple Inc. All rights reserved. --&gt;
+&lt;svg version=&quot;1.1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 16 16&quot;&gt;
+    &lt;path fill=&quot;rgb(228, 198, 172)&quot; d=&quot;M 13 1 L 3 1 C 1.898438 1 1 1.898438 1 3 L 1 13 C 1 14.101562 1.898438 15 3 15 L 13 15 C 14.101562 15 15 14.101562 15 13 L 15 3 C 15 1.898438 14.101562 1 13 1 Z&quot;/&gt;
+    &lt;path fill=&quot;rgb(186, 157, 132)&quot; d=&quot;M 13 1 L 3 1 C 1.898438 1 1 1.898438 1 3 L 1 13 C 1 14.101562 1.898438 15 3 15 L 13 15 C 14.101562 15 15 14.101562 15 13 L 15 3 C 15 1.898438 14.101562 1 13 1 M 13 2 C 13.550781 2 14 2.449219 14 3 L 14 13 C 14 13.550781 13.550781 14 13 14 L 3 14 C 2.449219 14 2 13.550781 2 13 L 2 3 C 2 2.449219 2.449219 2 3 2 L 13 2&quot;/&gt;
+    &lt;path fill=&quot;rgb(186, 157, 132)&quot; d=&quot;M 4.773438 11.542969 C 3.855469 10.621094 3.390625 9.347656 3.390625 7.769531 C 3.390625 6.15625 3.863281 4.878906 4.789062 3.964844 C 5.710938 3.054688 7.003906 2.59375 8.625 2.59375 C 9.570312 2.59375 10.519531 2.707031 11.441406 2.929688 C 11.890625 3.035156 12.210938 3.4375 12.210938 3.902344 L 12.210938 5.195312 C 12.210938 5.519531 12.050781 5.824219 11.789062 6.011719 C 11.613281 6.132812 11.410156 6.195312 11.207031 6.195312 C 11.097656 6.195312 10.984375 6.179688 10.878906 6.140625 C 10.015625 5.835938 9.308594 5.683594 8.769531 5.683594 C 8.058594 5.683594 7.753906 5.941406 7.589844 6.132812 C 7.296875 6.476562 7.148438 7.019531 7.148438 7.746094 C 7.148438 8.445312 7.308594 8.972656 7.621094 9.320312 C 7.808594 9.523438 8.148438 9.796875 8.921875 9.796875 C 9.542969 9.796875 10.1875 9.632812 10.839844 9.308594 C 10.980469 9.242188 11.132812 9.207031 11.285156 9.207031 C 11.46875 9.207031 11.648438 9.257812 1
 1.8125 9.359375 C 12.105469 9.539062 12.285156 9.859375 12.285156 10.207031 L 12.285156 11.425781 C 12.285156 11.820312 12.050781 12.179688 11.691406 12.339844 C 10.792969 12.738281 9.730469 12.941406 8.527344 12.941406 C 6.957031 12.941406 5.691406 12.472656 4.773438 11.542969&quot;/&gt;
+    &lt;path fill=&quot;white&quot; d=&quot;M 11.285156 11.425781 C 10.515625 11.769531 9.597656 11.941406 8.527344 11.941406 C 7.226562 11.941406 6.210938 11.574219 5.484375 10.839844 C 4.757812 10.105469 4.394531 9.082031 4.394531 7.769531 C 4.394531 6.429688 4.757812 5.398438 5.492188 4.675781 C 6.222656 3.957031 7.269531 3.59375 8.625 3.59375 C 9.492188 3.59375 10.351562 3.695312 11.210938 3.902344 L 11.210938 5.195312 C 10.238281 4.855469 9.425781 4.683594 8.769531 4.683594 C 7.933594 4.683594 7.285156 4.949219 6.832031 5.484375 C 6.375 6.015625 6.148438 6.769531 6.148438 7.746094 C 6.148438 8.707031 6.394531 9.453125 6.882812 9.992188 C 7.371094 10.527344 8.050781 10.796875 8.921875 10.796875 C 9.703125 10.796875 10.488281 10.601562 11.285156 10.207031 Z&quot;/&gt;
+&lt;/svg&gt;
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceMainhtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Main.html (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Main.html        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Main.html        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -226,6 +226,7 @@
</span><span class="cx">     &lt;script src=&quot;Protocol/DOMStorageObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/DatabaseObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/DebuggerObserver.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Protocol/HeapObserver.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Protocol/InspectorBackend.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/InspectorFrontendAPI.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/InspectorObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -279,6 +280,7 @@
</span><span class="cx">     &lt;script src=&quot;Models/ExecutionContext.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ExecutionContextList.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/Frame.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Models/GarbageCollection.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Models/Geometry.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/Gradient.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/IndexedDatabase.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -599,6 +601,7 @@
</span><span class="cx">     &lt;script src=&quot;Controllers/FormatterContentBuilder.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/FormatterSourceMap.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/FrameResourceManager.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Controllers/HeapManager.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Controllers/IssueManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/JavaScriptLogViewController.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/JavaScriptRuntimeCompletionProvider.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsGarbageCollectionjsfromrev190519trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebInspectorUI/UserInterface/Models/GarbageCollection.js (from rev 190519, trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js) (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/GarbageCollection.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/GarbageCollection.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,76 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.GarbageCollection = class GarbageCollection extends WebInspector.Object
+{
+    constructor(type, startTime, endTime)
+    {
+        super();
+
+        console.assert(endTime &gt; startTime);
+
+        this._type = type;
+        this._startTime = startTime;
+        this._endTime = endTime;
+    }
+
+    // Static
+
+    static fromPayload(payload)
+    {
+        let type = WebInspector.GarbageCollection.Type.Full;
+        if (payload.type === HeapAgent.GarbageCollectionType.Partial)
+            type = WebInspector.GarbageCollection.Type.Partial;
+
+        return new WebInspector.GarbageCollection(type, payload.startTime, payload.endTime);
+    }
+
+    // Public
+
+    get type()
+    {
+        return this._type;
+    }
+
+    get startTime()
+    {
+        return this._startTime;
+    }
+
+    get endTime()
+    {
+        return this._endTime;
+    }
+
+    get duration()
+    {
+        return this._endTime - this._startTime;
+    }
+};
+
+WebInspector.GarbageCollection.Type = {
+    Partial: Symbol(&quot;Partial&quot;),
+    Full: Symbol(&quot;Full&quot;)
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceModelsScriptTimelineRecordjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/ScriptTimelineRecord.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -58,6 +58,11 @@
</span><span class="cx">         return this._profile;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    isGarbageCollection()
+    {
+        return this._eventType === WebInspector.ScriptTimelineRecord.EventType.GarbageCollected;
+    }
+
</ins><span class="cx">     saveIdentityToCookie(cookie)
</span><span class="cx">     {
</span><span class="cx">         super.saveIdentityToCookie(cookie);
</span><span class="lines">@@ -158,10 +163,11 @@
</span><span class="cx">     AnimationFrameFired: &quot;script-timeline-record-animation-frame-fired&quot;,
</span><span class="cx">     AnimationFrameRequested: &quot;script-timeline-record-animation-frame-requested&quot;,
</span><span class="cx">     AnimationFrameCanceled: &quot;script-timeline-record-animation-frame-canceled&quot;,
</span><del>-    ConsoleProfileRecorded: &quot;script-timeline-record-console-profile-recorded&quot;
</del><ins>+    ConsoleProfileRecorded: &quot;script-timeline-record-console-profile-recorded&quot;,
+    GarbageCollected: &quot;script-timeline-record-garbage-collected&quot;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-WebInspector.ScriptTimelineRecord.EventType.displayName = function(eventType, details, includeTimerIdentifierInMainTitle)
</del><ins>+WebInspector.ScriptTimelineRecord.EventType.displayName = function(eventType, details, includeDetailsInformationInMainTitle)
</ins><span class="cx"> {
</span><span class="cx">     if (details &amp;&amp; !WebInspector.ScriptTimelineRecord._eventDisplayNames) {
</span><span class="cx">         // These display names are not localized because they closely represent
</span><span class="lines">@@ -335,16 +341,27 @@
</span><span class="cx">         if (details &amp;&amp; (details instanceof String || typeof details === &quot;string&quot;))
</span><span class="cx">             return WebInspector.UIString(&quot;ā€œ%sā€ Profile Recorded&quot;).format(details);
</span><span class="cx">         return WebInspector.UIString(&quot;Console Profile Recorded&quot;);
</span><ins>+    case WebInspector.ScriptTimelineRecord.EventType.GarbageCollected:
+        console.assert(details);
+        if (details &amp;&amp; (details instanceof WebInspector.GarbageCollection) &amp;&amp; includeDetailsInformationInMainTitle) {
+            switch (details.type) {
+            case WebInspector.GarbageCollection.Type.Partial:
+                return WebInspector.UIString(&quot;Partial Garbage Collection&quot;);
+            case WebInspector.GarbageCollection.Type.Full:
+                return WebInspector.UIString(&quot;Full Garbage Collection&quot;);
+            }
+        }
+        return WebInspector.UIString(&quot;Garbage Collection&quot;);
</ins><span class="cx">     case WebInspector.ScriptTimelineRecord.EventType.TimerFired:
</span><del>-        if (details &amp;&amp; includeTimerIdentifierInMainTitle)
</del><ins>+        if (details &amp;&amp; includeDetailsInformationInMainTitle)
</ins><span class="cx">             return WebInspector.UIString(&quot;Timer %s Fired&quot;).format(details);
</span><span class="cx">         return WebInspector.UIString(&quot;Timer Fired&quot;);
</span><span class="cx">     case WebInspector.ScriptTimelineRecord.EventType.TimerInstalled:
</span><del>-        if (details &amp;&amp; includeTimerIdentifierInMainTitle)
</del><ins>+        if (details &amp;&amp; includeDetailsInformationInMainTitle)
</ins><span class="cx">             return WebInspector.UIString(&quot;Timer %s Installed&quot;).format(details);
</span><span class="cx">         return WebInspector.UIString(&quot;Timer Installed&quot;);
</span><span class="cx">     case WebInspector.ScriptTimelineRecord.EventType.TimerRemoved:
</span><del>-        if (details &amp;&amp; includeTimerIdentifierInMainTitle)
</del><ins>+        if (details &amp;&amp; includeDetailsInformationInMainTitle)
</ins><span class="cx">             return WebInspector.UIString(&quot;Timer %s Removed&quot;).format(details);
</span><span class="cx">         return WebInspector.UIString(&quot;Timer Removed&quot;);
</span><span class="cx">     case WebInspector.ScriptTimelineRecord.EventType.AnimationFrameFired:
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceProtocolHeapObserverjsfromrev190519trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebInspectorUI/UserInterface/Protocol/HeapObserver.js (from rev 190519, trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js) (0 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Protocol/HeapObserver.js                                (rev 0)
+++ trunk/Source/WebInspectorUI/UserInterface/Protocol/HeapObserver.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+WebInspector.HeapObserver = class HeapObserver
+{
+    // Events defined by the &quot;Heap&quot; domain.
+
+    garbageCollected(collection)
+    {
+        WebInspector.heapManager.garbageCollected(collection);
+    }
+};
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTestTestjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test/Test.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test/Test.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Test/Test.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx">     InspectorBackend.registerDOMDispatcher(new WebInspector.DOMObserver);
</span><span class="cx">     InspectorBackend.registerNetworkDispatcher(new WebInspector.NetworkObserver);
</span><span class="cx">     InspectorBackend.registerDebuggerDispatcher(new WebInspector.DebuggerObserver);
</span><ins>+    InspectorBackend.registerHeapDispatcher(new WebInspector.HeapObserver);
</ins><span class="cx">     InspectorBackend.registerTimelineDispatcher(new WebInspector.TimelineObserver);
</span><span class="cx">     InspectorBackend.registerCSSDispatcher(new WebInspector.CSSObserver);
</span><span class="cx">     InspectorBackend.registerRuntimeDispatcher(new WebInspector.RuntimeObserver);
</span><span class="lines">@@ -54,6 +55,7 @@
</span><span class="cx">     this.logManager = new WebInspector.LogManager;
</span><span class="cx">     this.issueManager = new WebInspector.IssueManager;
</span><span class="cx">     this.runtimeManager = new WebInspector.RuntimeManager;
</span><ins>+    this.heapManager = new WebInspector.HeapManager;
</ins><span class="cx">     this.timelineManager = new WebInspector.TimelineManager;
</span><span class="cx">     this.debuggerManager = new WebInspector.DebuggerManager;
</span><span class="cx">     this.probeManager = new WebInspector.ProbeManager;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceTesthtml"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Test.html (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Test.html        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Test.html        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -62,6 +62,7 @@
</span><span class="cx">     &lt;script src=&quot;Protocol/DOMObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/DOMStorageObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/DebuggerObserver.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Protocol/HeapObserver.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Protocol/NetworkObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/PageObserver.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Protocol/RemoteObject.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -97,6 +98,7 @@
</span><span class="cx">     &lt;script src=&quot;Models/ExecutionContext.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/ExecutionContextList.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/Frame.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Models/GarbageCollection.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Models/Geometry.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/IndexedDatabase.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Models/IndexedDatabaseObjectStore.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -140,6 +142,7 @@
</span><span class="cx">     &lt;script src=&quot;Controllers/DOMTreeManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/DebuggerManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/FrameResourceManager.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;Controllers/HeapManager.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Controllers/IssueManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/LogManager.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Controllers/ProbeManager.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineDataGridNodejs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineDataGridNode.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineDataGridNode.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineDataGridNode.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -77,8 +77,15 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        return {eventType: this._record.eventType, startTime, selfTime: duration, totalTime: duration,
-            averageTime: duration, callCount: 1, location: callFrameOrSourceCodeLocation};
</del><ins>+        return {
+            eventType: this._record.eventType,
+            startTime,
+            selfTime: duration,
+            totalTime: duration,
+            averageTime: duration,
+            callCount: NaN,
+            location: callFrameOrSourceCodeLocation
+        };
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     updateRangeTimes(startTime, endTime)
</span><span class="lines">@@ -124,6 +131,9 @@
</span><span class="cx">         case &quot;totalTime&quot;:
</span><span class="cx">         case &quot;averageTime&quot;:
</span><span class="cx">             return isNaN(value) ? emptyValuePlaceholderString : Number.secondsToString(value, true);
</span><ins>+
+        case &quot;callCount&quot;:
+            return isNaN(value) ? emptyValuePlaceholderString : value;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return super.createCellContent(columnIdentifier, cell);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineOverviewGraphjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineOverviewGraph.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineOverviewGraph.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineOverviewGraph.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -73,7 +73,11 @@
</span><span class="cx">             ++recordBarIndex;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        WebInspector.TimelineRecordBar.createCombinedBars(this._scriptTimeline.records, secondsPerPixel, this, createBar.bind(this));
</del><ins>+        // Create bars for non-GC records and GC records.
+        let [gcRecords, nonGCRecords] = this._scriptTimeline.records.partition((x) =&gt; x.isGarbageCollection());
+        let boundCreateBar = createBar.bind(this);
+        WebInspector.TimelineRecordBar.createCombinedBars(nonGCRecords, secondsPerPixel, this, boundCreateBar);
+        WebInspector.TimelineRecordBar.createCombinedBars(gcRecords, secondsPerPixel, this, boundCreateBar);
</ins><span class="cx"> 
</span><span class="cx">         // Remove the remaining unused TimelineRecordBars.
</span><span class="cx">         for (; recordBarIndex &lt; this._timelineRecordBars.length; ++recordBarIndex) {
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsScriptTimelineViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineView.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineView.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/ScriptTimelineView.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -224,6 +224,10 @@
</span><span class="cx">         if (!this._pendingRecords.length)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><ins>+        var zeroTime = this.zeroTime;
+        var startTime = this.startTime;
+        var endTime = this.endTime;
+
</ins><span class="cx">         for (var scriptTimelineRecord of this._pendingRecords) {
</span><span class="cx">             var rootNodes = [];
</span><span class="cx">             if (scriptTimelineRecord.profile) {
</span><span class="lines">@@ -231,15 +235,11 @@
</span><span class="cx">                 rootNodes = scriptTimelineRecord.profile.topDownRootNodes;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            var zeroTime = this.zeroTime;
-            var treeElement = new WebInspector.TimelineRecordTreeElement(scriptTimelineRecord, WebInspector.SourceCodeLocation.NameStyle.Short, rootNodes.length);
</del><ins>+            var treeElement = new WebInspector.TimelineRecordTreeElement(scriptTimelineRecord, WebInspector.SourceCodeLocation.NameStyle.Short, true);
</ins><span class="cx">             var dataGridNode = new WebInspector.ScriptTimelineDataGridNode(scriptTimelineRecord, zeroTime);
</span><span class="cx"> 
</span><span class="cx">             this._dataGrid.addRowInSortOrder(treeElement, dataGridNode);
</span><span class="cx"> 
</span><del>-            var startTime = this.startTime;
-            var endTime = this.endTime;
-
</del><span class="cx">             for (var profileNode of rootNodes) {
</span><span class="cx">                 var profileNodeTreeElement = new WebInspector.ProfileNodeTreeElement(profileNode, this);
</span><span class="cx">                 var profileNodeDataGridNode = new WebInspector.ProfileNodeDataGridNode(profileNode, zeroTime, startTime, endTime);
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsSourceCodeTimelineTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/SourceCodeTimelineTreeElement.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -25,13 +25,13 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.SourceCodeTimelineTreeElement = class SourceCodeTimelineTreeElement extends WebInspector.TimelineRecordTreeElement
</span><span class="cx"> {
</span><del>-    constructor(sourceCodeTimeline, subtitleNameStyle, includeTimerIdentifierInMainTitle)
</del><ins>+    constructor(sourceCodeTimeline, subtitleNameStyle, includeDetailsInformationInMainTitle)
</ins><span class="cx">     {
</span><span class="cx">         console.assert(sourceCodeTimeline);
</span><span class="cx"> 
</span><span class="cx">         subtitleNameStyle = subtitleNameStyle || WebInspector.SourceCodeLocation.NameStyle.None;
</span><span class="cx"> 
</span><del>-        super(sourceCodeTimeline.records[0], subtitleNameStyle, includeTimerIdentifierInMainTitle, sourceCodeTimeline.sourceCodeLocation, sourceCodeTimeline);
</del><ins>+        super(sourceCodeTimeline.records[0], subtitleNameStyle, includeDetailsInformationInMainTitle, sourceCodeTimeline.sourceCodeLocation, sourceCodeTimeline);
</ins><span class="cx"> 
</span><span class="cx">         this._sourceCodeTimeline = sourceCodeTimeline;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineIconscss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineIcons.css (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineIcons.css        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineIcons.css        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -103,6 +103,10 @@
</span><span class="cx">     content: url(../Images/TimelineRecordConsoleProfile.svg);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.garbage-collection-profile-record .icon {
+    content: url(../Images/TimelineRecordGarbageCollection.svg);
+}
+
</ins><span class="cx"> .timer-record .icon {
</span><span class="cx">     content: url(../Images/TimelineRecordTimer.svg);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordBarcss"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.css (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.css        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.css        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -98,3 +98,8 @@
</span><span class="cx">     background-color: hsl(269, 65%, 74%);
</span><span class="cx">     border-color: hsl(273, 33%, 58%);
</span><span class="cx"> }
</span><ins>+
+.timeline-record-bar.timeline-record-type-script.script-timeline-record-garbage-collected &gt; .segment {
+    background-color: hsl(23, 69%, 73%);
+    border-color: hsl(11, 54%, 62%);    
+}
</ins></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordBarjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordBar.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -134,21 +134,23 @@
</span><span class="cx">         var startTimeProperty = usesActiveStartTime ? &quot;activeStartTime&quot; : &quot;startTime&quot;;
</span><span class="cx"> 
</span><span class="cx">         for (var record of visibleRecords) {
</span><ins>+            var startTime = record[startTimeProperty];
+
</ins><span class="cx">             // Check if the previous record is far enough away to create the active bar. We also create it now if the current record has no active state time.
</span><del>-            if (!isNaN(activeStartTime) &amp;&amp; (activeStartTime + Math.max(activeEndTime - activeStartTime, minimumDuration) + minimumMargin &lt;= record[startTimeProperty]
-                || (isNaN(record[startTimeProperty]) &amp;&amp; !isNaN(activeEndTime)))) {
</del><ins>+            if (!isNaN(activeStartTime) &amp;&amp; (activeStartTime + Math.max(activeEndTime - activeStartTime, minimumDuration) + minimumMargin &lt;= startTime
+                || (isNaN(startTime) &amp;&amp; !isNaN(activeEndTime)))) {
</ins><span class="cx">                 createBarCallback(activeRecords, WebInspector.TimelineRecordBar.RenderMode.ActiveOnly);
</span><span class="cx">                 activeRecords = [];
</span><span class="cx">                 activeStartTime = NaN;
</span><span class="cx">                 activeEndTime = NaN;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            if (isNaN(record[startTimeProperty]))
</del><ins>+            if (isNaN(startTime))
</ins><span class="cx">                 continue;
</span><span class="cx"> 
</span><span class="cx">             // If this is a new bar, peg the start time.
</span><span class="cx">             if (isNaN(activeStartTime))
</span><del>-                activeStartTime = record[startTimeProperty];
</del><ins>+                activeStartTime = startTime;
</ins><span class="cx"> 
</span><span class="cx">             // Update the end time to be the maximum we encounter. activeEndTime might be NaN, so &quot;|| 0&quot; to prevent Math.max from returning NaN.
</span><span class="cx">             if (!isNaN(record.endTime))
</span></span></pre></div>
<a id="trunkSourceWebInspectorUIUserInterfaceViewsTimelineRecordTreeElementjs"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js (190519 => 190520)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js        2015-10-02 20:38:34 UTC (rev 190519)
+++ trunk/Source/WebInspectorUI/UserInterface/Views/TimelineRecordTreeElement.js        2015-10-02 20:40:47 UTC (rev 190520)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> WebInspector.TimelineRecordTreeElement = class TimelineRecordTreeElement extends WebInspector.GeneralTreeElement
</span><span class="cx"> {
</span><del>-    constructor(timelineRecord, subtitleNameStyle, includeTimerIdentifierInMainTitle, sourceCodeLocation, representedObject)
</del><ins>+    constructor(timelineRecord, subtitleNameStyle, includeDetailsInformationInMainTitle, sourceCodeLocation, representedObject)
</ins><span class="cx">     {
</span><span class="cx">         console.assert(timelineRecord);
</span><span class="cx"> 
</span><span class="lines">@@ -72,7 +72,7 @@
</span><span class="cx">             break;
</span><span class="cx"> 
</span><span class="cx">         case WebInspector.TimelineRecord.Type.Script:
</span><del>-            title = WebInspector.ScriptTimelineRecord.EventType.displayName(timelineRecord.eventType, timelineRecord.details, includeTimerIdentifierInMainTitle);
</del><ins>+            title = WebInspector.ScriptTimelineRecord.EventType.displayName(timelineRecord.eventType, timelineRecord.details, includeDetailsInformationInMainTitle);
</ins><span class="cx"> 
</span><span class="cx">             switch (timelineRecord.eventType) {
</span><span class="cx">             case WebInspector.ScriptTimelineRecord.EventType.ScriptEvaluated:
</span><span class="lines">@@ -87,6 +87,9 @@
</span><span class="cx">             case WebInspector.ScriptTimelineRecord.EventType.ConsoleProfileRecorded:
</span><span class="cx">                 iconStyleClass = WebInspector.TimelineRecordTreeElement.ConsoleProfileIconStyleClass;
</span><span class="cx">                 break;
</span><ins>+            case WebInspector.ScriptTimelineRecord.EventType.GarbageCollected:
+                iconStyleClass = WebInspector.TimelineRecordTreeElement.GarbageCollectionIconStyleClass;
+                break;
</ins><span class="cx">             case WebInspector.ScriptTimelineRecord.EventType.TimerFired:
</span><span class="cx">             case WebInspector.ScriptTimelineRecord.EventType.TimerInstalled:
</span><span class="cx">             case WebInspector.ScriptTimelineRecord.EventType.TimerRemoved:
</span><span class="lines">@@ -168,3 +171,4 @@
</span><span class="cx"> WebInspector.TimelineRecordTreeElement.AnimationRecordIconStyleClass = &quot;animation-record&quot;;
</span><span class="cx"> WebInspector.TimelineRecordTreeElement.ProbeRecordIconStyleClass = &quot;probe-record&quot;;
</span><span class="cx"> WebInspector.TimelineRecordTreeElement.ConsoleProfileIconStyleClass = &quot;console-profile-record&quot;;
</span><ins>+WebInspector.TimelineRecordTreeElement.GarbageCollectionIconStyleClass = &quot;garbage-collection-profile-record&quot;;
</ins></span></pre>
</div>
</div>

</body>
</html>