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