Index: tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py |
diff --git a/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py b/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py |
index f702ae2430381938b60afa28dd0f6e376e575874..9e9e13be30710627cd62403c2423199aad53b702 100644 |
--- a/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py |
+++ b/tools/telemetry/telemetry/core/backends/chrome/inspector_backend.py |
@@ -16,6 +16,7 @@ from telemetry.core.backends.chrome import inspector_page |
from telemetry.core.backends.chrome import inspector_runtime |
from telemetry.core.backends.chrome import inspector_timeline |
from telemetry.core.backends.chrome import websocket |
+from telemetry.core.jsheap import model |
class InspectorException(Exception): |
pass |
@@ -294,7 +295,7 @@ class InspectorBackend(object): |
self._HandleNotification(res) |
continue |
- if res['id'] != req['id']: |
+ if 'id' not in res or res['id'] != req['id']: |
logging.debug('Dropped reply: %s', json.dumps(res)) |
continue |
return res |
@@ -324,3 +325,34 @@ class InspectorBackend(object): |
def CollectGarbage(self): |
self._page.CollectGarbage() |
+ |
+ def TakeJSHeapSnapshot(self, timeout=120): |
+ # This is a hack to make the nested function be able to modify the |
+ # variables. |
+ snapshot_uid = [0] |
+ snapshot = [[]] |
+ |
+ def OnNotification(res): |
+ if res['method'] == 'HeapProfiler.addProfileHeader': |
+ snapshot_uid[0] = res['params']['header']['uid'] |
+ elif res['method'] == 'HeapProfiler.addHeapSnapshotChunk': |
+ snapshot[0].append(res['params']['chunk']) |
+ elif res['method'] == 'HeapProfiler.finishHeapSnapshot': |
+ snapshot[0] = ''.join(snapshot[0]) |
+ |
+ def OnClose(): |
+ pass |
+ |
+ self.RegisterDomain('HeapProfiler', OnNotification, OnClose) |
+ |
+ self.SyncRequest({'method': 'Page.getResourceTree'}, timeout) |
+ self.SyncRequest({'method': 'Debugger.enable'}, timeout) |
+ self.SyncRequest({'method': 'HeapProfiler.clearProfiles'}, timeout) |
+ self.SyncRequest({'method': 'HeapProfiler.takeHeapSnapshot', |
+ 'params': {'detailed': True}}, timeout) |
+ self.SyncRequest({'method': 'HeapProfiler.getHeapSnapshot', |
+ 'params': {'uid': snapshot_uid[0]}}, timeout) |
+ |
+ self.UnregisterDomain('HeapProfiler') |
+ |
+ return model.JsHeapSnapshotModel(snapshot[0]) |