1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "base/log/exception_handler.h"
17
18#include "app_mgr_client.h"
19#include "application_data_manager.h"
20
21#include "core/common/ace_application_info.h"
22
23namespace OHOS::Ace {
24const std::string NAME = "name";
25const std::string MESSAGE = "message";
26const std::string STACK = "stack";
27static void KillApplicationByUid()
28{
29    auto appMgrClient = std::make_unique<AppExecFwk::AppMgrClient>();
30    CHECK_NULL_VOID(appMgrClient);
31    auto result = appMgrClient->ConnectAppMgrService();
32    if (result != AppExecFwk::AppMgrResultCode::RESULT_OK) {
33        LOGE("failed to ConnectAppMgrService %{public}d", result);
34        return;
35    }
36    auto ret = appMgrClient->KillApplicationSelf();
37    if (ret != AppExecFwk::AppMgrResultCode::RESULT_OK) {
38        LOGE("Fail to kill application by uid. %{public}d", ret);
39        return;
40    }
41}
42
43void ExceptionHandler::HandleJsException(
44    const std::string& exceptionMsg, const JsErrorObject& errorInfo)
45{
46    AppExecFwk::ErrorObject errorObject = {
47        .name = errorInfo.name,
48        .message = errorInfo.message,
49        .stack = errorInfo.stack
50    };
51    auto hasErrorObserver = AppExecFwk::ApplicationDataManager::GetInstance().NotifyUnhandledException(exceptionMsg);
52    auto isNotifySuccess = AppExecFwk::ApplicationDataManager::GetInstance().NotifyExceptionObject(errorObject);
53    if (!hasErrorObserver && !isNotifySuccess) {
54        KillApplicationByUid();
55    }
56}
57} // namespace OHOS::Ace
58