13ce3c054a21b458f67a00940b7f4d69b9519514
[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
123   /**
124    * @brief Enumeration for indicating error code of page loading.
125    */
126   enum class LoadErrorCode
127   {
128     UNKNOWN = 0,           ///< Unknown.
129     CANCELED,              ///< User canceled.
130     CANT_SUPPORT_MIMETYPE, ///< Can't show the page for this MIME type.
131     FAILED_FILE_IO,        ///< File IO error.
132     CANT_CONNECT,          ///< Cannot connect to the network.
133     CANT_LOOKUP_HOST,      ///< Fail to look up host from the DNS.
134     FAILED_TLS_HANDSHAKE,  ///< Fail to SSL/TLS handshake.
135     INVALID_CERTIFICATE,   ///< Received certificate is invalid.
136     REQUEST_TIMEOUT,       ///< Connection timeout.
137     TOO_MANY_REDIRECTS,    ///< Too many redirects.
138     TOO_MANY_REQUESTS,     ///< Too many requests during this load.
139     BAD_URL,               ///< Malformed URL.
140     UNSUPPORTED_SCHEME,    ///< Unsupported scheme.
141     AUTHENTICATION,        ///< User authentication failed on the server.
142     INTERNAL_SERVER        ///< Web server has an internal server error.
143   };
144
145   /**
146    * @brief WebView signal type related with page loading.
147    */
148   using WebViewPageLoadSignalType = Signal<void(WebView, const std::string&)>;
149
150   /**
151    * @brief WebView signal type related with page loading error.
152    */
153   using WebViewPageLoadErrorSignalType = Signal<void(WebView, const std::string&, LoadErrorCode)>;
154
155   /**
156    * @brief WebView signal type related with scroll edge reached.
157    */
158   using WebViewScrollEdgeReachedSignalType = Signal<void(WebView, Dali::WebEnginePlugin::ScrollEdge)>;
159
160   /**
161    * @brief WebView signal type related with url changed.
162    */
163   using WebViewUrlChangedSignalType = Signal<void(WebView, const std::string&)>;
164
165 public:
166   /**
167    * @brief Creates an initialized WebView.
168    * @return A handle to a newly allocated Dali WebView
169    *
170    * @note WebView will not display anything
171    */
172   static WebView New();
173
174   /**
175    * @brief Creates an initialized WebView.
176    *
177    * @param [in] locale The locale of Web
178    * @param [in] timezoneId The timezoneId of Web
179    */
180   static WebView New(const std::string& locale, const std::string& timezoneId);
181
182   /**
183    * @brief Creates an initialized WebView.
184    *
185    * @param [in] argc The count of arguments of Applications
186    * @param [in] argv The string array of arguments of Applications
187    */
188   static WebView New(int argc, char** argv);
189
190   /**
191    * @brief Creates an uninitialized WebView.
192    */
193   WebView();
194
195   /**
196    * @brief Destructor.
197    *
198    * This is non-virtual since derived Handel types must not contain data or virtual methods.
199    */
200   ~WebView();
201
202   /*
203    * @brief Copy constructor.
204    *
205    * @param[in] WebView WebView to copy. The copied WebView will point at the same implementation
206    */
207   WebView(const WebView& WebView);
208
209   /**
210    * @brief Assignment operator.
211    *
212    * @param[in] WebView The WebView to assign from
213    * @return The updated WebView
214    */
215   WebView& operator=(const WebView& WebView);
216
217   /**
218    * @brief Downcasts a handle to WebView handle.
219    *
220    * If handle points to a WebView, the downcast produces valid handle.
221    * If not, the returned handle is left uninitialized.
222    *
223    * @param[in] handle Handle to an object
224    * @return Handle to a WebView or an uninitialized handle
225    */
226   static WebView DownCast(BaseHandle handle);
227
228   /**
229    * @brief Get WebSettings of WebEngine.
230    */
231   Dali::Toolkit::WebSettings* GetSettings() const;
232
233   /**
234    * @brief Get WebContext of WebEngine.
235    */
236   Dali::Toolkit::WebContext* GetContext() const;
237
238   /**
239    * @brief Get CookieManager of WebEngine.
240    */
241   Dali::Toolkit::WebCookieManager* GetCookieManager() const;
242
243   /**
244    * @brief Get WebBackForwardList of WebEngine.
245    */
246   Dali::Toolkit::WebBackForwardList* GetBackForwardList() const;
247
248   /**
249    * @brief Get Favicon of web page.
250    *
251    * @return Handle to a fav icon
252    */
253   Dali::Toolkit::ImageView& GetFavicon();
254
255   /**
256    * @brief Loads a web page based on a given URL.
257    *
258    * @param [in] url The URL of the resource to load
259    */
260   void LoadUrl(const std::string& url);
261
262   /**
263    * @brief Loads a given string as web contents.
264    *
265    * @param [in] htmlString The string to use as the contents of the web page
266    */
267   void LoadHtmlString(const std::string& htmlString);
268
269   /**
270    * @brief Reloads the Web.
271    */
272   void Reload();
273
274   /**
275    * @brief Stops loading web contents on the current page.
276    */
277   void StopLoading();
278
279   /**
280    * @brief Suspends the operation associated with the view.
281    */
282   void Suspend();
283
284   /**
285    * @brief Resumes the operation associated with the view object after calling Suspend().
286    */
287   void Resume();
288
289   /**
290    * @brief Scrolls the webpage of view by deltaX and deltaY.
291    * @param[in] deltaX The delta x of scroll
292    * @param[in] deltaY The delta y of scroll
293    */
294   void ScrollBy(int deltaX, int deltaY);
295
296   /**
297    * @brief Returns whether forward is possible.
298    *
299    * @return True if forward is possible, false otherwise
300    */
301   bool CanGoForward();
302
303   /**
304    * @brief Goes forward in the navigation history.
305    */
306   void GoForward();
307
308   /**
309    * @brief Returns whether backward is possible.
310    *
311    * @return True if backward is possible, false otherwise
312    */
313   bool CanGoBack();
314
315   /**
316    * @brief Goes back in the navigation history.
317    */
318   void GoBack();
319
320   /**
321    * @brief Evaluates JavaScript code represented as a string.
322    *
323    * @param[in] script The JavaScript code
324    * @param[in] resultHandler The callback function to be called by the JavaScript runtime. This carries evaluation result.
325    */
326   void EvaluateJavaScript(const std::string& script, std::function<void(const std::string&)> resultHandler);
327
328   /**
329    * @brief Evaluates JavaScript code represented as a string.
330    *
331    * @param[in] script The JavaScript code
332    */
333   void EvaluateJavaScript(const std::string& script);
334
335   /**
336    * @brief Inject a JavaScript object with a message handler into the WebView.
337    *
338    * @note The injected object will appear in the JavaScript context to be loaded next.
339    *
340    * Example:
341    *
342    * 1. Native
343    *
344    *     webview.AddJavaScriptMessageHandler( "myObject", []( const std::string& message ) {
345    *         printf( "Received a message from JS: %s", message.c_str() );
346    *     });
347    *
348    *     // Start WebView by loading URL
349    *     webview.LoadUrl( url );
350    *
351    * 2. JavaScript
352    *
353    *     myObject.postMessage( "Hello World!" ); // "Received a message from JS: Hello World!"
354    *
355    *
356    * @param[in] exposedObjectName The name of exposed object
357    * @param[in] handler The callback function
358    */
359   void AddJavaScriptMessageHandler(const std::string& exposedObjectName, std::function<void(const std::string&)> handler);
360
361   /**
362    * @brief Register alert callback for javascript.
363    *
364    * @param[in] callback The callback function to be called by the JavaScript runtime.
365    */
366   void RegisterJavaScriptAlertCallback(Dali::WebEnginePlugin::JavaScriptAlertCallback callback);
367
368   /**
369    * @brief Reply for JavaScript alert.
370    */
371   void JavaScriptAlertReply();
372
373   /**
374    * @brief Register confirm callback for javascript.
375    *
376    * @param[in] callback The callback function to be called by the JavaScript runtime.
377    */
378   void RegisterJavaScriptConfirmCallback(Dali::WebEnginePlugin::JavaScriptConfirmCallback callback);
379
380   /**
381    * @brief Reply for JavaScript confirm.
382    * @param[in] confirmed True if confirmed, false otherwise
383    */
384   void JavaScriptConfirmReply(bool confirmed);
385
386   /**
387    * @brief Register prompt callback for javascript.
388    *
389    * @param[in] callback The callback function to be called by the JavaScript runtime.
390    */
391   void RegisterJavaScriptPromptCallback(Dali::WebEnginePlugin::JavaScriptPromptCallback callback);
392
393   /**
394    * @brief Reply for JavaScript prompt.
395    * @param[in] result The result from input-field of prompt popup.
396    */
397   void JavaScriptPromptReply(const std::string& result);
398
399   /**
400    * @brief Clears the history of Web.
401    */
402   void ClearHistory();
403
404   /**
405    * @brief Clears all tiles resources of Web.
406    */
407   void ClearAllTilesResources();
408
409   /**
410    * @brief Connects to this signal to be notified when page loading is started.
411    *
412    * @return A signal object to connect with
413    */
414   WebViewPageLoadSignalType& PageLoadStartedSignal();
415
416   /**
417    * @brief Connects to this signal to be notified when page loading is in progress.
418    *
419    * @return A signal object to connect with.
420    */
421   WebViewPageLoadSignalType& PageLoadInProgressSignal();
422
423   /**
424    * @brief Connects to this signal to be notified when page loading is finished.
425    *
426    * @return A signal object to connect with
427    */
428   WebViewPageLoadSignalType& PageLoadFinishedSignal();
429
430   /**
431    * @brief Connects to this signal to be notified when an error occurs in page loading.
432    *
433    * @return A signal object to connect with.
434    */
435   WebViewPageLoadErrorSignalType& PageLoadErrorSignal();
436
437   /**
438    * @brief Connects to this signal to be notified when scroll edge is reached.
439    *
440    * @return A signal object to connect with.
441    */
442   WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal();
443
444   /**
445    * @brief Connects to this signal to be notified when url is changed.
446    *
447    * @return A signal object to connect with.
448    */
449   WebViewUrlChangedSignalType& UrlChangedSignal();
450
451 public: // Not intended for application developers
452   /// @cond internal
453   /**
454    * @brief Creates a handle using the Toolkit::Internal implementation.
455    *
456    * @param[in] implementation The WebView implementation
457    */
458   DALI_INTERNAL WebView(Internal::WebView& implementation);
459
460   /**
461    * @brief Allows the creation of this WebView from an Internal::CustomActor pointer.
462    *
463    * @param[in] internal A pointer to the internal CustomActor
464    */
465   explicit DALI_INTERNAL WebView(Dali::Internal::CustomActor* internal);
466   /// @endcond
467 };
468
469 /**
470  * @}
471  */
472
473 } // namespace Toolkit
474
475 } // namespace Dali
476
477 #endif // DALI_TOOLKIT_WEB_VIEW_H