WebCore:
[WebKit-https.git] / WebCore / bindings / objc / WebScriptObject.h
1 /*
2  *  Copyright (C) 2004, 2006, 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  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #import <Foundation/Foundation.h>
27 #import <JavaScriptCore/JSBase.h>
28
29 // NSObject (WebScripting) -----------------------------------------------------
30
31 /*
32     Classes may implement one or more methods in WebScripting to export interfaces 
33     to WebKit's JavaScript environment.
34
35     By default, no properties or functions are exported. A class must implement 
36     +isKeyExcludedFromWebScript: and/or +isSelectorExcludedFromWebScript: to 
37     expose selected properties and methods, respectively, to JavaScript.
38
39     Access to exported properties is done using KVC -- specifically, the following
40     KVC methods:
41
42         - (void)setValue:(id)value forKey:(NSString *)key
43         - (id)valueForKey:(NSString *)key
44
45     Clients may also intercept property set/get operations that are made by the 
46     scripting environment for properties that are not exported. This is done using 
47     the KVC methods:
48
49         - (void)setValue:(id)value forUndefinedKey:(NSString *)key
50         - (id)valueForUndefinedKey:(NSString *)key
51     
52     Similarly, clients may intercept method invocations that are made by the
53     scripting environment for methods that are not exported. This is done using
54     the method:
55
56         - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)args;
57
58     If clients need to raise an exception in the script environment
59     they can call [WebScriptObject throwException:]. Note that throwing an
60     exception using this method will only succeed if the method that throws the exception
61     is being called within the scope of a script invocation.
62
63     Not all methods are exposed. Only those methods whose parameters and return
64     type meets the export criteria are exposed. Valid types are Objective-C instances
65     and scalars. Other types are not allowed.
66
67     Types will be converted automatically between JavaScript and Objective-C in 
68     the following manner:
69
70     JavaScript              ObjC
71     ----------              ----------
72     null            =>      nil
73     undefined       =>      WebUndefined
74     number          =>      NSNumber
75     boolean         =>      CFBoolean
76     string          =>      NSString
77     object          =>      id
78     
79     The object => id conversion occurs as follows: if the object wraps an underlying
80     Objective-C object (i.e., if it was created by a previous ObjC => JavaScript conversion),
81     then the underlying Objective-C object is returned. Otherwise, a new WebScriptObject
82     is created and returned.
83     
84     The above conversions occur only if the declared ObjC type is an object type. 
85     For primitive types like int and char, a numeric cast is performed.
86
87     ObjC                    JavaScript
88     ----                    ----------
89     NSNull          =>      null
90     nil             =>      undefined
91     WebUndefined    =>      undefined
92     CFBoolean       =>      boolean
93     NSNumber        =>      number
94     NSString        =>      string
95     NSArray         =>      array object
96     WebScriptObject =>      object
97
98     The above conversions occur only if the declared ObjC type is an object type. 
99     For primitive type like int and char, a numeric cast is performed.
100 */
101 @interface NSObject (WebScripting)
102
103 /*!
104     @method webScriptNameForSelector:
105     @param selector The selector that will be exposed to the script environment.
106     @discussion Use the returned string as the exported name for the selector
107     in the script environment. It is the responsibility of the class to ensure
108     uniqueness of the returned name. If nil is returned or this
109     method is not implemented the default name for the selector will
110     be used. The default name concatenates the components of the
111     Objective-C selector name and replaces ':' with '_'.  '_' characters
112     are escaped with an additional '$', i.e. '_' becomes "$_". '$' are
113     also escaped, i.e.
114         Objective-C name        Default script name
115         moveTo::                move__
116         moveTo_                 moveTo$_
117         moveTo$_                moveTo$$$_
118     @result Returns the name to be used to represent the specified selector in the
119     scripting environment.
120 */
121 + (NSString *)webScriptNameForSelector:(SEL)selector;
122
123 /*!
124     @method isSelectorExcludedFromWebScript:
125     @param selector The selector the will be exposed to the script environment.
126     @discussion Return NO to export the selector to the script environment.
127     Return YES to prevent the selector from being exported to the script environment. 
128     If this method is not implemented on the class no selectors will be exported.
129     @result Returns YES to hide the selector, NO to export the selector.
130 */
131 + (BOOL)isSelectorExcludedFromWebScript:(SEL)selector;
132
133 /*!
134     @method webScriptNameForKey:
135     @param name The name of the instance variable that will be exposed to the
136     script environment. Only instance variables that meet the export criteria will
137     be exposed.
138     @discussion Provide an alternate name for a property.
139     @result Returns the name to be used to represent the specified property in the
140     scripting environment.
141 */
142 + (NSString *)webScriptNameForKey:(const char *)name;
143
144 /*!
145     @method isKeyExcludedFromWebScript:
146     @param name The name of the instance variable that will be exposed to the
147     script environment.
148     @discussion Return NO to export the property to the script environment.
149     Return YES to prevent the property from being exported to the script environment.
150     @result Returns YES to hide the property, NO to export the property.
151 */
152 + (BOOL)isKeyExcludedFromWebScript:(const char *)name;
153
154 /*!
155     @method invokeUndefinedMethodFromWebScript:withArguments:
156     @param name The name of the method to invoke.
157     @param arguments The arguments to pass the method.
158     @discussion If a script attempts to invoke a method that is not exported, 
159     invokeUndefinedMethodFromWebScript:withArguments: will be called.
160     @result The return value of the invocation. The value will be converted as appropriate
161     for the script environment.
162 */
163 - (id)invokeUndefinedMethodFromWebScript:(NSString *)name withArguments:(NSArray *)arguments;
164
165 /*!
166     @method invokeDefaultMethodWithArguments:
167     @param arguments The arguments to pass the method.
168     @discussion If a script attempts to call an exposed object as a function, 
169     this method will be called.
170     @result The return value of the call. The value will be converted as appropriate
171     for the script environment.
172 */
173 - (id)invokeDefaultMethodWithArguments:(NSArray *)arguments;
174
175 /*!
176     @method finalizeForWebScript
177     @discussion finalizeForScript is called on objects exposed to the script
178     environment just before the script environment garbage collects the object.
179     Subsequently, any references to WebScriptObjects made by the exposed object will
180     be invalid and have undefined consequences.
181 */
182 - (void)finalizeForWebScript;
183
184 @end
185
186
187 // WebScriptObject --------------------------------------------------
188
189 @class WebScriptObjectPrivate;
190 @class WebFrame;
191
192 /*!
193     @class WebScriptObject
194     @discussion WebScriptObjects are used to wrap script objects passed from
195     script environments to Objective-C. WebScriptObjects cannot be created
196     directly. In normal uses of WebKit, you gain access to the script
197     environment using the "windowScriptObject" method on WebView.
198
199     The following KVC methods are commonly used to access properties of the
200     WebScriptObject:
201
202         - (void)setValue:(id)value forKey:(NSString *)key
203         - (id)valueForKey:(NSString *)key
204
205     As it possible to remove attributes from web script objects, the following
206     additional method augments the basic KVC methods:
207
208         - (void)removeWebScriptKey:(NSString *)name;
209
210     Also, since the sparse array access allowed in script objects doesn't map well
211     to NSArray, the following methods can be used to access index based properties:
212
213         - (id)webScriptValueAtIndex:(unsigned)index;
214         - (void)setWebScriptValueAtIndex:(unsigned)index value:(id)value;
215 */
216 @interface WebScriptObject : NSObject
217 {
218     WebScriptObjectPrivate *_private;
219 }
220
221 /*!
222     @method throwException:
223     @discussion Throws an exception in the current script execution context.
224     @result Either NO if an exception could not be raised, YES otherwise.
225 */
226 + (BOOL)throwException:(NSString *)exceptionMessage;
227
228 /*!
229     @method JSObject
230     @result The equivalent JSObjectRef for this WebScriptObject.
231     @discussion Use this method to bridge between the WebScriptObject and 
232     JavaScriptCore APIs.
233 */
234 - (JSObjectRef)JSObject;
235
236 /*!
237     @method callWebScriptMethod:withArguments:
238     @param name The name of the method to call in the script environment.
239     @param arguments The arguments to pass to the script environment.
240     @discussion Calls the specified method in the script environment using the
241     specified arguments.
242     @result Returns the result of calling the script method.
243     Returns WebUndefined when an exception is thrown in the script environment.
244 */
245 - (id)callWebScriptMethod:(NSString *)name withArguments:(NSArray *)arguments;
246
247 /*!
248     @method evaluateWebScript:
249     @param script The script to execute in the target script environment.
250     @discussion The script will be executed in the target script environment. The format
251     of the script is dependent of the target script environment.
252     @result Returns the result of evaluating the script in the script environment.
253     Returns WebUndefined when an exception is thrown in the script environment.
254 */
255 - (id)evaluateWebScript:(NSString *)script;
256
257 /*!
258     @method removeWebScriptKey:
259     @param name The name of the property to remove.
260     @discussion Removes the property from the object in the script environment.
261 */
262 - (void)removeWebScriptKey:(NSString *)name;
263
264 /*!
265     @method stringRepresentation
266     @discussion Converts the target object to a string representation. The coercion
267     of non string objects type is dependent on the script environment.
268     @result Returns the string representation of the object.
269 */
270 - (NSString *)stringRepresentation;
271
272 /*!
273     @method webScriptValueAtIndex:
274     @param index The index of the property to return.
275     @discussion Gets the value of the property at the specified index.
276     @result The value of the property. Returns WebUndefined when an exception is
277     thrown in the script environment.
278 */
279 - (id)webScriptValueAtIndex:(unsigned)index;
280
281 /*!
282     @method setWebScriptValueAtIndex:value:
283     @param index The index of the property to set.
284     @param value The value of the property to set.
285     @discussion Sets the property value at the specified index.
286 */
287 - (void)setWebScriptValueAtIndex:(unsigned)index value:(id)value;
288
289 /*!
290     @method setException:
291     @param description The description of the exception.
292     @discussion Raises an exception in the script environment in the context of the
293     current object.
294 */
295 - (void)setException:(NSString *)description;
296
297 @end
298
299
300 // WebUndefined --------------------------------------------------------------
301
302 /*!
303     @class WebUndefined
304 */
305 @interface WebUndefined : NSObject <NSCoding, NSCopying>
306
307 /*!
308     @method undefined
309     @result The WebUndefined shared instance.
310 */
311 + (WebUndefined *)undefined;
312
313 @end