blob: 39d2036192c3a82391d07c7909555f7884999edf [file] [log] [blame]
# Copyright (c) 2013 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.
'''Imports event data obtained from the inspector's timeline.'''
from telemetry.core.timeline import importer
import telemetry.core.timeline.thread as timeline_thread
class InspectorTimelineImporter(importer.TimelineImporter):
def __init__(self, model, event_data):
super(InspectorTimelineImporter, self).__init__(model, event_data)
@staticmethod
def CanImport(event_data):
''' Checks if event_data is from the inspector timeline. We assume
that if the first event is a valid inspector event, we can import the
entire list.
'''
if isinstance(event_data, list) and len(event_data):
event_datum = event_data[0]
return 'startTime' in event_datum and 'type' in event_datum
return False
def ImportEvents(self):
render_process = self._model.GetOrCreateProcess(0)
for raw_event in self._event_data:
thread = render_process.GetOrCreateThread(raw_event.get('thread', 0))
InspectorTimelineImporter.AddRawEventToThreadRecursive(thread, raw_event)
def FinalizeImport(self):
pass
@staticmethod
def AddRawEventToThreadRecursive(thread, raw_inspector_event):
did_begin_slice = False
if ('startTime' in raw_inspector_event and
'type' 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
start_time = raw_inspector_event['startTime']
end_time = raw_inspector_event.get('endTime', start_time)
thread.BeginSlice('inspector',
raw_inspector_event['type'],
start_time,
args=args)
did_begin_slice = True
for child in raw_inspector_event.get('children', []):
InspectorTimelineImporter.AddRawEventToThreadRecursive(
thread, child)
if did_begin_slice:
thread.EndSlice(end_time)
@staticmethod
def RawEventToTimelineEvent(raw_inspector_event):
"""Converts raw_inspector_event to TimelineEvent."""
thread = timeline_thread.Thread(None, 0)
InspectorTimelineImporter.AddRawEventToThreadRecursive(
thread, raw_inspector_event)
thread.FinalizeImport()
assert len(thread.toplevel_slices) <= 1
if len(thread.toplevel_slices) == 0:
return None
return thread.toplevel_slices[0]