react-native/React/Executors/RCTJSCExecutor.h
Adam Ernst 80c71e5cae Refine RCTJSCExecutor's APIs for using a thread/context that already exists
Summary:
The `initWithJSContextProvider:` API created a `RCTJSCExecutor` with a thread/context that already exists, but it did not solve the problem of loading an actual application script; the `executeApplicationScript:` API is also asynchronous.

Create a new merged API that allows you to pass in a pre-created thread/context pair and immediately receive an `RCTJSCExector` that has already executed a specified application script.

This also removes the `underlyingJSContext` API entirely, in favor of passing it back in a byref variable in the new API. This minimizes the surface area for API abuse.

Reviewed By: bnham

Differential Revision: D3545349

fbshipit-source-id: 1c564f44d2a5379b5e6f75640079a28fd7169f67
2016-07-12 05:28:36 -07:00

79 lines
2.8 KiB
Objective-C

/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import <JavaScriptCore/JavaScriptCore.h>
#import "RCTJavaScriptExecutor.h"
/**
* Default name for the JS thread
*/
RCT_EXTERN NSString *const RCTJSCThreadName;
/**
* This notification fires on the JS thread immediately after a `JSContext`
* is fully initialized, but before the JS bundle has been loaded. The object
* of this notification is the `JSContext`. Native modules should listen for
* notification only if they need to install custom functionality into the
* context. Note that this notification won't fire when debugging in Chrome.
*/
RCT_EXTERN NSString *const RCTJavaScriptContextCreatedNotification;
/**
* @experimental
* May be used to pre-create the JSContext to make RCTJSCExecutor creation less costly.
* Avoid using this; it's experimental and is not likely to be supported long-term.
*/
@interface RCTJSContextProvider : NSObject
- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary;
@end
/**
* Uses a JavaScriptCore context as the execution engine.
*/
@interface RCTJSCExecutor : NSObject <RCTJavaScriptExecutor>
/**
* Returns whether executor uses custom JSC library.
* This value is used to initialize RCTJSCWrapper.
* @default is NO.
*/
@property (nonatomic, readonly, assign) BOOL useCustomJSCLibrary;
/**
* Inits a new executor instance with given flag that's used
* to initialize RCTJSCWrapper.
*/
- (instancetype)initWithUseCustomJSCLibrary:(BOOL)useCustomJSCLibrary;
/**
* Create a NSError from a JSError object.
*
* If available, the error's userInfo property will contain the JS stacktrace under
* the RCTJSStackTraceKey key.
*/
- (NSError *)convertJSErrorToNSError:(JSValueRef)jsError context:(JSContextRef)context;
/**
* @experimental
* Pass a RCTJSContextProvider object to use an NSThread/JSContext pair that have already been created.
* The returned executor has already executed the supplied application script synchronously.
* The underlying JSContext will be returned in the JSContext pointer if it is non-NULL and there was no error.
* If an error occurs, this method will return nil and specify the error in the error pointer if it is non-NULL.
*/
+ (instancetype)initializedExecutorWithContextProvider:(RCTJSContextProvider *)JSContextProvider
applicationScript:(NSData *)applicationScript
sourceURL:(NSURL *)sourceURL
JSContext:(JSContext **)JSContext
error:(NSError **)error;
@end