| /* |
| * Copyright (C) 2013 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY |
| * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef JSValue_h |
| #define JSValue_h |
| |
| #if JSC_OBJC_API_ENABLED |
| |
| #import <CoreGraphics/CGGeometry.h> |
| |
| @class JSContext; |
| |
| /*! |
| @interface |
| @discussion A JSValue is a reference to a JavaScript value. Every JSValue |
| originates from a JSContext and holds a strong reference to it. |
| When a JSValue instance method creates a new JSValue, the new value |
| originates from the same JSContext. |
| |
| All JSValues values also originate from a JSVirtualMachine |
| (available indirectly via the context property). It is an error to pass a |
| JSValue to a method or property of a JSValue or JSContext originating from a |
| different JSVirtualMachine. Doing so will raise an Objective-C exception. |
| */ |
| NS_CLASS_AVAILABLE(10_9, 7_0) |
| @interface JSValue : NSObject |
| |
| /*! |
| @property |
| @abstract The JSContext that this value originates from. |
| */ |
| @property (readonly, strong) JSContext *context; |
| |
| /*! |
| @methodgroup Creating JavaScript Values |
| */ |
| /*! |
| @method |
| @abstract Create a JSValue by converting an Objective-C object. |
| @discussion The resulting JSValue retains the provided Objective-C object. |
| @param value The Objective-C object to be converted. |
| @result The new JSValue. |
| */ |
| + (JSValue *)valueWithObject:(id)value inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JavaScript value from a BOOL primitive. |
| @param context The JSContext in which the resulting JSValue will be created. |
| @result The new JSValue representing the equivalent boolean value. |
| */ |
| + (JSValue *)valueWithBool:(BOOL)value inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JavaScript value from a double primitive. |
| @param context The JSContext in which the resulting JSValue will be created. |
| @result The new JSValue representing the equivalent boolean value. |
| */ |
| + (JSValue *)valueWithDouble:(double)value inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JavaScript value from an <code>int32_t</code> primitive. |
| @param context The JSContext in which the resulting JSValue will be created. |
| @result The new JSValue representing the equivalent boolean value. |
| */ |
| + (JSValue *)valueWithInt32:(int32_t)value inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JavaScript value from a <code>uint32_t</code> primitive. |
| @param context The JSContext in which the resulting JSValue will be created. |
| @result The new JSValue representing the equivalent boolean value. |
| */ |
| + (JSValue *)valueWithUInt32:(uint32_t)value inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a new, empty JavaScript object. |
| @param context The JSContext in which the resulting object will be created. |
| @result The new JavaScript object. |
| */ |
| + (JSValue *)valueWithNewObjectInContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a new, empty JavaScript array. |
| @param context The JSContext in which the resulting array will be created. |
| @result The new JavaScript array. |
| */ |
| + (JSValue *)valueWithNewArrayInContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a new JavaScript regular expression object. |
| @param pattern The regular expression pattern. |
| @param flags The regular expression flags. |
| @param context The JSContext in which the resulting regular expression object will be created. |
| @result The new JavaScript regular expression object. |
| */ |
| + (JSValue *)valueWithNewRegularExpressionFromPattern:(NSString *)pattern flags:(NSString *)flags inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a new JavaScript error object. |
| @param message The error message. |
| @param context The JSContext in which the resulting error object will be created. |
| @result The new JavaScript error object. |
| */ |
| + (JSValue *)valueWithNewErrorFromMessage:(NSString *)message inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create the JavaScript value <code>null</code>. |
| @param context The JSContext to which the resulting JSValue belongs. |
| @result The JSValue representing the JavaScript value <code>null</code>. |
| */ |
| + (JSValue *)valueWithNullInContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create the JavaScript value <code>undefined</code>. |
| @param context The JSContext to which the resulting JSValue belongs. |
| @result The JSValue representing the JavaScript value <code>undefined</code>. |
| */ |
| + (JSValue *)valueWithUndefinedInContext:(JSContext *)context; |
| |
| /*! |
| @methodgroup Converting to Objective-C Types |
| @discussion When converting between JavaScript values and Objective-C objects a copy is |
| performed. Values of types listed below are copied to the corresponding |
| types on conversion in each direction. For NSDictionaries, entries in the |
| dictionary that are keyed by strings are copied onto a JavaScript object. |
| For dictionaries and arrays, conversion is recursive, with the same object |
| conversion being applied to all entries in the collection. |
| |
| <pre> |
| @textblock |
| Objective-C type | JavaScript type |
| --------------------+--------------------- |
| nil | undefined |
| NSNull | null |
| NSString | string |
| NSNumber | number, boolean |
| NSDictionary | Object object |
| NSArray | Array object |
| NSDate | Date object |
| NSBlock (1) | Function object (1) |
| id (2) | Wrapper object (2) |
| Class (3) | Constructor object (3) |
| @/textblock |
| </pre> |
| |
| (1) Instances of NSBlock with supported arguments types will be presented to |
| JavaScript as a callable Function object. For more information on supported |
| argument types see JSExport.h. If a JavaScript Function originating from an |
| Objective-C block is converted back to an Objective-C object the block will |
| be returned. All other JavaScript functions will be converted in the same |
| manner as a JavaScript object of type Object. |
| |
| (2) For Objective-C instances that do not derive from the set of types listed |
| above, a wrapper object to provide a retaining handle to the Objective-C |
| instance from JavaScript. For more information on these wrapper objects, see |
| JSExport.h. When a JavaScript wrapper object is converted back to Objective-C |
| the Objective-C instance being retained by the wrapper is returned. |
| |
| (3) For Objective-C Class objects a constructor object containing exported |
| class methods will be returned. See JSExport.h for more information on |
| constructor objects. |
| |
| For all methods taking arguments of type id, arguments will be converted |
| into a JavaScript value according to the above conversion. |
| */ |
| /*! |
| @method |
| @abstract Convert this JSValue to an Objective-C object. |
| @discussion The JSValue is converted to an Objective-C object according |
| to the conversion rules specified above. |
| @result The Objective-C representation of this JSValue. |
| */ |
| - (id)toObject; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to an Objective-C object of a specific class. |
| @discussion The JSValue is converted to an Objective-C object of the specified Class. |
| If the result is not of the specified Class then <code>nil</code> will be returned. |
| @result An Objective-C object of the specified Class or <code>nil</code>. |
| */ |
| - (id)toObjectOfClass:(Class)expectedClass; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a boolean. |
| @discussion The JSValue is converted to a boolean according to the rules specified |
| by the JavaScript language. |
| @result The boolean result of the conversion. |
| */ |
| - (BOOL)toBool; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a double. |
| @discussion The JSValue is converted to a number according to the rules specified |
| by the JavaScript language. |
| @result The double result of the conversion. |
| */ |
| - (double)toDouble; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to an <code>int32_t</code>. |
| @discussion The JSValue is converted to an integer according to the rules specified |
| by the JavaScript language. |
| @result The <code>int32_t</code> result of the conversion. |
| */ |
| - (int32_t)toInt32; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a <code>uint32_t</code>. |
| @discussion The JSValue is converted to an integer according to the rules specified |
| by the JavaScript language. |
| @result The <code>uint32_t</code> result of the conversion. |
| */ |
| - (uint32_t)toUInt32; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a NSNumber. |
| @discussion If the JSValue represents a boolean, a NSNumber value of YES or NO |
| will be returned. For all other types the value will be converted to a number according |
| to the rules specified by the JavaScript language. |
| @result The NSNumber result of the conversion. |
| */ |
| - (NSNumber *)toNumber; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a NSString. |
| @discussion The JSValue is converted to a string according to the rules specified |
| by the JavaScript language. |
| @result The NSString containing the result of the conversion. |
| */ |
| - (NSString *)toString; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a NSDate. |
| @discussion The value is converted to a number representing a time interval |
| since 1970 which is then used to create a new NSDate instance. |
| @result The NSDate created using the converted time interval. |
| */ |
| - (NSDate *)toDate; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a NSArray. |
| @discussion If the value is <code>null</code> or <code>undefined</code> then <code>nil</code> is returned. |
| If the value is not an object then a JavaScript TypeError will be thrown. |
| The property <code>length</code> is read from the object, converted to an unsigned |
| integer, and an NSArray of this size is allocated. Properties corresponding |
| to indicies within the array bounds will be copied to the array, with |
| JSValues converted to equivalent Objective-C objects as specified. |
| @result The NSArray containing the recursively converted contents of the |
| converted JavaScript array. |
| */ |
| - (NSArray *)toArray; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a NSDictionary. |
| @discussion If the value is <code>null</code> or <code>undefined</code> then <code>nil</code> is returned. |
| If the value is not an object then a JavaScript TypeError will be thrown. |
| All enumerable properties of the object are copied to the dictionary, with |
| JSValues converted to equivalent Objective-C objects as specified. |
| @result The NSDictionary containing the recursively converted contents of |
| the converted JavaScript object. |
| */ |
| - (NSDictionary *)toDictionary; |
| |
| /*! |
| @methodgroup Accessing Properties |
| */ |
| /*! |
| @method |
| @abstract Access a property of a JSValue. |
| @result The JSValue for the requested property or the JSValue <code>undefined</code> |
| if the property does not exist. |
| */ |
| - (JSValue *)valueForProperty:(NSString *)property; |
| |
| /*! |
| @method |
| @abstract Set a property on a JSValue. |
| */ |
| - (void)setValue:(id)value forProperty:(NSString *)property; |
| |
| /*! |
| @method |
| @abstract Delete a property from a JSValue. |
| @result YES if deletion is successful, NO otherwise. |
| */ |
| - (BOOL)deleteProperty:(NSString *)property; |
| |
| /*! |
| @method |
| @abstract Check if a JSValue has a property. |
| @discussion This method has the same function as the JavaScript operator <code>in</code>. |
| @result Returns YES if property is present on the value. |
| */ |
| - (BOOL)hasProperty:(NSString *)property; |
| |
| /*! |
| @method |
| @abstract Define properties with custom descriptors on JSValues. |
| @discussion This method may be used to create a data or accessor property on an object. |
| This method operates in accordance with the Object.defineProperty method in the |
| JavaScript language. |
| */ |
| - (void)defineProperty:(NSString *)property descriptor:(id)descriptor; |
| |
| /*! |
| @method |
| @abstract Access an indexed (numerical) property on a JSValue. |
| @result The JSValue for the property at the specified index. |
| Returns the JavaScript value <code>undefined</code> if no property exists at that index. |
| */ |
| - (JSValue *)valueAtIndex:(NSUInteger)index; |
| |
| /*! |
| @method |
| @abstract Set an indexed (numerical) property on a JSValue. |
| @discussion For JSValues that are JavaScript arrays, indices greater than |
| UINT_MAX - 1 will not affect the length of the array. |
| */ |
| - (void)setValue:(id)value atIndex:(NSUInteger)index; |
| |
| /*! |
| @functiongroup Checking JavaScript Types |
| */ |
| |
| /*! |
| @property |
| @abstract Check if a JSValue corresponds to the JavaScript value <code>undefined</code>. |
| */ |
| @property (readonly) BOOL isUndefined; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue corresponds to the JavaScript value <code>null</code>. |
| */ |
| @property (readonly) BOOL isNull; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is a boolean. |
| */ |
| @property (readonly) BOOL isBoolean; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is a number. |
| @discussion In JavaScript, there is no differentiation between types of numbers. |
| Semantically all numbers behave like doubles except in special cases like bit |
| operations. |
| */ |
| @property (readonly) BOOL isNumber; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is a string. |
| */ |
| @property (readonly) BOOL isString; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is an object. |
| */ |
| @property (readonly) BOOL isObject; |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is an array. |
| */ |
| @property (readonly) BOOL isArray NS_AVAILABLE(10_11, 9_0); |
| |
| /*! |
| @property |
| @abstract Check if a JSValue is a date. |
| */ |
| @property (readonly) BOOL isDate NS_AVAILABLE(10_11, 9_0); |
| |
| /*! |
| @method |
| @abstract Compare two JSValues using JavaScript's <code>===</code> operator. |
| */ |
| - (BOOL)isEqualToObject:(id)value; |
| |
| /*! |
| @method |
| @abstract Compare two JSValues using JavaScript's <code>==</code> operator. |
| */ |
| - (BOOL)isEqualWithTypeCoercionToObject:(id)value; |
| |
| /*! |
| @method |
| @abstract Check if a JSValue is an instance of another object. |
| @discussion This method has the same function as the JavaScript operator <code>instanceof</code>. |
| If an object other than a JSValue is passed, it will first be converted according to |
| the aforementioned rules. |
| */ |
| - (BOOL)isInstanceOf:(id)value; |
| |
| /*! |
| @methodgroup Calling Functions and Constructors |
| */ |
| /*! |
| @method |
| @abstract Invoke a JSValue as a function. |
| @discussion In JavaScript, if a function doesn't explicitly return a value then it |
| implicitly returns the JavaScript value <code>undefined</code>. |
| @param arguments The arguments to pass to the function. |
| @result The return value of the function call. |
| */ |
| - (JSValue *)callWithArguments:(NSArray *)arguments; |
| |
| /*! |
| @method |
| @abstract Invoke a JSValue as a constructor. |
| @discussion This is equivalent to using the <code>new</code> syntax in JavaScript. |
| @param arguments The arguments to pass to the constructor. |
| @result The return value of the constructor call. |
| */ |
| - (JSValue *)constructWithArguments:(NSArray *)arguments; |
| |
| /*! |
| @method |
| @abstract Invoke a method on a JSValue. |
| @discussion Accesses the property named <code>method</code> from this value and |
| calls the resulting value as a function, passing this JSValue as the <code>this</code> |
| value along with the specified arguments. |
| @param method The name of the method to be invoked. |
| @param arguments The arguments to pass to the method. |
| @result The return value of the method call. |
| */ |
| - (JSValue *)invokeMethod:(NSString *)method withArguments:(NSArray *)arguments; |
| |
| @end |
| |
| /*! |
| @category |
| @discussion Objective-C methods exported to JavaScript may have argument and/or return |
| values of struct types, provided that conversion to and from the struct is |
| supported by JSValue. Support is provided for any types where JSValue |
| contains both a class method <code>valueWith<Type>:inContext:</code>, and and instance |
| method <code>to<Type></code>- where the string <code><Type></code> in these selector names match, |
| with the first argument to the former being of the same struct type as the |
| return type of the latter. |
| Support is provided for structs of type CGPoint, NSRange, CGRect and CGSize. |
| */ |
| @interface JSValue (StructSupport) |
| |
| /*! |
| @method |
| @abstract Create a JSValue from a CGPoint. |
| @result A newly allocated JavaScript object containing properties |
| named <code>x</code> and <code>y</code>, with values from the CGPoint. |
| */ |
| + (JSValue *)valueWithPoint:(CGPoint)point inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JSValue from a NSRange. |
| @result A newly allocated JavaScript object containing properties |
| named <code>location</code> and <code>length</code>, with values from the NSRange. |
| */ |
| + (JSValue *)valueWithRange:(NSRange)range inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract |
| Create a JSValue from a CGRect. |
| @result A newly allocated JavaScript object containing properties |
| named <code>x</code>, <code>y</code>, <code>width</code>, and <code>height</code>, with values from the CGRect. |
| */ |
| + (JSValue *)valueWithRect:(CGRect)rect inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Create a JSValue from a CGSize. |
| @result A newly allocated JavaScript object containing properties |
| named <code>width</code> and <code>height</code>, with values from the CGSize. |
| */ |
| + (JSValue *)valueWithSize:(CGSize)size inContext:(JSContext *)context; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a CGPoint. |
| @discussion Reads the properties named <code>x</code> and <code>y</code> from |
| this JSValue, and converts the results to double. |
| @result The new CGPoint. |
| */ |
| - (CGPoint)toPoint; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to an NSRange. |
| @discussion Reads the properties named <code>location</code> and |
| <code>length</code> from this JSValue and converts the results to double. |
| @result The new NSRange. |
| */ |
| - (NSRange)toRange; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a CGRect. |
| @discussion Reads the properties named <code>x</code>, <code>y</code>, |
| <code>width</code>, and <code>height</code> from this JSValue and converts the results to double. |
| @result The new CGRect. |
| */ |
| - (CGRect)toRect; |
| |
| /*! |
| @method |
| @abstract Convert a JSValue to a CGSize. |
| @discussion Reads the properties named <code>width</code> and |
| <code>height</code> from this JSValue and converts the results to double. |
| @result The new CGSize. |
| */ |
| - (CGSize)toSize; |
| |
| @end |
| |
| /*! |
| @category |
| @discussion Instances of JSValue implement the following methods in order to enable |
| support for subscript access by key and index, for example: |
| |
| @textblock |
| JSValue *objectA, *objectB; |
| JSValue *v1 = object[@"X"]; // Get value for property "X" from 'object'. |
| JSValue *v2 = object[42]; // Get value for index 42 from 'object'. |
| object[@"Y"] = v1; // Assign 'v1' to property "Y" of 'object'. |
| object[101] = v2; // Assign 'v2' to index 101 of 'object'. |
| @/textblock |
| |
| An object key passed as a subscript will be converted to a JavaScript value, |
| and then the value converted to a string used as a property name. |
| */ |
| @interface JSValue (SubscriptSupport) |
| |
| - (JSValue *)objectForKeyedSubscript:(id)key; |
| - (JSValue *)objectAtIndexedSubscript:(NSUInteger)index; |
| - (void)setObject:(id)object forKeyedSubscript:(NSObject <NSCopying> *)key; |
| - (void)setObject:(id)object atIndexedSubscript:(NSUInteger)index; |
| |
| @end |
| |
| /*! |
| @category |
| @discussion These functions are for bridging between the C API and the Objective-C API. |
| */ |
| @interface JSValue (JSValueRefSupport) |
| |
| /*! |
| @method |
| @abstract Creates a JSValue, wrapping its C API counterpart. |
| @result The Objective-C API equivalent of the specified JSValueRef. |
| */ |
| + (JSValue *)valueWithJSValueRef:(JSValueRef)value inContext:(JSContext *)context; |
| |
| /*! |
| @property |
| @abstract Returns the C API counterpart wrapped by a JSContext. |
| @result The C API equivalent of this JSValue. |
| */ |
| @property (readonly) JSValueRef JSValueRef; |
| @end |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /*! |
| @group Property Descriptor Constants |
| @discussion These keys may assist in creating a property descriptor for use with the |
| defineProperty method on JSValue. |
| Property descriptors must fit one of three descriptions: |
| |
| Data Descriptor: |
| - A descriptor containing one or both of the keys <code>value</code> and <code>writable</code>, |
| and optionally containing one or both of the keys <code>enumerable</code> and |
| <code>configurable</code>. A data descriptor may not contain either the <code>get</code> or |
| <code>set</code> key. |
| A data descriptor may be used to create or modify the attributes of a |
| data property on an object (replacing any existing accessor property). |
| |
| Accessor Descriptor: |
| - A descriptor containing one or both of the keys <code>get</code> and <code>set</code>, and |
| optionally containing one or both of the keys <code>enumerable</code> and |
| <code>configurable</code>. An accessor descriptor may not contain either the <code>value</code> |
| or <code>writable</code> key. |
| An accessor descriptor may be used to create or modify the attributes of |
| an accessor property on an object (replacing any existing data property). |
| |
| Generic Descriptor: |
| - A descriptor containing one or both of the keys <code>enumerable</code> and |
| <code>configurable</code>. A generic descriptor may not contain any of the keys |
| <code>value</code>, <code>writable</code>, <code>get</code>, or <code>set</code>. |
| A generic descriptor may be used to modify the attributes of an existing |
| data or accessor property, or to create a new data property. |
| */ |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorWritableKey; |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorEnumerableKey; |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorConfigurableKey; |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorValueKey; |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorGetKey; |
| /*! |
| @const |
| */ |
| JS_EXPORT extern NSString * const JSPropertyDescriptorSetKey; |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif |
| |
| #endif // JSValue_h |