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