/*
* 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.
*/
#import
@textblock
@protocol MyClassJavaScriptMethods
Data properties that are created on the prototype or constructor objects have
the attributes: writable:true, enumerable:false, configurable:true.
Accessor properties have the attributes: enumerable:false and configurable:true.
If an instance of MyClass is converted to a JavaScript value, the resulting
wrapper object will (via its prototype) export the method foo to JavaScript,
since the class conforms to the MyClassJavaScriptMethods protocol, and this
protocol incorporates JSExport. bar will not be exported.
Properties, arguments, and return values of the following types are
supported:
Primitive numbers: signed values of up to 32-bits are converted in a manner
consistent with valueWithInt32/toInt32, unsigned values of up to 32-bits
are converted in a manner consistent with valueWithUInt32/toUInt32, all
other numeric values are converted consistently with valueWithDouble/
toDouble.
BOOL: values are converted consistently with valueWithBool/toBool.
id: values are converted consistently with valueWithObject/toObject.
Objective-C Class: - where the type is a pointer to a specified Objective-C
class, conversion is consistent with valueWithObjectOfClass/toObject.
struct types: C struct types are supported, where JSValue provides support
for the given type. Support is built in for CGPoint, NSRange, CGRect, and
CGSize.
block types: Blocks can only be passed if they had been converted
successfully by valueWithObject/toObject previously.
For any interface that conforms to JSExport the normal copying conversion for
built in types will be inhibited - so, for example, if an instance that
derives from NSString but conforms to JSExport is passed to valueWithObject:
then a wrapper object for the Objective-C object will be returned rather than
a JavaScript string primitive.
*/
@protocol JSExport
@end
/*!
@define
@abstract Rename a selector when it's exported to JavaScript.
@discussion When a selector that takes one or more arguments is converted to a JavaScript
property name, by default a property name will be generated by performing the
following conversion:
- All colons are removed from the selector
- Any lowercase letter that had followed a colon will be capitalized.
Under the default conversion a selector doFoo:withBar: will be exported as
doFooWithBar. The default conversion may be overriden using the JSExportAs
macro, for example to export a method doFoo:withBar: as doFoo:
@textblock
@protocol MyClassJavaScriptMethods
Note that the JSExport macro may only be applied to a selector that takes one
or more argument.
*/
#define JSExportAs(PropertyName, Selector) \
@optional Selector __JS_EXPORT_AS__##PropertyName:(id)argument; @required Selector
#endif