45af63599f8ce7d35f71911da891627d0cf9ec7a
[WebKit-https.git] / Source / WebCore / inspector / InspectorTimelineAgent.h
1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 * Copyright (C) 2014 University of Washington.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 *     * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *     * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 *     * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifndef InspectorTimelineAgent_h
33 #define InspectorTimelineAgent_h
34
35 #include "InspectorWebAgentBase.h"
36 #include "LayoutRect.h"
37 #include <inspector/InspectorBackendDispatchers.h>
38 #include <inspector/InspectorFrontendDispatchers.h>
39 #include <inspector/InspectorValues.h>
40 #include <inspector/ScriptDebugListener.h>
41 #include <wtf/Stopwatch.h>
42 #include <wtf/Vector.h>
43 #include <wtf/WeakPtr.h>
44
45 namespace JSC {
46 class Profile;
47 }
48
49 namespace WebCore {
50
51 class Event;
52 class FloatQuad;
53 class Frame;
54 class InspectorClient;
55 class InspectorPageAgent;
56 class InstrumentingAgents;
57 class IntRect;
58 class URL;
59 class Page;
60 class PageScriptDebugServer;
61 class RenderObject;
62 class ResourceRequest;
63 class ResourceResponse;
64
65 typedef String ErrorString;
66
67 enum class TimelineRecordType {
68     EventDispatch,
69     ScheduleStyleRecalculation,
70     RecalculateStyles,
71     InvalidateLayout,
72     Layout,
73     Paint,
74     ScrollLayer,
75
76     ParseHTML,
77
78     TimerInstall,
79     TimerRemove,
80     TimerFire,
81
82     EvaluateScript,
83
84     MarkLoad,
85     MarkDOMContent,
86
87     TimeStamp,
88     Time,
89     TimeEnd,
90
91     XHRReadyStateChange,
92     XHRLoad,
93
94     FunctionCall,
95     ProbeSample,
96     ConsoleProfile,
97
98     RequestAnimationFrame,
99     CancelAnimationFrame,
100     FireAnimationFrame,
101
102     WebSocketCreate,
103     WebSocketSendHandshakeRequest,
104     WebSocketReceiveHandshakeResponse,
105     WebSocketDestroy
106 };
107
108 class InspectorTimelineAgent final
109     : public InspectorAgentBase
110     , public Inspector::TimelineBackendDispatcherHandler
111     , public Inspector::ScriptDebugListener {
112     WTF_MAKE_NONCOPYABLE(InspectorTimelineAgent);
113     WTF_MAKE_FAST_ALLOCATED;
114 public:
115     enum InspectorType { PageInspector, WorkerInspector };
116
117     InspectorTimelineAgent(InstrumentingAgents*, InspectorPageAgent*, InspectorType, InspectorClient*);
118     virtual ~InspectorTimelineAgent();
119
120     virtual void didCreateFrontendAndBackend(Inspector::FrontendChannel*, Inspector::BackendDispatcher*) override;
121     virtual void willDestroyFrontendAndBackend(Inspector::DisconnectReason) override;
122
123     virtual void start(ErrorString&, const int* maxCallStackDepth = nullptr) override;
124     virtual void stop(ErrorString&) override;
125
126     int id() const { return m_id; }
127
128     void setPageScriptDebugServer(PageScriptDebugServer*);
129
130     void didCommitLoad();
131
132     // Methods called from WebCore.
133     void startFromConsole(JSC::ExecState*, const String &title);
134     PassRefPtr<JSC::Profile> stopFromConsole(JSC::ExecState*, const String& title);
135
136     // InspectorInstrumentation callbacks.
137     void didInstallTimer(int timerId, int timeout, bool singleShot, Frame*);
138     void didRemoveTimer(int timerId, Frame*);
139     void willFireTimer(int timerId, Frame*);
140     void didFireTimer();
141     void willCallFunction(const String& scriptName, int scriptLine, Frame*);
142     void didCallFunction(Frame*);
143     void willDispatchXHRReadyStateChangeEvent(const String&, int, Frame*);
144     void didDispatchXHRReadyStateChangeEvent();
145     void willDispatchEvent(const Event&, Frame*);
146     void didDispatchEvent();
147     void willEvaluateScript(const String&, int, Frame&);
148     void didEvaluateScript(Frame&);
149     void didInvalidateLayout(Frame&);
150     void willLayout(Frame&);
151     void didLayout(RenderObject*);
152     void willScroll(Frame&);
153     void didScroll();
154     void willDispatchXHRLoadEvent(const String&, Frame*);
155     void didDispatchXHRLoadEvent();
156     void willPaint(Frame&);
157     void didPaint(RenderObject*, const LayoutRect&);
158     void willRecalculateStyle(Frame*);
159     void didRecalculateStyle();
160     void didScheduleStyleRecalculation(Frame*);
161     void willWriteHTML(unsigned startLine, Frame*);
162     void didWriteHTML(unsigned endLine);
163     void didTimeStamp(Frame&, const String&);
164     void didMarkDOMContentEvent(Frame&);
165     void didMarkLoadEvent(Frame&);
166     void didRequestAnimationFrame(int callbackId, Frame*);
167     void didCancelAnimationFrame(int callbackId, Frame*);
168     void willFireAnimationFrame(int callbackId, Frame*);
169     void didFireAnimationFrame();
170     void time(Frame&, const String&);
171     void timeEnd(Frame&, const String&);
172 #if ENABLE(WEB_SOCKETS)
173     void didCreateWebSocket(unsigned long identifier, const URL&, const String& protocol, Frame*);
174     void willSendWebSocketHandshakeRequest(unsigned long identifier, Frame*);
175     void didReceiveWebSocketHandshakeResponse(unsigned long identifier, Frame*);
176     void didDestroyWebSocket(unsigned long identifier, Frame*);
177 #endif
178
179 protected:
180     // ScriptDebugListener
181     virtual void didParseSource(JSC::SourceID, const Script&) override { }
182     virtual void failedToParseSource(const String&, const String&, int, int, const String&) override { }
183     virtual void didPause(JSC::ExecState*, const Deprecated::ScriptValue&, const Deprecated::ScriptValue&) override { }
184     virtual void didContinue() override { }
185
186     virtual void breakpointActionLog(JSC::ExecState*, const String&) override { }
187     virtual void breakpointActionSound(int) override { }
188     virtual void breakpointActionProbe(JSC::ExecState*, const Inspector::ScriptBreakpointAction&, unsigned batchId, unsigned sampleId, const Deprecated::ScriptValue& result) override;
189
190 private:
191     friend class TimelineRecordStack;
192
193     struct TimelineRecordEntry {
194         TimelineRecordEntry()
195             : type(TimelineRecordType::EventDispatch) { }
196         TimelineRecordEntry(PassRefPtr<Inspector::InspectorObject> record, PassRefPtr<Inspector::InspectorObject> data, PassRefPtr<Inspector::InspectorArray> children, TimelineRecordType type)
197             : record(record), data(data), children(children), type(type)
198         {
199         }
200
201         RefPtr<Inspector::InspectorObject> record;
202         RefPtr<Inspector::InspectorObject> data;
203         RefPtr<Inspector::InspectorArray> children;
204         TimelineRecordType type;
205     };
206
207     void internalStart(const int* maxCallStackDepth = nullptr);
208     void internalStop();
209     double timestamp();
210
211     void sendEvent(RefPtr<Inspector::InspectorObject>&&);
212     void appendRecord(RefPtr<Inspector::InspectorObject>&& data, TimelineRecordType, bool captureCallStack, Frame*);
213     void pushCurrentRecord(RefPtr<Inspector::InspectorObject>&&, TimelineRecordType, bool captureCallStack, Frame*);
214     void pushCurrentRecord(const TimelineRecordEntry& record) { m_recordStack.append(record); }
215
216     TimelineRecordEntry createRecordEntry(RefPtr<Inspector::InspectorObject>&& data, TimelineRecordType, bool captureCallStack, Frame*);
217
218     void setFrameIdentifier(Inspector::InspectorObject* record, Frame*);
219
220     void didCompleteRecordEntry(const TimelineRecordEntry&);
221     void didCompleteCurrentRecord(TimelineRecordType);
222
223     void addRecordToTimeline(RefPtr<Inspector::InspectorObject>&&, TimelineRecordType);
224     void clearRecordStack();
225
226     void localToPageQuad(const RenderObject&, const LayoutRect&, FloatQuad*);
227     Page* page();
228
229     InspectorPageAgent* m_pageAgent;
230     PageScriptDebugServer* m_scriptDebugServer;
231
232     std::unique_ptr<Inspector::TimelineFrontendDispatcher> m_frontendDispatcher;
233     RefPtr<Inspector::TimelineBackendDispatcher> m_backendDispatcher;
234
235     Vector<TimelineRecordEntry> m_recordStack;
236
237     int m_id;
238     int m_callStackDepth;
239     int m_maxCallStackDepth;
240     InspectorType m_inspectorType;
241     InspectorClient* m_client;
242
243     Vector<TimelineRecordEntry> m_pendingConsoleProfileRecords;
244
245     bool m_enabled;
246     bool m_enabledFromFrontend;
247 };
248
249 } // namespace WebCore
250
251 #endif // !defined(InspectorTimelineAgent_h)