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