5a76ab5ad2c5374cc47ac9836ec46642cec79ff9
[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    * @brief Clears all tiles resources of Web.
168    */
169   void ClearAllTilesResources();
170
171   /**
172    * @copydoc Dali::Toolkit::WebView::ClearHistory()
173    */
174   void ClearHistory();
175
176   /**
177    * @copydoc Dali::Toolkit::WebView::PageLoadStartedSignal()
178    */
179   Dali::Toolkit::WebView::WebViewPageLoadSignalType& PageLoadStartedSignal();
180
181   /**
182    * @copydoc Dali::Toolkit::WebView::PageLoadFinishedSignal()
183    */
184   Dali::Toolkit::WebView::WebViewPageLoadSignalType& PageLoadFinishedSignal();
185
186   /**
187    * @copydoc Dali::Toolkit::WebView::PageLoadErrorSignal()
188    */
189   Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType& PageLoadErrorSignal();
190
191   /**
192    * @copydoc Dali::Toolkit::WebView::ScrollEdgeReachedSignal()
193    */
194   Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal();
195
196 public: // Properties
197   /**
198    * @brief Called when a property of an object of this type is set.
199    *
200    * @param[in] object The object whose property is set.
201    * @param[in] index The property index.
202    * @param[in] value The new property value.
203    */
204   static void SetProperty(Dali::BaseObject* object, Dali::Property::Index index, const Dali::Property::Value& value);
205
206   /**
207    * @brief Called to retrieve a property of an object of this type.
208    *
209    * @param[in] object The object whose property is to be retrieved.
210    * @param[in] index The property index.
211    * @return The current value of the property.
212    */
213   static Dali::Property::Value GetProperty(Dali::BaseObject* object, Dali::Property::Index propertyIndex);
214
215   /**
216    * Connects a callback function with the object's signals.
217    * @param[in] object The object providing the signal.
218    * @param[in] tracker Used to disconnect the signal.
219    * @param[in] signalName The signal to connect to.
220    * @param[in] functor A newly allocated FunctorDelegate.
221    * @return True if the signal was connected.
222    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the c
223    */
224   static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor);
225
226 private: // From Control
227   /**
228    * @copydoc Toolkit::Control::OnInitialize()
229    */
230   void OnInitialize() override;
231
232   /**
233    * @copydoc Toolkit::Control::GetNaturalSize
234    */
235   Vector3 GetNaturalSize() override;
236
237   /**
238    * Signal occurs when the Web View has been touched.
239    * @param[in] actor The Actor Touched
240    * @param[in] touch The Touch Data.
241    * @return Whether to consume event or not.
242    */
243   bool OnTouchEvent(Actor actor, const Dali::TouchEvent& touch);
244
245   /**
246    * @copydoc Toolkit::Control::OnKeyEvent()
247    */
248   bool OnKeyEvent(const Dali::KeyEvent& event) override;
249
250   /**
251    * @copydoc Toolkit::Control::OnKeyInputFocusGained()
252    */
253   void OnKeyInputFocusGained() override;
254
255   /**
256    * @copydoc Toolkit::Control::OnKeyInputFocusLost()
257    */
258   void OnKeyInputFocusLost() override;
259
260   /**
261    * @copydoc Toolkit::Control::OnSceneConnection()
262    */
263   void OnSceneConnection(int depth) override;
264
265 private:
266   // Undefined
267   WebView(const WebView& webView);
268
269   WebView& operator=(const WebView& webView);
270
271   /**
272    * @brief Sets an absolute scroll of the given view.
273    * @param[in] x The coordinate x of scroll
274    * @param[in] y The coordinate y of scroll
275    */
276   void SetScrollPosition(int x, int y);
277
278   /**
279    * @brief Gets the current scroll position of the given view.
280    * @param[out] x The coordinate x of scroll
281    * @param[out] y The coordinate y of scroll
282    */
283   Dali::Vector2 GetScrollPosition() const;
284
285   /**
286    * @brief Gets the possible scroll size of the given view.
287    * @param[out] width The width of scroll size
288    * @param[out] height The height of scroll size
289    */
290   Dali::Vector2 GetScrollSize() const;
291
292   /**
293    * @brief Gets the last known content's size.
294    * @param[out] width The width of content's size
295    * @param[out] height The height of content's size
296    */
297   Dali::Vector2 GetContentSize() const;
298
299   /**
300    * @brief Returns the title of the Web.
301    *
302    * @return The title of web page
303    */
304   std::string GetTitle() const;
305
306   /**
307    * @brief Get user agent string.
308    * @return The string value of user agent
309    */
310   const std::string& GetUserAgent() const;
311
312   /**
313    * @brief Set user agent string.
314    * @param[in] userAgent The string value of user agent
315    */
316   void SetUserAgent(const std::string& userAgent);
317
318   /**
319    * @brief Updates display area of web view.
320    * @param[in] source The soource triggers Notification.
321    */
322   void UpdateDisplayArea(Dali::PropertyNotification& source);
323
324   /**
325    * @brief Enable/Disable video hole for video playing.
326    * @param[in] enabled True if video hole is enabled, false otherwise.
327    */
328   void EnableVideoHole(bool enabled);
329
330   /**
331    * @brief Enable blend mode.
332    * @param[in] blendEnabled True if turn on blend mode, false otherwise.
333    */
334   void EnableBlendMode(bool blendEnabled);
335
336   /**
337    * @brief Callback function to be called when page load started.
338    * @param[in] url The url currently being loaded
339    */
340   void OnPageLoadStarted(const std::string& url);
341
342   /**
343    * @brief Callback function to be called when page load finished.
344    * @param[in] url The url currently being loaded
345    */
346   void OnPageLoadFinished(const std::string& url);
347
348   /**
349    * @brief Callback function to be called when there is an error in page loading.
350    * @param[in] url The url currently being loaded
351    * @param[in] errorCode The error code
352    */
353   void OnPageLoadError(const std::string& url, int errorCode);
354
355   /**
356    * @brief Callback function to be called when scroll edge is reached.
357    * @param[in] e The scroll edge reached.
358    */
359   void OnScrollEdgeReached(Dali::WebEnginePlugin::ScrollEdge edge);
360
361 private:
362   std::string                 mUrl;
363   Dali::Toolkit::Visual::Base mVisual;
364   Dali::Size                  mWebViewSize;
365   Dali::WebEngine             mWebEngine;
366
367   Dali::Toolkit::WebView::WebViewPageLoadSignalType          mPageLoadStartedSignal;
368   Dali::Toolkit::WebView::WebViewPageLoadSignalType          mPageLoadFinishedSignal;
369   Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType     mPageLoadErrorSignal;
370   Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType mScrollEdgeReachedSignal;
371
372   std::unique_ptr<Dali::Toolkit::WebContext>         mWebContext;
373   std::unique_ptr<Dali::Toolkit::WebCookieManager>   mWebCookieManager;
374   std::unique_ptr<Dali::Toolkit::WebSettings>        mWebSettings;
375   std::unique_ptr<Dali::Toolkit::WebBackForwardList> mWebBackForwardList;
376   Dali::Toolkit::ImageView                           mFaviconView;
377
378   Dali::PropertyNotification mPositionUpdateNotification;
379   Dali::PropertyNotification mSizeUpdateNotification;
380   Dali::PropertyNotification mScaleUpdateNotification;
381   bool                       mVideoHoleEnabled;
382   Dali::Rect<int>            mWebViewArea;
383 };
384
385 } // namespace Internal
386
387 inline Toolkit::Internal::WebView& GetImpl(Toolkit::WebView& handle)
388 {
389   DALI_ASSERT_ALWAYS(handle);
390   Dali::RefObject& impl = handle.GetImplementation();
391   return static_cast<Toolkit::Internal::WebView&>(impl);
392 }
393
394 inline const Toolkit::Internal::WebView& GetImpl(const Toolkit::WebView& handle)
395 {
396   DALI_ASSERT_ALWAYS(handle);
397   const Dali::RefObject& impl = handle.GetImplementation();
398   return static_cast<const Toolkit::Internal::WebView&>(impl);
399 }
400
401 } // namespace Toolkit
402
403 } // namespace Dali
404
405 #endif // DALI_TOOLKIT_INTERNAL_WEB_VIEW_H