Remove callFunctionSync experimental APIs
Reviewed By: michalgr Differential Revision: D6124038 fbshipit-source-id: 219afe30783da92cf10f800dc35e64823b61cf4b
This commit is contained in:
parent
860fcd458a
commit
19a4a7d3cb
|
@ -120,22 +120,6 @@ RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass);
|
||||||
- (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args;
|
- (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args;
|
||||||
- (void)enqueueJSCall:(NSString *)module method:(NSString *)method args:(NSArray *)args completion:(dispatch_block_t)completion;
|
- (void)enqueueJSCall:(NSString *)module method:(NSString *)method args:(NSArray *)args completion:(dispatch_block_t)completion;
|
||||||
|
|
||||||
/**
|
|
||||||
* This method is used to call functions in the JavaScript application context
|
|
||||||
* synchronously. This is intended for use by applications which do their own
|
|
||||||
* thread management and are careful to manage multi-threaded access to the JSVM.
|
|
||||||
* See also -[RCTBridgeDelgate shouldBridgeLoadJavaScriptSynchronously], which
|
|
||||||
* may be needed to ensure that any requires JS code is loaded before this method
|
|
||||||
* is called. If the underlying executor is not JSC, this will return nil. Safe
|
|
||||||
* to call from any thread.
|
|
||||||
*
|
|
||||||
* @experimental
|
|
||||||
*/
|
|
||||||
- (JSValue *)callFunctionOnModule:(NSString *)module
|
|
||||||
method:(NSString *)method
|
|
||||||
arguments:(NSArray *)arguments
|
|
||||||
error:(NSError **)error;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method registers the file path of an additional JS segment by its ID.
|
* This method registers the file path of an additional JS segment by its ID.
|
||||||
*
|
*
|
||||||
|
|
|
@ -364,14 +364,6 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init)
|
||||||
[self.batchedBridge enqueueCallback:cbID args:args];
|
[self.batchedBridge enqueueCallback:cbID args:args];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (JSValue *)callFunctionOnModule:(NSString *)module
|
|
||||||
method:(NSString *)method
|
|
||||||
arguments:(NSArray *)arguments
|
|
||||||
error:(NSError **)error
|
|
||||||
{
|
|
||||||
return [self.batchedBridge callFunctionOnModule:module method:method arguments:arguments error:error];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path
|
- (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path
|
||||||
{
|
{
|
||||||
[self.batchedBridge registerSegmentWithId:segmentId path:path];
|
[self.batchedBridge registerSegmentWithId:segmentId path:path];
|
||||||
|
|
|
@ -1183,53 +1183,6 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (JSValue *)callFunctionOnModule:(NSString *)module
|
|
||||||
method:(NSString *)method
|
|
||||||
arguments:(NSArray *)arguments
|
|
||||||
error:(NSError **)error
|
|
||||||
{
|
|
||||||
if (!_reactInstance) {
|
|
||||||
if (error) {
|
|
||||||
*error = RCTErrorWithMessage(
|
|
||||||
@"callFunctionOnModule was called on uninitialized bridge");
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
} else if (self.executorClass) {
|
|
||||||
if (error) {
|
|
||||||
*error = RCTErrorWithMessage(
|
|
||||||
@"callFunctionOnModule can only be used with JSC executor");
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
} else if (!self.valid) {
|
|
||||||
if (error) {
|
|
||||||
*error = RCTErrorWithMessage(
|
|
||||||
@"Bridge is no longer valid");
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
} else if (self.loading) {
|
|
||||||
if (error) {
|
|
||||||
*error = RCTErrorWithMessage(
|
|
||||||
@"Bridge is still loading");
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
RCT_PROFILE_BEGIN_EVENT(0, @"callFunctionOnModule", (@{ @"module": module, @"method": method }));
|
|
||||||
__block JSValue *ret = nil;
|
|
||||||
NSError *errorObj = tryAndReturnError(^{
|
|
||||||
Value result = self->_reactInstance->callFunctionSync([module UTF8String], [method UTF8String], (id)arguments);
|
|
||||||
JSContext *context = contextForGlobalContextRef(JSC_JSContextGetGlobalContext(result.context()));
|
|
||||||
ret = [JSC_JSValue(result.context()) valueWithJSValueRef:result inContext:context];
|
|
||||||
});
|
|
||||||
RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"js_call");
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
*error = errorObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path
|
- (void)registerSegmentWithId:(NSUInteger)segmentId path:(NSString *)path
|
||||||
{
|
{
|
||||||
if (_reactInstance) {
|
if (_reactInstance) {
|
||||||
|
|
|
@ -63,15 +63,6 @@ public:
|
||||||
// This method is experimental, and may be modified or removed.
|
// This method is experimental, and may be modified or removed.
|
||||||
void registerBundle(uint32_t bundleId, const std::string& bundlePath);
|
void registerBundle(uint32_t bundleId, const std::string& bundlePath);
|
||||||
|
|
||||||
// This method is experimental, and may be modified or removed.
|
|
||||||
template <typename T>
|
|
||||||
Value callFunctionSync(const std::string &module, const std::string &method,
|
|
||||||
T &&args) {
|
|
||||||
CHECK(nativeToJsBridge_);
|
|
||||||
return nativeToJsBridge_->callFunctionSync(module, method,
|
|
||||||
std::forward<T>(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
const ModuleRegistry &getModuleRegistry() const;
|
const ModuleRegistry &getModuleRegistry() const;
|
||||||
ModuleRegistry &getModuleRegistry();
|
ModuleRegistry &getModuleRegistry();
|
||||||
|
|
||||||
|
|
|
@ -581,30 +581,6 @@ namespace facebook {
|
||||||
callNativeModules(std::move(result));
|
callNativeModules(std::move(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
Value JSCExecutor::callFunctionSyncWithValue(
|
|
||||||
const std::string& module, const std::string& method, Value args) {
|
|
||||||
SystraceSection s("JSCExecutor::callFunction");
|
|
||||||
Object result = [&] {
|
|
||||||
JSContextLock lock(m_context);
|
|
||||||
if (!m_callFunctionReturnResultAndFlushedQueueJS) {
|
|
||||||
bindBridge();
|
|
||||||
}
|
|
||||||
return m_callFunctionReturnResultAndFlushedQueueJS->callAsFunction({
|
|
||||||
Value(m_context, String::createExpectingAscii(m_context, module)),
|
|
||||||
Value(m_context, String::createExpectingAscii(m_context, method)),
|
|
||||||
std::move(args),
|
|
||||||
}).asObject();
|
|
||||||
}();
|
|
||||||
|
|
||||||
Value length = result.getProperty("length");
|
|
||||||
|
|
||||||
if (!length.isNumber() || length.asInteger() != 2) {
|
|
||||||
std::runtime_error("Return value of a callFunction must be an array of size 2");
|
|
||||||
}
|
|
||||||
callNativeModules(result.getPropertyAtIndex(1));
|
|
||||||
return result.getPropertyAtIndex(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void JSCExecutor::setGlobalVariable(std::string propName, std::unique_ptr<const JSBigString> jsonValue) {
|
void JSCExecutor::setGlobalVariable(std::string propName, std::unique_ptr<const JSBigString> jsonValue) {
|
||||||
try {
|
try {
|
||||||
SystraceSection s("JSCExecutor::setGlobalVariable", "propName", propName);
|
SystraceSection s("JSCExecutor::setGlobalVariable", "propName", propName);
|
||||||
|
|
|
@ -79,14 +79,6 @@ public:
|
||||||
const double callbackId,
|
const double callbackId,
|
||||||
const folly::dynamic& arguments) override;
|
const folly::dynamic& arguments) override;
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
Value callFunctionSync(
|
|
||||||
const std::string& module, const std::string& method, T&& args) {
|
|
||||||
return callFunctionSyncWithValue(
|
|
||||||
module, method, JSCValueEncoder<typename std::decay<T>::type>::toJSCValue(
|
|
||||||
m_context, std::forward<T>(args)));
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual void setGlobalVariable(
|
virtual void setGlobalVariable(
|
||||||
std::string propName,
|
std::string propName,
|
||||||
std::unique_ptr<const JSBigString> jsonValue) override;
|
std::unique_ptr<const JSBigString> jsonValue) override;
|
||||||
|
@ -123,9 +115,6 @@ private:
|
||||||
|
|
||||||
void initOnJSVMThread() throw(JSException);
|
void initOnJSVMThread() throw(JSException);
|
||||||
static bool isNetworkInspected(const std::string &owner, const std::string &app, const std::string &device);
|
static bool isNetworkInspected(const std::string &owner, const std::string &app, const std::string &device);
|
||||||
// This method is experimental, and may be modified or removed.
|
|
||||||
Value callFunctionSyncWithValue(
|
|
||||||
const std::string& module, const std::string& method, Value value);
|
|
||||||
void terminateOnJSVMThread();
|
void terminateOnJSVMThread();
|
||||||
void bindBridge() throw(JSException);
|
void bindBridge() throw(JSException);
|
||||||
void callNativeModules(Value&&);
|
void callNativeModules(Value&&);
|
||||||
|
|
|
@ -55,35 +55,6 @@ public:
|
||||||
*/
|
*/
|
||||||
void invokeCallback(double callbackId, folly::dynamic&& args);
|
void invokeCallback(double callbackId, folly::dynamic&& args);
|
||||||
|
|
||||||
/**
|
|
||||||
* Executes a JS method on the given executor synchronously, returning its
|
|
||||||
* return value. JSException will be thrown if JS throws an exception;
|
|
||||||
* another standard exception may be thrown for C++ bridge failures, or if
|
|
||||||
* the executor is not capable of synchronous calls.
|
|
||||||
*
|
|
||||||
* This method is experimental, and may be modified or removed.
|
|
||||||
*
|
|
||||||
* loadApplicationScriptSync() must be called and finished executing
|
|
||||||
* before callFunctionSync().
|
|
||||||
*/
|
|
||||||
template <typename T>
|
|
||||||
Value callFunctionSync(const std::string& module, const std::string& method, T&& args) {
|
|
||||||
if (*m_destroyed) {
|
|
||||||
throw std::logic_error(
|
|
||||||
folly::to<std::string>("Synchronous call to ", module, ".", method,
|
|
||||||
" after bridge is destroyed"));
|
|
||||||
}
|
|
||||||
|
|
||||||
JSCExecutor *jscExecutor = dynamic_cast<JSCExecutor*>(m_executor.get());
|
|
||||||
if (!jscExecutor) {
|
|
||||||
throw std::invalid_argument(
|
|
||||||
folly::to<std::string>("Executor type ", typeid(m_executor.get()).name(),
|
|
||||||
" does not support synchronous calls"));
|
|
||||||
}
|
|
||||||
|
|
||||||
return jscExecutor->callFunctionSync(module, method, std::forward<T>(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts the JS application. If bundleRegistry is non-null, then it is
|
* Starts the JS application. If bundleRegistry is non-null, then it is
|
||||||
* used to fetch JavaScript modules as individual scripts.
|
* used to fetch JavaScript modules as individual scripts.
|
||||||
|
|
Loading…
Reference in New Issue