2eeb0925251bec208dd00205dca69dd2cf93bbca
[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) 2020 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 <memory>
23 #include <dali/devel-api/adaptor-framework/web-engine.h>
24 #include <dali/public-api/images/image-operations.h>
25 #include <dali/public-api/object/property-notification.h>
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
36 namespace Toolkit
37 {
38
39 class KeyEvent;
40 class TouchEvent;
41 class WebBackForwardList;
42 class WebContext;
43 class WebCookieManager;
44 class WebSettings;
45 class WebView;
46
47 namespace Internal
48 {
49
50 class WebView : public Control
51 {
52 protected:
53
54   WebView();
55
56   WebView( const std::string& locale, const std::string& timezoneId );
57
58   WebView( int argc, char** argv );
59
60   virtual ~WebView();
61
62 public:
63
64   /**
65    * @copydoc Dali::Toolkit::WebView::New()
66    */
67   static Toolkit::WebView New();
68
69   /**
70    * @copydoc Dali::Toolkit::WebView::New( const std::string&, const std::string& )
71    */
72   static Toolkit::WebView New( const std::string& locale, const std::string& timezoneId );
73
74   /**
75    * @brief Get settings of WebEngine.
76    */
77   Dali::Toolkit::WebSettings* GetSettings() const;
78
79   /**
80    * @brief Get context of WebEngine.
81    */
82   Dali::Toolkit::WebContext* GetContext() const;
83
84   /**
85    * @brief Get cookie manager of WebEngine.
86    */
87   Dali::Toolkit::WebCookieManager* GetCookieManager() const;
88
89   /**
90    * @brief Get WebBackForwardList of WebEngine.
91    */
92   Dali::Toolkit::WebBackForwardList* GetBackForwardList() const;
93
94   /**
95    * @copydoc Dali::Toolkit::WebView::New( int, char** )
96    */
97   static Toolkit::WebView New( int argc, char** argv );
98
99   /**
100    * @brief Get favicon of web page.
101    *
102    * @return Handle to a favicon
103    */
104   Dali::Toolkit::ImageView GetFavicon() const;
105
106   /**
107    * @copydoc Dali::Toolkit::WebView::LoadUrl()
108    */
109   void LoadUrl( const std::string& url );
110
111   /**
112    * @copydoc Dali::WebEngine::LoadHTMLString()
113    */
114   void LoadHtmlString( const std::string& htmlString );
115
116   /**
117    * @copydoc Dali::Toolkit::WebView::Reload()
118    */
119   void Reload();
120
121   /**
122    * @copydoc Dali::Toolkit::WebView::StopLoading()
123    */
124   void StopLoading();
125
126   /**
127    * @copydoc Dali::Toolkit::WebView::StopLoading()
128    */
129   void Suspend();
130
131   /**
132    * @copydoc Dali::Toolkit::WebView::Resume()
133    */
134   void Resume();
135
136   /**
137    * @copydoc Dali::Toolkit::WebView::ScrollBy()
138    */
139   void ScrollBy( int deltaX, int deltaY );
140
141   /**
142    * @copydoc Dali::Toolkit::WebView::CanGoForward()
143    */
144   bool CanGoForward();
145
146   /**
147    * @copydoc Dali::Toolkit::WebView::GoForward()
148    */
149   void GoForward();
150
151   /**
152    * @copydoc Dali::Toolkit::WebView::CanGoBack()
153    */
154   bool CanGoBack();
155
156   /**
157    * @copydoc Dali::Toolkit::WebView::GoBack()
158    */
159   void GoBack();
160
161   /**
162    * @copydoc Dali::Toolkit::WebView::EvaluateJavaScript()
163    */
164   void EvaluateJavaScript( const std::string& script, Dali::WebEnginePlugin::JavaScriptMessageHandlerCallback resultHandler );
165
166   /**
167    * @copydoc Dali::Toolkit::WebView::AddJavaScriptMessageHandler()
168    */
169   void AddJavaScriptMessageHandler( const std::string& exposedObjectName, Dali::WebEnginePlugin::JavaScriptMessageHandlerCallback handler );
170
171   /**
172    * @brief Clears all tiles resources of Web.
173    */
174   void ClearAllTilesResources();
175
176   /**
177    * @copydoc Dali::Toolkit::WebView::ClearHistory()
178    */
179   void ClearHistory();
180
181   /**
182    * @copydoc Dali::Toolkit::WebView::SetTtsFocus()
183    */
184   void SetTtsFocus(bool focused);
185
186   /**
187    * @copydoc Dali::Toolkit::WebView::RegisterPageLoadStartedCallback()
188    */
189   void RegisterPageLoadStartedCallback(Dali::WebEnginePlugin::WebEnginePageLoadCallback callback);
190
191   /**
192    * @copydoc Dali::Toolkit::WebView::RegisterPageLoadFinishedCallback()
193    */
194   void RegisterPageLoadFinishedCallback(Dali::WebEnginePlugin::WebEnginePageLoadCallback callback);
195
196   /**
197    * @copydoc Dali::Toolkit::WebView::RegisterPageLoadErrorCallback()
198    */
199   void RegisterPageLoadErrorCallback(Dali::WebEnginePlugin::WebEnginePageLoadErrorCallback callback);
200
201   /**
202    * @copydoc Dali::Toolkit::WebView::RegisterScrollEdgeReachedCallback()
203    */
204   void RegisterScrollEdgeReachedCallback(Dali::WebEnginePlugin::WebEngineScrollEdgeReachedCallback callback);
205
206   /**
207    * @copydoc Dali::Toolkit::WebView::RegisterUrlChangedCallback()
208    */
209   void RegisterUrlChangedCallback(Dali::WebEnginePlugin::WebEngineUrlChangedCallback callback);
210
211   /**
212    * @copydoc Dali::Toolkit::WebView::RegisterNavigationPolicyDecidedCallback()
213    */
214   void RegisterNavigationPolicyDecidedCallback(Dali::WebEnginePlugin::WebEngineNavigationPolicyDecidedCallback callback);
215
216   /**
217    * @copydoc Dali::Toolkit::WebView::GetPlainTextAsynchronously()
218    */
219   void GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback);
220
221 public: // Properties
222
223   /**
224    * @brief Called when a property of an object of this type is set.
225    *
226    * @param[in] object The object whose property is set.
227    * @param[in] index The property index.
228    * @param[in] value The new property value.
229    */
230   static void SetProperty( Dali::BaseObject* object, Dali::Property::Index index, const Dali::Property::Value& value );
231
232   /**
233    * @brief Called to retrieve a property of an object of this type.
234    *
235    * @param[in] object The object whose property is to be retrieved.
236    * @param[in] index The property index.
237    * @return The current value of the property.
238    */
239   static Dali::Property::Value GetProperty( Dali::BaseObject* object, Dali::Property::Index propertyIndex );
240
241 private: // From Control
242
243   /**
244    * @copydoc Toolkit::Control::OnInitialize()
245    */
246   void OnInitialize() override;
247
248   /**
249    * @copydoc Toolkit::Control::GetNaturalSize
250    */
251   Vector3 GetNaturalSize() override;
252
253   /**
254    * Signal occurs when the Web View has been touched.
255    * @param[in] actor The Actor Touched
256    * @param[in] touch The Touch Data.
257    * @return Whether to consume event or not.
258    */
259   bool OnTouchEvent( Actor actor, const Dali::TouchEvent& touch );
260
261   /**
262    * @copydoc Toolkit::Control::OnKeyEvent()
263    */
264   bool OnKeyEvent( const Dali::KeyEvent& event ) override;
265
266   /**
267    * @copydoc Toolkit::Control::OnKeyInputFocusGained()
268    */
269   void OnKeyInputFocusGained() override;
270
271   /**
272    * @copydoc Toolkit::Control::OnKeyInputFocusLost()
273    */
274   void OnKeyInputFocusLost() override;
275
276   /**
277    * @copydoc Toolkit::Control::OnSceneConnection()
278    */
279   void OnSceneConnection( int depth ) override;
280
281 private:
282
283   // Undefined
284   WebView( const WebView& webView );
285
286   WebView& operator=( const WebView& webView );
287
288   /**
289    * @brief Sets an absolute scroll of the given view.
290    * @param[in] x The coordinate x of scroll
291    * @param[in] y The coordinate y of scroll
292    */
293   void SetScrollPosition( int x, int y );
294
295   /**
296    * @brief Gets the current scroll position of the given view.
297    * @param[out] x The coordinate x of scroll
298    * @param[out] y The coordinate y of scroll
299    */
300   void GetScrollPosition( int& x, int& y ) const;
301
302   /**
303    * @brief Gets the possible scroll size of the given view.
304    * @param[out] width The width of scroll size
305    * @param[out] height The height of scroll size
306    */
307   void GetScrollSize( int& width, int& height ) const;
308
309   /**
310    * @brief Gets the last known content's size.
311    * @param[out] width The width of content's size
312    * @param[out] height The height of content's size
313    */
314   void GetContentSize( int& width, int& height ) const;
315
316   /**
317    * @brief Returns the title of the Web.
318    *
319    * @return The title of web page
320    */
321   std::string GetTitle() const;
322
323   /**
324    * @brief Get user agent string.
325    * @return The string value of user agent
326    */
327   const std::string& GetUserAgent() const;
328
329   /**
330    * @brief Set user agent string.
331    * @param[in] userAgent The string value of user agent
332    */
333   void SetUserAgent( const std::string& userAgent );
334
335   /**
336    * @brief Updates display area of web view.
337    * @param[in] source The soource triggers Notification.
338    */
339   void UpdateDisplayArea( Dali::PropertyNotification& source );
340
341   /**
342    * @brief Enable/Disable video hole for video playing.
343    * @param[in] enabled True if video hole is enabled, false otherwise.
344    */
345   void EnableVideoHole( bool enabled );
346
347   /**
348    * @brief Enable blend mode.
349    * @param[in] blendEnabled True if turn on blend mode, false otherwise.
350    */
351   void EnableBlendMode( bool blendEnabled );
352
353 private:
354
355   std::string                                        mUrl;
356   Dali::Toolkit::Visual::Base                        mVisual;
357   Dali::Size                                         mWebViewSize;
358   Dali::WebEngine                                    mWebEngine;
359
360   std::unique_ptr<Dali::Toolkit::WebContext>         mWebContext;
361   std::unique_ptr<Dali::Toolkit::WebCookieManager>   mWebCookieManager;
362   std::unique_ptr<Dali::Toolkit::WebSettings>        mWebSettings;
363   std::unique_ptr<Dali::Toolkit::WebBackForwardList> mWebBackForwardList;
364
365   Dali::PropertyNotification                         mPositionUpdateNotification;
366   Dali::PropertyNotification                         mSizeUpdateNotification;
367   Dali::PropertyNotification                         mScaleUpdateNotification;
368   bool                                               mVideoHoleEnabled;
369   Dali::Rect< int >                                  mWebViewArea;
370 };
371
372 } // namespace Internal
373
374 inline Toolkit::Internal::WebView& GetImpl( Toolkit::WebView& handle )
375 {
376   DALI_ASSERT_ALWAYS( handle );
377   Dali::RefObject& impl = handle.GetImplementation();
378   return static_cast< Toolkit::Internal::WebView& >( impl );
379 }
380
381 inline const Toolkit::Internal::WebView& GetImpl( const Toolkit::WebView& handle )
382 {
383   DALI_ASSERT_ALWAYS( handle );
384   const Dali::RefObject& impl = handle.GetImplementation();
385   return static_cast< const Toolkit::Internal::WebView& >( impl );
386 }
387
388 } // namespace Toolkit
389
390 } // namespace Dali
391
392 #endif // DALI_TOOLKIT_INTERNAL_WEB_VIEW_H