1 /*
2  * Copyright (c) 2023 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 FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_WEB_CORS_WEB_OBJECT_EVENT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_WEB_CORS_WEB_OBJECT_EVENT_H
18 
19 #include <string>
20 #include <unordered_map>
21 #include <map>
22 
23 #include "base/json/json_util.h"
24 #include "base/log/log.h"
25 #include "base/memory/referenced.h"
26 #include "base/utils/macros.h"
27 #include "base/utils/noncopyable.h"
28 #include "base/utils/singleton.h"
29 
30 namespace OHOS::Ace {
31 class WebResourceRequestObject : public Referenced {
32 public:
33     virtual std::map<std::string, std::string> GetRequestHeader(void* object) = 0;
34     virtual std::string GetRequestUrl(void* object) = 0;
35     virtual std::string GetMethod(void* object) = 0;
36     virtual bool IsRequestGesture(void* object) = 0;
37     virtual bool IsMainFrame(void* object) = 0;
38     virtual bool IsRedirect(void* object) = 0;
39 };
40 
41 class WebScrollObject : public Referenced {
42 public:
43     virtual float GetX(void* object) = 0;
44     virtual float GetY(void* object) = 0;
45 };
46 
47 class WebScaleChangeObject : public Referenced {
48 public:
49     virtual float GetNewScale(void* object) = 0;
50     virtual float GetOldScale(void* object) = 0;
51 };
52 
53 class WebResourceResponseObject : public Referenced {
54 public:
55     virtual std::map<std::string, std::string> GetResponseHeader(void* object) = 0;
56     virtual std::string GetResponseData(void* object) = 0;
57     virtual std::string GetEncoding(void* object) = 0;
58     virtual std::string GetMimeType(void* object) = 0;
59     virtual std::string GetReason(void* object) = 0;
60     virtual int GetStatusCode(void* object) = 0;
61 };
62 
63 class WebConsoleMessageObject : public Referenced {
64 public:
65     virtual std::string GetMessage(void* object) = 0;
66     virtual int GetMessageLevel(void* object) = 0;
67     virtual std::string GetSourceId(void* object) = 0;
68     virtual int GetLineNumber(void* object) = 0;
69 };
70 
71 class WebCommonDialogObject : public Referenced {
72 public:
73     virtual std::string GetUrl(void* object) = 0;
74     virtual std::string GetMessage(void* object) = 0;
75     virtual std::string GetValue(void* object) = 0;
Confirm(void * object,const std::string & promptResult,int index)76     virtual void Confirm(void* object, const std::string& promptResult, int index) {};
Confirm(void * object,int index)77     virtual void Confirm(void* object, int index) {};
Cancel(void * object,int index)78     virtual void Cancel(void* object, int index) {};
AddObject(void * object)79     virtual int AddObject(void* object)
80     {
81         return 0;
82     };
DelObject(int index)83     virtual void DelObject(int index) {};
84 };
85 
86 class WebPermissionRequestObject : public Referenced {
87 public:
88     virtual std::string GetOrigin(void* object) = 0;
89     virtual int GetResourcesId(void* object) = 0;
Grant(void * object,const int resourcesId,int index)90     virtual void Grant(void* object, const int resourcesId, int index) {};
Deny(void * object,int index)91     virtual void Deny(void* object, int index) {};
AddObject(void * object)92     virtual int AddObject(void* object)
93     {
94         return 0;
95     };
DelObject(int index)96     virtual void DelObject(int index) {};
97 };
98 
99 class WebHttpAuthRequestObject : public Referenced {
100 public:
101     virtual std::string GetHost(void* object) = 0;
102     virtual std::string GetRealm(void* object) = 0;
AddObject(void * object)103     virtual int AddObject(void* object)
104     {
105         return 0;
106     };
DelObject(int index)107     virtual void DelObject(int index) {};
Confirm(void * object,std::string & userName,std::string & pwd,int index)108     virtual bool Confirm(void* object, std::string& userName, std::string& pwd, int index)
109     {
110         return false;
111     };
IsHttpAuthInfoSaved(void * object,int index)112     virtual bool IsHttpAuthInfoSaved(void* object, int index)
113     {
114         return false;
115     };
Cancel(void * object,int index)116     virtual void Cancel(void* object, int index) {};
117 };
118 
119 class WebDownloadResponseObject : public Referenced {
120 public:
121     virtual std::string GetUrl(void* object) = 0;
122     virtual std::string GetMimetype(void* object) = 0;
123     virtual long GetContentLength(void* object) = 0;
124     virtual std::string GetContentDisposition(void* object) = 0;
125     virtual std::string GetUserAgent(void* object) = 0;
126 };
127 
128 class WebFileChooserObject : public Referenced {
129 public:
130     virtual std::string GetTitle(void* object) = 0;
131     virtual int GetMode(void* object) = 0;
132     virtual std::vector<std::string> GetAcceptType(void* object) = 0;
133     virtual bool IsCapture(void* object) = 0;
AddObject(void * object)134     virtual int AddObject(void* object)
135     {
136         return 0;
137     };
DelObject(int index)138     virtual void DelObject(int index) {};
139     virtual void HandleFileList(void* object, std::vector<std::string>& result, int index) = 0;
140 };
141 
142 class WebGeolocationObject : public Referenced {
143 public:
144     virtual std::string GetOrigin(void* object) = 0;
AddObject(void * object)145     virtual int AddObject(void* object)
146     {
147         return 0;
148     };
DelObject(int index)149     virtual void DelObject(int index) {};
150     virtual void Invoke(int index, const std::string& origin, const bool& allow, const bool& retain) = 0;
151 };
152 
153 class WebResourceErrorObject : public Referenced {
154 public:
155     virtual std::string GetErrorInfo(void* object) = 0;
156     virtual int GetErrorCode(void* object) = 0;
157 };
158 
159 class WebObjectEventManager : public Singleton<WebObjectEventManager> {
160     DECLARE_SINGLETON(WebObjectEventManager)
161 public:
162     using EventObJectCallback = std::function<void(const std::string&, void *object)>;
163     using EventObjectWithBoolReturnCallback = std::function<bool(const std::string&, void *object)>;
164 
RegisterObjectEvent(const std::string & eventId,const EventObJectCallback && eventCallback)165     void RegisterObjectEvent(const std::string& eventId, const EventObJectCallback&& eventCallback)
166     {
167         eventObjectMap_[eventId] = std::move(eventCallback);
168     }
169 
RegisterObjectEventWithBoolReturn(const std::string & eventId,const EventObjectWithBoolReturnCallback && eventCallback)170     void RegisterObjectEventWithBoolReturn(
171 		const std::string& eventId, const EventObjectWithBoolReturnCallback&& eventCallback)
172     {
173         TAG_LOGI(AceLogTag::ACE_WEB, "RegisterObjectEventWithBoolReturn %{public}s", eventId.c_str());
174         eventObjectWithBoolReturnMap_[eventId] = std::move(eventCallback);
175     }
176 
UnRegisterObjectEvent(const std::string & eventId)177     void UnRegisterObjectEvent(const std::string& eventId)
178     {
179         eventObjectMap_.erase(eventId);
180     }
181 
UnRegisterObjectEventWithBoolReturn(const std::string & eventId)182     void UnRegisterObjectEventWithBoolReturn(const std::string& eventId)
183     {
184         eventObjectWithBoolReturnMap_.erase(eventId);
185     }
186 
OnObjectEvent(const std::string & eventId,const std::string & param,void * jObject)187     void OnObjectEvent(const std::string& eventId, const std::string& param, void *jObject)
188     {
189         auto event = eventObjectMap_.find(eventId);
190         if (event != eventObjectMap_.end() && event->second) {
191             event->second(param, jObject);
192         } else {
193             TAG_LOGW(AceLogTag::ACE_WEB, "failed to find object eventId = %{public}s", eventId.c_str());
194         }
195     }
196 
OnObjectEventWithBoolReturn(const std::string & eventId,const std::string & param,void * jObject)197     bool OnObjectEventWithBoolReturn(const std::string& eventId, const std::string& param, void *jObject)
198     {
199         TAG_LOGI(AceLogTag::ACE_WEB, "OnObjectEventWithBoolReturn %{public}s", eventId.c_str());
200         auto event = eventObjectWithBoolReturnMap_.find(eventId);
201         if (event != eventObjectWithBoolReturnMap_.end() && event->second) {
202             return event->second(param, jObject);
203         } else {
204             LOGW("failed to find object eventIdWithBoolReturn = %{public}s", eventId.c_str());
205         }
206         return false;
207     }
208 
GetResourceRequestObject()209     const RefPtr<WebResourceRequestObject>& GetResourceRequestObject()
210     {
211         return resourceRequestObject_;
212     }
213 
SetResourceRequestObject(const RefPtr<WebResourceRequestObject> & object)214     void SetResourceRequestObject(const RefPtr<WebResourceRequestObject>& object)
215     {
216         resourceRequestObject_ = object;
217     }
218 
GetResourceErrorObject()219     const RefPtr<WebResourceErrorObject>& GetResourceErrorObject()
220     {
221         return resourceErrorObject_;
222     }
223 
SetResourceErrorObject(const RefPtr<WebResourceErrorObject> & object)224     void SetResourceErrorObject(const RefPtr<WebResourceErrorObject>& object)
225     {
226         resourceErrorObject_ = object;
227     }
228 
GetScrollObject()229     const RefPtr<WebScrollObject>& GetScrollObject()
230     {
231         return scrollObject_;
232     }
233 
SetScrollObject(const RefPtr<WebScrollObject> & object)234     void SetScrollObject(const RefPtr<WebScrollObject>& object)
235     {
236         scrollObject_ = object;
237     }
238 
GetScaleChangeObject()239     const RefPtr<WebScaleChangeObject>& GetScaleChangeObject()
240     {
241         return scaleChangeObject_;
242     }
243 
SetScaleChangeObject(const RefPtr<WebScaleChangeObject> & object)244     void SetScaleChangeObject(const RefPtr<WebScaleChangeObject>& object)
245     {
246         scaleChangeObject_ = object;
247     }
248 
GetResourceResponseObject()249     const RefPtr<WebResourceResponseObject>& GetResourceResponseObject()
250     {
251         return resourceResponseObject_;
252     }
253 
SetResourceResponseObject(const RefPtr<WebResourceResponseObject> & object)254     void SetResourceResponseObject(const RefPtr<WebResourceResponseObject>& object)
255     {
256         resourceResponseObject_ = object;
257     }
258 
GetConsoleMessageObject()259     const RefPtr<WebConsoleMessageObject>& GetConsoleMessageObject()
260     {
261         return consoleMessageObject_;
262     }
263 
SetConsoleMessageObject(const RefPtr<WebConsoleMessageObject> & object)264     void SetConsoleMessageObject(const RefPtr<WebConsoleMessageObject>& object)
265     {
266         consoleMessageObject_ = object;
267     }
268 
GetCommonDialogObject()269     const RefPtr<WebCommonDialogObject>& GetCommonDialogObject()
270     {
271         return commonDialogObject_;
272     }
273 
SetCommonDialogObject(const RefPtr<WebCommonDialogObject> & object)274     void SetCommonDialogObject(const RefPtr<WebCommonDialogObject>& object)
275     {
276         commonDialogObject_ = object;
277     }
278 
GetPermissionRequestObject()279     const RefPtr<WebPermissionRequestObject>& GetPermissionRequestObject()
280     {
281         return permissionRequestObject_;
282     }
283 
SetPermissionRequestObject(const RefPtr<WebPermissionRequestObject> & object)284     void SetPermissionRequestObject(const RefPtr<WebPermissionRequestObject>& object)
285     {
286         permissionRequestObject_ = object;
287     }
288 
GetHttpAuthRequestObject()289     const RefPtr<WebHttpAuthRequestObject>& GetHttpAuthRequestObject()
290     {
291         return httpAuthRequestObject_;
292     }
293 
SetHttpAuthRequestObject(const RefPtr<WebHttpAuthRequestObject> & object)294     void SetHttpAuthRequestObject(const RefPtr<WebHttpAuthRequestObject>& object)
295     {
296         httpAuthRequestObject_ = object;
297     }
298 
GetDownloadResponseObject()299     const RefPtr<WebDownloadResponseObject>& GetDownloadResponseObject()
300     {
301         return downloadResponseObject_;
302     }
303 
SetDownloadResponseObject(const RefPtr<WebDownloadResponseObject> & object)304     void SetDownloadResponseObject(const RefPtr<WebDownloadResponseObject>& object)
305     {
306         downloadResponseObject_ = object;
307     }
308 
GetFileChooserObject()309     const RefPtr<WebFileChooserObject>& GetFileChooserObject()
310     {
311         return fileChooserObject_;
312     }
313 
SetFileChooserObject(const RefPtr<WebFileChooserObject> & object)314     void SetFileChooserObject(const RefPtr<WebFileChooserObject>& object)
315     {
316         fileChooserObject_ = object;
317     }
318 
GetGeolocationObject()319     const RefPtr<WebGeolocationObject>& GetGeolocationObject()
320     {
321         return GeolocationObject_;
322     }
323 
SetGeolocationObject(const RefPtr<WebGeolocationObject> & object)324     void SetGeolocationObject(const RefPtr<WebGeolocationObject>& object)
325     {
326         GeolocationObject_ = object;
327     }
328 
329 private:
330     RefPtr<WebResourceRequestObject> resourceRequestObject_;
331     RefPtr<WebScrollObject> scrollObject_;
332     RefPtr<WebScaleChangeObject> scaleChangeObject_;
333     RefPtr<WebResourceErrorObject> resourceErrorObject_;
334     RefPtr<WebResourceResponseObject> resourceResponseObject_;
335     RefPtr<WebConsoleMessageObject> consoleMessageObject_;
336     RefPtr<WebCommonDialogObject> commonDialogObject_;
337     RefPtr<WebPermissionRequestObject> permissionRequestObject_;
338     RefPtr<WebHttpAuthRequestObject> httpAuthRequestObject_;
339     RefPtr<WebDownloadResponseObject> downloadResponseObject_;
340     RefPtr<WebFileChooserObject> fileChooserObject_;
341     RefPtr<WebGeolocationObject> GeolocationObject_;
342     std::unordered_map<std::string, EventObJectCallback> eventObjectMap_;
343     std::unordered_map<std::string, EventObjectWithBoolReturnCallback> eventObjectWithBoolReturnMap_;
344 };
345 inline WebObjectEventManager::WebObjectEventManager() = default;
346 inline WebObjectEventManager::~WebObjectEventManager() = default;
347 } // namespace OHOS::Ace
348 #endif