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