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