Support scroll in web view.
[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 gScrollEdgeReachedCallbackCalled = 0;
43 static int gEvaluateJavaScriptCallbackCalled = 0;
44 static bool gTouched = false;
45
46 struct CallbackFunctor
47 {
48   CallbackFunctor(bool* callbackFlag)
49   : mCallbackFlag( callbackFlag )
50   {
51   }
52
53   void operator()()
54   {
55     *mCallbackFlag = true;
56   }
57   bool* mCallbackFlag;
58 };
59
60 static void OnPageLoadStarted( WebView view, const std::string& url )
61 {
62   gPageLoadStartedCallbackCalled++;
63 }
64
65 static void OnPageLoadFinished( WebView view, const std::string& url )
66 {
67   gPageLoadFinishedCallbackCalled++;
68 }
69
70 static void OnScrollEdgeReached( WebView view, Dali::WebEnginePlugin::ScrollEdge edge )
71 {
72   gScrollEdgeReachedCallbackCalled++;
73 }
74
75 static void OnPageLoadError( WebView view, const std::string& url, WebView::LoadErrorCode errorCode )
76 {
77 }
78
79 static void OnEvaluateJavaScript( const std::string& result )
80 {
81   gEvaluateJavaScriptCallbackCalled++;
82 }
83
84 static bool OnTouched( Actor actor, const Dali::TouchEvent& touch )
85 {
86   gTouched = true;
87   return true;
88 }
89
90 } // namespace
91
92 void web_view_startup(void)
93 {
94   test_return_value = TET_UNDEF;
95 }
96
97 void web_view_cleanup(void)
98 {
99   test_return_value = TET_PASS;
100 }
101
102 int UtcDaliWebViewBasics(void)
103 {
104   ToolkitTestApplication application;
105
106   // Copy and Assignment Test
107   tet_infoline( "UtcDaliWebViewBasic Copy and Assignment Test" );
108   WebView view = WebView::New();
109   DALI_TEST_CHECK( view );
110
111   WebView copy( view );
112   DALI_TEST_CHECK( view == copy );
113
114   WebView assign;
115   DALI_TEST_CHECK( !assign );
116
117   assign = copy;
118   DALI_TEST_CHECK( assign == view );
119
120
121   // DownCast Test
122   tet_infoline( "UtcDaliWebViewBasic DownCast Test" );
123   BaseHandle handle(view);
124
125   WebView view2 = WebView::DownCast( handle );
126   DALI_TEST_CHECK( view );
127   DALI_TEST_CHECK( view2 );
128   DALI_TEST_CHECK( view == view2 );
129
130
131   // TypeRegistry Test
132   tet_infoline( "UtcDaliWebViewBasic TypeRegistry Test" );
133   TypeRegistry typeRegistry = TypeRegistry::Get();
134   DALI_TEST_CHECK( typeRegistry );
135
136   TypeInfo typeInfo = typeRegistry.GetTypeInfo( "WebView" );
137   DALI_TEST_CHECK( typeInfo );
138
139   BaseHandle handle2 = typeInfo.CreateInstance();
140   DALI_TEST_CHECK( handle2 );
141
142   WebView view3 = WebView::DownCast( handle2 );
143   DALI_TEST_CHECK( view3 );
144
145   END_TEST;
146 }
147
148 int UtcDaliWebViewPageNavigation(void)
149 {
150   ToolkitTestApplication application;
151
152   WebView view = WebView::New();
153   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
154   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
155   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
156   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
157   application.GetScene().Add( view );
158   application.SendNotification();
159   application.Render();
160   DALI_TEST_CHECK( view );
161
162   ConnectionTracker* testTracker = new ConnectionTracker();
163   view.PageLoadStartedSignal().Connect( &OnPageLoadStarted );
164   view.PageLoadFinishedSignal().Connect( &OnPageLoadFinished );
165   view.PageLoadErrorSignal().Connect( &OnPageLoadError );
166   bool signal1 = false;
167   bool signal2 = false;
168   bool signal3 = false;
169   view.ConnectSignal( testTracker, "pageLoadStarted", CallbackFunctor(&signal1) );
170   view.ConnectSignal( testTracker, "pageLoadFinished", CallbackFunctor(&signal2) );
171   view.ConnectSignal( testTracker, "invalidname", CallbackFunctor(&signal3) );
172   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 0, TEST_LOCATION );
173   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 0, TEST_LOCATION );
174
175
176   view.LoadUrl( TEST_URL1 );
177   view.GetNaturalSize();
178   Test::EmitGlobalTimerSignal();
179   DALI_TEST_EQUALS( view.CanGoBack(), false, TEST_LOCATION );
180   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 1, TEST_LOCATION );
181   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 1, TEST_LOCATION );
182   DALI_TEST_CHECK( signal1 & signal2 );
183   DALI_TEST_CHECK( !signal3 );
184
185   view.LoadUrl( TEST_URL2 );
186   view.Suspend();
187   view.SetProperty( Actor::Property::SIZE, Vector2( 400, 300 ) );
188   application.SendNotification();
189   application.Render();
190   Test::EmitGlobalTimerSignal();
191   view.Resume();
192   DALI_TEST_EQUALS( view.CanGoBack(), true, TEST_LOCATION );
193   DALI_TEST_EQUALS( view.CanGoForward(), false, TEST_LOCATION );
194   DALI_TEST_EQUALS( gPageLoadStartedCallbackCalled, 2, TEST_LOCATION );
195   DALI_TEST_EQUALS( gPageLoadFinishedCallbackCalled, 2, TEST_LOCATION );
196
197   view.GoBack();
198   Test::EmitGlobalTimerSignal();
199   DALI_TEST_CHECK( !view.CanGoBack() );
200   DALI_TEST_CHECK( view.CanGoForward() );
201
202   view.GoForward();
203   Test::EmitGlobalTimerSignal();
204   DALI_TEST_CHECK( view.CanGoBack() );
205   DALI_TEST_CHECK( !view.CanGoForward() );
206
207   view.Reload();
208   view.StopLoading();
209   view.ClearHistory();
210   view.ClearCache();
211   view.ClearCookies();
212   Test::EmitGlobalTimerSignal();
213   DALI_TEST_CHECK( !view.CanGoBack() );
214   DALI_TEST_CHECK( !view.CanGoForward() );
215
216   END_TEST;
217 }
218
219 int UtcDaliWebViewTouchAndKeys(void)
220 {
221   ToolkitTestApplication application;
222
223   WebView view = WebView::New();
224   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
225   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
226   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
227   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
228
229   application.GetScene().Add( view );
230   application.SendNotification();
231   application.Render();
232
233   view.GetNaturalSize();
234   view.TouchedSignal().Connect( &OnTouched );
235
236   // Touch event
237   Dali::Integration::TouchEvent event;
238   Dali::Integration::Point pointDown, pointUp;
239
240   event = Dali::Integration::TouchEvent();
241   pointDown.SetState( PointState::DOWN );
242   pointDown.SetScreenPosition( Vector2( 10, 10 ) );
243   event.AddPoint( pointDown );
244   application.ProcessEvent( event );
245
246   event = Dali::Integration::TouchEvent();
247   pointUp.SetState( PointState::UP );
248   pointUp.SetScreenPosition( Vector2( 10, 10 ) );
249   event.AddPoint( pointUp );
250   application.ProcessEvent( event );
251
252   // Key event
253   Toolkit::KeyboardFocusManager::Get().SetCurrentFocusActor( view );
254   application.ProcessEvent( Integration::KeyEvent( "", "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::DOWN, "", "", Device::Class::NONE, Device::Subclass::NONE ) );
255   application.SendNotification();
256
257   DALI_TEST_CHECK( gTouched );
258   DALI_TEST_CHECK( view );
259
260   END_TEST;
261 }
262
263 int UtcDaliWebViewFocusGainedAndLost(void)
264 {
265   ToolkitTestApplication application;
266
267   WebView view = WebView::New();
268   DALI_TEST_CHECK( view );
269
270   view.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
271   view.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
272   view.SetProperty( Actor::Property::POSITION, Vector2( 0, 0 ));
273   view.SetProperty( Actor::Property::SIZE, Vector2( 800, 600 ) );
274
275   application.GetScene().Add( view );
276   application.SendNotification();
277   application.Render();
278
279   view.SetKeyInputFocus();
280   DALI_TEST_CHECK( view.HasKeyInputFocus() );
281
282   // reset
283   view.ClearKeyInputFocus();
284   DALI_TEST_CHECK( !view.HasKeyInputFocus() );
285
286   END_TEST;
287 }
288
289 int UtcDaliWebViewProperty1(void)
290 {
291   // URL
292   ToolkitTestApplication application;
293
294   WebView view = WebView::New();
295   DALI_TEST_CHECK( view );
296
297   std::string local;
298   view.SetProperty( WebView::Property::URL, TEST_URL1 );
299   Property::Value val = view.GetProperty( WebView::Property::URL );
300   DALI_TEST_CHECK( val.Get( local ) );
301   DALI_TEST_EQUALS( local, TEST_URL1, TEST_LOCATION );
302
303   END_TEST;
304 }
305
306 int UtcDaliWebViewProperty2(void)
307 {
308   // CACHE_MODEL
309   ToolkitTestApplication application;
310
311   WebView view = WebView::New();
312   DALI_TEST_CHECK( view );
313
314   const std::string kDefaultValue = "DOCUMENT_VIEWER";
315   const WebView::CacheModel::Type kTestEnum = WebView::CacheModel::PRIMARY_WEB_BROWSER;
316   const std::string kTestValue = "PRIMARY_WEB_BROWSER";
317
318   // Check default value
319   std::string output;
320   Property::Value value = view.GetProperty( WebView::Property::CACHE_MODEL );
321   DALI_TEST_CHECK( value.Get( output ) );
322   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
323
324   // Check Set/GetProperty
325   view.SetProperty( WebView::Property::CACHE_MODEL, kTestEnum );
326   value = view.GetProperty( WebView::Property::CACHE_MODEL );
327   DALI_TEST_CHECK( value.Get( output ) );
328   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
329
330   view.SetProperty( WebView::Property::CACHE_MODEL, kTestValue );
331   value = view.GetProperty( WebView::Property::CACHE_MODEL );
332   DALI_TEST_CHECK( value.Get( output ) );
333   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
334
335   END_TEST;
336 }
337
338 int UtcDaliWebViewProperty3(void)
339 {
340   // COOKIE_ACCEPT_POLICY
341   ToolkitTestApplication application;
342
343   WebView view = WebView::New();
344   DALI_TEST_CHECK( view );
345
346   const std::string kDefaultValue = "NO_THIRD_PARTY";
347   const WebView::CookieAcceptPolicy::Type kTestEnum = WebView::CookieAcceptPolicy::NEVER;
348   const std::string kTestValue = "NEVER";
349
350   // Check default value
351   std::string output;
352   Property::Value value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
353   DALI_TEST_CHECK( value.Get( output ) );
354   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
355
356   // Check Set/GetProperty
357   view.SetProperty( WebView::Property::COOKIE_ACCEPT_POLICY, kTestEnum );
358   value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
359   DALI_TEST_CHECK( value.Get( output ) );
360   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
361
362   view.SetProperty( WebView::Property::COOKIE_ACCEPT_POLICY, kTestValue );
363   value = view.GetProperty( WebView::Property::COOKIE_ACCEPT_POLICY );
364   DALI_TEST_CHECK( value.Get( output ) );
365   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
366
367   END_TEST;
368 }
369
370 int UtcDaliWebViewProperty4(void)
371 {
372   // USER_AGENT
373   ToolkitTestApplication application;
374
375   WebView view = WebView::New();
376   DALI_TEST_CHECK( view );
377
378   const std::string kDefaultValue;
379   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";
380
381   // Check default value
382   std::string output;
383   Property::Value value = view.GetProperty( WebView::Property::USER_AGENT );
384   DALI_TEST_CHECK( value.Get( output ) );
385   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
386
387   // Check Set/GetProperty
388   view.SetProperty( WebView::Property::USER_AGENT, kTestValue );
389   value = view.GetProperty( WebView::Property::USER_AGENT );
390   DALI_TEST_CHECK( value.Get( output ) );
391   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
392
393   END_TEST;
394 }
395
396 int UtcDaliWebViewProperty5(void)
397 {
398   // ENABLE_JAVASCRIPT
399   ToolkitTestApplication application;
400
401   WebView view = WebView::New();
402   DALI_TEST_CHECK( view );
403
404   const bool kDefaultValue = true;
405   const bool kTestValue = false;
406
407   // Check default value
408   bool output;
409   Property::Value value = view.GetProperty( WebView::Property::ENABLE_JAVASCRIPT );
410   DALI_TEST_CHECK( value.Get( output ) );
411   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
412
413   // Check Set/GetProperty
414   view.SetProperty( WebView::Property::ENABLE_JAVASCRIPT, kTestValue );
415   value = view.GetProperty( WebView::Property::ENABLE_JAVASCRIPT );
416   DALI_TEST_CHECK( value.Get( output ) );
417   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
418
419   END_TEST;
420 }
421
422 int UtcDaliWebViewProperty6(void)
423 {
424   // LOAD_IMAGES_AUTOMATICALLY
425   ToolkitTestApplication application;
426
427   WebView view = WebView::New();
428   DALI_TEST_CHECK( view );
429
430   const bool kDefaultValue = true;
431   const bool kTestValue = false;
432
433   // Check default value
434   bool output;
435   Property::Value value = view.GetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY );
436   DALI_TEST_CHECK( value.Get( output ) );
437   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
438
439   // Check Set/GetProperty
440   view.SetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY, kTestValue );
441   value = view.GetProperty( WebView::Property::LOAD_IMAGES_AUTOMATICALLY );
442   DALI_TEST_CHECK( value.Get( output ) );
443   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
444
445   END_TEST;
446 }
447
448 int UtcDaliWebViewProperty7(void)
449 {
450   // DEFAULT_TEXT_ENCODING_NAME
451   ToolkitTestApplication application;
452
453   WebView view = WebView::New();
454   DALI_TEST_CHECK( view );
455
456   const std::string kDefaultValue;
457   const std::string kTestValue = "UTF-8";
458
459   // Check default value
460   std::string output;
461   Property::Value value = view.GetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME );
462   DALI_TEST_CHECK( value.Get( output ) );
463   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
464
465   // Check Set/GetProperty
466   view.SetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME, kTestValue );
467   value = view.GetProperty( WebView::Property::DEFAULT_TEXT_ENCODING_NAME );
468   DALI_TEST_CHECK( value.Get( output ) );
469   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
470
471   END_TEST;
472 }
473
474 int UtcDaliWebViewProperty8(void)
475 {
476   // DEFAULT_FONT_SIZE
477   ToolkitTestApplication application;
478
479   WebView view = WebView::New();
480   DALI_TEST_CHECK( view );
481
482   const int kDefaultValue = 16;
483   const int kTestValue = 26;
484
485   // Check default value
486   int output;
487   Property::Value value = view.GetProperty( WebView::Property::DEFAULT_FONT_SIZE );
488   DALI_TEST_CHECK( value.Get( output ) );
489   DALI_TEST_EQUALS( output, kDefaultValue, TEST_LOCATION );
490
491   // Check Set/GetProperty
492   view.SetProperty( WebView::Property::DEFAULT_FONT_SIZE, kTestValue );
493   value = view.GetProperty( WebView::Property::DEFAULT_FONT_SIZE );
494   DALI_TEST_CHECK( value.Get( output ) );
495   DALI_TEST_EQUALS( output, kTestValue, TEST_LOCATION );
496
497   END_TEST;
498 }
499
500 int UtcDaliWebViewProperty9(void)
501 {
502   // SCROLL_POSITION
503   ToolkitTestApplication application;
504
505   WebView view = WebView::New();
506   DALI_TEST_CHECK( view );
507
508   // Check default value
509   Dali::Vector2 output = Dali::Vector2::ONE;
510   view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output );
511   DALI_TEST_CHECK( output.x == 0 && output.y == 0 );
512
513   // Check Set/GetProperty
514   Dali::Vector2 testValue = Dali::Vector2( 100, 100 );
515   view.SetProperty( WebView::Property::SCROLL_POSITION, testValue );
516   view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output );
517   DALI_TEST_EQUALS( output, testValue, TEST_LOCATION );
518
519   // Check default value of scroll size
520   output = Dali::Vector2::ONE;
521   view.GetProperty( WebView::Property::SCROLL_SIZE ).Get( output );
522   DALI_TEST_CHECK( output.x == 500 && output.y == 500 );
523
524   // Check default value of content size
525   output = Dali::Vector2::ONE;
526   view.GetProperty( WebView::Property::CONTENT_SIZE ).Get( output );
527   DALI_TEST_CHECK( output.x == 500 && output.y == 500 );
528
529   END_TEST;
530 }
531
532 int UtcDaliWebViewScrollBy(void)
533 {
534   ToolkitTestApplication application;
535
536   WebView view = WebView::New();
537   DALI_TEST_CHECK( view );
538
539   // load url.
540   ConnectionTracker* testTracker = new ConnectionTracker();
541   view.ScrollEdgeReachedSignal().Connect( &OnScrollEdgeReached );
542   bool signal1 = false;
543   view.ConnectSignal( testTracker, "scrollEdgeReached", CallbackFunctor(&signal1) );
544   DALI_TEST_EQUALS( gScrollEdgeReachedCallbackCalled, 0, TEST_LOCATION );
545
546   view.LoadUrl( TEST_URL1 );
547   Test::EmitGlobalTimerSignal();
548
549   // set scroll position.
550   Dali::Vector2 output = Dali::Vector2::ONE;
551   Dali::Vector2 testValue = Dali::Vector2( 100, 100 );
552   view.SetProperty( WebView::Property::SCROLL_POSITION, testValue );
553   view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output );
554   DALI_TEST_EQUALS( output, testValue, TEST_LOCATION );
555
556   // scroll by and trigger scrollEdgeReached event.
557   view.ScrollBy( 50, 50 );
558   view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output );
559   DALI_TEST_CHECK( output.x == 150 && output.y == 150 );
560   DALI_TEST_EQUALS( gScrollEdgeReachedCallbackCalled, 1, TEST_LOCATION );
561   DALI_TEST_CHECK( signal1 );
562
563   END_TEST;
564 }
565
566 int UtcDaliWebViewEvaluteJavaScript(void)
567 {
568   ToolkitTestApplication application;
569
570   WebView view = WebView::New( "ko-KR", "Asia/Seoul" );
571
572   view.LoadHTMLString( "<body>Hello World!</body>" );
573   view.EvaluateJavaScript( "jsObject.postMessage('Hello')" );
574   view.EvaluateJavaScript( "jsObject.postMessage('World')", OnEvaluateJavaScript );
575   Test::EmitGlobalTimerSignal();
576
577   DALI_TEST_EQUALS( gEvaluateJavaScriptCallbackCalled, 1, TEST_LOCATION );
578
579   END_TEST;
580 }
581
582
583 int UtcDaliWebViewMethodsForCoverage(void)
584 {
585   ToolkitTestApplication application;
586
587   WebView view = WebView::New( "ko-KR", "Asia/Seoul" );
588
589   view.LoadHTMLString( "<body>Hello World!</body>" );
590   view.AddJavaScriptMessageHandler( "jsObject",
591     []( const std::string& arg ) {
592     }
593   );
594
595   DALI_TEST_CHECK( view );
596
597   END_TEST;
598 }