Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / tools / telemetry / telemetry / core / timeline / inspector_importer.py
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.'''
5
6 from telemetry.core.timeline import importer
7
8 import telemetry.core.timeline.thread as timeline_thread
9 import telemetry.core.timeline.slice as tracing_slice
10
11 class InspectorTimelineImporter(importer.TimelineImporter):
12   def __init__(self, model, event_data):
13     super(InspectorTimelineImporter, self).__init__(model, event_data)
14
15   @staticmethod
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
19     entire list.
20     '''
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
24     return False
25
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)
31
32   def FinalizeImport(self):
33     pass
34
35   @staticmethod
36   def AddRawEventToThreadRecursive(thread, raw_inspector_event):
37     pending_slice = None
38     if ('startTime' in raw_inspector_event and
39         'type' in raw_inspector_event):
40       args = {}
41       for x in raw_inspector_event:
42         if x in ('startTime', 'endTime', 'children'):
43           continue
44         args[x] = raw_inspector_event[x]
45       if len(args) == 0:
46         args = None
47       start_time = raw_inspector_event['startTime']
48       end_time = raw_inspector_event.get('endTime', start_time)
49
50       pending_slice = tracing_slice.Slice(
51         thread, 'inspector',
52         raw_inspector_event['type'],
53         start_time,
54         thread_timestamp=None,
55         args=args)
56
57     for child in raw_inspector_event.get('children', []):
58       InspectorTimelineImporter.AddRawEventToThreadRecursive(
59           thread, child)
60
61     if pending_slice:
62       pending_slice.duration = end_time - pending_slice.start
63       thread.PushSlice(pending_slice)
64
65   @staticmethod
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:
74       return None
75     return thread.toplevel_slices[0]