Move -scopeChain to WebScriptCallFrame
[WebKit-https.git] / WebKit / mac / WebView / WebScriptDebugDelegate.mm
1 /*
2  * Copyright (C) 2005 Apple Computer, 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 "WebScriptDebugDelegatePrivate.h"
30
31 #import "WebCoreScriptDebugger.h"
32 #import "WebDataSource.h"
33 #import "WebDataSourceInternal.h"
34 #import "WebFrameBridge.h"
35 #import "WebFrameInternal.h"
36 #import "WebScriptDebugServerPrivate.h"
37 #import "WebViewInternal.h"
38 #import <JavaScriptCore/ExecState.h>
39 #import <JavaScriptCore/function.h>
40 #import <WebCore/Frame.h>
41
42 using namespace KJS;
43 using namespace WebCore;
44
45 // FIXME: these error strings should be public for future use by WebScriptObject and in WebScriptObject.h
46 NSString * const WebScriptErrorDomain = @"WebScriptErrorDomain";
47 NSString * const WebScriptErrorDescriptionKey = @"WebScriptErrorDescription";
48 NSString * const WebScriptErrorLineNumberKey = @"WebScriptErrorLineNumber";
49
50 @interface WebScriptCallFrame (WebScriptDebugDelegateInternal)
51
52 - (WebScriptCallFrame *)_initWithFrame:(WebCoreScriptCallFrame *)frame;
53
54 @end
55
56 @implementation WebScriptDebugger
57
58 - (WebScriptDebugger *)initWithWebFrame:(WebFrame *)webFrame
59 {
60     if ((self = [super init])) {
61         _webFrame = webFrame;
62         _debugger = [[WebCoreScriptDebugger alloc] initWithDelegate:self];
63     }
64     return self;
65 }
66
67 - (void)dealloc
68 {
69     [_debugger release];
70     [super dealloc];
71 }
72
73 - (WebScriptObject *)globalObject
74 {
75     return core(_webFrame)->windowScriptObject();
76 }
77
78 - (id)newWrapperForFrame:(WebCoreScriptCallFrame *)frame
79 {
80     return [[WebScriptCallFrame alloc] _initWithFrame:frame];
81 }
82
83 - (void)parsedSource:(NSString *)source fromURL:(NSURL *)url sourceId:(int)sid startLine:(int)startLine errorLine:(int)errorLine errorMessage:(NSString *)errorMessage
84 {
85     WebView *webView = [_webFrame webView];
86     if (errorLine == -1) {
87         [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:source baseLineNumber:startLine fromURL:url sourceId:sid forWebFrame:_webFrame];
88         [[webView _scriptDebugDelegateForwarder] webView:webView didParseSource:source fromURL:[url absoluteString] sourceId:sid forWebFrame:_webFrame]; // deprecated delegate method
89         if ([WebScriptDebugServer listenerCount])
90             [[WebScriptDebugServer sharedScriptDebugServer] webView:webView didParseSource:source baseLineNumber:startLine fromURL:url sourceId:sid forWebFrame:_webFrame];
91     } else {
92         NSDictionary *info = [[NSDictionary alloc] initWithObjectsAndKeys:errorMessage, WebScriptErrorDescriptionKey, [NSNumber numberWithUnsignedInt:errorLine], WebScriptErrorLineNumberKey, nil];
93         NSError *error = [[NSError alloc] initWithDomain:WebScriptErrorDomain code:WebScriptGeneralErrorCode userInfo:info];
94         [[webView _scriptDebugDelegateForwarder] webView:webView failedToParseSource:source baseLineNumber:startLine fromURL:url withError:error forWebFrame:_webFrame];
95         if ([WebScriptDebugServer listenerCount])
96             [[WebScriptDebugServer sharedScriptDebugServer] webView:webView failedToParseSource:source baseLineNumber:startLine fromURL:url withError:error forWebFrame:_webFrame];
97         [error release];
98         [info release];
99     }
100 }
101
102 - (void)enteredFrame:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
103 {
104     WebView *webView = [_webFrame webView];
105     [[webView _scriptDebugDelegateForwarder] webView:webView didEnterCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
106     if ([WebScriptDebugServer listenerCount])
107         [[WebScriptDebugServer sharedScriptDebugServer] webView:webView didEnterCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
108 }
109
110 - (void)hitStatement:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
111 {
112     WebView *webView = [_webFrame webView];
113     [[webView _scriptDebugDelegateForwarder] webView:webView willExecuteStatement:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
114     if ([WebScriptDebugServer listenerCount])
115         [[WebScriptDebugServer sharedScriptDebugServer] webView:webView willExecuteStatement:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
116 }
117
118 - (void)leavingFrame:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
119 {
120     WebView *webView = [_webFrame webView];
121     [[webView _scriptDebugDelegateForwarder] webView:webView willLeaveCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
122     if ([WebScriptDebugServer listenerCount])
123         [[WebScriptDebugServer sharedScriptDebugServer] webView:webView willLeaveCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
124 }
125
126 - (void)exceptionRaised:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
127 {
128     WebView *webView = [_webFrame webView];
129     [[webView _scriptDebugDelegateForwarder] webView:webView exceptionWasRaised:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
130     if ([WebScriptDebugServer listenerCount])
131         [[WebScriptDebugServer sharedScriptDebugServer] webView:webView exceptionWasRaised:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
132 }
133
134 @end
135
136
137
138 @implementation WebScriptCallFrame (WebScriptDebugDelegateInternal)
139
140 - (WebScriptCallFrame *)_initWithFrame:(WebCoreScriptCallFrame *)frame
141 {
142     if ((self = [super init])) {
143         _private = frame;
144     }
145     return self;
146 }
147
148 @end
149
150
151
152 @implementation WebScriptCallFrame
153
154 - (void) dealloc
155 {
156     [_userInfo release];
157     [super dealloc];
158 }
159
160 - (void)setUserInfo:(id)userInfo
161 {
162     if (userInfo != _userInfo) {
163         [_userInfo release];
164         _userInfo = [userInfo retain];
165     }
166 }
167
168 - (id)userInfo
169 {
170     return _userInfo;
171 }
172
173 - (WebScriptCallFrame *)caller
174 {
175     return [[_private caller] wrapper];
176 }
177
178 // Returns an array of scope objects (most local first).
179 // The properties of each scope object are the variables for that scope.
180 // Note that the last entry in the array will _always_ be the global object (windowScriptObject),
181 // whose properties are the global variables.
182
183 - (NSArray *)scopeChain
184 {
185     ExecState* state = [_private state];
186     if (!state->scopeNode())  // global frame
187         return [NSArray arrayWithObject:[_private globalObject]];
188
189     ScopeChain      chain  = state->scopeChain();
190     NSMutableArray *scopes = [[NSMutableArray alloc] init];
191
192     while (!chain.isEmpty()) {
193         [scopes addObject:[_private _convertValueToObjcValue:chain.top()]];
194         chain.pop();
195     }
196
197     NSArray *result = [NSArray arrayWithArray:scopes];
198     [scopes release];
199     return result;
200 }
201
202 // Returns the name of the function for this frame, if available.
203 // Returns nil for anonymous functions and for the global frame.
204
205 - (NSString *)functionName
206 {
207     ExecState* state = [_private state];
208     if (!state->scopeNode())
209         return nil;
210
211     FunctionImp* func = state->function();
212     if (!func)
213         return nil;
214
215     Identifier fn = func->functionName();
216     return toNSString(fn.ustring());
217 }
218
219 - (id)exception
220 {
221     return [_private exception];
222 }
223
224 - (id)evaluateWebScript:(NSString *)script
225 {
226     return [_private evaluateWebScript:script];
227 }
228
229 @end