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