Enhance WebViewLite
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / web-view / web-view-impl.cpp
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include "web-view-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <cstring>
23 #include <dali/public-api/common/stage.h>
24 #include <dali/public-api/images/native-image.h>
25 #include <dali/public-api/adaptor-framework/native-image-source.h>
26 #include <dali/public-api/object/type-registry.h>
27 #include <dali/public-api/object/type-registry-helper.h>
28
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/devel-api/controls/control-devel.h>
31 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
32
33 namespace Dali
34 {
35
36 namespace Toolkit
37 {
38
39 namespace Internal
40 {
41
42 namespace
43 {
44
45 BaseHandle Create()
46 {
47   return Toolkit::WebView::New();
48 }
49
50 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::WebView, Toolkit::Control, Create );
51
52 DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "url", STRING, URL );
53
54 DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadStarted", PAGE_LOAD_STARTED_SIGNAL );
55 DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadFinished", PAGE_LOAD_FINISHED_SIGNAL );
56
57 DALI_TYPE_REGISTRATION_END()
58
59 } // anonymous namepsace
60
61 WebView::WebView( const std::string& locale, const std::string& timezoneId )
62 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS ) ),
63   mUrl(),
64   mWebViewSize( Stage::GetCurrent().GetSize() )
65 {
66   mWebEngine = Dali::WebEngine::New();
67   if ( mWebEngine )
68   {
69     mWebEngine.Create( mWebViewSize.width, mWebViewSize.height, locale, timezoneId );
70   }
71 }
72
73 WebView::WebView()
74 : WebView( "", "" )
75 {
76 }
77
78 WebView::~WebView()
79 {
80 }
81
82 Toolkit::WebView WebView::New()
83 {
84   WebView* impl = new WebView();
85   Toolkit::WebView handle = Toolkit::WebView( *impl );
86
87   impl->Initialize();
88   return handle;
89 }
90
91 Toolkit::WebView WebView::New( const std::string& locale, const std::string& timezoneId )
92 {
93   WebView* impl = new WebView( locale, timezoneId );
94   Toolkit::WebView handle = Toolkit::WebView( *impl );
95
96   impl->Initialize();
97   return handle;
98 }
99
100 void WebView::OnInitialize()
101 {
102   Self().SetKeyboardFocusable( true );
103   Self().TouchSignal().Connect( this, &WebView::OnTouchEvent );
104
105   if ( mWebEngine )
106   {
107     mWebEngine.PageLoadStartedSignal().Connect( this, &WebView::OnPageLoadStarted );
108     mWebEngine.PageLoadFinishedSignal().Connect( this, &WebView::OnPageLoadFinished );
109   }
110 }
111
112 void WebView::LoadUrl( const std::string& url )
113 {
114   mUrl = url;
115   if ( mWebEngine )
116   {
117     Dali::Image image = Dali::NativeImage::New( *mWebEngine.GetNativeImageSource() );
118     mVisual = Toolkit::VisualFactory::Get().CreateVisual( image );
119
120     if ( mVisual )
121     {
122       // Clean up previously registered visual and add new one.
123       DevelControl::RegisterVisual( *this, Toolkit::WebView::Property::URL, mVisual );
124       mWebEngine.LoadUrl( url );
125     }
126   }
127 }
128
129 const std::string& WebView::GetUrl()
130 {
131   return mWebEngine ? mWebEngine.GetUrl() : mUrl;
132 }
133
134 void WebView::LoadHTMLString( const std::string& htmlString )
135 {
136   if ( mWebEngine )
137   {
138     Dali::Image image = Dali::NativeImage::New( *mWebEngine.GetNativeImageSource() );
139     mVisual = Toolkit::VisualFactory::Get().CreateVisual( image );
140
141     if ( mVisual )
142     {
143       DevelControl::RegisterVisual( *this, Toolkit::WebView::Property::URL, mVisual );
144       mWebEngine.LoadHTMLString( htmlString );
145     }
146   }
147 }
148
149 void WebView::Reload()
150 {
151   if ( mWebEngine )
152   {
153     mWebEngine.Reload();
154   }
155 }
156
157 void WebView::StopLoading()
158 {
159   if ( mWebEngine )
160   {
161     mWebEngine.StopLoading();
162   }
163 }
164
165 bool WebView::CanGoForward()
166 {
167   return mWebEngine ? mWebEngine.CanGoForward() : false;
168 }
169
170 void WebView::GoForward()
171 {
172   if ( mWebEngine )
173   {
174     mWebEngine.GoForward();
175   }
176 }
177
178 bool WebView::CanGoBack()
179 {
180   return mWebEngine ? mWebEngine.CanGoBack() : false;
181 }
182
183 void WebView::GoBack()
184 {
185   if ( mWebEngine )
186   {
187     mWebEngine.GoBack();
188   }
189 }
190
191 void WebView::EvaluateJavaScript( const std::string& script )
192 {
193   if ( mWebEngine )
194   {
195     mWebEngine.EvaluateJavaScript( script );
196   }
197 }
198
199 void WebView::AddJavaScriptInterface( const std::string& exposedObjectName, const std::string& jsFunctionName, std::function< std::string(const std::string&) > callback )
200 {
201   if ( mWebEngine )
202   {
203     mWebEngine.AddJavaScriptInterface( exposedObjectName, jsFunctionName, callback );
204   }
205 }
206
207 void WebView::RemoveJavascriptInterface( const std::string& exposedObjectName, const std::string& jsFunctionName )
208 {
209   if ( mWebEngine )
210   {
211     mWebEngine.RemoveJavascriptInterface( exposedObjectName, jsFunctionName );
212   }
213 }
214
215 void WebView::ClearHistory()
216 {
217   if ( mWebEngine )
218   {
219     mWebEngine.ClearHistory();
220   }
221 }
222
223 void WebView::ClearCache()
224 {
225   if ( mWebEngine )
226   {
227     mWebEngine.ClearCache();
228   }
229 }
230
231 Dali::Toolkit::WebView::WebViewSignalType& WebView::PageLoadStartedSignal()
232 {
233   return mPageLoadStartedSignal;
234 }
235
236 Dali::Toolkit::WebView::WebViewSignalType& WebView::PageLoadFinishedSignal()
237 {
238   return mPageLoadFinishedSignal;
239 }
240
241 void WebView::OnPageLoadStarted( const std::string& url )
242 {
243   if( !mPageLoadStartedSignal.Empty() )
244   {
245     Dali::Toolkit::WebView handle( GetOwner() );
246     mPageLoadStartedSignal.Emit( handle, url );
247   }
248 }
249
250 void WebView::OnPageLoadFinished( const std::string& url )
251 {
252   if( !mPageLoadFinishedSignal.Empty() )
253   {
254     Dali::Toolkit::WebView handle( GetOwner() );
255     mPageLoadFinishedSignal.Emit( handle, url );
256   }
257 }
258
259 bool WebView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
260 {
261   Dali::BaseHandle handle( object );
262
263   bool connected = false;
264   Toolkit::WebView webView = Toolkit::WebView::DownCast( handle );
265
266   if( 0 == strcmp( signalName.c_str(), PAGE_LOAD_STARTED_SIGNAL ) )
267   {
268     webView.PageLoadStartedSignal().Connect( tracker, functor );
269     connected = true;
270   }
271   else if( 0 == strcmp( signalName.c_str(), PAGE_LOAD_FINISHED_SIGNAL ) )
272   {
273     webView.PageLoadFinishedSignal().Connect( tracker, functor );
274     connected = true;
275   }
276
277   return connected;
278 }
279
280 Vector3 WebView::GetNaturalSize()
281 {
282   if( mVisual )
283   {
284     Vector2 rendererNaturalSize;
285     mVisual.GetNaturalSize( rendererNaturalSize );
286     return Vector3( rendererNaturalSize );
287   }
288
289   return Vector3( mWebViewSize );
290 }
291
292 void WebView::OnRelayout( const Vector2& size, RelayoutContainer& container )
293 {
294   Control::OnRelayout( size, container );
295
296   if( size.width > 0 && size.height > 0 && mWebViewSize != size )
297   {
298     mWebViewSize = size;
299
300     if( mWebEngine )
301     {
302       mWebEngine.SetSize( size.width, size.height );
303     }
304   }
305 }
306
307 void WebView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
308 {
309   Toolkit::WebView webView = Toolkit::WebView::DownCast( Dali::BaseHandle( object ) );
310
311   if( webView )
312   {
313     WebView& impl = GetImpl( webView );
314     switch( index )
315     {
316       case Toolkit::WebView::Property::URL:
317       {
318         std::string url;
319         if( value.Get( url ) )
320         {
321           impl.LoadUrl( url );
322         }
323         break;
324       }
325     }
326   }
327 }
328
329 Property::Value WebView::GetProperty( BaseObject* object, Property::Index propertyIndex )
330 {
331   Property::Value value;
332
333   Toolkit::WebView webView = Toolkit::WebView::DownCast( Dali::BaseHandle( object ) );
334
335   if( webView )
336   {
337     WebView& impl = GetImpl( webView );
338     switch( propertyIndex )
339     {
340       case Toolkit::WebView::Property::URL:
341       {
342         value = impl.GetUrl();
343         break;
344       }
345     }
346   }
347
348   return value;
349 }
350
351 bool WebView::OnTouchEvent( Actor actor, const Dali::TouchData& touch )
352 {
353   bool result = false;
354
355   if ( mWebEngine )
356   {
357     result = mWebEngine.SendTouchEvent( touch );
358   }
359   return result;
360 }
361
362 bool WebView::OnKeyEvent( const Dali::KeyEvent& event )
363 {
364   bool result = false;
365
366   if ( mWebEngine )
367   {
368     result = mWebEngine.SendKeyEvent( event );
369   }
370   return result;
371 }
372
373 } // namespace Internal
374
375 } // namespace Toolkit
376
377 } // namespace Dali