CatalystInstanceImpl.setSourceURL

Reviewed By: javache

Differential Revision: D4422416

fbshipit-source-id: bc49485ac64064909f32375b6b8360a0a505975b
This commit is contained in:
Ashok Menon 2017-01-18 08:55:46 -08:00 committed by Facebook Github Bot
parent bbd5750bb4
commit 76c4faee5e
6 changed files with 35 additions and 19 deletions

View File

@ -181,6 +181,7 @@ public class CatalystInstanceImpl implements CatalystInstance {
MessageQueueThread moduleQueue,
ModuleRegistryHolder registryHolder);
/* package */ native void setSourceURL(String sourceURL);
/* package */ native void loadScriptFromAssets(AssetManager assetManager, String assetURL);
/* package */ native void loadScriptFromFile(String fileName, String sourceURL);
/* package */ native void loadScriptFromOptimizedBundle(String path, String sourceURL, int flags);

View File

@ -83,7 +83,7 @@ public abstract class JSBundleLoader {
return new JSBundleLoader() {
@Override
public String loadScript(CatalystInstanceImpl instance) {
instance.loadScriptFromFile(null, proxySourceURL);
instance.setSourceURL(proxySourceURL);
return realSourceURL;
}
};

View File

@ -101,8 +101,9 @@ CatalystInstanceImpl::CatalystInstanceImpl()
void CatalystInstanceImpl::registerNatives() {
registerHybrid({
makeNativeMethod("initHybrid", CatalystInstanceImpl::initHybrid),
makeNativeMethod("initHybrid", CatalystInstanceImpl::initHybrid),
makeNativeMethod("initializeBridge", CatalystInstanceImpl::initializeBridge),
makeNativeMethod("setSourceURL", CatalystInstanceImpl::setSourceURL),
makeNativeMethod("loadScriptFromAssets",
"(Landroid/content/res/AssetManager;Ljava/lang/String;)V",
CatalystInstanceImpl::loadScriptFromAssets),
@ -158,6 +159,10 @@ void CatalystInstanceImpl::initializeBridge(
mrh->getModuleRegistry());
}
void CatalystInstanceImpl::setSourceURL(const std::string& sourceURL) {
instance_->setSourceURL(sourceURL);
}
void CatalystInstanceImpl::loadScriptFromAssets(jobject assetManager,
const std::string& assetURL) {
const int kAssetsLength = 9; // strlen("assets://");
@ -187,20 +192,18 @@ bool CatalystInstanceImpl::isIndexedRAMBundle(const char *sourcePath) {
return parseTypeFromHeader(header) == ScriptTag::RAMBundle;
}
void CatalystInstanceImpl::loadScriptFromFile(jni::alias_ref<jstring> fileName,
void CatalystInstanceImpl::loadScriptFromFile(const std::string& fileName,
const std::string& sourceURL) {
std::string file = fileName ? fileName->toStdString() : "";
if (isIndexedRAMBundle(file.c_str())) {
auto bundle = folly::make_unique<JSIndexedRAMBundle>(file.c_str());
auto zFileName = fileName.c_str();
if (isIndexedRAMBundle(zFileName)) {
auto bundle = folly::make_unique<JSIndexedRAMBundle>(zFileName);
auto startupScript = bundle->getStartupCode();
instance_->loadUnbundle(
std::move(bundle),
std::move(startupScript),
sourceURL);
} else {
instance_->loadScriptFromFile(file, sourceURL);
instance_->loadScriptFromFile(fileName, sourceURL);
}
}

View File

@ -49,8 +49,14 @@ class CatalystInstanceImpl : public jni::HybridClass<CatalystInstanceImpl> {
jni::alias_ref<JavaMessageQueueThread::javaobject> jsQueue,
jni::alias_ref<JavaMessageQueueThread::javaobject> moduleQueue,
ModuleRegistryHolder* mrh);
/**
* Sets the source URL of the underlying bridge without loading any JS code.
*/
void setSourceURL(const std::string& sourceURL);
void loadScriptFromAssets(jobject assetManager, const std::string& assetURL);
void loadScriptFromFile(jni::alias_ref<jstring> fileName, const std::string& sourceURL);
void loadScriptFromFile(const std::string& fileName, const std::string& sourceURL);
void loadScriptFromOptimizedBundle(const std::string& bundlePath, const std::string& sourceURL, jint flags);
void callJSFunction(JExecutorToken* token, std::string module, std::string method, NativeArray* arguments);
void callJSCallback(JExecutorToken* token, jint callbackId, NativeArray* arguments);

View File

@ -50,6 +50,14 @@ void Instance::initializeBridge(
CHECK(nativeToJsBridge_);
}
void Instance::setSourceURL(std::string sourceURL) {
callback_->incrementPendingJSCalls();
SystraceSection s("reactbridge_xplat_setSourceURL",
"sourceURL", sourceURL);
nativeToJsBridge_->loadApplication(nullptr, nullptr, std::move(sourceURL));
}
void Instance::loadScriptFromString(std::unique_ptr<const JSBigString> string,
std::string sourceURL) {
callback_->incrementPendingJSCalls();
@ -74,15 +82,10 @@ void Instance::loadScriptFromFile(const std::string& filename,
std::unique_ptr<const JSBigFileString> script;
// This function can be called in order to change the Bridge's Source URL.
// In that case, the filename will be empty, and we should not attempt to
// load it.
if (!filename.empty()) {
RecoverableError::runRethrowingAsRecoverable<std::system_error>(
[&filename, &script]() {
script = JSBigFileString::fromPath(filename);
});
}
RecoverableError::runRethrowingAsRecoverable<std::system_error>(
[&filename, &script]() {
script = JSBigFileString::fromPath(filename);
});
nativeToJsBridge_->loadApplication(nullptr, std::move(script), sourceURL);
}

View File

@ -34,6 +34,9 @@ class Instance {
std::shared_ptr<MessageQueueThread> jsQueue,
std::unique_ptr<MessageQueueThread> nativeQueue,
std::shared_ptr<ModuleRegistry> moduleRegistry);
void setSourceURL(std::string sourceURL);
void loadScriptFromString(std::unique_ptr<const JSBigString> string, std::string sourceURL);
void loadScriptFromStringSync(std::unique_ptr<const JSBigString> string, std::string sourceURL);
void loadScriptFromFile(const std::string& filename, const std::string& sourceURL);