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
7 import telemetry.core.timeline.thread as timeline_thread
9 class InspectorTimelineImporter(importer.TimelineImporter):
10 def __init__(self, model, event_data):
11 super(InspectorTimelineImporter, self).__init__(model, event_data)
14 def CanImport(event_data):
15 ''' Checks if event_data is from the inspector timeline. We assume
16 that if the first event is a valid inspector event, we can import the
19 if isinstance(event_data, list) and len(event_data):
20 event_datum = event_data[0]
21 return 'startTime' in event_datum and 'endTime' in event_datum
24 def ImportEvents(self):
25 render_process = self._model.GetOrCreateProcess(0)
26 render_thread = render_process.GetOrCreateThread(0)
27 for raw_event in self._event_data:
28 InspectorTimelineImporter.AddRawEventToThreadRecursive(
29 render_thread, raw_event)
31 def FinalizeImport(self):
35 def AddRawEventToThreadRecursive(thread, raw_inspector_event):
36 did_begin_slice = False
37 if ('startTime' in raw_inspector_event and
38 'endTime' in raw_inspector_event):
40 for x in raw_inspector_event:
41 if x in ('startTime', 'endTime', 'children'):
43 args[x] = raw_inspector_event[x]
46 thread.BeginSlice('inspector',
47 raw_inspector_event['type'],
48 raw_inspector_event['startTime'],
50 did_begin_slice = True
52 for child in raw_inspector_event.get('children', []):
53 InspectorTimelineImporter.AddRawEventToThreadRecursive(
57 thread.EndSlice(raw_inspector_event['endTime'])
60 def RawEventToTimelineEvent(raw_inspector_event):
61 """Converts raw_inspector_event to TimelineEvent."""
62 thread = timeline_thread.Thread(None, 0)
63 InspectorTimelineImporter.AddRawEventToThreadRecursive(
64 thread, raw_inspector_event)
65 thread.FinalizeImport()
66 assert len(thread.toplevel_slices) <= 1
67 if len(thread.toplevel_slices) == 0:
69 return thread.toplevel_slices[0]