976391da92640b81858785dcaeb025b4acd19d77
[WebKit-https.git] / Source / WebKit / win / WebInspector.cpp
1 /*
2  * Copyright (C) 2007 Apple 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
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "WebInspector.h"
31
32 #include "WebKitDLL.h"
33 #include "WebView.h"
34 #include <WebCore/InspectorController.h>
35 #include <WebCore/Page.h>
36 #include <wtf/Assertions.h>
37
38 using namespace WebCore;
39
40 WebInspector* WebInspector::createInstance(WebView* webView)
41 {
42     WebInspector* inspector = new WebInspector(webView);
43     inspector->AddRef();
44     return inspector;
45 }
46
47 WebInspector::WebInspector(WebView* webView)
48     : m_refCount(0)
49     , m_webView(webView)
50 {
51     ASSERT_ARG(webView, webView);
52
53     gClassCount++;
54     gClassNameCount.add("WebInspector");
55 }
56
57 WebInspector::~WebInspector()
58 {
59     gClassCount--;
60     gClassNameCount.remove("WebInspector");
61 }
62
63 void WebInspector::webViewClosed()
64 {
65     m_webView = 0;
66 }
67
68 HRESULT STDMETHODCALLTYPE WebInspector::QueryInterface(REFIID riid, void** ppvObject)
69 {
70     *ppvObject = 0;
71     if (IsEqualGUID(riid, IID_IWebInspector))
72         *ppvObject = static_cast<IWebInspector*>(this);
73     else if (IsEqualGUID(riid, IID_IWebInspectorPrivate))
74         *ppvObject = static_cast<IWebInspectorPrivate*>(this);
75     else if (IsEqualGUID(riid, IID_IUnknown))
76         *ppvObject = static_cast<IWebInspector*>(this);
77     else
78         return E_NOINTERFACE;
79
80     AddRef();
81     return S_OK;
82 }
83
84 ULONG STDMETHODCALLTYPE WebInspector::AddRef(void)
85 {
86     return ++m_refCount;
87 }
88
89 ULONG STDMETHODCALLTYPE WebInspector::Release(void)
90 {
91     ULONG newRef = --m_refCount;
92     if (!newRef)
93         delete this;
94
95     return newRef;
96 }
97
98 HRESULT STDMETHODCALLTYPE WebInspector::show()
99 {
100     if (m_webView)
101         if (Page* page = m_webView->page())
102             page->inspectorController()->show();
103
104     return S_OK;
105 }
106
107 HRESULT STDMETHODCALLTYPE WebInspector::showConsole()
108 {
109     if (m_webView)
110         if (Page* page = m_webView->page())
111             page->inspectorController()->showConsole();
112
113     return S_OK;
114 }
115
116 HRESULT STDMETHODCALLTYPE WebInspector::unused1()
117 {
118     return S_OK;
119 }
120
121 HRESULT STDMETHODCALLTYPE WebInspector::close()
122 {
123     if (m_webView)
124         if (Page* page = m_webView->page())
125             page->inspectorController()->close();
126
127     return S_OK;
128 }
129
130 HRESULT STDMETHODCALLTYPE WebInspector::attach()
131 {
132     return S_OK;
133 }
134
135 HRESULT STDMETHODCALLTYPE WebInspector::detach()
136 {
137     return S_OK;
138 }
139
140 HRESULT STDMETHODCALLTYPE WebInspector::isDebuggingJavaScript(BOOL* isDebugging)
141 {
142     if (!isDebugging)
143         return E_POINTER;
144
145     *isDebugging = FALSE;
146
147     if (!m_webView)
148         return S_OK;
149
150     Page* page = m_webView->page();
151     if (!page)
152         return S_OK;
153
154     *isDebugging = page->inspectorController()->debuggerEnabled();
155     return S_OK;
156 }
157
158 HRESULT STDMETHODCALLTYPE WebInspector::toggleDebuggingJavaScript()
159 {
160     if (!m_webView)
161         return S_OK;
162
163     Page* page = m_webView->page();
164     if (!page)
165         return S_OK;
166
167     InspectorController* inspector = page->inspectorController();
168
169     if (inspector->debuggerEnabled())
170         inspector->disableDebugger();
171     else
172         inspector->showAndEnableDebugger();
173
174     return S_OK;
175 }
176
177 HRESULT STDMETHODCALLTYPE WebInspector::isProfilingJavaScript(BOOL* isProfiling)
178 {
179     if (!isProfiling)
180         return E_POINTER;
181
182     *isProfiling = FALSE;
183
184     if (!m_webView)
185         return S_OK;
186
187     Page* page = m_webView->page();
188     if (!page)
189         return S_OK;
190
191     *isProfiling = page->inspectorController()->isRecordingUserInitiatedProfile();
192     return S_OK;
193 }
194
195 HRESULT STDMETHODCALLTYPE WebInspector::toggleProfilingJavaScript()
196 {
197     if (!m_webView)
198         return S_OK;
199
200     Page* page = m_webView->page();
201     if (!page)
202         return S_OK;
203
204     InspectorController* inspector = page->inspectorController();
205
206     if (inspector->isRecordingUserInitiatedProfile())
207         inspector->stopUserInitiatedProfiling();
208     else
209         inspector->startUserInitiatedProfiling();
210
211     return S_OK;
212 }
213
214 HRESULT STDMETHODCALLTYPE WebInspector::isJavaScriptProfilingEnabled(BOOL* isProfilingEnabled)
215 {
216     if (!isProfilingEnabled)
217         return E_POINTER;
218
219     *isProfilingEnabled = FALSE;
220
221     if (!m_webView)
222         return S_OK;
223
224     Page* page = m_webView->page();
225     if (!page)
226         return S_OK;
227
228     *isProfilingEnabled = page->inspectorController()->profilerEnabled();
229     return S_OK;
230 }
231
232 HRESULT STDMETHODCALLTYPE WebInspector::setJavaScriptProfilingEnabled(BOOL enabled)
233 {
234     if (!m_webView)
235         return S_OK;
236
237     Page* page = m_webView->page();
238     if (!page)
239         return S_OK;
240
241     if (enabled)
242         page->inspectorController()->enableProfiler();
243     else
244         page->inspectorController()->disableProfiler();
245
246     return S_OK;
247 }
248
249 HRESULT STDMETHODCALLTYPE  WebInspector::evaluateInFrontend(ULONG callId, BSTR bScript)
250 {
251     if (!m_webView)
252         return S_OK;
253
254     Page* page = m_webView->page();
255     if (!page)
256         return S_OK;
257
258     String script(bScript, SysStringLen(bScript));
259     page->inspectorController()->evaluateForTestInFrontend(callId, script);
260     return S_OK;
261 }
262
263 HRESULT STDMETHODCALLTYPE WebInspector::isTimelineProfilingEnabled(BOOL* isEnabled)
264 {
265     if (!isEnabled)
266         return E_POINTER;
267
268     *isEnabled = FALSE;
269
270     if (!m_webView)
271         return S_OK;
272
273     Page* page = m_webView->page();
274     if (!page)
275         return S_OK;
276
277     *isEnabled = page->inspectorController()->timelineProfilerEnabled();
278     return S_OK;
279 }
280
281 HRESULT STDMETHODCALLTYPE WebInspector::setTimelineProfilingEnabled(BOOL enabled)
282 {
283     if (!m_webView)
284         return S_OK;
285
286     Page* page = m_webView->page();
287     if (!page)
288         return S_OK;
289
290     if (enabled)
291         page->inspectorController()->startTimelineProfiler();
292     else
293         page->inspectorController()->stopTimelineProfiler();
294
295     return S_OK;
296 }