• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "napi_web_cookie_manager.h"
17 
18 #include <cstdint>
19 #include <uv.h>
20 #include <vector>
21 
22 #include "business_error.h"
23 #include "napi/native_common.h"
24 #include "nweb_cookie_manager.h"
25 #include "nweb_helper.h"
26 #include "nweb_log.h"
27 #include "napi_parse_utils.h"
28 #include "web_errors.h"
29 #include "securec.h"
30 
31 namespace OHOS {
32 namespace NWeb {
Init(napi_env env,napi_value exports)33 napi_value NapiWebCookieManager::Init(napi_env env, napi_value exports)
34 {
35     napi_property_descriptor properties[] = {
36         DECLARE_NAPI_STATIC_FUNCTION("getCookie", NapiWebCookieManager::JsGetCookie),
37         DECLARE_NAPI_STATIC_FUNCTION("fetchCookieSync", NapiWebCookieManager::JsGetCookie),
38         DECLARE_NAPI_STATIC_FUNCTION("fetchCookie", NapiWebCookieManager::JsFetchCookieAsync),
39         DECLARE_NAPI_STATIC_FUNCTION("setCookie", NapiWebCookieManager::JsSetCookie),
40         DECLARE_NAPI_STATIC_FUNCTION("configCookieSync", NapiWebCookieManager::JsSetCookie),
41         DECLARE_NAPI_STATIC_FUNCTION("configCookie", NapiWebCookieManager::JsConfigCookieAsync),
42         DECLARE_NAPI_STATIC_FUNCTION("isCookieAllowed", NapiWebCookieManager::JsIsCookieAllowed),
43         DECLARE_NAPI_STATIC_FUNCTION("putAcceptCookieEnabled", NapiWebCookieManager::JsPutAcceptCookieEnabled),
44         DECLARE_NAPI_STATIC_FUNCTION("isThirdPartyCookieAllowed",
45                                      NapiWebCookieManager::JsIsThirdPartyCookieAllowed),
46         DECLARE_NAPI_STATIC_FUNCTION("putAcceptThirdPartyCookieEnabled",
47                                      NapiWebCookieManager::JsPutAcceptThirdPartyCookieEnabled),
48         DECLARE_NAPI_STATIC_FUNCTION("existCookie", NapiWebCookieManager::JsExistCookie),
49         DECLARE_NAPI_STATIC_FUNCTION("deleteEntireCookie", NapiWebCookieManager::JsDeleteEntireCookie),
50         DECLARE_NAPI_STATIC_FUNCTION("clearAllCookiesSync", NapiWebCookieManager::JsDeleteEntireCookie),
51         DECLARE_NAPI_STATIC_FUNCTION("clearAllCookies", NapiWebCookieManager::JsClearAllCookiesAsync),
52         DECLARE_NAPI_STATIC_FUNCTION("deleteSessionCookie", NapiWebCookieManager::JsDeleteSessionCookie),
53         DECLARE_NAPI_STATIC_FUNCTION("clearSessionCookieSync", NapiWebCookieManager::JsDeleteSessionCookie),
54         DECLARE_NAPI_STATIC_FUNCTION("clearSessionCookie", NapiWebCookieManager::JsClearSessionCookieAsync),
55         DECLARE_NAPI_STATIC_FUNCTION("saveCookieAsync", NapiWebCookieManager::JsSaveCookieAsync),
56     };
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