1 /*
2  * Copyright (c) 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 #ifndef WEBVIEW_CONTROLLER_IMPL_FFI_H
17 #define WEBVIEW_CONTROLLER_IMPL_FFI_H
18 
19 #include <cstdint>
20 #include <map>
21 #include "ffi_remote_data.h"
22 #include "webview_utils.h"
23 #include "web_errors.h"
24 #include "webview_javascript_result_callback.h"
25 #include "nweb.h"
26 #include "nweb_helper.h"
27 #include "nweb_web_message.h"
28 
29 namespace OHOS::Webview {
30     enum class WebHitTestType : int {
31         EDIT = 0,
32         EMAIL,
33         HTTP,
34         HTTP_IMG,
35         IMG,
36         MAP,
37         PHONE,
38         UNKNOWN
39     };
40 
41     enum class SecurityLevel : int {
42         NONE = 0,
43         SECURE,
44         WARNING,
45         DANGEROUS
46     };
47 
48     enum class CoreSecurityLevel : int {
49         NONE = 0,
50         SECURE = 3,
51         WARNING = 6,
52         DANGEROUS = 5
53     };
54 
55     enum class WebMessageType : int {
56         NOTSUPPORT = 0,
57         STRING,
58         NUMBER,
59         BOOLEAN,
60         ARRAYBUFFER,
61         ARRAY,
62         ERROR
63     };
64 
65     class __attribute__((visibility("default"))) WebviewControllerImpl : public OHOS::FFI::FFIData {
66         DECL_TYPE(WebviewControllerImpl, OHOS::FFI::FFIData)
67     public:
68         explicit WebviewControllerImpl() = default;
69 
70         explicit WebviewControllerImpl(int32_t nwebId);
71 
WebviewControllerImpl(const std::string& webTag)72         explicit WebviewControllerImpl(const std::string& webTag) : webTag_(webTag)
73         {
74             NWeb::NWebHelper::Instance().SetWebTag(-1, webTag_.c_str());
75         };
76 
77         bool IsInit();
78 
79         void SetWebId(int32_t nwebId);
80 
81         void InnerSetHapPath(const std::string &hapPath);
82 
83         int32_t GetWebId() const;
84 
85         int32_t LoadUrl(std::string url);
86 
87         int32_t LoadUrl(std::string url, std::map<std::string, std::string> headers);
88 
89         ErrCode LoadData(std::string data, std::string mimeType, std::string encoding, std::string baseUrl,
90             std::string historyUrl);
91 
92         int32_t PreFetchPage(std::string url);
93 
94         int32_t PreFetchPage(std::string url, std::map<std::string, std::string> headers);
95 
96         int32_t SetAudioMuted(bool mute);
97 
98         void SlideScroll(float vx, float vy);
99 
100         void PutNetworkAvailable(bool enable);
101 
102         void ClearClientAuthenticationCache();
103 
104         void ClearSslCache();
105 
106         void SearchNext(bool forward);
107 
108         void ClearMatches();
109 
110         void SearchAllAsync(std::string str);
111 
112         ErrCode DeleteJavaScriptRegister(const std::string& objName,
113             const std::vector<std::string>& methodList);
114 
115         void Refresh();
116 
117         std::string GetUserAgent();
118 
119         bool AccessForward();
120 
121         bool AccessBackward();
122 
123         int32_t SetCustomUserAgent(const std::string& userAgent);
124 
125         std::string GetCustomUserAgent() const;
126 
127         void RunJavaScript(std::string script, const std::function<void(RetDataCString)>& callbackRef);
128 
129         void RunJavaScriptExt(std::string script, const std::function<void(RetDataI64)>& callbackRef);
130 
131         std::string GetUrl();
132 
133         std::string GetOriginalUrl();
134 
135         void ScrollPageUp(bool top);
136 
137         void ScrollPageDown(bool bottom);
138 
139         void ScrollTo(float x, float y);
140 
141         void ScrollBy(float deltaX, float deltaY);
142 
143         void ScrollToWithAnime(float x, float y, int32_t duration);
144 
145         void ScrollByWithAnime(float deltaX, float deltaY, int32_t duration);
146 
147         void Forward();
148 
149         void Backward();
150 
151         int32_t BackOrForward(int32_t step);
152 
153         int32_t GetPageHeight();
154 
155         std::string GetTitle();
156 
157         int32_t Zoom(float factor);
158 
159         int32_t ZoomIn();
160 
161         int32_t ZoomOut();
162 
163         int32_t RequestFocus();
164 
165         void ClearHistory();
166 
167         bool AccessStep(int32_t step);
168 
169         void OnActive();
170 
171         void OnInactive();
172 
173         int32_t GetHitTest();
174 
175         std::shared_ptr<NWeb::HitTestResult> GetHitTestValue();
176 
177         void StoreWebArchiveCallback(std::string baseName, bool autoName,
178             const std::function<void(RetDataCString)>& callbackRef);
179 
180         void EnableSafeBrowsing(bool enable);
181 
182         bool IsSafeBrowsingEnabled();
183 
184         int32_t GetSecurityLevel();
185 
186         bool IsIncognitoMode();
187 
188         void RemoveCache(bool includeDiskFiles);
189 
190         std::shared_ptr<OHOS::NWeb::NWebHistoryList> GetHistoryList();
191 
192         bool GetFavicon(const void **data, size_t &width, size_t &height,
193             NWeb::ImageColorType &colorType, NWeb::ImageAlphaType &alphaType) const;
194 
195         void SetNWebJavaScriptResultCallBack();
196 
197         void RegisterJavaScriptProxy(const std::vector<std::function<char*(const char*)>>& cjFuncs,
198             const std::string& objName, const std::vector<std::string>& methodList);
199 
200         void Stop();
201 
202         void SetBackForwardCacheOptions(int32_t size, int32_t timeToLive);
203 
204         int32_t PostUrl(std::string& url, std::vector<char>& postData);
205 
206         std::vector<std::string> CreateWebMessagePorts();
207 
208         ErrCode PostWebMessage(std::string& message, std::vector<std::string>& ports, std::string& targetUrl);
209 
210         std::vector<uint8_t> SerializeWebState();
211 
212         bool RestoreWebState(const std::vector<uint8_t> &state) const;
213 
214         bool GetCertChainDerData(std::vector<std::string> &certChainDerData) const;
215 
216         ErrCode HasImagesCallback(const std::function<void(RetDataBool)>& callbackRef);
217 
218         static int32_t CustomizeSchemesArrayDataHandler(CArrScheme schemes);
219 
220     public:
221         static std::string customeSchemeCmdLine_;
222         static bool existNweb_;
223         static bool webDebuggingAccess_;
224 
225     private:
226         int ConverToWebHitTestType(int hitType);
227 
228     private:
229         std::mutex webMtx_;
230         int32_t nwebId_ = -1;
231         std::shared_ptr<WebviewJavaScriptResultCallBackImpl> javaScriptResultCb_ = nullptr;
232         std::string hapPath_ = "";
233         std::string webTag_ = "";
234     };
235 
236     class __attribute__((visibility("default"))) WebHistoryListImpl : public OHOS::FFI::FFIData {
237         DECL_TYPE(WebHistoryListImpl, OHOS::FFI::FFIData)
238     public:
WebHistoryListImpl(std::shared_ptr<NWeb::NWebHistoryList> sptrHistoryList)239         explicit WebHistoryListImpl(std::shared_ptr<NWeb::NWebHistoryList> sptrHistoryList)
240             :sptrHistoryList_(sptrHistoryList) {};
241 
242         int32_t GetCurrentIndex();
243 
244         std::shared_ptr<OHOS::NWeb::NWebHistoryItem> GetItem(int32_t index);
245 
246         int32_t GetListSize();
247     private:
248         std::shared_ptr<OHOS::NWeb::NWebHistoryList> sptrHistoryList_ = nullptr;
249     };
250 
251     class WebMessagePortImpl : public OHOS::FFI::FFIData {
252         DECL_TYPE(WebMessagePortImpl, OHOS::FFI::FFIData)
253     public:
254         WebMessagePortImpl(int32_t nwebId, std::string port, bool isExtentionType);
255 
256         ~WebMessagePortImpl() = default;
257 
258         ErrCode ClosePort();
259 
260         ErrCode PostPortMessage(std::shared_ptr<NWeb::NWebMessage> data);
261 
262         ErrCode SetPortMessageCallback(std::shared_ptr<NWeb::NWebMessageValueCallback> callback);
263 
264         std::string GetPortHandle() const;
265 
IsExtentionType()266         bool IsExtentionType()
267         {
268             return isExtentionType_;
269         }
270 
271     private:
272         int32_t nwebId_ = -1;
273         std::string portHandle_;
274         bool isExtentionType_;
275     };
276 
277     class WebMessageExtImpl : public OHOS::FFI::FFIData {
278         DECL_TYPE(WebMessageExtImpl, OHOS::FFI::FFIData)
279     public:
WebMessageExtImpl(std::shared_ptr<NWeb::NWebMessage> data)280         explicit WebMessageExtImpl(std::shared_ptr<NWeb::NWebMessage> data) : data_(data) {};
281         ~WebMessageExtImpl() = default;
282 
SetType(int type)283         void SetType(int type)
284         {
285             type_ = type;
286             WebMessageType jsType = static_cast<WebMessageType>(type);
287             NWeb::NWebValue::Type nwebType = NWeb::NWebValue::Type::NONE;
288             switch (jsType) {
289                 case WebMessageType::STRING: {
290                     nwebType = NWeb::NWebValue::Type::STRING;
291                     break;
292                 }
293                 case WebMessageType::NUMBER: {
294                     nwebType = NWeb::NWebValue::Type::DOUBLE;
295                     break;
296                 }
297                 case WebMessageType::BOOLEAN: {
298                     nwebType = NWeb::NWebValue::Type::BOOLEAN;
299                     break;
300                 }
301                 case WebMessageType::ARRAYBUFFER: {
302                     nwebType = NWeb::NWebValue::Type::BINARY;
303                     break;
304                 }
305                 case WebMessageType::ARRAY: {
306                     nwebType = NWeb::NWebValue::Type::STRINGARRAY;
307                     break;
308                 }
309                 case WebMessageType::ERROR: {
310                     nwebType = NWeb::NWebValue::Type::ERROR;
311                     break;
312                 }
313                 default: {
314                     nwebType = NWeb::NWebValue::Type::NONE;
315                     break;
316                 }
317             }
318             if (data_) {
319                 data_->SetType(nwebType);
320             }
321         }
322 
ConvertNwebType2JsType(NWeb::NWebValue::Type type)323         int ConvertNwebType2JsType(NWeb::NWebValue::Type type)
324         {
325             WebMessageType jsType = WebMessageType::NOTSUPPORT;
326             switch (type) {
327                 case NWeb::NWebValue::Type::STRING: {
328                     jsType = WebMessageType::STRING;
329                     break;
330                 }
331                 case NWeb::NWebValue::Type::DOUBLE:
332                 case NWeb::NWebValue::Type::INTEGER: {
333                     jsType = WebMessageType::NUMBER;
334                     break;
335                 }
336                 case NWeb::NWebValue::Type::BOOLEAN: {
337                     jsType = WebMessageType::BOOLEAN;
338                     break;
339                 }
340                 case NWeb::NWebValue::Type::STRINGARRAY:
341                 case NWeb::NWebValue::Type::DOUBLEARRAY:
342                 case NWeb::NWebValue::Type::INT64ARRAY:
343                 case NWeb::NWebValue::Type::BOOLEANARRAY: {
344                     jsType = WebMessageType::ARRAY;
345                     break;
346                 }
347                 case NWeb::NWebValue::Type::BINARY: {
348                     jsType = WebMessageType::ARRAYBUFFER;
349                     break;
350                 }
351                 case NWeb::NWebValue::Type::ERROR: {
352                     jsType = WebMessageType::ERROR;
353                     break;
354                 }
355                 default: {
356                     jsType = WebMessageType::NOTSUPPORT;
357                     break;
358                 }
359             }
360             return static_cast<int>(jsType);
361         }
362 
GetType()363         int GetType()
364         {
365             if (data_) {
366                 return ConvertNwebType2JsType(data_->GetType());
367             }
368             return static_cast<int>(WebMessageType::NOTSUPPORT);
369         }
370 
SetString(std::string value)371         void SetString(std::string value)
372         {
373             if (data_) {
374                 data_->SetType(NWeb::NWebValue::Type::STRING);
375                 data_->SetString(value);
376             }
377         }
378 
SetNumber(double value)379         void SetNumber(double value)
380         {
381             if (data_) {
382                 data_->SetType(NWeb::NWebValue::Type::DOUBLE);
383                 data_->SetDouble(value);
384             }
385         }
386 
SetBoolean(bool value)387         void SetBoolean(bool value)
388         {
389             if (data_) {
390                 data_->SetType(NWeb::NWebValue::Type::BOOLEAN);
391                 data_->SetBoolean(value);
392             }
393         }
394 
SetArrayBuffer(std::vector<uint8_t>& value)395         void SetArrayBuffer(std::vector<uint8_t>& value)
396         {
397             if (data_) {
398                 data_->SetType(NWeb::NWebValue::Type::BINARY);
399                 data_->SetBinary(value);
400             }
401         }
402 
SetStringArray(std::vector<std::string> value)403         void SetStringArray(std::vector<std::string> value)
404         {
405             if (data_) {
406                 data_->SetType(NWeb::NWebValue::Type::STRINGARRAY);
407                 data_->SetStringArray(value);
408             }
409         }
410 
SetDoubleArray(std::vector<double> value)411         void SetDoubleArray(std::vector<double> value)
412         {
413             if (data_) {
414                 data_->SetType(NWeb::NWebValue::Type::DOUBLEARRAY);
415                 data_->SetDoubleArray(value);
416             }
417         }
418 
SetInt64Array(std::vector<int64_t> value)419         void SetInt64Array(std::vector<int64_t> value)
420         {
421             if (data_) {
422                 data_->SetType(NWeb::NWebValue::Type::INT64ARRAY);
423                 data_->SetInt64Array(value);
424             }
425         }
426 
SetBooleanArray(std::vector<bool> value)427         void SetBooleanArray(std::vector<bool> value)
428         {
429             if (data_) {
430                 data_->SetType(NWeb::NWebValue::Type::BOOLEANARRAY);
431                 data_->SetBooleanArray(value);
432             }
433         }
434 
SetError(std::string name, std::string message)435         void SetError(std::string name, std::string message)
436         {
437             if (data_) {
438                 data_->SetType(NWeb::NWebValue::Type::ERROR);
439                 data_->SetErrName(name);
440                 data_->SetErrMsg(message);
441             }
442         }
443 
GetData()444         std::shared_ptr<NWeb::NWebMessage> GetData()
445         {
446             return data_;
447         }
448 
449     private:
450         int type_ = 0;
451         std::shared_ptr<NWeb::NWebMessage> data_;
452     };
453 
454     class NWebMessageCallbackImpl : public NWeb::NWebMessageValueCallback {
455     public:
NWebMessageCallbackImpl(std::function<void(RetWebMessage)> callback)456         NWebMessageCallbackImpl(std::function<void(RetWebMessage)> callback)
457             : callback_(callback)
458         {}
459         ~NWebMessageCallbackImpl() = default;
460         void OnReceiveValue(std::shared_ptr<NWeb::NWebMessage> result) override;
461 
462     private:
463         std::function<void(RetWebMessage)> callback_;
464     };
465 
466     class NWebWebMessageExtCallbackImpl : public NWeb::NWebMessageValueCallback {
467     public:
NWebWebMessageExtCallbackImpl(std::function<void(int64_t)> callback)468         NWebWebMessageExtCallbackImpl(std::function<void(int64_t)> callback)
469             : callback_(callback)
470         {}
471         ~NWebWebMessageExtCallbackImpl() = default;
472         void OnReceiveValue(std::shared_ptr<NWeb::NWebMessage> result) override;
473 
474     private:
475         std::function<void(int64_t)> callback_;
476     };
477 }
478 #endif // WEBVIEW_CONTROLLER_IMPL_FFI_H