Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(67)

Unified Diff: tools/telemetry/telemetry/inspector_timeline.py

Issue 11818024: InspectorTimeline improvements (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixes Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/telemetry/telemetry/inspector_timeline.py
diff --git a/tools/telemetry/telemetry/inspector_timeline.py b/tools/telemetry/telemetry/inspector_timeline.py
index e0810c6e5959bebbd02b18a533384a72ed38ac64..8faf38ddb6512382d4d44842e2519d4c5b9508fa 100644
--- a/tools/telemetry/telemetry/inspector_timeline.py
+++ b/tools/telemetry/telemetry/inspector_timeline.py
@@ -1,51 +1,12 @@
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-
+from telemetry.timeline_event import TimelineEvent
+from telemetry.timeline_model import TimelineModel
class InspectorBackendException(Exception):
pass
-
-class TimelineEvent(object):
- """Represents a timeline event."""
- def __init__(self, d):
- self.__dict__.update(d)
-
- @property
- def type(self):
- return self.__dict__.get('type')
-
- @property
- def start_time(self):
- return self.__dict__.get('startTime', 0)
-
- @property
- def end_time(self):
- return self.__dict__.get('endTime', 0)
-
- @property
- def elapsed_time(self):
- return self.end_time - self.start_time
-
-
-class TimelineEvents(object):
- def __init__(self):
- self._events = []
-
- def AppendRawEvents(self, raw_inspector_stream):
- if raw_inspector_stream.get('params', {}).get('record'):
- self._FlattenEvents(raw_inspector_stream['params']['record'])
-
- def _FlattenEvents(self, raw_inspector_events):
- self._events.append(TimelineEvent(raw_inspector_events))
- for child in raw_inspector_events.get('children', []):
- self._FlattenEvents(child)
-
- def GetAllOfType(self, type_name):
- return [e for e in self._events if e.type == type_name]
-
-
class InspectorTimeline(object):
"""Implementation of dev tools timeline."""
class Recorder(object):
@@ -63,17 +24,17 @@ class InspectorTimeline(object):
self._inspector_backend = inspector_backend
self._tab = tab
self._is_recording = False
- self._timeline_events = None
+ self._timeline_model = None
@property
- def timeline_events(self):
- return self._timeline_events
+ def timeline_model(self):
+ return self._timeline_model
def Start(self):
if self._is_recording:
return
- self._timeline_events = TimelineEvents()
self._is_recording = True
+ self._timeline_model = TimelineModel()
self._inspector_backend.RegisterDomain('Timeline',
self._OnNotification, self._OnClose)
req = {'method': 'Timeline.start'}
@@ -83,6 +44,7 @@ class InspectorTimeline(object):
if not self._is_recording:
raise InspectorBackendException('Stop() called but not started')
self._is_recording = False
+ self._timeline_model.DidFinishRecording()
req = {'method': 'Timeline.stop'}
self._SendSyncRequest(req)
self._inspector_backend.UnregisterDomain('Timeline')
@@ -97,7 +59,63 @@ class InspectorTimeline(object):
if not self._is_recording:
return
if 'method' in msg and msg['method'] == 'Timeline.eventRecorded':
- self._timeline_events.AppendRawEvents(msg)
+ self._OnEventRecorded(msg)
+
+ def _OnEventRecorded(self, msg):
+ record = msg.get('params', {}).get('record')
+ if record:
+ newly_created_event = InspectorTimeline.RawEventToTimelineEvent(record)
+ self._timeline_model.AddEvent(newly_created_event)
+
+ @staticmethod
+ def RawEventToTimelineEvent(raw_inspector_event):
+ """Converts raw_inspector_event to TimelineEvent."""
+ return InspectorTimeline._RawEventToTimelineEventRecursive(
+ None, raw_inspector_event)
+
+ @staticmethod
+ def _RawEventToTimelineEventRecursive(
+ parent_for_created_events, raw_inspector_event):
+ """
+ Creates a new TimelineEvent for the raw_inspector_event, if possible, adding
+ it to the provided parent_for_created_events.
+
+ It then recurses on any child events found inside, building a tree of
+ TimelineEvents.
+
+ Returns the root of the created tree, or None.
+ """
+ # Create a TimelineEvent for this raw_inspector_event if possible. Only
+ # events with start-time and end-time get imported.
+ if ('startTime' in raw_inspector_event and
+ 'endTime' in raw_inspector_event):
+ args = {}
+ for x in raw_inspector_event:
+ if x in ('startTime', 'endTime', 'children'):
+ continue
+ args[x] = raw_inspector_event[x]
+ if len(args) == 0:
+ args = None
+ newly_created_event = TimelineEvent(
+ name=raw_inspector_event['type'],
+ start_time_ms=raw_inspector_event['startTime'],
+ duration_ms=(raw_inspector_event['endTime'] -
+ raw_inspector_event['startTime']),
+ args=args)
+ if parent_for_created_events:
+ parent_for_created_events.children.append(newly_created_event)
+ else:
+ newly_created_event = None
+
+ # Process any children events, creating TimelineEvents for them as well.
+ if newly_created_event:
+ parent_for_children = newly_created_event
+ else:
+ parent_for_children = parent_for_created_events
+ for child in raw_inspector_event.get('children', []):
+ InspectorTimeline._RawEventToTimelineEventRecursive(
+ parent_for_children, child)
+ return newly_created_event
def _OnClose(self):
if self._is_recording:
« no previous file with comments | « tools/perf/perf_tools/image_decoding_benchmark.py ('k') | tools/telemetry/telemetry/inspector_timeline_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698