diff --git a/window_scene/interfaces/include/ws_common.h b/window_scene/interfaces/include/ws_common.h index 54e1ccbe900f536623a27756fc4cc23039370125..984417ef5d84854d8689bcb30ed6b4ab0a4508b1 100644 --- a/window_scene/interfaces/include/ws_common.h +++ b/window_scene/interfaces/include/ws_common.h @@ -400,6 +400,7 @@ struct SessionInfo { int32_t requestCode = -1; int32_t errorCode = -1; std::string errorReason = ""; + bool shouldSkipKillInStartup = false; int32_t persistentId_ = INVALID_SESSION_ID; int32_t callerPersistentId_ = INVALID_SESSION_ID; std::string callerBundleName_ = ""; diff --git a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp index 5a319b4762c098247f5d4df866d71fdf57e941a3..dc2bec74f8446743a7412923bb79e5879c0dab94 100644 --- a/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp +++ b/window_scene/interfaces/kits/napi/scene_session_manager/js_scene_utils.cpp @@ -1420,6 +1420,8 @@ napi_value CreateJsSessionInfo(napi_env env, const SessionInfo& sessionInfo) } napi_set_named_property(env, objValue, "errorReason", CreateJsValue(env, sessionInfo.errorReason)); + napi_set_named_property(env, objValue, "shouldSkipKillInStartup", + CreateJsValue(env, sessionInfo.shouldSkipKillInStartup)); napi_set_named_property(env, objValue, "isFromIcon", CreateJsValue(env, sessionInfo.isFromIcon_)); SetJsSessionInfoByWant(env, sessionInfo, objValue); napi_set_named_property(env, objValue, "supportWindowModes", diff --git a/window_scene/session/host/src/scene_session.cpp b/window_scene/session/host/src/scene_session.cpp index 1714a2aa3a4f41bb3383876b387f8a827e09f93f..ec18de6cf3e53cebb32c6c71b476046fde8dbac1 100644 --- a/window_scene/session/host/src/scene_session.cpp +++ b/window_scene/session/host/src/scene_session.cpp @@ -6517,8 +6517,9 @@ WSError SceneSession::NotifySessionExceptionInner(const sptr return WSError::WS_ERROR_NULLPTR; } if (SessionHelper::IsMainWindow(session->GetWindowType()) && !session->clientIdentityToken_.empty() && - isFromClient && (abilitySessionInfo->errorReason != ERROR_REASON_LOW_MEMORY_KILL && - session->clientIdentityToken_ != abilitySessionInfo->identityToken)) { + isFromClient && (session->clientIdentityToken_ != abilitySessionInfo->identityToken && + abilitySessionInfo->errorReason != ERROR_REASON_LOW_MEMORY_KILL && + !abilitySessionInfo->shouldSkipKillInStartup)) { TLOGNE(WmsLogTag::WMS_LIFE, "%{public}s client exception not matched: %{public}s, %{public}s", where, session->clientIdentityToken_.c_str(), abilitySessionInfo->identityToken.c_str()); session->RemoveLifeCycleTask(LifeCycleTaskType::STOP); @@ -6536,6 +6537,7 @@ WSError SceneSession::NotifySessionExceptionInner(const sptr info.callerToken_ = abilitySessionInfo->callerToken; info.errorCode = abilitySessionInfo->errorCode; info.errorReason = abilitySessionInfo->errorReason; + info.shouldSkipKillInStartup = abilitySessionInfo->shouldSkipKillInStartup; info.persistentId_ = static_cast(abilitySessionInfo->persistentId); { std::lock_guard lock(session->sessionInfoMutex_); diff --git a/window_scene/session/host/src/zidl/session_proxy.cpp b/window_scene/session/host/src/zidl/session_proxy.cpp index aa25344ca99014182b9088f1a22a70e6b0f2413b..9fb3829465ddf6737cbca7e9eea5dbf6562b37a2 100644 --- a/window_scene/session/host/src/zidl/session_proxy.cpp +++ b/window_scene/session/host/src/zidl/session_proxy.cpp @@ -773,6 +773,10 @@ WSError SessionProxy::NotifySessionException(const sptr abil TLOGE(WmsLogTag::WMS_LIFE, "Write identity token info failed"); return WSError::WS_ERROR_IPC_FAILED; } + if (!data.WriteBool(abilitySessionInfo->shouldSkipKillInStartup)) { + TLOGE(WmsLogTag::WMS_LIFE, "Write shouldSkipKillInStartup failed"); + return WSError::WS_ERROR_IPC_FAILED; + } if (!data.WriteBool(exceptionInfo.needRemoveSession)) { TLOGE(WmsLogTag::WMS_LIFE, "Write needRemoveSession info failed"); return WSError::WS_ERROR_IPC_FAILED; diff --git a/window_scene/session/host/src/zidl/session_stub.cpp b/window_scene/session/host/src/zidl/session_stub.cpp index 05de3809b2598540c7b92a1816eb554b793b40a8..79579ce465da0545a241c25b070ad9dd95d3cd4d 100644 --- a/window_scene/session/host/src/zidl/session_stub.cpp +++ b/window_scene/session/host/src/zidl/session_stub.cpp @@ -702,6 +702,10 @@ int SessionStub::HandleSessionException(MessageParcel& data, MessageParcel& repl TLOGE(WmsLogTag::WMS_LIFE, "Read identityToken failed."); return ERR_INVALID_DATA; } + if (!data.ReadBool(abilitySessionInfo->shouldSkipKillInStartup)) { + TLOGE(WmsLogTag::WMS_LIFE, "Read shouldSkipKillInStartup failed."); + return ERR_INVALID_DATA; + } ExceptionInfo exceptionInfo; if (!data.ReadBool(exceptionInfo.needRemoveSession)) { TLOGE(WmsLogTag::WMS_LIFE, "Read needRemoveSession failed."); diff --git a/window_scene/test/unittest/scene_session_manager_test4.cpp b/window_scene/test/unittest/scene_session_manager_test4.cpp index dd74e359375c42a8dd325afd8b030073ba292635..50c9d9f756e55fc4239f1a7220e2c5ca6952bc9a 100644 --- a/window_scene/test/unittest/scene_session_manager_test4.cpp +++ b/window_scene/test/unittest/scene_session_manager_test4.cpp @@ -1615,6 +1615,37 @@ HWTEST_F(SceneSessionManagerTest4, RegisterSessionExceptionFunc, TestSize.Level1 usleep(WAIT_SYNC_IN_NS); } +/** + * @tc.name: NotifySessionException + * @tc.desc: NotifySessionException + * @tc.type: FUNC + */ +HWTEST_F(SceneSessionManagerTest4, NotifySessionException, TestSize.Level1) +{ + ASSERT_NE(ssm_, nullptr); + SessionInfo sessionInfo; + sessionInfo.bundleName_ = "bundleName"; + sessionInfo.persistentId_ = 1; + sessionInfo.isSystem_ = true; + sptr sceneSession = sptr::MakeSptr(sessionInfo, nullptr); + ASSERT_NE(sceneSession, nullptr); + + sptrAAFwk::SessionInfo abilitySessionInfo = sptrAAFwk::SessionInfo::MakeSptr(); + ExceptionInfo exceptionInfo; + sceneSession->clientIdentityToken_ = 111; + abilitySessionInfo->identityToken = 222; + ASSERT_NE(abilitySessionInfo, nullptr); + + WSError result = sceneSession->NotifySessionExceptionInner(abilitySessionInfo, exceptionInfo, true); + EXPECT_EQ(result, WSError::WS_ERROR_INVALID_PARAM); + + abilitySessionInfo->shouldSkipKillInStartup = true; + result = sceneSession->NotifySessionExceptionInner(abilitySessionInfo, exceptionInfo, true); + EXPECT_EQ(result, WSError::WS_OK); + + usleep(WAIT_SYNC_IN_NS); +} + /** * @tc.name: RegisterSessionSnapshotFunc * @tc.desc: RegisterSessionSnapshotFunc diff --git a/wm/src/window_scene_session_impl.cpp b/wm/src/window_scene_session_impl.cpp index 23edf684c4907e3c23d7387ae1a75828911445cf..46c16f8592adb8f7b32b617cc6901abd910dc0f4 100644 --- a/wm/src/window_scene_session_impl.cpp +++ b/wm/src/window_scene_session_impl.cpp @@ -251,7 +251,7 @@ WMError WindowSceneSessionImpl::GetParentSessionAndVerify(bool isToast, sptrGetWindowName().c_str(), GetType()); return WMError::WM_ERROR_NULLPTR; } - return WindowSceneSessionImpl::VerifySubWindowLevel(false, parentSession); + return WindowSceneSessionImpl::VerifySubWindowLevel(isToast, parentSession); } WMError WindowSceneSessionImpl::VerifySubWindowLevel(bool isToast, const sptr& parentSession) @@ -313,7 +313,7 @@ WMError WindowSceneSessionImpl::CreateAndConnectSpecificSession() } } else if (WindowHelper::IsSubWindow(type)) { sptr parentSession = nullptr; - auto ret = WindowSceneSessionImpl::VerifySubWindowLevel(hasToastFlag, parentSession); + auto ret = WindowSceneSessionImpl::GetParentSessionAndVerify(hasToastFlag, parentSession); if (ret != WMError::WM_OK) { return ret; }