JSCExecutor::JSCExecutor( Bridge *bridge, int workerId, JSCExecutor *owner, const std::string& script, const std::unordered_map<std::string, std::string>& globalObjAsJSON, const folly::dynamic& jscConfig) : m_bridge(bridge), m_workerId(workerId), m_owner(owner), m_deviceCacheDir(owner->m_deviceCacheDir), m_messageQueueThread(MessageQueues::getCurrentMessageQueueThread()), m_jscConfig(jscConfig) { // We post initOnJSVMThread here so that the owner doesn't have to wait for // initialization on its own thread m_messageQueueThread->runOnQueue([this, script, globalObjAsJSON] () { initOnJSVMThread(); installGlobalFunction(m_context, "postMessage", nativePostMessage); for (auto& it : globalObjAsJSON) { setGlobalVariable(it.first, it.second); } // TODO(9604438): Protect against script does not exist std::string scriptSrc = WebWorkerUtil::loadScriptFromAssets(script); // TODO(9994180): Throw on error loadApplicationScript(scriptSrc, script); }); }
void JSCExecutor::loadApplicationUnbundle( std::unique_ptr<JSModulesUnbundle> unbundle, const std::string& startupCode, const std::string& sourceURL) { if (!m_unbundle) { installGlobalFunction(m_context, "nativeRequire", nativeRequire); } m_unbundle = std::move(unbundle); loadApplicationScript(startupCode, sourceURL); }
JSCExecutor::JSCExecutor( Bridge *bridge, std::shared_ptr<MessageQueueThread> messageQueueThread, int workerId, JSCExecutor *owner, const std::string& script, const std::unordered_map<std::string, std::string>& globalObjAsJSON, const folly::dynamic& jscConfig) : m_bridge(bridge), m_workerId(workerId), m_owner(owner), m_deviceCacheDir(owner->m_deviceCacheDir), m_messageQueueThread(messageQueueThread), m_jscConfig(jscConfig) { // We post initOnJSVMThread here so that the owner doesn't have to wait for // initialization on its own thread m_messageQueueThread->runOnQueue([this, script, globalObjAsJSON] () { initOnJSVMThread(); installGlobalFunction(m_context, "postMessage", nativePostMessage); for (auto& it : globalObjAsJSON) { setGlobalVariable(it.first, it.second); } // Try to load the script from the network if script is a URL // NB: For security, this will only work in debug builds std::string scriptSrc; if (script.find("http://") == 0 || script.find("https://") == 0) { std::stringstream outfileBuilder; outfileBuilder << m_deviceCacheDir << "/workerScript" << m_workerId << ".js"; scriptSrc = WebWorkerUtil::loadScriptFromNetworkSync(script, outfileBuilder.str()); } else { // TODO(9604438): Protect against script does not exist scriptSrc = WebWorkerUtil::loadScriptFromAssets(script); } // TODO(9994180): Throw on error loadApplicationScript(scriptSrc, script); }); }