1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4 '''Imports event data obtained from the inspector's timeline.'''
6 from telemetry.core.timeline import importer
8 import telemetry.core.timeline.thread as timeline_thread
9 import telemetry.core.timeline.slice as tracing_slice
11 class InspectorTimelineImporter(importer.TimelineImporter):
12 def __init__(self, model, event_data):
13 super(InspectorTimelineImporter, self).__init__(model, event_data)
16 def CanImport(event_data):
17 ''' Checks if event_data is from the inspector timeline. We assume
18 that if the first event is a valid inspector event, we can import the
21 if isinstance(event_data, list) and len(event_data):
22 event_datum = event_data[0]
23 return 'startTime' in event_datum and 'type' in event_datum
26 def ImportEvents(self):
27 render_process = self._model.GetOrCreateProcess(0)
28 for raw_event in self._event_data:
29 thread = render_process.GetOrCreateThread(raw_event.get('thread', 0))
30 InspectorTimelineImporter.AddRawEventToThreadRecursive(thread, raw_event)
32 def FinalizeImport(self):
36 def AddRawEventToThreadRecursive(thread, raw_inspector_event):
38 if ('startTime' in raw_inspector_event and
39 'type' in raw_inspector_event):
41 for x in raw_inspector_event:
42 if x in ('startTime', 'endTime', 'children'):
44 args[x] = raw_inspector_event[x]
47 start_time = raw_inspector_event['startTime']
48 end_time = raw_inspector_event.get('endTime', start_time)
50 pending_slice = tracing_slice.Slice(
52 raw_inspector_event['type'],
54 thread_timestamp=None,
57 for child in raw_inspector_event.get('children', []):
58 InspectorTimelineImporter.AddRawEventToThreadRecursive(
62 pending_slice.duration = end_time - pending_slice.start
63 thread.PushSlice(pending_slice)
66 def RawEventToTimelineEvent(raw_inspector_event):
67 """Converts raw_inspector_event to TimelineEvent."""
68 thread = timeline_thread.Thread(None, 0)
69 InspectorTimelineImporter.AddRawEventToThreadRecursive(
70 thread, raw_inspector_event)
71 thread.FinalizeImport()
72 assert len(thread.toplevel_slices) <= 1
73 if len(thread.toplevel_slices) == 0:
75 return thread.toplevel_slices[0]