diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp index 7cbc68490b7e..1f48fb0ea4e3 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.cpp @@ -49,7 +49,7 @@ ProxyExecutor::~ProxyExecutor() { m_executor.reset(); } -void ProxyExecutor::setupEnvironment(std::function loadBundle, +void ProxyExecutor::setupEnvironment(std::function loadBundle, std::function getModule) { // TODO: what is this ProxyExecutor? } diff --git a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h index 421fcb80265c..7f699ff16344 100644 --- a/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h +++ b/ReactAndroid/src/main/jni/react/jni/ProxyExecutor.h @@ -35,11 +35,10 @@ class ProxyExecutor : public JSExecutor { ProxyExecutor(jni::global_ref&& executorInstance, std::shared_ptr delegate); virtual ~ProxyExecutor() override; - virtual void setupEnvironment(std::function loadBundle, + virtual void setupEnvironment(std::function loadBundle, std::function getModule) override; - virtual void loadScript( - std::unique_ptr script, - std::string sourceURL) override; + virtual void loadScript(std::unique_ptr script, + std::string sourceURL) override; virtual void callFunction( const std::string& moduleId, const std::string& methodId, diff --git a/ReactCommon/cxxreact/BundleRegistry.cpp b/ReactCommon/cxxreact/BundleRegistry.cpp index 659e2339c211..24d1409a3a0f 100644 --- a/ReactCommon/cxxreact/BundleRegistry.cpp +++ b/ReactCommon/cxxreact/BundleRegistry.cpp @@ -1,4 +1,5 @@ #include "BundleRegistry.h" +#include namespace facebook { namespace react { @@ -160,10 +161,11 @@ BundleRegistry::GetModuleLambda BundleRegistry::makeGetModuleLambda(std::string } BundleRegistry::LoadBundleLambda BundleRegistry::makeLoadBundleLambda(std::string environmentId) { - return [this, environmentId](std::string bundleName, bool inCurrentEnvironment) mutable { + return [this, environmentId](std::string bundleName, bool sync, bool inCurrentEnvironment) mutable { std::shared_ptr execEnv = getEnvironment(environmentId).lock(); std::string bundleURL = bundleLoader_->getBundleURLFromName(bundleName); - execEnv->jsQueue->runOnQueueSync([this, bundleURL, execEnv]() mutable { + + std::function loadAndEvalBundle = [this, bundleName, bundleURL, execEnv, sync]() mutable { std::unique_ptr additionalBundle = bundleLoader_->getBundle(bundleURL); bundles_[bundleURL] = std::move(additionalBundle); std::shared_ptr bundle = bundles_[bundleURL]; @@ -171,7 +173,18 @@ BundleRegistry::LoadBundleLambda BundleRegistry::makeLoadBundleLambda(std::strin execEnv->nativeToJsBridge->loadScriptSync(std::move(script), bundle->getSourceURL()); - }); + if (!sync) { + execEnv->nativeToJsBridge->callFunction("BundleRegistry", + "bundleRegistryOnLoad", + folly::dynamic::array(bundleName)); + } + }; + + if (sync) { + execEnv->jsQueue->runOnQueueSync(std::move(loadAndEvalBundle)); + } else { + execEnv->jsQueue->runOnQueue(std::move(loadAndEvalBundle)); + } }; } diff --git a/ReactCommon/cxxreact/BundleRegistry.h b/ReactCommon/cxxreact/BundleRegistry.h index a59356c6aa9c..e0de3c6b40c6 100644 --- a/ReactCommon/cxxreact/BundleRegistry.h +++ b/ReactCommon/cxxreact/BundleRegistry.h @@ -15,7 +15,7 @@ class ModuleRegistry; class BundleRegistry { public: - using LoadBundleLambda = std::function; + using LoadBundleLambda = std::function; using GetModuleLambda = std::function; struct BundleExecutionEnvironment { diff --git a/ReactCommon/cxxreact/JSExecutor.h b/ReactCommon/cxxreact/JSExecutor.h index 514d48fc8828..aa5a61929c19 100644 --- a/ReactCommon/cxxreact/JSExecutor.h +++ b/ReactCommon/cxxreact/JSExecutor.h @@ -55,7 +55,7 @@ class RN_EXPORT JSExecutor { * Should be called only once per JSContext. * Sets: nativeRequire (if bundle is RAM), bundleRegistryLoad */ - virtual void setupEnvironment(std::function loadBundle, + virtual void setupEnvironment(std::function loadBundle, std::function getModule) = 0; /** diff --git a/ReactCommon/cxxreact/NativeToJsBridge.cpp b/ReactCommon/cxxreact/NativeToJsBridge.cpp index 1deac434cf98..e076defcc337 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.cpp +++ b/ReactCommon/cxxreact/NativeToJsBridge.cpp @@ -98,14 +98,14 @@ NativeToJsBridge::~NativeToJsBridge() { "NativeToJsBridge::destroy() must be called before deallocating the NativeToJsBridge!"; } -void NativeToJsBridge::setupEnvironment(std::function loadBundle, +void NativeToJsBridge::setupEnvironment(std::function loadBundle, std::function getModule) { runOnExecutorQueue([this, loadBundle, getModule](JSExecutor* executor) mutable { m_executor->setupEnvironment(loadBundle, getModule); }); } -void NativeToJsBridge::setupEnvironmentSync(std::function loadBundle, +void NativeToJsBridge::setupEnvironmentSync(std::function loadBundle, std::function getModule) { m_executor->setupEnvironment(loadBundle, getModule); } diff --git a/ReactCommon/cxxreact/NativeToJsBridge.h b/ReactCommon/cxxreact/NativeToJsBridge.h index 0cad47233043..5fe6cb37fd91 100644 --- a/ReactCommon/cxxreact/NativeToJsBridge.h +++ b/ReactCommon/cxxreact/NativeToJsBridge.h @@ -62,10 +62,10 @@ class NativeToJsBridge { * Prepare JSExecutor environment for evaluating JS. * Should be called only once per JSExecutor. */ - void setupEnvironment(std::function loadBundle, + void setupEnvironment(std::function loadBundle, std::function getModule); - void setupEnvironmentSync(std::function loadBundle, + void setupEnvironmentSync(std::function loadBundle, std::function getModule); /** diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp index ed4393dcb2ed..92573d010d38 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.cpp @@ -69,7 +69,7 @@ JSIExecutor::JSIExecutor( *runtime, "__jsiExecutorDescription", runtime->description()); } -void JSIExecutor::setupEnvironment(std::function loadBundle, +void JSIExecutor::setupEnvironment(std::function loadBundle, std::function getModule) { SystraceSection s("JSIExecutor::setupEnvironment"); @@ -117,18 +117,19 @@ void JSIExecutor::setupEnvironment(std::function loadBu Function::createFromHostFunction( *runtime_, PropNameID::forAscii(*runtime_, "bundleRegistryLoad"), - 2, + 3, [this, loadBundle](jsi::Runtime&, const jsi::Value&, const jsi::Value* args, size_t count) { - if (count != 2) { + if (count != 3) { throw std::invalid_argument("Got wrong number of args"); } std::string bundleName = args[0].getString(*runtime_).utf8(*runtime_); + bool sync = args[1].getBool(); bool inCurrentEnvironment = args[1].getBool(); - loadBundle(bundleName, inCurrentEnvironment); + loadBundle(bundleName, sync, inCurrentEnvironment); return facebook::jsi::Value(); })); diff --git a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h index cadd2004a8e5..b568e75ebda0 100644 --- a/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h +++ b/ReactCommon/jsiexecutor/jsireact/JSIExecutor.h @@ -78,11 +78,10 @@ class JSIExecutor : public JSExecutor { Logger logger, const JSIScopedTimeoutInvoker& timeoutInvoker, RuntimeInstaller runtimeInstaller); - void setupEnvironment(std::function loadBundle, + void setupEnvironment(std::function loadBundle, std::function getModule) override; - void loadScript( - std::unique_ptr script, - std::string sourceURL) override; + void loadScript(std::unique_ptr script, + std::string sourceURL) override; void callFunction( const std::string& moduleId, const std::string& methodId,