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