From 17d7608631ba8f453191328a81616a3e86c0854b Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Wed, 26 Feb 2025 16:09:09 +0800 Subject: [PATCH 1/4] [bugfix] Clear napi references when pipcontroller destructed Signed-off-by: wangyaohui --- wm/include/picture_in_picture_option.h | 1 + wm/src/picture_in_picture_controller.cpp | 3 +++ wm/src/picture_in_picture_option.cpp | 11 +++++++++++ 3 files changed, 15 insertions(+) diff --git a/wm/include/picture_in_picture_option.h b/wm/include/picture_in_picture_option.h index 13f25750df..1b9c28688e 100644 --- a/wm/include/picture_in_picture_option.h +++ b/wm/include/picture_in_picture_option.h @@ -29,6 +29,7 @@ class PipOption : virtual public RefBase { public: explicit PipOption(); virtual ~PipOption() = default; + void ClearNapiRefs(napi_env env); void SetContext(void* contextPtr); void SetNavigationId(const std::string& navigationId); void SetPipTemplate(uint32_t templateType); diff --git a/wm/src/picture_in_picture_controller.cpp b/wm/src/picture_in_picture_controller.cpp index a8a8203c3f..d43e4c4b34 100644 --- a/wm/src/picture_in_picture_controller.cpp +++ b/wm/src/picture_in_picture_controller.cpp @@ -74,6 +74,9 @@ PictureInPictureController::PictureInPictureController(sptr pipOption PictureInPictureController::~PictureInPictureController() { + if (pipOption_) { + pipOption_->ClearNapiRefs(env_); + } TLOGI(WmsLogTag::WMS_PIP, "Destruction"); if (!isAutoStartEnabled_) { return; diff --git a/wm/src/picture_in_picture_option.cpp b/wm/src/picture_in_picture_option.cpp index 17b8796544..60f26a5251 100644 --- a/wm/src/picture_in_picture_option.cpp +++ b/wm/src/picture_in_picture_option.cpp @@ -22,6 +22,17 @@ PipOption::PipOption() { } +void PipOption::ClearNapiRefs(napi_env env) +{ + if (customNodeController_) { + napi_delete_reference(env, customNodeController_); + customNodeController_ = nullptr; + } + if (typeNode_) { + napi_delete_reference(env, typeNode_); + typeNode_ = nullptr; + } +} void PipOption::SetContext(void* contextPtr) { contextPtr_ = contextPtr; From 60a0a843c2fb50edd6c17bb7cbd18968558d5fed Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Mon, 3 Mar 2025 09:55:58 +0800 Subject: [PATCH 2/4] dereference after update typenode Signed-off-by: wangyaohui --- .../kits/napi/picture_in_picture_napi/js_pip_controller.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp b/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp index 88f4d7548f..336eed1c96 100644 --- a/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp +++ b/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp @@ -222,8 +222,12 @@ napi_value JsPipController::OnUpdateContentNode(napi_env env, napi_callback_info napi_delete_reference(env, typeNodeRef); return; } + napi_ref oldTypeNodeRef = pipController->GetTypeNode(); pipController->UpdateContentNodeRef(typeNodeRef); - napi_delete_reference(env, typeNodeRef); + if (oldTypeNodeRef != nulltpr) { + napi_delete_reference(env, oldTypeNodeRef); + oldTypeNodeRef = nullptr; + } task->Resolve(env, NapiGetUndefined(env)); }; if (napi_status::napi_ok != napi_send_event(env, asyncTask, napi_eprio_immediate)) { From afa531f3caf3a64e1d565276c7ee2a0bbc3203cf Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Tue, 4 Mar 2025 03:46:40 +0000 Subject: [PATCH 3/4] update interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp. Signed-off-by: wangyaohui --- .../kits/napi/picture_in_picture_napi/js_pip_controller.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp b/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp index 336eed1c96..46861e5020 100644 --- a/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp +++ b/interfaces/kits/napi/picture_in_picture_napi/js_pip_controller.cpp @@ -224,7 +224,7 @@ napi_value JsPipController::OnUpdateContentNode(napi_env env, napi_callback_info } napi_ref oldTypeNodeRef = pipController->GetTypeNode(); pipController->UpdateContentNodeRef(typeNodeRef); - if (oldTypeNodeRef != nulltpr) { + if (oldTypeNodeRef != nullptr) { napi_delete_reference(env, oldTypeNodeRef); oldTypeNodeRef = nullptr; } From 40dd0af598438792b51c4157a82c58920419d22d Mon Sep 17 00:00:00 2001 From: wangyaohui Date: Fri, 14 Mar 2025 06:16:41 +0000 Subject: [PATCH 4/4] update wm/src/picture_in_picture_option.cpp. Signed-off-by: wangyaohui --- wm/src/picture_in_picture_option.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wm/src/picture_in_picture_option.cpp b/wm/src/picture_in_picture_option.cpp index 60f26a5251..4578f40326 100644 --- a/wm/src/picture_in_picture_option.cpp +++ b/wm/src/picture_in_picture_option.cpp @@ -33,6 +33,7 @@ void PipOption::ClearNapiRefs(napi_env env) typeNode_ = nullptr; } } + void PipOption::SetContext(void* contextPtr) { contextPtr_ = contextPtr;