From 9a8b180a68f6838f9da36cf427db6ebc4da2b124 Mon Sep 17 00:00:00 2001 From: Tsvetan Stefanovski twx512252 Date: Mon, 5 Sep 2022 14:10:58 +0200 Subject: [PATCH 1/3] JSPersistent: Deserialize stored string back into object when returning it to Javascript. Fixes issue #I5PTN0 Signed-off-by: Tsvetan Stefanovski twx512252 Change-Id: I7520b192f99038d5c3b4a2c8e314de8c6a6de0a6 --- .../declarative_frontend/engine/jsi/jsi_types.cpp | 10 ++++++++-- .../declarative_frontend/jsview/js_persistent.cpp | 9 ++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp index 5242c911e81..d8619d6866b 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp @@ -204,8 +204,14 @@ JsiRef JsiObject::ToJsonObject(const char* value) const { auto vm = GetEcmaVM(); auto valueRef = JsiValueConvertor::toJsiValueWithVM(vm, value); - auto refValue = JsiRef::Make(JSON::Parse(vm, valueRef)); - return refValue; + panda::Local result = JSON::Parse(vm, valueRef); + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + if (result.IsEmpty() || runtime->HasPendingException()) { + runtime->HandleUncaughtException(); + return JsiRef::Make(JSValueRef::Undefined(vm)); + } + + return JsiRef::Make(result); } void JsiObject::SetPropertyJsonObject(const char* prop, const char* value) const diff --git a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp index 4b6383174f9..c15e76e9666 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp @@ -104,9 +104,12 @@ void JSPersistent::Get(const JSCallbackInfo& args) } auto executor = container->GetTaskExecutor(); std::string value = StorageProxy::GetInstance()->GetStorage(executor)->GetString(key); - auto returnValue = JSVal(ToJSValue(value)); - auto returnPtr = JSRef::Make(returnValue); - args.SetReturnValue(returnPtr); + if (value.empty()) { + return; + } + JSRef obj = JSRef::New(); + JSRef ret = obj->ToJsonObject(value.c_str()); + args.SetReturnValue(ret); } void JSPersistent::Delete(const JSCallbackInfo& args) -- Gitee From c961cc1f30dc57fd181d3084f7ce88f0795aa09f Mon Sep 17 00:00:00 2001 From: Tsvetan Stefanovski twx512252 Date: Thu, 6 Apr 2023 16:25:31 +0200 Subject: [PATCH 2/3] Add possibility to create undefined, null, true and false values for JS engine APIs Signed-off-by: Tsvetan Stefanovski twx512252 Change-Id: I93517f7f041775f1235aab0269bf7a9f3cd42235 --- .../engine/jsi/jsi_types.cpp | 24 +++++++++++++++++++ .../engine/jsi/jsi_types.h | 5 ++++ 2 files changed, 29 insertions(+) diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp index d8619d6866b..35d3f2c8e06 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.cpp @@ -122,6 +122,30 @@ bool JsiValue::ToBoolean() const return GetHandle()->BooleaValue(); } +JsiRef JsiValue::Undefined() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::Undefined(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::Null() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::Null(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::True() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::True(runtime->GetEcmaVm())); +} + +JsiRef JsiValue::False() +{ + auto runtime = std::static_pointer_cast(JsiDeclarativeEngineInstance::GetCurrentRuntime()); + return JsiRef::Make(panda::JSValueRef::False(runtime->GetEcmaVm())); +} + // ----------------------- // Implementation of JsiArray // ----------------------- diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h index 98e78bbb48c..baa15d8693f 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_types.h @@ -93,6 +93,11 @@ public: template T ToNumber() const; + static JsiRef Undefined(); + static JsiRef Null(); + static JsiRef True(); + static JsiRef False(); + FAKE_PTR_FOR_FUNCTION_ACCESS(JsiValue) }; -- Gitee From 22aaa84987cc4b1f613f856ea95331c55f39c010 Mon Sep 17 00:00:00 2001 From: Tsvetan Stefanovski twx512252 Date: Thu, 6 Apr 2023 17:33:35 +0200 Subject: [PATCH 3/3] Return undefined if a value cannot be found inside a persistent storage Signed-off-by: Tsvetan Stefanovski twx512252 Change-Id: I2ddb5c1d60a940912775894ff7e492358e0a06f9 --- frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp index c15e76e9666..86bfe43ada4 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_persistent.cpp @@ -105,6 +105,7 @@ void JSPersistent::Get(const JSCallbackInfo& args) auto executor = container->GetTaskExecutor(); std::string value = StorageProxy::GetInstance()->GetStorage(executor)->GetString(key); if (value.empty()) { + args.SetReturnValue(JSVal::Undefined()); return; } JSRef obj = JSRef::New(); -- Gitee