5ff933398ceebb3307273eb19798f396c1fa16d1
[WebKit-https.git] / Source / WebCore / inspector / InspectorController.cpp
1 /*
2  * Copyright (C) 2011 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 #include "config.h"
32 #include "InspectorController.h"
33
34 #if ENABLE(INSPECTOR)
35
36 #include "Frame.h"
37 #include "GraphicsContext.h"
38 #include "InjectedScriptHost.h"
39 #include "InspectorAgent.h"
40 #include "InspectorBackendDispatcher.h"
41 #include "InspectorDebuggerAgent.h"
42 #include "InspectorClient.h"
43 #include "InspectorFrontend.h"
44 #include "InspectorFrontendClient.h"
45 #include "InspectorInstrumentation.h"
46 #include "Page.h"
47 #include "ScriptObject.h"
48 #include "Settings.h"
49
50 namespace WebCore {
51
52 const char* const InspectorController::ElementsPanel = "elements";
53 const char* const InspectorController::ConsolePanel = "console";
54 const char* const InspectorController::ScriptsPanel = "scripts";
55 const char* const InspectorController::ProfilesPanel = "profiles";
56
57 InspectorController::InspectorController(Page* page, InspectorClient* inspectorClient)
58     : m_inspectorAgent(new InspectorAgent(this, page, inspectorClient))
59     , m_inspectorBackendDispatcher(new InspectorBackendDispatcher(m_inspectorAgent.get()))
60     , m_inspectedPage(page)
61     , m_inspectorClient(inspectorClient)
62     , m_openingFrontend(false)
63 {
64 }
65
66 InspectorController::~InspectorController()
67 {
68 }
69
70 void InspectorController::setInspectorFrontendClient(PassOwnPtr<InspectorFrontendClient> inspectorFrontendClient)
71 {
72     m_inspectorFrontendClient = inspectorFrontendClient;
73 }
74
75 bool InspectorController::hasInspectorFrontendClient() const
76 {
77     return m_inspectorFrontendClient;
78 }
79
80 void InspectorController::didClearWindowObjectInWorld(Frame* frame, DOMWrapperWorld* world)
81 {
82     if (world != mainThreadNormalWorld())
83         return;
84
85     // If the page is supposed to serve as InspectorFrontend notify inspector frontend
86     // client that it's cleared so that the client can expose inspector bindings.
87     if (m_inspectorFrontendClient && frame == m_inspectedPage->mainFrame())
88         m_inspectorFrontendClient->windowObjectCleared();
89 }
90
91 void InspectorController::startTimelineProfiler()
92 {
93     m_inspectorAgent->startTimelineProfiler();
94 }
95
96 void InspectorController::stopTimelineProfiler()
97 {
98     m_inspectorAgent->stopTimelineProfiler();
99 }
100
101 void InspectorController::connectFrontend()
102 {
103     m_openingFrontend = false;
104     m_inspectorFrontend = new InspectorFrontend(m_inspectorClient);
105     m_inspectorAgent->setFrontend(m_inspectorFrontend.get());
106
107     if (!InspectorInstrumentation::hasFrontends())
108         ScriptController::setCaptureCallStackForUncaughtExceptions(true);
109     InspectorInstrumentation::frontendCreated();
110 }
111
112 void InspectorController::disconnectFrontend()
113 {
114     m_inspectorAgent->disconnectFrontend();
115 }
116
117 void InspectorController::disconnectFrontendImpl()
118 {
119     if (!m_inspectorFrontend)
120         return;
121
122     m_inspectorFrontend.clear();
123
124     InspectorInstrumentation::frontendDeleted();
125     if (!InspectorInstrumentation::hasFrontends())
126         ScriptController::setCaptureCallStackForUncaughtExceptions(false);
127 }
128
129 void InspectorController::show()
130 {
131     if (!enabled())
132         return;
133
134     if (m_openingFrontend)
135         return;
136
137     if (m_inspectorFrontend)
138         m_inspectorFrontend->bringToFront();
139     else {
140         m_openingFrontend = true;
141         m_inspectorClient->openInspectorFrontend(this);
142     }
143 }
144
145 void InspectorController::close()
146 {
147     if (!m_inspectorFrontend)
148         return;
149     m_inspectorFrontend->disconnectFromBackend();
150     disconnectFrontend();
151 }
152
153 void InspectorController::restoreInspectorStateFromCookie(const String& inspectorStateCookie)
154 {
155     m_inspectorAgent->restoreInspectorStateFromCookie(inspectorStateCookie);
156 }
157
158 void InspectorController::evaluateForTestInFrontend(long callId, const String& script)
159 {
160     m_inspectorAgent->evaluateForTestInFrontend(callId, script);
161 }
162
163 void InspectorController::drawNodeHighlight(GraphicsContext& context) const
164 {
165     m_inspectorAgent->drawNodeHighlight(context);
166 }
167
168 void InspectorController::inspect(Node* node)
169 {
170     if (!enabled())
171         return;
172
173     show();
174
175     m_inspectorAgent->inspect(node);
176 }
177
178 bool InspectorController::enabled() const
179 {
180     if (!m_inspectedPage)
181         return false;
182
183     return m_inspectedPage->settings()->developerExtrasEnabled();
184 }
185
186 void InspectorController::showPanel(const String& panel)
187 {
188     if (!enabled())
189         return;
190
191     show();
192
193     m_inspectorAgent->showPanel(panel);
194 }
195
196 bool InspectorController::timelineProfilerEnabled()
197 {
198     return m_inspectorAgent->timelineAgent();
199 }
200
201 #if ENABLE(JAVASCRIPT_DEBUGGER)
202 void InspectorController::enableProfiler()
203 {
204     m_inspectorAgent->enableProfiler();
205 }
206
207 void InspectorController::disableProfiler()
208 {
209     m_inspectorAgent->disableProfiler();
210 }
211
212 bool InspectorController::profilerEnabled()
213 {
214     return m_inspectorAgent->profilerEnabled();
215 }
216
217 bool InspectorController::debuggerEnabled()
218 {
219     return m_inspectorAgent->debuggerEnabled();
220 }
221
222 void InspectorController::showAndEnableDebugger()
223 {
224     m_inspectorAgent->showAndEnableDebugger();
225 }
226
227 void InspectorController::disableDebugger()
228 {
229     m_inspectorAgent->disableDebugger();
230 }
231
232 void InspectorController::startUserInitiatedProfiling()
233 {
234     m_inspectorAgent->startUserInitiatedProfiling();
235 }
236
237 void InspectorController::stopUserInitiatedProfiling()
238 {
239     m_inspectorAgent->stopUserInitiatedProfiling();
240 }
241
242 bool InspectorController::isRecordingUserInitiatedProfile() const
243 {
244     return m_inspectorAgent->isRecordingUserInitiatedProfile();
245 }
246
247 void InspectorController::setInspectorExtensionAPI(const String& source)
248 {
249     m_inspectorAgent->setInspectorExtensionAPI(source);
250 }
251
252 void InspectorController::resume()
253 {
254     if (InspectorDebuggerAgent* debuggerAgent = m_inspectorAgent->debuggerAgent())
255         debuggerAgent->resume();
256 }
257
258 void InspectorController::hideHighlight()
259 {
260     m_inspectorAgent->hideHighlight();
261 }
262
263 void InspectorController::dispatchMessageFromFrontend(const String& message)
264 {
265     m_inspectorBackendDispatcher->dispatch(message);
266 }
267
268 #endif
269
270 } // namespace WebCore
271
272 #endif // ENABLE(INSPECTOR)