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