f109e158e110b7a71930649a02f325bf7aa5c5fa
[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()->showPanel(InspectorController::ScriptsPanel);
100     page->inspectorController()->enableDebugger();
101 }
102
103 - (void)stopDebuggingJavaScript:(id)sender
104 {
105     if (Page* page = core(_webView))
106         page->inspectorController()->disableDebugger();
107 }
108
109 - (BOOL)isProfilingJavaScript
110 {
111     if (Page* page = core(_webView))
112         return page->inspectorController()->isRecordingUserInitiatedProfile();
113     return NO;
114 }
115
116 - (void)toggleProfilingJavaScript:(id)sender
117 {
118     if ([self isProfilingJavaScript])
119         [self stopProfilingJavaScript:sender];
120     else
121         [self startProfilingJavaScript:sender];
122 }
123
124 - (void)startProfilingJavaScript:(id)sender
125 {
126     if (Page* page = core(_webView))
127         page->inspectorController()->startUserInitiatedProfiling();
128 }
129
130 - (void)stopProfilingJavaScript:(id)sender
131 {
132     Page* page = core(_webView);
133     if (!page)
134         return;
135     page->inspectorController()->stopUserInitiatedProfiling();
136     page->inspectorController()->showPanel(InspectorController::ProfilesPanel);
137 }
138
139 - (BOOL)isJavaScriptProfilingEnabled
140 {
141     if (Page* page = core(_webView))
142         return page->inspectorController()->profilerEnabled();
143     return NO;
144 }
145
146 - (void)setJavaScriptProfilingEnabled:(BOOL)enabled
147 {
148     Page* page = core(_webView);
149     if (!page)
150         return;
151
152     if (enabled)
153         page->inspectorController()->enableProfiler();
154     else
155         page->inspectorController()->disableProfiler();
156 }
157
158 - (BOOL)isTimelineProfilingEnabled
159 {
160     if (Page* page = core(_webView))
161         return page->inspectorController()->timelineAgent() ? YES : NO;
162     return NO;
163 }
164
165 - (void)setTimelineProfilingEnabled:(BOOL)enabled
166 {
167     Page* page = core(_webView);
168     if (!page)
169         return;
170
171     if (enabled)
172         page->inspectorController()->startTimelineProfiler();
173     else
174         page->inspectorController()->stopTimelineProfiler();
175 }
176
177 - (void)close:(id)sender 
178 {
179     if (Page* page = core(_webView))
180         page->inspectorController()->close();
181 }
182
183 - (void)attach:(id)sender
184 {
185     [_frontend attach];
186 }
187
188 - (void)detach:(id)sender
189 {
190     [_frontend detach];
191 }
192
193 - (void)evaluateInFrontend:(id)sender callId:(long)callId script:(NSString *)script
194 {
195     if (Page* page = core(_webView))
196         page->inspectorController()->evaluateForTestInFrontend(callId, script);
197 }
198
199 - (void)setFrontend:(WebInspectorFrontend *)frontend
200 {
201     [_frontend release];
202     _frontend = [frontend retain];
203 }
204 @end
205
206 @implementation WebInspector (Obsolete)
207 + (WebInspector *)webInspector
208 {
209     // Safari 3.0 calls this method
210     static BOOL logged = NO;
211     if (!logged) {
212         NSLog(@"+[WebInspector webInspector]: this method is obsolete.");
213         logged = YES;
214     }
215
216     return [[[WebInspector alloc] init] autorelease];
217 }
218
219 - (void)setWebFrame:(WebFrame *)frame
220 {
221     // Safari 3.0 calls this method
222     static BOOL logged = NO;
223     if (!logged) {
224         NSLog(@"-[WebInspector setWebFrame:]: this method is obsolete.");
225         logged = YES;
226     }
227
228     _webView = [frame webView];
229 }
230
231 - (NSWindow *)window
232 {
233     // Shiira calls this internal method, return nil since we can't easily return the window
234     static BOOL logged = NO;
235     if (!logged) {
236         NSLog(@"-[WebInspector window]: this method is obsolete and now returns nil.");
237         logged = YES;
238     }
239
240     return nil;
241 }
242
243 - (void)showWindow:(id)sender
244 {
245     // Safari 3.0 calls this method
246     static BOOL logged = NO;
247     if (!logged) {
248         NSLog(@"-[WebInspector showWindow:]: this method is obsolete.");
249         logged = YES;
250     }
251
252     [self show:sender];
253 }
254 @end