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 "napi_web_cookie_manager.h"
17
18 #include <cstdint>
19 #include <uv.h>
20 #include <vector>
21
22 #include "business_error.h"
23 #include "napi/native_common.h"
24 #include "nweb_cookie_manager.h"
25 #include "nweb_helper.h"
26 #include "nweb_log.h"
27 #include "napi_parse_utils.h"
28 #include "web_errors.h"
29 #include "securec.h"
30
31 namespace OHOS {
32 namespace NWeb {
Init(napi_env env,napi_value exports)33 napi_value NapiWebCookieManager::Init(napi_env env, napi_value exports)
34 {
35 napi_property_descriptor properties[] = {
36 DECLARE_NAPI_STATIC_FUNCTION("getCookie", NapiWebCookieManager::JsGetCookie),
37 DECLARE_NAPI_STATIC_FUNCTION("fetchCookieSync", NapiWebCookieManager::JsGetCookie),
38 DECLARE_NAPI_STATIC_FUNCTION("fetchCookie", NapiWebCookieManager::JsFetchCookieAsync),
39 DECLARE_NAPI_STATIC_FUNCTION("setCookie", NapiWebCookieManager::JsSetCookie),
40 DECLARE_NAPI_STATIC_FUNCTION("configCookieSync", NapiWebCookieManager::JsSetCookie),
41 DECLARE_NAPI_STATIC_FUNCTION("configCookie", NapiWebCookieManager::JsConfigCookieAsync),
42 DECLARE_NAPI_STATIC_FUNCTION("isCookieAllowed", NapiWebCookieManager::JsIsCookieAllowed),
43 DECLARE_NAPI_STATIC_FUNCTION("putAcceptCookieEnabled", NapiWebCookieManager::JsPutAcceptCookieEnabled),
44 DECLARE_NAPI_STATIC_FUNCTION("isThirdPartyCookieAllowed",
45 NapiWebCookieManager::JsIsThirdPartyCookieAllowed),
46 DECLARE_NAPI_STATIC_FUNCTION("putAcceptThirdPartyCookieEnabled",
47 NapiWebCookieManager::JsPutAcceptThirdPartyCookieEnabled),
48 DECLARE_NAPI_STATIC_FUNCTION("existCookie", NapiWebCookieManager::JsExistCookie),
49 DECLARE_NAPI_STATIC_FUNCTION("deleteEntireCookie", NapiWebCookieManager::JsDeleteEntireCookie),
50 DECLARE_NAPI_STATIC_FUNCTION("clearAllCookiesSync", NapiWebCookieManager::JsDeleteEntireCookie),
51 DECLARE_NAPI_STATIC_FUNCTION("clearAllCookies", NapiWebCookieManager::JsClearAllCookiesAsync),
52 DECLARE_NAPI_STATIC_FUNCTION("deleteSessionCookie", NapiWebCookieManager::JsDeleteSessionCookie),
53 DECLARE_NAPI_STATIC_FUNCTION("clearSessionCookieSync", NapiWebCookieManager::JsDeleteSessionCookie),
54 DECLARE_NAPI_STATIC_FUNCTION("clearSessionCookie", NapiWebCookieManager::JsClearSessionCookieAsync),
55 DECLARE_NAPI_STATIC_FUNCTION("saveCookieAsync", NapiWebCookieManager::JsSaveCookieAsync),
56 };
57 napi_value constructor = nullptr;
58
59 napi_define_class(env, WEB_COOKIE_MANAGER_CLASS_NAME.c_str(), WEB_COOKIE_MANAGER_CLASS_NAME.length(),
60 JsConstructor, nullptr, sizeof(properties) / sizeof(properties[0]), properties, &constructor);
61 NAPI_ASSERT(env, constructor != nullptr, "NapiWebCookieManager define js class failed");
62 napi_status status = napi_set_named_property(env, exports, "WebCookieManager", constructor);
63 NAPI_ASSERT(env, status == napi_ok, "NapiWebCookieManager set property failed");
64 return exports;
65 }
66
JsConstructor(napi_env env,napi_callback_info info)67 napi_value NapiWebCookieManager::JsConstructor(napi_env env, napi_callback_info info)
68 {
69 napi_value thisVar = nullptr;
70
71 size_t argc = INTEGER_TWO;
72 napi_value argv[INTEGER_TWO] = { 0 };
73 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
74 return thisVar;
75 }
76
GetStringPara(napi_env env,napi_value argv,std::string & outValue)77 bool NapiWebCookieManager::GetStringPara(napi_env env, napi_value argv, std::string& outValue)
78 {
79 constexpr int32_t MAX_STRING_LENGTH = 40960;
80 size_t bufferSize = 0;
81 napi_valuetype valueType = napi_null;
82
83 napi_typeof(env, argv, &valueType);
84 if (valueType != napi_string) {
85 return false;
86 }
87 napi_get_value_string_utf8(env, argv, nullptr, 0, &bufferSize);
88 if (bufferSize > MAX_STRING_LENGTH) {
89 return false;
90 }
91 char stringValue[bufferSize + 1];
92 size_t jsStringLength = 0;
93 napi_get_value_string_utf8(env, argv, stringValue, bufferSize + 1, &jsStringLength);
94 if (jsStringLength != bufferSize) {
95 return false;
96 }
97 outValue = stringValue;
98 return true;
99 }
100
GetBooleanPara(napi_env env,napi_value argv,bool & outValue)101 bool NapiWebCookieManager::GetBooleanPara(napi_env env, napi_value argv, bool& outValue)
102 {
103 napi_valuetype valueType = napi_null;
104
105 napi_typeof(env, argv, &valueType);
106 if (valueType != napi_boolean) {
107 return false;
108 }
109
110 bool boolValue;
111 napi_get_value_bool(env, argv, &boolValue);
112 outValue = boolValue;
113 return true;
114 }
115
NapiCallBackNullptr(napi_env env,napi_ref jsCallback)116 void NapiCallBackNullptr(napi_env env, napi_ref jsCallback)
117 {
118 napi_value jsResult = nullptr;
119 napi_get_null(env, &jsResult);
120 napi_value callback = nullptr;
121 napi_get_reference_value(env, jsCallback, &callback);
122 napi_value callbackResult = nullptr;
123 napi_call_function(env, nullptr, callback, INTEGER_ONE, &jsResult, &callbackResult);
124 }
125
FetchCookieAsyncCallback(napi_env env,napi_ref jsCallback,std::string url)126 void FetchCookieAsyncCallback(napi_env env, napi_ref jsCallback, std::string url)
127 {
128 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
129 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
130 if (cookieManager == nullptr) {
131 NapiCallBackNullptr(env, jsCallback);
132 napi_delete_reference(env, jsCallback);
133 } else {
134 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebFetchCookieCallbackImpl>(env, jsCallback, nullptr);
135 cookieManager->ReturnCookie(url, callbackImpl);
136 }
137 }
138
FetchCookieAsyncPromise(napi_env env,napi_deferred deferred,std::string url)139 void FetchCookieAsyncPromise(napi_env env, napi_deferred deferred, std::string url)
140 {
141 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
142 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
143 if (cookieManager == nullptr) {
144 napi_value jsResult = nullptr;
145 napi_get_undefined(env, &jsResult);
146 napi_reject_deferred(env, deferred, jsResult);
147 } else {
148 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebFetchCookieCallbackImpl>(env, nullptr, deferred);
149 cookieManager->ReturnCookie(url, callbackImpl);
150 }
151 }
152
JsFetchCookieAsync(napi_env env,napi_callback_info info)153 napi_value NapiWebCookieManager::JsFetchCookieAsync(napi_env env, napi_callback_info info)
154 {
155 size_t argc = INTEGER_TWO;
156 size_t argcPromise = INTEGER_ONE;
157 size_t argcCallback = INTEGER_TWO;
158 napi_value argv[INTEGER_TWO] = {0};
159 napi_value retValue = nullptr;
160
161 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
162 if (argc != argcPromise && argc != argcCallback) {
163 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
164 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "one", "two"));
165 return nullptr;
166 }
167
168 std::string url;
169 if (!GetStringPara(env, argv[INTEGER_ZERO], url)) {
170 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
171 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "url", "string"));
172 return nullptr;
173 }
174
175 napi_value result = nullptr;
176 napi_get_undefined(env, &result);
177
178 if (argc == argcCallback) {
179 napi_valuetype valueType = napi_null;
180 napi_typeof(env, argv[argcCallback - 1], &valueType);
181 if (valueType != napi_function) {
182 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
183 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
184 return nullptr;
185 }
186 napi_ref jsCallback = nullptr;
187 napi_create_reference(env, argv[argcCallback - 1], INTEGER_ONE, &jsCallback);
188
189 if (jsCallback) {
190 FetchCookieAsyncCallback(env, jsCallback, url);
191 }
192 return result;
193 }
194
195 napi_deferred deferred = nullptr;
196 napi_value promise = nullptr;
197 napi_create_promise(env, &deferred, &promise);
198 if (promise && deferred) {
199 FetchCookieAsyncPromise(env, deferred, url);
200 }
201 return promise;
202 }
203
JsGetCookie(napi_env env,napi_callback_info info)204 napi_value NapiWebCookieManager::JsGetCookie(napi_env env, napi_callback_info info)
205 {
206 napi_value retValue = nullptr;
207 size_t argc = INTEGER_TWO;
208 size_t argcForOld = INTEGER_ONE;
209 napi_value argv[INTEGER_TWO] = { 0 };
210
211 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
212 if (argc != INTEGER_TWO && argc != argcForOld) {
213 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
214 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "one", "two"));
215 return nullptr;
216 }
217
218 std::string url;
219 if (!GetStringPara(env, argv[INTEGER_ZERO], url)) {
220 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
221 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "url", "string"));
222 return nullptr;
223 }
224
225 bool incognitoMode = false;
226 if (argc == INTEGER_TWO && !GetBooleanPara(env, argv[INTEGER_ONE], incognitoMode)) {
227 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
228 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "incognito", "boolean"));
229 return nullptr;
230 }
231
232 napi_value result = nullptr;
233 std::string cookieContent = "";
234
235 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
236 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
237 bool isValid = true;
238 if (cookieManager != nullptr) {
239 cookieContent = cookieManager->ReturnCookie(url, isValid, incognitoMode);
240 }
241
242 if (cookieContent == "" && !isValid) {
243 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::INVALID_URL);
244 return nullptr;
245 }
246 napi_create_string_utf8(env, cookieContent.c_str(), cookieContent.length(), &result);
247 return result;
248 }
249
JsSetCookie(napi_env env,napi_callback_info info)250 napi_value NapiWebCookieManager::JsSetCookie(napi_env env, napi_callback_info info)
251 {
252 napi_value retValue = nullptr;
253 size_t argc = INTEGER_THREE;
254 size_t argcForOld = INTEGER_TWO;
255 napi_value argv[INTEGER_THREE] = { 0 };
256
257 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
258 if (argc != INTEGER_THREE && argc != argcForOld) {
259 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
260 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "two", "three"));
261 return nullptr;
262 }
263
264 std::string url;
265 std::string value;
266 if (!GetStringPara(env, argv[INTEGER_ZERO], url)) {
267 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
268 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "url", "string"));
269 return nullptr;
270 }
271 if (!GetStringPara(env, argv[INTEGER_ONE], value)) {
272 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
273 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "value", "string"));
274 return nullptr;
275 }
276
277 bool incognitoMode = false;
278 if (argc == INTEGER_THREE && !GetBooleanPara(env, argv[INTEGER_TWO], incognitoMode)) {
279 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
280 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "incognito", "boolean"));
281 return nullptr;
282 }
283
284 napi_value result = nullptr;
285 int isSet = -1;
286
287 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
288 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
289 if (cookieManager != nullptr) {
290 isSet = cookieManager->SetCookie(url, value, incognitoMode);
291 }
292 if (isSet == NWebError::INVALID_URL) {
293 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::INVALID_URL);
294 return nullptr;
295 } else if (isSet == NWebError::INVALID_COOKIE_VALUE) {
296 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::INVALID_COOKIE_VALUE);
297 return nullptr;
298 }
299 NAPI_CALL(env, napi_get_undefined(env, &result));
300 return result;
301 }
302
ConfigCookieAsyncCallback(napi_env env,napi_ref jsCallback,std::string url,std::string value)303 void ConfigCookieAsyncCallback(napi_env env, napi_ref jsCallback, std::string url, std::string value)
304 {
305 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
306 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
307 if (cookieManager == nullptr) {
308 NapiCallBackNullptr(env, jsCallback);
309 napi_delete_reference(env, jsCallback);
310 } else {
311 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebConfigCookieCallbackImpl>(env, jsCallback, nullptr);
312 cookieManager->ConfigCookie(url, value, callbackImpl);
313 }
314 }
315
ConfigCookieAsyncPromise(napi_env env,napi_deferred deferred,std::string url,std::string value)316 void ConfigCookieAsyncPromise(napi_env env, napi_deferred deferred, std::string url, std::string value)
317 {
318 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
319 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
320 if (cookieManager == nullptr) {
321 napi_value jsResult = nullptr;
322 napi_get_undefined(env, &jsResult);
323 napi_reject_deferred(env, deferred, jsResult);
324 } else {
325 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebConfigCookieCallbackImpl>(env, nullptr, deferred);
326 cookieManager->ConfigCookie(url, value, callbackImpl);
327 }
328 }
329
JsConfigCookieAsync(napi_env env,napi_callback_info info)330 napi_value NapiWebCookieManager::JsConfigCookieAsync(napi_env env, napi_callback_info info)
331 {
332 size_t argc = INTEGER_THREE;
333 size_t argcPromise = INTEGER_TWO;
334 size_t argcCallback = INTEGER_THREE;
335 napi_value argv[INTEGER_THREE] = {0};
336 napi_value retValue = nullptr;
337
338 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
339 if (argc != argcPromise && argc != argcCallback) {
340 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
341 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "two", "three"));
342 return nullptr;
343 }
344
345 std::string url;
346 std::string value;
347 if (!GetStringPara(env, argv[INTEGER_ZERO], url)) {
348 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
349 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "url", "string"));
350 return nullptr;
351 }
352
353 if (!GetStringPara(env, argv[INTEGER_ONE], value)) {
354 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
355 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "value", "string"));
356 return nullptr;
357 }
358
359 napi_value result = nullptr;
360 napi_get_undefined(env, &result);
361
362 if (argc == argcCallback) {
363 napi_valuetype valueType = napi_null;
364 napi_typeof(env, argv[argcCallback - 1], &valueType);
365 if (valueType != napi_function) {
366 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
367 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
368 return nullptr;
369 }
370 napi_ref jsCallback = nullptr;
371 napi_create_reference(env, argv[argcCallback - 1], INTEGER_ONE, &jsCallback);
372
373 if (jsCallback) {
374 ConfigCookieAsyncCallback(env, jsCallback, url, value);
375 }
376 return result;
377 }
378
379 napi_deferred deferred = nullptr;
380 napi_value promise = nullptr;
381 napi_create_promise(env, &deferred, &promise);
382 if (promise && deferred) {
383 ConfigCookieAsyncPromise(env, deferred, url, value);
384 }
385 return promise;
386 }
387
JsIsCookieAllowed(napi_env env,napi_callback_info info)388 napi_value NapiWebCookieManager::JsIsCookieAllowed(napi_env env, napi_callback_info info)
389 {
390 napi_value result = nullptr;
391 bool accept = true;
392
393 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
394 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
395 if (cookieManager != nullptr) {
396 accept = cookieManager->IsAcceptCookieAllowed();
397 }
398 NAPI_CALL(env, napi_get_boolean(env, accept, &result));
399 return result;
400 }
401
JsPutAcceptCookieEnabled(napi_env env,napi_callback_info info)402 napi_value NapiWebCookieManager::JsPutAcceptCookieEnabled(napi_env env, napi_callback_info info)
403 {
404 napi_value retValue = nullptr;
405 size_t argc = INTEGER_ONE;
406 napi_value argv[INTEGER_ONE] = { 0 };
407
408 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
409 if (argc != INTEGER_ONE) {
410 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
411 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
412 return nullptr;
413 }
414
415 bool accept;
416 if (!GetBooleanPara(env, argv[INTEGER_ZERO], accept)) {
417 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
418 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "accept", "booleane"));
419 return nullptr;
420 }
421
422 napi_value result = nullptr;
423
424 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
425 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
426 if (cookieManager != nullptr) {
427 cookieManager->PutAcceptCookieEnabled(accept);
428 }
429 NAPI_CALL(env, napi_get_undefined(env, &result));
430 return result;
431 }
432
JsIsThirdPartyCookieAllowed(napi_env env,napi_callback_info info)433 napi_value NapiWebCookieManager::JsIsThirdPartyCookieAllowed(napi_env env, napi_callback_info info)
434 {
435 napi_value result = nullptr;
436 bool accept = true;
437
438 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
439 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
440 if (cookieManager != nullptr) {
441 accept = cookieManager->IsThirdPartyCookieAllowed();
442 }
443 NAPI_CALL(env, napi_get_boolean(env, accept, &result));
444 return result;
445 }
446
JsPutAcceptThirdPartyCookieEnabled(napi_env env,napi_callback_info info)447 napi_value NapiWebCookieManager::JsPutAcceptThirdPartyCookieEnabled(napi_env env, napi_callback_info info)
448 {
449 napi_value retValue = nullptr;
450 size_t argc = INTEGER_ONE;
451 napi_value argv[INTEGER_ONE] = { 0 };
452
453 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
454 if (argc != INTEGER_ONE) {
455 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
456 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_ONE, "one"));
457 return nullptr;
458 }
459
460 bool accept;
461 if (!GetBooleanPara(env, argv[INTEGER_ZERO], accept)) {
462 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
463 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "accept", "boolean"));
464 return nullptr;
465 }
466
467 napi_value result = nullptr;
468
469 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
470 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
471 if (cookieManager != nullptr) {
472 cookieManager->PutAcceptThirdPartyCookieEnabled(accept);
473 }
474 NAPI_CALL(env, napi_get_undefined(env, &result));
475 return result;
476 }
477
JsExistCookie(napi_env env,napi_callback_info info)478 napi_value NapiWebCookieManager::JsExistCookie(napi_env env, napi_callback_info info)
479 {
480 napi_value retValue = nullptr;
481 size_t argc = INTEGER_ONE;
482 size_t argcForOld = INTEGER_ZERO;
483 napi_value argv[INTEGER_ONE] = { 0 };
484 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
485 if (argc != INTEGER_ONE && argc != argcForOld) {
486 return nullptr;
487 }
488
489 bool incognitoMode = false;
490 if (argc == INTEGER_ONE && !GetBooleanPara(env, argv[INTEGER_ZERO], incognitoMode)) {
491 return nullptr;
492 }
493
494 napi_value result = nullptr;
495 bool exist = true;
496 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
497 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
498 if (cookieManager != nullptr) {
499 exist = cookieManager->ExistCookies(incognitoMode);
500 }
501 NAPI_CALL(env, napi_get_boolean(env, exist, &result));
502 return result;
503 }
504
ClearAllCookiesAsyncCallback(napi_env env,napi_ref jsCallback)505 void ClearAllCookiesAsyncCallback(napi_env env, napi_ref jsCallback)
506 {
507 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
508 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
509 if (cookieManager == nullptr) {
510 NapiCallBackNullptr(env, jsCallback);
511 napi_delete_reference(env, jsCallback);
512 } else {
513 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebCookieCallbackImpl>(env, jsCallback, nullptr);
514 cookieManager->DeleteCookieEntirely(callbackImpl, false);
515 }
516 }
517
ClearAllCookiesAsyncPromise(napi_env env,napi_deferred deferred)518 void ClearAllCookiesAsyncPromise(napi_env env, napi_deferred deferred)
519 {
520 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
521 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
522 if (cookieManager == nullptr) {
523 napi_value jsResult = nullptr;
524 napi_get_undefined(env, &jsResult);
525 napi_reject_deferred(env, deferred, jsResult);
526 } else {
527 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebCookieCallbackImpl>(env, nullptr, deferred);
528 cookieManager->DeleteCookieEntirely(callbackImpl, false);
529 }
530 }
531
JsClearAllCookiesAsync(napi_env env,napi_callback_info info)532 napi_value NapiWebCookieManager::JsClearAllCookiesAsync(napi_env env, napi_callback_info info)
533 {
534 size_t argc = INTEGER_ONE;
535 size_t argcPromise = INTEGER_ZERO;
536 size_t argcCallback = INTEGER_ONE;
537 napi_value argv[INTEGER_ONE] = {0};
538 napi_value thisVar = nullptr;
539
540 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
541 if (argc != argcPromise && argc != argcCallback) {
542 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
543 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "zero", "one"));
544 return nullptr;
545 }
546
547 napi_value result = nullptr;
548 napi_get_undefined(env, &result);
549
550 if (argc == argcCallback) {
551 napi_valuetype valueType = napi_null;
552 napi_typeof(env, argv[argcCallback - 1], &valueType);
553 if (valueType != napi_function) {
554 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
555 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
556 return nullptr;
557 }
558 napi_ref jsCallback = nullptr;
559 napi_create_reference(env, argv[argcCallback - 1], INTEGER_ONE, &jsCallback);
560
561 if (jsCallback) {
562 ClearAllCookiesAsyncCallback(env, jsCallback);
563 }
564 return result;
565 }
566
567 napi_deferred deferred = nullptr;
568 napi_value promise = nullptr;
569 napi_create_promise(env, &deferred, &promise);
570 if (promise && deferred) {
571 ClearAllCookiesAsyncPromise(env, deferred);
572 }
573 return promise;
574 }
575
JsDeleteEntireCookie(napi_env env,napi_callback_info info)576 napi_value NapiWebCookieManager::JsDeleteEntireCookie(napi_env env, napi_callback_info info)
577 {
578 napi_value retValue = nullptr;
579 size_t argc = INTEGER_ONE;
580 size_t argcForOld = INTEGER_ZERO;
581 napi_value argv[INTEGER_ONE] = { 0 };
582 napi_get_cb_info(env, info, &argc, argv, &retValue, nullptr);
583 if (argc != INTEGER_ONE && argc != argcForOld) {
584 return nullptr;
585 }
586
587 bool incognitoMode = false;
588 if (argc == INTEGER_ONE && !GetBooleanPara(env, argv[INTEGER_ZERO], incognitoMode)) {
589 return nullptr;
590 }
591 napi_value result = nullptr;
592
593 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
594 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
595 if (cookieManager != nullptr) {
596 cookieManager->DeleteCookieEntirely(nullptr, incognitoMode);
597 }
598 NAPI_CALL(env, napi_get_undefined(env, &result));
599 return result;
600 }
601
ClearSessionCookieAsyncCallback(napi_env env,napi_ref jsCallback)602 void ClearSessionCookieAsyncCallback(napi_env env, napi_ref jsCallback)
603 {
604 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
605 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
606 if (cookieManager == nullptr) {
607 NapiCallBackNullptr(env, jsCallback);
608 napi_delete_reference(env, jsCallback);
609 } else {
610 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebCookieCallbackImpl>(env, jsCallback, nullptr);
611 cookieManager->DeleteSessionCookies(callbackImpl);
612 }
613 }
614
ClearSessionCookieAsyncPromise(napi_env env,napi_deferred deferred)615 void ClearSessionCookieAsyncPromise(napi_env env, napi_deferred deferred)
616 {
617 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
618 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
619 if (cookieManager == nullptr) {
620 napi_value jsResult = nullptr;
621 napi_get_undefined(env, &jsResult);
622 napi_reject_deferred(env, deferred, jsResult);
623 } else {
624 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebCookieCallbackImpl>(env, nullptr, deferred);
625 cookieManager->DeleteSessionCookies(callbackImpl);
626 }
627 }
628
JsClearSessionCookieAsync(napi_env env,napi_callback_info info)629 napi_value NapiWebCookieManager::JsClearSessionCookieAsync(napi_env env, napi_callback_info info)
630 {
631 size_t argc = INTEGER_ONE;
632 size_t argcPromise = INTEGER_ZERO;
633 size_t argcCallback = INTEGER_ONE;
634 napi_value argv[INTEGER_ONE] = {0};
635 napi_value thisVar = nullptr;
636
637 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
638 if (argc != argcPromise && argc != argcCallback) {
639 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
640 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "zero", "one"));
641 return nullptr;
642 }
643
644 napi_value result = nullptr;
645 napi_get_undefined(env, &result);
646
647 if (argc == argcCallback) {
648 napi_valuetype valueType = napi_null;
649 napi_typeof(env, argv[argcCallback - 1], &valueType);
650 if (valueType != napi_function) {
651 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
652 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
653 return nullptr;
654 }
655 napi_ref jsCallback = nullptr;
656 napi_create_reference(env, argv[argcCallback - 1], INTEGER_ONE, &jsCallback);
657
658 if (jsCallback) {
659 ClearSessionCookieAsyncCallback(env, jsCallback);
660 }
661 return result;
662 }
663
664 napi_deferred deferred = nullptr;
665 napi_value promise = nullptr;
666 napi_create_promise(env, &deferred, &promise);
667 if (promise && deferred) {
668 ClearSessionCookieAsyncPromise(env, deferred);
669 }
670 return promise;
671 }
672
JsDeleteSessionCookie(napi_env env,napi_callback_info info)673 napi_value NapiWebCookieManager::JsDeleteSessionCookie(napi_env env, napi_callback_info info)
674 {
675 napi_value result = nullptr;
676
677 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
678 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
679 if (cookieManager != nullptr) {
680 cookieManager->DeleteSessionCookies(nullptr);
681 }
682 napi_get_undefined(env, &result);
683 return result;
684 }
685
SaveCookieAsyncCallback(napi_env env,napi_ref jsCallback)686 void SaveCookieAsyncCallback(napi_env env, napi_ref jsCallback)
687 {
688 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
689 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
690 if (cookieManager == nullptr) {
691 napi_value jsResult = nullptr;
692 napi_get_null(env, &jsResult);
693 napi_value callback = nullptr;
694 napi_get_reference_value(env, jsCallback, &callback);
695 napi_value callbackResult = nullptr;
696 napi_call_function(env, nullptr, callback, INTEGER_ONE, &jsResult, &callbackResult);
697 napi_delete_reference(env, jsCallback);
698 } else {
699 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebSaveCookieCallbackImpl>(env, jsCallback, nullptr);
700 cookieManager->Store(callbackImpl);
701 }
702 }
703
SaveCookieAsyncPromise(napi_env env,napi_deferred deferred)704 void SaveCookieAsyncPromise(napi_env env, napi_deferred deferred)
705 {
706 std::shared_ptr<OHOS::NWeb::NWebCookieManager> cookieManager =
707 OHOS::NWeb::NWebHelper::Instance().GetCookieManager();
708 if (cookieManager == nullptr) {
709 napi_value jsResult = nullptr;
710 napi_get_undefined(env, &jsResult);
711 napi_reject_deferred(env, deferred, jsResult);
712 } else {
713 auto callbackImpl = std::make_shared<OHOS::NWeb::NWebSaveCookieCallbackImpl>(env, nullptr, deferred);
714 cookieManager->Store(callbackImpl);
715 }
716 }
717
JsSaveCookieAsync(napi_env env,napi_callback_info info)718 napi_value NapiWebCookieManager::JsSaveCookieAsync(napi_env env, napi_callback_info info)
719 {
720 napi_value thisVar = nullptr;
721
722 size_t argc = INTEGER_ONE;
723 size_t argcPromise = INTEGER_ZERO;
724 size_t argcCallback = INTEGER_ONE;
725 napi_value argv[INTEGER_ONE] = {0};
726
727 napi_get_cb_info(env, info, &argc, argv, &thisVar, nullptr);
728 if (argc != argcPromise && argc != argcCallback) {
729 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
730 NWebError::FormatString(ParamCheckErrorMsgTemplate::PARAM_NUMBERS_ERROR_TWO, "zero", "one"));
731 return nullptr;
732 }
733
734 napi_value result = nullptr;
735 napi_get_undefined(env, &result);
736
737 if (argc == argcCallback) {
738 napi_valuetype valueType = napi_null;
739 napi_typeof(env, argv[argcCallback - 1], &valueType);
740 if (valueType != napi_function) {
741 NWebError::BusinessError::ThrowErrorByErrcode(env, NWebError::PARAM_CHECK_ERROR,
742 NWebError::FormatString(ParamCheckErrorMsgTemplate::TYPE_ERROR, "callback", "function"));
743 return nullptr;
744 }
745 napi_ref jsCallback = nullptr;
746 napi_create_reference(env, argv[argcCallback - 1], INTEGER_ONE, &jsCallback);
747
748 if (jsCallback) {
749 SaveCookieAsyncCallback(env, jsCallback);
750 }
751 return result;
752 }
753
754 napi_deferred deferred = nullptr;
755 napi_value promise = nullptr;
756 napi_create_promise(env, &deferred, &promise);
757 if (promise && deferred) {
758 SaveCookieAsyncPromise(env, deferred);
759 }
760 return promise;
761 }
762
UvJsCallbackThreadWoker(uv_work_t * work,int status)763 void NWebSaveCookieCallbackImpl::UvJsCallbackThreadWoker(uv_work_t *work, int status)
764 {
765 if (work == nullptr) {
766 WVLOG_E("uv work is null");
767 return;
768 }
769 NapiWebCookieManager::WebCookieManagerParam *data =
770 reinterpret_cast<NapiWebCookieManager::WebCookieManagerParam*>(work->data);
771 if (data == nullptr) {
772 WVLOG_E("WebCookieManagerParam is null");
773 delete work;
774 work = nullptr;
775 return;
776 }
777 napi_handle_scope scope = nullptr;
778 napi_open_handle_scope(data->env_, &scope);
779 if (scope == nullptr) {
780 return;
781 }
782
783 if (data->callback_) {
784 napi_value result[INTEGER_ONE] = {0};
785 napi_get_null(data->env_, &result[INTEGER_ZERO]);
786
787 napi_value onSaveCookieFunc = nullptr;
788 napi_get_reference_value(data->env_, data->callback_, &onSaveCookieFunc);
789 napi_value callbackResult = nullptr;
790 napi_call_function(data->env_, nullptr, onSaveCookieFunc,
791 INTEGER_ONE, &result[INTEGER_ZERO], &callbackResult);
792 napi_delete_reference(data->env_, data->callback_);
793 } else if (data->deferred_) {
794 napi_value jsResult = nullptr;
795 napi_get_undefined(data->env_, &jsResult);
796 napi_resolve_deferred(data->env_, data->deferred_, jsResult);
797 }
798
799 napi_close_handle_scope(data->env_, scope);
800 delete data;
801 data = nullptr;
802 delete work;
803 work = nullptr;
804 }
805
OnReceiveValue(bool result)806 void NWebSaveCookieCallbackImpl::OnReceiveValue(bool result)
807 {
808 WVLOG_D("save cookie received result, result = %{public}d", result);
809 uv_loop_s *loop = nullptr;
810 uv_work_t *work = nullptr;
811 napi_get_uv_event_loop(env_, &loop);
812 if (loop == nullptr) {
813 WVLOG_E("get uv event loop failed");
814 return;
815 }
816 work = new (std::nothrow) uv_work_t;
817 if (work == nullptr) {
818 WVLOG_E("new uv work failed");
819 return;
820 }
821 NapiWebCookieManager::WebCookieManagerParam *param =
822 new (std::nothrow) NapiWebCookieManager::WebCookieManagerParam();
823 if (param == nullptr) {
824 WVLOG_E("new WebCookieManagerParam failed");
825 delete work;
826 return;
827 }
828 param->env_ = env_;
829 param->callback_ = callback_;
830 param->deferred_ = deferred_;
831
832 work->data = reinterpret_cast<void*>(param);
833 int ret = uv_queue_work_with_qos(
834 loop, work, [](uv_work_t* work) {}, UvJsCallbackThreadWoker, uv_qos_user_initiated);
835 if (ret != 0) {
836 if (param != nullptr) {
837 delete param;
838 param = nullptr;
839 }
840 if (work != nullptr) {
841 delete work;
842 work = nullptr;
843 }
844 }
845 }
846
UvJsCallbackThreadWoker(uv_work_t * work,int status)847 void NWebFetchCookieCallbackImpl::UvJsCallbackThreadWoker(uv_work_t *work, int status)
848 {
849 if (work == nullptr) {
850 WVLOG_E("NWebFetchCookieCallbackImpl uv work is null");
851 return;
852 }
853 NapiWebCookieManager::WebFetchCookieManagerParam *data =
854 reinterpret_cast<NapiWebCookieManager::WebFetchCookieManagerParam*>(work->data);
855 if (data == nullptr) {
856 WVLOG_E("NWebFetchCookieCallbackImpl WebFetchCookieManagerParam is null");
857 delete work;
858 work = nullptr;
859 return;
860 }
861 napi_handle_scope scope = nullptr;
862 napi_open_handle_scope(data->env_, &scope);
863 if (scope == nullptr) {
864 return;
865 }
866
867 napi_value result[INTEGER_TWO] = { 0 };
868 if (data->callback_) {
869 napi_get_null(data->env_, &result[INTEGER_ONE]);
870 if (data->result_.c_str() == std::to_string(NWebError::INVALID_URL)) {
871 result[INTEGER_ZERO] = NWebError::BusinessError::CreateError(data->env_, NWebError::INVALID_URL);
872 } else {
873 napi_get_undefined(data->env_, &result[INTEGER_ZERO]);
874 napi_create_string_utf8(data->env_, data->result_.c_str(), NAPI_AUTO_LENGTH, &result[INTEGER_ONE]);
875 }
876
877 napi_value onGetCookieFunc = nullptr;
878 napi_get_reference_value(data->env_, data->callback_, &onGetCookieFunc);
879
880 napi_value args[INTEGER_TWO] = {result[INTEGER_ZERO], result[INTEGER_ONE]};
881 napi_value callbackResult = nullptr;
882 napi_call_function(data->env_, nullptr, onGetCookieFunc, INTEGER_TWO, &args[INTEGER_ZERO], &callbackResult);
883 napi_delete_reference(data->env_, data->callback_);
884 } else if (data->deferred_) {
885 result[INTEGER_ZERO] = NWebError::BusinessError::CreateError(data->env_, NWebError::INVALID_URL);
886 napi_create_string_utf8(data->env_, data->result_.c_str(), NAPI_AUTO_LENGTH, &result[INTEGER_ONE]);
887 napi_value args[INTEGER_TWO] = {result[INTEGER_ZERO], result[INTEGER_ONE]};
888 if (data->result_.c_str() == std::to_string(NWebError::INVALID_URL)) {
889 napi_reject_deferred(data->env_, data->deferred_, args[INTEGER_ZERO]);
890 } else {
891 napi_resolve_deferred(data->env_, data->deferred_, args[INTEGER_ONE]);
892 }
893 }
894
895 napi_close_handle_scope(data->env_, scope);
896 delete data;
897 data = nullptr;
898 delete work;
899 work = nullptr;
900 }
901
OnReceiveValue(const std::string & result)902 void NWebFetchCookieCallbackImpl::OnReceiveValue(const std::string &result)
903 {
904 WVLOG_D("NWebFetchCookieCallbackImpl received result");
905 uv_loop_s *loop = nullptr;
906 uv_work_t *work = nullptr;
907 napi_get_uv_event_loop(env_, &loop);
908 if (loop == nullptr) {
909 WVLOG_E("get uv event loop failed");
910 return;
911 }
912 work = new (std::nothrow) uv_work_t;
913 if (work == nullptr) {
914 WVLOG_E("new uv work failed");
915 return;
916 }
917 NapiWebCookieManager::WebFetchCookieManagerParam *param =
918 new (std::nothrow) NapiWebCookieManager::WebFetchCookieManagerParam();
919 if (param == nullptr) {
920 WVLOG_E("new WebFetchCookieManagerParam failed");
921 delete work;
922 return;
923 }
924 param->env_ = env_;
925 param->callback_ = callback_;
926 param->deferred_ = deferred_;
927 param->result_ = result;
928
929 work->data = reinterpret_cast<void*>(param);
930 int ret = uv_queue_work_with_qos(
931 loop, work, [](uv_work_t* work) {}, UvJsCallbackThreadWoker, uv_qos_user_initiated);
932 if (ret != 0) {
933 if (param != nullptr) {
934 delete param;
935 param = nullptr;
936 }
937 if (work != nullptr) {
938 delete work;
939 work = nullptr;
940 }
941 }
942 }
943
UvJsCallbackThreadWoker(uv_work_t * work,int status)944 void NWebCookieCallbackImpl::UvJsCallbackThreadWoker(uv_work_t *work, int status)
945 {
946 if (work == nullptr) {
947 WVLOG_E("NWebCookieCallbackImpl uv work is null");
948 return;
949 }
950 NapiWebCookieManager::WebCookieManagerParam *data =
951 reinterpret_cast<NapiWebCookieManager::WebCookieManagerParam*>(work->data);
952 if (data == nullptr) {
953 WVLOG_E("NWebCookieCallbackImpl WebCookieManagerParam is null");
954 delete work;
955 work = nullptr;
956 return;
957 }
958 napi_handle_scope scope = nullptr;
959 napi_open_handle_scope(data->env_, &scope);
960 if (scope == nullptr) {
961 return;
962 }
963
964 if (data->callback_) {
965 napi_value result[INTEGER_ONE] = {0};
966 napi_get_null(data->env_, &result[INTEGER_ZERO]);
967
968 napi_value onCookieFunc = nullptr;
969 napi_get_reference_value(data->env_, data->callback_, &onCookieFunc);
970 napi_value callbackResult = nullptr;
971 napi_call_function(data->env_, nullptr, onCookieFunc,
972 INTEGER_ONE, &result[INTEGER_ZERO], &callbackResult);
973 napi_delete_reference(data->env_, data->callback_);
974 } else if (data->deferred_) {
975 napi_value jsResult = nullptr;
976 napi_get_undefined(data->env_, &jsResult);
977 napi_resolve_deferred(data->env_, data->deferred_, jsResult);
978 }
979
980 napi_close_handle_scope(data->env_, scope);
981 delete data;
982 data = nullptr;
983 delete work;
984 work = nullptr;
985 }
986
OnReceiveValue(bool result)987 void NWebCookieCallbackImpl::OnReceiveValue(bool result)
988 {
989 WVLOG_D("NWebCookieCallbackImpl received result, result = %{public}d", result);
990 uv_loop_s *loop = nullptr;
991 uv_work_t *work = nullptr;
992 napi_get_uv_event_loop(env_, &loop);
993 if (loop == nullptr) {
994 WVLOG_E("NWebCookieCallbackImpl get uv event loop failed");
995 return;
996 }
997 work = new (std::nothrow) uv_work_t;
998 if (work == nullptr) {
999 WVLOG_E("NWebCookieCallbackImpl new uv work failed");
1000 return;
1001 }
1002 NapiWebCookieManager::WebCookieManagerParam *param =
1003 new (std::nothrow) NapiWebCookieManager::WebCookieManagerParam();
1004 if (param == nullptr) {
1005 WVLOG_E("NWebCookieCallbackImpl new WebCookieManagerParam failed");
1006 delete work;
1007 return;
1008 }
1009 param->env_ = env_;
1010 param->callback_ = callback_;
1011 param->deferred_ = deferred_;
1012
1013 work->data = reinterpret_cast<void*>(param);
1014 int ret = uv_queue_work_with_qos(
1015 loop, work, [](uv_work_t* work) {}, UvJsCallbackThreadWoker, uv_qos_user_initiated);
1016 if (ret != 0) {
1017 if (param != nullptr) {
1018 delete param;
1019 param = nullptr;
1020 }
1021 if (work != nullptr) {
1022 delete work;
1023 work = nullptr;
1024 }
1025 }
1026 }
1027
UvJsCallbackThreadWoker(uv_work_t * work,int status)1028 void NWebConfigCookieCallbackImpl::UvJsCallbackThreadWoker(uv_work_t *work, int status)
1029 {
1030 if (work == nullptr) {
1031 WVLOG_E("NWebConfigCookieCallbackImpl uv work is null");
1032 return;
1033 }
1034 NapiWebCookieManager::WebConfigCookieManagerParam *data =
1035 reinterpret_cast<NapiWebCookieManager::WebConfigCookieManagerParam*>(work->data);
1036 if (data == nullptr) {
1037 WVLOG_E("NWebConfigCookieCallbackImpl WebConfigCookieManagerParam is null");
1038 delete work;
1039 work = nullptr;
1040 return;
1041 }
1042 napi_handle_scope scope = nullptr;
1043 napi_open_handle_scope(data->env_, &scope);
1044 if (scope == nullptr) {
1045 return;
1046 }
1047
1048 if (data->callback_) {
1049 napi_value result[INTEGER_ONE] = {0};
1050 if (data->result_ != 1) {
1051 result[INTEGER_ZERO] = NWebError::BusinessError::CreateError(data->env_, data->result_);
1052 } else {
1053 napi_get_null(data->env_, &result[INTEGER_ZERO]);
1054 }
1055
1056 napi_value onGetCookieFunc = nullptr;
1057 napi_get_reference_value(data->env_, data->callback_, &onGetCookieFunc);
1058
1059 napi_value callbackResult = nullptr;
1060 napi_call_function(data->env_, nullptr, onGetCookieFunc,
1061 INTEGER_ONE, &result[INTEGER_ZERO], &callbackResult);
1062 napi_delete_reference(data->env_, data->callback_);
1063 } else if (data->deferred_) {
1064 napi_value result[INTEGER_ONE] = {0};
1065 if (data->result_ != 1) {
1066 result[INTEGER_ZERO] = NWebError::BusinessError::CreateError(data->env_, data->result_);
1067 napi_reject_deferred(data->env_, data->deferred_, result[INTEGER_ZERO]);
1068 } else {
1069 napi_get_null(data->env_, &result[INTEGER_ZERO]);
1070 napi_resolve_deferred(data->env_, data->deferred_, result[INTEGER_ZERO]);
1071 }
1072 }
1073
1074 napi_close_handle_scope(data->env_, scope);
1075 delete data;
1076 data = nullptr;
1077 delete work;
1078 work = nullptr;
1079 }
1080
OnReceiveValue(long result)1081 void NWebConfigCookieCallbackImpl::OnReceiveValue(long result)
1082 {
1083 WVLOG_D("NWebFetchCookieCallbackImpl received result");
1084 uv_loop_s *loop = nullptr;
1085 uv_work_t *work = nullptr;
1086 napi_get_uv_event_loop(env_, &loop);
1087 if (loop == nullptr) {
1088 WVLOG_E("get uv event loop failed");
1089 return;
1090 }
1091 work = new (std::nothrow) uv_work_t;
1092 if (work == nullptr) {
1093 WVLOG_E("new uv work failed");
1094 return;
1095 }
1096 NapiWebCookieManager::WebConfigCookieManagerParam *param =
1097 new (std::nothrow) NapiWebCookieManager::WebConfigCookieManagerParam();
1098 if (param == nullptr) {
1099 WVLOG_E("new WebConfigCookieManagerParam failed");
1100 delete work;
1101 return;
1102 }
1103 param->env_ = env_;
1104 param->callback_ = callback_;
1105 param->deferred_ = deferred_;
1106 param->result_ = result;
1107
1108 work->data = reinterpret_cast<void*>(param);
1109 int ret = uv_queue_work_with_qos(
1110 loop, work, [](uv_work_t* work) {}, UvJsCallbackThreadWoker, uv_qos_user_initiated);
1111 if (ret != 0) {
1112 if (param != nullptr) {
1113 delete param;
1114 param = nullptr;
1115 }
1116 if (work != nullptr) {
1117 delete work;
1118 work = nullptr;
1119 }
1120 }
1121 }
1122
1123 } // namespace NWeb
1124 } // namespace OHOS
1125