10826e83eSopenharmony_ci/* 20826e83eSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40826e83eSopenharmony_ci * you may not use this file except in compliance with the License. 50826e83eSopenharmony_ci * You may obtain a copy of the License at 60826e83eSopenharmony_ci * 70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80826e83eSopenharmony_ci * 90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120826e83eSopenharmony_ci * See the License for the specific language governing permissions and 130826e83eSopenharmony_ci * limitations under the License. 140826e83eSopenharmony_ci */ 150826e83eSopenharmony_ci 160826e83eSopenharmony_ci#include "webview_hasimage_callback.h" 170826e83eSopenharmony_ci 180826e83eSopenharmony_ci#include "business_error.h" 190826e83eSopenharmony_ci#include "napi_parse_utils.h" 200826e83eSopenharmony_ci#include "nweb_log.h" 210826e83eSopenharmony_ci#include "nweb_napi_scope.h" 220826e83eSopenharmony_ci#include "web_errors.h" 230826e83eSopenharmony_ci 240826e83eSopenharmony_cinamespace OHOS::NWeb { 250826e83eSopenharmony_ciusing namespace NWebError; 260826e83eSopenharmony_ci 270826e83eSopenharmony_civoid WebviewHasImageCallback::OnReceiveValue(bool result) 280826e83eSopenharmony_ci{ 290826e83eSopenharmony_ci uv_loop_s *loop = nullptr; 300826e83eSopenharmony_ci uv_work_t *work = nullptr; 310826e83eSopenharmony_ci 320826e83eSopenharmony_ci napi_get_uv_event_loop(env_, &loop); 330826e83eSopenharmony_ci if (loop == nullptr) { 340826e83eSopenharmony_ci return; 350826e83eSopenharmony_ci } 360826e83eSopenharmony_ci work = new (std::nothrow) uv_work_t; 370826e83eSopenharmony_ci if (work == nullptr) { 380826e83eSopenharmony_ci return; 390826e83eSopenharmony_ci } 400826e83eSopenharmony_ci 410826e83eSopenharmony_ci HasImageParam *param = new (std::nothrow) HasImageParam(); 420826e83eSopenharmony_ci if (param == nullptr) { 430826e83eSopenharmony_ci delete work; 440826e83eSopenharmony_ci work = nullptr; 450826e83eSopenharmony_ci return; 460826e83eSopenharmony_ci } 470826e83eSopenharmony_ci param->env_ = env_; 480826e83eSopenharmony_ci param->callbackRef_ = callbackRef_; 490826e83eSopenharmony_ci param->deferred_ = deferred_; 500826e83eSopenharmony_ci param->result_ = result; 510826e83eSopenharmony_ci 520826e83eSopenharmony_ci work->data = reinterpret_cast<void*>(param); 530826e83eSopenharmony_ci 540826e83eSopenharmony_ci int ret = uv_queue_work_with_qos(loop, work, [](uv_work_t *work) {}, UvAfterWorkCb, uv_qos_user_initiated); 550826e83eSopenharmony_ci if (ret != 0) { 560826e83eSopenharmony_ci if (param != nullptr) { 570826e83eSopenharmony_ci delete param; 580826e83eSopenharmony_ci param = nullptr; 590826e83eSopenharmony_ci } 600826e83eSopenharmony_ci if (work != nullptr) { 610826e83eSopenharmony_ci delete work; 620826e83eSopenharmony_ci work = nullptr; 630826e83eSopenharmony_ci } 640826e83eSopenharmony_ci } 650826e83eSopenharmony_ci} 660826e83eSopenharmony_ci 670826e83eSopenharmony_civoid WebviewHasImageCallback::UvAfterWorkCb(uv_work_t* work, int status) 680826e83eSopenharmony_ci{ 690826e83eSopenharmony_ci (void)status; 700826e83eSopenharmony_ci if (!work) { 710826e83eSopenharmony_ci return; 720826e83eSopenharmony_ci } 730826e83eSopenharmony_ci HasImageParam *param = reinterpret_cast<HasImageParam*>(work->data); 740826e83eSopenharmony_ci if (!param) { 750826e83eSopenharmony_ci delete work; 760826e83eSopenharmony_ci work = nullptr; 770826e83eSopenharmony_ci return; 780826e83eSopenharmony_ci } 790826e83eSopenharmony_ci napi_handle_scope scope = nullptr; 800826e83eSopenharmony_ci napi_open_handle_scope(param->env_, &scope); 810826e83eSopenharmony_ci if (scope == nullptr) { 820826e83eSopenharmony_ci return; 830826e83eSopenharmony_ci } 840826e83eSopenharmony_ci 850826e83eSopenharmony_ci if (param->callbackRef_) { 860826e83eSopenharmony_ci UvAfterWorkCbAsync(param->env_, param->callbackRef_, param->result_); 870826e83eSopenharmony_ci } else if (param->deferred_) { 880826e83eSopenharmony_ci UvAfterWorkCbPromise(param->env_, param->deferred_, param->result_); 890826e83eSopenharmony_ci } 900826e83eSopenharmony_ci 910826e83eSopenharmony_ci napi_close_handle_scope(param->env_, scope); 920826e83eSopenharmony_ci delete param; 930826e83eSopenharmony_ci param = nullptr; 940826e83eSopenharmony_ci delete work; 950826e83eSopenharmony_ci work = nullptr; 960826e83eSopenharmony_ci} 970826e83eSopenharmony_ci 980826e83eSopenharmony_civoid WebviewHasImageCallback::UvAfterWorkCbAsync(napi_env env, napi_ref callbackRef, 990826e83eSopenharmony_ci bool result) 1000826e83eSopenharmony_ci{ 1010826e83eSopenharmony_ci OHOS::NApiScope scope(env); 1020826e83eSopenharmony_ci napi_value setResult[INTEGER_TWO] = {0}; 1030826e83eSopenharmony_ci napi_get_undefined(env, &setResult[INTEGER_ZERO]); 1040826e83eSopenharmony_ci napi_status getBooleanResult = napi_get_boolean(env, result, &setResult[INTEGER_ONE]); 1050826e83eSopenharmony_ci if (getBooleanResult != napi_ok) { 1060826e83eSopenharmony_ci napi_get_boolean(env, false, &setResult[INTEGER_ONE]); 1070826e83eSopenharmony_ci } 1080826e83eSopenharmony_ci napi_value args[INTEGER_TWO] = {setResult[INTEGER_ZERO], setResult[INTEGER_ONE]}; 1090826e83eSopenharmony_ci napi_value callback = nullptr; 1100826e83eSopenharmony_ci napi_get_reference_value(env, callbackRef, &callback); 1110826e83eSopenharmony_ci napi_value callbackResult = nullptr; 1120826e83eSopenharmony_ci napi_call_function(env, nullptr, callback, INTEGER_TWO, args, &callbackResult); 1130826e83eSopenharmony_ci 1140826e83eSopenharmony_ci napi_delete_reference(env, callbackRef); 1150826e83eSopenharmony_ci} 1160826e83eSopenharmony_ci 1170826e83eSopenharmony_civoid WebviewHasImageCallback::UvAfterWorkCbPromise(napi_env env, napi_deferred deferred, 1180826e83eSopenharmony_ci bool result) 1190826e83eSopenharmony_ci{ 1200826e83eSopenharmony_ci napi_value setResult; 1210826e83eSopenharmony_ci napi_status getBooleanResult = napi_get_boolean(env, result, &setResult); 1220826e83eSopenharmony_ci if (getBooleanResult != napi_ok) { 1230826e83eSopenharmony_ci napi_get_boolean(env, false, &setResult); 1240826e83eSopenharmony_ci } 1250826e83eSopenharmony_ci napi_resolve_deferred(env, deferred, setResult); 1260826e83eSopenharmony_ci} 1270826e83eSopenharmony_ci 1280826e83eSopenharmony_ci} // namespace NWeb