Index: Source/core/inspector/InspectorHeapProfilerAgent.cpp |
diff --git a/Source/core/inspector/InspectorHeapProfilerAgent.cpp b/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
index c518ad8920194b23dff65798295914ec7c1e2fef..fafb081816ef94d261b88b206581b8de71c4158b 100644 |
--- a/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
+++ b/Source/core/inspector/InspectorHeapProfilerAgent.cpp |
@@ -256,7 +256,7 @@ void InspectorHeapProfilerAgent::removeProfile(ErrorString*, int rawUid) |
m_snapshots.remove(uid); |
} |
-void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString*, const bool* reportProgress) |
+void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString* errorString, const bool* reportProgress) |
{ |
class HeapSnapshotProgress FINAL : public ScriptProfiler::HeapSnapshotProgress { |
public: |
@@ -269,9 +269,14 @@ void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString*, const bool* repo |
virtual void Worked(int workDone) OVERRIDE |
{ |
if (m_frontend) |
- m_frontend->reportHeapSnapshotProgress(workDone, m_totalWork); |
+ m_frontend->reportHeapSnapshotProgress(workDone, m_totalWork, 0); |
+ } |
+ virtual void Done() OVERRIDE |
+ { |
+ const bool finished = true; |
+ if (m_frontend) |
+ m_frontend->reportHeapSnapshotProgress(m_totalWork, m_totalWork, &finished); |
} |
- virtual void Done() OVERRIDE { } |
virtual bool isCanceled() OVERRIDE { return false; } |
private: |
InspectorFrontend::HeapProfiler* m_frontend; |
@@ -281,10 +286,26 @@ void InspectorHeapProfilerAgent::takeHeapSnapshot(ErrorString*, const bool* repo |
String title = "Snapshot " + String::number(m_nextUserInitiatedHeapSnapshotNumber++); |
HeapSnapshotProgress progress(reportProgress && *reportProgress ? m_frontend : 0); |
RefPtr<ScriptHeapSnapshot> snapshot = ScriptProfiler::takeHeapSnapshot(title, &progress); |
- if (snapshot) { |
- m_snapshots.add(snapshot->uid(), snapshot); |
- if (m_frontend) |
- m_frontend->addProfileHeader(createSnapshotHeader(*snapshot)); |
+ if (!snapshot) { |
+ *errorString = "Failed to take heap snapshot"; |
+ return; |
+ } |
+ |
+ class OutputStream : public ScriptHeapSnapshot::OutputStream { |
+ public: |
+ OutputStream(InspectorFrontend::HeapProfiler* frontend, unsigned uid) |
+ : m_frontend(frontend), m_uid(uid) { } |
+ void Write(const String& chunk) { m_frontend->addHeapSnapshotChunk(m_uid, chunk); } |
+ void Close() { } |
+ private: |
+ InspectorFrontend::HeapProfiler* m_frontend; |
+ int m_uid; |
+ }; |
+ |
+ if (m_frontend) { |
+ unsigned uid = static_cast<unsigned>(snapshot->uid()); |
+ OutputStream stream(m_frontend, uid); |
+ snapshot->writeJSON(&stream); |
} |
} |