2011-01-17 Pavel Feldman <pfeldman@chromium.org>
[WebKit-https.git] / Source / WebKit / mac / WebInspector / WebInspector.mm
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 #import "WebInspector.h"
30
31 #import "WebFrameInternal.h"
32 #import "WebInspectorPrivate.h"
33 #import "WebInspectorFrontend.h"
34
35 #include <WebCore/Document.h>
36 #include <WebCore/Frame.h>
37 #include <WebCore/InspectorController.h>
38 #include <WebCore/Page.h>
39
40 using namespace WebCore;
41
42 @implementation WebInspector
43 - (id)initWithWebView:(WebView *)webView
44 {
45     if (!(self = [super init]))
46         return nil;
47     _webView = webView; // not retained to prevent a cycle
48     return self;
49 }
50
51 - (void)dealloc
52 {
53     [_frontend release];
54     [super dealloc];
55 }
56
57 - (void)webViewClosed
58 {
59     _webView = nil;
60 }
61
62 - (void)show:(id)sender
63 {
64     if (Page* page = core(_webView))
65         page->inspectorController()->show();
66 }
67
68 - (void)showConsole:(id)sender
69 {
70     if (Page* page = core(_webView))
71         page->inspectorController()->showPanel(InspectorController::ConsolePanel);
72 }
73
74 - (void)showTimeline:(id)sender
75 {
76     // Not used anymore. Remove when a release of Safari non-longer calls this.
77 }
78
79 - (BOOL)isDebuggingJavaScript
80 {
81     if (Page* page = core(_webView))
82         return page->inspectorController()->debuggerEnabled();
83     return NO;
84 }
85
86 - (void)toggleDebuggingJavaScript:(id)sender
87 {
88     if ([self isDebuggingJavaScript])
89         [self stopDebuggingJavaScript:sender];
90     else
91         [self startDebuggingJavaScript:sender];
92 }
93
94 - (void)startDebuggingJavaScript:(id)sender
95 {
96     Page* page = core(_webView);
97     if (!page)
98         return;
99     page->inspectorController()->showAndEnableDebugger();
100 }
101
102 - (void)stopDebuggingJavaScript:(id)sender
103 {
104     if (Page* page = core(_webView))
105         page->inspectorController()->disableDebugger();
106 }
107
108 - (BOOL)isProfilingJavaScript
109 {
110     if (Page* page = core(_webView))
111         return page->inspectorController()->isRecordingUserInitiatedProfile();
112     return NO;
113 }
114
115 - (void)toggleProfilingJavaScript:(id)sender
116 {
117     if ([self isProfilingJavaScript])
118         [self stopProfilingJavaScript:sender];
119     else
120         [self startProfilingJavaScript:sender];
121 }
122
123 - (void)startProfilingJavaScript:(id)sender
124 {
125     if (Page* page = core(_webView))
126         page->inspectorController()->startUserInitiatedProfiling();
127 }
128
129 - (void)stopProfilingJavaScript:(id)sender
130 {
131     Page* page = core(_webView);
132     if (!page)
133         return;
134     page->inspectorController()->stopUserInitiatedProfiling();
135     page->inspectorController()->showPanel(InspectorController::ProfilesPanel);
136 }
137
138 - (BOOL)isJavaScriptProfilingEnabled
139 {
140     if (Page* page = core(_webView))
141         return page->inspectorController()->profilerEnabled();
142     return NO;
143 }
144
145 - (void)setJavaScriptProfilingEnabled:(BOOL)enabled
146 {
147     Page* page = core(_webView);
148     if (!page)
149         return;
150
151     if (enabled)
152         page->inspectorController()->enableProfiler();
153     else
154         page->inspectorController()->disableProfiler();
155 }
156
157 - (BOOL)isTimelineProfilingEnabled
158 {
159     if (Page* page = core(_webView))
160         return page->inspectorController()->timelineAgent() ? YES : NO;
161     return NO;
162 }
163
164 - (void)setTimelineProfilingEnabled:(BOOL)enabled
165 {
166     Page* page = core(_webView);
167     if (!page)
168         return;
169
170     if (enabled)
171         page->inspectorController()->startTimelineProfiler();
172     else
173         page->inspectorController()->stopTimelineProfiler();
174 }
175
176 - (void)close:(id)sender 
177 {
178     if (Page* page = core(_webView))
179         page->inspectorController()->close();
180 }
181
182 - (void)attach:(id)sender
183 {
184     [_frontend attach];
185 }
186
187 - (void)detach:(id)sender
188 {
189     [_frontend detach];
190 }
191
192 - (void)evaluateInFrontend:(id)sender callId:(long)callId script:(NSString *)script
193 {
194     if (Page* page = core(_webView))
195         page->inspectorController()->evaluateForTestInFrontend(callId, script);
196 }
197
198 - (void)setFrontend:(WebInspectorFrontend *)frontend
199 {
200     [_frontend release];
201     _frontend = [frontend retain];
202 }
203 @end
204
205 @implementation WebInspector (Obsolete)
206 + (WebInspector *)webInspector
207 {
208     // Safari 3.0 calls this method
209     static BOOL logged = NO;
210     if (!logged) {
211         NSLog(@"+[WebInspector webInspector]: this method is obsolete.");
212         logged = YES;
213     }
214
215     return [[[WebInspector alloc] init] autorelease];
216 }
217
218 - (void)setWebFrame:(WebFrame *)frame
219 {
220     // Safari 3.0 calls this method
221     static BOOL logged = NO;
222     if (!logged) {
223         NSLog(@"-[WebInspector setWebFrame:]: this method is obsolete.");
224         logged = YES;
225     }
226
227     _webView = [frame webView];
228 }
229
230 - (NSWindow *)window
231 {
232     // Shiira calls this internal method, return nil since we can't easily return the window
233     static BOOL logged = NO;
234     if (!logged) {
235         NSLog(@"-[WebInspector window]: this method is obsolete and now returns nil.");
236         logged = YES;
237     }
238
239     return nil;
240 }
241
242 - (void)showWindow:(id)sender
243 {
244     // Safari 3.0 calls this method
245     static BOOL logged = NO;
246     if (!logged) {
247         NSLog(@"-[WebInspector showWindow:]: this method is obsolete.");
248         logged = YES;
249     }
250
251     [self show:sender];
252 }
253 @end