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 6919466766..22f5cb5019 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 @@ -228,8 +228,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 != nullptr) { + 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)) { 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 e957bb59ab..d6af1ac29f 100644 --- a/wm/src/picture_in_picture_controller.cpp +++ b/wm/src/picture_in_picture_controller.cpp @@ -76,6 +76,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..4578f40326 100644 --- a/wm/src/picture_in_picture_option.cpp +++ b/wm/src/picture_in_picture_option.cpp @@ -22,6 +22,18 @@ 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;