Not reviewed.
[WebKit-https.git] / WebKitTools / DumpRenderTree / mac / ObjCController.m
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 "ObjCController.h"
30
31 #import <WebKit/DOMAbstractView.h>
32 #import <WebKit/WebScriptObject.h>
33 #import <WebKit/WebView.h>
34 #import <wtf/Assertions.h>
35
36 @implementation ObjCController
37
38 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
39 {
40     if (0
41             || aSelector == @selector(classNameOf:)
42             || aSelector == @selector(objectOfClass:)
43             || aSelector == @selector(identityIsEqual::)
44             || aSelector == @selector(longLongRoundTrip:)
45             || aSelector == @selector(unsignedLongLongRoundTrip:)
46             || aSelector == @selector(testWrapperRoundTripping:)
47             || aSelector == @selector(accessStoredWebScriptObject)
48             || aSelector == @selector(storeWebScriptObject:)
49         )
50         return NO;
51     return YES;
52 }
53
54 + (NSString *)webScriptNameForSelector:(SEL)aSelector
55 {
56     if (aSelector == @selector(classNameOf:))
57         return @"className";
58     if (aSelector == @selector(objectOfClass:))
59         return @"objectOfClass";
60     if (aSelector == @selector(identityIsEqual::))
61         return @"identityIsEqual";
62     if (aSelector == @selector(longLongRoundTrip:))
63         return @"longLongRoundTrip";
64     if (aSelector == @selector(unsignedLongLongRoundTrip:))
65         return @"unsignedLongLongRoundTrip";
66     if (aSelector == @selector(testWrapperRoundTripping:))
67         return @"testWrapperRoundTripping";
68     if (aSelector == @selector(storeWebScriptObject:))
69         return @"storeWebScriptObject";
70
71     return nil;
72 }
73
74 - (NSString *)classNameOf:(id)object
75 {
76     if (!object)
77         return @"nil";
78     return NSStringFromClass([object class]);
79 }
80
81 - (id)objectOfClass:(NSString *)aClass
82 {
83     if ([aClass isEqualToString:@"NSNull"])
84         return [NSNull null];
85     if ([aClass isEqualToString:@"WebUndefined"])
86         return [WebUndefined undefined];
87     if ([aClass isEqualToString:@"NSCFBoolean"])
88         return [NSNumber numberWithBool:true];
89     if ([aClass isEqualToString:@"NSCFNumber"])
90         return [NSNumber numberWithInt:1];
91     if ([aClass isEqualToString:@"NSCFString"])
92         return @"";
93     if ([aClass isEqualToString:@"WebScriptObject"])
94         return self;
95     if ([aClass isEqualToString:@"NSArray"])
96         return [NSArray array];
97
98     return nil;
99 }
100
101 - (BOOL)identityIsEqual:(WebScriptObject *)a :(WebScriptObject *)b
102 {
103     if ([a isKindOfClass:[NSString class]] && [b isKindOfClass:[NSString class]])
104         return [(NSString *)a isEqualToString:(NSString *)b];
105     return a == b;
106 }
107
108 - (long long)longLongRoundTrip:(long long)num
109 {
110     return num;
111 }
112
113 - (unsigned long long)unsignedLongLongRoundTrip:(unsigned long long)num
114 {
115     return num;
116 }
117
118 - (BOOL)testWrapperRoundTripping:(WebScriptObject *)webScriptObject
119 {
120     JSObjectRef jsObject = [webScriptObject JSObject];
121
122     if (!jsObject)
123         return false;
124
125     if (!webScriptObject)
126         return false;
127
128     if ([[webScriptObject evaluateWebScript:@"({ })"] class] != [webScriptObject class])
129         return false;
130
131     [webScriptObject setValue:[NSNumber numberWithInt:666] forKey:@"key"];
132     if (![[webScriptObject valueForKey:@"key"] isKindOfClass:[NSNumber class]] ||
133         ![[webScriptObject valueForKey:@"key"] isEqualToNumber:[NSNumber numberWithInt:666]])
134         return false;
135
136     [webScriptObject removeWebScriptKey:@"key"];
137     @try {
138         if ([webScriptObject valueForKey:@"key"])
139             return false;
140     } @catch(NSException *exception) {
141         // NSObject throws an exception if the key doesn't exist.
142     }
143
144     [webScriptObject setWebScriptValueAtIndex:0 value:webScriptObject];
145     if ([webScriptObject webScriptValueAtIndex:0] != webScriptObject)
146         return false;
147
148     if ([[webScriptObject stringRepresentation] isEqualToString:@"[Object object]"])
149         return false;
150
151     if ([webScriptObject callWebScriptMethod:@"returnThis" withArguments:nil] != webScriptObject)
152         return false;
153
154     return true;
155 }
156
157 - (void)accessStoredWebScriptObject
158 {
159 #if !ASSERT_DISABLED
160     BOOL isWindowObject = [storedWebScriptObject isKindOfClass:[DOMAbstractView class]];
161 #endif
162     JSObjectRef jsObject = [storedWebScriptObject JSObject];
163     ASSERT((jsObject && isWindowObject) || (!jsObject && !isWindowObject));
164
165     [storedWebScriptObject callWebScriptMethod:@"" withArguments:nil];
166     [storedWebScriptObject evaluateWebScript:@""];
167     [storedWebScriptObject setValue:[WebUndefined undefined] forKey:@"key"];
168     [storedWebScriptObject valueForKey:@"key"];
169     [storedWebScriptObject removeWebScriptKey:@"key"];
170     [storedWebScriptObject stringRepresentation];
171     [storedWebScriptObject webScriptValueAtIndex:0];
172     [storedWebScriptObject setWebScriptValueAtIndex:0 value:[WebUndefined undefined]];
173     [storedWebScriptObject setException:@"exception"];
174 }
175
176 - (void)storeWebScriptObject:(WebScriptObject *)webScriptObject
177 {
178     if (webScriptObject == storedWebScriptObject)
179         return;
180
181     [storedWebScriptObject release];
182     storedWebScriptObject = [webScriptObject retain];
183 }
184
185 - (void)dealloc
186 {
187     [storedWebScriptObject release];
188     [super dealloc];
189 }
190
191 - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args
192 {
193     // FIXME: Perhaps we should log that this has been called.
194     return nil;
195 }
196
197 @end