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