118d70d0bf98987cea3a5680ef813aa800de9e26
[WebKit-https.git] / Source / WebCore / inspector / InspectorTimelineAgent.h
1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef InspectorTimelineAgent_h
32 #define InspectorTimelineAgent_h
33
34 #if ENABLE(INSPECTOR)
35
36 #include "InspectorBaseAgent.h"
37 #include "InspectorFrontend.h"
38 #include "InspectorValues.h"
39 #include "LayoutRect.h"
40 #include "PlatformInstrumentation.h"
41 #include "ScriptGCEvent.h"
42 #include "ScriptGCEventListener.h"
43 #include <wtf/PassOwnPtr.h>
44 #include <wtf/Vector.h>
45 #include <wtf/WeakPtr.h>
46
47 namespace WebCore {
48 class Event;
49 class FloatQuad;
50 class Frame;
51 class InspectorClient;
52 class InspectorFrontend;
53 class InspectorMemoryAgent;
54 class InspectorPageAgent;
55 class InspectorState;
56 class InstrumentingAgents;
57 class IntRect;
58 class KURL;
59 class Page;
60 class RenderObject;
61 class ResourceRequest;
62 class ResourceResponse;
63 class TimelineTraceEventProcessor;
64
65 typedef String ErrorString;
66
67 namespace TimelineRecordType {
68 extern const char DecodeImage[];
69 extern const char Rasterize[];
70 };
71
72 class TimelineTimeConverter {
73 public:
74     TimelineTimeConverter()
75         : m_startOffset(0)
76     {
77     }
78     double fromMonotonicallyIncreasingTime(double time) const  { return (time - m_startOffset) * 1000.0; }
79     void reset();
80
81 private:
82     double m_startOffset;
83 };
84
85 class InspectorTimelineAgent
86     : public InspectorBaseAgent<InspectorTimelineAgent>,
87       public ScriptGCEventListener,
88       public InspectorBackendDispatcher::TimelineCommandHandler,
89       public PlatformInstrumentationClient {
90     WTF_MAKE_NONCOPYABLE(InspectorTimelineAgent);
91 public:
92     enum InspectorType { PageInspector, WorkerInspector };
93
94     static PassOwnPtr<InspectorTimelineAgent> create(InstrumentingAgents* instrumentingAgents, InspectorPageAgent* pageAgent, InspectorMemoryAgent* memoryAgent, InspectorCompositeState* state, InspectorType type, InspectorClient* client)
95     {
96         return adoptPtr(new InspectorTimelineAgent(instrumentingAgents, pageAgent, memoryAgent, state, type, client));
97     }
98
99     ~InspectorTimelineAgent();
100
101     virtual void setFrontend(InspectorFrontend*);
102     virtual void clearFrontend();
103     virtual void restore();
104
105     virtual void start(ErrorString*, const int* maxCallStackDepth, const bool* includeDomCounters, const bool* includeNativeMemoryStatistics);
106     virtual void stop(ErrorString*);
107     virtual void canMonitorMainThread(ErrorString*, bool*);
108     virtual void supportsFrameInstrumentation(ErrorString*, bool*);
109
110     int id() const { return m_id; }
111
112     void didCommitLoad();
113
114     // Methods called from WebCore.
115     void willCallFunction(const String& scriptName, int scriptLine, Frame*);
116     void didCallFunction();
117
118     void willDispatchEvent(const Event&, Frame*);
119     void didDispatchEvent();
120
121     void didBeginFrame();
122     void didCancelFrame();
123
124     void didInvalidateLayout(Frame*);
125     void willLayout(Frame*);
126     void didLayout(RenderObject*);
127
128     void didScheduleStyleRecalculation(Frame*);
129     void willRecalculateStyle(Frame*);
130     void didRecalculateStyle();
131
132     void willPaint(Frame*);
133     void didPaint(RenderObject*, const LayoutRect&);
134
135     void willScroll(Frame*);
136     void didScroll();
137
138     void willComposite();
139     void didComposite();
140
141     void willWriteHTML(unsigned startLine, Frame*);
142     void didWriteHTML(unsigned endLine);
143
144     void didInstallTimer(int timerId, int timeout, bool singleShot, Frame*);
145     void didRemoveTimer(int timerId, Frame*);
146     void willFireTimer(int timerId, Frame*);
147     void didFireTimer();
148
149     void willDispatchXHRReadyStateChangeEvent(const String&, int, Frame*);
150     void didDispatchXHRReadyStateChangeEvent();
151     void willDispatchXHRLoadEvent(const String&, Frame*);
152     void didDispatchXHRLoadEvent();
153
154     void willEvaluateScript(const String&, int, Frame*);
155     void didEvaluateScript();
156
157     void didTimeStamp(Frame*, const String&);
158     void didMarkDOMContentEvent(Frame*);
159     void didMarkLoadEvent(Frame*);
160
161     void time(Frame*, const String&);
162     void timeEnd(Frame*, const String&);
163
164     void didScheduleResourceRequest(const String& url, Frame*);
165     void willSendResourceRequest(unsigned long, const ResourceRequest&, Frame*);
166     void willReceiveResourceResponse(unsigned long, const ResourceResponse&, Frame*);
167     void didReceiveResourceResponse();
168     void didFinishLoadingResource(unsigned long, bool didFail, double finishTime, Frame*);
169     void willReceiveResourceData(unsigned long identifier, Frame*, int length);
170     void didReceiveResourceData();
171
172     void didRequestAnimationFrame(int callbackId, Frame*);
173     void didCancelAnimationFrame(int callbackId, Frame*);
174     void willFireAnimationFrame(int callbackId, Frame*);
175     void didFireAnimationFrame();
176
177     void willProcessTask();
178     void didProcessTask();
179
180 #if ENABLE(WEB_SOCKETS)
181     void didCreateWebSocket(unsigned long identifier, const KURL&, const String& protocol, Frame*);
182     void willSendWebSocketHandshakeRequest(unsigned long identifier, Frame*);
183     void didReceiveWebSocketHandshakeResponse(unsigned long identifier, Frame*);
184     void didDestroyWebSocket(unsigned long identifier, Frame*);
185 #endif
186
187     // ScriptGCEventListener methods.
188     virtual void didGC(double, double, size_t);
189
190     // PlatformInstrumentationClient methods.
191     virtual void willDecodeImage(const String& imageType) OVERRIDE;
192     virtual void didDecodeImage() OVERRIDE;
193     virtual void willResizeImage(bool shouldCache) OVERRIDE;
194     virtual void didResizeImage() OVERRIDE;
195
196 private:
197     friend class TimelineRecordStack;
198     friend class TimelineTraceEventProcessor;
199
200     struct TimelineRecordEntry {
201         TimelineRecordEntry(PassRefPtr<InspectorObject> record, PassRefPtr<InspectorObject> data, PassRefPtr<InspectorArray> children, const String& type, size_t usedHeapSizeAtStart)
202             : record(record), data(data), children(children), type(type), usedHeapSizeAtStart(usedHeapSizeAtStart)
203         {
204         }
205         RefPtr<InspectorObject> record;
206         RefPtr<InspectorObject> data;
207         RefPtr<InspectorArray> children;
208         String type;
209         size_t usedHeapSizeAtStart;
210     };
211         
212     InspectorTimelineAgent(InstrumentingAgents*, InspectorPageAgent*, InspectorMemoryAgent*, InspectorCompositeState*, InspectorType, InspectorClient*);
213
214     void sendEvent(PassRefPtr<InspectorObject>);
215     void appendRecord(PassRefPtr<InspectorObject> data, const String& type, bool captureCallStack, Frame*);
216     void pushCurrentRecord(PassRefPtr<InspectorObject>, const String& type, bool captureCallStack, Frame*, bool hasLowLevelDetails = false);
217
218     void setDOMCounters(TypeBuilder::Timeline::TimelineEvent* record);
219     void setNativeHeapStatistics(TypeBuilder::Timeline::TimelineEvent* record);
220     void setFrameIdentifier(InspectorObject* record, Frame*);
221     void pushGCEventRecords();
222
223     void didCompleteCurrentRecord(const String& type);
224
225     void setHeapSizeStatistics(InspectorObject* record);
226     void commitFrameRecord();
227
228     void addRecordToTimeline(PassRefPtr<InspectorObject>, const String& type);
229     void innerAddRecordToTimeline(PassRefPtr<InspectorObject>, const String& type);
230     void clearRecordStack();
231
232     void localToPageQuad(const RenderObject& renderer, const LayoutRect&, FloatQuad*);
233     const TimelineTimeConverter& timeConverter() const { return m_timeConverter; }
234     double timestamp();
235     Page* page();
236
237     InspectorPageAgent* m_pageAgent;
238     InspectorMemoryAgent* m_memoryAgent;
239     TimelineTimeConverter m_timeConverter;
240
241     InspectorFrontend::Timeline* m_frontend;
242     double m_timestampOffset;
243
244     Vector<TimelineRecordEntry> m_recordStack;
245
246     int m_id;
247     struct GCEvent {
248         GCEvent(double startTime, double endTime, size_t collectedBytes)
249             : startTime(startTime), endTime(endTime), collectedBytes(collectedBytes)
250         {
251         }
252         double startTime;
253         double endTime;
254         size_t collectedBytes;
255     };
256     typedef Vector<GCEvent> GCEvents;
257     GCEvents m_gcEvents;
258     int m_maxCallStackDepth;
259     unsigned m_platformInstrumentationClientInstalledAtStackDepth;
260     RefPtr<InspectorObject> m_pendingFrameRecord;
261     InspectorType m_inspectorType;
262     InspectorClient* m_client;
263     WeakPtrFactory<InspectorTimelineAgent> m_weakFactory;
264     RefPtr<TimelineTraceEventProcessor> m_traceEventProcessor;
265 };
266
267 } // namespace WebCore
268
269 #endif // !ENABLE(INSPECTOR)
270 #endif // !defined(InspectorTimelineAgent_h)