Move -_enterFrame and -_leaveFrame from WebCoreScriptDebugger to WebScriptDeb...
[WebKit-https.git] / WebKit / mac / WebView / WebCoreScriptDebugger.mm
1 /*
2  * Copyright (C) 2005, 2008 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 // FIXME: This file and the classes in it should have the prefix "Web" instead
30 // of "WebCore". The best way to fix this is to merge WebCoreScriptCallFrame
31 // with WebScriptCallFrame and WebCoreScriptDebugger with WebScriptDebugger.
32
33 #import "WebCoreScriptDebugger.h"
34
35 #import "WebScriptDebugDelegate.h"
36 #import <JavaScriptCore/ExecState.h>
37 #import <JavaScriptCore/JSGlobalObject.h>
38 #import <JavaScriptCore/debugger.h>
39 #import <JavaScriptCore/function.h>
40 #import <JavaScriptCore/interpreter.h>
41 #import <WebCore/KURL.h>
42 #import <WebCore/PlatformString.h>
43 #import <WebCore/WebCoreObjCExtras.h>
44 #import <WebCore/WebScriptObjectPrivate.h>
45 #import <WebCore/runtime_root.h>
46
47 using namespace KJS;
48 using namespace WebCore;
49
50 // convert UString to NSString
51 NSString *toNSString(const UString& s)
52 {
53     if (s.isEmpty())
54         return nil;
55     return [NSString stringWithCharacters:reinterpret_cast<const unichar*>(s.data()) length:s.size()];
56 }
57
58 // convert UString to NSURL
59 static NSURL *toNSURL(const UString& s)
60 {
61     if (s.isEmpty())
62         return nil;
63     return KURL(s);
64 }
65
66 // C++ interface to KJS debugger callbacks
67
68 class WebCoreScriptDebuggerImp : public KJS::Debugger {
69
70   private:
71     WebCoreScriptDebugger  *_objc;      // our ObjC half
72     bool                    _nested;    // true => this is a nested call
73     WebScriptCallFrame *_current;   // top stack frame (copy of same field from ObjC side)
74
75   public:
76     // constructor
77     WebCoreScriptDebuggerImp(WebCoreScriptDebugger *objc, JSGlobalObject* globalObject) : _objc(objc) {
78         _nested = true;
79         _current = [[_objc delegate] enterFrame:globalObject->globalExec()];
80         attach(globalObject);
81         [[_objc delegate] enteredFrame:_current sourceId:-1 line:-1];
82         _nested = false;
83     }
84
85     // callbacks - relay to delegate
86     virtual bool sourceParsed(ExecState *state, int sid, const UString &url, const UString &source, int lineNumber, int errorLine, const UString &errorMsg) {
87         if (!_nested) {
88             _nested = true;
89             [[_objc delegate] parsedSource:toNSString(source) fromURL:toNSURL(url) sourceId:sid startLine:lineNumber errorLine:errorLine errorMessage:toNSString(errorMsg)];
90             _nested = false;
91         }
92         return true;
93     }
94     virtual bool callEvent(ExecState *state, int sid, int lineno, JSObject *func, const List &args) {
95         if (!_nested) {
96             _nested = true;
97             _current = [[_objc delegate] enterFrame:state];
98             [[_objc delegate] enteredFrame:_current sourceId:sid line:lineno];
99             _nested = false;
100         }
101         return true;
102     }
103     virtual bool atStatement(ExecState *state, int sid, int lineno, int lastLine) {
104         if (!_nested) {
105             _nested = true;
106             [[_objc delegate] hitStatement:_current sourceId:sid line:lineno];
107             _nested = false;
108         }
109         return true;
110     }
111     virtual bool returnEvent(ExecState *state, int sid, int lineno, JSObject *func) {
112         if (!_nested) {
113             _nested = true;
114             [[_objc delegate] leavingFrame:_current sourceId:sid line:lineno];
115             _current = [[_objc delegate] leaveFrame];
116             _nested = false;
117         }
118         return true;
119     }
120     virtual bool exception(ExecState *state, int sid, int lineno, JSValue *exception) {
121         if (!_nested) {
122             _nested = true;
123             [[_objc delegate] exceptionRaised:_current sourceId:sid line:lineno];
124             _nested = false;
125         }
126         return true;
127     }
128
129 };
130
131 // WebCoreScriptDebugger
132 //
133 // This is the main (behind-the-scenes) debugger class in WebCore.
134 //
135 // The WebCoreScriptDebugger has two faces, one for Objective-C (this class), and another (WebCoreScriptDebuggerImp)
136 // for C++.  The ObjC side creates the C++ side, which does the real work of attaching to the global object and
137 // forwarding the KJS debugger callbacks to the delegate.
138
139 @implementation WebCoreScriptDebugger
140
141 #ifndef BUILDING_ON_TIGER
142 + (void)initialize
143 {
144     WebCoreObjCFinalizeOnMainThread(self);
145 }
146 #endif
147
148 - (WebCoreScriptDebugger *)initWithDelegate:(id<WebScriptDebugger>)delegate
149 {
150     if ((self = [super init])) {
151         _delegate  = delegate;
152         _globalObj = [_delegate globalObject];
153         _debugger  = new WebCoreScriptDebuggerImp(self, [_globalObj _rootObject]->globalObject());
154     }
155     return self;
156 }
157
158 - (void)dealloc
159 {
160     delete _debugger;
161     [super dealloc];
162 }
163
164 - (void)finalize
165 {
166     delete _debugger;
167     [super finalize];
168 }
169
170 - (id<WebScriptDebugger>)delegate
171 {
172     return _delegate;
173 }
174
175 @end