From 18bdfdcbe79ba83cd42fd1f74b1aadba760f2772 Mon Sep 17 00:00:00 2001 From: panzhenyu1 Date: Fri, 15 Apr 2022 15:54:51 +0800 Subject: [PATCH] Add support for ark previewer relvant issue: https://gitee.com/openharmony/ace_ace_engine/issues/I52XYN Signed-off-by: panzhenyu1 Change-Id: Ic15aa26281f88047cdd96f932bd6bbea35bdee1a --- .../declarative_frontend/engine/jsi/BUILD.gn | 40 +++++++-- .../engine/jsi/jsi_declarative_engine.cpp | 84 +++++++++++-------- .../engine/jsi/jsi_declarative_engine.h | 1 + .../engine/jsi/jsi_view_register.cpp | 4 - .../engine/jsi/jsi_group_js_bridge.cpp | 3 +- .../engine/jsi/jsi_group_js_bridge.h | 3 +- 6 files changed, 85 insertions(+), 50 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn b/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn index e76e7c47..69bea2c8 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn +++ b/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn @@ -19,6 +19,7 @@ import("//foundation/ace/ace_engine/build/ace_gen_obj.gni") base_output_path = get_label_info(":gen_abc_proxyclass", "target_out_dir") abcproxyclass_obj_path = base_output_path + "/abc_proxy_class.o" abcenumstyle_obj_path = base_output_path + "/abc_enum_style.o" +jsmocksystemplugin_obj_path = base_output_path + "/abc_js_mock_system_plugin.o" ts2abc_gen_abc("gen_stateMgmt_abc") { extra_visibility = [ ":*" ] # Only targets in this file can depend on this. @@ -40,6 +41,16 @@ ts2abc_gen_abc("gen_jsEnumStyle_abc") { out_puts = [ base_output_path + "/jsEnumStyle.abc" ] } +ts2abc_gen_abc("gen_js_mock_system_plugin_abc") { + extra_visibility = [ ":*" ] # Only targets in this file can depend on this. + src_js = rebase_path( + "//foundation/ace/ace_engine/frameworks/bridge/declarative_frontend/engine/quickjs/jsMockSystemPlugin.js") + dst_file = rebase_path(base_output_path + "/jsMockSystemPlugin.abc") + + in_puts = [ "//foundation/ace/ace_engine/frameworks/bridge/declarative_frontend/engine/quickjs/jsMockSystemPlugin.js" ] + out_puts = [ base_output_path + "/jsMockSystemPlugin.abc" ] +} + gen_obj("abc_proxyclass") { input = base_output_path + "/stateMgmt.abc" if (use_mac || use_mingw_win) { @@ -51,10 +62,22 @@ gen_obj("abc_proxyclass") { gen_obj("abc_enum_style") { input = base_output_path + "/jsEnumStyle.abc" + if (use_mac || use_mingw_win) { + abcenumstyle_obj_path = base_output_path + "/jsEnumStyle.c" + } output = abcenumstyle_obj_path snapshot_dep = [ ":gen_jsEnumStyle_abc" ] } +gen_obj("abc_mock_system_plugin") { + input = base_output_path + "/jsMockSystemPlugin.abc" + if (use_mac || use_mingw_win) { + jsmocksystemplugin_obj_path = base_output_path + "/js_mock_system_plugin.c" + } + output = jsmocksystemplugin_obj_path + snapshot_dep = [ ":gen_js_mock_system_plugin_abc" ] +} + template("declarative_js_engine_ark") { forward_variables_from(invoker, "*") @@ -91,6 +114,8 @@ template("declarative_js_engine_ark") { "modules/jsi_timer_module.cpp", ] + deps = [ "//ark/js_runtime:libark_jsruntime" ] + if (!defined(config.build_for_preview) || !config.build_for_preview) { sources += [ "$ace_root/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp", @@ -98,21 +123,18 @@ template("declarative_js_engine_ark") { "$ace_root/frameworks/bridge/js_frontend/engine/jsi/jsi_base_utils.cpp", "jsi_declarative_utils.cpp", ] + } else { + deps += [ ":gen_obj_src_abc_mock_system_plugin" ] } - deps = [ "//ark/js_runtime:libark_jsruntime" ] - # if napi support deps += [ "//foundation/ace/napi:ace_napi_ark" ] public_deps = [ "//foundation/ace/napi:ace_napi" ] - # do not support windows platform - if (!is_mingw) { - deps += [ - ":gen_obj_src_abc_enum_style", - ":gen_obj_src_abc_proxyclass", - ] - } + deps += [ + ":gen_obj_src_abc_enum_style", + ":gen_obj_src_abc_proxyclass", + ] } } diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp index b130685d..fa537e23 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp @@ -43,7 +43,14 @@ #include "frameworks/bridge/js_frontend/engine/common/runtime_constants.h" #include "frameworks/bridge/js_frontend/engine/jsi/jsi_base_utils.h" -#ifndef WINDOWS_PLATFORM +#if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM) +extern const char* _binary_stateMgmt_abc_start[]; +extern const char* _binary_stateMgmt_abc_end[]; +extern const char* _binary_jsEnumStyle_abc_start[]; +extern const char* _binary_jsEnumStyle_abc_end[]; +extern const char* _binary_jsMockSystemPlugin_abc_start[]; +extern const char* _binary_jsMockSystemPlugin_abc_end[]; +#else extern const char _binary_stateMgmt_abc_start[]; extern const char _binary_stateMgmt_abc_end[]; extern const char _binary_jsEnumStyle_abc_start[]; @@ -206,6 +213,7 @@ bool JsiDeclarativeEngineInstance::InitJsEnv(bool debuggerMode, if (usingSharedRuntime_ && isModuleInitialized_) { LOGI("InitJsEnv SharedRuntime has initialized, skip..."); } else { + InitGroupJsBridge(); if (!isModulePreloaded_ || IsPlugin()) { InitConsoleModule(); InitAceModule(); @@ -216,7 +224,6 @@ bool JsiDeclarativeEngineInstance::InitJsEnv(bool debuggerMode, if (!isModuleInitialized_) { InitJsContextModuleObject(); } - InitGroupJsBridge(); } if (usingSharedRuntime_) { @@ -237,7 +244,6 @@ bool JsiDeclarativeEngineInstance::FireJsEvent(const std::string& eventStr) void JsiDeclarativeEngineInstance::InitAceModule() { -#ifndef WINDOWS_PLATFORM bool stateMgmtResult = runtime_->EvaluateJsCode( (uint8_t*)_binary_stateMgmt_abc_start, _binary_stateMgmt_abc_end - _binary_stateMgmt_abc_start); if (!stateMgmtResult) { @@ -248,6 +254,12 @@ void JsiDeclarativeEngineInstance::InitAceModule() if (!jsEnumStyleResult) { LOGE("EvaluateJsCode jsEnumStyle failed"); } +#if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM) + bool jsMockSystemPlugin = runtime_->EvaluateJsCode((uint8_t*)_binary_jsMockSystemPlugin_abc_start, + _binary_jsMockSystemPlugin_abc_end - _binary_jsMockSystemPlugin_abc_start); + if (!jsMockSystemPlugin) { + LOGE("EvaluateJsCode jsMockSystemPlugin failed"); + } #endif } @@ -308,7 +320,6 @@ void JsiDeclarativeEngineInstance::PreloadAceModule(void* runtime) global->SetProperty(arkRuntime, "exports", exportsUtilObj); global->SetProperty(arkRuntime, "requireNativeModule", arkRuntime->NewFunction(RequireNativeModule)); -#ifndef WINDOWS_PLATFORM // preload js enums bool jsEnumStyleResult = arkRuntime->EvaluateJsCode( (uint8_t*)_binary_jsEnumStyle_abc_start, _binary_jsEnumStyle_abc_end - _binary_jsEnumStyle_abc_start); @@ -328,7 +339,6 @@ void JsiDeclarativeEngineInstance::PreloadAceModule(void* runtime) isModulePreloaded_ = evalResult; globalRuntime_ = nullptr; LOGI("PreloadAceModule loaded:%{public}d", isModulePreloaded_); -#endif } void JsiDeclarativeEngineInstance::InitConsoleModule() @@ -785,13 +795,11 @@ void JsiDeclarativeEngine::RegisterInitWorkerFunc() } instance->InitConsoleModule(arkNativeEngine); -#ifndef WINDOWS_PLATFORM std::vector buffer((uint8_t*)_binary_jsEnumStyle_abc_start, (uint8_t*)_binary_jsEnumStyle_abc_end); auto stateMgmtResult = arkNativeEngine->RunBufferScript(buffer); if (stateMgmtResult == nullptr) { LOGE("init worker error"); } -#endif }; nativeEngine_->SetInitWorkerFunc(initWorkerFunc); } @@ -822,6 +830,34 @@ void JsiDeclarativeEngine::RegisterWorker() RegisterAssetFunc(); } +bool JsiDeclarativeEngine::ExecuteAbc(const shared_ptr runtime, const std::string fileName) +{ + auto delegate = engineInstance_->GetDelegate(); +#if !defined(WINDOWS_PLATFORM) && !defined(MAC_PLATFORM) + std::string basePath = delegate->GetAssetPath(fileName); + if (!basePath.empty()) { + std::string abcPath = basePath.append(fileName); + LOGD("abcPath is: %{private}s", abcPath.c_str()); + if (!runtime->ExecuteJsBin(abcPath)) { + LOGE("ExecuteJsBin %{private}s failed.", fileName.c_str()); + return false; + } + } + return true; +#else + std::vector content; + if (!delegate->GetAssetContent(fileName, content)) { + LOGD("GetAssetContent \"%{public}s\" failed.", fileName.c_str()); + return true; + } + if (!runtime->EvaluateJsCode(content.data(), content.size())) { + LOGE("EvaluateJsCode \"%{public}s\" failed.", fileName.c_str()); + return false; + } + return true; +#endif +} + void JsiDeclarativeEngine::LoadJs(const std::string& url, const RefPtr& page, bool isMainPage) { ACE_SCOPED_TRACE("JsiDeclarativeEngine::LoadJs"); @@ -851,26 +887,12 @@ void JsiDeclarativeEngine::LoadJs(const std::string& url, const RefPtrGetAssetPath(urlName); - std::string assetPath = assetBasePath.append(urlName); - LOGI("assetPath is: %{private}s", assetPath.c_str()); - if (isMainPage) { - std::string commonsBasePath = delegate->GetAssetPath("commons.abc"); - if (!commonsBasePath.empty()) { - std::string commonsPath = commonsBasePath.append("commons.abc"); - if (!runtime->ExecuteJsBin(commonsPath)) { - LOGE("ExecuteJsBin \"commons.js\" failed."); - return; - } + if (!ExecuteAbc(runtime, "commons.abc")) { + return; } - std::string vendorsBasePath = delegate->GetAssetPath("vendors.abc"); - if (!vendorsBasePath.empty()) { - std::string vendorsPath = vendorsBasePath.append("vendors.abc"); - if (!runtime->ExecuteJsBin(vendorsPath)) { - LOGE("ExecuteJsBin \"vendors.js\" failed."); - return; - } + if (!ExecuteAbc(runtime, "vendor.abc")) { + return; } std::string appMap; if (delegate->GetAssetContent("app.js.map", appMap)) { @@ -878,17 +900,13 @@ void JsiDeclarativeEngine::LoadJs(const std::string& url, const RefPtrGetAssetPath("app.abc"); - std::string appPath = appBasePath.append("app.abc"); - LOGI("appPath is: %{private}s", appPath.c_str()); - if (runtime->ExecuteJsBin(appPath)) { - CallAppFunc("onCreate"); - } else { + if (!ExecuteAbc(runtime, "app.abc")) { LOGW("ExecuteJsBin \"app.js\" failed."); + } else { + CallAppFunc("onCreate"); } } - if (!runtime->ExecuteJsBin(assetPath)) { - LOGE("ExecuteJsBin %{public}s failed.", urlName.c_str()); + if (!ExecuteAbc(runtime, urlName)) { return; } } diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h index feb6c9d8..190c1430 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h @@ -284,6 +284,7 @@ private: void RegisterWorker(); void RegisterInitWorkerFunc(); void RegisterAssetFunc(); + bool ExecuteAbc(const shared_ptr runtime, const std::string fileName); RefPtr engineInstance_; diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp index b6075092..63357049 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_view_register.cpp @@ -94,9 +94,7 @@ #include "frameworks/bridge/declarative_frontend/jsview/js_slider.h" #include "frameworks/bridge/declarative_frontend/jsview/js_textpicker.h" #include "frameworks/bridge/declarative_frontend/jsview/js_toggle.h" -#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) #include "frameworks/bridge/declarative_frontend/jsview/js_qrcode.h" -#endif #ifdef PLUGIN_COMPONENT_SUPPORTED #include "frameworks/bridge/declarative_frontend/jsview/js_plugin.h" #endif @@ -863,12 +861,10 @@ static const std::unordered_map> { "TextInput", JSTextInput::JSBind }, { "TextClock", JSTextClock::JSBind }, { "SideBarContainer", JSSideBar::JSBind }, -#if !defined(WINDOWS_PLATFORM) and !defined(MAC_PLATFORM) { "QRCode", JSQRCode::JSBind }, #ifdef FORM_SUPPORTED { "FormComponent", JSForm::JSBind }, #endif -#endif #ifdef PLUGIN_COMPONENT_SUPPORTED { "PluginComponent", JSPlugin::JSBind }, #endif diff --git a/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.cpp b/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.cpp index 31e1c3c5..9bc6c40d 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.cpp +++ b/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.cpp @@ -580,8 +580,7 @@ void JsiGroupJsBridge::Destroy() } #if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM) -void JsiGroupJsBridge::TriggerModuleJsCallbackPreview( - int32_t callbackId, int32_t code, OHOS::Ace::ResponseData responseData) +void JsiGroupJsBridge::TriggerModuleJsCallbackPreview(int32_t callbackId, int32_t code, ResponseData responseData) { LOGE("WAIT FOR IMPLEMENTED"); } diff --git a/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.h b/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.h index f62d0439..5939c050 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.h +++ b/frameworks/bridge/js_frontend/engine/jsi/jsi_group_js_bridge.h @@ -70,8 +70,7 @@ public: void TriggerEventJsCallback(int32_t callbackId, int32_t code, std::vector&& eventData) override; #if defined(WINDOWS_PLATFORM) || defined(MAC_PLATFORM) - void TriggerModuleJsCallbackPreview( - int32_t callbackId, int32_t code, OHOS::Ace::ResponseData responseData) override; + void TriggerModuleJsCallbackPreview(int32_t callbackId, int32_t code, ResponseData responseData) override; #endif void LoadPluginJsCode(std::string&& jsCode) override;