15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)* Copyright (C) 2013 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorTimelineAgent.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3406f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/events/Event.h"
3576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/frame/LocalDOMWindow.h"
366f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#include "core/frame/FrameConsole.h"
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/FrameHost.h"
38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/FrameView.h"
39d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
40e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/IdentifiersFactory.h"
4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/inspector/InspectorClient.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorCounters.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/inspector/InspectorLayerTreeAgent.h"
46323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#include "core/inspector/InspectorNodeIds.h"
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/inspector/InspectorOverlay.h"
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h"
5053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h"
515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
5253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/TimelineRecordFactory.h"
53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/inspector/TraceEventDispatcher.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/page/Page.h"
5653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XMLHttpRequest.h"
591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
60a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/DeferredImageDecoder.h"
61a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
62bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceRequest.h"
63591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h"
64aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "wtf/DateMath.h"
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace TimelineAgentState {
699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char enabled[] = "enabled";
709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char started[] = "started";
719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char startedFromProtocol[] = "startedFromProtocol";
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char timelineMaxCallStackDepth[] = "timelineMaxCallStackDepth";
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char includeCounters[] = "includeCounters";
7451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static const char includeGPUEvents[] = "includeGPUEvents";
7506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)static const char bufferEvents[] = "bufferEvents";
7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochstatic const char liveEvents[] = "liveEvents";
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Must be kept in sync with WebInspector.TimelineModel.RecordType in TimelineModel.js
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace TimelineRecordType {
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Program[] = "Program";
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char EventDispatch[] = "EventDispatch";
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ScheduleStyleRecalculation[] = "ScheduleStyleRecalculation";
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char RecalculateStyles[] = "RecalculateStyles";
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char InvalidateLayout[] = "InvalidateLayout";
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Layout[] = "Layout";
88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static const char UpdateLayerTree[] = "UpdateLayerTree";
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Paint[] = "Paint";
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ScrollLayer[] = "ScrollLayer";
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResizeImage[] = "ResizeImage";
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char CompositeLayers[] = "CompositeLayers";
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ParseHTML[] = "ParseHTML";
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerInstall[] = "TimerInstall";
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerRemove[] = "TimerRemove";
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerFire[] = "TimerFire";
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char EvaluateScript[] = "EvaluateScript";
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char MarkLoad[] = "MarkLoad";
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char MarkDOMContent[] = "MarkDOMContent";
104a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static const char MarkFirstPaint[] = "MarkFirstPaint";
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimeStamp[] = "TimeStamp";
107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static const char ConsoleTime[] = "ConsoleTime";
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceSendRequest[] = "ResourceSendRequest";
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceReceiveResponse[] = "ResourceReceiveResponse";
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceReceivedData[] = "ResourceReceivedData";
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceFinish[] = "ResourceFinish";
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char XHRReadyStateChange[] = "XHRReadyStateChange";
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char XHRLoad[] = "XHRLoad";
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char FunctionCall[] = "FunctionCall";
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char GCEvent[] = "GCEvent";
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochstatic const char UpdateCounters[] = "UpdateCounters";
12110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char RequestAnimationFrame[] = "RequestAnimationFrame";
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char CancelAnimationFrame[] = "CancelAnimationFrame";
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char FireAnimationFrame[] = "FireAnimationFrame";
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketCreate[] = "WebSocketCreate";
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketSendHandshakeRequest[] = "WebSocketSendHandshakeRequest";
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketReceiveHandshakeResponse[] = "WebSocketReceiveHandshakeResponse";
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketDestroy[] = "WebSocketDestroy";
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char RequestMainThreadFrame[] = "RequestMainThreadFrame";
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char ActivateLayerTree[] = "ActivateLayerTree";
13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char DrawFrame[] = "DrawFrame";
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char BeginFrame[] = "BeginFrame";
13509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char DecodeImage[] = "DecodeImage";
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char GPUTask[] = "GPUTask";
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char Rasterize[] = "Rasterize";
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)static const char PaintSetup[] = "PaintSetup";
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static const char EmbedderCallback[] = "EmbedderCallback";
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)using TypeBuilder::Timeline::TimelineEvent;
14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
145c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)class InspectorTimelineAgentTraceEventListener : public TraceEventDispatcher::TraceEventListener {
146c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
147c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    typedef void (InspectorTimelineAgent::*TraceEventHandlerMethod)(const TraceEventDispatcher::TraceEvent&);
148c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    static PassOwnPtrWillBeRawPtr<InspectorTimelineAgentTraceEventListener> create(InspectorTimelineAgent* instance, TraceEventHandlerMethod method)
149c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
150c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return adoptPtrWillBeNoop(new InspectorTimelineAgentTraceEventListener(instance, method));
151c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
152c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void call(const TraceEventDispatcher::TraceEvent& event) OVERRIDE
153c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
154c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        (m_instance->*m_method)(event);
155c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
156c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void* target() OVERRIDE
157c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
158c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        return m_instance;
159c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
160c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    virtual void trace(Visitor* visitor) OVERRIDE
161c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        visitor->trace(m_instance);
163c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        TraceEventDispatcher::TraceEventListener::trace(visitor);
164c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
165c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
166c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)private:
167c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    InspectorTimelineAgentTraceEventListener(InspectorTimelineAgent* instance, TraceEventHandlerMethod method)
168c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        : m_instance(instance)
169c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        , m_method(method)
170c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    {
171c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
172c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<InspectorTimelineAgent> m_instance;
173c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TraceEventHandlerMethod m_method;
174c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)};
175c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
176a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineRecordEntry {
17710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TimelineRecordEntry(PassRefPtr<TimelineEvent> record, PassRefPtr<JSONObject> data, PassRefPtr<TypeBuilder::Array<TimelineEvent> > children, const String& type)
178d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : record(record)
179d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , data(data)
180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , children(children)
181d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , type(type)
182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        , skipWhenUnbalanced(false)
183a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<TimelineEvent> record;
186a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data;
18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<TypeBuilder::Array<TimelineEvent> > children;
188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String type;
189d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool skipWhenUnbalanced;
190a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
192a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class TimelineRecordStack {
193c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    DISALLOW_ALLOCATION();
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)private:
195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    struct Entry {
19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        Entry(PassRefPtr<TimelineEvent> record, const String& type)
197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            : record(record)
19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            , children(TypeBuilder::Array<TimelineEvent>::create())
199197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            , type(type)
20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
203a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
204a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RefPtr<TimelineEvent> record;
20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        RefPtr<TypeBuilder::Array<TimelineEvent> > children;
207197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        String type;
20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#endif
210a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    };
211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
212a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)public:
213c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    TimelineRecordStack() : m_timelineAgent(nullptr) { }
214c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    explicit TimelineRecordStack(InspectorTimelineAgent*);
215a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void addScopedRecord(PassRefPtr<TimelineEvent> record, const String& type);
217a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void closeScopedRecord(double endTime);
21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    void addInstantRecord(PassRefPtr<TimelineEvent> record);
219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
220197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
221a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool isOpenRecordOfType(const String& type);
222a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#endif
223a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
224c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
225c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
226a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)private:
227a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void send(PassRefPtr<JSONObject>);
228a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
229c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    RawPtrWillBeMember<InspectorTimelineAgent> m_timelineAgent;
230a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Vector<Entry> m_stack;
231a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
232a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
233a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineThreadState {
234c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    ALLOW_ONLY_INLINE_ALLOCATION();
235c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)public:
236a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState() { }
237a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
238a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState(InspectorTimelineAgent* timelineAgent)
239a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        : recordStack(timelineAgent)
240a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        , inKnownLayerTask(false)
241a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        , decodedPixelRefId(0)
242a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
243a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
244a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void trace(Visitor*);
246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
247a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordStack recordStack;
248a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool inKnownLayerTask;
249a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long decodedPixelRefId;
250a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
251a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
252a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineImageInfo {
253a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    int backendNodeId;
254a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String url;
255a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
256a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo() : backendNodeId(0) { }
257a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo(int backendNodeId, String url) : backendNodeId(backendNodeId), url(url) { }
258a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
259a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static LocalFrame* frameForExecutionContext(ExecutionContext* context)
26153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
262d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = 0;
26353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (context->isDocument())
26453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        frame = toDocument(context)->frame();
26553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return frame;
26653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
26876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)static bool eventHasListeners(const AtomicString& eventType, LocalDOMWindow* window, Node* node, const EventPath& eventPath)
26953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
27053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (window && window->hasEventListeners(eventType))
27153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
27253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
27353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (node->hasEventListeners(eventType))
27453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
27553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
27653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (size_t i = 0; i < eventPath.size(); i++) {
277bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (eventPath[i].node()->hasEventListeners(eventType))
27853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return true;
27953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
28053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
28153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return false;
28253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
28353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t collectedBytesCount)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2866f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(
2876f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        startTime * msPerSecond,
2886f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        0,
2896f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        TimelineRecordType::GCEvent,
2906f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        TimelineRecordFactory::createGCEventData(collectedBytesCount));
2916f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    record->setEndTime(endTime * msPerSecond);
29210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    double time = timestamp();
29310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    addRecordToTimeline(record.release(), time);
29410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_state->getBoolean(TimelineAgentState::includeCounters)) {
29510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        addRecordToTimeline(createCountersUpdate(), time);
29610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    }
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorTimelineAgent::~InspectorTimelineAgent()
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
303c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InspectorTimelineAgent::trace(Visitor* visitor)
304c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
305c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_pageAgent);
306c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_layerTreeAgent);
307c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#if ENABLE(OILPAN)
308c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_threadStates);
309c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#endif
310c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    InspectorBaseAgent::trace(visitor);
311c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
312c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::setFrontend(InspectorFrontend* frontend)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = frontend->timeline();
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::clearFrontend()
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ErrorString error;
321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    stop(&error);
3229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    disable(&error);
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = 0;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::restore()
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (m_state->getBoolean(TimelineAgentState::startedFromProtocol)) {
32906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::bufferEvents))
33009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
33107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
33207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        setLiveEvents(m_state->getString(TimelineAgentState::liveEvents));
3339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStart();
3349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    } else if (isStarted()) {
3359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        // Timeline was started from console.timeline, it is not restored.
3369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        // Tell front-end timline is no longer collecting.
3379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_state->setBoolean(TimelineAgentState::started, false);
3389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        bool fromConsole = true;
339c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_frontend->stopped(&fromConsole, nullptr);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::enable(ErrorString*)
3449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::enabled, true);
3469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::disable(ErrorString*)
3499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::enabled, false);
3519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
35307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid InspectorTimelineAgent::start(ErrorString* errorString, const int* maxCallStackDepth, const bool* bufferEvents, const String* liveEvents, const bool* includeCounters, const bool* includeGPUEvents)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frontend)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::startedFromProtocol, true);
3589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (isStarted()) {
3609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        *errorString = "Timeline is already started";
3619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
3629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
36453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (maxCallStackDepth && *maxCallStackDepth >= 0)
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_maxCallStackDepth = *maxCallStackDepth;
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_maxCallStackDepth = 5;
36806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
369c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (asBool(bufferEvents)) {
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
37107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_lastProgressTimestamp = timestamp();
37207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
37307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
37407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (liveEvents)
37507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        setLiveEvents(*liveEvents);
37606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallStackDepth);
378c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::includeCounters, asBool(includeCounters));
379c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::includeGPUEvents, asBool(includeGPUEvents));
380c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::bufferEvents, asBool(bufferEvents));
38107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_state->setString(TimelineAgentState::liveEvents, liveEvents ? *liveEvents : "");
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    innerStart();
3849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool fromConsole = false;
3859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_frontend->started(&fromConsole);
3869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool InspectorTimelineAgent::isStarted()
3899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return m_state->getBoolean(TimelineAgentState::started);
3919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::innerStart()
3949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
39551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_overlay)
39651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_overlay->startedRecordingProfile();
3979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::started, true);
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorTimelineAgent(this);
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::addEventListener(this);
400a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_client) {
401a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        TraceEventDispatcher* dispatcher = TraceEventDispatcher::instance();
402c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::BeginFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onBeginImplSideFrame), m_client);
403c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onPaintSetupBegin), m_client);
404c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onPaintSetupEnd), m_client);
405c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRasterTaskBegin), m_client);
406c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRasterTaskEnd), m_client);
407c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::Layer, TRACE_EVENT_PHASE_DELETE_OBJECT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onLayerDeleted), m_client);
408c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::RequestMainThreadFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onRequestMainThreadFrame), m_client);
409c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::ActivateLayerTree, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onActivateLayerTree), m_client);
410c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::DrawFrame, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDrawFrame), m_client);
411c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onImageDecodeBegin), m_client);
412c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onImageDecodeEnd), m_client);
413c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DrawLazyPixelRefEvent, TRACE_EVENT_PHASE_INSTANT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDrawLazyPixelRef), m_client);
414c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDecodeLazyPixelRefBegin), m_client);
415c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onDecodeLazyPixelRefEnd), m_client);
416c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::LazyPixelRef, TRACE_EVENT_PHASE_DELETE_OBJECT, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onLazyPixelRefDeleted), m_client);
417c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_BEGIN, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onEmbedderCallbackBegin), m_client);
418c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::EmbedderCallback, TRACE_EVENT_PHASE_END, InspectorTimelineAgentTraceEventListener::create(this, &InspectorTimelineAgent::onEmbedderCallbackEnd), m_client);
419a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
42051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::includeGPUEvents)) {
42151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            m_pendingGPURecord.clear();
42251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            m_client->startGPUEventsRecording();
42351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
42451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
427c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void InspectorTimelineAgent::stop(ErrorString* errorString)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::startedFromProtocol, false);
43006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::bufferEvents, false);
43107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_state->setString(TimelineAgentState::liveEvents, "");
43206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
4339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!isStarted()) {
4349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        *errorString = "Timeline was not started";
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
4369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    innerStop(false);
43807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_liveEvents.clear();
4399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
4409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::innerStop(bool fromConsole)
4429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
4439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::started, false);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_client) {
446a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        TraceEventDispatcher::instance()->removeAllListeners(this, m_client);
447a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::includeGPUEvents))
448a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            m_client->stopGPUEventsRecording();
449e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorTimelineAgent(0);
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::removeEventListener(this);
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearRecordStack();
454a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_threadStates.clear();
455a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_gpuTask.clear();
456a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_layerToNodeMap.clear();
457a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.clear();
458a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_imageBeingPainted = 0;
459a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupStart = 0;
460a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_mayEmitFirstPaint = false;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    for (size_t i = 0; i < m_consoleTimelines.size(); ++i) {
4639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        String message = String::format("Timeline '%s' terminated.", m_consoleTimelines[i].utf8().data());
464e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        mainFrame()->console().addMessage(ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message));
4659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.clear();
4679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
468c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    m_frontend->stopped(&fromConsole, m_bufferedEvents.release());
46951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_overlay)
47051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_overlay->finishedRecordingProfile();
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void InspectorTimelineAgent::didBeginFrame(int frameId)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TraceEventDispatcher::instance()->processBackgroundEvents();
47609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_pendingFrameRecord = TimelineRecordFactory::createGenericRecord(timestamp(), 0, TimelineRecordType::BeginFrame, TimelineRecordFactory::createFrameData(frameId));
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCancelFrame()
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pendingFrameRecord.clear();
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
484aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdochbool InspectorTimelineAgent::willCallFunction(ExecutionContext* context, int scriptId, const String& scriptName, int scriptLine)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
486aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    pushCurrentRecord(TimelineRecordFactory::createFunctionCallData(scriptId, scriptName, scriptLine), TimelineRecordType::FunctionCall, true, frameForExecutionContext(context));
48753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCallFunction()
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::FunctionCall);
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
49576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchEvent(Document* document, const Event& event, LocalDOMWindow* window, Node* node, const EventPath& eventPath)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
49753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!eventHasListeners(event.type(), window, node, eventPath))
498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return false;
49953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
50053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEventDispatchData(event), TimelineRecordType::EventDispatch, false, document->frame());
50153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
50253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
50353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
50476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchEventOnWindow(const Event& event, LocalDOMWindow* window)
50553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
50653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!window->hasEventListeners(event.type()))
50753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
50853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEventDispatchData(event), TimelineRecordType::EventDispatch, false, window->frame());
50953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchEvent()
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::EventDispatch);
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didDispatchEventOnWindow()
51853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
51953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    didDispatchEvent();
52053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
52153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
522d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::didInvalidateLayout(LocalFrame* frame)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
524591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    appendRecord(JSONObject::create(), TimelineRecordType::InvalidateLayout, true, frame);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
527d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool InspectorTimelineAgent::willLayout(LocalFrame* frame)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
52909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool isPartial;
53009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned needsLayoutObjects;
53109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned totalObjects;
53209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    frame->countObjectsNeedingLayout(needsLayoutObjects, totalObjects, isPartial);
53353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
53409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createLayoutData(needsLayoutObjects, totalObjects, isPartial), TimelineRecordType::Layout, true, frame);
53553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didLayout(RenderObject* root)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_recordStack.isEmpty())
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
54253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::Layout);
54453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Vector<FloatQuad> quads;
54553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    root->absoluteQuads(quads);
54653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (quads.size() >= 1)
54709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        TimelineRecordFactory::setLayoutRoot(entry.data.get(), quads[0], nodeId(root));
54853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    else
54953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ASSERT_NOT_REACHED();
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Layout);
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::layerTreeDidChange()
554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
55510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT(!m_pendingLayerTreeData);
556323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    m_pendingLayerTreeData = m_layerTreeAgent->buildLayerTree();
55710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
55810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
55910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid InspectorTimelineAgent::willUpdateLayerTree()
56010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
56110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::UpdateLayerTree, false, 0);
56210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch}
56310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
56410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochvoid InspectorTimelineAgent::didUpdateLayerTree()
56510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch{
56610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_recordStack.isEmpty())
56710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        return;
56810f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    TimelineRecordEntry& entry = m_recordStack.last();
56910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    ASSERT(entry.type == TimelineRecordType::UpdateLayerTree);
57010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    if (m_pendingLayerTreeData)
57110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        TimelineRecordFactory::setLayerTreeData(entry.data.get(), m_pendingLayerTreeData.release());
57210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    didCompleteCurrentRecord(TimelineRecordType::UpdateLayerTree);
573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
57553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didScheduleStyleRecalculation(Document* document)
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
577591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    appendRecord(JSONObject::create(), TimelineRecordType::ScheduleStyleRecalculation, true, document->frame());
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willRecalculateStyle(Document* document)
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
582591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::RecalculateStyles, true, document->frame());
58353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
586f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid InspectorTimelineAgent::didRecalculateStyle(int elementCount)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
58853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_recordStack.isEmpty())
58953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
59053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
59153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::RecalculateStyles);
592f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    TimelineRecordFactory::setStyleRecalcDetails(entry.data.get(), elementCount);
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::RecalculateStyles);
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
596a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::willPaint(RenderObject* renderer, const GraphicsLayer* graphicsLayer)
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
598d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = renderer->frame();
59993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
600a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TraceEventDispatcher::instance()->processBackgroundEvents();
601a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double paintSetupStart = m_paintSetupStart;
602a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupStart = 0;
603a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (graphicsLayer) {
604a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        int layerIdentifier = graphicsLayer->platformLayer()->id();
605a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        int nodeIdentifier = nodeId(renderer);
606a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(layerIdentifier && nodeIdentifier);
607a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_layerToNodeMap.set(layerIdentifier, nodeIdentifier);
608a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (paintSetupStart) {
60909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            RefPtr<TimelineEvent> paintSetupRecord = TimelineRecordFactory::createGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup, TimelineRecordFactory::createLayerData(nodeIdentifier));
61009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            paintSetupRecord->setEndTime(m_paintSetupEnd);
61107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            addRecordToTimeline(paintSetupRecord, paintSetupStart);
612a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
613a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
614591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, frame, true);
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLayer* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect)
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
61953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::Paint);
62153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FloatQuad quad;
62253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    localToPageQuad(*renderer, clipRect, &quad);
62351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int graphicsLayerId = graphicsLayer ? graphicsLayer->platformLayer()->id() : 0;
62409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TimelineRecordFactory::setPaintData(entry.data.get(), quad, nodeId(renderer), graphicsLayerId);
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Paint);
626a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_mayEmitFirstPaint && !graphicsLayer) {
627a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = false;
628a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        appendRecord(JSONObject::create(), TimelineRecordType::MarkFirstPaint, false, 0);
629a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6328abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::willPaintImage(RenderImage* renderImage)
6338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
6348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(!m_imageBeingPainted);
6358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_imageBeingPainted = renderImage;
6368abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
6378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
6388abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::didPaintImage()
6398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
6408abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_imageBeingPainted = 0;
6418abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
6428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
6437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorTimelineAgent::willScrollLayer(RenderObject* renderer)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createLayerData(nodeId(renderer)), TimelineRecordType::ScrollLayer, false, renderer->frame());
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didScrollLayer()
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ScrollLayer);
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willDecodeImage(const String& imageType)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createDecodeImageData(imageType);
6568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_imageBeingPainted)
6578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        populateImageDetails(data.get(), *m_imageBeingPainted);
6588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    pushCurrentRecord(data, TimelineRecordType::DecodeImage, true, 0);
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDecodeImage()
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::DecodeImage);
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willResizeImage(bool shouldCache)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createResizeImageData(shouldCache);
6698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_imageBeingPainted)
6708abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        populateImageDetails(data.get(), *m_imageBeingPainted);
6718abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    pushCurrentRecord(data, TimelineRecordType::ResizeImage, true, 0);
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didResizeImage()
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ResizeImage);
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willComposite()
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
681591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::CompositeLayers, false, 0);
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didComposite()
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::CompositeLayers);
687a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_mayEmitFirstPaint) {
688a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = false;
689a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        appendRecord(JSONObject::create(), TimelineRecordType::MarkFirstPaint, false, 0);
690a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willWriteHTML(Document* document, unsigned startLine)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
69553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createParseHTMLData(startLine), TimelineRecordType::ParseHTML, true, document->frame());
69653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
699926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorTimelineAgent::didWriteHTML(unsigned endLine)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_recordStack.isEmpty()) {
70209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        TimelineRecordEntry& entry = m_recordStack.last();
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry.data->setNumber("endLine", endLine);
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didCompleteCurrentRecord(TimelineRecordType::ParseHTML);
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7081e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::didInstallTimer(ExecutionContext* context, int timerId, int timeout, bool singleShot)
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimerInstallData(timerId, timeout, singleShot), TimelineRecordType::TimerInstall, true, frameForExecutionContext(context));
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7131e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::didRemoveTimer(ExecutionContext* context, int timerId)
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimelineRecordType::TimerRemove, true, frameForExecutionContext(context));
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willFireTimer(ExecutionContext* context, int timerId)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7201e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimelineRecordType::TimerFire, false, frameForExecutionContext(context));
72153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didFireTimer()
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::TimerFire);
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchXHRReadyStateChangeEvent(ExecutionContext* context, XMLHttpRequest* request)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!request->hasEventListeners(EventTypeNames::readystatechange))
73253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
7331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createXHRReadyStateChangeData(request->url().string(), request->readyState()), TimelineRecordType::XHRReadyStateChange, false, frameForExecutionContext(context));
73453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchXHRReadyStateChangeEvent()
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::XHRReadyStateChange);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchXHRLoadEvent(ExecutionContext* context, XMLHttpRequest* request)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!request->hasEventListeners(EventTypeNames::load))
74553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
7461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createXHRLoadData(request->url().string()), TimelineRecordType::XHRLoad, true, frameForExecutionContext(context));
74753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchXHRLoadEvent()
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::XHRLoad);
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool InspectorTimelineAgent::willEvaluateScript(LocalFrame* frame, const String& url, int lineNumber)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEvaluateScriptData(url, lineNumber), TimelineRecordType::EvaluateScript, true, frame);
75853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didEvaluateScript()
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::EvaluateScript);
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
766fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid InspectorTimelineAgent::willSendRequest(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request, const ResourceResponse&, const FetchInitiatorInfo&)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
76953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createResourceSendRequestData(requestId, request), TimelineRecordType::ResourceSendRequest, true, loader->frame());
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
77207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid InspectorTimelineAgent::didReceiveData(LocalFrame* frame, unsigned long identifier, const char*, int, int encodedDataLength)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
77507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    appendRecord(TimelineRecordFactory::createReceiveResourceData(requestId, encodedDataLength), TimelineRecordType::ResourceReceivedData, false, frame);
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
778d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::didReceiveResourceResponse(LocalFrame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
78109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    appendRecord(TimelineRecordFactory::createResourceReceiveResponseData(requestId, response), TimelineRecordType::ResourceReceiveResponse, false, 0);
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::didFinishLoadingResource(unsigned long identifier, bool didFail, double finishTime)
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
786aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    appendRecord(TimelineRecordFactory::createResourceFinishData(IdentifiersFactory::requestId(identifier), didFail, finishTime), TimelineRecordType::ResourceFinish, false, 0);
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::didFinishLoading(unsigned long identifier, DocumentLoader* loader, double monotonicFinishTime, int64_t)
79093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
791aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    didFinishLoadingResource(identifier, false, monotonicFinishTime * msPerSecond);
79293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
79393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
79409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::didFailLoading(unsigned long identifier, const ResourceError& error)
79553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
79609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    didFinishLoadingResource(identifier, true, 0);
79753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
79853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimeStamp(ExecutionContext* context, const String& title)
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(title), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTime(ExecutionContext* context, const String& message)
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
806d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createConsoleTimeData(message), TimelineRecordType::ConsoleTime, false, frameForExecutionContext(context));
807d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_recordStack.last().skipWhenUnbalanced = true;
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8101e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimeEnd(ExecutionContext* context, const String& message, ScriptState*)
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
812d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_recordStack.last().type != TimelineRecordType::ConsoleTime)
813d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
814d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    String originalMessage;
815d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_recordStack.last().data->getString("message", &originalMessage) && message != originalMessage)
816d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
817d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // Only complete console.time that is balanced.
818d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ConsoleTime);
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
821f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid InspectorTimelineAgent::consoleTimeline(ExecutionContext* context, const String& title, ScriptState* scriptState)
8229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
8239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!m_state->getBoolean(TimelineAgentState::enabled))
8249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
8259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String message = String::format("Timeline '%s' started.", title.utf8().data());
827197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
828e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
829e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    consoleMessage->setScriptState(scriptState);
830e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    mainFrame()->console().addMessage(consoleMessage.release());
8319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.append(title);
8329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!isStarted()) {
833c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_state->setBoolean(TimelineAgentState::bufferEvents, true);
834c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        m_bufferedEvents = TypeBuilder::Array<TimelineEvent>::create();
835c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
8369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStart();
8379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        bool fromConsole = true;
8389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_frontend->started(&fromConsole);
8399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
8401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
8419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
8429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
843f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid InspectorTimelineAgent::consoleTimelineEnd(ExecutionContext* context, const String& title, ScriptState* scriptState)
8449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
8459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!m_state->getBoolean(TimelineAgentState::enabled))
8469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
8479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    size_t index = m_consoleTimelines.find(title);
84906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (index == kNotFound) {
8509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        String message = String::format("Timeline '%s' was not started.", title.utf8().data());
851e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
852e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        consoleMessage->setScriptState(scriptState);
853e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        mainFrame()->console().addMessage(consoleMessage.release());
8549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
8559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
8569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String message = String::format("Timeline '%s' finished.", title.utf8().data());
8581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
8599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.remove(index);
86051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_consoleTimelines.size() && isStarted() && !m_state->getBoolean(TimelineAgentState::startedFromProtocol)) {
86151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        unwindRecordStack();
8629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStop(true);
86351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
864e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(JSMessageSource, DebugMessageLevel, message);
865e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    consoleMessage->setScriptState(scriptState);
866e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    mainFrame()->console().addMessage(consoleMessage.release());
8679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
868c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
869d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::domContentLoadedEventFired(LocalFrame* frame)
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
871926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame());
872926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRecordType::MarkDOMContent, false, frame);
873a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (isMainFrame)
874a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = true;
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
877d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::loadEventFired(LocalFrame* frame)
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame());
880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRecordType::MarkLoad, false, frame);
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCommitLoad()
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearRecordStack();
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didRequestAnimationFrame(Document* document, int callbackId)
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::RequestAnimationFrame, true, document->frame());
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCancelAnimationFrame(Document* document, int callbackId)
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::CancelAnimationFrame, true, document->frame());
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
89853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willFireAnimationFrame(Document* document, int callbackId)
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
90053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::FireAnimationFrame, false, document->frame());
90153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didFireAnimationFrame()
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::FireAnimationFrame);
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willProcessTask()
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
911591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::Program, false, 0);
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didProcessTask()
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Program);
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
91953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCreateWebSocket(Document* document, unsigned long identifier, const KURL& url, const String& protocol)
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
92153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createWebSocketCreateData(identifier, url, protocol), TimelineRecordType::WebSocketCreate, true, document->frame());
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
924d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::willSendWebSocketHandshakeRequest(Document* document, unsigned long identifier, const WebSocketHandshakeRequest*)
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
92653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketSendHandshakeRequest, true, document->frame());
927926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
929d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::didReceiveWebSocketHandshakeResponse(Document* document, unsigned long identifier, const WebSocketHandshakeRequest*, const WebSocketHandshakeResponse*)
930926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
93153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketReceiveHandshakeResponse, false, document->frame());
932926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
933926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
93453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCloseWebSocket(Document* document, unsigned long identifier)
935926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
93653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketDestroy, true, document->frame());
937926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
938926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
939a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onBeginImplSideFrame(const TraceEventDispatcher::TraceEvent& event)
940a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
941a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
942a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
943a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
944a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
94509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::BeginFrame, JSONObject::create()));
946a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
947a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
948a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onPaintSetupBegin(const TraceEventDispatcher::TraceEvent& event)
949a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
950a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!m_paintSetupStart);
951aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    m_paintSetupStart = event.timestamp() * msPerSecond;
952a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
953a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
954a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onPaintSetupEnd(const TraceEventDispatcher::TraceEvent& event)
955a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
956a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(m_paintSetupStart);
957aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    m_paintSetupEnd = event.timestamp() * msPerSecond;
958a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
959a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
960a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onRasterTaskBegin(const TraceEventDispatcher::TraceEvent& event)
961a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
962a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
963a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerId = event.asUInt(InstrumentationEventArguments::LayerId);
964a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(layerId);
965a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_layerToNodeMap.contains(layerId))
966a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
967a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!state.inKnownLayerTask);
968a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.inKnownLayerTask = true;
969aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double timestamp = event.timestamp() * msPerSecond;
970a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createLayerData(m_layerToNodeMap.get(layerId));
97109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<TimelineEvent> record = TimelineRecordFactory::createBackgroundRecord(timestamp, String::number(event.threadIdentifier()), TimelineRecordType::Rasterize, data);
97209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    state.recordStack.addScopedRecord(record, TimelineRecordType::Rasterize);
973a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
974a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
975a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onRasterTaskEnd(const TraceEventDispatcher::TraceEvent& event)
976a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
977a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
978a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.inKnownLayerTask)
979a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
980a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(state.recordStack.isOpenRecordOfType(TimelineRecordType::Rasterize));
981aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    state.recordStack.closeScopedRecord(event.timestamp() * msPerSecond);
982a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.inKnownLayerTask = false;
983a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
984a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
985a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onImageDecodeBegin(const TraceEventDispatcher::TraceEvent& event)
986a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
987a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
988a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.decodedPixelRefId && !state.inKnownLayerTask)
989a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
990a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo imageInfo;
991a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (state.decodedPixelRefId) {
992a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        PixelRefToImageInfoMap::const_iterator it = m_pixelRefToImageInfo.find(state.decodedPixelRefId);
993a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (it != m_pixelRefToImageInfo.end())
994a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            imageInfo = it->value;
995a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        else
996a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            ASSERT_NOT_REACHED();
997a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
998a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data = JSONObject::create();
99909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TimelineRecordFactory::setImageDetails(data.get(), imageInfo.backendNodeId, imageInfo.url);
1000aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double timeestamp = event.timestamp() * msPerSecond;
100109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    state.recordStack.addScopedRecord(TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), TimelineRecordType::DecodeImage, data), TimelineRecordType::DecodeImage);
1002a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1003a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1004a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onImageDecodeEnd(const TraceEventDispatcher::TraceEvent& event)
1005a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1006a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
1007a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.decodedPixelRefId)
1008a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1009a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(state.recordStack.isOpenRecordOfType(TimelineRecordType::DecodeImage));
1010aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    state.recordStack.closeScopedRecord(event.timestamp() * msPerSecond);
1011a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1012a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
101309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::onRequestMainThreadFrame(const TraceEventDispatcher::TraceEvent& event)
101409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
101509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
101609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
101709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
101809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
101909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::RequestMainThreadFrame, JSONObject::create()));
102009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
102109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1022a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onActivateLayerTree(const TraceEventDispatcher::TraceEvent& event)
1023a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1024a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
1025a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
1026a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1027a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long frameId = event.asUInt(InstrumentationEventArguments::FrameId);
1028a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
1029a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::ActivateLayerTree, TimelineRecordFactory::createFrameData(frameId)));
1030a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1031a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
103209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::onDrawFrame(const TraceEventDispatcher::TraceEvent& event)
103309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
103409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
103509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
103609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
103709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
103809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::DrawFrame, JSONObject::create()));
103909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
104009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1041a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onLayerDeleted(const TraceEventDispatcher::TraceEvent& event)
1042a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1043a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long id = event.id();
1044a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(id);
1045a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_layerToNodeMap.remove(id);
1046a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1047a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1048a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDecodeLazyPixelRefBegin(const TraceEventDispatcher::TraceEvent& event)
1049a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1050a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
1051a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!state.decodedPixelRefId);
1052a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long pixelRefId = event.asUInt(PlatformInstrumentation::LazyPixelRef);
1053a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(pixelRefId);
1054a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_pixelRefToImageInfo.contains(pixelRefId))
1055a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        state.decodedPixelRefId = pixelRefId;
1056a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1057a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1058a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDecodeLazyPixelRefEnd(const TraceEventDispatcher::TraceEvent& event)
1059a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1060a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    threadState(event.threadIdentifier()).decodedPixelRefId = 0;
1061a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1062a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1063a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDrawLazyPixelRef(const TraceEventDispatcher::TraceEvent& event)
1064a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1065a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long pixelRefId = event.asUInt(PlatformInstrumentation::LazyPixelRef);
1066a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(pixelRefId);
1067a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_imageBeingPainted)
1068a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1069a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String url;
1070a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (const ImageResource* resource = m_imageBeingPainted->cachedImage())
1071a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        url = resource->url().string();
1072a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.set(pixelRefId, TimelineImageInfo(nodeId(m_imageBeingPainted->generatingNode()), url));
1073a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1074a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1075a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onLazyPixelRefDeleted(const TraceEventDispatcher::TraceEvent& event)
1076a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1077a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.remove(event.id());
1078a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1079a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
108051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::processGPUEvent(const GPUEvent& event)
108151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
1082aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double timelineTimestamp = event.timestamp * msPerSecond;
108351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (event.phase == GPUEvent::PhaseBegin) {
108409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_pendingGPURecord = TimelineRecordFactory::createBackgroundRecord(timelineTimestamp, "gpu", TimelineRecordType::GPUTask, TimelineRecordFactory::createGPUTaskData(event.foreign));
108551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else if (m_pendingGPURecord) {
108609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_pendingGPURecord->setEndTime(timelineTimestamp);
108710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        sendEvent(m_pendingGPURecord.release());
108809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!event.foreign && m_state->getBoolean(TimelineAgentState::includeCounters)) {
108909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            RefPtr<TypeBuilder::Timeline::Counters> counters = TypeBuilder::Timeline::Counters::create();
109009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            counters->setGpuMemoryUsedKB(static_cast<double>(event.usedGPUMemoryBytes / 1024));
1091a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch            counters->setGpuMemoryLimitKB(static_cast<double>(event.limitGPUMemoryBytes / 1024));
109210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            sendEvent(TimelineRecordFactory::createBackgroundRecord(timelineTimestamp, "gpu", TimelineRecordType::UpdateCounters, counters.release()->asObject()));
109309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        }
109451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
109551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
109651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1097d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::onEmbedderCallbackBegin(const TraceEventDispatcher::TraceEvent& event)
1098d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1099d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
1100aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double timestamp = event.timestamp() * msPerSecond;
1101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createEmbedderCallbackData(event.asString(InstrumentationEventArguments::CallbackName));
1102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(timestamp, 0, TimelineRecordType::EmbedderCallback, data);
1103d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    state.recordStack.addScopedRecord(record, TimelineRecordType::EmbedderCallback);
1104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1106d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::onEmbedderCallbackEnd(const TraceEventDispatcher::TraceEvent& event)
1107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
1108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
1109aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    state.recordStack.closeScopedRecord(event.timestamp() * msPerSecond);
1110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
1111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
111207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<TimelineEvent> record, double ts)
1113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    commitFrameRecord();
111593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    innerAddRecordToTimeline(record);
111607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_bufferedEvents && ts - m_lastProgressTimestamp > 300) {
111707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_lastProgressTimestamp = ts;
111807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_frontend->progress(m_bufferedEvents->length());
111907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
1120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
112209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<TimelineEvent> record)
1123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
112493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (m_recordStack.isEmpty()) {
112509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        TraceEventDispatcher::instance()->processBackgroundEvents();
112609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        sendEvent(record);
112793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else {
112809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        TimelineRecordEntry& parent = m_recordStack.last();
112909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        parent.children->addItem(record);
113010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (m_state->getBoolean(TimelineAgentState::includeCounters))
113110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch            parent.children->addItem(createCountersUpdate());
11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static size_t getUsedHeapSize()
11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HeapInfo info;
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::getHeapSize(info);
11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return info.usedJSHeapSize;
11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
114210f88d5669dbd969c059d61ba09fa37dd72ac559Ben MurdochPassRefPtr<TypeBuilder::Timeline::TimelineEvent> InspectorTimelineAgent::createCountersUpdate()
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
114409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<TypeBuilder::Timeline::Counters> counters = TypeBuilder::Timeline::Counters::create();
114509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_inspectorType == PageInspector) {
114609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        counters->setDocuments(InspectorCounters::counterValue(InspectorCounters::DocumentCounter));
114709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        counters->setNodes(InspectorCounters::counterValue(InspectorCounters::NodeCounter));
114809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        counters->setJsEventListeners(InspectorCounters::counterValue(InspectorCounters::JSEventListenerCounter));
11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
115009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    counters->setJsHeapSizeUsed(static_cast<double>(getUsedHeapSize()));
115110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    return TimelineRecordFactory::createGenericRecord(timestamp(), 0, TimelineRecordType::UpdateCounters, counters.release()->asObject());
11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1154d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::setFrameIdentifier(TimelineEvent* record, LocalFrame* frame)
1155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frame || !m_pageAgent)
1157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String frameId;
1159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (frame && m_pageAgent)
1160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameId = m_pageAgent->frameId(frame);
116109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    record->setFrameId(frameId);
1162926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
11648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::populateImageDetails(JSONObject* data, const RenderImage& renderImage)
11658abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
11668abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const ImageResource* resource = renderImage.cachedImage();
116709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    TimelineRecordFactory::setImageDetails(data, nodeId(renderImage.generatingNode()), resource ? resource->url().string() : "");
11688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
11698abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
11705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCompleteCurrentRecord(const String& type)
11715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // An empty stack could merely mean that the timeline agent was turned on in the middle of
1173d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // an event. Don't treat as an error.
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_recordStack.isEmpty()) {
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_platformInstrumentationClientInstalledAtStackDepth == m_recordStack.size()) {
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_platformInstrumentationClientInstalledAtStackDepth = 0;
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            PlatformInstrumentation::setClient(0);
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TimelineRecordEntry entry = m_recordStack.last();
11815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_recordStack.removeLast();
1182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        while (entry.type != type && entry.skipWhenUnbalanced && !m_recordStack.isEmpty()) {
1183d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            // Discard pending skippable entry, paste its children inplace.
1184d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            if (entry.children)
1185d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)                m_recordStack.last().children->concat(entry.children);
1186d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            entry = m_recordStack.last();
1187d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            m_recordStack.removeLast();
1188d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        }
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(entry.type == type);
119009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        entry.record->setChildren(entry.children);
119107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        double ts = timestamp();
119207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        entry.record->setEndTime(ts);
119307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        addRecordToTimeline(entry.record, ts);
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::unwindRecordStack()
119851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
119951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (!m_recordStack.isEmpty()) {
120051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        TimelineRecordEntry& entry = m_recordStack.last();
120151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didCompleteCurrentRecord(entry.type);
120251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
120351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
120451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1205323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)InspectorTimelineAgent::InspectorTimelineAgent(InspectorPageAgent* pageAgent, InspectorLayerTreeAgent* layerTreeAgent,
1206d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    InspectorOverlay* overlay, InspectorType type, InspectorClient* client)
120709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : InspectorBaseAgent<InspectorTimelineAgent>("Timeline")
12085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pageAgent(pageAgent)
1209d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_layerTreeAgent(layerTreeAgent)
12105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frontend(0)
1211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_client(client)
1212a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_overlay(overlay)
1213a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_inspectorType(type)
12145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_id(1)
1215a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_layerTreeId(0)
12165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxCallStackDepth(5)
12175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_platformInstrumentationClientInstalledAtStackDepth(0)
12188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    , m_imageBeingPainted(0)
1219a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_paintSetupStart(0)
1220a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_mayEmitFirstPaint(false)
122107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    , m_lastProgressTimestamp(0)
12225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const String& type, bool captureCallStack, LocalFrame* frame)
12265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
122707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    double ts = timestamp();
122807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(ts, captureCallStack ? m_maxCallStackDepth : 0, type, data);
1229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFrameIdentifier(record.get(), frame);
123007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    addRecordToTimeline(record.release(), ts);
1231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
123309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void InspectorTimelineAgent::sendEvent(PassRefPtr<TimelineEvent> record)
1234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
123507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    RefPtr<TimelineEvent> retain = record;
123607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (m_bufferedEvents) {
123707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_bufferedEvents->addItem(retain);
123807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (!m_liveEvents.contains(TimelineRecordFactory::type(retain.get())))
123907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            return;
124007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
124107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_frontend->eventRecorded(retain.release());
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void InspectorTimelineAgent::pushCurrentRecord(PassRefPtr<JSONObject> data, const String& type, bool captureCallStack, LocalFrame* frame, bool hasLowLevelDetails)
12455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    commitFrameRecord();
124709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    RefPtr<TimelineEvent> record = TimelineRecordFactory::createGenericRecord(timestamp(), captureCallStack ? m_maxCallStackDepth : 0, type, data.get());
1248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFrameIdentifier(record.get(), frame);
124910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    m_recordStack.append(TimelineRecordEntry(record.release(), data, TypeBuilder::Array<TimelineEvent>::create(), type));
12505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasLowLevelDetails && !m_platformInstrumentationClientInstalledAtStackDepth && !PlatformInstrumentation::hasClient()) {
12515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_platformInstrumentationClientInstalledAtStackDepth = m_recordStack.size();
12525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformInstrumentation::setClient(this);
12535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1256a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TimelineThreadState& InspectorTimelineAgent::threadState(ThreadIdentifier thread)
1257a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1258a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ThreadStateMap::iterator it = m_threadStates.find(thread);
1259a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (it != m_threadStates.end())
1260a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return it->value;
126109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_threadStates.add(thread, TimelineThreadState(this)).storedValue->value;
1262a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1263a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
12645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::commitFrameRecord()
12655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_pendingFrameRecord)
12675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
126893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    innerAddRecordToTimeline(m_pendingFrameRecord.release());
12695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::clearRecordStack()
12725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_platformInstrumentationClientInstalledAtStackDepth) {
12745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_platformInstrumentationClientInstalledAtStackDepth = 0;
12755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformInstrumentation::setClient(0);
12765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pendingFrameRecord.clear();
12785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_recordStack.clear();
12795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_id++;
12805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::localToPageQuad(const RenderObject& renderer, const LayoutRect& rect, FloatQuad* quad)
128353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
1284d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    LocalFrame* frame = renderer.frame();
128553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FrameView* view = frame->view();
128653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FloatQuad absolute = renderer.localToAbsoluteQuad(FloatQuad(rect));
128753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP1(view->contentsToRootView(roundedIntPoint(absolute.p1())));
128853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP2(view->contentsToRootView(roundedIntPoint(absolute.p2())));
128953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP3(view->contentsToRootView(roundedIntPoint(absolute.p3())));
129053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP4(view->contentsToRootView(roundedIntPoint(absolute.p4())));
129153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
129253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1293bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)long long InspectorTimelineAgent::nodeId(Node* node)
1294e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
1295323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return node ? InspectorNodeIds::idForNode(node)  : 0;
1296e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
1297e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
1298bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)long long InspectorTimelineAgent::nodeId(RenderObject* renderer)
1299bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1300323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    return InspectorNodeIds::idForNode(renderer->generatingNode());
1301e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
1302e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
13038abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)double InspectorTimelineAgent::timestamp()
13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1305aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    return WTF::monotonicallyIncreasingTime() * msPerSecond;
13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13086f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochLocalFrame* InspectorTimelineAgent::mainFrame() const
13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
13106f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    if (!m_pageAgent)
131109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
13126f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    return m_pageAgent->mainFrame();
13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
131509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)PassRefPtr<TimelineEvent> InspectorTimelineAgent::createRecordForEvent(const TraceEventDispatcher::TraceEvent& event, const String& type, PassRefPtr<JSONObject> data)
1316a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1317aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch    double timeestamp = event.timestamp() * msPerSecond;
1318a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), type, data);
1319a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1320a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
132107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochvoid InspectorTimelineAgent::setLiveEvents(const String& liveEvents)
132207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
132307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    m_liveEvents.clear();
132407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    if (liveEvents.isNull() || liveEvents.isEmpty())
132507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        return;
132607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Vector<String> eventList;
1327197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    liveEvents.split(',', eventList);
132807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    for (Vector<String>::iterator it = eventList.begin(); it != eventList.end(); ++it)
132907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_liveEvents.add(*it);
133007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
133107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
1332a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TimelineRecordStack::TimelineRecordStack(InspectorTimelineAgent* timelineAgent)
1333a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    : m_timelineAgent(timelineAgent)
1334a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1335a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1336a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
133709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TimelineRecordStack::addScopedRecord(PassRefPtr<TimelineEvent> record, const String& type)
1338a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
133909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_stack.append(Entry(record, type));
1340a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1341a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1342a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void TimelineRecordStack::closeScopedRecord(double endTime)
1343a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1344a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_stack.isEmpty())
1345a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1346a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Entry last = m_stack.last();
1347a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_stack.removeLast();
134809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    last.record->setEndTime(endTime);
1349a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (last.children->length())
135009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        last.record->setChildren(last.children);
1351a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    addInstantRecord(last.record);
1352a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1353a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
135409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void TimelineRecordStack::addInstantRecord(PassRefPtr<TimelineEvent> record)
1355a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1356a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_stack.isEmpty())
1357a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_timelineAgent->sendEvent(record);
1358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    else
135909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_stack.last().children->addItem(record);
1360a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1361a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1362197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(ASSERT)
1363a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool TimelineRecordStack::isOpenRecordOfType(const String& type)
1364a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
136509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return !m_stack.isEmpty() && m_stack.last().type == type;
1366a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1367a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#endif
1368a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1369c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void TimelineRecordStack::trace(Visitor* visitor)
1370c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1371c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(m_timelineAgent);
1372c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1373c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1374c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void TimelineThreadState::trace(Visitor* visitor)
1375c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
1376c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    visitor->trace(recordStack);
1377c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
1378c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
1379c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1380