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