• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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