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