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