1 /*
2  * Copyright (c) 2021-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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_WEB_WEB_DECLARATION_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_WEB_WEB_DECLARATION_H
18 
19 #include "core/components/declaration/common/declaration.h"
20 #include "core/components/declaration/web/web_client.h"
21 #include "frameworks/bridge/common/dom/dom_type.h"
22 
23 namespace OHOS::Ace {
24 
25 struct WebAttribute : Attribute {
26     std::string src;
27     std::string data;
28 };
29 
30 struct WebEvent : Event {
31     EventMarker pageStartEventId;
32     EventMarker pageFinishEventId;
33     EventMarker titleReceiveEventId;
34     EventMarker geolocationHideEventId;
35     EventMarker geolocationShowEventId;
36     EventMarker requestFocusEventId;
37     EventMarker pageErrorEventId;
38     EventMarker httpErrorEventId;
39     EventMarker messageEventId;
40     EventMarker downloadStartEventId;
41     EventMarker renderExitedEventId;
42     EventMarker refreshAccessedHistoryId;
43     EventMarker resourceLoadId;
44     EventMarker scaleChangeId;
45     EventMarker permissionRequestId;
46     EventMarker searchResultReceiveEventId;
47     EventMarker scrollId;
48     EventMarker fullScreenExitEventId;
49     EventMarker windowExitId;
50     EventMarker overScrollId;
51     EventMarker nativeEmbedLifecycleChangeId;
52     EventMarker nativeEmbedVisibilityChangeId;
53     EventMarker nativeEmbedGestureEventId;
54     EventMarker renderProcessNotRespondingId;
55     EventMarker renderProcessRespondingId;
56     EventMarker viewportFitChangedId;
57     EventMarker adsBlockedEventId;
58 };
59 
60 struct WebMethod : Method {
ReloadWebMethod61     void Reload() const
62     {
63         WebClient::GetInstance().ReloadWebview();
64     }
65 };
66 
67 class ACE_EXPORT WebDeclaration : public Declaration {
68     DECLARE_ACE_TYPE(WebDeclaration, Declaration);
69 
70 public:
71     WebDeclaration() = default;
72     ~WebDeclaration() override = default;
73     WebMethod webMethod;
74 
SetWebSrc(const std::string & src)75     void SetWebSrc(const std::string& src)
76     {
77         auto& attribute = MaybeResetAttribute<WebAttribute>(AttributeTag::SPECIALIZED_ATTR);
78         attribute.src = src;
79     }
80 
GetWebSrc()81     const std::string& GetWebSrc() const
82     {
83         auto& attribute = static_cast<WebAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
84         return attribute.src;
85     }
86 
SetWebData(const std::string & data)87     void SetWebData(const std::string& data)
88     {
89         auto& attribute = MaybeResetAttribute<WebAttribute>(AttributeTag::SPECIALIZED_ATTR);
90         attribute.data = data;
91     }
92 
GetWebData()93     const std::string& GetWebData() const
94     {
95         auto& attribute = static_cast<WebAttribute&>(GetAttribute(AttributeTag::SPECIALIZED_ATTR));
96         return attribute.data;
97     }
98 
SetPageStartedEventId(const EventMarker & pageStartedEventId)99     void SetPageStartedEventId(const EventMarker& pageStartedEventId)
100     {
101         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
102         event.pageStartEventId = pageStartedEventId;
103     }
104 
GetPageStartedEventId()105     const EventMarker& GetPageStartedEventId() const
106     {
107         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
108         return event.pageStartEventId;
109     }
110 
SetPageFinishedEventId(const EventMarker & pageFinishedEventId)111     void SetPageFinishedEventId(const EventMarker& pageFinishedEventId)
112     {
113         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
114         event.pageFinishEventId = pageFinishedEventId;
115     }
116 
GetPageFinishedEventId()117     const EventMarker& GetPageFinishedEventId() const
118     {
119         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
120         return event.pageFinishEventId;
121     }
122 
SetTitleReceiveEventId(const EventMarker & titleReceiveEventId)123     void SetTitleReceiveEventId(const EventMarker& titleReceiveEventId)
124     {
125         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
126         event.titleReceiveEventId = titleReceiveEventId;
127     }
128 
GetTitleReceiveEventId()129     const EventMarker& GetTitleReceiveEventId() const
130     {
131         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
132         return event.titleReceiveEventId;
133     }
134 
SetOnFullScreenExitEventId(const EventMarker & fullScreenExitEventId)135     void SetOnFullScreenExitEventId(const EventMarker& fullScreenExitEventId)
136     {
137         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
138         event.fullScreenExitEventId = fullScreenExitEventId;
139     }
140 
GetOnFullScreenExitEventId()141     const EventMarker& GetOnFullScreenExitEventId() const
142     {
143         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
144         return event.fullScreenExitEventId;
145     }
146 
SetGeolocationHideEventId(const EventMarker & geolocationHideEventId)147     void SetGeolocationHideEventId(const EventMarker& geolocationHideEventId)
148     {
149         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
150         event.geolocationHideEventId = geolocationHideEventId;
151     }
152 
GetGeolocationHideEventId()153     const EventMarker& GetGeolocationHideEventId() const
154     {
155         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
156         return event.geolocationHideEventId;
157     }
158 
SetGeolocationShowEventId(const EventMarker & geolocationShowEventId)159     void SetGeolocationShowEventId(const EventMarker& geolocationShowEventId)
160     {
161         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
162         event.geolocationShowEventId = geolocationShowEventId;
163     }
164 
GetGeolocationShowEventId()165     const EventMarker& GetGeolocationShowEventId() const
166     {
167         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
168         return event.geolocationShowEventId;
169     }
170 
SetDownloadStartEventId(const EventMarker & downloadStartEventId)171     void SetDownloadStartEventId(const EventMarker& downloadStartEventId)
172     {
173         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
174         event.downloadStartEventId = downloadStartEventId;
175     }
176 
GetDownloadStartEventId()177     const EventMarker& GetDownloadStartEventId() const
178     {
179         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
180         return event.downloadStartEventId;
181     }
182 
SetRequestFocusEventId(const EventMarker & requestFocusEventId)183     void SetRequestFocusEventId(const EventMarker& requestFocusEventId)
184     {
185         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
186         event.requestFocusEventId = requestFocusEventId;
187     }
188 
GetRequestFocusEventId()189     const EventMarker& GetRequestFocusEventId() const
190     {
191         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
192         return event.requestFocusEventId;
193     }
194 
SetPageErrorEventId(const EventMarker & pageErrorEventId)195     void SetPageErrorEventId(const EventMarker& pageErrorEventId)
196     {
197         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
198         event.pageErrorEventId = pageErrorEventId;
199     }
200 
GetPageErrorEventId()201     const EventMarker& GetPageErrorEventId() const
202     {
203         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
204         return event.pageErrorEventId;
205     }
206 
SetHttpErrorEventId(const EventMarker & httpErrorEventId)207     void SetHttpErrorEventId(const EventMarker& httpErrorEventId)
208     {
209         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
210         event.httpErrorEventId = httpErrorEventId;
211     }
212 
GetHttpErrorEventId()213     const EventMarker& GetHttpErrorEventId() const
214     {
215         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
216         return event.httpErrorEventId;
217     }
218 
SetMessageEventId(const EventMarker & messageEventId)219     void SetMessageEventId(const EventMarker& messageEventId)
220     {
221         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
222         event.messageEventId = messageEventId;
223     }
224 
GetMessageEventId()225     const EventMarker& GetMessageEventId() const
226     {
227         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
228         return event.messageEventId;
229     }
230 
SetRenderExitedId(const EventMarker & renderExitedEventId)231     void SetRenderExitedId(const EventMarker& renderExitedEventId)
232     {
233         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
234         event.renderExitedEventId = renderExitedEventId;
235     }
236 
GetRenderExitedId()237     const EventMarker& GetRenderExitedId() const
238     {
239         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
240         return event.renderExitedEventId;
241     }
242 
SetRefreshAccessedHistoryId(const EventMarker & refreshAccessedHistoryId)243     void SetRefreshAccessedHistoryId(const EventMarker& refreshAccessedHistoryId)
244     {
245         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
246         event.refreshAccessedHistoryId = refreshAccessedHistoryId;
247     }
248 
GetRefreshAccessedHistoryId()249     const EventMarker& GetRefreshAccessedHistoryId() const
250     {
251         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
252         return event.refreshAccessedHistoryId;
253     }
254 
SetResourceLoadId(const EventMarker & resourceLoadId)255     void SetResourceLoadId(const EventMarker& resourceLoadId)
256     {
257         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
258         event.resourceLoadId = resourceLoadId;
259     }
260 
GetResourceLoadId()261     const EventMarker& GetResourceLoadId() const
262     {
263         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
264         return event.resourceLoadId;
265     }
266 
SetScaleChangeId(const EventMarker & scaleChangeId)267     void SetScaleChangeId(const EventMarker& scaleChangeId)
268     {
269         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
270         event.scaleChangeId = scaleChangeId;
271     }
272 
GetScaleChangeId()273     const EventMarker& GetScaleChangeId() const
274     {
275         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
276         return event.scaleChangeId;
277     }
278 
SetScrollId(const EventMarker & scrollId)279     void SetScrollId(const EventMarker& scrollId)
280     {
281         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
282         event.scrollId = scrollId;
283     }
284 
GetScrollId()285     const EventMarker& GetScrollId() const
286     {
287         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
288         return event.scrollId;
289     }
290 
SetPermissionRequestEventId(const EventMarker & permissionRequestId)291     void SetPermissionRequestEventId(const EventMarker& permissionRequestId)
292     {
293         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
294         event.permissionRequestId = permissionRequestId;
295     }
296 
GetPermissionRequestEventId()297     const EventMarker& GetPermissionRequestEventId() const
298     {
299         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
300         return event.permissionRequestId;
301     }
302 
SetSearchResultReceiveEventId(const EventMarker & searchResultReceiveEventId)303     void SetSearchResultReceiveEventId(const EventMarker& searchResultReceiveEventId)
304     {
305         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
306         event.searchResultReceiveEventId = searchResultReceiveEventId;
307     }
308 
GetSearchResultReceiveEventId()309     const EventMarker& GetSearchResultReceiveEventId() const
310     {
311         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
312         return event.searchResultReceiveEventId;
313     }
314 
SetWindowExitEventId(const EventMarker & windowExitId)315     void SetWindowExitEventId(const EventMarker& windowExitId)
316     {
317         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
318         event.windowExitId = windowExitId;
319     }
320 
GetWindowExitEventId()321     const EventMarker& GetWindowExitEventId() const
322     {
323         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
324         return event.windowExitId;
325     }
326 
SetOverScrollId(const EventMarker & overScrollId)327     void SetOverScrollId(const EventMarker& overScrollId)
328     {
329         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
330         event.overScrollId = overScrollId;
331     }
332 
GetOverScrollId()333     const EventMarker& GetOverScrollId() const
334     {
335         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
336         return event.overScrollId;
337     }
338 
SetNativeEmbedLifecycleChangeId(const EventMarker & embedLifecycleChangeId)339     void SetNativeEmbedLifecycleChangeId(const EventMarker& embedLifecycleChangeId)
340     {
341         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
342         event.nativeEmbedLifecycleChangeId = embedLifecycleChangeId;
343     }
344 
GetNativeEmbedLifecycleChangeId()345     const EventMarker& GetNativeEmbedLifecycleChangeId() const
346     {
347         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
348         return event.nativeEmbedLifecycleChangeId;
349     }
350 
SetNativeEmbedVisibilityChangeId(const EventMarker & embedVisibilityChangeId)351     void SetNativeEmbedVisibilityChangeId(const EventMarker& embedVisibilityChangeId)
352     {
353         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
354         event.nativeEmbedVisibilityChangeId = embedVisibilityChangeId;
355     }
356 
GetNativeEmbedVisibilityChangeId()357     const EventMarker& GetNativeEmbedVisibilityChangeId() const
358     {
359         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
360         return event.nativeEmbedVisibilityChangeId;
361     }
362 
SetNativeEmbedGestureEventId(const EventMarker & embedGestureEventId)363     void SetNativeEmbedGestureEventId(const EventMarker& embedGestureEventId)
364     {
365         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
366         event.nativeEmbedGestureEventId = embedGestureEventId;
367     }
368 
GetNativeEmbedGestureEventId()369     const EventMarker& GetNativeEmbedGestureEventId() const
370     {
371         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
372         return event.nativeEmbedGestureEventId;
373     }
374 
SetRenderProcessNotRespondingId(const EventMarker & renderProcessNotRespondingId)375     void SetRenderProcessNotRespondingId(const EventMarker& renderProcessNotRespondingId)
376     {
377         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
378         event.renderProcessNotRespondingId = renderProcessNotRespondingId;
379     }
380 
GetRenderProcessNotRespondingId()381     const EventMarker& GetRenderProcessNotRespondingId() const
382     {
383         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
384         return event.renderProcessNotRespondingId;
385     }
386 
SetRenderProcessRespondingId(const EventMarker & renderProcessRespondingId)387     void SetRenderProcessRespondingId(const EventMarker& renderProcessRespondingId)
388     {
389         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
390         event.renderProcessRespondingId = renderProcessRespondingId;
391     }
392 
GetRenderProcessRespondingId()393     const EventMarker& GetRenderProcessRespondingId() const
394     {
395         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
396         return event.renderProcessRespondingId;
397     }
398 
SetViewportFitChangedId(const EventMarker & viewportFitChangedId)399     void SetViewportFitChangedId(const EventMarker& viewportFitChangedId)
400     {
401         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
402         event.viewportFitChangedId = viewportFitChangedId;
403     }
404 
GetViewportFitChangedId()405     const EventMarker& GetViewportFitChangedId() const
406     {
407         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
408         return event.viewportFitChangedId;
409     }
410 
SetAdsBlockedEventId(const EventMarker & adsBlockedEventId)411     void SetAdsBlockedEventId(const EventMarker& adsBlockedEventId)
412     {
413         auto& event = MaybeResetEvent<WebEvent>(EventTag::SPECIALIZED_EVENT);
414         event.adsBlockedEventId = adsBlockedEventId;
415     }
416 
GetAdsBlockedEventId()417     const EventMarker& GetAdsBlockedEventId() const
418     {
419         auto& event = static_cast<WebEvent&>(GetEvent(EventTag::SPECIALIZED_EVENT));
420         return event.geolocationShowEventId;
421     }
422 
423 protected:
424     void InitSpecialized() override;
425     bool SetSpecializedAttr(const std::pair<std::string, std::string>& attr) override;
426     bool SetSpecializedEvent(int32_t pageId, const std::string& eventId, const std::string& event) override;
427     void CallSpecializedMethod(const std::string& method, const std::string& args) override;
428 };
429 
430 } // namespace OHOS::Ace
431 
432 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_DECLARATION_WEB_WEB_DECLARATION_H
433