1# Copyright 2014 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 6from telemetry.timeline import importer 7import telemetry.timeline.slice as tracing_slice 8import telemetry.timeline.thread as timeline_thread 9from tracing.trace_data import trace_data as trace_data_module 10 11 12class InspectorTimelineImporter(importer.TimelineImporter): 13 def __init__(self, model, trace_data): 14 super(InspectorTimelineImporter, self).__init__(model, 15 trace_data, 16 import_order=1) 17 traces = trace_data.GetTracesFor( 18 trace_data_module.INSPECTOR_TRACE_PART) 19 assert len(traces) == 1 20 self._events = traces[0] 21 22 @staticmethod 23 def GetSupportedPart(): 24 return trace_data_module.INSPECTOR_TRACE_PART 25 26 def ImportEvents(self): 27 render_process = self._model.GetOrCreateProcess(0) 28 for raw_event in self._events: 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] 76