diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn b/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn index 92d296228eece33a10dcece5d5c6643336b50225..18d0b09bc66bc5a4835615064c4a0af62234dc37 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn +++ b/frameworks/bridge/declarative_frontend/engine/jsi/BUILD.gn @@ -346,6 +346,9 @@ template("declarative_js_engine_ark") { "ets_utils:timer" ] } + if (is_ohos_standard_system && !use_mingw_win && !use_mac && !use_linux) { + external_deps += [ "ability_base:extractortool" ] + } if (use_hilog) { external_deps += [ "hilog:libhilog" ] } 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 361e88abe4fb455db398a2430a019b78d5180dea..1c1fc7aa328db89934b1636409947f6dfb1debfc 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.cpp @@ -23,6 +23,7 @@ #include #include "dfx_jsnapi.h" +#include "extractor.h" #if !defined(PREVIEW) && !defined(ANDROID_PLATFORM) && !defined(IOS_PLATFORM) #include "console.h" @@ -1694,9 +1695,6 @@ bool JsiDeclarativeEngine::ExecuteCardAbc(const std::string& fileName, int64_t c } return true; } - if (!delegate->GetAssetContent(FORM_ES_MODULE_CARD_PATH, content)) { - return false; - } const std::string bundleName = frontEnd->GetBundleName(); std::string moduleName = frontEnd->GetModuleName(); #ifdef PREVIEW @@ -1718,12 +1716,23 @@ bool JsiDeclarativeEngine::ExecuteCardAbc(const std::string& fileName, int64_t c abcPath = moduleName.append("/").append(fileName); #endif { - if (arkRuntime->IsStaticOrInvalidFile(content.data(), content.size())) { + bool flag = false; + const std::string hapFilePath = container->GetHapPath(); + std::shared_ptr extractor = + AbilityBase::ExtractorUtil::GetExtractor(hapFilePath, flag, false); + if (extractor == nullptr) { + TAG_LOGE(AceLogTag::ACE_ROUTER, "hapFilePath %{private}s GetExtractor failed", hapFilePath.c_str()); return false; } - } - { - if (!arkRuntime->ExecuteModuleBuffer(content.data(), content.size(), abcPath, true)) { + auto data = extractor->GetSafeData(FORM_ES_MODULE_CARD_PATH); + if (!data) { + TAG_LOGE(AceLogTag::ACE_ROUTER, "null data"); + return false; + } + if (arkRuntime->IsStaticOrInvalidFile(data->GetDataPtr(), data->GetDataLen())) { + return false; + } + if (!arkRuntime->ExecuteModuleBufferSecure(data->GetDataPtr(), data->GetDataLen(), abcPath, true)) { return false; } } diff --git a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp index cb44cd7c41165fe14bed551c38c7201da9135b21..2bd3061899c194664e6af96d559caf838eef08c0 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp +++ b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.cpp @@ -245,6 +245,16 @@ bool ArkJSRuntime::ExecuteModuleBuffer(const uint8_t* data, int32_t size, const return ret; } +bool ArkJSRuntime::ExecuteModuleBufferSecure(uint8_t* data, int32_t size, const std::string& filename, bool needUpdate) +{ + JSExecutionScope executionScope(vm_); + LocalScope scope(vm_); + panda::TryCatch trycatch(vm_); + bool ret = JSNApi::ExecuteModuleBufferSecure(vm_, data, size, filename, needUpdate); + HandleUncaughtException(trycatch); + return ret; +} + shared_ptr ArkJSRuntime::EvaluateJsCode([[maybe_unused]] const std::string& src) { return NewUndefined(); diff --git a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h index 67dc759861ab6fd2d7f853c539bd11e556ca39b0..a9256718128bc2403410ee608a55cb2bbc19b1fe 100644 --- a/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h +++ b/frameworks/bridge/js_frontend/engine/jsi/ark_js_runtime.h @@ -107,6 +107,7 @@ public: const std::string &bundleName, const std::string &moduleName, const std::string &ohmurl); bool IsStaticOrInvalidFile(const uint8_t *data, int32_t size); bool ExecuteModuleBuffer(const uint8_t *data, int32_t size, const std::string &filename, bool needUpdate = false); + bool ExecuteModuleBufferSecure(uint8_t *data, int32_t size, const std::string &filename, bool needUpdate = false); int32_t LoadDestinationFile(const std::string& bundleName, const std::string& moduleName, const std::string& pageSourceFile, bool isSingleton);