2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include "toolkit-timer.h"
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-certificate.h>
24 #include <dali/devel-api/adaptor-framework/web-engine-console-message.h>
25 #include <dali/devel-api/adaptor-framework/web-engine-context.h>
26 #include <dali/devel-api/adaptor-framework/web-engine-cookie-manager.h>
27 #include <dali/devel-api/adaptor-framework/web-engine-form-repost-decision.h>
28 #include <dali/devel-api/adaptor-framework/web-engine-frame.h>
29 #include <dali/devel-api/adaptor-framework/web-engine-http-auth-handler.h>
30 #include <dali/devel-api/adaptor-framework/web-engine-load-error.h>
31 #include <dali/devel-api/adaptor-framework/web-engine-policy-decision.h>
32 #include <dali/devel-api/adaptor-framework/web-engine-request-interceptor.h>
33 #include <dali/devel-api/adaptor-framework/web-engine-settings.h>
34 #include <dali/public-api/adaptor-framework/native-image-source.h>
35 #include <dali/public-api/images/pixel-data.h>
36 #include <dali/public-api/object/any.h>
37 #include <dali/public-api/object/base-object.h>
40 #include <toolkit-application.h>
56 // Generally only one WebEngine instance exists.
57 // If > 1, a new web engine has been created by CreateWindowSignal.
58 static WebEngine* gInstance = 0;
59 static int gInstanceCount = 0;
64 bool OnEvaluteJavaScript();
65 bool OnJavaScriptAlert();
66 bool OnJavaScriptConfirm();
67 bool OnJavaScriptPrompt();
69 bool OnScreenshotCaptured();
70 bool OnVideoPlaying();
71 bool OnGeolocationPermission();
72 bool OnClearHistory();
74 static void ConnectToGlobalSignal( bool ( *func )() )
76 Dali::Timer timer = Dali::Timer::New( 0 );
77 timer.TickSignal().Connect( func );
80 static void DisconnectFromGlobalSignal( bool ( *func )() )
82 Dali::Timer timer = Dali::Timer::New( 0 );
83 timer.TickSignal().Disconnect( func );
85 } // namespace anonymous
87 class MockWebEngineContext : public Dali::WebEngineContext
90 MockWebEngineContext()
91 : mockModel( Dali::WebEngineContext::CacheModel::DOCUMENT_VIEWER )
95 Dali::WebEngineContext::CacheModel GetCacheModel() const override
100 void SetCacheModel( Dali::WebEngineContext::CacheModel cacheModel ) override
102 mockModel = cacheModel;
105 void SetProxyUri( const std::string& uri ) override
109 void SetDefaultProxyAuth( const std::string& username, const std::string& password ) override
113 void SetCertificateFilePath( const std::string& certificatePath ) override
117 void DeleteWebDatabase() override
121 void DeleteWebStorage() override
125 void DeleteLocalFileSystem() override
129 void DisableCache( bool cacheDisabled ) override
133 void ClearCache() override
138 Dali::WebEngineContext::CacheModel mockModel;
141 class MockWebEngineCookieManager : public Dali::WebEngineCookieManager
144 MockWebEngineCookieManager()
145 : mockCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy::NO_THIRD_PARTY )
149 void SetCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy policy ) override
151 mockCookieAcceptPolicy = policy;
154 Dali::WebEngineCookieManager::CookieAcceptPolicy GetCookieAcceptPolicy() const override
156 return mockCookieAcceptPolicy;
159 void ClearCookies() override
163 void SetPersistentStorage( const std::string& path, Dali::WebEngineCookieManager::CookiePersistentStorage storage ) override
168 Dali::WebEngineCookieManager::CookieAcceptPolicy mockCookieAcceptPolicy;
171 class MockWebEngineBackForwardListItem : public Dali::WebEngineBackForwardListItem
174 MockWebEngineBackForwardListItem()
175 : mockUrl( "http://url" ),
176 mockTitle( "title" ),
177 mockOriginalUrl( "http://originalurl" )
181 std::string GetUrl() const override
186 std::string GetTitle() const override
191 std::string GetOriginalUrl() const override
193 return mockOriginalUrl;
198 std::string mockTitle;
199 std::string mockOriginalUrl;
202 class MockWebEngineBackForwardList : public Dali::WebEngineBackForwardList
205 MockWebEngineBackForwardList()
207 pMockItem( &mockItem )
211 Dali::WebEngineBackForwardListItem& GetCurrentItem() const override
216 Dali::WebEngineBackForwardListItem& GetItemAtIndex( uint32_t index ) const override
221 uint32_t GetItemCount() const override
227 MockWebEngineBackForwardListItem mockItem;
228 WebEngineBackForwardListItem* pMockItem;
231 class MockWebEngineCertificate : public Dali::WebEngineCertificate
234 MockWebEngineCertificate()
238 void Allow(bool allowed) override
242 bool IsFromMainFrame() const override
247 std::string GetPem() const override
252 bool IsContextSecure() const override
258 class MockWebEngineHttpAuthHandler : public Dali::WebEngineHttpAuthHandler
261 MockWebEngineHttpAuthHandler()
265 std::string GetRealm() const override
270 void Suspend() override
274 void UseCredential(const std::string& user, const std::string& password) override
278 void CancelCredential() override
283 class MockWebEngineFormRepostDecision : public WebEngineFormRepostDecision
286 MockWebEngineFormRepostDecision()
290 void Reply(bool allowed) override {}
293 class MockWebEngineFrame : public Dali::WebEngineFrame
300 bool IsMainFrame() const override
306 class MockWebEnginePolicyDecision : public Dali::WebEnginePolicyDecision
309 MockWebEnginePolicyDecision()
313 std::string GetUrl() const override
315 return "http://test.html";
318 std::string GetCookie() const override
323 Dali::WebEnginePolicyDecision::DecisionType GetDecisionType() const
325 return Dali::WebEnginePolicyDecision::DecisionType::USE;
328 std::string GetResponseMime() const
333 int32_t GetResponseStatusCode() const
338 Dali::WebEnginePolicyDecision::NavigationType GetNavigationType() const
340 return Dali::WebEnginePolicyDecision::NavigationType::LINK_CLICKED;
343 Dali::WebEngineFrame& GetFrame() const
345 return *(Dali::WebEngineFrame*)(&mockWebFrame);
348 std::string GetScheme() const
369 MockWebEngineFrame mockWebFrame;
372 class MockWebEngineRequestInterceptor : public WebEngineRequestInterceptor
375 MockWebEngineRequestInterceptor()
379 std::string GetUrl() const override
381 return "http://test.html";
384 bool Ignore() override
389 bool SetResponseStatus(int statusCode, const std::string &customedStatusText) override
394 bool AddResponseHeader(const std::string &fieldName, const std::string &fieldValue) override
399 bool AddResponseBody(const std::string &body, uint32_t length) override
405 class MockWebEngineConsoleMessage : public Dali::WebEngineConsoleMessage
408 MockWebEngineConsoleMessage()
412 std::string GetSource() const override
417 uint32_t GetLine() const override
422 SeverityLevel GetSeverityLevel() const override
424 return SeverityLevel::EMPTY;
427 std::string GetText() const override
429 return "This is a text.";
433 class MockWebEngineLoadError : public Dali::WebEngineLoadError
436 MockWebEngineLoadError(const std::string& url)
441 std::string GetUrl() const override
446 ErrorCode GetCode() const override
448 return ErrorCode::UNKNOWN;
451 std::string GetDescription() const override
453 return "This is an error.";
456 ErrorType GetType() const override
458 return ErrorType::NONE;
465 class MockWebEngineSettings : public WebEngineSettings
468 MockWebEngineSettings()
469 : mockDefaultFontSize( 16 ),
470 mockJavaScriptEnabled( true ),
471 mockAutoFittingEnabled ( true ),
472 mockPluginsEnabled ( true ),
473 mockPrivateBrowsingEnabled( true ),
474 mockLinkMagnifierEnabled( true ),
475 mockKeypadWithoutUserActionUsed( true ),
476 mockAutofillPasswordFormEnabled( true ),
477 mockFormCandidateDataEnabled( true ),
478 mockTextSelectionEnabled( true ),
479 mockTextAutosizingEnable( true ),
480 mockArrowScrollEnable( true ),
481 mockClipboardEnabled( true ),
482 mockImePanelEnabled( true ),
483 mockImageLoadedAutomatically( true ),
484 mockDefaultTextEncodingName()
488 uint32_t GetDefaultFontSize() const override
490 return mockDefaultFontSize;
493 void SetDefaultFontSize( uint32_t size ) override
495 mockDefaultFontSize = size;
498 bool IsJavaScriptEnabled() const override
500 return mockJavaScriptEnabled;
503 void EnableJavaScript( bool enabled ) override
505 mockJavaScriptEnabled = enabled;
508 bool IsAutoFittingEnabled() const override
510 return mockAutoFittingEnabled;
513 void EnableAutoFitting( bool enabled ) override
515 mockAutoFittingEnabled = enabled;
518 bool ArePluginsEnabled() const override
520 return mockPluginsEnabled;
523 void EnablePlugins( bool enabled ) override
525 mockPluginsEnabled = enabled;
528 bool IsPrivateBrowsingEnabled() const override
530 return mockPrivateBrowsingEnabled;
533 void EnablePrivateBrowsing( bool enabled ) override
535 mockPrivateBrowsingEnabled = enabled;
538 bool IsLinkMagnifierEnabled() const override
540 return mockLinkMagnifierEnabled;
543 void EnableLinkMagnifier( bool enabled ) override
545 mockLinkMagnifierEnabled = enabled;
548 bool IsKeypadWithoutUserActionUsed() const override
550 return mockKeypadWithoutUserActionUsed;
553 void UseKeypadWithoutUserAction( bool used ) override
555 mockKeypadWithoutUserActionUsed = used;
558 bool IsAutofillPasswordFormEnabled() const override
560 return mockAutofillPasswordFormEnabled;
563 void EnableAutofillPasswordForm( bool enabled ) override
565 mockAutofillPasswordFormEnabled = enabled;
568 bool IsFormCandidateDataEnabled() const override
570 return mockFormCandidateDataEnabled;
573 void EnableFormCandidateData( bool enabled ) override
575 mockFormCandidateDataEnabled = enabled;
578 bool IsTextSelectionEnabled() const override
580 return mockTextSelectionEnabled;
583 void EnableTextSelection( bool enabled ) override
585 mockTextSelectionEnabled = enabled;
588 bool IsTextAutosizingEnabled() const override
590 return mockTextAutosizingEnable;
593 void EnableTextAutosizing( bool enabled ) override
595 mockTextAutosizingEnable = enabled;
598 bool IsArrowScrollEnabled() const override
600 return mockArrowScrollEnable;
603 void EnableArrowScroll( bool enabled ) override
605 mockArrowScrollEnable = enabled;
608 bool IsClipboardEnabled() const override
610 return mockClipboardEnabled;
613 void EnableClipboard( bool enabled ) override
615 mockClipboardEnabled = enabled;
618 bool IsImePanelEnabled() const override
620 return mockImePanelEnabled;
623 void EnableImePanel( bool enabled ) override
625 mockImePanelEnabled = enabled;
628 bool AreImagesLoadedAutomatically() const override
630 return mockImageLoadedAutomatically;
633 void AllowImagesLoadAutomatically( bool automatic ) override
635 mockImageLoadedAutomatically = automatic;
638 std::string GetDefaultTextEncodingName() const override
640 return mockDefaultTextEncodingName;
643 void SetDefaultTextEncodingName( const std::string& defaultTextEncodingName ) override
645 mockDefaultTextEncodingName = defaultTextEncodingName;
648 void AllowMixedContents( bool allowed ) override
652 void EnableSpatialNavigation( bool enabled ) override
656 void EnableWebSecurity( bool enabled ) override
660 void EnableCacheBuilder( bool enabled ) override
664 void UseScrollbarThumbFocusNotifications( bool used ) override
668 void EnableDoNotTrack( bool enabled ) override
672 void AllowFileAccessFromExternalUrl( bool allowed ) override
676 void AllowScriptsOpenWindows( bool allowed ) override
681 int mockDefaultFontSize;
682 bool mockJavaScriptEnabled;
683 bool mockAutoFittingEnabled;
684 bool mockPluginsEnabled;
685 bool mockPrivateBrowsingEnabled;
686 bool mockLinkMagnifierEnabled;
687 bool mockKeypadWithoutUserActionUsed;
688 bool mockAutofillPasswordFormEnabled;
689 bool mockFormCandidateDataEnabled;
690 bool mockTextSelectionEnabled;
691 bool mockTextAutosizingEnable;
692 bool mockArrowScrollEnable;
693 bool mockClipboardEnabled;
694 bool mockImePanelEnabled;
695 bool mockImageLoadedAutomatically;
696 std::string mockDefaultTextEncodingName;
699 class WebEngine: public Dali::BaseObject
703 using JavaScriptEvaluatedResultCallback = std::function<void(const std::string&)>;
707 , mCurrentPlusOnePos( 0 )
709 , mEvaluating( false )
710 , mScrollPosition( 0, 0 )
711 , mScrollSize( 500, 500 )
712 , mContentSize( 500, 500 )
715 if ( gInstanceCount == 1 ) // only first web engine need be saved.
720 mockWebEngineSettings = new MockWebEngineSettings();
721 mockWebEngineContext = new MockWebEngineContext();
722 mockWebEngineCookieManager = new MockWebEngineCookieManager();
723 mockWebEngineBackForwardList = new MockWebEngineBackForwardList();
729 if( !gInstanceCount )
734 delete mockWebEngineSettings;
735 delete mockWebEngineContext;
736 delete mockWebEngineCookieManager;
737 delete mockWebEngineBackForwardList;
740 Dali::WebEngineSettings& GetSettings() const
742 return *mockWebEngineSettings;
745 Dali::WebEngineContext& GetContext() const
747 return *mockWebEngineContext;
750 Dali::WebEngineCookieManager& GetCookieManager() const
752 return *mockWebEngineCookieManager;
755 Dali::WebEngineBackForwardList& GetBackForwardList() const
757 return *mockWebEngineBackForwardList;
760 void LoadUrl( const std::string& url )
763 ConnectToGlobalSignal( &OnLoadUrl );
766 const std::string& GetUrl() const
771 std::string GetTitle() const
773 return std::string("title");
776 Dali::PixelData GetFavicon() const
778 uint8_t* faviconData = new uint8_t[ 16 ];
780 faviconData[ 0 ] = 0xff;
781 faviconData[ 1 ] = 0x00;
782 faviconData[ 2 ] = 0x00;
783 faviconData[ 3 ] = 0xff;
784 faviconData[ 4 ] = 0xff;
785 faviconData[ 5 ] = 0x00;
786 faviconData[ 6 ] = 0x00;
787 faviconData[ 7 ] = 0xff;
788 faviconData[ 8 ] = 0xff;
789 faviconData[ 9 ] = 0x00;
790 faviconData[ 10 ] = 0x00;
791 faviconData[ 11 ] = 0xff;
792 faviconData[ 12 ] = 0xff;
793 faviconData[ 13 ] = 0x00;
794 faviconData[ 14 ] = 0x00;
795 faviconData[ 15 ] = 0xff;
797 return Dali::PixelData::New( faviconData, 16, 2, 2,
798 Dali::Pixel::Format::RGBA8888,
799 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
802 bool CanGoForward() const
804 return mHistory.size() > mCurrentPlusOnePos;
809 ConnectToGlobalSignal( &OnGoForward );
812 bool CanGoBack() const
814 return mCurrentPlusOnePos > 1;
819 ConnectToGlobalSignal( &OnGoBack );
822 void EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
828 ConnectToGlobalSignal( &OnEvaluteJavaScript );
830 mResultCallbacks.push_back( resultHandler );
834 void RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
838 ConnectToGlobalSignal( &OnJavaScriptAlert );
839 mJavaScriptAlertCallback = callback;
843 void RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
847 ConnectToGlobalSignal( &OnJavaScriptConfirm );
848 mJavaScriptConfirmCallback = callback;
852 void RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
856 ConnectToGlobalSignal( &OnJavaScriptPrompt );
857 mJavaScriptPromptCallback = callback;
863 ConnectToGlobalSignal( &OnClearHistory );
866 const std::string& GetUserAgent() const
871 void SetUserAgent( const std::string& userAgent )
873 mUserAgent = userAgent;
876 void ScrollBy( int dx, int dy )
878 mScrollPosition += Dali::Vector2( dx, dy );
879 if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
881 ConnectToGlobalSignal( &OnScrollEdge );
885 bool ScrollEdgeBy( int dx, int dy )
887 mScrollPosition += Dali::Vector2( dx, dy );
888 if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
890 ConnectToGlobalSignal( &OnScrollEdge );
895 void SetScrollPosition( int x, int y )
897 mScrollPosition.x = x;
898 mScrollPosition.y = y;
901 Dali::Vector2 GetScrollPosition() const
903 return mScrollPosition;
906 Dali::Vector2 GetScrollSize() const
911 Dali::Vector2 GetContentSize() const
916 void SetPageZoomFactor(float zoomFactor)
918 mPageZoomFactor = zoomFactor;
921 float GetPageZoomFactor() const
923 return mPageZoomFactor;
926 void SetTextZoomFactor(float zoomFactor)
928 mTextZoomFactor = zoomFactor;
931 float GetTextZoomFactor() const
933 return mTextZoomFactor;
936 float GetLoadProgressPercentage() const
941 void SetScaleFactor(float scaleFactor, Dali::Vector2 point)
943 mScaleFactor = scaleFactor;
946 float GetScaleFactor() const
951 Dali::PixelData GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
953 uint32_t bufferSize = viewArea.width * viewArea.height * 4 ;
954 uint8_t* pixel = new uint8_t[ bufferSize ];
955 memset(pixel, 0xff, bufferSize);
956 return Dali::PixelData::New( pixel, bufferSize, viewArea.width, viewArea.height,
957 Dali::Pixel::Format::RGBA8888,
958 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
961 bool GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
965 ConnectToGlobalSignal( &OnScreenshotCaptured );
966 mScreenshotCapturedCallback = callback;
971 bool CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
975 ConnectToGlobalSignal( &OnVideoPlaying );
976 mVideoPlayingCallback = callback;
981 void RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
985 ConnectToGlobalSignal( &OnGeolocationPermission );
986 mGeolocationPermissionCallback = callback;
990 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadStartedSignal()
992 return mPageLoadStartedSignal;
995 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadInProgressSignal()
997 return mPageLoadInProgressSignal;
1000 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadFinishedSignal()
1002 return mPageLoadFinishedSignal;
1005 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& PageLoadErrorSignal()
1007 return mPageLoadErrorSignal;
1010 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& ScrollEdgeReachedSignal()
1012 return mScrollEdgeReachedSignal;
1015 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& UrlChangedSignal()
1017 return mUrlChangedSignal;
1020 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& FormRepostDecisionSignal()
1022 return mFormRepostDecisionSignal;
1025 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& FrameRenderedSignal()
1027 return mFrameRenderedSignal;
1030 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType& RequestInterceptorSignal()
1032 return mRequestInterceptorSignal;
1035 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType& ConsoleMessageSignal()
1037 return mConsoleMessageSignal;
1040 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType& PolicyDecisionSignal()
1042 return mPolicyDecisionSignal;
1045 Dali::WebEnginePlugin::WebEngineCertificateSignalType& CertificateConfirmSignal()
1047 return mCertificateConfirmSignal;
1050 Dali::WebEnginePlugin::WebEngineCertificateSignalType& SslCertificateChangedSignal()
1052 return mSslCertificateChangedSignal;
1055 Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& HttpAuthHandlerSignal()
1057 return mHttpAuthHandlerSignal;
1061 std::vector<std::string> mHistory;
1062 size_t mCurrentPlusOnePos;
1063 std::string mUserAgent;
1065 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadStartedSignal;
1066 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadInProgressSignal;
1067 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadFinishedSignal;
1068 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType mPageLoadErrorSignal;
1069 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType mScrollEdgeReachedSignal;
1070 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType mUrlChangedSignal;
1071 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
1072 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType mFrameRenderedSignal;
1073 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal;
1074 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType mConsoleMessageSignal;
1075 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType mPolicyDecisionSignal;
1076 Dali::WebEnginePlugin::WebEngineCertificateSignalType mCertificateConfirmSignal;
1077 Dali::WebEnginePlugin::WebEngineCertificateSignalType mSslCertificateChangedSignal;
1078 Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType mHttpAuthHandlerSignal;
1081 float mPageZoomFactor;
1082 float mTextZoomFactor;
1085 Dali::Vector2 mScrollPosition;
1086 Dali::Vector2 mScrollSize;
1087 Dali::Vector2 mContentSize;
1088 WebEngineBackForwardList* mockWebEngineBackForwardList;
1089 WebEngineContext* mockWebEngineContext;
1090 WebEngineCookieManager* mockWebEngineCookieManager;
1091 WebEngineSettings* mockWebEngineSettings;
1093 std::vector<JavaScriptEvaluatedResultCallback> mResultCallbacks;
1094 Dali::WebEnginePlugin::JavaScriptAlertCallback mJavaScriptAlertCallback;
1095 Dali::WebEnginePlugin::JavaScriptConfirmCallback mJavaScriptConfirmCallback;
1096 Dali::WebEnginePlugin::JavaScriptPromptCallback mJavaScriptPromptCallback;
1097 Dali::WebEnginePlugin::ScreenshotCapturedCallback mScreenshotCapturedCallback;
1098 Dali::WebEnginePlugin::VideoPlayingCallback mVideoPlayingCallback;
1099 Dali::WebEnginePlugin::GeolocationPermissionCallback mGeolocationPermissionCallback;
1108 DisconnectFromGlobalSignal( &OnGoBack );
1110 if( gInstance && gInstance->CanGoBack() )
1112 gInstance->mCurrentPlusOnePos--;
1119 DisconnectFromGlobalSignal( &OnGoForward );
1121 if( gInstance && gInstance->CanGoForward() )
1123 gInstance->mCurrentPlusOnePos++;
1130 DisconnectFromGlobalSignal( &OnLoadUrl );
1134 if( gInstance->mHistory.size() > gInstance->mCurrentPlusOnePos )
1136 gInstance->mHistory.erase( gInstance->mHistory.begin() + gInstance->mCurrentPlusOnePos, gInstance->mHistory.end() );
1138 gInstance->mHistory.push_back( gInstance->mUrl );
1139 gInstance->mCurrentPlusOnePos++;
1140 gInstance->mPageLoadStartedSignal.Emit( gInstance->mUrl );
1141 gInstance->mPageLoadInProgressSignal.Emit( gInstance->mUrl );
1142 gInstance->mPageLoadFinishedSignal.Emit( gInstance->mUrl );
1143 gInstance->mUrlChangedSignal.Emit( "http://new-test" );
1145 std::shared_ptr<Dali::WebEngineFormRepostDecision> repostDecision(new MockWebEngineFormRepostDecision());
1146 gInstance->mFormRepostDecisionSignal.Emit(std::move(repostDecision));
1147 gInstance->mFrameRenderedSignal.Emit();
1148 std::shared_ptr<Dali::WebEngineRequestInterceptor> interceptor(new MockWebEngineRequestInterceptor());
1149 gInstance->mRequestInterceptorSignal.Emit(std::move(interceptor));
1151 std::shared_ptr<Dali::WebEngineLoadError> error(new MockWebEngineLoadError(gInstance->mUrl));
1152 gInstance->mPageLoadErrorSignal.Emit(std::move(error));
1153 std::shared_ptr<Dali::WebEngineConsoleMessage> message(new MockWebEngineConsoleMessage());
1154 gInstance->mConsoleMessageSignal.Emit(std::move(message));
1155 std::shared_ptr<Dali::WebEnginePolicyDecision> policyDecision(new MockWebEnginePolicyDecision());
1156 gInstance->mPolicyDecisionSignal.Emit(std::move(policyDecision));
1158 std::shared_ptr<Dali::WebEngineCertificate> certificate(new MockWebEngineCertificate());
1159 gInstance->mCertificateConfirmSignal.Emit(std::move(certificate));
1160 std::shared_ptr<Dali::WebEngineCertificate> sslCertificate(new MockWebEngineCertificate());
1161 gInstance->mSslCertificateChangedSignal.Emit(std::move(sslCertificate));
1162 std::shared_ptr<Dali::WebEngineHttpAuthHandler> handler(new MockWebEngineHttpAuthHandler());
1163 gInstance->mHttpAuthHandlerSignal.Emit(std::move(handler));
1170 DisconnectFromGlobalSignal( &OnScrollEdge );
1174 gInstance->mScrollEdgeReachedSignal.Emit( Dali::WebEnginePlugin::ScrollEdge::BOTTOM );
1180 bool OnEvaluteJavaScript()
1182 DisconnectFromGlobalSignal( &OnEvaluteJavaScript );
1186 for( auto& func : gInstance->mResultCallbacks )
1190 gInstance->mResultCallbacks.clear();
1195 bool OnJavaScriptAlert()
1197 DisconnectFromGlobalSignal( &OnJavaScriptAlert );
1200 gInstance->mJavaScriptAlertCallback( "this is an alert popup." );
1205 bool OnJavaScriptConfirm()
1207 DisconnectFromGlobalSignal( &OnJavaScriptConfirm );
1210 gInstance->mJavaScriptConfirmCallback( "this is a confirm popup." );
1215 bool OnJavaScriptPrompt()
1217 DisconnectFromGlobalSignal( &OnJavaScriptPrompt );
1220 gInstance->mJavaScriptPromptCallback( "this is a prompt pompt.", "" );
1225 bool OnScreenshotCaptured()
1227 DisconnectFromGlobalSignal( &OnScreenshotCaptured );
1230 uint8_t* pixel = new uint8_t[ 2 * 2 * 4 ];
1231 memset(pixel, 0xff, 2 * 2 * 4);
1232 Dali::PixelData data = Dali::PixelData::New( pixel, 2 * 2 * 4, 2, 2,
1233 Dali::Pixel::Format::RGBA8888,
1234 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
1235 gInstance->mScreenshotCapturedCallback( data );
1240 bool OnVideoPlaying()
1242 DisconnectFromGlobalSignal( &OnVideoPlaying );
1245 gInstance->mVideoPlayingCallback( true );
1250 bool OnGeolocationPermission()
1252 DisconnectFromGlobalSignal( &OnGeolocationPermission );
1255 gInstance->mGeolocationPermissionCallback( "", "" );
1260 bool OnClearHistory()
1262 DisconnectFromGlobalSignal( &OnClearHistory );
1264 if( gInstance && gInstance->mCurrentPlusOnePos )
1266 std::string url = gInstance->mHistory[ gInstance->mCurrentPlusOnePos - 1 ];
1267 std::vector< std::string >().swap( gInstance->mHistory );
1268 gInstance->mHistory.push_back( url );
1269 gInstance->mCurrentPlusOnePos = 1;
1276 inline WebEngine& GetImplementation( Dali::WebEngine& webEngine )
1278 DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
1279 BaseObject& handle = webEngine.GetBaseObject();
1280 return static_cast< Internal::Adaptor::WebEngine& >( handle );
1283 inline const WebEngine& GetImplementation( const Dali::WebEngine& webEngine )
1285 DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
1286 const BaseObject& handle = webEngine.GetBaseObject();
1287 return static_cast< const Internal::Adaptor::WebEngine& >( handle );
1290 } // namespace Adaptor
1292 } // namespace Internal
1294 // Dali::WebEngine Implementation
1295 WebEngine::WebEngine()
1299 WebEngine::WebEngine( Internal::Adaptor::WebEngine* internal )
1300 : BaseHandle( internal )
1304 WebEngine::~WebEngine()
1308 WebEngine WebEngine::New()
1310 Internal::Adaptor::WebEngine* baseObject = new Internal::Adaptor::WebEngine();
1312 return WebEngine( baseObject );
1315 WebEngine::WebEngine( const WebEngine& WebEngine )
1316 : BaseHandle( WebEngine )
1320 WebEngine& WebEngine::operator=( const WebEngine& webEngine )
1322 BaseHandle::operator=( webEngine );
1326 WebEngine WebEngine::DownCast( BaseHandle handle )
1328 return WebEngine( dynamic_cast< Internal::Adaptor::WebEngine* >( handle.GetObjectPtr() ) );
1331 void WebEngine::Create( int width, int height, const std::string& locale, const std::string& timezoneId )
1335 void WebEngine::Create( int width, int height, int argc, char** argv )
1339 void WebEngine::Destroy()
1343 WebEngineSettings& WebEngine::GetSettings() const
1345 return Internal::Adaptor::GetImplementation( *this ).GetSettings();
1348 WebEngineContext& WebEngine::GetContext() const
1350 return Internal::Adaptor::GetImplementation( *this ).GetContext();
1353 WebEngineCookieManager& WebEngine::GetCookieManager() const
1355 return Internal::Adaptor::GetImplementation( *this ).GetCookieManager();
1358 WebEngineBackForwardList& WebEngine::GetBackForwardList() const
1360 return Internal::Adaptor::GetImplementation( *this ).GetBackForwardList();
1363 void WebEngine::LoadUrl( const std::string& url )
1365 return Internal::Adaptor::GetImplementation( *this ).LoadUrl( url );
1368 std::string WebEngine::GetTitle() const
1370 return Internal::Adaptor::GetImplementation( *this ).GetTitle();
1373 Dali::PixelData WebEngine::GetFavicon() const
1375 return Internal::Adaptor::GetImplementation( *this ).GetFavicon();
1378 const std::string& WebEngine::GetUrl()
1380 return Internal::Adaptor::GetImplementation( *this ).GetUrl();
1383 NativeImageInterfacePtr WebEngine::GetNativeImageSource()
1386 Dali::NativeImageSourcePtr sourcePtr = Dali::NativeImageSource::New( source );
1390 void WebEngine::LoadHtmlString( const std::string& htmlString )
1394 bool WebEngine::LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri, const std::string& unreachableUrl)
1399 bool WebEngine::LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType, const std::string& encoding, const std::string& baseUri)
1404 void WebEngine::Reload()
1408 bool WebEngine::ReloadWithoutCache()
1413 void WebEngine::StopLoading()
1417 void WebEngine::Suspend()
1421 void WebEngine::Resume()
1425 void WebEngine::SuspendNetworkLoading()
1429 void WebEngine::ResumeNetworkLoading()
1433 bool WebEngine::AddCustomHeader(const std::string& name, const std::string& value)
1438 bool WebEngine::RemoveCustomHeader(const std::string& name)
1443 uint32_t WebEngine::StartInspectorServer(uint32_t port)
1448 bool WebEngine::StopInspectorServer()
1453 bool WebEngine::CanGoForward()
1455 return Internal::Adaptor::GetImplementation( *this ).CanGoForward();
1458 void WebEngine::GoForward()
1460 Internal::Adaptor::GetImplementation( *this ).GoForward();
1463 bool WebEngine::CanGoBack()
1465 return Internal::Adaptor::GetImplementation( *this ).CanGoBack();
1468 void WebEngine::GoBack()
1470 Internal::Adaptor::GetImplementation( *this ).GoBack();
1473 void WebEngine::EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
1475 Internal::Adaptor::GetImplementation( *this ).EvaluateJavaScript( script, resultHandler );
1478 void WebEngine::AddJavaScriptMessageHandler( const std::string& exposedObjectName, std::function< void(const std::string&) > handler )
1482 void WebEngine::RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
1484 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptAlertCallback( callback );
1487 void WebEngine::JavaScriptAlertReply()
1491 void WebEngine::RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
1493 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptConfirmCallback( callback );
1496 void WebEngine::JavaScriptConfirmReply( bool confirmed )
1500 void WebEngine::RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
1502 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptPromptCallback( callback );
1505 void WebEngine::JavaScriptPromptReply( const std::string& result )
1509 void WebEngine::ClearAllTilesResources()
1513 void WebEngine::ClearHistory()
1515 Internal::Adaptor::GetImplementation( *this ).ClearHistory();
1518 void WebEngine::SetScaleFactor(float scaleFactor, Dali::Vector2 point)
1520 Internal::Adaptor::GetImplementation( *this ).SetScaleFactor(scaleFactor, point);
1523 float WebEngine::GetScaleFactor() const
1525 return Internal::Adaptor::GetImplementation( *this ).GetScaleFactor();
1528 void WebEngine::ActivateAccessibility(bool activated)
1532 bool WebEngine::HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
1537 void WebEngine::AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
1541 Dali::PixelData WebEngine::GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
1543 return Internal::Adaptor::GetImplementation( *this ).GetScreenshot(viewArea, scaleFactor);
1546 bool WebEngine::GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
1548 return Internal::Adaptor::GetImplementation( *this ).GetScreenshotAsynchronously(viewArea, scaleFactor, callback);
1551 bool WebEngine::CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
1553 return Internal::Adaptor::GetImplementation( *this ).CheckVideoPlayingAsynchronously(callback);
1556 void WebEngine::RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
1558 Internal::Adaptor::GetImplementation( *this ).RegisterGeolocationPermissionCallback(callback);
1561 const std::string& WebEngine::GetUserAgent() const
1563 return Internal::Adaptor::GetImplementation( *this ).GetUserAgent();
1566 void WebEngine::SetUserAgent( const std::string& userAgent )
1568 Internal::Adaptor::GetImplementation( *this ).SetUserAgent( userAgent );
1571 void WebEngine::ScrollBy( int dx, int dy )
1573 Internal::Adaptor::GetImplementation( *this ).ScrollBy( dx, dy );
1576 bool WebEngine::ScrollEdgeBy( int dx, int dy )
1578 return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeBy( dx, dy );
1581 void WebEngine::SetScrollPosition( int x, int y )
1583 Internal::Adaptor::GetImplementation( *this ).SetScrollPosition( x, y );
1586 Dali::Vector2 WebEngine::GetScrollPosition() const
1588 return Internal::Adaptor::GetImplementation( *this ).GetScrollPosition();
1591 Dali::Vector2 WebEngine::GetScrollSize() const
1593 return Internal::Adaptor::GetImplementation( *this ).GetScrollSize();
1596 Dali::Vector2 WebEngine::GetContentSize() const
1598 return Internal::Adaptor::GetImplementation( *this ).GetContentSize();
1601 void WebEngine::SetSize( int width, int height )
1605 void WebEngine::SetDocumentBackgroundColor(Dali::Vector4 color)
1609 void WebEngine::ClearTilesWhenHidden(bool cleared)
1613 void WebEngine::SetTileCoverAreaMultiplier(float multiplier)
1617 void WebEngine::EnableCursorByClient(bool enabled)
1621 std::string WebEngine::GetSelectedText() const
1626 bool WebEngine::SendTouchEvent( const TouchEvent& touch )
1631 bool WebEngine::SendKeyEvent( const KeyEvent& event )
1636 bool WebEngine::SendHoverEvent( const HoverEvent& event )
1641 bool WebEngine::SendWheelEvent( const WheelEvent& event )
1646 void WebEngine::SetFocus( bool focused )
1650 void WebEngine::SetPageZoomFactor(float zoomFactor)
1652 Internal::Adaptor::GetImplementation( *this ).SetPageZoomFactor(zoomFactor);
1655 float WebEngine::GetPageZoomFactor() const
1657 return Internal::Adaptor::GetImplementation( *this ).GetPageZoomFactor();
1660 void WebEngine::SetTextZoomFactor(float zoomFactor)
1662 Internal::Adaptor::GetImplementation( *this ).SetTextZoomFactor(zoomFactor);
1665 float WebEngine::GetTextZoomFactor() const
1667 return Internal::Adaptor::GetImplementation( *this ).GetTextZoomFactor();
1670 float WebEngine::GetLoadProgressPercentage() const
1672 return Internal::Adaptor::GetImplementation( *this ).GetLoadProgressPercentage();
1675 void WebEngine::UpdateDisplayArea( Dali::Rect< int > displayArea )
1679 void WebEngine::EnableVideoHole( bool enabled )
1683 void WebEngine::EnableMouseEvents( bool enabled )
1687 void WebEngine::EnableKeyEvents( bool enabled )
1691 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadStartedSignal()
1693 return Internal::Adaptor::GetImplementation( *this ).PageLoadStartedSignal();
1696 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadInProgressSignal()
1698 return Internal::Adaptor::GetImplementation( *this ).PageLoadInProgressSignal();
1701 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadFinishedSignal()
1703 return Internal::Adaptor::GetImplementation( *this ).PageLoadFinishedSignal();
1706 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& WebEngine::PageLoadErrorSignal()
1708 return Internal::Adaptor::GetImplementation( *this ).PageLoadErrorSignal();
1711 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& WebEngine::ScrollEdgeReachedSignal()
1713 return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeReachedSignal();
1716 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& WebEngine::UrlChangedSignal()
1718 return Internal::Adaptor::GetImplementation( *this ).UrlChangedSignal();
1721 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& WebEngine::FormRepostDecisionSignal()
1723 return Internal::Adaptor::GetImplementation(*this).FormRepostDecisionSignal();
1726 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& WebEngine::FrameRenderedSignal()
1728 return Internal::Adaptor::GetImplementation(*this).FrameRenderedSignal();
1731 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType& WebEngine::RequestInterceptorSignal()
1733 return Internal::Adaptor::GetImplementation(*this).RequestInterceptorSignal();
1736 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType& WebEngine::ConsoleMessageSignal()
1738 return Internal::Adaptor::GetImplementation(*this).ConsoleMessageSignal();
1741 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType& WebEngine::PolicyDecisionSignal()
1743 return Internal::Adaptor::GetImplementation(*this).PolicyDecisionSignal();
1746 Dali::WebEnginePlugin::WebEngineCertificateSignalType& WebEngine::CertificateConfirmSignal()
1748 return Internal::Adaptor::GetImplementation(*this).CertificateConfirmSignal();
1751 Dali::WebEnginePlugin::WebEngineCertificateSignalType& WebEngine::SslCertificateChangedSignal()
1753 return Internal::Adaptor::GetImplementation(*this).SslCertificateChangedSignal();
1756 Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& WebEngine::HttpAuthHandlerSignal()
1758 return Internal::Adaptor::GetImplementation(*this).HttpAuthHandlerSignal();
1761 } // namespace Dali;