2011-02-09 Pavel Feldman <pfeldman@chromium.org>
[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 #pragma warning(push, 0)
35 #include <WebCore/InspectorController.h>
36 #include <WebCore/Page.h>
37 #pragma warning(pop)
38 #include <wtf/Assertions.h>
39
40 using namespace WebCore;
41
42 WebInspector* WebInspector::createInstance(WebView* webView)
43 {
44     WebInspector* inspector = new WebInspector(webView);
45     inspector->AddRef();
46     return inspector;
47 }
48
49 WebInspector::WebInspector(WebView* webView)
50     : m_refCount(0)
51     , m_webView(webView)
52 {
53     ASSERT_ARG(webView, webView);
54
55     gClassCount++;
56     gClassNameCount.add("WebInspector");
57 }
58
59 WebInspector::~WebInspector()
60 {
61     gClassCount--;
62     gClassNameCount.remove("WebInspector");
63 }
64
65 void WebInspector::webViewClosed()
66 {
67     m_webView = 0;
68 }
69
70 HRESULT STDMETHODCALLTYPE WebInspector::QueryInterface(REFIID riid, void** ppvObject)
71 {
72     *ppvObject = 0;
73     if (IsEqualGUID(riid, IID_IWebInspector))
74         *ppvObject = static_cast<IWebInspector*>(this);
75     else if (IsEqualGUID(riid, IID_IWebInspectorPrivate))
76         *ppvObject = static_cast<IWebInspectorPrivate*>(this);
77     else if (IsEqualGUID(riid, IID_IUnknown))
78         *ppvObject = static_cast<IWebInspector*>(this);
79     else
80         return E_NOINTERFACE;
81
82     AddRef();
83     return S_OK;
84 }
85
86 ULONG STDMETHODCALLTYPE WebInspector::AddRef(void)
87 {
88     return ++m_refCount;
89 }
90
91 ULONG STDMETHODCALLTYPE WebInspector::Release(void)
92 {
93     ULONG newRef = --m_refCount;
94     if (!newRef)
95         delete this;
96
97     return newRef;
98 }
99
100 HRESULT STDMETHODCALLTYPE WebInspector::show()
101 {
102     if (m_webView)
103         if (Page* page = m_webView->page())
104             page->inspectorController()->show();
105
106     return S_OK;
107 }
108
109 HRESULT STDMETHODCALLTYPE WebInspector::showConsole()
110 {
111     if (m_webView)
112         if (Page* page = m_webView->page())
113             page->inspectorController()->showConsole();
114
115     return S_OK;
116 }
117
118 HRESULT STDMETHODCALLTYPE WebInspector::unused1()
119 {
120     return S_OK;
121 }
122
123 HRESULT STDMETHODCALLTYPE WebInspector::close()
124 {
125     if (m_webView)
126         if (Page* page = m_webView->page())
127             page->inspectorController()->close();
128
129     return S_OK;
130 }
131
132 HRESULT STDMETHODCALLTYPE WebInspector::attach()
133 {
134     return S_OK;
135 }
136
137 HRESULT STDMETHODCALLTYPE WebInspector::detach()
138 {
139     return S_OK;
140 }
141
142 HRESULT STDMETHODCALLTYPE WebInspector::isDebuggingJavaScript(BOOL* isDebugging)
143 {
144     if (!isDebugging)
145         return E_POINTER;
146
147     *isDebugging = FALSE;
148
149     if (!m_webView)
150         return S_OK;
151
152     Page* page = m_webView->page();
153     if (!page)
154         return S_OK;
155
156     *isDebugging = page->inspectorController()->debuggerEnabled();
157     return S_OK;
158 }
159
160 HRESULT STDMETHODCALLTYPE WebInspector::toggleDebuggingJavaScript()
161 {
162     if (!m_webView)
163         return S_OK;
164
165     Page* page = m_webView->page();
166     if (!page)
167         return S_OK;
168
169     InspectorController* inspector = page->inspectorController();
170
171     if (inspector->debuggerEnabled())
172         inspector->disableDebugger();
173     else
174         inspector->showAndEnableDebugger();
175
176     return S_OK;
177 }
178
179 HRESULT STDMETHODCALLTYPE WebInspector::isProfilingJavaScript(BOOL* isProfiling)
180 {
181     if (!isProfiling)
182         return E_POINTER;
183
184     *isProfiling = FALSE;
185
186     if (!m_webView)
187         return S_OK;
188
189     Page* page = m_webView->page();
190     if (!page)
191         return S_OK;
192
193     *isProfiling = page->inspectorController()->isRecordingUserInitiatedProfile();
194     return S_OK;
195 }
196
197 HRESULT STDMETHODCALLTYPE WebInspector::toggleProfilingJavaScript()
198 {
199     if (!m_webView)
200         return S_OK;
201
202     Page* page = m_webView->page();
203     if (!page)
204         return S_OK;
205
206     InspectorController* inspector = page->inspectorController();
207
208     if (inspector->isRecordingUserInitiatedProfile())
209         inspector->stopUserInitiatedProfiling();
210     else
211         inspector->startUserInitiatedProfiling();
212
213     return S_OK;
214 }
215
216 HRESULT STDMETHODCALLTYPE WebInspector::isJavaScriptProfilingEnabled(BOOL* isProfilingEnabled)
217 {
218     if (!isProfilingEnabled)
219         return E_POINTER;
220
221     *isProfilingEnabled = FALSE;
222
223     if (!m_webView)
224         return S_OK;
225
226     Page* page = m_webView->page();
227     if (!page)
228         return S_OK;
229
230     *isProfilingEnabled = page->inspectorController()->profilerEnabled();
231     return S_OK;
232 }
233
234 HRESULT STDMETHODCALLTYPE WebInspector::setJavaScriptProfilingEnabled(BOOL enabled)
235 {
236     if (!m_webView)
237         return S_OK;
238
239     Page* page = m_webView->page();
240     if (!page)
241         return S_OK;
242
243     if (enabled)
244         page->inspectorController()->enableProfiler();
245     else
246         page->inspectorController()->disableProfiler();
247
248     return S_OK;
249 }
250
251 HRESULT STDMETHODCALLTYPE  WebInspector::evaluateInFrontend(ULONG callId, BSTR bScript)
252 {
253     if (!m_webView)
254         return S_OK;
255
256     Page* page = m_webView->page();
257     if (!page)
258         return S_OK;
259
260     String script(bScript, SysStringLen(bScript));
261     page->inspectorController()->evaluateForTestInFrontend(callId, script);
262     return S_OK;
263 }
264
265 HRESULT STDMETHODCALLTYPE WebInspector::isTimelineProfilingEnabled(BOOL* isEnabled)
266 {
267     if (!isEnabled)
268         return E_POINTER;
269
270     *isEnabled = FALSE;
271
272     if (!m_webView)
273         return S_OK;
274
275     Page* page = m_webView->page();
276     if (!page)
277         return S_OK;
278
279     *isEnabled = page->inspectorController()->timelineProfilerEnabled();
280     return S_OK;
281 }
282
283 HRESULT STDMETHODCALLTYPE WebInspector::setTimelineProfilingEnabled(BOOL enabled)
284 {
285     if (!m_webView)
286         return S_OK;
287
288     Page* page = m_webView->page();
289     if (!page)
290         return S_OK;
291
292     if (enabled)
293         page->inspectorController()->startTimelineProfiler();
294     else
295         page->inspectorController()->stopTimelineProfiler();
296
297     return S_OK;
298 }