123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673 |
- /*
- * 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;
- /*!
- @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 JSC_API_AVAILABLE(macosx(10.11), ios(9.0));
- /*!
- @property
- @abstract Check if a JSValue is a date.
- */
- @property (readonly) BOOL isDate JSC_API_AVAILABLE(macosx(10.11), ios(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 These methods enable querying properties on a JSValue.
- */
- @interface JSValue (PropertyAccess)
- /*!
- @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;
- @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
|