LayoutTests:
[WebKit-https.git] / WebKitTools / DumpRenderTree / ObjCPlugin.m
1 /*
2  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
3  * Copyright (C) 2006 James G. Speth (speth@end.com)
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25 */
26
27 #import "ObjCPlugin.h"
28 #import <objc/objc-runtime.h>
29
30
31 // === NSObject category to expose almost everything to JavaScript ===
32
33 // Warning: this class introduces huge security weaknesses, and should only be used
34 // for testing inside of DumpRenderTree, and only with trusted code.  By default, it has
35 // the same restrictive behavior as the standard WebKit setup.  However, scripts can use the
36 // plugin's removeBridgeRestrictions: method to open up almost total access to the Cocoa
37 // frameworks.
38
39 static BOOL _allowsScriptsFullAccess = NO;
40
41 @interface NSObject (ObjCScriptAccess)
42
43 + (void)setAllowsScriptsFullAccess:(BOOL)value;
44 + (BOOL)allowsScriptsFullAccess;
45
46 @end
47
48 @implementation NSObject (ObjCScriptAccess)
49
50 + (void)setAllowsScriptsFullAccess:(BOOL)value
51 {
52     _allowsScriptsFullAccess = value;
53 }
54
55 + (BOOL)allowsScriptsFullAccess
56 {
57     return _allowsScriptsFullAccess;
58 }
59
60 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
61 {
62     return !_allowsScriptsFullAccess;
63 }
64
65 + (NSString *)webScriptNameForSelector:(SEL)selector
66 {
67     return nil;
68 }
69
70 @end
71
72 @interface JSObjC : NSObject {
73 }
74
75 // expose some useful objc functions to the scripting environment
76 - (id)lookUpClass:(NSString *)name;
77 - (void)log:(NSString *)message;
78 - (id)retainObject:(id)obj;
79 - (id)classOfObject:(id)obj;
80 - (NSString *)classNameOfObject:(id)obj;
81
82 @end
83
84 @implementation JSObjC
85
86 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector
87 {
88     return NO;
89 }
90
91 + (NSString *)webScriptNameForSelector:(SEL)selector
92 {
93     return nil;
94 }
95
96 - (id)invokeDefaultMethodWithArguments:(NSArray *)args
97 {
98     // this is a useful shortcut for accessing objective-c classes from the scripting
99     // environment, e.g. 'var myObject = objc("NSObject").alloc().init();'
100     if ([args count] == 1)
101         return [self lookUpClass:[args objectAtIndex:0]];
102     return nil;
103 }
104
105 - (id)lookUpClass:(NSString *)name
106 {
107     return NSClassFromString(name);
108 }
109
110 - (void)log:(NSString *)message
111 {
112     NSLog(message);
113 }
114
115 - (id)retainObject:(id)obj
116 {
117     return [obj retain];
118 }
119
120 - (id)classOfObject:(id)obj
121 {
122     return (id)[obj class];
123 }
124
125 - (NSString *)classNameOfObject:(id)obj
126 {
127     return [obj className];
128 }
129
130 @end
131
132 @implementation ObjCPlugin
133
134 + (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector
135 {
136     if (aSelector == @selector(removeBridgeRestrictions:))
137         return NO;
138     return YES;
139 }
140
141 + (NSString *)webScriptNameForSelector:(SEL)aSelector
142 {
143     return nil;
144 }
145
146 - (void)removeBridgeRestrictions:(id)container
147 {
148     // let scripts invoke any selector
149     [NSObject setAllowsScriptsFullAccess:YES];
150     
151     // store a JSObjC instance into the provided container
152     JSObjC *objc = [[JSObjC alloc] init];
153     [container setValue:objc forKey:@"objc"];
154     [objc release];
155 }
156
157 @end