1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark/*
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Copyright (C) 2007 Apple Inc. All rights reserved.
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * Redistribution and use in source and binary forms, with or without
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * modification, are permitted provided that the following conditions
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * are met:
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 1.  Redistributions of source code must retain the above copyright
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer.
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 2.  Redistributions in binary form must reproduce the above copyright
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     notice, this list of conditions and the following disclaimer in the
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     documentation and/or other materials provided with the distribution.
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     its contributors may be used to endorse or promote products derived
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *     from this software without specific prior written permission.
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark *
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark */
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "config.h"
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import "ObjCController.h"
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <JavaScriptCore/JavaScriptCore.h>
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebKit/DOMAbstractView.h>
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebKit/WebScriptObject.h>
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <WebKit/WebView.h>
36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <pthread.h>
37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#import <wtf/Assertions.h>
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic void* runJavaScriptThread(void* arg)
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSGlobalContextRef ctx = JSGlobalContextCreate(0);
42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSStringRef scriptRef = JSStringCreateWithUTF8CString("'Hello World!'");
43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSValueRef exception = 0;
45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSEvaluateScript(ctx, scriptRef, 0, 0, 1, &exception);
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(!exception);
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSGlobalContextRelease(ctx);
49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSStringRelease(scriptRef);
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return 0;
52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@implementation ObjCController
55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (0
59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(classNameOf:)
60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(objectOfClass:)
61d0825bca7fe65beaee391d30da42e937db621564Steve Block            || aSelector == @selector(arrayOfString)
62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(identityIsEqual::)
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(longLongRoundTrip:)
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(unsignedLongLongRoundTrip:)
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(testWrapperRoundTripping:)
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(accessStoredWebScriptObject)
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(storeWebScriptObject:)
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(testValueForKey)
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            || aSelector == @selector(testArray)
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        )
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return NO;
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return YES;
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark+ (NSString *)webScriptNameForSelector:(SEL)aSelector
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(classNameOf:))
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"className";
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(objectOfClass:))
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"objectOfClass";
81d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (aSelector == @selector(arrayOfString))
82d0825bca7fe65beaee391d30da42e937db621564Steve Block        return @"arrayOfString";
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(identityIsEqual::))
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"identityIsEqual";
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(longLongRoundTrip:))
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"longLongRoundTrip";
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(unsignedLongLongRoundTrip:))
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"unsignedLongLongRoundTrip";
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(testWrapperRoundTripping:))
90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"testWrapperRoundTripping";
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(storeWebScriptObject:))
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"storeWebScriptObject";
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(testValueForKey))
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"testValueForKey";
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (aSelector == @selector(testArray))
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"testArray";
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return nil;
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSString *)classNameOf:(id)object
102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
103563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!object)
104563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"nil";
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return NSStringFromClass([object class]);
106563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
107563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (id)objectOfClass:(NSString *)aClass
109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"NSNull"])
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [NSNull null];
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"WebUndefined"])
113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [WebUndefined undefined];
114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"NSCFBoolean"])
115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [NSNumber numberWithBool:true];
116563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"NSCFNumber"])
117563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [NSNumber numberWithInt:1];
118563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"NSCFString"])
119563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return @"";
120563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"WebScriptObject"])
121563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return self;
122563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([aClass isEqualToString:@"NSArray"])
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [NSArray array];
124563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return nil;
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
128d0825bca7fe65beaee391d30da42e937db621564Steve Block- (NSArray *)arrayOfString
129d0825bca7fe65beaee391d30da42e937db621564Steve Block{
130d0825bca7fe65beaee391d30da42e937db621564Steve Block    NSString *strings[3];
131d0825bca7fe65beaee391d30da42e937db621564Steve Block    strings[0] = @"one";
132d0825bca7fe65beaee391d30da42e937db621564Steve Block    strings[1] = @"two";
133d0825bca7fe65beaee391d30da42e937db621564Steve Block    strings[2] = @"three";
134d0825bca7fe65beaee391d30da42e937db621564Steve Block    NSArray *array = [NSArray arrayWithObjects:strings count:3];
135d0825bca7fe65beaee391d30da42e937db621564Steve Block    return array;
136d0825bca7fe65beaee391d30da42e937db621564Steve Block}
137d0825bca7fe65beaee391d30da42e937db621564Steve Block
138563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)identityIsEqual:(WebScriptObject *)a :(WebScriptObject *)b
139563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
140563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([a isKindOfClass:[NSString class]] && [b isKindOfClass:[NSString class]])
141563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return [(NSString *)a isEqualToString:(NSString *)b];
142563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return a == b;
143563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
144563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
145563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (long long)longLongRoundTrip:(long long)num
146563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
147563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return num;
148563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
149563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
150563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (unsigned long long)unsignedLongLongRoundTrip:(unsigned long long)num
151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
152563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return num;
153563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
155563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)testValueForKey
156563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
157563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(storedWebScriptObject);
158563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
159563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    @try {
160563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        [storedWebScriptObject valueForKey:@"ThisKeyDoesNotExist"];
161563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } @catch (NSException *e) {
162563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
163563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
164563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    pthread_t pthread;
165563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    pthread_create(&pthread, 0, &runJavaScriptThread, 0);
166563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    pthread_join(pthread, 0);
167563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
168563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (BOOL)testWrapperRoundTripping:(WebScriptObject *)webScriptObject
170563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
171563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSObjectRef jsObject = [webScriptObject JSObject];
172563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
173563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!jsObject)
174563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
175563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
176563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!webScriptObject)
177563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
178563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
179563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([[webScriptObject evaluateWebScript:@"({ })"] class] != [webScriptObject class])
180563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
181563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
182563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [webScriptObject setValue:[NSNumber numberWithInt:666] forKey:@"key"];
183563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (![[webScriptObject valueForKey:@"key"] isKindOfClass:[NSNumber class]] ||
184563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ![[webScriptObject valueForKey:@"key"] isEqualToNumber:[NSNumber numberWithInt:666]])
185563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
186563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
187563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [webScriptObject removeWebScriptKey:@"key"];
188563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    @try {
189563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if ([webScriptObject valueForKey:@"key"])
190563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            return false;
191563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    } @catch(NSException *exception) {
192563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        // NSObject throws an exception if the key doesn't exist.
193563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
194563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
195563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [webScriptObject setWebScriptValueAtIndex:0 value:webScriptObject];
196563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([webScriptObject webScriptValueAtIndex:0] != webScriptObject)
197563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
198563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
199563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([[webScriptObject stringRepresentation] isEqualToString:@"[Object object]"])
200563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
201563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
202563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if ([webScriptObject callWebScriptMethod:@"returnThis" withArguments:nil] != webScriptObject)
203563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return false;
204563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
205563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return true;
206563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
208563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)accessStoredWebScriptObject
209563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
210563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#if !ASSERT_DISABLED
211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    BOOL isWindowObject = [storedWebScriptObject isKindOfClass:[DOMAbstractView class]];
212563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    JSObjectRef jsObject = [storedWebScriptObject JSObject];
213563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT((jsObject && isWindowObject) || (!jsObject && !isWindowObject));
214d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
215563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject callWebScriptMethod:@"" withArguments:nil];
216563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject evaluateWebScript:@""];
217563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject setValue:[WebUndefined undefined] forKey:@"key"];
218563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject valueForKey:@"key"];
219563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject removeWebScriptKey:@"key"];
220563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject stringRepresentation];
221563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject webScriptValueAtIndex:0];
222563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject setWebScriptValueAtIndex:0 value:[WebUndefined undefined]];
223563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject setException:@"exception"];
224563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
225563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
226563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)storeWebScriptObject:(WebScriptObject *)webScriptObject
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
228563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (webScriptObject == storedWebScriptObject)
229563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        return;
230563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
231563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject release];
232563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    storedWebScriptObject = [webScriptObject retain];
233563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
234563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
235563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (NSArray *)testArray
236563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
237563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return [NSArray array];
238563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
239563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
240563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)dealloc
241563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [storedWebScriptObject release];
243563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    [super dealloc];
244563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
245563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
246563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args
247563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
248563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // FIXME: Perhaps we should log that this has been called.
249563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return nil;
250563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
251563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
252563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark@end
253