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