Enable -Wcast-qual for WebInspectorUI, WebKitLegacy, WebKit projects
[WebKit-https.git] / Source / WebKitLegacy / mac / WebView / WebScriptDebugDelegate.mm
1 /*
2  * Copyright (C) 2005-2013 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 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 "WebDataSource.h"
30 #import "WebDataSourceInternal.h"
31 #import "WebFrameInternal.h"
32 #import "WebScriptDebugDelegate.h"
33 #import "WebScriptDebugger.h"
34 #import "WebViewInternal.h"
35 #import <WebCore/Frame.h>
36 #import <WebCore/ScriptController.h>
37 #import <WebCore/WebScriptObjectPrivate.h>
38 #import <WebCore/runtime_root.h>
39 #import <debugger/Debugger.h>
40 #import <interpreter/CallFrame.h>
41 #import <runtime/Completion.h>
42 #import <runtime/JSFunction.h>
43 #import <runtime/JSGlobalObject.h>
44 #import <runtime/JSLock.h>
45
46 using namespace JSC;
47 using namespace WebCore;
48
49 // FIXME: these error strings should be public for future use by WebScriptObject and in WebScriptObject.h
50 NSString * const WebScriptErrorDomain = @"WebScriptErrorDomain";
51 NSString * const WebScriptErrorDescriptionKey = @"WebScriptErrorDescription";
52 NSString * const WebScriptErrorLineNumberKey = @"WebScriptErrorLineNumber";
53
54 @interface WebScriptCallFrame (WebScriptDebugDelegateInternal)
55
56 - (id)_convertValueToObjcValue:(JSC::JSValue)value;
57
58 @end
59
60 @interface WebScriptCallFramePrivate : NSObject {
61 @public
62     WebScriptObject        *globalObject;   // the global object's proxy (not retained)
63     String functionName;
64     JSC::JSValue exceptionValue;
65 }
66 @end
67
68 @implementation WebScriptCallFramePrivate
69 - (void)dealloc
70 {
71     [super dealloc];
72 }
73 @end
74
75 // WebScriptCallFrame
76 //
77 // One of these is created to represent each stack frame.  Additionally, there is a "global"
78 // frame to represent the outermost scope.  This global frame is always the last frame in
79 // the chain of callers.
80 //
81 // The delegate can assign a "wrapper" to each frame object so it can relay calls through its
82 // own exported interface.  This class is private to WebCore (and the delegate).
83
84 @implementation WebScriptCallFrame (WebScriptDebugDelegateInternal)
85
86 - (WebScriptCallFrame *)_initWithGlobalObject:(WebScriptObject *)globalObj functionName:(String)functionName exceptionValue:(JSC::JSValue)exceptionValue
87 {
88     if ((self = [super init])) {
89         _private = [[WebScriptCallFramePrivate alloc] init];
90         _private->globalObject = globalObj;
91         _private->functionName = functionName;
92         _private->exceptionValue = exceptionValue;
93     }
94     return self;
95 }
96
97 - (id)_convertValueToObjcValue:(JSC::JSValue)value
98 {
99     if (!value)
100         return nil;
101
102     WebScriptObject *globalObject = _private->globalObject;
103     if (value == [globalObject _imp])
104         return globalObject;
105
106     Bindings::RootObject* root1 = [globalObject _originRootObject];
107     if (!root1)
108         return nil;
109
110     Bindings::RootObject* root2 = [globalObject _rootObject];
111     if (!root2)
112         return nil;
113
114     return [WebScriptObject _convertValueToObjcValue:value originRootObject:root1 rootObject:root2];
115 }
116
117 @end
118
119
120
121 @implementation WebScriptCallFrame
122
123 - (void) dealloc
124 {
125     [_userInfo release];
126     [_private release];
127     [super dealloc];
128 }
129
130 - (void)setUserInfo:(id)userInfo
131 {
132     if (userInfo != _userInfo) {
133         [_userInfo release];
134         _userInfo = [userInfo retain];
135     }
136 }
137
138 - (id)userInfo
139 {
140     return _userInfo;
141 }
142
143 // Returns the name of the function for this frame, if available.
144 // Returns nil for anonymous functions and for the global frame.
145
146 - (NSString *)functionName
147 {
148     if (_private->functionName.isEmpty())
149         return nil;
150
151     String functionName = _private->functionName;
152     return nsStringNilIfEmpty(functionName);
153 }
154
155 // Returns the pending exception for this frame (nil if none).
156
157 - (id)exception
158 {
159     if (!_private->exceptionValue)
160         return nil;
161
162     JSC::JSValue exception = _private->exceptionValue;
163     return exception ? [self _convertValueToObjcValue:exception] : nil;
164 }
165
166 @end