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