1f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// found in the LICENSE file.
4f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
5f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)/**
6f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) * @constructor
77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @param {!WebInspector.TracingManager} tracingManager
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!WebInspector.TracingModel} tracingModel
9197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!WebInspector.TimelineModel.Filter} recordFilter
105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @extends {WebInspector.TimelineModel}
11f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) */
127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciWebInspector.TracingTimelineModel = function(tracingManager, tracingModel, recordFilter)
13f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){
14c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    WebInspector.TimelineModel.call(this);
157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._tracingManager = tracingManager;
17f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    this._tracingModel = tracingModel;
18197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._recordFilter = recordFilter;
197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._tracingManager.addEventListener(WebInspector.TracingManager.Events.TracingStarted, this._onTracingStarted, this);
207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._tracingManager.addEventListener(WebInspector.TracingManager.Events.EventsCollected, this._onEventsCollected, this);
217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this._tracingManager.addEventListener(WebInspector.TracingManager.Events.TracingComplete, this._onTracingComplete, this);
225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    this.reset();
23f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
24f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
25f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)WebInspector.TracingTimelineModel.RecordType = {
26f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    Program: "Program",
27f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    EventDispatch: "EventDispatch",
28f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
29f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    GPUTask: "GPUTask",
30f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
31f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RequestMainThreadFrame: "RequestMainThreadFrame",
32f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    BeginFrame: "BeginFrame",
33f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    BeginMainThreadFrame: "BeginMainThreadFrame",
34f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ActivateLayerTree: "ActivateLayerTree",
35f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    DrawFrame: "DrawFrame",
36f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ScheduleStyleRecalculation: "ScheduleStyleRecalculation",
37f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RecalculateStyles: "RecalculateStyles",
38f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    InvalidateLayout: "InvalidateLayout",
39f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    Layout: "Layout",
405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    UpdateLayer: "UpdateLayer",
41197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    UpdateLayerTree: "UpdateLayerTree",
42f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    PaintSetup: "PaintSetup",
43f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    Paint: "Paint",
44f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    PaintImage: "PaintImage",
45f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    Rasterize: "Rasterize",
46f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RasterTask: "RasterTask",
47f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ScrollLayer: "ScrollLayer",
48f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    CompositeLayers: "CompositeLayers",
49f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
50f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ParseHTML: "ParseHTML",
51f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
52f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    TimerInstall: "TimerInstall",
53f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    TimerRemove: "TimerRemove",
54f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    TimerFire: "TimerFire",
55f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
56f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    XHRReadyStateChange: "XHRReadyStateChange",
57f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    XHRLoad: "XHRLoad",
58f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    EvaluateScript: "EvaluateScript",
59f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
60f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    MarkLoad: "MarkLoad",
61f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    MarkDOMContent: "MarkDOMContent",
62f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    MarkFirstPaint: "MarkFirstPaint",
63f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
64f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    TimeStamp: "TimeStamp",
65f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ConsoleTime: "ConsoleTime",
66f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
67f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ResourceSendRequest: "ResourceSendRequest",
68f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ResourceReceiveResponse: "ResourceReceiveResponse",
69f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ResourceReceivedData: "ResourceReceivedData",
70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ResourceFinish: "ResourceFinish",
71f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
72f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FunctionCall: "FunctionCall",
73f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    GCEvent: "GCEvent",
74f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    JSFrame: "JSFrame",
75e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    JSSample: "JSSample",
76f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
77f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    UpdateCounters: "UpdateCounters",
78f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
79f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RequestAnimationFrame: "RequestAnimationFrame",
80f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    CancelAnimationFrame: "CancelAnimationFrame",
81f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    FireAnimationFrame: "FireAnimationFrame",
82f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
83f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebSocketCreate : "WebSocketCreate",
84f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebSocketSendHandshakeRequest : "WebSocketSendHandshakeRequest",
85f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebSocketReceiveHandshakeResponse : "WebSocketReceiveHandshakeResponse",
86f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    WebSocketDestroy : "WebSocketDestroy",
87f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
88f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    EmbedderCallback : "EmbedderCallback",
89f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
90f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    CallStack: "CallStack",
91f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    SetLayerTreeId: "SetLayerTreeId",
92f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    TracingStartedInPage: "TracingStartedInPage",
937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TracingSessionIdForWorker: "TracingSessionIdForWorker",
94f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
95f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    DecodeImage: "Decode Image",
96f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    ResizeImage: "Resize Image",
97f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    DrawLazyPixelRef: "Draw LazyPixelRef",
98f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    DecodeLazyPixelRef: "Decode LazyPixelRef",
99f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
100f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    LazyPixelRef: "LazyPixelRef",
1015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    LayerTreeHostImplSnapshot: "cc::LayerTreeHostImpl",
1025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    PictureSnapshot: "cc::Picture"
103f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)};
104f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
105e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @constructor
107e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {string} name
108e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
109e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.TracingTimelineModel.VirtualThread = function(name)
110e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
111e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.name = name;
112e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /** @type {!Array.<!WebInspector.TracingModel.Event>} */
113e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this.events = [];
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /** @type {!Array.<!Array.<!WebInspector.TracingModel.Event>>} */
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    this.asyncEvents = [];
116e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
117e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
118f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)WebInspector.TracingTimelineModel.prototype = {
119f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
120f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {boolean} captureStacks
121f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {boolean} captureMemory
1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {boolean} capturePictures
123f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    startRecording: function(captureStacks, captureMemory, capturePictures)
125f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        function disabledByDefault(category)
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        {
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            return "disabled-by-default-" + category;
129f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
1309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        var categoriesArray = [
1319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            "-*",
1329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            disabledByDefault("devtools.timeline"),
1339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            disabledByDefault("devtools.timeline.frame"),
1349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            WebInspector.TracingModel.ConsoleEventCategory
1359e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        ];
136e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (captureStacks) {
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            categoriesArray.push(disabledByDefault("devtools.timeline.stack"));
1387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (Runtime.experiments.isEnabled("timelineJSCPUProfile")) {
139e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._jsProfilerStarted = true;
140e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._currentTarget = WebInspector.context.flavor(WebInspector.Target);
141e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._configureCpuProfilerSamplingInterval();
142e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._currentTarget.profilerAgent().start();
143e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            }
144e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
145197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (capturePictures) {
146197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            categoriesArray = categoriesArray.concat([
147197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                disabledByDefault("devtools.timeline.layers"),
148197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                disabledByDefault("devtools.timeline.picture"),
149197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                disabledByDefault("blink.graphics_context_annotations")]);
150197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        }
151197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var categories = categoriesArray.join(",");
1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._startRecordingWithCategories(categories);
153f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
154f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
155f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    stopRecording: function()
156f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
157e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._stopCallbackBarrier = new CallbackBarrier();
158e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._jsProfilerStarted) {
159e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._currentTarget.profilerAgent().stop(this._stopCallbackBarrier.createCallback(this._didStopRecordingJSSamples.bind(this)));
160e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._jsProfilerStarted = false;
161e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingManager.stop();
163f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
164f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
1655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!Array.<!WebInspector.TracingManager.EventPayload>} events
1675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    setEventsForTest: function(events)
169f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._onTracingStarted();
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingModel.addEvents(events);
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this._onTracingComplete();
1735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
1745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
175e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _configureCpuProfilerSamplingInterval: function()
176e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
177e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var intervalUs = WebInspector.settings.highResolutionCpuProfiling.get() ? 100 : 1000;
178e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._currentTarget.profilerAgent().setSamplingInterval(intervalUs, didChangeInterval);
179e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
180e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        function didChangeInterval(error)
181e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        {
182e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (error)
183e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                WebInspector.console.error(error);
184e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
185e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
186e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
1885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {string} categories
1895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
1905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    _startRecordingWithCategories: function(categories)
1915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingManager.start(categories, "");
1935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
1945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _onTracingStarted: function()
1965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
197c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        this.reset();
1987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingModel.reset();
1995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingStarted);
200f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
201f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!WebInspector.Event} event
2047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
2057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    _onEventsCollected: function(event)
2067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
2077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        var traceEvents = /** @type {!Array.<!WebInspector.TracingManager.EventPayload>} */ (event.data);
2087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingModel.addEvents(traceEvents);
2097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
2107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
211c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    _onTracingComplete: function()
212f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
2137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingModel.tracingComplete();
214e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._stopCallbackBarrier)
215e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._stopCallbackBarrier.callWhenDone(this._didStopRecordingTraceEvents.bind(this));
216e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        else
217e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._didStopRecordingTraceEvents();
218e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
219e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
220e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
221e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {?Protocol.Error} error
222e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {?ProfilerAgent.CPUProfile} cpuProfile
223e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
224e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _didStopRecordingJSSamples: function(error, cpuProfile)
225e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
226e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (error)
227e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            WebInspector.console.error(error);
228e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._cpuProfile = cpuProfile;
229e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
230e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
231e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _didStopRecordingTraceEvents: function()
232e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
233e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._stopCallbackBarrier = null;
234e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var events = this._tracingModel.devtoolsPageMetadataEvents();
235e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var workerMetadataEvents = this._tracingModel.devtoolsWorkerMetadataEvents();
236f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
237f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._resetProcessingState();
238f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = 0, length = events.length; i < length; i++) {
239f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var event = events[i];
240f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var process = event.thread.process();
241f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var startTime = event.startTime;
242f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
243f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var endTime = Infinity;
244f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (i + 1 < length)
245f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                endTime = events[i + 1].startTime;
246f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
247e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var threads = process.sortedThreads();
248e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            for (var j = 0; j < threads.length; j++) {
249e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                var thread = threads[j];
2507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                if (thread.name() === "WebCore: Worker" && !workerMetadataEvents.some(function(e) { return e.args["data"]["workerThreadId"] === thread.id(); }))
251e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                    continue;
252e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._processThreadEvents(startTime, endTime, event.thread, thread);
253e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            }
254f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
255f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._resetProcessingState();
256f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
257f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._inspectedTargetEvents.sort(WebInspector.TracingModel.Event.compareStartTime);
258f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
259e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._cpuProfile) {
260e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var jsSamples = WebInspector.TimelineJSProfileProcessor.generateTracingEventsFromCpuProfile(this, this._cpuProfile);
261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._inspectedTargetEvents = this._inspectedTargetEvents.mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime);
262e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._setMainThreadEvents(this.mainThreadEvents().mergeOrdered(jsSamples, WebInspector.TracingModel.Event.orderedCompareStartTime));
263e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._cpuProfile = null;
264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
265e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
2665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._buildTimelineRecords();
2675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordingStopped);
268f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
269f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
270f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
2715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {number}
272f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
273f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    minimumRecordTime: function()
274f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
275f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return this._tracingModel.minimumRecordTime();
276f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
277f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
278f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
2795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {number}
280f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
281f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    maximumRecordTime: function()
282f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
283f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return this._tracingModel.maximumRecordTime();
284f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
285f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
286f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
287f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @return {!Array.<!WebInspector.TracingModel.Event>}
288f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
289f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    inspectedTargetEvents: function()
290f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
291f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return this._inspectedTargetEvents;
292f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
293f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
294f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
295f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @return {!Array.<!WebInspector.TracingModel.Event>}
296f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
297f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    mainThreadEvents: function()
298f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
299e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return this._mainThreadEvents;
300197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
301197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
302197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
303e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {!Array.<!WebInspector.TracingModel.Event>} events
304e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
305e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _setMainThreadEvents: function(events)
306e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
307e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._mainThreadEvents = events;
308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
309e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
310e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
3117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @return {!Array.<!Array.<!WebInspector.TracingModel.Event>>}
3127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
3137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    mainThreadAsyncEvents: function()
3147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._mainThreadAsyncEvents;
3167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    },
3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
319e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @return {!Array.<!WebInspector.TracingTimelineModel.VirtualThread>}
320197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
321197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtualThreads: function()
322197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
323197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._virtualThreads;
324f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
325f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
326e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
327e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {!WebInspector.ChunkedFileReader} fileReader
328e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {!WebInspector.Progress} progress
329e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @return {!WebInspector.OutputStream}
330e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
331e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    createLoader: function(fileReader, progress)
332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
333e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return new WebInspector.TracingModelLoader(this, fileReader, progress);
334e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
335e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
336e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
337e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {!WebInspector.OutputStream} stream
338e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
339e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    writeToStream: function(stream)
340e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
341e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var saver = new WebInspector.TracingTimelineSaver(stream);
3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._tracingModel.writeToStream(stream, saver);
343e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
344e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
3455d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    reset: function()
3465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
347e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._virtualThreads = [];
348e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._mainThreadEvents = [];
3497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._mainThreadAsyncEvents = [];
3505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._inspectedTargetEvents = [];
3515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        WebInspector.TimelineModel.prototype.reset.call(this);
3525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
3535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
3545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    _buildTimelineRecords: function()
3555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
3565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var recordStack = [];
357197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        var mainThreadEvents = this.mainThreadEvents();
3587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        /**
3607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         * @param {!WebInspector.TracingTimelineModel.TraceEventRecord} record
3617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci         */
3627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        function copyChildrenToParent(record)
3637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        {
3647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var parent = record.parent;
3657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var parentChildren = parent.children();
3667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var children = record.children();
3677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            for (var j = 0; j < children.length; ++j)
3687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                children[j].parent = parent;
3697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            parentChildren.splice.apply(parentChildren, [parentChildren.indexOf(record), 1].concat(children));
3707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
3717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
3725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        for (var i = 0, size = mainThreadEvents.length; i < size; ++i) {
3735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            var event = mainThreadEvents[i];
3745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            while (recordStack.length) {
3755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                var top = recordStack.peekLast();
3767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // When we've got a not-yet-complete async event at the top of the stack,
3777242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // see if we can close it by a matching end event. If this doesn't happen
3787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // before end of top-level event (presumably, a "Program"), pretend the
3797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // async event never happened.
3807242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                if (!top._event.endTime) {
3817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    if (event.phase !== WebInspector.TracingModel.Phase.AsyncEnd && recordStack[0]._event.endTime >= event.startTime)
3827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                        break;
3837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    if (event.phase === WebInspector.TracingModel.Phase.AsyncEnd) {
3847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                        if (top._event.name === event.name) {
3857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                            top.setEndTime(event.startTime);
3867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                            recordStack.pop();
3877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                        }
3887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                        break;
3897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    }
3907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    // Delete incomplete async record from parent and adopt its children.
3917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    recordStack.pop();
3927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    copyChildrenToParent(top);
3937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                    continue;
3947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                } else if (top._event.endTime >= event.startTime) {
3955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                    break;
3967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                }
3975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                recordStack.pop();
398197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                if (!recordStack.length)
399197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                    this._addTopLevelRecord(top);
4005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            }
4017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (event.phase === WebInspector.TracingModel.Phase.AsyncEnd)
4027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                continue;
403197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var record = new WebInspector.TracingTimelineModel.TraceEventRecord(this, event);
404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)            if (WebInspector.TracingTimelineUIUtils.isMarkerEvent(event))
4055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                this._eventDividerRecords.push(record);
406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!this._recordFilter.accept(record))
407197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                continue;
408197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var parentRecord = recordStack.peekLast();
409197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (parentRecord)
410197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                parentRecord._addChild(record);
4117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (event.endTime || (event.phase === WebInspector.TracingModel.Phase.AsyncBegin && parentRecord))
4125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                recordStack.push(record);
4135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
4147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        // Close all remaining incomplete async events.
4167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        while (recordStack.length > 1) {
4177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            var top = recordStack.pop();
4187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!top._event.endTime) {
4197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                // Delete incomplete async record from parent and adopt its children.
4207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                copyChildrenToParent(top);
4217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            }
4227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
4237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
424197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (recordStack.length)
425197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            this._addTopLevelRecord(recordStack[0]);
4265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
4275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
4295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {!WebInspector.TracingTimelineModel.TraceEventRecord} record
4305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
4315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    _addTopLevelRecord: function(record)
4325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
4335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._updateBoundaries(record);
4345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._records.push(record);
435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (record.type() === WebInspector.TracingTimelineModel.RecordType.Program)
4365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            this._mainThreadTasks.push(record);
437197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        if (record.type() === WebInspector.TracingTimelineModel.RecordType.GPUTask)
4385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            this._gpuThreadTasks.push(record);
4395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded, record);
4405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
4415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
442f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _resetProcessingState: function()
443f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
444f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._sendRequestEvents = {};
445f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._timerEvents = {};
446f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._requestAnimationFrameEvents = {};
447f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._layoutInvalidate = {};
448f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._lastScheduleStyleRecalculation = {};
449f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._webSocketCreateEvents = {};
450f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._paintImageEventByPixelRefId = {};
4515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._lastPaintForLayer = {};
452f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._lastRecalculateStylesEvent = null;
453f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._currentScriptEvent = null;
454f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._eventStack = [];
455f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
456f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
457f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
458f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {number} startTime
459f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {?number} endTime
460f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {!WebInspector.TracingModel.Thread} mainThread
461f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {!WebInspector.TracingModel.Thread} thread
462f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
463f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _processThreadEvents: function(startTime, endTime, mainThread, thread)
464f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
465f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var events = thread.events();
466f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var length = events.length;
467f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var i = events.lowerBound(startTime, function (time, event) { return time - event.startTime });
468f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
469e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var threadEvents;
470e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (thread === mainThread) {
471e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            threadEvents = this._mainThreadEvents;
4727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._mainThreadAsyncEvents = this._mainThreadAsyncEvents.concat(thread.asyncEvents());
473e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } else {
474e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var virtualThread = new WebInspector.TracingTimelineModel.VirtualThread(thread.name());
475e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            threadEvents = virtualThread.events;
4767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            virtualThread.asyncEvents = virtualThread.asyncEvents.concat(thread.asyncEvents());
477e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._virtualThreads.push(virtualThread);
478e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
479e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
480f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        this._eventStack = [];
481f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (; i < length; i++) {
482f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var event = events[i];
483f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (endTime && event.startTime >= endTime)
484f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                break;
485f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._processEvent(event);
486197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            threadEvents.push(event);
487f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._inspectedTargetEvents.push(event);
488f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
489f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
490f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
491f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
492f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {!WebInspector.TracingModel.Event} event
493f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
494f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _processEvent: function(event)
495f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
496f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var recordTypes = WebInspector.TracingTimelineModel.RecordType;
497f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
498f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var eventStack = this._eventStack;
499f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        while (eventStack.length && eventStack.peekLast().endTime < event.startTime)
500f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            eventStack.pop();
501f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        var duration = event.duration;
502f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (duration) {
503f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (eventStack.length) {
504f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var parent = eventStack.peekLast();
505f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                parent.selfTime -= duration;
506f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            }
507f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.selfTime = duration;
508f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            eventStack.push(event);
509f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
510f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
511f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        if (this._currentScriptEvent && event.startTime > this._currentScriptEvent.endTime)
512f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._currentScriptEvent = null;
513f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
514f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        switch (event.name) {
515f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.CallStack:
516197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            var lastMainThreadEvent = this.mainThreadEvents().peekLast();
517e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (lastMainThreadEvent && event.args["stack"] && event.args["stack"].length)
518e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                lastMainThreadEvent.stackTrace = event.args["stack"];
519f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
520f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
521f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ResourceSendRequest:
522e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._sendRequestEvents[event.args["data"]["requestId"]] = event;
523e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.imageURL = event.args["data"]["url"];
524f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
525f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
526f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ResourceReceiveResponse:
527f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ResourceReceivedData:
528f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ResourceFinish:
529e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.initiator = this._sendRequestEvents[event.args["data"]["requestId"]];
530f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (event.initiator)
531f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                event.imageURL = event.initiator.imageURL;
532f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
533f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
534f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.TimerInstall:
535e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._timerEvents[event.args["data"]["timerId"]] = event;
536f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
537f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
538f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.TimerFire:
539e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.initiator = this._timerEvents[event.args["data"]["timerId"]];
540f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
541f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
542f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.RequestAnimationFrame:
543e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._requestAnimationFrameEvents[event.args["data"]["id"]] = event;
544f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
545f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
546f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.FireAnimationFrame:
547e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.initiator = this._requestAnimationFrameEvents[event.args["data"]["id"]];
548f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
549f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
550f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ScheduleStyleRecalculation:
551e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._lastScheduleStyleRecalculation[event.args["frame"]] = event;
552f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
553f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
554f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.RecalculateStyles:
555e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.initiator = this._lastScheduleStyleRecalculation[event.args["frame"]];
556f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._lastRecalculateStylesEvent = event;
557f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
558f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
559f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.InvalidateLayout:
560f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            // Consider style recalculation as a reason for layout invalidation,
561f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            // but only if we had no earlier layout invalidation records.
562f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var layoutInitator = event;
563e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var frameId = event.args["frame"];
564f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!this._layoutInvalidate[frameId] && this._lastRecalculateStylesEvent && this._lastRecalculateStylesEvent.endTime >  event.startTime)
565f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                layoutInitator = this._lastRecalculateStylesEvent.initiator;
566f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._layoutInvalidate[frameId] = layoutInitator;
567f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
568f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
569f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.Layout:
570f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var frameId = event.args["beginData"]["frame"];
571f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.initiator = this._layoutInvalidate[frameId];
572f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.backendNodeId = event.args["endData"]["rootNode"];
5735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            event.highlightQuad =  event.args["endData"]["root"];
574f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._layoutInvalidate[frameId] = null;
575f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (this._currentScriptEvent)
576f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                event.warning = WebInspector.UIString("Forced synchronous layout is a possible performance bottleneck.");
577f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
578f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
579f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.WebSocketCreate:
580e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._webSocketCreateEvents[event.args["data"]["identifier"]] = event;
581f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
582f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
583f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.WebSocketSendHandshakeRequest:
584f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.WebSocketReceiveHandshakeResponse:
585f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.WebSocketDestroy:
586e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            event.initiator = this._webSocketCreateEvents[event.args["data"]["identifier"]];
587f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
588f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
589f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.EvaluateScript:
590f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.FunctionCall:
591f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!this._currentScriptEvent)
592f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                this._currentScriptEvent = event;
593f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
594f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
595f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.SetLayerTreeId:
596f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._inspectedTargetLayerTreeId = event.args["layerTreeId"];
597f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
598f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
599f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.Paint:
6005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            event.highlightQuad = event.args["data"]["clip"];
6015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            event.backendNodeId = event.args["data"]["nodeId"];
6025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            var layerUpdateEvent = this._findAncestorEvent(recordTypes.UpdateLayer);
6035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (!layerUpdateEvent || layerUpdateEvent.args["layerTreeId"] !== this._inspectedTargetLayerTreeId)
6045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                break;
605197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            // Only keep layer paint events, skip paints for subframes that get painted to the same layer as parent.
606197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch            if (!event.args["data"]["layerId"])
607197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch                break;
6085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            this._lastPaintForLayer[layerUpdateEvent.args["layerId"]] = event;
6095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            break;
6105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
6115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        case recordTypes.PictureSnapshot:
6125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            var layerUpdateEvent = this._findAncestorEvent(recordTypes.UpdateLayer);
6135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            if (!layerUpdateEvent || layerUpdateEvent.args["layerTreeId"] !== this._inspectedTargetLayerTreeId)
6145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                break;
6155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            var paintEvent = this._lastPaintForLayer[layerUpdateEvent.args["layerId"]];
6167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (paintEvent)
6177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci                paintEvent.picture = event;
6185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            break;
6195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
620f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ScrollLayer:
621f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.backendNodeId = event.args["data"]["nodeId"];
622f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
623f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
624f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.PaintImage:
625f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.backendNodeId = event.args["data"]["nodeId"];
626f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.imageURL = event.args["data"]["url"];
627f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
628f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
629f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.DecodeImage:
630f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.ResizeImage:
631f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var paintImageEvent = this._findAncestorEvent(recordTypes.PaintImage);
632f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!paintImageEvent) {
633f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                var decodeLazyPixelRefEvent = this._findAncestorEvent(recordTypes.DecodeLazyPixelRef);
634f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                paintImageEvent = decodeLazyPixelRefEvent && this._paintImageEventByPixelRefId[decodeLazyPixelRefEvent.args["LazyPixelRef"]];
635f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            }
636f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!paintImageEvent)
637f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                break;
638f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.backendNodeId = paintImageEvent.backendNodeId;
639f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.imageURL = paintImageEvent.imageURL;
640f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
641f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
642f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        case recordTypes.DrawLazyPixelRef:
643f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var paintImageEvent = this._findAncestorEvent(recordTypes.PaintImage);
644f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (!paintImageEvent)
645f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                break;
646f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            this._paintImageEventByPixelRefId[event.args["LazyPixelRef"]] = paintImageEvent;
647f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.backendNodeId = paintImageEvent.backendNodeId;
648f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            event.imageURL = paintImageEvent.imageURL;
649f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            break;
650f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
651f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
652f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
653f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    /**
654f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @param {string} name
655f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     * @return {?WebInspector.TracingModel.Event}
656f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)     */
657f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    _findAncestorEvent: function(name)
658f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    {
659f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        for (var i = this._eventStack.length - 1; i >= 0; --i) {
660f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            var event = this._eventStack[i];
661f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)            if (event.name === name)
662f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)                return event;
663f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        }
664f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        return null;
665f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    },
666f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)
6675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    __proto__: WebInspector.TimelineModel.prototype
6685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
6695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
6705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)/**
671197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @interface
672197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
673197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.Filter = function() { }
674197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
675197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.Filter.prototype = {
676197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
677197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.TracingModel.Event} event
678197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
679197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
680197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    accept: function(event) { }
681197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
682197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
683197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
684197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @constructor
685197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @implements {WebInspector.TracingTimelineModel.Filter}
686197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Array.<string>} eventNames
687197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
688197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.EventNameFilter = function(eventNames)
689197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
690197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    this._eventNames = eventNames.keySet();
691197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
692197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
693197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.EventNameFilter.prototype = {
694197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
695197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.TracingModel.Event} event
696197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
697197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
698197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    accept: function(event)
699197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
700197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        throw new Error("Not implemented.");
701197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    }
702197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
703197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
704197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
705197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @constructor
706197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @extends {WebInspector.TracingTimelineModel.EventNameFilter}
707197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Array.<string>} includeNames
708197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
709197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.InclusiveEventNameFilter = function(includeNames)
710197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
711197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.TracingTimelineModel.EventNameFilter.call(this, includeNames)
712197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
713197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
714197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.InclusiveEventNameFilter.prototype = {
715197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
716197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @override
717197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.TracingModel.Event} event
718197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
719197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
720197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    accept: function(event)
721197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
7227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return event.category === WebInspector.TracingModel.ConsoleEventCategory || !!this._eventNames[event.name];
723197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
724197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    __proto__: WebInspector.TracingTimelineModel.EventNameFilter.prototype
725197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
726197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
727197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
728197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @constructor
729197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @extends {WebInspector.TracingTimelineModel.EventNameFilter}
730197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch * @param {!Array.<string>} excludeNames
731197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch */
732197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.ExclusiveEventNameFilter = function(excludeNames)
733197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
734197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WebInspector.TracingTimelineModel.EventNameFilter.call(this, excludeNames)
735197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
736197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
737197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.ExclusiveEventNameFilter.prototype = {
738197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
739197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @override
740197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.TracingModel.Event} event
741197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {boolean}
742197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
743197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    accept: function(event)
744197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
745197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return !this._eventNames[event.name];
746197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
747197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    __proto__: WebInspector.TracingTimelineModel.EventNameFilter.prototype
748197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
749197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
750197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch/**
7515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @constructor
7525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @implements {WebInspector.TimelineModel.Record}
7535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {!WebInspector.TimelineModel} model
7545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) * @param {!WebInspector.TracingModel.Event} traceEvent
7555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) */
756197021e6b966cfb06891637935ef33fff06433d1Ben MurdochWebInspector.TracingTimelineModel.TraceEventRecord = function(model, traceEvent)
7575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
7585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    this._model = model;
7595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    this._event = traceEvent;
7605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    traceEvent._timelineRecord = this;
7615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    this._children = [];
7625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
7635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
7645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)WebInspector.TracingTimelineModel.TraceEventRecord.prototype = {
7655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
7665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {?Array.<!ConsoleAgent.CallFrame>}
7675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
7685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    callSiteStackTrace: function()
7695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
7705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var initiator = this._event.initiator;
7715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return initiator ? initiator.stackTrace : null;
7725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
7735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
7745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
7755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {?WebInspector.TimelineModel.Record}
7765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
7775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    initiator: function()
7785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
7795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        var initiator = this._event.initiator;
7805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return initiator ? initiator._timelineRecord : null;
7815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
7825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
7835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
784c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)     * @return {?WebInspector.Target}
7855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
7865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    target: function()
7875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
788c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return this._event.thread.target();
7895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
7905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
7915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
7925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {number}
7935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
7945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    selfTime: function()
7955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
7965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._event.selfTime;
7975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
7985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
7995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {!Array.<!WebInspector.TimelineModel.Record>}
8015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    children: function()
8035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._children;
8055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {number}
8095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    startTime: function()
8115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._event.startTime;
8135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
816197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {string}
8175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    thread: function()
8195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
820197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        // FIXME: Should return the actual thread name.
821197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return WebInspector.TimelineModel.MainThreadName;
8225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {number}
8265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8275d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    endTime: function()
8285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return this._endTime || this._event.endTime || this._event.startTime;
8305d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8325d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8335d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {number} endTime
8345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setEndTime: function(endTime)
8365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._endTime = endTime;
8385d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8405d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {!Object}
8425d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    data: function()
8445d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
845e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return this._event.args["data"];
8465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8475d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8485d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {string}
8505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    type: function()
8525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8539e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)        if (this._event.category === WebInspector.TracingModel.ConsoleEventCategory)
8549e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            return WebInspector.TracingTimelineModel.RecordType.ConsoleTime;
8555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._event.name;
8565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8575d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8585d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8595d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {string}
8605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    frameId: function()
8625d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8635d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        switch (this._event.name) {
8645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        case WebInspector.TracingTimelineModel.RecordType.ScheduleStyleRecalculation:
8655d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        case WebInspector.TracingTimelineModel.RecordType.RecalculateStyles:
8665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        case WebInspector.TracingTimelineModel.RecordType.InvalidateLayout:
8675d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return this._event.args["frameId"];
8685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        case WebInspector.TracingTimelineModel.RecordType.Layout:
8695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return this._event.args["beginData"]["frameId"];
8705d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        default:
871e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var data = this._event.args["data"];
8725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return (data && data["frame"]) || "";
8735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
8745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8755d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {?Array.<!ConsoleAgent.CallFrame>}
8785d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    stackTrace: function()
8805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._event.stackTrace;
8825d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {string} key
8865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {?Object}
8875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    getUserObject: function(key)
8895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
8905d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (key === "TimelineUIUtils::preview-element")
8915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return this._event.previewElement;
8925d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        throw new Error("Unexpected key: " + key);
8935d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
8945d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
8955d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
8965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {string} key
8975d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @param {?Object|undefined} value
8985d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
8995d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    setUserObject: function(key, value)
9005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
9015d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (key !== "TimelineUIUtils::preview-element")
9025d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            throw new Error("Unexpected key: " + key);
9035d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        this._event.previewElement = /** @type {?Element} */ (value);
9045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
9055d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
9065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
9075d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {?Array.<string>}
9085d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
9095d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    warnings: function()
9105d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
9115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (this._event.warning)
9125d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return [this._event.warning];
9135d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return null;
9145d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    },
9155d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
9165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    /**
9175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     * @return {!WebInspector.TracingModel.Event}
9185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)     */
9195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    traceEvent: function()
9205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    {
9215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return this._event;
922197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
923197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
924197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
925197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @param {!WebInspector.TracingTimelineModel.TraceEventRecord} child
926197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
927197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    _addChild: function(child)
928197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
929197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        this._children.push(child);
930197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        child.parent = this;
931197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    },
932197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
933197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    /**
934197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     * @return {!WebInspector.TimelineModel}
935197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch     */
936197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    timelineModel: function()
937197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    {
938197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return this._model;
9395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
940f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)}
941e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
942e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
943e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
944e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
945e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @constructor
946e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @implements {WebInspector.OutputStream}
947e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {!WebInspector.TracingTimelineModel} model
948e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {!{cancel: function()}} reader
949e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {!WebInspector.Progress} progress
950e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
951e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.TracingModelLoader = function(model, reader, progress)
952e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
953e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._model = model;
954e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._reader = reader;
955e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._progress = progress;
956e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._buffer = "";
957e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._firstChunk = true;
958e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._loader = new WebInspector.TracingModel.Loader(model._tracingModel);
959e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
960e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
961e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.TracingModelLoader.prototype = {
962e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    /**
963e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     * @param {string} chunk
964e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)     */
965e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    write: function(chunk)
966e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
967e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var data = this._buffer + chunk;
968e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var lastIndex = 0;
969e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var index;
970e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        do {
971e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            index = lastIndex;
972e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            lastIndex = WebInspector.TextUtils.findBalancedCurlyBrackets(data, index);
973e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } while (lastIndex !== -1)
974e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
975e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var json = data.slice(0, index) + "]";
976e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._buffer = data.slice(index);
977e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
978e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (!index)
979e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return;
980e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
981e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._firstChunk) {
9827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            this._model._onTracingStarted();
983e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } else {
984e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            var commaIndex = json.indexOf(",");
985e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (commaIndex !== -1)
986e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                json = json.slice(commaIndex + 1);
987e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            json = "[" + json;
988e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
989e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
990e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        var items;
991e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        try {
9927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            items = /** @type {!Array.<!WebInspector.TracingManager.EventPayload>} */ (JSON.parse(json));
993e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } catch (e) {
994e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._reportErrorAndCancelLoading("Malformed timeline data: " + e);
995e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return;
996e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
997e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
998e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (this._firstChunk) {
999e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._firstChunk = false;
1000e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (this._looksLikeAppVersion(items[0])) {
1001e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                this._reportErrorAndCancelLoading("Old Timeline format is not supported.");
1002e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)                return;
1003e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            }
1004e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
1005e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1006e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        try {
1007e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._loader.loadNextChunk(items);
1008e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        } catch(e) {
1009e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            this._reportErrorAndCancelLoading("Malformed timeline data: " + e);
1010e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return;
1011e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
1012e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1013e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1014e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _reportErrorAndCancelLoading: function(messsage)
1015e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
1016e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        WebInspector.console.error(messsage);
10177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._model._onTracingComplete();
1018e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._model.reset();
1019e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._reader.cancel();
1020e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._progress.done();
1021e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1022e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1023e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    _looksLikeAppVersion: function(item)
1024e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
1025e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return typeof item === "string" && item.indexOf("Chrome") !== -1;
1026e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1027e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1028e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    close: function()
1029e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
1030e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        this._loader.finish();
10317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._model._onTracingComplete();
1032e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
1033e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1034e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1035e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)/**
1036e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @constructor
1037e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) * @param {!WebInspector.OutputStream} stream
10387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci * @implements {WebInspector.OutputStreamDelegate}
1039e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) */
1040e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.TracingTimelineSaver = function(stream)
1041e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
1042e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    this._stream = stream;
1043e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1044e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1045e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)WebInspector.TracingTimelineSaver.prototype = {
10467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    onTransferStarted: function()
1047e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
10487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._stream.write("[");
1049e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1050e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
10517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    onTransferFinished: function()
1052e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    {
10537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        this._stream.write("]");
1054e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    },
1055e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
10567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
10577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!WebInspector.ChunkedReader} reader
10587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
10597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    onChunkTransferred: function(reader) { },
10607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
10617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    /**
10627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!WebInspector.ChunkedReader} reader
10637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     * @param {!Event} event
10647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci     */
10657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    onError: function(reader, event) { },
1066e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
1067