Chromium Code Reviews| Index: Source/devtools/front_end/HeapSnapshotView.js |
| diff --git a/Source/devtools/front_end/HeapSnapshotView.js b/Source/devtools/front_end/HeapSnapshotView.js |
| index 63ac183a4bf1a428a530951f8aabb2a98415755e..64e99c67aafc6dc043e0ae4033baaa77466161c5 100644 |
| --- a/Source/devtools/front_end/HeapSnapshotView.js |
| +++ b/Source/devtools/front_end/HeapSnapshotView.js |
| @@ -781,8 +781,9 @@ WebInspector.HeapProfilerDispatcher.prototype = { |
| * @override |
| * @param {number} done |
| * @param {number} total |
| + * @param {boolean=} finished |
| */ |
| - reportHeapSnapshotProgress: function(done, total) |
| + reportHeapSnapshotProgress: function(done, total, finished) |
| { |
| this._genericCaller("reportHeapSnapshotProgress"); |
| }, |
| @@ -802,11 +803,15 @@ WebInspector.HeapProfilerDispatcher._dispatcher = new WebInspector.HeapProfilerD |
| * @constructor |
| * @extends {WebInspector.ProfileType} |
| * @implements {HeapProfilerAgent.Dispatcher} |
| + * @param {string=} id |
| + * @param {string=} title |
| */ |
| -WebInspector.HeapSnapshotProfileType = function() |
| +WebInspector.HeapSnapshotProfileType = function(id, title) |
| { |
| - WebInspector.ProfileType.call(this, WebInspector.HeapSnapshotProfileType.TypeId, WebInspector.UIString("Take Heap Snapshot")); |
| + WebInspector.ProfileType.call(this, id || WebInspector.HeapSnapshotProfileType.TypeId, title || WebInspector.UIString("Take Heap Snapshot")); |
| WebInspector.HeapProfilerDispatcher._dispatcher.register(this); |
| + |
| + this._nextSnapshotId = 1; |
| } |
| WebInspector.HeapSnapshotProfileType.TypeId = "HEAP"; |
| @@ -888,9 +893,22 @@ WebInspector.HeapSnapshotProfileType.prototype = { |
| { |
| if (this.profileBeingRecorded()) |
| return; |
| - this._profileBeingRecorded = new WebInspector.HeapProfileHeader(this, WebInspector.UIString("Snapshotting\u2026")); |
| + var id = this._nextSnapshotId++; |
| + this._profileBeingRecorded = new WebInspector.HeapProfileHeader(this, WebInspector.UIString("Snapshotting\u2026"), id); |
| this.addProfile(this._profileBeingRecorded); |
| - HeapProfilerAgent.takeHeapSnapshot(true, callback); |
| + /** |
| + * @param {?string} error |
| + * @this {WebInspector.HeapSnapshotProfileType} |
| + */ |
| + function didTakeHeapSnapshot(error) |
| + { |
| + var profile = this._profileBeingRecorded; |
| + profile.title = WebInspector.UIString("Snapshot %d", profile.uid); |
| + profile._finishLoad(); |
| + this._profileBeingRecorded = null; |
| + callback(); |
| + } |
| + HeapProfilerAgent.takeHeapSnapshot(true, didTakeHeapSnapshot.bind(this)); |
| }, |
| /** |
| @@ -923,23 +941,26 @@ WebInspector.HeapSnapshotProfileType.prototype = { |
| */ |
| addHeapSnapshotChunk: function(uid, chunk) |
| { |
| - var profile = this.getProfile(uid); |
| - if (profile) |
| - profile.transferChunk(chunk); |
| + if (!this.profileBeingRecorded()) |
| + return; |
| + this.profileBeingRecorded().transferChunk(chunk); |
| }, |
| /** |
| * @override |
| * @param {number} done |
| * @param {number} total |
| + * @param {boolean=} finished |
| */ |
| - reportHeapSnapshotProgress: function(done, total) |
| + reportHeapSnapshotProgress: function(done, total, finished) |
| { |
| var profile = this.profileBeingRecorded(); |
| if (!profile) |
| return; |
| profile.sidebarElement.subtitle = WebInspector.UIString("%.0f%", (done / total) * 100); |
| profile.sidebarElement.wait = true; |
| + if (finished) |
| + profile._prepareToLoad(); |
| }, |
| /** |
| @@ -979,9 +1000,8 @@ WebInspector.HeapSnapshotProfileType.prototype = { |
| */ |
| WebInspector.TrackingHeapSnapshotProfileType = function(profilesPanel) |
| { |
| - WebInspector.ProfileType.call(this, WebInspector.TrackingHeapSnapshotProfileType.TypeId, WebInspector.UIString("Record Heap Allocations")); |
| + WebInspector.HeapSnapshotProfileType.call(this, WebInspector.TrackingHeapSnapshotProfileType.TypeId, WebInspector.UIString("Record Heap Allocations")); |
| this._profilesPanel = profilesPanel; |
| - WebInspector.HeapProfilerDispatcher._dispatcher.register(this); |
| } |
| WebInspector.TrackingHeapSnapshotProfileType.TypeId = "HEAP-RECORD"; |
| @@ -1092,7 +1112,30 @@ WebInspector.TrackingHeapSnapshotProfileType.prototype = { |
| _stopRecordingProfile: function() |
| { |
| - HeapProfilerAgent.stopTrackingHeapObjects(true); |
| + |
| + var profile = this._profileBeingRecorded; |
| + var title = WebInspector.UIString("Snapshotting\u2026"); |
| + profile.title = title; |
| + profile.sidebarElement.mainTitle = title; |
| + /** |
| + * @param {?string} error |
| + * @this {WebInspector.HeapSnapshotProfileType} |
|
alph
2013/12/23 14:06:59
WebInspector.TrackingHeapSnapshotProfileType
|
| + */ |
| + function didTakeHeapSnapshot(error) |
|
alph
2013/12/23 14:06:59
It seems to have a bunch of similar code to its fr
|
| + { |
| + profile.uid = this._nextSnapshotId++; |
| + var title = WebInspector.UIString("Snapshot %d", profile.uid); |
| + profile.title = title; |
| + profile.sidebarElement.mainTitle = title; |
| + WebInspector.log("didTakeHeapSnapshot " + this._profileBeingRecorded); |
|
alph
2013/12/23 14:06:59
is that intended?
|
| + profile._finishLoad(); |
| + this._profileSamples = null; |
| + this._profileBeingRecorded = null; |
| + WebInspector.panels.profiles._showProfile(profile); |
|
alph
2013/12/23 14:06:59
Event broadcasting would look more elegant here. w
|
| + profile.existingView()._refreshView(); |
| + } |
| + |
| + HeapProfilerAgent.stopTrackingHeapObjects(true, didTakeHeapSnapshot.bind(this)); |
| this._recording = false; |
| this.dispatchEventToListeners(WebInspector.TrackingHeapSnapshotProfileType.TrackingStopped); |
| }, |
| @@ -1183,19 +1226,29 @@ WebInspector.HeapProfileHeader.prototype = { |
| return; |
| } |
| - this._numberOfChunks = 0; |
| - if (!this._receiver) { |
| - this._setupWorker(); |
| - this._transferHandler = new WebInspector.BackendSnapshotLoader(this); |
| - this.sidebarElement.subtitle = WebInspector.UIString("Loading\u2026"); |
| - this.sidebarElement.wait = true; |
| - this._transferSnapshot(); |
| - } |
| var loaderProxy = /** @type {?WebInspector.HeapSnapshotLoaderProxy} */ (this._receiver); |
| console.assert(loaderProxy); |
| loaderProxy.addConsumer(callback); |
| }, |
| + _prepareToLoad: function() |
| + { |
| + console.assert(!this._receiver, "Already loading"); |
| + this._numberOfChunks = 0; |
| + this._setupWorker(); |
| + this._transferHandler = new WebInspector.BackendSnapshotLoader(this); |
| + this.sidebarElement.subtitle = WebInspector.UIString("Loading\u2026"); |
| + this.sidebarElement.wait = true; |
| + }, |
| + |
| + _finishLoad: function() |
| + { |
| + if (this._transferHandler) { |
| + this._transferHandler.finishTransfer(); |
| + this._totalNumberOfChunks = this._transferHandler._totalNumberOfChunks; |
| + } |
| + }, |
| + |
| _transferSnapshot: function() |
| { |
| /** |