Merge "Add support to build on the macOS platform" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-WebView.cpp
1 /*
2  * Copyright (c) 2020 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 #include <iostream>
19 #include <stdlib.h>
20
21 #include <dali-toolkit-test-suite-utils.h>
22 #include "dali-toolkit-test-utils/toolkit-timer.h"
23
24 #include <dali.h>
25 #include <dali/integration-api/events/key-event-integ.h>
26 #include <dali/integration-api/events/touch-event-integ.h>
27 #include <dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h>
28 #include <dali-toolkit/devel-api/controls/web-view/web-view.h>
29
30
31 using namespace Dali;
32 using namespace Toolkit;
33
34 namespace
35 {
36
37 const char* const TEST_URL1( "http://www.somewhere.valid1.com" );
38 const char* const TEST_URL2( "http://www.somewhere.valid2.com" );
39
40 static int gPageLoadStartedCallbackCalled = 0;
41 static int gPageLoadFinishedCallbackCalled = 0;
42 static int gEvaluateJavaScriptCallbackCalled = 0;
43 static bool gTouched = false;
44
45 struct CallbackFunctor
46 {
47   CallbackFunctor(bool* callbackFlag)
48   : mCallbackFlag( callbackFlag )
49   {
50   }
51
52   void operator()()
53   {
54     *mCallbackFlag = true;
55   }
56   bool* mCallbackFlag;
57 };
58
59 static void OnPageLoadStarted( WebView view, const std::string& url )
60 {
61   gPageLoadStartedCallbackCalled++;
62 }
63
64 static void OnPageLoadFinished( WebView view, const std::string& url )
65 {
66   gPageLoadFinishedCallbackCalled++;
67 }
68
69 static void OnPageLoadError( WebView view, const std::string& url, WebView::LoadErrorCode errorCode )
70 {
71 }
72
73 static void OnEvaluateJavaScript( const std::string& result )
74 {
75   gEvaluateJavaScriptCallbackCalled++;
76 }
77
78 static bool OnTouched( Actor actor, const Dali::TouchEvent& touch )
79 {
80   gTouched = true;
81   return true;
82 }
83
84 } // namespace
85
86 void web_view_startup(void)
87 {
88   test_return_value = TET_UNDEF;
89 }
90
91 void web_view_cleanup(void)
92 {
93   test_return_value = TET_PASS;
94 }
95
96 int UtcDaliWebViewBasics(void)
97 {
98   ToolkitTestApplication application;
99
100   // Copy and Assignment Test
101   tet_infoline( "UtcDaliWebViewBasic Copy and Assignment Test" );
102   WebView view = WebView::New();
103   DALI_TEST_CHECK( view );
104
105   WebView copy( view );
106   DALI_TEST_CHECK( view == copy );
107
108   WebView assign;
109   DALI_TEST_CHECK( !assign );
110
111   assign = copy;
112   DALI_TEST_CHECK( assign == view );
113
114
115   // DownCast Test
116   tet_infoline( "UtcDaliWebViewBasic DownCast Test" );
117   BaseHandle handle(view);
118
119   WebView view2 = WebView::DownCast( handle );
120   DALI_TEST_CHECK( view );
121   DALI_TEST_CHECK( view2 );
122   DALI_TEST_CHECK( view == view2 );
123
124
125   // TypeRegistry Test
126   tet_infoline( "UtcDaliWebViewBasic TypeRegistry Test" );
127   TypeRegistry typeRegistry = TypeRegistry::Get();
128   DALI_TEST_CHECK( typeRegistry );
129
130   TypeInfo typeInfo = typeRegistry.GetTypeInfo( "WebView" );
131   DALI_TEST_CHECK( typeInfo );
132
133   BaseHandle handle2 = typeInfo.CreateInstance();
134   DALI_TEST_CHECK( handle2 );
135
136   WebView view3 = WebView::DownCast( handle2 );
137   DALI_TEST_CHECK( view3 );
138
139   END_TEST;
140 }
141
142 int UtcDaliWebViewPageNavigation(void)
143 {
144   ToolkitTestApplication application;
145
146   WebView view = WebView::New();
147   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
148   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
149   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
150   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
151   application.GetScene().Add( view );
152   application.SendNotification();
153   application.Render();
154   DALI_TEST_CHECK( view );
155
156   ConnectionTracker* testTracker = new ConnectionTracker();
157   view.PageLoadStartedSignal().Connect( &OnPageLoadStarted );
158   view.PageLoadFinishedSignal().Connect( &OnPageLoadFinished );
159   view.PageLoadErrorSignal().Connect( &OnPageLoadError );
160   bool signal1 = false;
161   bool signal2 = false;
162   bool signal3 = false;
163   view.ConnectSignal( testTracker, "pageLoadStarted", CallbackFunctor(&signal1) );
164   view.ConnectSignal( testTracker, "pageLoadFinished", CallbackFunctor(&signal2) );
165   view.ConnectSignal( testTracker, "invalidname", CallbackFunctor(&signal3) );
166   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 0, TEST_LOCATION );
167   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 0, TEST_LOCATION );
168
169
170   view.LoadUrl( TEST_URL1 );
171   view.GetNaturalSize();
172   Test::EmitGlobalTimerSignal();
173   DALI_TEST_EQUALS( view.CanGoBack(), false, TEST_LOCATION );
174   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 1, TEST_LOCATION );
175   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 1, TEST_LOCATION );
176   DALI_TEST_CHECK( signal1 & signal2 );
177   DALI_TEST_CHECK( !signal3 );
178
179   view.LoadUrl( TEST_URL2 );
180   view.Suspend();
181   view.SetProperty( Actor::Property::SIZE, Vector2( 400, 300 ) );
182   application.SendNotification();
183   application.Render();
184   Test::EmitGlobalTimerSignal();
185   view.Resume();
186   DALI_TEST_EQUALS( view.CanGoBack(), true, TEST_LOCATION );
187   DALI_TEST_EQUALS( view.CanGoForward(), false, TEST_LOCATION );
188   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 2, TEST_LOCATION );
189   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 2, TEST_LOCATION );
190
191   view.GoBack();
192   Test::EmitGlobalTimerSignal();
193   DALI_TEST_CHECK( !view.CanGoBack() );
194   DALI_TEST_CHECK( view.CanGoForward() );
195
196   view.GoForward();
197   Test::EmitGlobalTimerSignal();
198   DALI_TEST_CHECK( view.CanGoBack() );
199   DALI_TEST_CHECK( !view.CanGoForward() );
200
201   view.Reload();
202   view.StopLoading();
203   view.ClearHistory();
204   view.ClearCache();
205   view.ClearCookies();
206   Test::EmitGlobalTimerSignal();
207   DALI_TEST_CHECK( !view.CanGoBack() );
208   DALI_TEST_CHECK( !view.CanGoForward() );
209
210   END_TEST;
211 }
212
213 int UtcDaliWebViewTouchAndKeys(void)
214 {
215   ToolkitTestApplication application;
216
217   WebView view = WebView::New();
218   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
219   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
220   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
221   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
222
223   application.GetScene().Add( view );
224   application.SendNotification();
225   application.Render();
226
227   view.GetNaturalSize();
228   view.TouchedSignal().Connect( &OnTouched );
229
230   // Touch event
231   Dali::Integration::TouchEvent event;
232   Dali::Integration::Point pointDown, pointUp;
233
234   event = Dali::Integration::TouchEvent();
235   pointDown.SetState( PointState::DOWN );
236   pointDown.SetScreenPosition( Vector2( 10, 10 ) );
237   event.AddPoint( pointDown );
238   application.ProcessEvent( event );
239
240   event = Dali::Integration::TouchEvent();
241   pointUp.SetState( PointState::UP );
242   pointUp.SetScreenPosition( Vector2( 10, 10 ) );
243   event.AddPoint( pointUp );
244   application.ProcessEvent( event );
245
246   // Key event
247   Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor( view );
248   application.ProcessEvent( Integration::KeyEvent( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", "", Device::Class::NONE, Device::Subclass::NONE ) );
249   application.SendNotification();
250
251   DALI_TEST_CHECK( gTouched );
252   DALI_TEST_CHECK( view );
253
254   END_TEST;
255 }
256
257 int UtcDaliWebViewFocusGainedAndLost(void)
258 {
259   ToolkitTestApplication application;
260
261   WebView view = WebView::New();
262   DALI_TEST_CHECK( view );
263
264   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
265   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
266   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
267   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
268
269   application.GetScene().Add( view );
270   application.SendNotification();
271   application.Render();
272
273   view.SetKeyInputFocus();
274   DALI_TEST_CHECK( view.HasKeyInputFocus() );
275
276   // reset
277   view.ClearKeyInputFocus();
278   DALI_TEST_CHECK( !view.HasKeyInputFocus() );
279
280   END_TEST;
281 }
282
283 int UtcDaliWebViewProperty1(void)
284 {
285   // URL
286   ToolkitTestApplication application;
287
288   WebView view = WebView::New();
289   DALI_TEST_CHECK( view );
290
291   std::string local;
292   view.SetProperty( WebView::Property::URL, TEST_URL1 );
293   Property::Value val = view.GetProperty( WebView::Property::URL );
294   DALI_TEST_CHECK( val.Get( local ) );
295   DALI_TEST_EQUALS( local, TEST_URL1, TEST_LOCATION );
296
297   END_TEST;
298 }
299
300 int UtcDaliWebViewProperty2(void)
301 {
302   // CACHE_MODEL
303   ToolkitTestApplication application;
304
305   WebView view = WebView::New();
306   DALI_TEST_CHECK( view );
307
308   const std::string kDefaultValue = "DOCUMENT_VIEWER";
309   const WebView::CacheModel::Type kTestEnum = WebView::CacheModel::PRIMARY_WEB_BROWSER;
310   const std::string kTestValue = "PRIMARY_WEB_BROWSER";
311
312   // Check default value
313   std::string output;
314   Property::Value value = view.GetProperty( WebView::Property::CACHE_MODEL );
315   DALI_TEST_CHECK( value.Get( output ) );
316   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
317
318   // Check Set/GetProperty
319   view.SetProperty( WebView::Property::CACHE_MODEL, kTestEnum );
320   value = view.GetProperty( WebView::Property::CACHE_MODEL );
321   DALI_TEST_CHECK( value.Get( output ) );
322   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
323
324   view.SetProperty( WebView::Property::CACHE_MODEL, kTestValue );
325   value = view.GetProperty( WebView::Property::CACHE_MODEL );
326   DALI_TEST_CHECK( value.Get( output ) );
327   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
328
329   END_TEST;
330 }
331
332 int UtcDaliWebViewProperty3(void)
333 {
334   // COOKIE_ACCEPT_POLICY
335   ToolkitTestApplication application;
336
337   WebView view = WebView::New();
338   DALI_TEST_CHECK( view );
339
340   const std::string kDefaultValue = "NO_THIRD_PARTY";
341   const WebView::CookieAcceptPolicy::Type kTestEnum = WebView::CookieAcceptPolicy::NEVER;
342   const std::string kTestValue = "NEVER";
343
344   // Check default value
345   std::string output;
346   Property::Value value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
347   DALI_TEST_CHECK( value.Get( output ) );
348   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
349
350   // Check Set/GetProperty
351   view.SetProperty( WebView::Property::COOKIE_ACCEPT_POLICY, kTestEnum );
352   value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
353   DALI_TEST_CHECK( value.Get( output ) );
354   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
355
356   view.SetProperty( WebView::Property::COOKIE_ACCEPT_POLICY, kTestValue );
357   value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
358   DALI_TEST_CHECK( value.Get( output ) );
359   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
360
361   END_TEST;
362 }
363
364 int UtcDaliWebViewProperty4(void)
365 {
366   // USER_AGENT
367   ToolkitTestApplication application;
368
369   WebView view = WebView::New();
370   DALI_TEST_CHECK( view );
371
372   const std::string kDefaultValue;
373   const std::string kTestValue = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36";
374
375   // Check default value
376   std::string output;
377   Property::Value value = view.GetProperty( WebView::Property::USER_AGENT );
378   DALI_TEST_CHECK( value.Get( output ) );
379   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
380
381   // Check Set/GetProperty
382   view.SetProperty( WebView::Property::USER_AGENT, kTestValue );
383   value = view.GetProperty( WebView::Property::USER_AGENT );
384   DALI_TEST_CHECK( value.Get( output ) );
385   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
386
387   END_TEST;
388 }
389
390 int UtcDaliWebViewProperty5(void)
391 {
392   // ENABLE_JAVASCRIPT
393   ToolkitTestApplication application;
394
395   WebView view = WebView::New();
396   DALI_TEST_CHECK( view );
397
398   const bool kDefaultValue = true;
399   const bool kTestValue = false;
400
401   // Check default value
402   bool output;
403   Property::Value value = view.GetProperty( WebView::Property::ENABLE_JAVASCRIPT );
404   DALI_TEST_CHECK( value.Get( output ) );
405   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
406
407   // Check Set/GetProperty
408   view.SetProperty( WebView::Property::ENABLE_JAVASCRIPT, kTestValue );
409   value = view.GetProperty( WebView::Property::ENABLE_JAVASCRIPT );
410   DALI_TEST_CHECK( value.Get( output ) );
411   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
412
413   END_TEST;
414 }
415
416 int UtcDaliWebViewProperty6(void)
417 {
418   // LOAD_IMAGES_AUTOMATICALLY
419   ToolkitTestApplication application;
420
421   WebView view = WebView::New();
422   DALI_TEST_CHECK( view );
423
424   const bool kDefaultValue = true;
425   const bool kTestValue = false;
426
427   // Check default value
428   bool output;
429   Property::Value value = view.GetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY );
430   DALI_TEST_CHECK( value.Get( output ) );
431   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
432
433   // Check Set/GetProperty
434   view.SetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY, kTestValue );
435   value = view.GetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY );
436   DALI_TEST_CHECK( value.Get( output ) );
437   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
438
439   END_TEST;
440 }
441
442 int UtcDaliWebViewProperty7(void)
443 {
444   // DEFAULT_TEXT_ENCODING_NAME
445   ToolkitTestApplication application;
446
447   WebView view = WebView::New();
448   DALI_TEST_CHECK( view );
449
450   const std::string kDefaultValue;
451   const std::string kTestValue = "UTF-8";
452
453   // Check default value
454   std::string output;
455   Property::Value value = view.GetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME );
456   DALI_TEST_CHECK( value.Get( output ) );
457   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
458
459   // Check Set/GetProperty
460   view.SetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME, kTestValue );
461   value = view.GetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME );
462   DALI_TEST_CHECK( value.Get( output ) );
463   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
464
465   END_TEST;
466 }
467
468 int UtcDaliWebViewProperty8(void)
469 {
470   // DEFAULT_FONT_SIZE
471   ToolkitTestApplication application;
472
473   WebView view = WebView::New();
474   DALI_TEST_CHECK( view );
475
476   const int kDefaultValue = 16;
477   const int kTestValue = 26;
478
479   // Check default value
480   int output;
481   Property::Value value = view.GetProperty( WebView::Property::DEFAULT_FONT_SIZE );
482   DALI_TEST_CHECK( value.Get( output ) );
483   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
484
485   // Check Set/GetProperty
486   view.SetProperty( WebView::Property::DEFAULT_FONT_SIZE, kTestValue );
487   value = view.GetProperty( WebView::Property::DEFAULT_FONT_SIZE );
488   DALI_TEST_CHECK( value.Get( output ) );
489   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
490
491   END_TEST;
492 }
493
494 int UtcDaliWebViewEvaluteJavaScript(void)
495 {
496   ToolkitTestApplication application;
497
498   WebView view = WebView::New( "ko-KR", "Asia/Seoul" );
499
500   view.LoadHTMLString( "<body>Hello World!</body>" );
501   view.EvaluateJavaScript( "jsObject.postMessage('Hello')" );
502   view.EvaluateJavaScript( "jsObject.postMessage('World')", OnEvaluateJavaScript );
503   Test::EmitGlobalTimerSignal();
504
505   DALI_TEST_EQUALS( gEvaluateJavaScriptCallbackCalled, 1, TEST_LOCATION );
506
507   END_TEST;
508 }
509
510
511 int UtcDaliWebViewMethodsForCoverage(void)
512 {
513   ToolkitTestApplication application;
514
515   WebView view = WebView::New( "ko-KR", "Asia/Seoul" );
516
517   view.LoadHTMLString( "<body>Hello World!</body>" );
518   view.AddJavaScriptMessageHandler( "jsObject",
519     []( const std::string& arg ) {
520     }
521   );
522
523   DALI_TEST_CHECK( view );
524
525   END_TEST;
526 }