From 1e795743b87a32d7a07c4d32d90def8ddced2156 Mon Sep 17 00:00:00 2001 From: "zhangyafei.echo" Date: Wed, 12 Jan 2022 16:50:09 +0800 Subject: [PATCH] Add ConvertTo methord to support getting derived class. Signed-off-by: zhangyafei.echo Change-Id: I6892b5cd9c5e9e3a8ae0862fb324e4ace7b3fff0 --- .../ability_runtime/include/ability_context.h | 9 +++++++++ .../ability_runtime/src/ability_context_impl.cpp | 2 ++ .../native/src/ability_runtime/js_ability.cpp | 14 ++++++++++++++ .../src/ability_runtime/js_window_stage.cpp | 16 ++++++---------- .../src/form_runtime/js_form_extension.cpp | 15 +++++++++++++++ .../ability/native/src/js_service_extension.cpp | 15 +++++++++++++++ 6 files changed, 61 insertions(+), 10 deletions(-) mode change 100755 => 100644 frameworks/kits/ability/ability_runtime/include/ability_context.h diff --git a/frameworks/kits/ability/ability_runtime/include/ability_context.h b/frameworks/kits/ability/ability_runtime/include/ability_context.h old mode 100755 new mode 100644 index 10c6e2dae63..762a30c605f --- a/frameworks/kits/ability/ability_runtime/include/ability_context.h +++ b/frameworks/kits/ability/ability_runtime/include/ability_context.h @@ -129,6 +129,15 @@ public: * @return Returns the ContentStorage. */ virtual void* GetContentStorage() = 0; + + using SelfType = AbilityContext; + static const size_t CONTEXT_TYPE_ID; + +protected: + bool IsContext(size_t contextTypeId) override + { + return contextTypeId == CONTEXT_TYPE_ID || Context::IsContext(contextTypeId); + } }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp index 2abf85bd702..0ba7d64147a 100644 --- a/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp +++ b/frameworks/kits/ability/ability_runtime/src/ability_context_impl.cpp @@ -22,6 +22,8 @@ namespace OHOS { namespace AbilityRuntime { +const size_t AbilityContext::CONTEXT_TYPE_ID(std::hash {} ("AbilityContext")); + std::string AbilityContextImpl::GetBundleCodeDir() { return stageContext_ ? stageContext_->GetBundleCodeDir() : ""; diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp index e087171f79f..47224b35136 100755 --- a/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_ability.cpp @@ -78,6 +78,20 @@ void JsAbility::Init(const std::shared_ptr &abilityInfo, context->Bind(jsRuntime_, shellContextRef.release()); obj->SetProperty("context", contextObj); + + auto nativeObj = ConvertNativeValueTo(contextObj); + if (nativeObj == nullptr) { + HILOG_ERROR("Failed to get ability native object"); + return; + } + + HILOG_INFO("Set ability context pointer: %{public}p", context.get()); + + nativeObj->SetNativePointer(new std::weak_ptr(context), + [](NativeEngine*, void* data, void*) { + HILOG_INFO("Finalizer for weak_ptr ability context is called"); + delete static_cast*>(data); + }, nullptr); } void JsAbility::OnStart(const Want &want) diff --git a/frameworks/kits/ability/native/src/ability_runtime/js_window_stage.cpp b/frameworks/kits/ability/native/src/ability_runtime/js_window_stage.cpp index 6c13f065914..1cb04491332 100644 --- a/frameworks/kits/ability/native/src/ability_runtime/js_window_stage.cpp +++ b/frameworks/kits/ability/native/src/ability_runtime/js_window_stage.cpp @@ -111,18 +111,14 @@ NativeValue* JsWindowStage::OnSetUIContent(NativeEngine& engine, NativeCallbackI HILOG_ERROR("JsWindowStage::OnSetUIContent info->argv[0] InValid"); return engine.CreateUndefined(); } - auto contentValue = objContext->GetProperty("__context_impl__"); - auto contentObj = AbilityRuntime::ConvertNativeValueTo(contentValue); - if (contentObj == nullptr) { - HILOG_ERROR("JsWindowStage::OnSetUIContent contentObj is nullptr"); - return engine.CreateUndefined(); - } - auto jsContext = static_cast(contentObj->GetNativePointer()); - if (jsContext == nullptr) { - HILOG_ERROR("JsWindowStage::OnSetUIContent jsContext is nullptr"); + + auto context = static_cast*>(objContext->GetNativePointer()); + auto abilityContext = Context::ConvertTo(context->lock()); + if (abilityContext == nullptr) { + HILOG_ERROR("JsWindowStage::OnSetUIContent context is nullptr"); return engine.CreateUndefined(); } - std::shared_ptr abilityContext = jsContext->GetAbilityContext(); + HILOG_INFO("JsWindowStage::OnSetUIContent Get context: %{public}p", abilityContext.get()); // Parse info->argv[1] as url diff --git a/frameworks/kits/ability/native/src/form_runtime/js_form_extension.cpp b/frameworks/kits/ability/native/src/form_runtime/js_form_extension.cpp index d8cb3dfbf8f..9e8cc7c6a1d 100644 --- a/frameworks/kits/ability/native/src/form_runtime/js_form_extension.cpp +++ b/frameworks/kits/ability/native/src/form_runtime/js_form_extension.cpp @@ -88,6 +88,21 @@ void JsFormExtension::Init(const std::shared_ptr &record, context->Bind(jsRuntime_, shellContextRef.release()); HILOG_INFO("JsFormExtension::SetProperty."); obj->SetProperty("context", contextObj); + + auto nativeObj = ConvertNativeValueTo(contextObj); + if (nativeObj == nullptr) { + HILOG_ERROR("Failed to get form extension native object"); + return; + } + + HILOG_INFO("Set form extension context pointer: %{public}p", context.get()); + + nativeObj->SetNativePointer(new std::weak_ptr(context), + [](NativeEngine*, void* data, void*) { + HILOG_INFO("Finalizer for weak_ptr form extension context is called"); + delete static_cast*>(data); + }, nullptr); + HILOG_INFO("JsFormExtension::Init end."); } diff --git a/frameworks/kits/ability/native/src/js_service_extension.cpp b/frameworks/kits/ability/native/src/js_service_extension.cpp index c4294fa2cc0..f5aefbaf5b8 100755 --- a/frameworks/kits/ability/native/src/js_service_extension.cpp +++ b/frameworks/kits/ability/native/src/js_service_extension.cpp @@ -86,6 +86,21 @@ void JsServiceExtension::Init(const std::shared_ptr &record, context->Bind(jsRuntime_, shellContextRef.release()); HILOG_INFO("JsServiceExtension::SetProperty."); obj->SetProperty("context", contextObj); + + auto nativeObj = ConvertNativeValueTo(contextObj); + if (nativeObj == nullptr) { + HILOG_ERROR("Failed to get service extension native object"); + return; + } + + HILOG_INFO("Set service extension context pointer: %{public}p", context.get()); + + nativeObj->SetNativePointer(new std::weak_ptr(context), + [](NativeEngine*, void* data, void*) { + HILOG_INFO("Finalizer for weak_ptr service extension context is called"); + delete static_cast*>(data); + }, nullptr); + HILOG_INFO("JsServiceExtension::Init end."); } -- Gitee