Merge "Add callbacks for form repost decision and frame rendering." into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / web-view / web-view-impl.h
1 #ifndef DALI_TOOLKIT_INTERNAL_WEB_VIEW_H
2 #define DALI_TOOLKIT_INTERNAL_WEB_VIEW_H
3
4 /*
5  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/adaptor-framework/web-engine.h>
23 #include <dali/public-api/images/image-operations.h>
24 #include <dali/public-api/object/property-notification.h>
25 #include <memory>
26
27 // INTERNAL INCLUDES
28 #include <dali-toolkit/devel-api/controls/web-view/web-view.h>
29 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
30 #include <dali-toolkit/public-api/controls/control-impl.h>
31 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
32
33 namespace Dali
34 {
35 namespace Toolkit
36 {
37 class KeyEvent;
38 class TouchEvent;
39 class WebBackForwardList;
40 class WebContext;
41 class WebCookieManager;
42 class WebSettings;
43 class WebView;
44
45 namespace Internal
46 {
47 class WebView : public Control
48 {
49 protected:
50   WebView();
51
52   WebView(const std::string& locale, const std::string& timezoneId);
53
54   WebView(int argc, char** argv);
55
56   virtual ~WebView();
57
58 public:
59   /**
60    * @copydoc Dali::Toolkit::WebView::New()
61    */
62   static Toolkit::WebView New();
63
64   /**
65    * @copydoc Dali::Toolkit::WebView::New( const std::string&, const std::string& )
66    */
67   static Toolkit::WebView New(const std::string& locale, const std::string& timezoneId);
68
69   /**
70    * @brief Get settings of WebEngine.
71    */
72   Dali::Toolkit::WebSettings* GetSettings() const;
73
74   /**
75    * @brief Get context of WebEngine.
76    */
77   Dali::Toolkit::WebContext* GetContext() const;
78
79   /**
80    * @brief Get cookie manager of WebEngine.
81    */
82   Dali::Toolkit::WebCookieManager* GetCookieManager() const;
83
84   /**
85    * @brief Get WebBackForwardList of WebEngine.
86    */
87   Dali::Toolkit::WebBackForwardList* GetBackForwardList() const;
88
89   /**
90    * @copydoc Dali::Toolkit::WebView::New( int, char** )
91    */
92   static Toolkit::WebView New(int argc, char** argv);
93
94   /**
95    * @brief Get Favicon of web page.
96    *
97    * @return Handle to a fav icon
98    */
99   Dali::Toolkit::ImageView& GetFavicon();
100
101   /**
102    * @copydoc Dali::Toolkit::WebView::LoadUrl()
103    */
104   void LoadUrl(const std::string& url);
105
106   /**
107    * @copydoc Dali::WebEngine::LoadHTMLString()
108    */
109   void LoadHtmlString(const std::string& htmlString);
110
111   /**
112    * @copydoc Dali::Toolkit::WebView::Reload()
113    */
114   void Reload();
115
116   /**
117    * @copydoc Dali::Toolkit::WebView::StopLoading()
118    */
119   void StopLoading();
120
121   /**
122    * @copydoc Dali::Toolkit::WebView::StopLoading()
123    */
124   void Suspend();
125
126   /**
127    * @copydoc Dali::Toolkit::WebView::Resume()
128    */
129   void Resume();
130
131   /**
132    * @copydoc Dali::Toolkit::WebView::ScrollBy()
133    */
134   void ScrollBy(int deltaX, int deltaY);
135
136   /**
137    * @copydoc Dali::Toolkit::WebView::CanGoForward()
138    */
139   bool CanGoForward();
140
141   /**
142    * @copydoc Dali::Toolkit::WebView::GoForward()
143    */
144   void GoForward();
145
146   /**
147    * @copydoc Dali::Toolkit::WebView::CanGoBack()
148    */
149   bool CanGoBack();
150
151   /**
152    * @copydoc Dali::Toolkit::WebView::GoBack()
153    */
154   void GoBack();
155
156   /**
157    * @copydoc Dali::Toolkit::WebView::EvaluateJavaScript()
158    */
159   void EvaluateJavaScript(const std::string& script, std::function<void(const std::string&)> resultHandler);
160
161   /**
162    * @copydoc Dali::Toolkit::WebView::AddJavaScriptMessageHandler()
163    */
164   void AddJavaScriptMessageHandler(const std::string& exposedObjectName, std::function<void(const std::string&)> handler);
165
166   /**
167    * @copydoc Dali::Toolkit::WebView::RegisterJavaScriptAlertCallback()
168    */
169   void RegisterJavaScriptAlertCallback(Dali::WebEnginePlugin::JavaScriptAlertCallback callback);
170
171   /**
172    * @copydoc Dali::Toolkit::WebView::JavaScriptAlertReply()
173    */
174   void JavaScriptAlertReply();
175
176   /**
177    * @copydoc Dali::Toolkit::WebView::RegisterJavaScriptConfirmCallback()
178    */
179   void RegisterJavaScriptConfirmCallback(Dali::WebEnginePlugin::JavaScriptConfirmCallback callback);
180
181   /**
182    * @copydoc Dali::Toolkit::WebView::JavaScriptConfirmReply()
183    */
184   void JavaScriptConfirmReply(bool confirmed);
185
186   /**
187    * @copydoc Dali::Toolkit::WebView::RegisterJavaScriptPromptCallback()
188    */
189   void RegisterJavaScriptPromptCallback(Dali::WebEnginePlugin::JavaScriptPromptCallback callback);
190
191   /**
192    * @copydoc Dali::Toolkit::WebView::JavaScriptPromptReply()
193    */
194   void JavaScriptPromptReply(const std::string& result);
195
196   /**
197    * @copydoc Dali::Toolkit::WebView::ClearHistory()
198    */
199   void ClearHistory();
200
201   /**
202    * @copydoc Dali::Toolkit::WebView::ClearAllTilesResources()
203    */
204   void ClearAllTilesResources();
205
206   /**
207    * @copydoc Dali::Toolkit::WebView::PageLoadStartedSignal()
208    */
209   Dali::Toolkit::WebView::WebViewPageLoadSignalType& PageLoadStartedSignal();
210
211   /**
212    * @copydoc Dali::Toolkit::WebView::PageLoadInProgressSignal()
213    */
214   Dali::Toolkit::WebView::WebViewPageLoadSignalType& PageLoadInProgressSignal();
215
216   /**
217    * @copydoc Dali::Toolkit::WebView::PageLoadFinishedSignal()
218    */
219   Dali::Toolkit::WebView::WebViewPageLoadSignalType& PageLoadFinishedSignal();
220
221   /**
222    * @copydoc Dali::Toolkit::WebView::PageLoadErrorSignal()
223    */
224   Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType& PageLoadErrorSignal();
225
226   /**
227    * @copydoc Dali::Toolkit::WebView::ScrollEdgeReachedSignal()
228    */
229   Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal();
230
231   /**
232    * @copydoc Dali::Toolkit::WebView::UrlChangedSignal()
233    */
234   Dali::Toolkit::WebView::WebViewUrlChangedSignalType& UrlChangedSignal();
235
236   /**
237    * @copydoc Dali::Toolkit::WebView::FormRepostDecisionSignal()
238    */
239   Dali::Toolkit::WebView::WebViewFormRepostDecisionSignalType& FormRepostDecisionSignal();
240
241   /**
242    * @copydoc Dali::Toolkit::WebView::FrameRenderedSignal()
243    */
244   Dali::Toolkit::WebView::WebViewFrameRenderedSignalType& FrameRenderedSignal();
245
246 public: // Properties
247   /**
248    * @brief Called when a property of an object of this type is set.
249    *
250    * @param[in] object The object whose property is set.
251    * @param[in] index The property index.
252    * @param[in] value The new property value.
253    */
254   static void SetProperty(Dali::BaseObject* object, Dali::Property::Index index, const Dali::Property::Value& value);
255
256   /**
257    * @brief Called to retrieve a property of an object of this type.
258    *
259    * @param[in] object The object whose property is to be retrieved.
260    * @param[in] index The property index.
261    * @return The current value of the property.
262    */
263   static Dali::Property::Value GetProperty(Dali::BaseObject* object, Dali::Property::Index propertyIndex);
264
265   /**
266    * Connects a callback function with the object's signals.
267    * @param[in] object The object providing the signal.
268    * @param[in] tracker Used to disconnect the signal.
269    * @param[in] signalName The signal to connect to.
270    * @param[in] functor A newly allocated FunctorDelegate.
271    * @return True if the signal was connected.
272    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the c
273    */
274   static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor);
275
276 private: // From Control
277   /**
278    * @copydoc Toolkit::Control::OnInitialize()
279    */
280   void OnInitialize() override;
281
282   /**
283    * @copydoc Toolkit::Control::GetNaturalSize
284    */
285   Vector3 GetNaturalSize() override;
286
287   /**
288    * @copydoc Toolkit::Control::OnKeyEvent()
289    */
290   bool OnKeyEvent(const Dali::KeyEvent& event) override;
291
292   /**
293    * @copydoc Toolkit::Control::OnKeyInputFocusGained()
294    */
295   void OnKeyInputFocusGained() override;
296
297   /**
298    * @copydoc Toolkit::Control::OnKeyInputFocusLost()
299    */
300   void OnKeyInputFocusLost() override;
301
302   /**
303    * @copydoc Toolkit::Control::OnSceneConnection()
304    */
305   void OnSceneConnection(int depth) override;
306
307 private:
308   // Undefined
309   WebView(const WebView& webView);
310
311   WebView& operator=(const WebView& webView);
312
313   /**
314    * @brief Sets an absolute scroll of the given view.
315    * @param[in] x The coordinate x of scroll
316    * @param[in] y The coordinate y of scroll
317    */
318   void SetScrollPosition(int x, int y);
319
320   /**
321    * @brief Gets the current scroll position of the given view.
322    * @param[out] x The coordinate x of scroll
323    * @param[out] y The coordinate y of scroll
324    */
325   Dali::Vector2 GetScrollPosition() const;
326
327   /**
328    * @brief Gets the possible scroll size of the given view.
329    * @param[out] width The width of scroll size
330    * @param[out] height The height of scroll size
331    */
332   Dali::Vector2 GetScrollSize() const;
333
334   /**
335    * @brief Gets the last known content's size.
336    * @param[out] width The width of content's size
337    * @param[out] height The height of content's size
338    */
339   Dali::Vector2 GetContentSize() const;
340
341   /**
342    * @brief Returns the title of the Web.
343    *
344    * @return The title of web page
345    */
346   std::string GetTitle() const;
347
348   /**
349    * @brief Sets the background color of web page.
350    * @param[in] color The value of background color.
351    */
352   void SetDocumentBackgroundColor(Dali::Vector4 color);
353
354   /**
355    * @brief Clears tiles when hidden.
356    *
357    * @param[in] cleared Whether tiles are cleared or not
358    */
359   void ClearTilesWhenHidden(bool cleared);
360
361   /**
362    * @brief Sets multiplier of cover area of tile.
363    *
364    * @param[in] multiplier The multiplier of cover area
365    */
366   void SetTileCoverAreaMultiplier(float multiplier);
367
368   /**
369    * @brief Enables cursor by client.
370    * @param[in] enabled Whether cursor is enabled or not.
371    */
372   void EnableCursorByClient(bool enabled);
373
374   /**
375    * @brief Gets the selected text.
376    * @return The selected text
377    */
378   std::string GetSelectedText() const;
379
380   /**
381    * @brief Get user agent string.
382    * @return The string value of user agent
383    */
384   const std::string& GetUserAgent() const;
385
386   /**
387    * @brief Set user agent string.
388    * @param[in] userAgent The string value of user agent
389    */
390   void SetUserAgent(const std::string& userAgent);
391
392   /**
393    * @brief Updates display area of web view.
394    * @param[in] source The soource triggers Notification.
395    */
396   void UpdateDisplayArea(Dali::PropertyNotification& source);
397
398   /**
399    * @brief Enable/Disable video hole for video playing.
400    * @param[in] enabled True if video hole is enabled, false otherwise.
401    */
402   void EnableVideoHole(bool enabled);
403
404   /**
405    * @brief Enable blend mode.
406    * @param[in] blendEnabled True if turn on blend mode, false otherwise.
407    */
408   void EnableBlendMode(bool blendEnabled);
409
410   /**
411    * @brief Enables/disables mouse events. The default is enabled.
412    *
413    * @param[in] enabled True if mouse events are enabled, false otherwise
414    */
415   void EnableMouseEvents(bool enabled);
416
417   /**
418    * @brief Enables/disables key events. The default is enabled.
419    *
420    * @param[in] enabled True if key events enabled, false otherwise
421    */
422   void EnableKeyEvents(bool enabled);
423
424   /**
425    * @brief Callback function to be called when page load started.
426    * @param[in] url The url currently being loaded
427    */
428   void OnPageLoadStarted(const std::string& url);
429
430   /**
431    * @brief Callback function to be called when page is loading in progress.
432    * @param[in] url The url currently being loaded
433    */
434   void OnPageLoadInProgress(const std::string& url);
435
436   /**
437    * @brief Callback function to be called when page load finished.
438    * @param[in] url The url currently being loaded
439    */
440   void OnPageLoadFinished(const std::string& url);
441
442   /**
443    * @brief Callback function to be called when there is an error in page loading.
444    * @param[in] url The url currently being loaded
445    * @param[in] errorCode The error code
446    */
447   void OnPageLoadError(const std::string& url, int errorCode);
448
449   /**
450    * @brief Callback function to be called when scroll edge is reached.
451    * @param[in] e The scroll edge reached.
452    */
453   void OnScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge edge);
454
455   /**
456    * @brief Callback function to be called when url is changed.
457    * @param[in] url The url currently being loaded
458    */
459   void OnUrlChanged(const std::string& url);
460
461   /**
462    * Signal occurs when the Web View has been touched.
463    * @param[in] actor The Actor Touched
464    * @param[in] touch The Touch Data.
465    * @return Whether to consume event or not.
466    */
467   bool OnTouchEvent(Actor actor, const Dali::TouchEvent& touch);
468
469   /**
470    * Signal occurs when the Web View has been hovered.
471    * @param[in] actor The Actor Hovered
472    * @param[in] hover The Hover Data.
473    * @return Whether to consume event or not.
474    */
475   bool OnHoverEvent(Actor actor, const Dali::HoverEvent& hover);
476
477   /**
478    * Signal occurs when the Web View receives wheel event.
479    * @param[in] actor The Actor that receives Wheel event.
480    * @param[in] wheel The Wheel Data.
481    * @return Whether to consume event or not.
482    */
483   bool OnWheelEvent(Actor actor, const Dali::WheelEvent& wheel);
484
485   /**
486    * @brief Callback function to be called when form repost decision need be checked.
487    * @param[in] decision The new decision for form repost
488    */
489   void OnFormRepostDecision(std::shared_ptr<Dali::WebEngineFormRepostDecision> decision);
490
491   /**
492    * @brief Callback function to be called when frame is rendered.
493    */
494   void OnFrameRendered();
495
496 private:
497   std::string                 mUrl;
498   Dali::Toolkit::Visual::Base mVisual;
499   Dali::Size                  mWebViewSize;
500   Dali::WebEngine             mWebEngine;
501
502   Dali::Toolkit::WebView::WebViewPageLoadSignalType          mPageLoadStartedSignal;
503   Dali::Toolkit::WebView::WebViewPageLoadSignalType          mPageLoadInProgressSignal;
504   Dali::Toolkit::WebView::WebViewPageLoadSignalType          mPageLoadFinishedSignal;
505   Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType     mPageLoadErrorSignal;
506   Dali::Toolkit::WebView::WebViewUrlChangedSignalType        mUrlChangedSignal;
507   Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType mScrollEdgeReachedSignal;
508
509   std::unique_ptr<Dali::Toolkit::WebContext>         mWebContext;
510   std::unique_ptr<Dali::Toolkit::WebCookieManager>   mWebCookieManager;
511   std::unique_ptr<Dali::Toolkit::WebSettings>        mWebSettings;
512   std::unique_ptr<Dali::Toolkit::WebBackForwardList> mWebBackForwardList;
513   Dali::Toolkit::ImageView                           mFaviconView;
514
515   Dali::PropertyNotification                          mPositionUpdateNotification;
516   Dali::PropertyNotification                          mSizeUpdateNotification;
517   Dali::PropertyNotification                          mScaleUpdateNotification;
518   bool                                                mVideoHoleEnabled;
519   Dali::Rect<int>                                     mWebViewArea;
520   bool                                                mMouseEventsEnabled;
521   bool                                                mKeyEventsEnabled;
522
523   Dali::Toolkit::WebView::WebViewFormRepostDecisionSignalType mFormRepostDecisionSignal;
524   Dali::Toolkit::WebView::WebViewFrameRenderedSignalType      mFrameRenderedSignal;
525 };
526
527 } // namespace Internal
528
529 inline Toolkit::Internal::WebView& GetImpl(Toolkit::WebView& handle)
530 {
531   DALI_ASSERT_ALWAYS(handle);
532   Dali::RefObject& impl = handle.GetImplementation();
533   return static_cast<Toolkit::Internal::WebView&>(impl);
534 }
535
536 inline const Toolkit::Internal::WebView& GetImpl(const Toolkit::WebView& handle)
537 {
538   DALI_ASSERT_ALWAYS(handle);
539   const Dali::RefObject& impl = handle.GetImplementation();
540   return static_cast<const Toolkit::Internal::WebView&>(impl);
541 }
542
543 } // namespace Toolkit
544
545 } // namespace Dali
546
547 #endif // DALI_TOOLKIT_INTERNAL_WEB_VIEW_H