1/*
2 * Copyright (c) 2023-2024 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 "arkweb_scheme_handler.h"
17
18#include <memory>
19#include <mutex>
20#include <unordered_map>
21#include <vector>
22
23#include "nweb.h"
24#include "nweb_helper.h"
25#include "nweb_log.h"
26
27namespace {
28
29// Run DO macro for every function defined in the API.
30#define FOR_EACH_API_FN(DO)                             \
31    DO(OH_ArkWebRequestHeaderList_Destroy);             \
32    DO(OH_ArkWebRequestHeaderList_GetSize);             \
33    DO(OH_ArkWebRequestHeaderList_GetHeader);           \
34    DO(OH_ArkWebResourceRequest_GetMethod);             \
35    DO(OH_ArkWebResourceRequest_GetUrl);                \
36    DO(OH_ArkWebResourceRequest_GetHttpBodyStream);     \
37    DO(OH_ArkWebResourceRequest_DestroyHttpBodyStream); \
38    DO(OH_ArkWebResourceRequest_GetResourceType);       \
39    DO(OH_ArkWebResourceRequest_GetFrameUrl);           \
40    DO(OH_ArkWebHttpBodyStream_SetReadCallback);        \
41    DO(OH_ArkWebHttpBodyStream_SetUserData);            \
42    DO(OH_ArkWebHttpBodyStream_GetUserData);            \
43    DO(OH_ArkWebHttpBodyStream_Init);                   \
44    DO(OH_ArkWebHttpBodyStream_Read);                   \
45    DO(OH_ArkWebHttpBodyStream_GetSize);                \
46    DO(OH_ArkWebHttpBodyStream_GetPosition);            \
47    DO(OH_ArkWebHttpBodyStream_IsChunked);              \
48    DO(OH_ArkWebHttpBodyStream_IsEof);                  \
49    DO(OH_ArkWebHttpBodyStream_IsInMemory);             \
50    DO(OH_ArkWebResourceRequest_Destroy);               \
51    DO(OH_ArkWebResourceRequest_SetUserData);           \
52    DO(OH_ArkWebResourceRequest_GetUserData);           \
53    DO(OH_ArkWebResourceRequest_GetReferrer);           \
54    DO(OH_ArkWebResourceRequest_GetRequestHeaders);     \
55    DO(OH_ArkWebResourceRequest_IsRedirect);            \
56    DO(OH_ArkWebResourceRequest_IsMainFrame);           \
57    DO(OH_ArkWebResourceRequest_HasGesture);            \
58    DO(OH_ArkWeb_RegisterCustomSchemes);                \
59    DO(OH_ArkWeb_SetSchemeHandler);                     \
60    DO(OH_ArkWebServiceWorker_SetSchemeHandler);        \
61    DO(OH_ArkWebServiceWorker_ClearSchemeHandlers);     \
62    DO(OH_ArkWeb_ClearSchemeHandlers);                  \
63    DO(OH_ArkWeb_CreateSchemeHandler);                  \
64    DO(OH_ArkWeb_DestroySchemeHandler);                 \
65    DO(OH_ArkWebSchemeHandler_SetOnRequestStart);       \
66    DO(OH_ArkWebSchemeHandler_SetOnRequestStop);        \
67    DO(OH_ArkWebSchemeHandler_SetUserData);             \
68    DO(OH_ArkWebSchemeHandler_GetUserData);             \
69    DO(OH_ArkWeb_CreateResponse);                       \
70    DO(OH_ArkWeb_DestroyResponse);                      \
71    DO(OH_ArkWebResponse_GetUrl);                       \
72    DO(OH_ArkWebResponse_SetUrl);                       \
73    DO(OH_ArkWebResponse_SetError);                     \
74    DO(OH_ArkWebResponse_GetError);                     \
75    DO(OH_ArkWebResponse_SetStatus);                    \
76    DO(OH_ArkWebResponse_GetStatus);                    \
77    DO(OH_ArkWebResponse_SetStatusText);                \
78    DO(OH_ArkWebResponse_GetStatusText);                \
79    DO(OH_ArkWebResponse_SetMimeType);                  \
80    DO(OH_ArkWebResponse_GetMimeType);                  \
81    DO(OH_ArkWebResponse_SetCharset);                   \
82    DO(OH_ArkWebResponse_GetCharset);                   \
83    DO(OH_ArkWebResponse_SetHeaderByName);              \
84    DO(OH_ArkWebResponse_GetHeaderByName);              \
85    DO(OH_ArkWebResourceHandler_Destroy);               \
86    DO(OH_ArkWebResourceHandler_DidReceiveResponse);    \
87    DO(OH_ArkWebResourceHandler_DidReceiveData);        \
88    DO(OH_ArkWebResourceHandler_DidFinish);             \
89    DO(OH_ArkWebResourceHandler_DidFailWithError);      \
90    DO(OH_ArkWeb_ReleaseString);                        \
91    DO(OH_ArkWeb_ReleaseByteArray);                     \
92    DO(OH_ArkWebSchemeHandler_SetFromEts)
93
94struct SchemeHandlerApi {
95#define GEN_FN_PTR(fn) decltype(&(fn)) impl_##fn = nullptr
96    FOR_EACH_API_FN(GEN_FN_PTR);
97#undef GEN_FN_PTR
98};
99
100template<typename Fn>
101void LoadFunction(const char* functionName, Fn* fnOut)
102{
103    void* fn = OHOS::NWeb::NWebHelper::Instance().LoadFuncSymbol(functionName);
104    if (!fn) {
105        WVLOG_E("%{public}s not found.", functionName);
106        return;
107    }
108    *fnOut = reinterpret_cast<Fn>(fn);
109}
110
111SchemeHandlerApi* g_SchemeHandlerApi = nullptr;
112
113void LoadSchemeHandlerApi(SchemeHandlerApi* api)
114{
115    // Initialize each function pointer field from the so.
116#define LOAD_FN_PTR(fn) LoadFunction(#fn, &api->impl_##fn)
117    FOR_EACH_API_FN(LOAD_FN_PTR);
118#undef LOAD_FN_PTR
119}
120
121bool EnsureSdkLoaded()
122{
123    if (g_SchemeHandlerApi) {
124        WVLOG_I("SchemeHandlerApi had loaded.");
125        return true;
126    }
127
128    auto* schemeHandlerApi = new (std::nothrow) SchemeHandlerApi();
129    if (schemeHandlerApi == nullptr) {
130        WVLOG_I("schemeHandlerApi is nullptr.");
131        return false;
132    }
133    LoadSchemeHandlerApi(schemeHandlerApi);
134    g_SchemeHandlerApi = schemeHandlerApi;
135    return true;
136}
137#undef FOR_EACH_API_FN
138} // namespace
139
140using namespace OHOS;
141void OH_ArkWebRequestHeaderList_Destroy(ArkWeb_RequestHeaderList* requestHeaderList)
142{
143    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_Destroy) {
144        WVLOG_E("OH_ArkWebRequestHeaderList_Destroy not found.");
145        return;
146    }
147
148    return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_Destroy(requestHeaderList);
149}
150
151int32_t OH_ArkWebRequestHeaderList_GetSize(const ArkWeb_RequestHeaderList* requestHeaderList)
152{
153    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetSize) {
154        WVLOG_E("OH_ArkWebRequestHeaderList_GetSize not found.");
155        return -1;
156    }
157
158    return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetSize(requestHeaderList);
159}
160
161void OH_ArkWebRequestHeaderList_GetHeader(
162    const ArkWeb_RequestHeaderList* requestHeaderList, int32_t index, char** key, char** value)
163{
164    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetHeader) {
165        WVLOG_E("OH_ArkWebRequestHeaderList_GetHeader not found.");
166        return;
167    }
168
169    return g_SchemeHandlerApi->impl_OH_ArkWebRequestHeaderList_GetHeader(requestHeaderList, index, key, value);
170}
171
172void OH_ArkWebResourceRequest_GetMethod(const ArkWeb_ResourceRequest* resourceRequest, char** method)
173{
174    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetMethod) {
175        WVLOG_E("OH_ArkWebResourceRequest_GetMethod not found.");
176        return;
177    }
178
179    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetMethod(resourceRequest, method);
180}
181
182void OH_ArkWebResourceRequest_GetUrl(const ArkWeb_ResourceRequest* resourceRequest, char** url)
183{
184    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUrl) {
185        WVLOG_E("OH_ArkWebResourceRequest_GetUrl not found.");
186        return;
187    }
188
189    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUrl(resourceRequest, url);
190}
191
192void OH_ArkWebResourceRequest_GetHttpBodyStream(
193    const ArkWeb_ResourceRequest* resourceRequest, ArkWeb_HttpBodyStream** httpBodyStream)
194{
195    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetHttpBodyStream) {
196        WVLOG_E("OH_ArkWebResourceRequest_GetHttpBodyStream not found.");
197        return;
198    }
199
200    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetHttpBodyStream(resourceRequest, httpBodyStream);
201}
202
203void OH_ArkWebResourceRequest_DestroyHttpBodyStream(ArkWeb_HttpBodyStream* httpBodyStream)
204{
205    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_DestroyHttpBodyStream) {
206        WVLOG_E("OH_ArkWebResourceRequest_DestroyHttpBodyStream not found.");
207        return;
208    }
209
210    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_DestroyHttpBodyStream(httpBodyStream);
211}
212
213int32_t OH_ArkWebResourceRequest_GetResourceType(const ArkWeb_ResourceRequest* resourceRequest)
214{
215    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetResourceType) {
216        WVLOG_E("OH_ArkWebResourceRequest_GetResourceType not found.");
217        return -1;
218    }
219
220    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetResourceType(resourceRequest);
221}
222
223void OH_ArkWebResourceRequest_GetFrameUrl(const ArkWeb_ResourceRequest* resourceRequest, char** frameUrl)
224{
225    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetFrameUrl) {
226        WVLOG_E("OH_ArkWebResourceRequest_GetFrameUrl not found.");
227        return;
228    }
229
230    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetFrameUrl(resourceRequest, frameUrl);
231}
232
233int32_t OH_ArkWebHttpBodyStream_SetUserData(ArkWeb_HttpBodyStream* httpBodyStream, void* userData)
234{
235    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetUserData) {
236        WVLOG_E("OH_ArkWebHttpBodyStream_SetUserData not found.");
237        return ARKWEB_ERROR_UNKNOWN;
238    }
239    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetUserData(httpBodyStream, userData);
240}
241
242void* OH_ArkWebHttpBodyStream_GetUserData(const ArkWeb_HttpBodyStream* httpBodyStream)
243{
244    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetUserData) {
245        WVLOG_E("OH_ArkWebHttpBodyStream_GetUserData not found.");
246        return nullptr;
247    }
248    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetUserData(httpBodyStream);
249}
250
251int32_t OH_ArkWebHttpBodyStream_SetReadCallback(
252    ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_HttpBodyStreamReadCallback readCallback)
253{
254    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetReadCallback) {
255        WVLOG_E("OH_ArkWebHttpBodyStream_SetReadCallback not found.");
256        return ARKWEB_ERROR_UNKNOWN;
257    }
258
259    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_SetReadCallback(httpBodyStream, readCallback);
260}
261
262int32_t OH_ArkWebHttpBodyStream_Init(
263    ArkWeb_HttpBodyStream* httpBodyStream, ArkWeb_HttpBodyStreamInitCallback initCallback)
264{
265    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Init) {
266        WVLOG_E("OH_ArkWebHttpBodyStream_Init not found.");
267        return ARKWEB_ERROR_UNKNOWN;
268    }
269
270    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Init(httpBodyStream, initCallback);
271}
272
273void OH_ArkWebHttpBodyStream_Read(const ArkWeb_HttpBodyStream* httpBodyStream, uint8_t* buffer, int bufLen)
274{
275    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Read) {
276        WVLOG_E("OH_ArkWebHttpBodyStream_Read not found.");
277        return;
278    }
279
280    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_Read(httpBodyStream, buffer, bufLen);
281}
282
283uint64_t OH_ArkWebHttpBodyStream_GetSize(const ArkWeb_HttpBodyStream* httpBodyStream)
284{
285    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetSize) {
286        WVLOG_E("OH_ArkWebHttpBodyStream_GetSize not found.");
287        return 0;
288    }
289
290    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetSize(httpBodyStream);
291}
292
293uint64_t OH_ArkWebHttpBodyStream_GetPosition(const ArkWeb_HttpBodyStream* httpBodyStream)
294{
295    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetPosition) {
296        WVLOG_E("OH_ArkWebHttpBodyStream_GetPosition not found.");
297        return 0;
298    }
299
300    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_GetPosition(httpBodyStream);
301}
302
303bool OH_ArkWebHttpBodyStream_IsChunked(const ArkWeb_HttpBodyStream* httpBodyStream)
304{
305    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsChunked) {
306        WVLOG_E("OH_ArkWebHttpBodyStream_IsTrunked not found.");
307        return false;
308    }
309
310    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsChunked(httpBodyStream);
311}
312
313bool OH_ArkWebHttpBodyStream_IsEof(const ArkWeb_HttpBodyStream* httpBodyStream)
314{
315    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsEof) {
316        WVLOG_E("OH_ArkWebHttpBodyStream_HasNullSource not found.");
317        return false;
318    }
319
320    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsEof(httpBodyStream);
321}
322
323bool OH_ArkWebHttpBodyStream_IsInMemory(const ArkWeb_HttpBodyStream* httpBodyStream)
324{
325    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsInMemory) {
326        WVLOG_E("OH_ArkWebHttpBodyStream_IsInMemory not found.");
327        return false;
328    }
329
330    return g_SchemeHandlerApi->impl_OH_ArkWebHttpBodyStream_IsInMemory(httpBodyStream);
331}
332
333int32_t OH_ArkWebResourceRequest_Destroy(const ArkWeb_ResourceRequest* resourceRequest)
334{
335    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_Destroy) {
336        WVLOG_E("OH_ArkWebResourceRequest_Destroy not found.");
337        return ARKWEB_ERROR_UNKNOWN;
338    }
339
340    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_Destroy(resourceRequest);
341}
342
343void OH_ArkWebResourceRequest_GetReferrer(const ArkWeb_ResourceRequest* resourceRequest, char** referrer)
344{
345    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetReferrer) {
346        WVLOG_E("OH_ArkWebResourceRequest_GetReferrer not found.");
347        return;
348    }
349
350    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetReferrer(resourceRequest, referrer);
351}
352
353int32_t OH_ArkWebResourceRequest_SetUserData(ArkWeb_ResourceRequest* resourceRequest, void* userData)
354{
355    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_SetUserData) {
356        WVLOG_E("OH_ArkWebResourceRequest_SetUserData not found.");
357        return ARKWEB_ERROR_UNKNOWN;
358    }
359
360    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_SetUserData(resourceRequest, userData);
361}
362
363void* OH_ArkWebResourceRequest_GetUserData(const ArkWeb_ResourceRequest* resourceRequest)
364{
365    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUserData) {
366        WVLOG_E("OH_ArkWebResourceRequest_GetUserData not found.");
367        return nullptr;
368    }
369
370    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetUserData(resourceRequest);
371}
372
373void OH_ArkWebResourceRequest_GetRequestHeaders(
374    const ArkWeb_ResourceRequest* resourceRequest, ArkWeb_RequestHeaderList** requestHeaderList)
375{
376    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetRequestHeaders) {
377        WVLOG_E("OH_ArkWebResourceRequest_GetRequestHeaders not found.");
378        return;
379    }
380
381    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_GetRequestHeaders(resourceRequest, requestHeaderList);
382}
383
384bool OH_ArkWebResourceRequest_IsRedirect(const ArkWeb_ResourceRequest* resourceRequest)
385{
386    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsRedirect) {
387        WVLOG_E("OH_ArkWebResourceRequest_IsRedirect not found.");
388        return false;
389    }
390
391    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsRedirect(resourceRequest);
392}
393
394bool OH_ArkWebResourceRequest_IsMainFrame(const ArkWeb_ResourceRequest* resourceRequest)
395{
396    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsMainFrame) {
397        WVLOG_E("OH_ArkWebResourceRequest_IsMainFrame not found.");
398        return false;
399    }
400
401    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_IsMainFrame(resourceRequest);
402}
403
404bool OH_ArkWebResourceRequest_HasGesture(const ArkWeb_ResourceRequest* resourceRequest)
405{
406    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_HasGesture) {
407        WVLOG_E("OH_ArkWebResourceRequest_HasGesture not found.");
408        return false;
409    }
410
411    return g_SchemeHandlerApi->impl_OH_ArkWebResourceRequest_HasGesture(resourceRequest);
412}
413
414int32_t OH_ArkWeb_RegisterCustomSchemes(const char* scheme, int32_t option)
415{
416    if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) {
417        if (!EnsureSdkLoaded()) {
418            WVLOG_E("OH_ArkWeb_RegisterCustomSchemes sdk not loaded.");
419        }
420    } else {
421        WVLOG_E("OH_ArkWeb_RegisterCustomSchemes webEngineHandle is nullptr.");
422    }
423
424    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_RegisterCustomSchemes) {
425        WVLOG_E("OH_ArkWeb_RegisterCustomSchemes not found.");
426        return ARKWEB_ERROR_UNKNOWN;
427    }
428
429    return g_SchemeHandlerApi->impl_OH_ArkWeb_RegisterCustomSchemes(scheme, option);
430}
431
432bool OH_ArkWeb_SetSchemeHandler(const char* scheme, const char* webTag, ArkWeb_SchemeHandler* schemeHandler)
433{
434    if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) {
435        if (!EnsureSdkLoaded()) {
436            WVLOG_E("scheme_handler sdk not loaded.");
437        }
438    } else {
439        WVLOG_E("scheme_handler webEngineHandle is nullptr.");
440    }
441    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_SetSchemeHandler) {
442        WVLOG_E("OH_ArkWeb_SetSchemeHandler not found.");
443        return false;
444    }
445
446    return g_SchemeHandlerApi->impl_OH_ArkWeb_SetSchemeHandler(scheme, webTag, schemeHandler);
447}
448
449bool OH_ArkWebServiceWorker_SetSchemeHandler(const char* scheme, ArkWeb_SchemeHandler* schemeHandler)
450{
451    if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) {
452        if (!EnsureSdkLoaded()) {
453            WVLOG_E("scheme_handler sdk not loaded.");
454        }
455    } else {
456        WVLOG_E("scheme_handler webEngineHandle is nullptr.");
457    }
458    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_SetSchemeHandler) {
459        WVLOG_E("OH_ArkWebServiceWorker_SetSchemeHandler not found.");
460        return false;
461    }
462
463    return g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_SetSchemeHandler(scheme, schemeHandler);
464}
465
466int32_t OH_ArkWeb_ClearSchemeHandlers(const char* webTag)
467{
468    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ClearSchemeHandlers) {
469        WVLOG_E("OH_ArkWeb_ClearSchemeHandlers not found.");
470        return ARKWEB_ERROR_UNKNOWN;
471    }
472
473    return g_SchemeHandlerApi->impl_OH_ArkWeb_ClearSchemeHandlers(webTag);
474}
475
476int32_t OH_ArkWebServiceWorker_ClearSchemeHandlers()
477{
478    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_ClearSchemeHandlers) {
479        WVLOG_E("OH_ArkWebServiceWorker_ClearSchemeHandlers not found.");
480        return ARKWEB_ERROR_UNKNOWN;
481    }
482
483    return g_SchemeHandlerApi->impl_OH_ArkWebServiceWorker_ClearSchemeHandlers();
484}
485
486void OH_ArkWeb_CreateSchemeHandler(ArkWeb_SchemeHandler** schemeHandler)
487{
488    if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) {
489        if (!EnsureSdkLoaded()) {
490            WVLOG_E("scheme_handler sdk not loaded.");
491        }
492    } else {
493        WVLOG_E("scheme_handler webEngineHandle is nullptr.");
494    }
495    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_CreateSchemeHandler) {
496        WVLOG_E("OH_ArkWeb_CreateSchemeHandler not found.");
497        return;
498    }
499
500    return g_SchemeHandlerApi->impl_OH_ArkWeb_CreateSchemeHandler(schemeHandler);
501}
502
503void OH_ArkWeb_DestroySchemeHandler(ArkWeb_SchemeHandler* schemeHandler)
504{
505    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_DestroySchemeHandler) {
506        WVLOG_E("OH_ArkWeb_DestroySchemeHandler not found.");
507        return;
508    }
509
510    return g_SchemeHandlerApi->impl_OH_ArkWeb_DestroySchemeHandler(schemeHandler);
511}
512
513int32_t OH_ArkWebSchemeHandler_SetUserData(ArkWeb_SchemeHandler* schemeHandler, void* userData)
514{
515    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetUserData) {
516        WVLOG_E("OH_ArkWebSchemeHandler_SetUserData not found.");
517        return ARKWEB_ERROR_UNKNOWN;
518    }
519    return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetUserData(schemeHandler, userData);
520}
521
522void* OH_ArkWebSchemeHandler_GetUserData(const ArkWeb_SchemeHandler* schemeHandler)
523{
524    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_GetUserData) {
525        WVLOG_E("OH_ArkWebSchemeHandler_GetUserData not found.");
526        return nullptr;
527    }
528    return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_GetUserData(schemeHandler);
529}
530
531int32_t OH_ArkWebSchemeHandler_SetOnRequestStart(
532    ArkWeb_SchemeHandler* schemeHandler, ArkWeb_OnRequestStart onRequestStart)
533{
534    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStart) {
535        WVLOG_E("OH_ArkWebSchemeHandler_SetOnRequestStart not found.");
536        return ARKWEB_ERROR_UNKNOWN;
537    }
538
539    return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStart(schemeHandler, onRequestStart);
540}
541
542int32_t OH_ArkWebSchemeHandler_SetOnRequestStop(
543    ArkWeb_SchemeHandler* schemeHandler, ArkWeb_OnRequestStop onRequestStop)
544{
545    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStop) {
546        WVLOG_E("OH_ArkWebSchemeHandler_SetOnRequestStop not found.");
547        return ARKWEB_ERROR_UNKNOWN;
548    }
549
550    return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetOnRequestStop(schemeHandler, onRequestStop);
551}
552
553void OH_ArkWeb_CreateResponse(ArkWeb_Response** response)
554{
555    if (OHOS::NWeb::NWebHelper::Instance().LoadWebEngine(true, false)) {
556        if (!EnsureSdkLoaded()) {
557            WVLOG_E("scheme_handler sdk not loaded.");
558        }
559    } else {
560        WVLOG_E("scheme_handler webEngineHandle is nullptr.");
561    }
562    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_CreateResponse) {
563        WVLOG_E("OH_ArkWeb_CreateResponse not found.");
564        return;
565    }
566
567    return g_SchemeHandlerApi->impl_OH_ArkWeb_CreateResponse(response);
568}
569
570void OH_ArkWeb_DestroyResponse(ArkWeb_Response* response)
571{
572    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_DestroyResponse) {
573        WVLOG_E("OH_ArkWeb_DestroyResponse not found.");
574        return;
575    }
576
577    return g_SchemeHandlerApi->impl_OH_ArkWeb_DestroyResponse(response);
578}
579
580int32_t OH_ArkWebResponse_SetUrl(ArkWeb_Response* response, const char* url)
581{
582    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetUrl) {
583        WVLOG_E("OH_ArkWebResponse_SetUrl not found.");
584        return ARKWEB_ERROR_UNKNOWN;
585    }
586
587    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetUrl(response, url);
588}
589
590void OH_ArkWebResponse_GetUrl(const ArkWeb_Response* response, char** url)
591{
592    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetUrl) {
593        WVLOG_E("OH_ArkWebResponse_GetUrl not found.");
594        return;
595    }
596
597    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetUrl(response, url);
598}
599
600int32_t OH_ArkWebResponse_SetError(ArkWeb_Response* response, ArkWeb_NetError errorCode)
601{
602    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetError) {
603        WVLOG_E("OH_ArkWebResponse_SetError not found.");
604        return ARKWEB_ERROR_UNKNOWN;
605    }
606
607    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetError(response, errorCode);
608}
609
610ArkWeb_NetError OH_ArkWebResponse_GetError(const ArkWeb_Response* response)
611{
612    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetError) {
613        WVLOG_E("OH_ArkWebResponse_GetError not found.");
614        return ARKWEB_ERR_FAILED;
615    }
616
617    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetError(response);
618}
619
620int32_t OH_ArkWebResponse_SetStatus(ArkWeb_Response* response, int status)
621{
622    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatus) {
623        WVLOG_E("OH_ArkWebResponse_SetStatus not found.");
624        return ARKWEB_ERROR_UNKNOWN;
625    }
626
627    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatus(response, status);
628}
629
630int OH_ArkWebResponse_GetStatus(const ArkWeb_Response* response)
631{
632    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatus) {
633        WVLOG_E("OH_ArkWebResponse_GetStatus not found.");
634        return -1;
635    }
636
637    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatus(response);
638}
639
640int32_t OH_ArkWebResponse_SetStatusText(ArkWeb_Response* response, const char* statusText)
641{
642    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatusText) {
643        WVLOG_E("OH_ArkWebResponse_SetStatusText not found.");
644        return ARKWEB_ERROR_UNKNOWN;
645    }
646
647    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetStatusText(response, statusText);
648}
649
650void OH_ArkWebResponse_GetStatusText(const ArkWeb_Response* response, char** statusText)
651{
652    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatusText) {
653        WVLOG_E("OH_ArkWebResponse_GetStatusText not found.");
654        return;
655    }
656
657    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetStatusText(response, statusText);
658}
659
660int32_t OH_ArkWebResponse_SetMimeType(ArkWeb_Response* response, const char* mimeType)
661{
662    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetMimeType) {
663        WVLOG_E("OH_ArkWebResponse_SetMimeType not found.");
664        return ARKWEB_ERROR_UNKNOWN;
665    }
666
667    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetMimeType(response, mimeType);
668}
669
670void OH_ArkWebResponse_GetMimeType(const ArkWeb_Response* response, char** mimeType)
671{
672    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetMimeType) {
673        WVLOG_E("OH_ArkWebResponse_GetMimeType not found.");
674        return;
675    }
676
677    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetMimeType(response, mimeType);
678}
679
680int32_t OH_ArkWebResponse_SetCharset(ArkWeb_Response* response, const char* charset)
681{
682    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetCharset) {
683        WVLOG_E("OH_ArkWebResponse_SetCharset not found.");
684        return ARKWEB_ERROR_UNKNOWN;
685    }
686
687    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetCharset(response, charset);
688}
689
690void OH_ArkWebResponse_GetCharset(const ArkWeb_Response* response, char** charset)
691{
692    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetCharset) {
693        WVLOG_E("OH_ArkWebResponse_GetCharset not found.");
694        return;
695    }
696
697    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetCharset(response, charset);
698}
699
700int32_t OH_ArkWebResponse_SetHeaderByName(
701    ArkWeb_Response* response, const char* name, const char* value, bool overwrite)
702{
703    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetHeaderByName) {
704        WVLOG_E("OH_ArkWebResponse_SetHeaderByName not found.");
705        return ARKWEB_ERROR_UNKNOWN;
706    }
707
708    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_SetHeaderByName(response, name, value, overwrite);
709}
710
711void OH_ArkWebResponse_GetHeaderByName(const ArkWeb_Response* response, const char* name, char** value)
712{
713    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetHeaderByName) {
714        WVLOG_E("OH_ArkWebResponse_GetHeaderByName not found.");
715        return;
716    }
717
718    return g_SchemeHandlerApi->impl_OH_ArkWebResponse_GetHeaderByName(response, name, value);
719}
720
721int32_t OH_ArkWebResourceHandler_Destroy(const ArkWeb_ResourceHandler* resourceHandler)
722{
723    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_Destroy) {
724        WVLOG_E("OH_ArkWebResourceHandler_Destroy not found.");
725        return ARKWEB_ERROR_UNKNOWN;
726    }
727
728    return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_Destroy(resourceHandler);
729}
730
731int32_t OH_ArkWebResourceHandler_DidReceiveResponse(
732    const ArkWeb_ResourceHandler* resourceHandler, const ArkWeb_Response* response)
733{
734    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveResponse) {
735        WVLOG_E("OH_ArkWebResourceHandler_DidReceiveResponse not found.");
736        return ARKWEB_ERROR_UNKNOWN;
737    }
738
739    return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveResponse(resourceHandler, response);
740}
741
742int32_t OH_ArkWebResourceHandler_DidReceiveData(
743    const ArkWeb_ResourceHandler* resourceHandler, const uint8_t* buffer, int64_t bufLen)
744{
745    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveData) {
746        WVLOG_E("OH_ArkWebResourceHandler_DidReceiveData not found.");
747        return ARKWEB_ERROR_UNKNOWN;
748    }
749
750    return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidReceiveData(resourceHandler, buffer, bufLen);
751}
752
753int32_t OH_ArkWebResourceHandler_DidFinish(const ArkWeb_ResourceHandler* resourceHandler)
754{
755    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFinish) {
756        WVLOG_E("OH_ArkWeb_ResourceHandler_DidFinish not found.");
757        return ARKWEB_ERROR_UNKNOWN;
758    }
759
760    return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFinish(resourceHandler);
761}
762
763int32_t OH_ArkWebResourceHandler_DidFailWithError(
764    const ArkWeb_ResourceHandler* resourceHandler, ArkWeb_NetError errorCode)
765{
766    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFailWithError) {
767        WVLOG_E("OH_ArkWeb_ResourceHandler_DidFailWithError not found.");
768        return ARKWEB_ERROR_UNKNOWN;
769    }
770
771    return g_SchemeHandlerApi->impl_OH_ArkWebResourceHandler_DidFailWithError(resourceHandler, errorCode);
772}
773
774void OH_ArkWeb_ReleaseString(char* string)
775{
776    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseString) {
777        WVLOG_E("OH_ArkWeb_ReleaseString not found.");
778        return;
779    }
780
781    return g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseString(string);
782}
783
784void OH_ArkWeb_ReleaseByteArray(uint8_t* byteArray)
785{
786    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseByteArray) {
787        WVLOG_E("OH_ArkWeb_ReleaseByteArray not found.");
788        return;
789    }
790
791    return g_SchemeHandlerApi->impl_OH_ArkWeb_ReleaseByteArray(byteArray);
792}
793
794int32_t OH_ArkWebSchemeHandler_SetFromEts(
795    ArkWeb_SchemeHandler* schemeHandler, bool fromEts)
796{
797    if (!g_SchemeHandlerApi || !g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetFromEts) {
798        WVLOG_E("impl_OH_ArkWebSchemeHandler_SetFromEts not found.");
799        return ARKWEB_ERROR_UNKNOWN;
800    }
801
802    return g_SchemeHandlerApi->impl_OH_ArkWebSchemeHandler_SetFromEts(schemeHandler, fromEts);
803}
804