Allow ohmurl to be mixed

Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/IAG1AT
Signed-off-by: chenlincl3 <chenlin201@huawei.com>
Change-Id: I45f1ed0163d39cf3064d070b7ad8e1187eca3600
This commit is contained in:
chenlincl3 2024-07-28 15:00:45 +08:00
parent 3fc00939c4
commit 4de4c862a9
5 changed files with 64 additions and 21 deletions

View File

@ -353,9 +353,9 @@ void SourceTextModule::MakeNormalizedAppArgs(const EcmaVM *vm, std::vector<Local
}
void SourceTextModule::MakeAppArgs(const EcmaVM *vm, std::vector<Local<JSValueRef>> &arguments,
const CString &soPath, const CString &moduleName)
const CString &soPath, const CString &moduleName, const CString &requestName)
{
if (vm->IsNormalizedOhmUrlPack()) {
if (!StringHelper::StringStartWith(requestName, ModulePathHelper::REQUIRE_NAPI_APP_PREFIX)) {
return MakeNormalizedAppArgs(vm, arguments, soPath, moduleName);
}
size_t pos = soPath.find_last_of(PathHelper::SLASH_TAG);
@ -402,7 +402,7 @@ Local<JSValueRef> SourceTextModule::LoadNativeModuleImpl(EcmaVM *vm, JSThread *t
arguments.emplace_back(StringRef::NewFromUtf8(vm, soName.c_str()));
if (moduleType == ModuleTypes::APP_MODULE) {
MakeAppArgs(vm, arguments, soName, moduleName);
MakeAppArgs(vm, arguments, soName, moduleName, moduleRequestName);
} else if (moduleType == ModuleTypes::INTERNAL_MODULE) {
MakeInternalArgs(vm, arguments, moduleRequestName);
}

View File

@ -166,7 +166,7 @@ public:
static void MakeNormalizedAppArgs(const EcmaVM *vm, std::vector<Local<JSValueRef>> &arguments,
const CString &soPath, const CString &moduleName);
static void MakeAppArgs(const EcmaVM *vm, std::vector<Local<JSValueRef>> &arguments,
const CString &soPath, const CString &moduleName);
const CString &soPath, const CString &moduleName, const CString &requestName);
static void MakeInternalArgs(const EcmaVM *vm, std::vector<Local<JSValueRef>> &arguments,
const CString &moduleRequestName);
static Local<JSValueRef> LoadNativeModuleImpl(EcmaVM *vm, JSThread *thread,

View File

@ -63,7 +63,8 @@ CString ModulePathHelper::ConcatMergeFileNameToNormalized(JSThread *thread, cons
} else if (IsImportFile(requestName)) {
// this branch save for import "xxx.js" in npm
CString inputPath = requestName;
CString entryPoint = ConcatImportFileNormalizedOhmurlWithRecordName(jsPandaFile, recordName, requestName);
CString entryPoint = ConcatImportFileNormalizedOhmurlWithRecordName(thread, jsPandaFile, baseFileName,
recordName, requestName);
if (entryPoint.empty()) {
THROW_MODULE_NOT_FOUND_ERROR_WITH_RETURN_VALUE(thread, inputPath, recordName, requestName);
}
@ -79,35 +80,44 @@ CString ModulePathHelper::ConcatMergeFileNameToNormalized(JSThread *thread, cons
* Before: requestName: ../xxx1/xxx2 || ./xxx1
* After: &entryPath&version
*/
CString ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(const JSPandaFile *jsPandaFile,
const CString &recordName, CString &requestName)
CString ModulePathHelper::ConcatImportFileNormalizedOhmurlWithRecordName(JSThread *thread,
const JSPandaFile *jsPandaFile, CString &baseFileName, const CString &recordName, const CString &requestName)
{
CString entryPoint;
CVector<CString> res = SplitNormalizedRecordName(recordName);
CString path = PathHelper::NORMALIZED_OHMURL_TAG + res[NORMALIZED_IMPORT_PATH_INDEX];
CString version = res[NORMALIZED_VERSION_INDEX];
requestName = RemoveSuffix(requestName);
size_t pos = requestName.find(PathHelper::CURRENT_DIREATORY_TAG);
CString moduleRequestName = requestName;
moduleRequestName = RemoveSuffix(moduleRequestName);
size_t pos = moduleRequestName.find(PathHelper::CURRENT_DIREATORY_TAG);
if (pos == 0) {
requestName = requestName.substr(CURRENT_DIREATORY_TAG_LEN);
moduleRequestName = moduleRequestName.substr(CURRENT_DIREATORY_TAG_LEN);
}
pos = path.rfind(PathHelper::SLASH_TAG);
if (pos != CString::npos) {
entryPoint = path.substr(0, pos + 1) + requestName;
entryPoint = path.substr(0, pos + 1) + moduleRequestName;
} else {
entryPoint = requestName;
entryPoint = moduleRequestName;
}
entryPoint = PathHelper::NormalizePath(entryPoint);
requestName = ConcatImportFileNormalizedOhmurl(entryPoint, "", version);
if (jsPandaFile->HasRecord(requestName)) {
return requestName;
moduleRequestName = ConcatImportFileNormalizedOhmurl(entryPoint, "", version);
if (jsPandaFile->HasRecord(moduleRequestName)) {
return moduleRequestName;
}
// requestName may be a folder
entryPoint += PACKAGE_ENTRY_FILE;
entryPoint = PathHelper::NormalizePath(entryPoint);
requestName = ConcatImportFileNormalizedOhmurl(entryPoint, "", version);
if (jsPandaFile->HasRecord(requestName)) {
return requestName;
moduleRequestName = ConcatImportFileNormalizedOhmurl(entryPoint, "", version);
if (jsPandaFile->HasRecord(moduleRequestName)) {
return moduleRequestName;
}
// requestName may be a packageName
moduleRequestName = requestName;
ConcatOtherNormalizedOhmurl(thread->GetEcmaVM(), jsPandaFile, baseFileName, moduleRequestName);
moduleRequestName = ParseNormalizedOhmUrl(thread, baseFileName, recordName, moduleRequestName);
if (jsPandaFile->HasRecord(moduleRequestName)) {
return moduleRequestName;
}
return CString();
}
@ -896,7 +906,8 @@ CString ModulePathHelper::TranslateExpressionToNormalized(JSThread *thread, cons
EcmaVM *vm = thread->GetEcmaVM();
CString inputPath = requestPath;
if (IsImportFile(requestPath)) {
CString entryPoint = ConcatImportFileNormalizedOhmurlWithRecordName(jsPandaFile, recordName, requestPath);
CString entryPoint = ConcatImportFileNormalizedOhmurlWithRecordName(thread, jsPandaFile, baseFileName,
recordName, requestPath);
if (entryPoint.empty()) {
THROW_MODULE_NOT_FOUND_ERROR_WITH_RETURN_VALUE(thread, inputPath, recordName, requestPath);
}

View File

@ -189,8 +189,9 @@ public:
CString &baseFileName, const CString &recordName,
CString requestName);
static CVector<CString> SplitNormalizedRecordName(const CString &recordName);
static CString ConcatImportFileNormalizedOhmurlWithRecordName(const JSPandaFile *jsPandaFile,
const CString &recordName, CString &requestName);
static CString ConcatImportFileNormalizedOhmurlWithRecordName(JSThread *thread, const JSPandaFile *jsPandaFile,
CString &baseFileName, const CString &recordName,
const CString &requestName);
static void ConcatOtherNormalizedOhmurl(EcmaVM *vm, const JSPandaFile *jsPandaFile,
[[maybe_unused]] CString &baseFileName, CString &requestPath);
static CString ConcatNormalizedOhmurlWithData(CVector<CString> &data, CString &pkgName, CString &entryPath);

View File

@ -819,4 +819,35 @@ HWTEST_F_L0(EcmaModuleTest, ConcatPreviewTestUnifiedOhmUrl)
CString res = ModulePathHelper::ConcatPreviewTestUnifiedOhmUrl(bundleName, pkgName, path, version);
EXPECT_EQ(res, exceptOutUrl);
}
HWTEST_F_L0(EcmaModuleTest, NeedTranslateToNormalized)
{
CString requestName = "@ohos:hilog";
bool res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, false);
requestName = "@app:com.example.myapplication/entry";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, false);
requestName = "@bundle:com.example.myapplication/library";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, false);
requestName = "@package:pkg_modules/.ohpm/json5@2.2.3/pkg_modules/json5/dist/index";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, false);
requestName = "@normalized:N&&&har/Index&1.0.0";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, false);
requestName = "json5";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, true);
requestName = "library";
res = ModulePathHelper::NeedTranslateToNormalized(requestName);
EXPECT_EQ(res, true);
}
} // namespace panda::test