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"
35bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/DOMWindow.h"
36bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/Frame.h"
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/frame/FrameView.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/IdentifiersFactory.h"
3951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/inspector/InspectorClient.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorCounters.h"
41e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/inspector/InspectorDOMAgent.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorMemoryAgent.h"
4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/inspector/InspectorOverlay.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorPageAgent.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InspectorState.h"
4753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InstrumentingAgents.h"
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/TimelineRecordFactory.h"
50a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/inspector/TraceEventDispatcher.h"
5153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/loader/DocumentLoader.h"
529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/page/PageConsole.h"
5353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
5453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
5553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/xml/XMLHttpRequest.h"
561e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/DeferredImageDecoder.h"
58a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsLayer.h"
59bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/network/ResourceRequest.h"
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
61591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/CurrentTime.h"
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace TimelineAgentState {
669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char enabled[] = "enabled";
679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char started[] = "started";
689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const char startedFromProtocol[] = "startedFromProtocol";
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char timelineMaxCallStackDepth[] = "timelineMaxCallStackDepth";
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char includeDomCounters[] = "includeDomCounters";
7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static const char includeGPUEvents[] = "includeGPUEvents";
7206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)static const char bufferEvents[] = "bufferEvents";
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Must be kept in sync with WebInspector.TimelineModel.RecordType in TimelineModel.js
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace TimelineRecordType {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Program[] = "Program";
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char EventDispatch[] = "EventDispatch";
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ScheduleStyleRecalculation[] = "ScheduleStyleRecalculation";
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char RecalculateStyles[] = "RecalculateStyles";
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char InvalidateLayout[] = "InvalidateLayout";
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Layout[] = "Layout";
84bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)static const char AutosizeText[] = "AutosizeText";
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Paint[] = "Paint";
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ScrollLayer[] = "ScrollLayer";
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResizeImage[] = "ResizeImage";
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char CompositeLayers[] = "CompositeLayers";
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ParseHTML[] = "ParseHTML";
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerInstall[] = "TimerInstall";
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerRemove[] = "TimerRemove";
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimerFire[] = "TimerFire";
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char EvaluateScript[] = "EvaluateScript";
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char MarkLoad[] = "MarkLoad";
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char MarkDOMContent[] = "MarkDOMContent";
100a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static const char MarkFirstPaint[] = "MarkFirstPaint";
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimeStamp[] = "TimeStamp";
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char Time[] = "Time";
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char TimeEnd[] = "TimeEnd";
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ScheduleResourceRequest[] = "ScheduleResourceRequest";
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceSendRequest[] = "ResourceSendRequest";
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceReceiveResponse[] = "ResourceReceiveResponse";
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceReceivedData[] = "ResourceReceivedData";
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char ResourceFinish[] = "ResourceFinish";
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char XHRReadyStateChange[] = "XHRReadyStateChange";
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char XHRLoad[] = "XHRLoad";
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char FunctionCall[] = "FunctionCall";
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char GCEvent[] = "GCEvent";
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char RequestAnimationFrame[] = "RequestAnimationFrame";
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char CancelAnimationFrame[] = "CancelAnimationFrame";
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char FireAnimationFrame[] = "FireAnimationFrame";
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketCreate[] = "WebSocketCreate";
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketSendHandshakeRequest[] = "WebSocketSendHandshakeRequest";
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketReceiveHandshakeResponse[] = "WebSocketReceiveHandshakeResponse";
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)static const char WebSocketDestroy[] = "WebSocketDestroy";
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)// Event names visible to other modules.
128a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const char ActivateLayerTree[] = "ActivateLayerTree";
129a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const char BeginFrame[] = "BeginFrame";
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const char DecodeImage[] = "DecodeImage";
131a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const char GPUTask[] = "GPUTask";
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)const char Rasterize[] = "Rasterize";
13393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)const char PaintSetup[] = "PaintSetup";
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
136e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)namespace {
137e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)const char BackendNodeIdGroup[] = "timeline";
138e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
139e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
140a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineRecordEntry {
141a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordEntry(PassRefPtr<JSONObject> record, PassRefPtr<JSONObject> data, PassRefPtr<JSONArray> children, const String& type, size_t usedHeapSizeAtStart)
142a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        : record(record), data(data), children(children), type(type), usedHeapSizeAtStart(usedHeapSizeAtStart)
143a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
144a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
145a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> record;
146a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data;
147a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONArray> children;
148a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String type;
149a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    size_t usedHeapSizeAtStart;
150a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
151a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
152a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class TimelineRecordStack {
153a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)private:
154a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    struct Entry {
155a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        Entry(PassRefPtr<JSONObject> record)
156a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            : record(record)
157a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            , children(JSONArray::create())
158a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        {
159a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
160a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
161a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        RefPtr<JSONObject> record;
162a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        RefPtr<JSONArray> children;
163a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    };
164a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
165a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)public:
166a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordStack() : m_timelineAgent(0) { }
167a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordStack(InspectorTimelineAgent*);
168a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
169a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void addScopedRecord(PassRefPtr<JSONObject> record);
170a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void closeScopedRecord(double endTime);
171a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void addInstantRecord(PassRefPtr<JSONObject> record);
172a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
173a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#ifndef NDEBUG
174a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool isOpenRecordOfType(const String& type);
175a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#endif
176a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
177a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)private:
178a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    void send(PassRefPtr<JSONObject>);
179a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    InspectorTimelineAgent* m_timelineAgent;
181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Vector<Entry> m_stack;
182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
183a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineThreadState {
185a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState() { }
186a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
187a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState(InspectorTimelineAgent* timelineAgent)
188a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        : recordStack(timelineAgent)
189a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        , inKnownLayerTask(false)
190a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        , decodedPixelRefId(0)
191a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
192a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
193a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
194a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordStack recordStack;
195a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    bool inKnownLayerTask;
196a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long decodedPixelRefId;
197a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
198a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
199a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineGCEvent {
200a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineGCEvent(double startTime, double endTime, size_t collectedBytes)
201a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        : startTime(startTime), endTime(endTime), collectedBytes(collectedBytes)
202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    {
203a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
204a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double startTime;
205a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double endTime;
206a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    size_t collectedBytes;
207a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
208a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)struct TimelineImageInfo {
210a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    int backendNodeId;
211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String url;
212a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
213a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo() : backendNodeId(0) { }
214a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo(int backendNodeId, String url) : backendNodeId(backendNodeId), url(url) { }
215a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)};
216a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
2171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)static Frame* frameForExecutionContext(ExecutionContext* context)
21853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
21953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Frame* frame = 0;
22053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (context->isDocument())
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        frame = toDocument(context)->frame();
22253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return frame;
22353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
22453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
22553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)static bool eventHasListeners(const AtomicString& eventType, DOMWindow* window, Node* node, const EventPath& eventPath)
22653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
22753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (window && window->hasEventListeners(eventType))
22853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
22953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
23053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (node->hasEventListeners(eventType))
23153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return true;
23253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
23353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (size_t i = 0; i < eventPath.size(); i++) {
234bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        if (eventPath[i].node()->hasEventListeners(eventType))
23553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return true;
23653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
23753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
23853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return false;
23953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
24053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void TimelineTimeConverter::reset()
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
2438abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_startOffset = monotonicallyIncreasingTime() - currentTime();
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::pushGCEventRecords()
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_gcEvents.size())
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GCEvents events = m_gcEvents;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_gcEvents.clear();
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (GCEvents::iterator i = events.begin(); i != events.end(); ++i) {
2548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        RefPtr<JSONObject> record = TimelineRecordFactory::createGenericRecord(m_timeConverter.fromMonotonicallyIncreasingTime(i->startTime), m_maxCallStackDepth, TimelineRecordType::GCEvent);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        record->setObject("data", TimelineRecordFactory::createGCEventData(i->collectedBytes));
2568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        record->setNumber("endTime", m_timeConverter.fromMonotonicallyIncreasingTime(i->endTime));
25793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        addRecordToTimeline(record.release());
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didGC(double startTime, double endTime, size_t collectedBytesCount)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
263a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_gcEvents.append(TimelineGCEvent(startTime, endTime, collectedBytesCount));
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)InspectorTimelineAgent::~InspectorTimelineAgent()
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::setFrontend(InspectorFrontend* frontend)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = frontend->timeline();
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::clearFrontend()
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ErrorString error;
27806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    RefPtr<TypeBuilder::Array<TypeBuilder::Timeline::TimelineEvent> > events;
27906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    stop(&error, events);
2809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    disable(&error);
281e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    releaseNodeIds();
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_frontend = 0;
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::restore()
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (m_state->getBoolean(TimelineAgentState::startedFromProtocol)) {
28806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::bufferEvents))
28906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)            m_bufferedEvents = TypeBuilder::Array<TypeBuilder::Timeline::TimelineEvent>::create();
2909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStart();
2919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    } else if (isStarted()) {
2929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        // Timeline was started from console.timeline, it is not restored.
2939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        // Tell front-end timline is no longer collecting.
2949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_state->setBoolean(TimelineAgentState::started, false);
2959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        bool fromConsole = true;
2969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_frontend->stopped(&fromConsole);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::enable(ErrorString*)
3019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::enabled, true);
3039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::disable(ErrorString*)
3069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::enabled, false);
3089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
31051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::start(ErrorString* errorString, const int* maxCallStackDepth, const bool* bufferEvents, const bool* includeDomCounters, const bool* includeGPUEvents)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_frontend)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::startedFromProtocol, true);
3159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (isStarted()) {
3179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        *errorString = "Timeline is already started";
3189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
3199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
321e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    releaseNodeIds();
32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (maxCallStackDepth && *maxCallStackDepth >= 0)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_maxCallStackDepth = *maxCallStackDepth;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_maxCallStackDepth = 5;
32606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
32706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (bufferEvents && *bufferEvents)
32806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        m_bufferedEvents = TypeBuilder::Array<TypeBuilder::Timeline::TimelineEvent>::create();
32906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_state->setLong(TimelineAgentState::timelineMaxCallStackDepth, m_maxCallStackDepth);
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_state->setBoolean(TimelineAgentState::includeDomCounters, includeDomCounters && *includeDomCounters);
33251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_state->setBoolean(TimelineAgentState::includeGPUEvents, includeGPUEvents && *includeGPUEvents);
33306f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::bufferEvents, bufferEvents && *bufferEvents);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    innerStart();
3369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool fromConsole = false;
3379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_frontend->started(&fromConsole);
3389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool InspectorTimelineAgent::isStarted()
3419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return m_state->getBoolean(TimelineAgentState::started);
3439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::innerStart()
3469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
34751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_overlay)
34851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_overlay->startedRecordingProfile();
3499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::started, true);
3509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_timeConverter.reset();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorTimelineAgent(this);
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::addEventListener(this);
353a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_client) {
354a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        TraceEventDispatcher* dispatcher = TraceEventDispatcher::instance();
355a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::BeginFrame, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onBeginImplSideFrame, m_client);
356a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onPaintSetupBegin, m_client);
357a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::PaintSetup, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onPaintSetupEnd, m_client);
358a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onRasterTaskBegin, m_client);
359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::RasterTask, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onRasterTaskEnd, m_client);
360a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::Layer, TRACE_EVENT_PHASE_DELETE_OBJECT, this, &InspectorTimelineAgent::onLayerDeleted, m_client);
361a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(InstrumentationEvents::ActivateLayerTree, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onActivateLayerTree, m_client);
362a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onImageDecodeBegin, m_client);
363a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::ImageDecodeEvent, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onImageDecodeEnd, m_client);
364a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DrawLazyPixelRefEvent, TRACE_EVENT_PHASE_INSTANT, this, &InspectorTimelineAgent::onDrawLazyPixelRef, m_client);
365a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_BEGIN, this, &InspectorTimelineAgent::onDecodeLazyPixelRefBegin, m_client);
366a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::DecodeLazyPixelRefEvent, TRACE_EVENT_PHASE_END, this, &InspectorTimelineAgent::onDecodeLazyPixelRefEnd, m_client);
367a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        dispatcher->addListener(PlatformInstrumentation::LazyPixelRef, TRACE_EVENT_PHASE_DELETE_OBJECT, this, &InspectorTimelineAgent::onLazyPixelRefDeleted, m_client);
368a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
36951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::includeGPUEvents)) {
37051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            m_pendingGPURecord.clear();
37151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            m_client->startGPUEventsRecording();
37251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        }
37351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)void InspectorTimelineAgent::stop(ErrorString* errorString, RefPtr<TypeBuilder::Array<TypeBuilder::Timeline::TimelineEvent> >& events)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::startedFromProtocol, false);
37906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::bufferEvents, false);
38006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)
3819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!isStarted()) {
3829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        *errorString = "Timeline was not started";
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
3859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    innerStop(false);
38606f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (m_bufferedEvents)
38706f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        events = m_bufferedEvents.release();
3889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
3899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
3909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void InspectorTimelineAgent::innerStop(bool fromConsole)
3919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
3929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_state->setBoolean(TimelineAgentState::started, false);
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
394a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_client) {
395a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        TraceEventDispatcher::instance()->removeAllListeners(this, m_client);
396a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (m_state->getBoolean(TimelineAgentState::includeGPUEvents))
397a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            m_client->stopGPUEventsRecording();
398e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    }
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_instrumentingAgents->setInspectorTimelineAgent(0);
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::removeEventListener(this);
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearRecordStack();
403a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_threadStates.clear();
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_gcEvents.clear();
405a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_gpuTask.clear();
406a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_layerToNodeMap.clear();
407a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.clear();
408a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_imageBeingPainted = 0;
409a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupStart = 0;
410a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_mayEmitFirstPaint = false;
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    for (size_t i = 0; i < m_consoleTimelines.size(); ++i) {
4139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        String message = String::format("Timeline '%s' terminated.", m_consoleTimelines[i].utf8().data());
4149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message);
4159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.clear();
4179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_frontend->stopped(&fromConsole);
41951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (m_overlay)
42051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_overlay->finishedRecordingProfile();
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)void InspectorTimelineAgent::didBeginFrame(int frameId)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
425a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TraceEventDispatcher::instance()->processBackgroundEvents();
42693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    m_pendingFrameRecord = TimelineRecordFactory::createGenericRecord(timestamp(), 0, TimelineRecordType::BeginFrame);
42719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)    m_pendingFrameRecord->setObject("data", TimelineRecordFactory::createFrameData(frameId));
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCancelFrame()
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pendingFrameRecord.clear();
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willCallFunction(ExecutionContext* context, const String& scriptName, int scriptLine)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createFunctionCallData(scriptName, scriptLine), TimelineRecordType::FunctionCall, true, frameForExecutionContext(context));
43853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCallFunction()
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::FunctionCall);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
44653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchEvent(Document* document, const Event& event, DOMWindow* window, Node* node, const EventPath& eventPath)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
44853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!eventHasListeners(event.type(), window, node, eventPath))
44953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)       return false;
45053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEventDispatchData(event), TimelineRecordType::EventDispatch, false, document->frame());
45253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
45353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
45453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
45553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchEventOnWindow(const Event& event, DOMWindow* window)
45653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
45753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!window->hasEventListeners(event.type()))
45853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
45953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEventDispatchData(event), TimelineRecordType::EventDispatch, false, window->frame());
46053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchEvent()
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::EventDispatch);
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didDispatchEventOnWindow()
46953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
47053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    didDispatchEvent();
47153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
47253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didInvalidateLayout(Frame* frame)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    appendRecord(JSONObject::create(), TimelineRecordType::InvalidateLayout, true, frame);
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willLayout(Frame* frame)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
48053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RenderObject* root = frame->view()->layoutRoot();
48153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    bool partialLayout = !!root;
48253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!partialLayout)
48453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        root = frame->contentRenderer();
48553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
48653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned dirtyObjects = 0;
48753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    unsigned totalObjects = 0;
48853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    for (RenderObject* o = root; o; o = o->nextInPreOrder(root)) {
48953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ++totalObjects;
49053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (o->needsLayout())
49153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            ++dirtyObjects;
49253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
49353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createLayoutData(dirtyObjects, totalObjects, partialLayout), TimelineRecordType::Layout, true, frame);
49453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didLayout(RenderObject* root)
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_recordStack.isEmpty())
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
50153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::Layout);
50353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Vector<FloatQuad> quads;
50453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    root->absoluteQuads(quads);
50553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (quads.size() >= 1)
506bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        TimelineRecordFactory::appendLayoutRoot(entry.data.get(), quads[0], nodeId(root));
50753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    else
50853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        ASSERT_NOT_REACHED();
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Layout);
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
512bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)void InspectorTimelineAgent::willAutosizeText(RenderObject* renderer)
513bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
514bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createNodeData(nodeId(renderer)), TimelineRecordType::AutosizeText, false, renderer->frame());
515bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
516bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
517f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void InspectorTimelineAgent::didAutosizeText(RenderObject* renderer)
518bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
519f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (renderer->needsLayout()) {
520f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        TimelineRecordEntry& entry = m_recordStack.last();
521f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        ASSERT(entry.type == TimelineRecordType::AutosizeText);
522f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        entry.data->setBoolean("needsRelayout", true);
523f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
524bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::AutosizeText);
525bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
526bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
52753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didScheduleStyleRecalculation(Document* document)
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
529591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    appendRecord(JSONObject::create(), TimelineRecordType::ScheduleStyleRecalculation, true, document->frame());
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willRecalculateStyle(Document* document)
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
534591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::RecalculateStyles, true, document->frame());
53553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(!m_styleRecalcElementCounter);
53653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didRecalculateStyle()
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
54153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (m_recordStack.isEmpty())
54253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return;
54353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
54453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::RecalculateStyles);
54553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordFactory::appendStyleRecalcDetails(entry.data.get(), m_styleRecalcElementCounter);
54653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    m_styleRecalcElementCounter = 0;
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::RecalculateStyles);
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
55053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didRecalculateStyleForElement()
55153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
55253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    ++m_styleRecalcElementCounter;
55353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
55453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
555a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::willPaint(RenderObject* renderer, const GraphicsLayer* graphicsLayer)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
55793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    Frame* frame = renderer->frame();
55893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
559a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TraceEventDispatcher::instance()->processBackgroundEvents();
560a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double paintSetupStart = m_paintSetupStart;
561a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupStart = 0;
562a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (graphicsLayer) {
563a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        int layerIdentifier = graphicsLayer->platformLayer()->id();
564a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        int nodeIdentifier = nodeId(renderer);
565a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        ASSERT(layerIdentifier && nodeIdentifier);
566a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_layerToNodeMap.set(layerIdentifier, nodeIdentifier);
567a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (paintSetupStart) {
568a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            RefPtr<JSONObject> paintSetupRecord = TimelineRecordFactory::createGenericRecord(paintSetupStart, 0, TimelineRecordType::PaintSetup);
569a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            paintSetupRecord->setNumber("endTime", m_paintSetupEnd);
570a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            paintSetupRecord->setObject("data", TimelineRecordFactory::createLayerData(nodeIdentifier));
571a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            addRecordToTimeline(paintSetupRecord);
572a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        }
573a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
574591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::Paint, true, frame, true);
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::didPaint(RenderObject* renderer, const GraphicsLayer* graphicsLayer, GraphicsContext*, const LayoutRect& clipRect)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
57953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    TimelineRecordEntry& entry = m_recordStack.last();
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(entry.type == TimelineRecordType::Paint);
58153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FloatQuad quad;
58253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    localToPageQuad(*renderer, clipRect, &quad);
58351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    int graphicsLayerId = graphicsLayer ? graphicsLayer->platformLayer()->id() : 0;
58451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    entry.data = TimelineRecordFactory::createPaintData(quad, nodeId(renderer), graphicsLayerId);
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Paint);
586a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_mayEmitFirstPaint && !graphicsLayer) {
587a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = false;
588a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        appendRecord(JSONObject::create(), TimelineRecordType::MarkFirstPaint, false, 0);
589a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::willPaintImage(RenderImage* renderImage)
5938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
5948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    ASSERT(!m_imageBeingPainted);
5958abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_imageBeingPainted = renderImage;
5968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
5978abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
5988abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::didPaintImage()
5998abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
6008abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_imageBeingPainted = 0;
6018abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
6028abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
6037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid InspectorTimelineAgent::willScrollLayer(RenderObject* renderer)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
605bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createLayerData(nodeId(renderer)), TimelineRecordType::ScrollLayer, false, renderer->frame());
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didScrollLayer()
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ScrollLayer);
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willDecodeImage(const String& imageType)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6158abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createDecodeImageData(imageType);
6168abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_imageBeingPainted)
6178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        populateImageDetails(data.get(), *m_imageBeingPainted);
6188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    pushCurrentRecord(data, TimelineRecordType::DecodeImage, true, 0);
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDecodeImage()
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::DecodeImage);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willResizeImage(bool shouldCache)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6288abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createResizeImageData(shouldCache);
6298abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (m_imageBeingPainted)
6308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        populateImageDetails(data.get(), *m_imageBeingPainted);
6318abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    pushCurrentRecord(data, TimelineRecordType::ResizeImage, true, 0);
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didResizeImage()
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ResizeImage);
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willComposite()
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
641591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::CompositeLayers, false, 0);
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didComposite()
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::CompositeLayers);
647a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_mayEmitFirstPaint) {
648a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = false;
649a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        appendRecord(JSONObject::create(), TimelineRecordType::MarkFirstPaint, false, 0);
650a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willWriteHTML(Document* document, unsigned startLine)
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
65553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createParseHTMLData(startLine), TimelineRecordType::ParseHTML, true, document->frame());
65653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
659926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void InspectorTimelineAgent::didWriteHTML(unsigned endLine)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_recordStack.isEmpty()) {
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TimelineRecordEntry entry = m_recordStack.last();
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry.data->setNumber("endLine", endLine);
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        didCompleteCurrentRecord(TimelineRecordType::ParseHTML);
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::didInstallTimer(ExecutionContext* context, int timerId, int timeout, bool singleShot)
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimerInstallData(timerId, timeout, singleShot), TimelineRecordType::TimerInstall, true, frameForExecutionContext(context));
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::didRemoveTimer(ExecutionContext* context, int timerId)
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimelineRecordType::TimerRemove, true, frameForExecutionContext(context));
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willFireTimer(ExecutionContext* context, int timerId)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createGenericTimerData(timerId), TimelineRecordType::TimerFire, false, frameForExecutionContext(context));
68153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didFireTimer()
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::TimerFire);
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6891e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchXHRReadyStateChangeEvent(ExecutionContext* context, XMLHttpRequest* request)
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!request->hasEventListeners(EventTypeNames::readystatechange))
69253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
6931e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createXHRReadyStateChangeData(request->url().string(), request->readyState()), TimelineRecordType::XHRReadyStateChange, false, frameForExecutionContext(context));
69453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchXHRReadyStateChangeEvent()
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::XHRReadyStateChange);
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool InspectorTimelineAgent::willDispatchXHRLoadEvent(ExecutionContext* context, XMLHttpRequest* request)
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7041e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!request->hasEventListeners(EventTypeNames::load))
70553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
7061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createXHRLoadData(request->url().string()), TimelineRecordType::XHRLoad, true, frameForExecutionContext(context));
70753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didDispatchXHRLoadEvent()
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::XHRLoad);
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
71553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willEvaluateScript(Frame* frame, const String& url, int lineNumber)
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createEvaluateScriptData(url, lineNumber), TimelineRecordType::EvaluateScript, true, frame);
71853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didEvaluateScript()
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::EvaluateScript);
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
72653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didScheduleResourceRequest(Document* document, const String& url)
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
72853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createScheduleResourceRequestData(url), TimelineRecordType::ScheduleResourceRequest, true, document->frame());
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
731fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdochvoid InspectorTimelineAgent::willSendRequest(unsigned long identifier, DocumentLoader* loader, const ResourceRequest& request, const ResourceResponse&, const FetchInitiatorInfo&)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
73453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createResourceSendRequestData(requestId, request), TimelineRecordType::ResourceSendRequest, true, loader->frame());
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
73753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willReceiveResourceData(Frame* frame, unsigned long identifier, int length)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createReceiveResourceData(requestId, length), TimelineRecordType::ResourceReceivedData, false, frame);
74153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didReceiveResourceData()
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::ResourceReceivedData);
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
749a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::didReceiveResourceResponse(Frame* frame, unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String requestId = IdentifiersFactory::requestId(identifier);
752a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    appendRecord(TimelineRecordFactory::createResourceReceiveResponseData(requestId, response), TimelineRecordType::ResourceReceiveResponse, false, frame);
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didFinishLoadingResource(unsigned long identifier, bool didFail, double finishTime, Frame* frame)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    appendRecord(TimelineRecordFactory::createResourceFinishData(IdentifiersFactory::requestId(identifier), didFail, finishTime * 1000), TimelineRecordType::ResourceFinish, false, frame);
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorTimelineAgent::didFinishLoading(unsigned long identifier, DocumentLoader* loader, double monotonicFinishTime)
76193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
76293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    double finishTime = 0.0;
76393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    // FIXME: Expose all of the timing details to inspector and have it calculate finishTime.
76493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (monotonicFinishTime)
76593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        finishTime = loader->timing()->monotonicTimeToPseudoWallTime(monotonicFinishTime);
76693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
76793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    didFinishLoadingResource(identifier, false, finishTime, loader->frame());
76893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
76993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
77053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didFailLoading(unsigned long identifier, DocumentLoader* loader, const ResourceError& error)
77153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
77253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    didFinishLoadingResource(identifier, true, 0, loader->frame());
77353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
77453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
7751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimeStamp(ExecutionContext* context, const String& title)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(title), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTime(ExecutionContext* context, const String& message)
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::Time, true, frameForExecutionContext(context));
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7851e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimeEnd(ExecutionContext* context, const String& message, ScriptState*)
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7871e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::TimeEnd, true, frameForExecutionContext(context));
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7901e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimeline(ExecutionContext* context, const String& title, ScriptState* state)
7919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
7929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!m_state->getBoolean(TimelineAgentState::enabled))
7939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
7949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
7959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String message = String::format("Timeline '%s' started.", title.utf8().data());
7969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, 0, state);
7979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.append(title);
7989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!isStarted()) {
7999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStart();
8009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        bool fromConsole = true;
8019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_frontend->started(&fromConsole);
8029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
8031e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
8049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
8059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8061e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)void InspectorTimelineAgent::consoleTimelineEnd(ExecutionContext* context, const String& title, ScriptState* state)
8079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
8089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!m_state->getBoolean(TimelineAgentState::enabled))
8099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
8109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    size_t index = m_consoleTimelines.find(title);
81206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (index == kNotFound) {
8139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        String message = String::format("Timeline '%s' was not started.", title.utf8().data());
8149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, 0, state);
8159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
8169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
8179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String message = String::format("Timeline '%s' finished.", title.utf8().data());
8191e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createTimeStampData(message), TimelineRecordType::TimeStamp, true, frameForExecutionContext(context));
8209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_consoleTimelines.remove(index);
82151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!m_consoleTimelines.size() && isStarted() && !m_state->getBoolean(TimelineAgentState::startedFromProtocol)) {
82251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        unwindRecordStack();
8239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        innerStop(true);
82451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
8259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    page()->console().addMessage(ConsoleAPIMessageSource, DebugMessageLevel, message, String(), 0, 0, 0, state);
8269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
827c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
82893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorTimelineAgent::domContentLoadedEventFired(Frame* frame)
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
830926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame());
831926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRecordType::MarkDOMContent, false, frame);
832a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (isMainFrame)
833a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_mayEmitFirstPaint = true;
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)void InspectorTimelineAgent::loadEventFired(Frame* frame)
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    bool isMainFrame = frame && m_pageAgent && (frame == m_pageAgent->mainFrame());
839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createMarkData(isMainFrame), TimelineRecordType::MarkLoad, false, frame);
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCommitLoad()
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    clearRecordStack();
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
84753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didRequestAnimationFrame(Document* document, int callbackId)
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
84953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::RequestAnimationFrame, true, document->frame());
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCancelAnimationFrame(Document* document, int callbackId)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
85453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::CancelAnimationFrame, true, document->frame());
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool InspectorTimelineAgent::willFireAnimationFrame(Document* document, int callbackId)
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
85953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    pushCurrentRecord(TimelineRecordFactory::createAnimationFrameData(callbackId), TimelineRecordType::FireAnimationFrame, false, document->frame());
86053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return true;
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didFireAnimationFrame()
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::FireAnimationFrame);
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::willProcessTask()
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
870591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    pushCurrentRecord(JSONObject::create(), TimelineRecordType::Program, false, 0);
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didProcessTask()
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    didCompleteCurrentRecord(TimelineRecordType::Program);
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCreateWebSocket(Document* document, unsigned long identifier, const KURL& url, const String& protocol)
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
88053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createWebSocketCreateData(identifier, url, protocol), TimelineRecordType::WebSocketCreate, true, document->frame());
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::willSendWebSocketHandshakeRequest(Document* document, unsigned long identifier, const WebSocketHandshakeRequest&)
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
88553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketSendHandshakeRequest, true, document->frame());
886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didReceiveWebSocketHandshakeResponse(Document* document, unsigned long identifier, const WebSocketHandshakeResponse&)
889926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
89053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketReceiveHandshakeResponse, false, document->frame());
891926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
892926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
89353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::didCloseWebSocket(Document* document, unsigned long identifier)
894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
89553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    appendRecord(TimelineRecordFactory::createGenericWebSocketData(identifier), TimelineRecordType::WebSocketDestroy, true, document->frame());
896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
898a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onBeginImplSideFrame(const TraceEventDispatcher::TraceEvent& event)
899a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
900a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
901a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
902a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
903a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
904a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::BeginFrame));
905a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
906a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
907a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onPaintSetupBegin(const TraceEventDispatcher::TraceEvent& event)
908a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
909a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!m_paintSetupStart);
910a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupStart = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp());
911a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
912a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
913a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onPaintSetupEnd(const TraceEventDispatcher::TraceEvent& event)
914a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
915a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(m_paintSetupStart);
916a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_paintSetupEnd = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp());
917a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
918a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
919a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onRasterTaskBegin(const TraceEventDispatcher::TraceEvent& event)
920a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
921a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
922a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerId = event.asUInt(InstrumentationEventArguments::LayerId);
923a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(layerId);
924a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_layerToNodeMap.contains(layerId))
925a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
926a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!state.inKnownLayerTask);
927a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.inKnownLayerTask = true;
928a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double timeestamp = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp());
929a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data = TimelineRecordFactory::createLayerData(m_layerToNodeMap.get(layerId));
930a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> record = TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), TimelineRecordType::Rasterize, data);
931a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.addScopedRecord(record);
932a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
933a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
934a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onRasterTaskEnd(const TraceEventDispatcher::TraceEvent& event)
935a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
936a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
937a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.inKnownLayerTask)
938a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
939a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(state.recordStack.isOpenRecordOfType(TimelineRecordType::Rasterize));
940a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp()));
941a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.inKnownLayerTask = false;
942a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
943a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
944a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onImageDecodeBegin(const TraceEventDispatcher::TraceEvent& event)
945a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
946a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
947a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.decodedPixelRefId && !state.inKnownLayerTask)
948a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
949a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineImageInfo imageInfo;
950a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (state.decodedPixelRefId) {
951a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        PixelRefToImageInfoMap::const_iterator it = m_pixelRefToImageInfo.find(state.decodedPixelRefId);
952a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        if (it != m_pixelRefToImageInfo.end())
953a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            imageInfo = it->value;
954a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        else
955a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            ASSERT_NOT_REACHED();
956a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
957a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    RefPtr<JSONObject> data = JSONObject::create();
958a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineRecordFactory::appendImageDetails(data.get(), imageInfo.backendNodeId, imageInfo.url);
959a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double timeestamp = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp());
960a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.addScopedRecord(TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), TimelineRecordType::DecodeImage, data));
961a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
962a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
963a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onImageDecodeEnd(const TraceEventDispatcher::TraceEvent& event)
964a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
965a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
966a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!state.decodedPixelRefId)
967a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
968a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(state.recordStack.isOpenRecordOfType(TimelineRecordType::DecodeImage));
969a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.closeScopedRecord(m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp()));
970a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
971a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
972a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onActivateLayerTree(const TraceEventDispatcher::TraceEvent& event)
973a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
974a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long layerTreeId = event.asUInt(InstrumentationEventArguments::LayerTreeId);
975a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (layerTreeId != m_layerTreeId)
976a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
977a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long frameId = event.asUInt(InstrumentationEventArguments::FrameId);
978a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
979a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    state.recordStack.addInstantRecord(createRecordForEvent(event, TimelineRecordType::ActivateLayerTree, TimelineRecordFactory::createFrameData(frameId)));
980a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
981a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
982a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onLayerDeleted(const TraceEventDispatcher::TraceEvent& event)
983a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
984a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long id = event.id();
985a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(id);
986a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_layerToNodeMap.remove(id);
987a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
988a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
989a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDecodeLazyPixelRefBegin(const TraceEventDispatcher::TraceEvent& event)
990a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
991a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    TimelineThreadState& state = threadState(event.threadIdentifier());
992a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(!state.decodedPixelRefId);
993a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long pixelRefId = event.asUInt(PlatformInstrumentation::LazyPixelRef);
994a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(pixelRefId);
995a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_pixelRefToImageInfo.contains(pixelRefId))
996a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        state.decodedPixelRefId = pixelRefId;
997a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
998a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
999a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDecodeLazyPixelRefEnd(const TraceEventDispatcher::TraceEvent& event)
1000a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1001a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    threadState(event.threadIdentifier()).decodedPixelRefId = 0;
1002a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1003a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1004a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onDrawLazyPixelRef(const TraceEventDispatcher::TraceEvent& event)
1005a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1006a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    unsigned long long pixelRefId = event.asUInt(PlatformInstrumentation::LazyPixelRef);
1007a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ASSERT(pixelRefId);
1008a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_imageBeingPainted)
1009a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1010a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String url;
1011a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (const ImageResource* resource = m_imageBeingPainted->cachedImage())
1012a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        url = resource->url().string();
1013a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.set(pixelRefId, TimelineImageInfo(nodeId(m_imageBeingPainted->generatingNode()), url));
1014a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1015a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1016a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void InspectorTimelineAgent::onLazyPixelRefDeleted(const TraceEventDispatcher::TraceEvent& event)
1017a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1018a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_pixelRefToImageInfo.remove(event.id());
1019a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1020a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
102151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::processGPUEvent(const GPUEvent& event)
102251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
102351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    double timelineTimestamp = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp);
102451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (event.phase == GPUEvent::PhaseBegin) {
1025a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_pendingGPURecord = TimelineRecordFactory::createBackgroundRecord(timelineTimestamp, "gpu", TimelineRecordType::GPUTask, TimelineRecordFactory::createGPUTaskData(event.foreign, event.usedGPUMemoryBytes));
102651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else if (m_pendingGPURecord) {
102751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        m_pendingGPURecord->setNumber("endTime", timelineTimestamp);
102851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        sendEvent(m_pendingGPURecord.release());
102951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
103051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
103151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1032591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::addRecordToTimeline(PassRefPtr<JSONObject> record)
1033926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1034926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    commitFrameRecord();
103593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    innerAddRecordToTimeline(record);
1036926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1037926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1038591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::innerAddRecordToTimeline(PassRefPtr<JSONObject> prpRecord)
1039926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
104053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    RefPtr<TypeBuilder::Timeline::TimelineEvent> record = TypeBuilder::Timeline::TimelineEvent::runtimeCast(prpRecord);
104193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (m_recordStack.isEmpty()) {
1042926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        sendEvent(record.release());
104393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else {
104493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        setDOMCounters(record.get());
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TimelineRecordEntry parent = m_recordStack.last();
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parent.children->pushObject(record.release());
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static size_t getUsedHeapSize()
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HeapInfo info;
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ScriptGCEvent::getHeapSize(info);
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return info.usedJSHeapSize;
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::setDOMCounters(TypeBuilder::Timeline::TimelineEvent* record)
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
105953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    record->setUsedHeapSize(getUsedHeapSize());
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1061926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_state->getBoolean(TimelineAgentState::includeDomCounters)) {
106253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        int documentCount = 0;
106353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        int nodeCount = 0;
10641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        int listenerCount = 0;
106553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (m_inspectorType == PageInspector) {
106653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            documentCount = InspectorCounters::counterValue(InspectorCounters::DocumentCounter);
106753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            nodeCount = InspectorCounters::counterValue(InspectorCounters::NodeCounter);
10681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)            listenerCount = InspectorCounters::counterValue(InspectorCounters::JSEventListenerCounter);
106953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        }
107053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        RefPtr<TypeBuilder::Timeline::DOMCounters> counters = TypeBuilder::Timeline::DOMCounters::create()
107153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            .setDocuments(documentCount)
107253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            .setNodes(nodeCount)
107353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            .setJsEventListeners(listenerCount);
107453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        record->setCounters(counters.release());
10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1078591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::setFrameIdentifier(JSONObject* record, Frame* frame)
1079926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1080926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (!frame || !m_pageAgent)
1081926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
1082926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    String frameId;
1083926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (frame && m_pageAgent)
1084926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        frameId = m_pageAgent->frameId(frame);
1085926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    record->setString("frameId", frameId);
1086926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1087926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
10888abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)void InspectorTimelineAgent::populateImageDetails(JSONObject* data, const RenderImage& renderImage)
10898abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){
10908abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    const ImageResource* resource = renderImage.cachedImage();
1091bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    TimelineRecordFactory::appendImageDetails(data, nodeId(renderImage.generatingNode()), resource ? resource->url().string() : "");
10928abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)}
10938abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)
10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::didCompleteCurrentRecord(const String& type)
10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // An empty stack could merely mean that the timeline agent was turned on in the middle of
10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // an event.  Don't treat as an error.
10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_recordStack.isEmpty()) {
10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_platformInstrumentationClientInstalledAtStackDepth == m_recordStack.size()) {
11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_platformInstrumentationClientInstalledAtStackDepth = 0;
11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            PlatformInstrumentation::setClient(0);
11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        pushGCEventRecords();
11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TimelineRecordEntry entry = m_recordStack.last();
11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_recordStack.removeLast();
11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(entry.type == type);
11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry.record->setObject("data", entry.data);
11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry.record->setArray("children", entry.children);
11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        entry.record->setNumber("endTime", timestamp());
1111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        ptrdiff_t usedHeapSizeDelta = getUsedHeapSize() - entry.usedHeapSizeAtStart;
11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (usedHeapSizeDelta)
11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            entry.record->setNumber("usedHeapSizeDelta", usedHeapSizeDelta);
111493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        addRecordToTimeline(entry.record);
11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void InspectorTimelineAgent::unwindRecordStack()
111951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
112051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    while (!m_recordStack.isEmpty()) {
112151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        TimelineRecordEntry& entry = m_recordStack.last();
112251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        didCompleteCurrentRecord(entry.type);
112351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
112451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
112551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
112651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)InspectorTimelineAgent::InspectorTimelineAgent(InstrumentingAgents* instrumentingAgents, InspectorPageAgent* pageAgent, InspectorMemoryAgent* memoryAgent, InspectorDOMAgent* domAgent, InspectorOverlay* overlay, InspectorCompositeState* state, InspectorType type, InspectorClient* client)
11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : InspectorBaseAgent<InspectorTimelineAgent>("Timeline", instrumentingAgents, state)
11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_pageAgent(pageAgent)
1129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_memoryAgent(memoryAgent)
1130e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    , m_domAgent(domAgent)
11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_frontend(0)
1132a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_client(client)
1133a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_overlay(overlay)
1134a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_inspectorType(type)
11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_id(1)
1136a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_layerTreeId(0)
11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_maxCallStackDepth(5)
11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_platformInstrumentationClientInstalledAtStackDepth(0)
11398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    , m_imageBeingPainted(0)
1140a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_paintSetupStart(0)
1141a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_styleRecalcElementCounter(0)
1142a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_mayEmitFirstPaint(false)
11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1146591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::appendRecord(PassRefPtr<JSONObject> data, const String& type, bool captureCallStack, Frame* frame)
11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pushGCEventRecords();
1149591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONObject> record = TimelineRecordFactory::createGenericRecord(timestamp(), captureCallStack ? m_maxCallStackDepth : 0, type);
11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    record->setObject("data", data);
1151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFrameIdentifier(record.get(), frame);
115293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    addRecordToTimeline(record.release());
1153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
1154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1155591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::sendEvent(PassRefPtr<JSONObject> event)
1156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
1157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // FIXME: runtimeCast is a hack. We do it because we can't build TimelineEvent directly now.
1158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<TypeBuilder::Timeline::TimelineEvent> recordChecked = TypeBuilder::Timeline::TimelineEvent::runtimeCast(event);
115906f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    if (m_bufferedEvents) {
116006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        m_bufferedEvents->addItem(recordChecked.release());
116106f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        return;
116206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    }
1163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_frontend->eventRecorded(recordChecked.release());
11645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1166591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochvoid InspectorTimelineAgent::pushCurrentRecord(PassRefPtr<JSONObject> data, const String& type, bool captureCallStack, Frame* frame, bool hasLowLevelDetails)
11675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    pushGCEventRecords();
11695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    commitFrameRecord();
1170591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RefPtr<JSONObject> record = TimelineRecordFactory::createGenericRecord(timestamp(), captureCallStack ? m_maxCallStackDepth : 0, type);
1171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFrameIdentifier(record.get(), frame);
1172591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    m_recordStack.append(TimelineRecordEntry(record.release(), data, JSONArray::create(), type, getUsedHeapSize()));
11735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (hasLowLevelDetails && !m_platformInstrumentationClientInstalledAtStackDepth && !PlatformInstrumentation::hasClient()) {
11745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_platformInstrumentationClientInstalledAtStackDepth = m_recordStack.size();
11755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformInstrumentation::setClient(this);
11765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
11775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1179a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TimelineThreadState& InspectorTimelineAgent::threadState(ThreadIdentifier thread)
1180a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1181a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    ThreadStateMap::iterator it = m_threadStates.find(thread);
1182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (it != m_threadStates.end())
1183a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return it->value;
1184a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return m_threadStates.add(thread, TimelineThreadState(this)).iterator->value;
1185a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1186a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
11875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::commitFrameRecord()
11885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_pendingFrameRecord)
11905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
119193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    innerAddRecordToTimeline(m_pendingFrameRecord.release());
11925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
11935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void InspectorTimelineAgent::clearRecordStack()
11955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
11965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_platformInstrumentationClientInstalledAtStackDepth) {
11975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_platformInstrumentationClientInstalledAtStackDepth = 0;
11985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PlatformInstrumentation::setClient(0);
11995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
12005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_pendingFrameRecord.clear();
12015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_recordStack.clear();
12025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_id++;
12035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
120553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)void InspectorTimelineAgent::localToPageQuad(const RenderObject& renderer, const LayoutRect& rect, FloatQuad* quad)
120653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
120753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    Frame* frame = renderer.frame();
120853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FrameView* view = frame->view();
120953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    FloatQuad absolute = renderer.localToAbsoluteQuad(FloatQuad(rect));
121053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP1(view->contentsToRootView(roundedIntPoint(absolute.p1())));
121153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP2(view->contentsToRootView(roundedIntPoint(absolute.p2())));
121253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP3(view->contentsToRootView(roundedIntPoint(absolute.p3())));
121353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    quad->setP4(view->contentsToRootView(roundedIntPoint(absolute.p4())));
121453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
121553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1216bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)long long InspectorTimelineAgent::nodeId(Node* node)
1217e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
1218e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    return m_domAgent && node ? m_domAgent->backendNodeIdForNode(node, BackendNodeIdGroup) : 0;
1219e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
1220e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
1221bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)long long InspectorTimelineAgent::nodeId(RenderObject* renderer)
1222bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
1223bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return nodeId(renderer->generatingNode());
1224bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
1225bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1226e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)void InspectorTimelineAgent::releaseNodeIds()
1227e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
1228e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    ErrorString unused;
1229e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (m_domAgent)
1230e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        m_domAgent->releaseBackendNodeIds(&unused, BackendNodeIdGroup);
1231e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)}
1232e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
12338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)double InspectorTimelineAgent::timestamp()
12345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
12358abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return m_timeConverter.fromMonotonicallyIncreasingTime(WTF::monotonicallyIncreasingTime());
12365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Page* InspectorTimelineAgent::page()
12395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return m_pageAgent ? m_pageAgent->page() : 0;
12415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
12425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1243a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)PassRefPtr<JSONObject> InspectorTimelineAgent::createRecordForEvent(const TraceEventDispatcher::TraceEvent& event, const String& type, PassRefPtr<JSONObject> data)
1244a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1245a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    double timeestamp = m_timeConverter.fromMonotonicallyIncreasingTime(event.timestamp());
1246a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return TimelineRecordFactory::createBackgroundRecord(timeestamp, String::number(event.threadIdentifier()), type, data);
1247a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1248a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1249a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)TimelineRecordStack::TimelineRecordStack(InspectorTimelineAgent* timelineAgent)
1250a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    : m_timelineAgent(timelineAgent)
1251a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1252a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1253a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1254a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void TimelineRecordStack::addScopedRecord(PassRefPtr<JSONObject> record)
1255a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1256a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_stack.append(Entry(record));
1257a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1258a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1259a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void TimelineRecordStack::closeScopedRecord(double endTime)
1260a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1261a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_stack.isEmpty())
1262a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return;
1263a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    Entry last = m_stack.last();
1264a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    m_stack.removeLast();
1265a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    last.record->setNumber("endTime", endTime);
1266a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (last.children->length())
1267a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        last.record->setArray("children", last.children);
1268a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    addInstantRecord(last.record);
1269a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1270a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1271a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void TimelineRecordStack::addInstantRecord(PassRefPtr<JSONObject> record)
1272a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1273a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_stack.isEmpty())
1274a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_timelineAgent->sendEvent(record);
1275a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    else
1276a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_stack.last().children->pushObject(record);
1277a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1278a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
1279a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#ifndef NDEBUG
1280a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)bool TimelineRecordStack::isOpenRecordOfType(const String& type)
1281a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){
1282a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    String lastRecordType;
1283a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return m_stack.isEmpty() || (m_stack.last().record->getString("type", &lastRecordType) && type == lastRecordType);
1284a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)}
1285a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#endif
1286a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
12885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1289