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