Merge "Implements CanvasView control" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / dali-toolkit-test-utils / toolkit-web-engine.cpp
1 /*
2  * Copyright (c) 2021 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 "toolkit-timer.h"
19
20 #include <dali/devel-api/adaptor-framework/web-engine.h>
21 #include <dali/devel-api/adaptor-framework/web-engine-back-forward-list.h>
22 #include <dali/devel-api/adaptor-framework/web-engine-back-forward-list-item.h>
23 #include <dali/devel-api/adaptor-framework/web-engine-context.h>
24 #include <dali/devel-api/adaptor-framework/web-engine-cookie-manager.h>
25 #include <dali/devel-api/adaptor-framework/web-engine-form-repost-decision.h>
26 #include <dali/devel-api/adaptor-framework/web-engine-settings.h>
27 #include <dali/public-api/adaptor-framework/native-image-source.h>
28 #include <dali/public-api/images/pixel-data.h>
29 #include <dali/public-api/object/any.h>
30 #include <dali/public-api/object/base-object.h>
31 #include <memory>
32 #include <string.h>
33 #include <toolkit-application.h>
34
35 namespace Dali
36 {
37
38 namespace Internal
39 {
40
41 namespace Adaptor
42 {
43
44 class WebEngine;
45
46 namespace
47 {
48
49 // Generally only one WebEngine instance exists.
50 // If > 1, a new web engine has been created by CreateWindowSignal.
51 static WebEngine* gInstance = 0;
52 static int gInstanceCount = 0;
53
54 bool OnGoBack();
55 bool OnGoForward();
56 bool OnLoadUrl();
57 bool OnEvaluteJavaScript();
58 bool OnJavaScriptAlert();
59 bool OnJavaScriptConfirm();
60 bool OnJavaScriptPrompt();
61 bool OnScrollEdge();
62 bool OnScreenshotCaptured();
63 bool OnVideoPlaying();
64 bool OnGeolocationPermission();
65 bool OnClearHistory();
66
67 static void ConnectToGlobalSignal( bool ( *func )() )
68 {
69   Dali::Timer timer = Dali::Timer::New( 0 );
70   timer.TickSignal().Connect( func );
71 }
72
73 static void DisconnectFromGlobalSignal( bool ( *func )() )
74 {
75   Dali::Timer timer = Dali::Timer::New( 0 );
76   timer.TickSignal().Disconnect( func );
77 }
78 } // namespace anonymous
79
80 class MockWebEngineContext : public Dali::WebEngineContext
81 {
82 public:
83   MockWebEngineContext()
84     : mockModel( Dali::WebEngineContext::CacheModel::DOCUMENT_VIEWER )
85   {
86   }
87
88   Dali::WebEngineContext::CacheModel GetCacheModel() const override
89   {
90     return mockModel;
91   }
92
93   void SetCacheModel( Dali::WebEngineContext::CacheModel cacheModel ) override
94   {
95     mockModel = cacheModel;
96   }
97
98   void SetProxyUri( const std::string& uri ) override
99   {
100   }
101
102   void SetDefaultProxyAuth( const std::string& username, const std::string& password ) override
103   {
104   }
105
106   void SetCertificateFilePath( const std::string& certificatePath ) override
107   {
108   }
109
110   void DeleteWebDatabase() override
111   {
112   }
113
114   void DeleteWebStorage() override
115   {
116   }
117
118   void DeleteLocalFileSystem() override
119   {
120   }
121
122   void DisableCache( bool cacheDisabled ) override
123   {
124   }
125
126   void ClearCache() override
127   {
128   }
129
130 private:
131   Dali::WebEngineContext::CacheModel mockModel;
132 };
133
134 class MockWebEngineCookieManager : public Dali::WebEngineCookieManager
135 {
136 public:
137   MockWebEngineCookieManager()
138     : mockCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy::NO_THIRD_PARTY )
139   {
140   }
141
142   void SetCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy policy ) override
143   {
144     mockCookieAcceptPolicy = policy;
145   }
146
147   Dali::WebEngineCookieManager::CookieAcceptPolicy GetCookieAcceptPolicy() const override
148   {
149     return mockCookieAcceptPolicy;
150   }
151
152   void ClearCookies() override
153   {
154   }
155
156   void SetPersistentStorage( const std::string& path, Dali::WebEngineCookieManager::CookiePersistentStorage storage ) override
157   {
158   }
159
160 private:
161   Dali::WebEngineCookieManager::CookieAcceptPolicy mockCookieAcceptPolicy;
162 };
163
164 class MockWebEngineBackForwardListItem : public Dali::WebEngineBackForwardListItem
165 {
166 public:
167   MockWebEngineBackForwardListItem()
168     : mockUrl( "http://url" ),
169       mockTitle( "title" ),
170       mockOriginalUrl( "http://originalurl" )
171   {
172   }
173
174   std::string GetUrl() const override
175   {
176     return mockUrl;
177   }
178
179   std::string GetTitle() const override
180   {
181     return mockTitle;
182   }
183
184   std::string GetOriginalUrl() const override
185   {
186     return mockOriginalUrl;
187   }
188
189 private:
190   std::string mockUrl;
191   std::string mockTitle;
192   std::string mockOriginalUrl;
193 };
194
195 class MockWebEngineBackForwardList : public Dali::WebEngineBackForwardList
196 {
197 public:
198   MockWebEngineBackForwardList( )
199     : mockItem(),
200       pMockItem( &mockItem )
201   {
202   }
203
204   Dali::WebEngineBackForwardListItem& GetCurrentItem() const override
205   {
206     return *pMockItem;
207   }
208
209   Dali::WebEngineBackForwardListItem& GetItemAtIndex( uint32_t index ) const override
210   {
211     return *pMockItem;
212   }
213
214   uint32_t GetItemCount() const override
215   {
216     return 1;
217   }
218
219 private:
220   MockWebEngineBackForwardListItem mockItem;
221   WebEngineBackForwardListItem* pMockItem;
222 };
223
224 class MockWebEngineFormRepostDecision : public WebEngineFormRepostDecision
225 {
226 public:
227   MockWebEngineFormRepostDecision()
228   {
229   }
230
231   void Reply(bool allowed) override {}
232 };
233
234 class MockWebEngineSettings : public WebEngineSettings
235 {
236 public:
237   MockWebEngineSettings()
238     : mockDefaultFontSize( 16 ),
239       mockJavaScriptEnabled( true ),
240       mockAutoFittingEnabled ( true ),
241       mockPluginsEnabled ( true ),
242       mockPrivateBrowsingEnabled( true ),
243       mockLinkMagnifierEnabled( true ),
244       mockKeypadWithoutUserActionUsed( true ),
245       mockAutofillPasswordFormEnabled( true ),
246       mockFormCandidateDataEnabled( true ),
247       mockTextSelectionEnabled( true ),
248       mockTextAutosizingEnable( true ),
249       mockArrowScrollEnable( true ),
250       mockClipboardEnabled( true ),
251       mockImePanelEnabled( true ),
252       mockImageLoadedAutomatically( true ),
253       mockDefaultTextEncodingName()
254   {
255   }
256
257   uint32_t GetDefaultFontSize() const override
258   {
259     return mockDefaultFontSize;
260   }
261
262   void SetDefaultFontSize( uint32_t size ) override
263   {
264     mockDefaultFontSize = size;
265   }
266
267   bool IsJavaScriptEnabled() const override
268   {
269     return mockJavaScriptEnabled;
270   }
271
272   void EnableJavaScript( bool enabled ) override
273   {
274     mockJavaScriptEnabled = enabled;
275   }
276
277   bool IsAutoFittingEnabled() const override
278   {
279     return mockAutoFittingEnabled;
280   }
281
282   void EnableAutoFitting( bool enabled ) override
283   {
284     mockAutoFittingEnabled = enabled;
285   }
286
287   bool ArePluginsEnabled() const override
288   {
289     return mockPluginsEnabled;
290   }
291
292   void EnablePlugins( bool enabled ) override
293   {
294     mockPluginsEnabled = enabled;
295   }
296
297   bool IsPrivateBrowsingEnabled() const override
298   {
299     return mockPrivateBrowsingEnabled;
300   }
301
302   void EnablePrivateBrowsing( bool enabled ) override
303   {
304     mockPrivateBrowsingEnabled = enabled;
305   }
306
307   bool IsLinkMagnifierEnabled() const override
308   {
309     return mockLinkMagnifierEnabled;
310   }
311
312   void EnableLinkMagnifier( bool enabled ) override
313   {
314     mockLinkMagnifierEnabled = enabled;
315   }
316
317   bool IsKeypadWithoutUserActionUsed() const override
318   {
319     return mockKeypadWithoutUserActionUsed;
320   }
321
322   void UseKeypadWithoutUserAction( bool used ) override
323   {
324     mockKeypadWithoutUserActionUsed = used;
325   }
326
327   bool IsAutofillPasswordFormEnabled() const override
328   {
329     return mockAutofillPasswordFormEnabled;
330   }
331
332   void EnableAutofillPasswordForm( bool enabled ) override
333   {
334     mockAutofillPasswordFormEnabled = enabled;
335   }
336
337   bool IsFormCandidateDataEnabled() const override
338   {
339     return mockFormCandidateDataEnabled;
340   }
341
342   void EnableFormCandidateData( bool enabled ) override
343   {
344     mockFormCandidateDataEnabled = enabled;
345   }
346
347   bool IsTextSelectionEnabled() const override
348   {
349     return mockTextSelectionEnabled;
350   }
351
352   void EnableTextSelection( bool enabled ) override
353   {
354     mockTextSelectionEnabled = enabled;
355   }
356
357   bool IsTextAutosizingEnabled() const override
358   {
359     return mockTextAutosizingEnable;
360   }
361
362   void EnableTextAutosizing( bool enabled ) override
363   {
364     mockTextAutosizingEnable = enabled;
365   }
366
367   bool IsArrowScrollEnabled() const override
368   {
369     return mockArrowScrollEnable;
370   }
371
372   void EnableArrowScroll( bool enabled ) override
373   {
374     mockArrowScrollEnable = enabled;
375   }
376
377   bool IsClipboardEnabled() const override
378   {
379     return mockClipboardEnabled;
380   }
381
382   void EnableClipboard( bool enabled ) override
383   {
384     mockClipboardEnabled = enabled;
385   }
386
387   bool IsImePanelEnabled() const override
388   {
389     return mockImePanelEnabled;
390   }
391
392   void EnableImePanel( bool enabled ) override
393   {
394     mockImePanelEnabled = enabled;
395   }
396
397   bool AreImagesLoadedAutomatically() const override
398   {
399     return mockImageLoadedAutomatically;
400   }
401
402   void AllowImagesLoadAutomatically( bool automatic ) override
403   {
404     mockImageLoadedAutomatically = automatic;
405   }
406
407   std::string GetDefaultTextEncodingName() const override
408   {
409     return mockDefaultTextEncodingName;
410   }
411
412   void SetDefaultTextEncodingName( const std::string& defaultTextEncodingName ) override
413   {
414     mockDefaultTextEncodingName = defaultTextEncodingName;
415   }
416
417   void AllowMixedContents( bool allowed ) override
418   {
419   }
420
421   void EnableSpatialNavigation( bool enabled ) override
422   {
423   }
424
425   void EnableWebSecurity( bool enabled ) override
426   {
427   }
428
429   void EnableCacheBuilder( bool enabled ) override
430   {
431   }
432
433   void UseScrollbarThumbFocusNotifications( bool used ) override
434   {
435   }
436
437   void EnableDoNotTrack( bool enabled ) override
438   {
439   }
440
441   void AllowFileAccessFromExternalUrl( bool allowed ) override
442   {
443   }
444
445   void AllowScriptsOpenWindows( bool allowed ) override
446   {
447   }
448
449 private:
450   int mockDefaultFontSize;
451   bool mockJavaScriptEnabled;
452   bool mockAutoFittingEnabled;
453   bool mockPluginsEnabled;
454   bool mockPrivateBrowsingEnabled;
455   bool mockLinkMagnifierEnabled;
456   bool mockKeypadWithoutUserActionUsed;
457   bool mockAutofillPasswordFormEnabled;
458   bool mockFormCandidateDataEnabled;
459   bool mockTextSelectionEnabled;
460   bool mockTextAutosizingEnable;
461   bool mockArrowScrollEnable;
462   bool mockClipboardEnabled;
463   bool mockImePanelEnabled;
464   bool mockImageLoadedAutomatically;
465   std::string mockDefaultTextEncodingName;
466 };
467
468 class WebEngine: public Dali::BaseObject
469 {
470 public:
471
472   using JavaScriptEvaluatedResultCallback = std::function<void(const std::string&)>;
473
474   WebEngine()
475     : mUrl()
476     , mCurrentPlusOnePos( 0 )
477     , mUserAgent()
478     , mEvaluating( false )
479     , mScrollPosition( 0, 0 )
480     , mScrollSize( 500, 500 )
481     , mContentSize( 500, 500 )
482   {
483     gInstanceCount++;
484     if ( gInstanceCount == 1 ) // only first web engine need be saved.
485     {
486       gInstance = this;
487     }
488
489     mockWebEngineSettings = new MockWebEngineSettings();
490     mockWebEngineContext = new MockWebEngineContext();
491     mockWebEngineCookieManager = new MockWebEngineCookieManager();
492     mockWebEngineBackForwardList = new MockWebEngineBackForwardList();
493   }
494
495   virtual ~WebEngine()
496   {
497     gInstanceCount--;
498     if( !gInstanceCount )
499     {
500       gInstance = 0;
501     }
502
503     delete mockWebEngineSettings;
504     delete mockWebEngineContext;
505     delete mockWebEngineCookieManager;
506     delete mockWebEngineBackForwardList;
507   }
508
509   Dali::WebEngineSettings& GetSettings() const
510   {
511     return *mockWebEngineSettings;
512   }
513
514   Dali::WebEngineContext& GetContext() const
515   {
516     return *mockWebEngineContext;
517   }
518
519   Dali::WebEngineCookieManager& GetCookieManager() const
520   {
521     return *mockWebEngineCookieManager;
522   }
523
524   Dali::WebEngineBackForwardList& GetBackForwardList() const
525   {
526     return *mockWebEngineBackForwardList;
527   }
528
529   void LoadUrl( const std::string& url )
530   {
531     mUrl = url;
532     ConnectToGlobalSignal( &OnLoadUrl );
533   }
534
535   const std::string& GetUrl() const
536   {
537     return mUrl;
538   }
539
540   std::string GetTitle() const
541   {
542     return std::string("title");
543   }
544
545   Dali::PixelData GetFavicon() const
546   {
547     uint8_t* faviconData = new uint8_t[ 16 ];
548
549     faviconData[ 0 ] = 0xff;
550     faviconData[ 1 ] = 0x00;
551     faviconData[ 2 ] = 0x00;
552     faviconData[ 3 ] = 0xff;
553     faviconData[ 4 ] = 0xff;
554     faviconData[ 5 ] = 0x00;
555     faviconData[ 6 ] = 0x00;
556     faviconData[ 7 ] = 0xff;
557     faviconData[ 8 ] = 0xff;
558     faviconData[ 9 ] = 0x00;
559     faviconData[ 10 ] = 0x00;
560     faviconData[ 11 ] = 0xff;
561     faviconData[ 12 ] = 0xff;
562     faviconData[ 13 ] = 0x00;
563     faviconData[ 14 ] = 0x00;
564     faviconData[ 15 ] = 0xff;
565
566     return Dali::PixelData::New( faviconData, 16, 2, 2,
567                                  Dali::Pixel::Format::RGBA8888,
568                                  Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
569   }
570
571   bool CanGoForward() const
572   {
573     return mHistory.size() > mCurrentPlusOnePos;
574   }
575
576   void GoForward()
577   {
578     ConnectToGlobalSignal( &OnGoForward );
579   }
580
581   bool CanGoBack() const
582   {
583     return mCurrentPlusOnePos > 1;
584   }
585
586   void GoBack()
587   {
588     ConnectToGlobalSignal( &OnGoBack );
589   }
590
591   void EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
592   {
593     if( resultHandler )
594     {
595       if( !mEvaluating )
596       {
597         ConnectToGlobalSignal( &OnEvaluteJavaScript );
598       }
599       mResultCallbacks.push_back( resultHandler );
600     }
601   }
602
603   void RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
604   {
605     if ( callback )
606     {
607       ConnectToGlobalSignal( &OnJavaScriptAlert );
608       mJavaScriptAlertCallback = callback;
609     }
610   }
611
612   void RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
613   {
614     if ( callback )
615     {
616       ConnectToGlobalSignal( &OnJavaScriptConfirm );
617       mJavaScriptConfirmCallback = callback;
618     }
619   }
620
621   void RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
622   {
623     if ( callback )
624     {
625       ConnectToGlobalSignal( &OnJavaScriptPrompt );
626       mJavaScriptPromptCallback = callback;
627     }
628   }
629
630   void ClearHistory()
631   {
632     ConnectToGlobalSignal( &OnClearHistory );
633   }
634
635   const std::string& GetUserAgent() const
636   {
637     return mUserAgent;
638   }
639
640   void SetUserAgent( const std::string& userAgent )
641   {
642     mUserAgent = userAgent;
643   }
644
645   void ScrollBy( int dx, int dy )
646   {
647     mScrollPosition += Dali::Vector2( dx, dy );
648     if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
649     {
650       ConnectToGlobalSignal( &OnScrollEdge );
651     }
652   }
653
654   bool ScrollEdgeBy( int dx, int dy )
655   {
656     mScrollPosition += Dali::Vector2( dx, dy );
657     if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
658     {
659       ConnectToGlobalSignal( &OnScrollEdge );
660     }
661     return true;
662   }
663
664   void SetScrollPosition( int x, int y )
665   {
666     mScrollPosition.x = x;
667     mScrollPosition.y = y;
668   }
669
670   Dali::Vector2 GetScrollPosition() const
671   {
672     return mScrollPosition;
673   }
674
675   Dali::Vector2 GetScrollSize() const
676   {
677     return mScrollSize;
678   }
679
680   Dali::Vector2 GetContentSize() const
681   {
682     return mContentSize;
683   }
684
685   void SetPageZoomFactor(float zoomFactor)
686   {
687     mPageZoomFactor = zoomFactor;
688   }
689
690   float GetPageZoomFactor() const
691   {
692     return mPageZoomFactor;
693   }
694
695   void SetTextZoomFactor(float zoomFactor)
696   {
697     mTextZoomFactor = zoomFactor;
698   }
699
700   float GetTextZoomFactor() const
701   {
702     return mTextZoomFactor;
703   }
704
705   float GetLoadProgressPercentage() const
706   {
707     return 0.5f;
708   }
709
710   void SetScaleFactor(float scaleFactor, Dali::Vector2 point)
711   {
712     mScaleFactor = scaleFactor;
713   }
714
715   float GetScaleFactor() const
716   {
717     return mScaleFactor;
718   }
719
720   Dali::PixelData GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
721   {
722     uint32_t bufferSize = viewArea.width * viewArea.height * 4 ;
723     uint8_t* pixel = new uint8_t[ bufferSize ];
724     memset(pixel, 0xff, bufferSize);
725     return Dali::PixelData::New( pixel, bufferSize, viewArea.width, viewArea.height,
726                                  Dali::Pixel::Format::RGBA8888,
727                                  Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
728   }
729
730   bool GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
731   {
732     if ( callback )
733     {
734       ConnectToGlobalSignal( &OnScreenshotCaptured );
735       mScreenshotCapturedCallback = callback;
736     }
737     return true;
738   }
739
740   bool CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
741   {
742     if ( callback )
743     {
744       ConnectToGlobalSignal( &OnVideoPlaying );
745       mVideoPlayingCallback = callback;
746     }
747     return true;
748   }
749
750   void RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
751   {
752     if ( callback )
753     {
754       ConnectToGlobalSignal( &OnGeolocationPermission );
755       mGeolocationPermissionCallback = callback;
756     }
757   }
758
759   Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadStartedSignal()
760   {
761     return mPageLoadStartedSignal;
762   }
763
764   Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadInProgressSignal()
765   {
766     return mPageLoadInProgressSignal;
767   }
768
769   Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadFinishedSignal()
770   {
771     return mPageLoadFinishedSignal;
772   }
773
774   Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& PageLoadErrorSignal()
775   {
776     return mPageLoadErrorSignal;
777   }
778
779   Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& ScrollEdgeReachedSignal()
780   {
781     return mScrollEdgeReachedSignal;
782   }
783
784   Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& UrlChangedSignal()
785   {
786     return mUrlChangedSignal;
787   }
788
789   Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& FormRepostDecisionSignal()
790   {
791     return mFormRepostDecisionSignal;
792   }
793
794   Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& FrameRenderedSignal()
795   {
796     return mFrameRenderedSignal;
797   }
798
799   std::string                                                mUrl;
800   std::vector< std::string >                                 mHistory;
801   size_t                                                     mCurrentPlusOnePos;
802   std::string                                                mUserAgent;
803   Dali::WebEnginePlugin::WebEnginePageLoadSignalType         mPageLoadStartedSignal;
804   Dali::WebEnginePlugin::WebEnginePageLoadSignalType         mPageLoadInProgressSignal;
805   Dali::WebEnginePlugin::WebEnginePageLoadSignalType         mPageLoadFinishedSignal;
806   Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType    mPageLoadErrorSignal;
807   std::vector<JavaScriptEvaluatedResultCallback>             mResultCallbacks;
808   bool                                                       mEvaluating;
809   float                                                      mPageZoomFactor;
810   float                                                      mTextZoomFactor;
811   float                                                      mScaleFactor;
812
813   Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType  mScrollEdgeReachedSignal;
814   Dali::Vector2                                                mScrollPosition;
815   Dali::Vector2                                                mScrollSize;
816   Dali::Vector2                                                mContentSize;
817   WebEngineBackForwardList*                                    mockWebEngineBackForwardList;
818   WebEngineContext*                                            mockWebEngineContext;
819   WebEngineCookieManager*                                      mockWebEngineCookieManager;
820   WebEngineSettings*                                           mockWebEngineSettings;
821   Dali::WebEnginePlugin::WebEngineUrlChangedSignalType         mUrlChangedSignal;
822   Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
823   Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType      mFrameRenderedSignal;
824
825   Dali::WebEnginePlugin::JavaScriptAlertCallback              mJavaScriptAlertCallback;
826   Dali::WebEnginePlugin::JavaScriptConfirmCallback            mJavaScriptConfirmCallback;
827   Dali::WebEnginePlugin::JavaScriptPromptCallback             mJavaScriptPromptCallback;
828   Dali::WebEnginePlugin::ScreenshotCapturedCallback           mScreenshotCapturedCallback;
829   Dali::WebEnginePlugin::VideoPlayingCallback                 mVideoPlayingCallback;
830   Dali::WebEnginePlugin::GeolocationPermissionCallback        mGeolocationPermissionCallback;
831 };
832
833
834 namespace
835 {
836
837 bool OnGoBack()
838 {
839   DisconnectFromGlobalSignal( &OnGoBack );
840
841   if( gInstance && gInstance->CanGoBack() )
842   {
843     gInstance->mCurrentPlusOnePos--;
844   }
845   return false;
846 }
847
848 bool OnGoForward()
849 {
850   DisconnectFromGlobalSignal( &OnGoForward );
851
852   if( gInstance && gInstance->CanGoForward() )
853   {
854     gInstance->mCurrentPlusOnePos++;
855   }
856   return false;
857 }
858
859 bool OnLoadUrl()
860 {
861   DisconnectFromGlobalSignal( &OnLoadUrl );
862
863   if( gInstance )
864   {
865     if( gInstance->mHistory.size() > gInstance->mCurrentPlusOnePos )
866     {
867       gInstance->mHistory.erase( gInstance->mHistory.begin() + gInstance->mCurrentPlusOnePos, gInstance->mHistory.end() );
868     }
869     gInstance->mHistory.push_back( gInstance->mUrl );
870     gInstance->mCurrentPlusOnePos++;
871     gInstance->mPageLoadStartedSignal.Emit( gInstance->mUrl );
872     gInstance->mPageLoadInProgressSignal.Emit( gInstance->mUrl );
873     gInstance->mPageLoadFinishedSignal.Emit( gInstance->mUrl );
874     gInstance->mUrlChangedSignal.Emit( "http://new-test" );
875
876     std::shared_ptr<Dali::WebEngineFormRepostDecision> decision(new MockWebEngineFormRepostDecision());
877     gInstance->mFormRepostDecisionSignal.Emit(decision);
878     gInstance->mFrameRenderedSignal.Emit();
879   }
880   return false;
881 }
882
883 bool OnScrollEdge()
884 {
885   DisconnectFromGlobalSignal( &OnScrollEdge );
886
887   if( gInstance )
888   {
889     gInstance->mScrollEdgeReachedSignal.Emit( Dali::WebEnginePlugin::ScrollEdge::BOTTOM );
890   }
891
892   return false;
893 }
894
895 bool OnEvaluteJavaScript()
896 {
897   DisconnectFromGlobalSignal( &OnEvaluteJavaScript );
898
899   if( gInstance )
900   {
901     for( auto& func : gInstance->mResultCallbacks )
902     {
903       func("undefined");
904     }
905     gInstance->mResultCallbacks.clear();
906   }
907   return false;
908 }
909
910 bool OnJavaScriptAlert()
911 {
912   DisconnectFromGlobalSignal( &OnJavaScriptAlert );
913   if ( gInstance )
914   {
915     gInstance->mJavaScriptAlertCallback( "this is an alert popup." );
916   }
917   return false;
918 }
919
920 bool OnJavaScriptConfirm()
921 {
922   DisconnectFromGlobalSignal( &OnJavaScriptConfirm );
923   if ( gInstance )
924   {
925     gInstance->mJavaScriptConfirmCallback( "this is a confirm popup." );
926   }
927   return false;
928 }
929
930 bool OnJavaScriptPrompt()
931 {
932   DisconnectFromGlobalSignal( &OnJavaScriptPrompt );
933   if ( gInstance )
934   {
935     gInstance->mJavaScriptPromptCallback( "this is a prompt pompt.", "" );
936   }
937   return false;
938 }
939
940 bool OnScreenshotCaptured()
941 {
942   DisconnectFromGlobalSignal( &OnScreenshotCaptured );
943   if ( gInstance )
944   {
945     uint8_t* pixel = new uint8_t[ 2 * 2 * 4 ];
946     memset(pixel, 0xff, 2 * 2 * 4);
947     Dali::PixelData data = Dali::PixelData::New( pixel, 2 * 2 * 4, 2, 2,
948                                  Dali::Pixel::Format::RGBA8888,
949                                  Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
950     gInstance->mScreenshotCapturedCallback( data );
951   }
952   return false;
953 }
954
955 bool OnVideoPlaying()
956 {
957   DisconnectFromGlobalSignal( &OnVideoPlaying );
958   if ( gInstance )
959   {
960     gInstance->mVideoPlayingCallback( true );
961   }
962   return false;
963 }
964
965 bool OnGeolocationPermission()
966 {
967   DisconnectFromGlobalSignal( &OnGeolocationPermission );
968   if ( gInstance )
969   {
970     gInstance->mGeolocationPermissionCallback( "", "" );
971   }
972   return false;
973 }
974
975 bool OnClearHistory()
976 {
977   DisconnectFromGlobalSignal( &OnClearHistory );
978
979   if( gInstance && gInstance->mCurrentPlusOnePos )
980   {
981     std::string url = gInstance->mHistory[ gInstance->mCurrentPlusOnePos - 1 ];
982     std::vector< std::string >().swap( gInstance->mHistory );
983     gInstance->mHistory.push_back( url );
984     gInstance->mCurrentPlusOnePos = 1;
985   }
986   return false;
987 }
988
989 } // namespace
990
991 inline WebEngine& GetImplementation( Dali::WebEngine& webEngine )
992 {
993   DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
994   BaseObject& handle = webEngine.GetBaseObject();
995   return static_cast< Internal::Adaptor::WebEngine& >( handle );
996 }
997
998 inline const WebEngine& GetImplementation( const Dali::WebEngine& webEngine )
999 {
1000   DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
1001   const BaseObject& handle = webEngine.GetBaseObject();
1002   return static_cast< const Internal::Adaptor::WebEngine& >( handle );
1003 }
1004
1005 } // namespace Adaptor
1006
1007 } // namespace Internal
1008
1009 // Dali::WebEngine Implementation
1010 WebEngine::WebEngine()
1011 {
1012 }
1013
1014 WebEngine::WebEngine( Internal::Adaptor::WebEngine* internal )
1015 : BaseHandle( internal )
1016 {
1017 }
1018
1019 WebEngine::~WebEngine()
1020 {
1021 }
1022
1023 WebEngine WebEngine::New()
1024 {
1025   Internal::Adaptor::WebEngine* baseObject = new Internal::Adaptor::WebEngine();
1026
1027   return WebEngine( baseObject );
1028 }
1029
1030 WebEngine::WebEngine( const WebEngine& WebEngine )
1031 : BaseHandle( WebEngine )
1032 {
1033 }
1034
1035 WebEngine& WebEngine::operator=( const WebEngine& webEngine )
1036 {
1037   BaseHandle::operator=( webEngine );
1038   return *this;
1039 }
1040
1041 WebEngine WebEngine::DownCast( BaseHandle handle )
1042 {
1043   return WebEngine( dynamic_cast< Internal::Adaptor::WebEngine* >( handle.GetObjectPtr() ) );
1044 }
1045
1046 void WebEngine::Create( int width, int height, const std::string& locale, const std::string& timezoneId )
1047 {
1048 }
1049
1050 void WebEngine::Create( int width, int height, int argc, char** argv )
1051 {
1052 }
1053
1054 void WebEngine::Destroy()
1055 {
1056 }
1057
1058 WebEngineSettings& WebEngine::GetSettings() const
1059 {
1060   return Internal::Adaptor::GetImplementation( *this ).GetSettings();
1061 }
1062
1063 WebEngineContext& WebEngine::GetContext() const
1064 {
1065   return Internal::Adaptor::GetImplementation( *this ).GetContext();
1066 }
1067
1068 WebEngineCookieManager& WebEngine::GetCookieManager() const
1069 {
1070   return Internal::Adaptor::GetImplementation( *this ).GetCookieManager();
1071 }
1072
1073 WebEngineBackForwardList& WebEngine::GetBackForwardList() const
1074 {
1075   return Internal::Adaptor::GetImplementation( *this ).GetBackForwardList();
1076 }
1077
1078 void WebEngine::LoadUrl( const std::string& url )
1079 {
1080   return Internal::Adaptor::GetImplementation( *this ).LoadUrl( url );
1081 }
1082
1083 std::string WebEngine::GetTitle() const
1084 {
1085   return Internal::Adaptor::GetImplementation( *this ).GetTitle();
1086 }
1087
1088 Dali::PixelData WebEngine::GetFavicon() const
1089 {
1090   return Internal::Adaptor::GetImplementation( *this ).GetFavicon();
1091 }
1092
1093 const std::string& WebEngine::GetUrl()
1094 {
1095   return Internal::Adaptor::GetImplementation( *this ).GetUrl();
1096 }
1097
1098 NativeImageInterfacePtr WebEngine::GetNativeImageSource()
1099 {
1100   Any source;
1101   Dali::NativeImageSourcePtr sourcePtr = Dali::NativeImageSource::New( source );
1102   return sourcePtr;
1103 }
1104
1105 void WebEngine::LoadHtmlString( const std::string& htmlString )
1106 {
1107 }
1108
1109 bool WebEngine::LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri, const std::string& unreachableUrl)
1110 {
1111   return true;
1112 }
1113
1114 bool WebEngine::LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType, const std::string& encoding, const std::string& baseUri)
1115 {
1116   return true;
1117 }
1118
1119 void WebEngine::Reload()
1120 {
1121 }
1122
1123 bool WebEngine::ReloadWithoutCache()
1124 {
1125   return true;
1126 }
1127
1128 void WebEngine::StopLoading()
1129 {
1130 }
1131
1132 void WebEngine::Suspend()
1133 {
1134 }
1135
1136 void WebEngine::Resume()
1137 {
1138 }
1139
1140 void WebEngine::SuspendNetworkLoading()
1141 {
1142 }
1143
1144 void WebEngine::ResumeNetworkLoading()
1145 {
1146 }
1147
1148 bool WebEngine::AddCustomHeader(const std::string& name, const std::string& value)
1149 {
1150   return true;
1151 }
1152
1153 bool WebEngine::RemoveCustomHeader(const std::string& name)
1154 {
1155   return true;
1156 }
1157
1158 uint32_t WebEngine::StartInspectorServer(uint32_t port)
1159 {
1160   return port;
1161 }
1162
1163 bool WebEngine::StopInspectorServer()
1164 {
1165   return true;
1166 }
1167
1168 bool WebEngine::CanGoForward()
1169 {
1170   return Internal::Adaptor::GetImplementation( *this ).CanGoForward();
1171 }
1172
1173 void WebEngine::GoForward()
1174 {
1175   Internal::Adaptor::GetImplementation( *this ).GoForward();
1176 }
1177
1178 bool WebEngine::CanGoBack()
1179 {
1180   return Internal::Adaptor::GetImplementation( *this ).CanGoBack();
1181 }
1182
1183 void WebEngine::GoBack()
1184 {
1185   Internal::Adaptor::GetImplementation( *this ).GoBack();
1186 }
1187
1188 void WebEngine::EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
1189 {
1190   Internal::Adaptor::GetImplementation( *this ).EvaluateJavaScript( script, resultHandler );
1191 }
1192
1193 void WebEngine::AddJavaScriptMessageHandler( const std::string& exposedObjectName, std::function< void(const std::string&) > handler )
1194 {
1195 }
1196
1197 void WebEngine::RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
1198 {
1199   Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptAlertCallback( callback );
1200 }
1201
1202 void WebEngine::JavaScriptAlertReply()
1203 {
1204 }
1205
1206 void WebEngine::RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
1207 {
1208   Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptConfirmCallback( callback );
1209 }
1210
1211 void WebEngine::JavaScriptConfirmReply( bool confirmed )
1212 {
1213 }
1214
1215 void WebEngine::RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
1216 {
1217   Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptPromptCallback( callback );
1218 }
1219
1220 void WebEngine::JavaScriptPromptReply( const std::string& result )
1221 {
1222 }
1223
1224 void WebEngine::ClearAllTilesResources()
1225 {
1226 }
1227
1228 void WebEngine::ClearHistory()
1229 {
1230   Internal::Adaptor::GetImplementation( *this ).ClearHistory();
1231 }
1232
1233 void WebEngine::SetScaleFactor(float scaleFactor, Dali::Vector2 point)
1234 {
1235   Internal::Adaptor::GetImplementation( *this ).SetScaleFactor(scaleFactor, point);
1236 }
1237
1238 float WebEngine::GetScaleFactor() const
1239 {
1240   return Internal::Adaptor::GetImplementation( *this ).GetScaleFactor();
1241 }
1242
1243 void WebEngine::ActivateAccessibility(bool activated)
1244 {
1245 }
1246
1247 bool WebEngine::HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
1248 {
1249   return true;
1250 }
1251
1252 void WebEngine::AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
1253 {
1254 }
1255
1256 Dali::PixelData WebEngine::GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
1257 {
1258   return Internal::Adaptor::GetImplementation( *this ).GetScreenshot(viewArea, scaleFactor);
1259 }
1260
1261 bool WebEngine::GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
1262 {
1263   return Internal::Adaptor::GetImplementation( *this ).GetScreenshotAsynchronously(viewArea, scaleFactor, callback);
1264 }
1265
1266 bool WebEngine::CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
1267 {
1268   return Internal::Adaptor::GetImplementation( *this ).CheckVideoPlayingAsynchronously(callback);
1269 }
1270
1271 void WebEngine::RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
1272 {
1273   Internal::Adaptor::GetImplementation( *this ).RegisterGeolocationPermissionCallback(callback);
1274 }
1275
1276 const std::string& WebEngine::GetUserAgent() const
1277 {
1278   return Internal::Adaptor::GetImplementation( *this ).GetUserAgent();
1279 }
1280
1281 void WebEngine::SetUserAgent( const std::string& userAgent )
1282 {
1283   Internal::Adaptor::GetImplementation( *this ).SetUserAgent( userAgent );
1284 }
1285
1286 void WebEngine::ScrollBy( int dx, int dy )
1287 {
1288   Internal::Adaptor::GetImplementation( *this ).ScrollBy( dx, dy );
1289 }
1290
1291 bool WebEngine::ScrollEdgeBy( int dx, int dy )
1292 {
1293   return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeBy( dx, dy );
1294 }
1295
1296 void WebEngine::SetScrollPosition( int x, int y )
1297 {
1298   Internal::Adaptor::GetImplementation( *this ).SetScrollPosition( x, y );
1299 }
1300
1301 Dali::Vector2 WebEngine::GetScrollPosition() const
1302 {
1303   return Internal::Adaptor::GetImplementation( *this ).GetScrollPosition();
1304 }
1305
1306 Dali::Vector2 WebEngine::GetScrollSize() const
1307 {
1308   return Internal::Adaptor::GetImplementation( *this ).GetScrollSize();
1309 }
1310
1311 Dali::Vector2 WebEngine::GetContentSize() const
1312 {
1313   return Internal::Adaptor::GetImplementation( *this ).GetContentSize();
1314 }
1315
1316 void WebEngine::SetSize( int width, int height )
1317 {
1318 }
1319
1320 void WebEngine::SetDocumentBackgroundColor(Dali::Vector4 color)
1321 {
1322 }
1323
1324 void WebEngine::ClearTilesWhenHidden(bool cleared)
1325 {
1326 }
1327
1328 void WebEngine::SetTileCoverAreaMultiplier(float multiplier)
1329 {
1330 }
1331
1332 void WebEngine::EnableCursorByClient(bool enabled)
1333 {
1334 }
1335
1336 std::string WebEngine::GetSelectedText() const
1337 {
1338   return "test";
1339 }
1340
1341 bool WebEngine::SendTouchEvent( const TouchEvent& touch )
1342 {
1343   return true;
1344 }
1345
1346 bool WebEngine::SendKeyEvent( const KeyEvent& event )
1347 {
1348   return true;
1349 }
1350
1351 bool WebEngine::SendHoverEvent( const HoverEvent& event )
1352 {
1353   return true;
1354 }
1355
1356 bool WebEngine::SendWheelEvent( const WheelEvent& event )
1357 {
1358   return true;
1359 }
1360
1361 void WebEngine::SetFocus( bool focused )
1362 {
1363 }
1364
1365 void WebEngine::SetPageZoomFactor(float zoomFactor)
1366 {
1367   Internal::Adaptor::GetImplementation( *this ).SetPageZoomFactor(zoomFactor);
1368 }
1369
1370 float WebEngine::GetPageZoomFactor() const
1371 {
1372   return Internal::Adaptor::GetImplementation( *this ).GetPageZoomFactor();
1373 }
1374
1375 void WebEngine::SetTextZoomFactor(float zoomFactor)
1376 {
1377   Internal::Adaptor::GetImplementation( *this ).SetTextZoomFactor(zoomFactor);
1378 }
1379
1380 float WebEngine::GetTextZoomFactor() const
1381 {
1382   return Internal::Adaptor::GetImplementation( *this ).GetTextZoomFactor();
1383 }
1384
1385 float WebEngine::GetLoadProgressPercentage() const
1386 {
1387   return Internal::Adaptor::GetImplementation( *this ).GetLoadProgressPercentage();
1388 }
1389
1390 void WebEngine::UpdateDisplayArea( Dali::Rect< int > displayArea )
1391 {
1392 }
1393
1394 void WebEngine::EnableVideoHole( bool enabled )
1395 {
1396 }
1397
1398 void WebEngine::EnableMouseEvents( bool enabled )
1399 {
1400 }
1401
1402 void WebEngine::EnableKeyEvents( bool enabled )
1403 {
1404 }
1405
1406 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadStartedSignal()
1407 {
1408   return Internal::Adaptor::GetImplementation( *this ).PageLoadStartedSignal();
1409 }
1410
1411 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadInProgressSignal()
1412 {
1413   return Internal::Adaptor::GetImplementation( *this ).PageLoadInProgressSignal();
1414 }
1415
1416 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadFinishedSignal()
1417 {
1418   return Internal::Adaptor::GetImplementation( *this ).PageLoadFinishedSignal();
1419 }
1420
1421 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& WebEngine::PageLoadErrorSignal()
1422 {
1423   return Internal::Adaptor::GetImplementation( *this ).PageLoadErrorSignal();
1424 }
1425
1426 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& WebEngine::ScrollEdgeReachedSignal()
1427 {
1428   return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeReachedSignal();
1429 }
1430
1431 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& WebEngine::UrlChangedSignal()
1432 {
1433   return Internal::Adaptor::GetImplementation( *this ).UrlChangedSignal();
1434 }
1435
1436 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& WebEngine::FormRepostDecisionSignal()
1437 {
1438   return Internal::Adaptor::GetImplementation( *this ).FormRepostDecisionSignal();
1439 }
1440
1441 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& WebEngine::FrameRenderedSignal()
1442 {
1443   return Internal::Adaptor::GetImplementation( *this ).FrameRenderedSignal();
1444 }
1445
1446 } // namespace Dali;
1447