d34782451a1ca8820a0d1681ac223775a506142d
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / controls / web-view / web-view.h
1 #ifndef DALI_TOOLKIT_WEB_VIEW_H
2 #define DALI_TOOLKIT_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 <functional>
23
24 // INTERNAL INCLUDES
25 #include <dali-toolkit/public-api/controls/control.h>
26 #include <dali/devel-api/adaptor-framework/web-engine-plugin.h>
27
28 namespace Dali
29 {
30 namespace Toolkit
31 {
32 class ImageView;
33 class WebBackForwardList;
34 class WebContext;
35 class WebCookieManager;
36 class WebSettings;
37
38 namespace Internal DALI_INTERNAL
39 {
40 class WebView;
41 } // namespace DALI_INTERNAL
42
43 /**
44  * @addtogroup dali_toolkit_controls_web_view
45  * @{
46  */
47
48 /**
49  * @brief WebView is a control for displaying web content.
50  *
51  * This enables embedding web pages in the application.
52  *
53  * For working WebView, a web engine plugin for a platform should be provided.
54  *
55  */
56 class DALI_TOOLKIT_API WebView : public Control
57 {
58 public:
59   /**
60    * @brief Enumeration for the start and end property ranges for this control.
61    */
62   enum PropertyRange
63   {
64     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
65     PROPERTY_END_INDEX   = PROPERTY_START_INDEX + 1000,
66   };
67
68   /**
69    * @brief Enumeration for the instance of properties belonging to the WebView class.
70    */
71   struct Property
72   {
73     enum
74     {
75       /**
76        * @brief The url to load.
77        * @details name "url", type Property::STRING.
78        */
79       URL = PROPERTY_START_INDEX,
80
81       /**
82        * @brief The user agent string.
83        * @details name "userAgent", type Property::STRING.
84        */
85       USER_AGENT,
86
87       /**
88        * @brief The current position of scroll.
89        * @details name "scrollPosition", type Property::VECTOR2.
90        */
91       SCROLL_POSITION,
92
93       /**
94        * @brief The current size of scroll.
95        * @details name "scrollSize", type Property::VECTOR2.
96        * @note The value is read-only.
97        */
98       SCROLL_SIZE,
99
100       /**
101        * @brief The current size of content.
102        * @details name "contentSize", type Property::VECTOR2.
103        * @note The value is read-only.
104        */
105       CONTENT_SIZE,
106
107       /**
108        * @brief The title of web page.
109        * @details name "title", type Property::STRING.
110        * @note The value is read-only.
111        */
112       TITLE,
113
114       /**
115        * @brief Whether video hole is enabled or not.
116        * @details name "videoHoleEnabled", type Property::BOOLEAN.
117        * @note The value is read-only.
118        */
119       VIDEO_HOLE_ENABLED,
120
121       /**
122        * @brief Whether mouse event is enabled.
123        * @details name "mouseEventsEnabled", type Property::BOOLEAN.
124        * @note Default is true.
125        */
126       MOUSE_EVENTS_ENABLED,
127
128       /**
129        * @brief Whether key event is enabled.
130        * @details name "keyEventsEnabled", type Property::BOOLEAN.
131        * @note Default is true.
132        */
133       KEY_EVENTS_ENABLED,
134     };
135   };
136
137   /**
138    * @brief Enumeration for indicating error code of page loading.
139    */
140   enum class LoadErrorCode
141   {
142     UNKNOWN = 0,           ///< Unknown.
143     CANCELED,              ///< User canceled.
144     CANT_SUPPORT_MIMETYPE, ///< Can't show the page for this MIME type.
145     FAILED_FILE_IO,        ///< File IO error.
146     CANT_CONNECT,          ///< Cannot connect to the network.
147     CANT_LOOKUP_HOST,      ///< Fail to look up host from the DNS.
148     FAILED_TLS_HANDSHAKE,  ///< Fail to SSL/TLS handshake.
149     INVALID_CERTIFICATE,   ///< Received certificate is invalid.
150     REQUEST_TIMEOUT,       ///< Connection timeout.
151     TOO_MANY_REDIRECTS,    ///< Too many redirects.
152     TOO_MANY_REQUESTS,     ///< Too many requests during this load.
153     BAD_URL,               ///< Malformed URL.
154     UNSUPPORTED_SCHEME,    ///< Unsupported scheme.
155     AUTHENTICATION,        ///< User authentication failed on the server.
156     INTERNAL_SERVER        ///< Web server has an internal server error.
157   };
158
159   /**
160    * @brief WebView signal type related with page loading.
161    */
162   using WebViewPageLoadSignalType = Signal<void(WebView, const std::string&)>;
163
164   /**
165    * @brief WebView signal type related with page loading error.
166    */
167   using WebViewPageLoadErrorSignalType = Signal<void(WebView, const std::string&, LoadErrorCode)>;
168
169   /**
170    * @brief WebView signal type related with scroll edge reached.
171    */
172   using WebViewScrollEdgeReachedSignalType = Signal<void(WebView, Dali::WebEnginePlugin::ScrollEdge)>;
173
174   /**
175    * @brief WebView signal type related with url changed.
176    */
177   using WebViewUrlChangedSignalType = Signal<void(WebView, const std::string&)>;
178
179 public:
180   /**
181    * @brief Creates an initialized WebView.
182    * @return A handle to a newly allocated Dali WebView
183    *
184    * @note WebView will not display anything
185    */
186   static WebView New();
187
188   /**
189    * @brief Creates an initialized WebView.
190    *
191    * @param [in] locale The locale of Web
192    * @param [in] timezoneId The timezoneId of Web
193    */
194   static WebView New(const std::string& locale, const std::string& timezoneId);
195
196   /**
197    * @brief Creates an initialized WebView.
198    *
199    * @param [in] argc The count of arguments of Applications
200    * @param [in] argv The string array of arguments of Applications
201    */
202   static WebView New(int argc, char** argv);
203
204   /**
205    * @brief Creates an uninitialized WebView.
206    */
207   WebView();
208
209   /**
210    * @brief Destructor.
211    *
212    * This is non-virtual since derived Handel types must not contain data or virtual methods.
213    */
214   ~WebView();
215
216   /*
217    * @brief Copy constructor.
218    *
219    * @param[in] WebView WebView to copy. The copied WebView will point at the same implementation
220    */
221   WebView(const WebView& WebView);
222
223   /**
224    * @brief Assignment operator.
225    *
226    * @param[in] WebView The WebView to assign from
227    * @return The updated WebView
228    */
229   WebView& operator=(const WebView& WebView);
230
231   /**
232    * @brief Downcasts a handle to WebView handle.
233    *
234    * If handle points to a WebView, the downcast produces valid handle.
235    * If not, the returned handle is left uninitialized.
236    *
237    * @param[in] handle Handle to an object
238    * @return Handle to a WebView or an uninitialized handle
239    */
240   static WebView DownCast(BaseHandle handle);
241
242   /**
243    * @brief Get WebSettings of WebEngine.
244    */
245   Dali::Toolkit::WebSettings* GetSettings() const;
246
247   /**
248    * @brief Get WebContext of WebEngine.
249    */
250   Dali::Toolkit::WebContext* GetContext() const;
251
252   /**
253    * @brief Get CookieManager of WebEngine.
254    */
255   Dali::Toolkit::WebCookieManager* GetCookieManager() const;
256
257   /**
258    * @brief Get WebBackForwardList of WebEngine.
259    */
260   Dali::Toolkit::WebBackForwardList* GetBackForwardList() const;
261
262   /**
263    * @brief Get Favicon of web page.
264    *
265    * @return Handle to a fav icon
266    */
267   Dali::Toolkit::ImageView& GetFavicon();
268
269   /**
270    * @brief Loads a web page based on a given URL.
271    *
272    * @param [in] url The URL of the resource to load
273    */
274   void LoadUrl(const std::string& url);
275
276   /**
277    * @brief Loads a given string as web contents.
278    *
279    * @param [in] htmlString The string to use as the contents of the web page
280    */
281   void LoadHtmlString(const std::string& htmlString);
282
283   /**
284    * @brief Reloads the Web.
285    */
286   void Reload();
287
288   /**
289    * @brief Stops loading web contents on the current page.
290    */
291   void StopLoading();
292
293   /**
294    * @brief Suspends the operation associated with the view.
295    */
296   void Suspend();
297
298   /**
299    * @brief Resumes the operation associated with the view object after calling Suspend().
300    */
301   void Resume();
302
303   /**
304    * @brief Scrolls the webpage of view by deltaX and deltaY.
305    * @param[in] deltaX The delta x of scroll
306    * @param[in] deltaY The delta y of scroll
307    */
308   void ScrollBy(int deltaX, int deltaY);
309
310   /**
311    * @brief Returns whether forward is possible.
312    *
313    * @return True if forward is possible, false otherwise
314    */
315   bool CanGoForward();
316
317   /**
318    * @brief Goes forward in the navigation history.
319    */
320   void GoForward();
321
322   /**
323    * @brief Returns whether backward is possible.
324    *
325    * @return True if backward is possible, false otherwise
326    */
327   bool CanGoBack();
328
329   /**
330    * @brief Goes back in the navigation history.
331    */
332   void GoBack();
333
334   /**
335    * @brief Evaluates JavaScript code represented as a string.
336    *
337    * @param[in] script The JavaScript code
338    * @param[in] resultHandler The callback function to be called by the JavaScript runtime. This carries evaluation result.
339    */
340   void EvaluateJavaScript(const std::string& script, std::function<void(const std::string&)> resultHandler);
341
342   /**
343    * @brief Evaluates JavaScript code represented as a string.
344    *
345    * @param[in] script The JavaScript code
346    */
347   void EvaluateJavaScript(const std::string& script);
348
349   /**
350    * @brief Inject a JavaScript object with a message handler into the WebView.
351    *
352    * @note The injected object will appear in the JavaScript context to be loaded next.
353    *
354    * Example:
355    *
356    * 1. Native
357    *
358    *     webview.AddJavaScriptMessageHandler( "myObject", []( const std::string& message ) {
359    *         printf( "Received a message from JS: %s", message.c_str() );
360    *     });
361    *
362    *     // Start WebView by loading URL
363    *     webview.LoadUrl( url );
364    *
365    * 2. JavaScript
366    *
367    *     myObject.postMessage( "Hello World!" ); // "Received a message from JS: Hello World!"
368    *
369    *
370    * @param[in] exposedObjectName The name of exposed object
371    * @param[in] handler The callback function
372    */
373   void AddJavaScriptMessageHandler(const std::string& exposedObjectName, std::function<void(const std::string&)> handler);
374
375   /**
376    * @brief Register alert callback for javascript.
377    *
378    * @param[in] callback The callback function to be called by the JavaScript runtime.
379    */
380   void RegisterJavaScriptAlertCallback(Dali::WebEnginePlugin::JavaScriptAlertCallback callback);
381
382   /**
383    * @brief Reply for JavaScript alert.
384    */
385   void JavaScriptAlertReply();
386
387   /**
388    * @brief Register confirm callback for javascript.
389    *
390    * @param[in] callback The callback function to be called by the JavaScript runtime.
391    */
392   void RegisterJavaScriptConfirmCallback(Dali::WebEnginePlugin::JavaScriptConfirmCallback callback);
393
394   /**
395    * @brief Reply for JavaScript confirm.
396    * @param[in] confirmed True if confirmed, false otherwise
397    */
398   void JavaScriptConfirmReply(bool confirmed);
399
400   /**
401    * @brief Register prompt callback for javascript.
402    *
403    * @param[in] callback The callback function to be called by the JavaScript runtime.
404    */
405   void RegisterJavaScriptPromptCallback(Dali::WebEnginePlugin::JavaScriptPromptCallback callback);
406
407   /**
408    * @brief Reply for JavaScript prompt.
409    * @param[in] result The result from input-field of prompt popup.
410    */
411   void JavaScriptPromptReply(const std::string& result);
412
413   /**
414    * @brief Clears the history of Web.
415    */
416   void ClearHistory();
417
418   /**
419    * @brief Clears all tiles resources of Web.
420    */
421   void ClearAllTilesResources();
422
423   /**
424    * @brief Connects to this signal to be notified when page loading is started.
425    *
426    * @return A signal object to connect with
427    */
428   WebViewPageLoadSignalType& PageLoadStartedSignal();
429
430   /**
431    * @brief Connects to this signal to be notified when page loading is in progress.
432    *
433    * @return A signal object to connect with.
434    */
435   WebViewPageLoadSignalType& PageLoadInProgressSignal();
436
437   /**
438    * @brief Connects to this signal to be notified when page loading is finished.
439    *
440    * @return A signal object to connect with
441    */
442   WebViewPageLoadSignalType& PageLoadFinishedSignal();
443
444   /**
445    * @brief Connects to this signal to be notified when an error occurs in page loading.
446    *
447    * @return A signal object to connect with.
448    */
449   WebViewPageLoadErrorSignalType& PageLoadErrorSignal();
450
451   /**
452    * @brief Connects to this signal to be notified when scroll edge is reached.
453    *
454    * @return A signal object to connect with.
455    */
456   WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal();
457
458   /**
459    * @brief Connects to this signal to be notified when url is changed.
460    *
461    * @return A signal object to connect with.
462    */
463   WebViewUrlChangedSignalType& UrlChangedSignal();
464
465 public: // Not intended for application developers
466   /// @cond internal
467   /**
468    * @brief Creates a handle using the Toolkit::Internal implementation.
469    *
470    * @param[in] implementation The WebView implementation
471    */
472   DALI_INTERNAL WebView(Internal::WebView& implementation);
473
474   /**
475    * @brief Allows the creation of this WebView from an Internal::CustomActor pointer.
476    *
477    * @param[in] internal A pointer to the internal CustomActor
478    */
479   explicit DALI_INTERNAL WebView(Dali::Internal::CustomActor* internal);
480   /// @endcond
481 };
482
483 /**
484  * @}
485  */
486
487 } // namespace Toolkit
488
489 } // namespace Dali
490
491 #endif // DALI_TOOLKIT_WEB_VIEW_H