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-console-message.h>
24 #include <dali/devel-api/adaptor-framework/web-engine-context.h>
25 #include <dali/devel-api/adaptor-framework/web-engine-cookie-manager.h>
26 #include <dali/devel-api/adaptor-framework/web-engine-form-repost-decision.h>
27 #include <dali/devel-api/adaptor-framework/web-engine-frame.h>
28 #include <dali/devel-api/adaptor-framework/web-engine-policy-decision.h>
29 #include <dali/devel-api/adaptor-framework/web-engine-request-interceptor.h>
30 #include <dali/devel-api/adaptor-framework/web-engine-load-error.h>
31 #include <dali/devel-api/adaptor-framework/web-engine-settings.h>
32 #include <dali/public-api/adaptor-framework/native-image-source.h>
33 #include <dali/public-api/images/pixel-data.h>
34 #include <dali/public-api/object/any.h>
35 #include <dali/public-api/object/base-object.h>
38 #include <toolkit-application.h>
54 // Generally only one WebEngine instance exists.
55 // If > 1, a new web engine has been created by CreateWindowSignal.
56 static WebEngine* gInstance = 0;
57 static int gInstanceCount = 0;
62 bool OnEvaluteJavaScript();
63 bool OnJavaScriptAlert();
64 bool OnJavaScriptConfirm();
65 bool OnJavaScriptPrompt();
67 bool OnScreenshotCaptured();
68 bool OnVideoPlaying();
69 bool OnGeolocationPermission();
70 bool OnClearHistory();
72 static void ConnectToGlobalSignal( bool ( *func )() )
74 Dali::Timer timer = Dali::Timer::New( 0 );
75 timer.TickSignal().Connect( func );
78 static void DisconnectFromGlobalSignal( bool ( *func )() )
80 Dali::Timer timer = Dali::Timer::New( 0 );
81 timer.TickSignal().Disconnect( func );
83 } // namespace anonymous
85 class MockWebEngineContext : public Dali::WebEngineContext
88 MockWebEngineContext()
89 : mockModel( Dali::WebEngineContext::CacheModel::DOCUMENT_VIEWER )
93 Dali::WebEngineContext::CacheModel GetCacheModel() const override
98 void SetCacheModel( Dali::WebEngineContext::CacheModel cacheModel ) override
100 mockModel = cacheModel;
103 void SetProxyUri( const std::string& uri ) override
107 void SetDefaultProxyAuth( const std::string& username, const std::string& password ) override
111 void SetCertificateFilePath( const std::string& certificatePath ) override
115 void DeleteWebDatabase() override
119 void DeleteWebStorage() override
123 void DeleteLocalFileSystem() override
127 void DisableCache( bool cacheDisabled ) override
131 void ClearCache() override
136 Dali::WebEngineContext::CacheModel mockModel;
139 class MockWebEngineCookieManager : public Dali::WebEngineCookieManager
142 MockWebEngineCookieManager()
143 : mockCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy::NO_THIRD_PARTY )
147 void SetCookieAcceptPolicy( Dali::WebEngineCookieManager::CookieAcceptPolicy policy ) override
149 mockCookieAcceptPolicy = policy;
152 Dali::WebEngineCookieManager::CookieAcceptPolicy GetCookieAcceptPolicy() const override
154 return mockCookieAcceptPolicy;
157 void ClearCookies() override
161 void SetPersistentStorage( const std::string& path, Dali::WebEngineCookieManager::CookiePersistentStorage storage ) override
166 Dali::WebEngineCookieManager::CookieAcceptPolicy mockCookieAcceptPolicy;
169 class MockWebEngineBackForwardListItem : public Dali::WebEngineBackForwardListItem
172 MockWebEngineBackForwardListItem()
173 : mockUrl( "http://url" ),
174 mockTitle( "title" ),
175 mockOriginalUrl( "http://originalurl" )
179 std::string GetUrl() const override
184 std::string GetTitle() const override
189 std::string GetOriginalUrl() const override
191 return mockOriginalUrl;
196 std::string mockTitle;
197 std::string mockOriginalUrl;
200 class MockWebEngineBackForwardList : public Dali::WebEngineBackForwardList
203 MockWebEngineBackForwardList()
205 pMockItem( &mockItem )
209 Dali::WebEngineBackForwardListItem& GetCurrentItem() const override
214 Dali::WebEngineBackForwardListItem& GetItemAtIndex( uint32_t index ) const override
219 uint32_t GetItemCount() const override
225 MockWebEngineBackForwardListItem mockItem;
226 WebEngineBackForwardListItem* pMockItem;
229 class MockWebEngineFormRepostDecision : public WebEngineFormRepostDecision
232 MockWebEngineFormRepostDecision()
236 void Reply(bool allowed) override {}
239 class MockWebEngineFrame : public Dali::WebEngineFrame
246 bool IsMainFrame() const override
252 class MockWebEnginePolicyDecision : public Dali::WebEnginePolicyDecision
255 MockWebEnginePolicyDecision()
259 std::string GetUrl() const override
261 return "http://test.html";
264 std::string GetCookie() const override
269 Dali::WebEnginePolicyDecision::DecisionType GetDecisionType() const
271 return Dali::WebEnginePolicyDecision::DecisionType::USE;
274 std::string GetResponseMime() const
279 int32_t GetResponseStatusCode() const
284 Dali::WebEnginePolicyDecision::NavigationType GetNavigationType() const
286 return Dali::WebEnginePolicyDecision::NavigationType::LINK_CLICKED;
289 Dali::WebEngineFrame& GetFrame() const
291 return *(Dali::WebEngineFrame*)(&mockWebFrame);
294 std::string GetScheme() const
315 MockWebEngineFrame mockWebFrame;
318 class MockWebEngineRequestInterceptor : public WebEngineRequestInterceptor
321 MockWebEngineRequestInterceptor()
325 std::string GetUrl() const override
327 return "http://test.html";
330 bool Ignore() override
335 bool SetResponseStatus(int statusCode, const std::string &customedStatusText) override
340 bool AddResponseHeader(const std::string &fieldName, const std::string &fieldValue) override
345 bool AddResponseBody(const std::string &body, uint32_t length) override
351 class MockWebEngineConsoleMessage : public Dali::WebEngineConsoleMessage
354 MockWebEngineConsoleMessage()
358 std::string GetSource() const override
363 uint32_t GetLine() const override
368 SeverityLevel GetSeverityLevel() const override
370 return SeverityLevel::EMPTY;
373 std::string GetText() const override
375 return "This is a text.";
379 class MockWebEngineLoadError : public Dali::WebEngineLoadError
382 MockWebEngineLoadError(const std::string& url)
387 std::string GetUrl() const override
392 ErrorCode GetCode() const override
394 return ErrorCode::UNKNOWN;
397 std::string GetDescription() const override
399 return "This is an error.";
402 ErrorType GetType() const override
404 return ErrorType::NONE;
411 class MockWebEngineSettings : public WebEngineSettings
414 MockWebEngineSettings()
415 : mockDefaultFontSize( 16 ),
416 mockJavaScriptEnabled( true ),
417 mockAutoFittingEnabled ( true ),
418 mockPluginsEnabled ( true ),
419 mockPrivateBrowsingEnabled( true ),
420 mockLinkMagnifierEnabled( true ),
421 mockKeypadWithoutUserActionUsed( true ),
422 mockAutofillPasswordFormEnabled( true ),
423 mockFormCandidateDataEnabled( true ),
424 mockTextSelectionEnabled( true ),
425 mockTextAutosizingEnable( true ),
426 mockArrowScrollEnable( true ),
427 mockClipboardEnabled( true ),
428 mockImePanelEnabled( true ),
429 mockImageLoadedAutomatically( true ),
430 mockDefaultTextEncodingName()
434 uint32_t GetDefaultFontSize() const override
436 return mockDefaultFontSize;
439 void SetDefaultFontSize( uint32_t size ) override
441 mockDefaultFontSize = size;
444 bool IsJavaScriptEnabled() const override
446 return mockJavaScriptEnabled;
449 void EnableJavaScript( bool enabled ) override
451 mockJavaScriptEnabled = enabled;
454 bool IsAutoFittingEnabled() const override
456 return mockAutoFittingEnabled;
459 void EnableAutoFitting( bool enabled ) override
461 mockAutoFittingEnabled = enabled;
464 bool ArePluginsEnabled() const override
466 return mockPluginsEnabled;
469 void EnablePlugins( bool enabled ) override
471 mockPluginsEnabled = enabled;
474 bool IsPrivateBrowsingEnabled() const override
476 return mockPrivateBrowsingEnabled;
479 void EnablePrivateBrowsing( bool enabled ) override
481 mockPrivateBrowsingEnabled = enabled;
484 bool IsLinkMagnifierEnabled() const override
486 return mockLinkMagnifierEnabled;
489 void EnableLinkMagnifier( bool enabled ) override
491 mockLinkMagnifierEnabled = enabled;
494 bool IsKeypadWithoutUserActionUsed() const override
496 return mockKeypadWithoutUserActionUsed;
499 void UseKeypadWithoutUserAction( bool used ) override
501 mockKeypadWithoutUserActionUsed = used;
504 bool IsAutofillPasswordFormEnabled() const override
506 return mockAutofillPasswordFormEnabled;
509 void EnableAutofillPasswordForm( bool enabled ) override
511 mockAutofillPasswordFormEnabled = enabled;
514 bool IsFormCandidateDataEnabled() const override
516 return mockFormCandidateDataEnabled;
519 void EnableFormCandidateData( bool enabled ) override
521 mockFormCandidateDataEnabled = enabled;
524 bool IsTextSelectionEnabled() const override
526 return mockTextSelectionEnabled;
529 void EnableTextSelection( bool enabled ) override
531 mockTextSelectionEnabled = enabled;
534 bool IsTextAutosizingEnabled() const override
536 return mockTextAutosizingEnable;
539 void EnableTextAutosizing( bool enabled ) override
541 mockTextAutosizingEnable = enabled;
544 bool IsArrowScrollEnabled() const override
546 return mockArrowScrollEnable;
549 void EnableArrowScroll( bool enabled ) override
551 mockArrowScrollEnable = enabled;
554 bool IsClipboardEnabled() const override
556 return mockClipboardEnabled;
559 void EnableClipboard( bool enabled ) override
561 mockClipboardEnabled = enabled;
564 bool IsImePanelEnabled() const override
566 return mockImePanelEnabled;
569 void EnableImePanel( bool enabled ) override
571 mockImePanelEnabled = enabled;
574 bool AreImagesLoadedAutomatically() const override
576 return mockImageLoadedAutomatically;
579 void AllowImagesLoadAutomatically( bool automatic ) override
581 mockImageLoadedAutomatically = automatic;
584 std::string GetDefaultTextEncodingName() const override
586 return mockDefaultTextEncodingName;
589 void SetDefaultTextEncodingName( const std::string& defaultTextEncodingName ) override
591 mockDefaultTextEncodingName = defaultTextEncodingName;
594 void AllowMixedContents( bool allowed ) override
598 void EnableSpatialNavigation( bool enabled ) override
602 void EnableWebSecurity( bool enabled ) override
606 void EnableCacheBuilder( bool enabled ) override
610 void UseScrollbarThumbFocusNotifications( bool used ) override
614 void EnableDoNotTrack( bool enabled ) override
618 void AllowFileAccessFromExternalUrl( bool allowed ) override
622 void AllowScriptsOpenWindows( bool allowed ) override
627 int mockDefaultFontSize;
628 bool mockJavaScriptEnabled;
629 bool mockAutoFittingEnabled;
630 bool mockPluginsEnabled;
631 bool mockPrivateBrowsingEnabled;
632 bool mockLinkMagnifierEnabled;
633 bool mockKeypadWithoutUserActionUsed;
634 bool mockAutofillPasswordFormEnabled;
635 bool mockFormCandidateDataEnabled;
636 bool mockTextSelectionEnabled;
637 bool mockTextAutosizingEnable;
638 bool mockArrowScrollEnable;
639 bool mockClipboardEnabled;
640 bool mockImePanelEnabled;
641 bool mockImageLoadedAutomatically;
642 std::string mockDefaultTextEncodingName;
645 class WebEngine: public Dali::BaseObject
649 using JavaScriptEvaluatedResultCallback = std::function<void(const std::string&)>;
653 , mCurrentPlusOnePos( 0 )
655 , mEvaluating( false )
656 , mScrollPosition( 0, 0 )
657 , mScrollSize( 500, 500 )
658 , mContentSize( 500, 500 )
661 if ( gInstanceCount == 1 ) // only first web engine need be saved.
666 mockWebEngineSettings = new MockWebEngineSettings();
667 mockWebEngineContext = new MockWebEngineContext();
668 mockWebEngineCookieManager = new MockWebEngineCookieManager();
669 mockWebEngineBackForwardList = new MockWebEngineBackForwardList();
675 if( !gInstanceCount )
680 delete mockWebEngineSettings;
681 delete mockWebEngineContext;
682 delete mockWebEngineCookieManager;
683 delete mockWebEngineBackForwardList;
686 Dali::WebEngineSettings& GetSettings() const
688 return *mockWebEngineSettings;
691 Dali::WebEngineContext& GetContext() const
693 return *mockWebEngineContext;
696 Dali::WebEngineCookieManager& GetCookieManager() const
698 return *mockWebEngineCookieManager;
701 Dali::WebEngineBackForwardList& GetBackForwardList() const
703 return *mockWebEngineBackForwardList;
706 void LoadUrl( const std::string& url )
709 ConnectToGlobalSignal( &OnLoadUrl );
712 const std::string& GetUrl() const
717 std::string GetTitle() const
719 return std::string("title");
722 Dali::PixelData GetFavicon() const
724 uint8_t* faviconData = new uint8_t[ 16 ];
726 faviconData[ 0 ] = 0xff;
727 faviconData[ 1 ] = 0x00;
728 faviconData[ 2 ] = 0x00;
729 faviconData[ 3 ] = 0xff;
730 faviconData[ 4 ] = 0xff;
731 faviconData[ 5 ] = 0x00;
732 faviconData[ 6 ] = 0x00;
733 faviconData[ 7 ] = 0xff;
734 faviconData[ 8 ] = 0xff;
735 faviconData[ 9 ] = 0x00;
736 faviconData[ 10 ] = 0x00;
737 faviconData[ 11 ] = 0xff;
738 faviconData[ 12 ] = 0xff;
739 faviconData[ 13 ] = 0x00;
740 faviconData[ 14 ] = 0x00;
741 faviconData[ 15 ] = 0xff;
743 return Dali::PixelData::New( faviconData, 16, 2, 2,
744 Dali::Pixel::Format::RGBA8888,
745 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
748 bool CanGoForward() const
750 return mHistory.size() > mCurrentPlusOnePos;
755 ConnectToGlobalSignal( &OnGoForward );
758 bool CanGoBack() const
760 return mCurrentPlusOnePos > 1;
765 ConnectToGlobalSignal( &OnGoBack );
768 void EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
774 ConnectToGlobalSignal( &OnEvaluteJavaScript );
776 mResultCallbacks.push_back( resultHandler );
780 void RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
784 ConnectToGlobalSignal( &OnJavaScriptAlert );
785 mJavaScriptAlertCallback = callback;
789 void RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
793 ConnectToGlobalSignal( &OnJavaScriptConfirm );
794 mJavaScriptConfirmCallback = callback;
798 void RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
802 ConnectToGlobalSignal( &OnJavaScriptPrompt );
803 mJavaScriptPromptCallback = callback;
809 ConnectToGlobalSignal( &OnClearHistory );
812 const std::string& GetUserAgent() const
817 void SetUserAgent( const std::string& userAgent )
819 mUserAgent = userAgent;
822 void ScrollBy( int dx, int dy )
824 mScrollPosition += Dali::Vector2( dx, dy );
825 if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
827 ConnectToGlobalSignal( &OnScrollEdge );
831 bool ScrollEdgeBy( int dx, int dy )
833 mScrollPosition += Dali::Vector2( dx, dy );
834 if ( mScrollPosition.y + mScrollSize.height > mContentSize.height )
836 ConnectToGlobalSignal( &OnScrollEdge );
841 void SetScrollPosition( int x, int y )
843 mScrollPosition.x = x;
844 mScrollPosition.y = y;
847 Dali::Vector2 GetScrollPosition() const
849 return mScrollPosition;
852 Dali::Vector2 GetScrollSize() const
857 Dali::Vector2 GetContentSize() const
862 void SetPageZoomFactor(float zoomFactor)
864 mPageZoomFactor = zoomFactor;
867 float GetPageZoomFactor() const
869 return mPageZoomFactor;
872 void SetTextZoomFactor(float zoomFactor)
874 mTextZoomFactor = zoomFactor;
877 float GetTextZoomFactor() const
879 return mTextZoomFactor;
882 float GetLoadProgressPercentage() const
887 void SetScaleFactor(float scaleFactor, Dali::Vector2 point)
889 mScaleFactor = scaleFactor;
892 float GetScaleFactor() const
897 Dali::PixelData GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
899 uint32_t bufferSize = viewArea.width * viewArea.height * 4 ;
900 uint8_t* pixel = new uint8_t[ bufferSize ];
901 memset(pixel, 0xff, bufferSize);
902 return Dali::PixelData::New( pixel, bufferSize, viewArea.width, viewArea.height,
903 Dali::Pixel::Format::RGBA8888,
904 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
907 bool GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
911 ConnectToGlobalSignal( &OnScreenshotCaptured );
912 mScreenshotCapturedCallback = callback;
917 bool CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
921 ConnectToGlobalSignal( &OnVideoPlaying );
922 mVideoPlayingCallback = callback;
927 void RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
931 ConnectToGlobalSignal( &OnGeolocationPermission );
932 mGeolocationPermissionCallback = callback;
936 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadStartedSignal()
938 return mPageLoadStartedSignal;
941 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadInProgressSignal()
943 return mPageLoadInProgressSignal;
946 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadFinishedSignal()
948 return mPageLoadFinishedSignal;
951 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& PageLoadErrorSignal()
953 return mPageLoadErrorSignal;
956 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& ScrollEdgeReachedSignal()
958 return mScrollEdgeReachedSignal;
961 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& UrlChangedSignal()
963 return mUrlChangedSignal;
966 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& FormRepostDecisionSignal()
968 return mFormRepostDecisionSignal;
971 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& FrameRenderedSignal()
973 return mFrameRenderedSignal;
976 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType& RequestInterceptorSignal()
978 return mRequestInterceptorSignal;
981 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType& ConsoleMessageSignal()
983 return mConsoleMessageSignal;
986 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType& PolicyDecisionSignal()
988 return mPolicyDecisionSignal;
992 std::vector<std::string> mHistory;
993 size_t mCurrentPlusOnePos;
994 std::string mUserAgent;
996 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadStartedSignal;
997 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadInProgressSignal;
998 Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadFinishedSignal;
999 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType mPageLoadErrorSignal;
1000 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType mScrollEdgeReachedSignal;
1001 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType mUrlChangedSignal;
1002 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal;
1003 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType mFrameRenderedSignal;
1004 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal;
1005 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType mConsoleMessageSignal;
1006 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType mPolicyDecisionSignal;
1009 float mPageZoomFactor;
1010 float mTextZoomFactor;
1013 Dali::Vector2 mScrollPosition;
1014 Dali::Vector2 mScrollSize;
1015 Dali::Vector2 mContentSize;
1016 WebEngineBackForwardList* mockWebEngineBackForwardList;
1017 WebEngineContext* mockWebEngineContext;
1018 WebEngineCookieManager* mockWebEngineCookieManager;
1019 WebEngineSettings* mockWebEngineSettings;
1021 std::vector<JavaScriptEvaluatedResultCallback> mResultCallbacks;
1022 Dali::WebEnginePlugin::JavaScriptAlertCallback mJavaScriptAlertCallback;
1023 Dali::WebEnginePlugin::JavaScriptConfirmCallback mJavaScriptConfirmCallback;
1024 Dali::WebEnginePlugin::JavaScriptPromptCallback mJavaScriptPromptCallback;
1025 Dali::WebEnginePlugin::ScreenshotCapturedCallback mScreenshotCapturedCallback;
1026 Dali::WebEnginePlugin::VideoPlayingCallback mVideoPlayingCallback;
1027 Dali::WebEnginePlugin::GeolocationPermissionCallback mGeolocationPermissionCallback;
1036 DisconnectFromGlobalSignal( &OnGoBack );
1038 if( gInstance && gInstance->CanGoBack() )
1040 gInstance->mCurrentPlusOnePos--;
1047 DisconnectFromGlobalSignal( &OnGoForward );
1049 if( gInstance && gInstance->CanGoForward() )
1051 gInstance->mCurrentPlusOnePos++;
1058 DisconnectFromGlobalSignal( &OnLoadUrl );
1062 if( gInstance->mHistory.size() > gInstance->mCurrentPlusOnePos )
1064 gInstance->mHistory.erase( gInstance->mHistory.begin() + gInstance->mCurrentPlusOnePos, gInstance->mHistory.end() );
1066 gInstance->mHistory.push_back( gInstance->mUrl );
1067 gInstance->mCurrentPlusOnePos++;
1068 gInstance->mPageLoadStartedSignal.Emit( gInstance->mUrl );
1069 gInstance->mPageLoadInProgressSignal.Emit( gInstance->mUrl );
1070 gInstance->mPageLoadFinishedSignal.Emit( gInstance->mUrl );
1071 gInstance->mUrlChangedSignal.Emit( "http://new-test" );
1073 std::shared_ptr<Dali::WebEngineFormRepostDecision> repostDecision(new MockWebEngineFormRepostDecision());
1074 gInstance->mFormRepostDecisionSignal.Emit(std::move(repostDecision));
1075 gInstance->mFrameRenderedSignal.Emit();
1076 std::shared_ptr<Dali::WebEngineRequestInterceptor> interceptor(new MockWebEngineRequestInterceptor());
1077 gInstance->mRequestInterceptorSignal.Emit(std::move(interceptor));
1079 std::shared_ptr<Dali::WebEngineLoadError> error(new MockWebEngineLoadError(gInstance->mUrl));
1080 gInstance->mPageLoadErrorSignal.Emit(std::move(error));
1081 std::shared_ptr<Dali::WebEngineConsoleMessage> message(new MockWebEngineConsoleMessage());
1082 gInstance->mConsoleMessageSignal.Emit(std::move(message));
1083 std::shared_ptr<Dali::WebEnginePolicyDecision> policyDecision(new MockWebEnginePolicyDecision());
1084 gInstance->mPolicyDecisionSignal.Emit(std::move(policyDecision));
1091 DisconnectFromGlobalSignal( &OnScrollEdge );
1095 gInstance->mScrollEdgeReachedSignal.Emit( Dali::WebEnginePlugin::ScrollEdge::BOTTOM );
1101 bool OnEvaluteJavaScript()
1103 DisconnectFromGlobalSignal( &OnEvaluteJavaScript );
1107 for( auto& func : gInstance->mResultCallbacks )
1111 gInstance->mResultCallbacks.clear();
1116 bool OnJavaScriptAlert()
1118 DisconnectFromGlobalSignal( &OnJavaScriptAlert );
1121 gInstance->mJavaScriptAlertCallback( "this is an alert popup." );
1126 bool OnJavaScriptConfirm()
1128 DisconnectFromGlobalSignal( &OnJavaScriptConfirm );
1131 gInstance->mJavaScriptConfirmCallback( "this is a confirm popup." );
1136 bool OnJavaScriptPrompt()
1138 DisconnectFromGlobalSignal( &OnJavaScriptPrompt );
1141 gInstance->mJavaScriptPromptCallback( "this is a prompt pompt.", "" );
1146 bool OnScreenshotCaptured()
1148 DisconnectFromGlobalSignal( &OnScreenshotCaptured );
1151 uint8_t* pixel = new uint8_t[ 2 * 2 * 4 ];
1152 memset(pixel, 0xff, 2 * 2 * 4);
1153 Dali::PixelData data = Dali::PixelData::New( pixel, 2 * 2 * 4, 2, 2,
1154 Dali::Pixel::Format::RGBA8888,
1155 Dali::PixelData::ReleaseFunction::DELETE_ARRAY );
1156 gInstance->mScreenshotCapturedCallback( data );
1161 bool OnVideoPlaying()
1163 DisconnectFromGlobalSignal( &OnVideoPlaying );
1166 gInstance->mVideoPlayingCallback( true );
1171 bool OnGeolocationPermission()
1173 DisconnectFromGlobalSignal( &OnGeolocationPermission );
1176 gInstance->mGeolocationPermissionCallback( "", "" );
1181 bool OnClearHistory()
1183 DisconnectFromGlobalSignal( &OnClearHistory );
1185 if( gInstance && gInstance->mCurrentPlusOnePos )
1187 std::string url = gInstance->mHistory[ gInstance->mCurrentPlusOnePos - 1 ];
1188 std::vector< std::string >().swap( gInstance->mHistory );
1189 gInstance->mHistory.push_back( url );
1190 gInstance->mCurrentPlusOnePos = 1;
1197 inline WebEngine& GetImplementation( Dali::WebEngine& webEngine )
1199 DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
1200 BaseObject& handle = webEngine.GetBaseObject();
1201 return static_cast< Internal::Adaptor::WebEngine& >( handle );
1204 inline const WebEngine& GetImplementation( const Dali::WebEngine& webEngine )
1206 DALI_ASSERT_ALWAYS( webEngine && "WebEngine handle is empty." );
1207 const BaseObject& handle = webEngine.GetBaseObject();
1208 return static_cast< const Internal::Adaptor::WebEngine& >( handle );
1211 } // namespace Adaptor
1213 } // namespace Internal
1215 // Dali::WebEngine Implementation
1216 WebEngine::WebEngine()
1220 WebEngine::WebEngine( Internal::Adaptor::WebEngine* internal )
1221 : BaseHandle( internal )
1225 WebEngine::~WebEngine()
1229 WebEngine WebEngine::New()
1231 Internal::Adaptor::WebEngine* baseObject = new Internal::Adaptor::WebEngine();
1233 return WebEngine( baseObject );
1236 WebEngine::WebEngine( const WebEngine& WebEngine )
1237 : BaseHandle( WebEngine )
1241 WebEngine& WebEngine::operator=( const WebEngine& webEngine )
1243 BaseHandle::operator=( webEngine );
1247 WebEngine WebEngine::DownCast( BaseHandle handle )
1249 return WebEngine( dynamic_cast< Internal::Adaptor::WebEngine* >( handle.GetObjectPtr() ) );
1252 void WebEngine::Create( int width, int height, const std::string& locale, const std::string& timezoneId )
1256 void WebEngine::Create( int width, int height, int argc, char** argv )
1260 void WebEngine::Destroy()
1264 WebEngineSettings& WebEngine::GetSettings() const
1266 return Internal::Adaptor::GetImplementation( *this ).GetSettings();
1269 WebEngineContext& WebEngine::GetContext() const
1271 return Internal::Adaptor::GetImplementation( *this ).GetContext();
1274 WebEngineCookieManager& WebEngine::GetCookieManager() const
1276 return Internal::Adaptor::GetImplementation( *this ).GetCookieManager();
1279 WebEngineBackForwardList& WebEngine::GetBackForwardList() const
1281 return Internal::Adaptor::GetImplementation( *this ).GetBackForwardList();
1284 void WebEngine::LoadUrl( const std::string& url )
1286 return Internal::Adaptor::GetImplementation( *this ).LoadUrl( url );
1289 std::string WebEngine::GetTitle() const
1291 return Internal::Adaptor::GetImplementation( *this ).GetTitle();
1294 Dali::PixelData WebEngine::GetFavicon() const
1296 return Internal::Adaptor::GetImplementation( *this ).GetFavicon();
1299 const std::string& WebEngine::GetUrl()
1301 return Internal::Adaptor::GetImplementation( *this ).GetUrl();
1304 NativeImageInterfacePtr WebEngine::GetNativeImageSource()
1307 Dali::NativeImageSourcePtr sourcePtr = Dali::NativeImageSource::New( source );
1311 void WebEngine::LoadHtmlString( const std::string& htmlString )
1315 bool WebEngine::LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri, const std::string& unreachableUrl)
1320 bool WebEngine::LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType, const std::string& encoding, const std::string& baseUri)
1325 void WebEngine::Reload()
1329 bool WebEngine::ReloadWithoutCache()
1334 void WebEngine::StopLoading()
1338 void WebEngine::Suspend()
1342 void WebEngine::Resume()
1346 void WebEngine::SuspendNetworkLoading()
1350 void WebEngine::ResumeNetworkLoading()
1354 bool WebEngine::AddCustomHeader(const std::string& name, const std::string& value)
1359 bool WebEngine::RemoveCustomHeader(const std::string& name)
1364 uint32_t WebEngine::StartInspectorServer(uint32_t port)
1369 bool WebEngine::StopInspectorServer()
1374 bool WebEngine::CanGoForward()
1376 return Internal::Adaptor::GetImplementation( *this ).CanGoForward();
1379 void WebEngine::GoForward()
1381 Internal::Adaptor::GetImplementation( *this ).GoForward();
1384 bool WebEngine::CanGoBack()
1386 return Internal::Adaptor::GetImplementation( *this ).CanGoBack();
1389 void WebEngine::GoBack()
1391 Internal::Adaptor::GetImplementation( *this ).GoBack();
1394 void WebEngine::EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler )
1396 Internal::Adaptor::GetImplementation( *this ).EvaluateJavaScript( script, resultHandler );
1399 void WebEngine::AddJavaScriptMessageHandler( const std::string& exposedObjectName, std::function< void(const std::string&) > handler )
1403 void WebEngine::RegisterJavaScriptAlertCallback( Dali::WebEnginePlugin::JavaScriptAlertCallback callback )
1405 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptAlertCallback( callback );
1408 void WebEngine::JavaScriptAlertReply()
1412 void WebEngine::RegisterJavaScriptConfirmCallback( Dali::WebEnginePlugin::JavaScriptConfirmCallback callback )
1414 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptConfirmCallback( callback );
1417 void WebEngine::JavaScriptConfirmReply( bool confirmed )
1421 void WebEngine::RegisterJavaScriptPromptCallback( Dali::WebEnginePlugin::JavaScriptPromptCallback callback )
1423 Internal::Adaptor::GetImplementation( *this ).RegisterJavaScriptPromptCallback( callback );
1426 void WebEngine::JavaScriptPromptReply( const std::string& result )
1430 void WebEngine::ClearAllTilesResources()
1434 void WebEngine::ClearHistory()
1436 Internal::Adaptor::GetImplementation( *this ).ClearHistory();
1439 void WebEngine::SetScaleFactor(float scaleFactor, Dali::Vector2 point)
1441 Internal::Adaptor::GetImplementation( *this ).SetScaleFactor(scaleFactor, point);
1444 float WebEngine::GetScaleFactor() const
1446 return Internal::Adaptor::GetImplementation( *this ).GetScaleFactor();
1449 void WebEngine::ActivateAccessibility(bool activated)
1453 bool WebEngine::HighlightText(const std::string& text, Dali::WebEnginePlugin::FindOption options, uint32_t maxMatchCount)
1458 void WebEngine::AddDynamicCertificatePath(const std::string& host, const std::string& certPath)
1462 Dali::PixelData WebEngine::GetScreenshot(Dali::Rect<int> viewArea, float scaleFactor)
1464 return Internal::Adaptor::GetImplementation( *this ).GetScreenshot(viewArea, scaleFactor);
1467 bool WebEngine::GetScreenshotAsynchronously(Dali::Rect<int> viewArea, float scaleFactor, Dali::WebEnginePlugin::ScreenshotCapturedCallback callback)
1469 return Internal::Adaptor::GetImplementation( *this ).GetScreenshotAsynchronously(viewArea, scaleFactor, callback);
1472 bool WebEngine::CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback)
1474 return Internal::Adaptor::GetImplementation( *this ).CheckVideoPlayingAsynchronously(callback);
1477 void WebEngine::RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback)
1479 Internal::Adaptor::GetImplementation( *this ).RegisterGeolocationPermissionCallback(callback);
1482 const std::string& WebEngine::GetUserAgent() const
1484 return Internal::Adaptor::GetImplementation( *this ).GetUserAgent();
1487 void WebEngine::SetUserAgent( const std::string& userAgent )
1489 Internal::Adaptor::GetImplementation( *this ).SetUserAgent( userAgent );
1492 void WebEngine::ScrollBy( int dx, int dy )
1494 Internal::Adaptor::GetImplementation( *this ).ScrollBy( dx, dy );
1497 bool WebEngine::ScrollEdgeBy( int dx, int dy )
1499 return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeBy( dx, dy );
1502 void WebEngine::SetScrollPosition( int x, int y )
1504 Internal::Adaptor::GetImplementation( *this ).SetScrollPosition( x, y );
1507 Dali::Vector2 WebEngine::GetScrollPosition() const
1509 return Internal::Adaptor::GetImplementation( *this ).GetScrollPosition();
1512 Dali::Vector2 WebEngine::GetScrollSize() const
1514 return Internal::Adaptor::GetImplementation( *this ).GetScrollSize();
1517 Dali::Vector2 WebEngine::GetContentSize() const
1519 return Internal::Adaptor::GetImplementation( *this ).GetContentSize();
1522 void WebEngine::SetSize( int width, int height )
1526 void WebEngine::SetDocumentBackgroundColor(Dali::Vector4 color)
1530 void WebEngine::ClearTilesWhenHidden(bool cleared)
1534 void WebEngine::SetTileCoverAreaMultiplier(float multiplier)
1538 void WebEngine::EnableCursorByClient(bool enabled)
1542 std::string WebEngine::GetSelectedText() const
1547 bool WebEngine::SendTouchEvent( const TouchEvent& touch )
1552 bool WebEngine::SendKeyEvent( const KeyEvent& event )
1557 bool WebEngine::SendHoverEvent( const HoverEvent& event )
1562 bool WebEngine::SendWheelEvent( const WheelEvent& event )
1567 void WebEngine::SetFocus( bool focused )
1571 void WebEngine::SetPageZoomFactor(float zoomFactor)
1573 Internal::Adaptor::GetImplementation( *this ).SetPageZoomFactor(zoomFactor);
1576 float WebEngine::GetPageZoomFactor() const
1578 return Internal::Adaptor::GetImplementation( *this ).GetPageZoomFactor();
1581 void WebEngine::SetTextZoomFactor(float zoomFactor)
1583 Internal::Adaptor::GetImplementation( *this ).SetTextZoomFactor(zoomFactor);
1586 float WebEngine::GetTextZoomFactor() const
1588 return Internal::Adaptor::GetImplementation( *this ).GetTextZoomFactor();
1591 float WebEngine::GetLoadProgressPercentage() const
1593 return Internal::Adaptor::GetImplementation( *this ).GetLoadProgressPercentage();
1596 void WebEngine::UpdateDisplayArea( Dali::Rect< int > displayArea )
1600 void WebEngine::EnableVideoHole( bool enabled )
1604 void WebEngine::EnableMouseEvents( bool enabled )
1608 void WebEngine::EnableKeyEvents( bool enabled )
1612 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadStartedSignal()
1614 return Internal::Adaptor::GetImplementation( *this ).PageLoadStartedSignal();
1617 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadInProgressSignal()
1619 return Internal::Adaptor::GetImplementation( *this ).PageLoadInProgressSignal();
1622 Dali::WebEnginePlugin::WebEnginePageLoadSignalType& WebEngine::PageLoadFinishedSignal()
1624 return Internal::Adaptor::GetImplementation( *this ).PageLoadFinishedSignal();
1627 Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& WebEngine::PageLoadErrorSignal()
1629 return Internal::Adaptor::GetImplementation( *this ).PageLoadErrorSignal();
1632 Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& WebEngine::ScrollEdgeReachedSignal()
1634 return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeReachedSignal();
1637 Dali::WebEnginePlugin::WebEngineUrlChangedSignalType& WebEngine::UrlChangedSignal()
1639 return Internal::Adaptor::GetImplementation( *this ).UrlChangedSignal();
1642 Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType& WebEngine::FormRepostDecisionSignal()
1644 return Internal::Adaptor::GetImplementation(*this).FormRepostDecisionSignal();
1647 Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType& WebEngine::FrameRenderedSignal()
1649 return Internal::Adaptor::GetImplementation(*this).FrameRenderedSignal();
1652 Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType& WebEngine::RequestInterceptorSignal()
1654 return Internal::Adaptor::GetImplementation(*this).RequestInterceptorSignal();
1657 Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType& WebEngine::ConsoleMessageSignal()
1659 return Internal::Adaptor::GetImplementation(*this).ConsoleMessageSignal();
1662 Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType& WebEngine::PolicyDecisionSignal()
1664 return Internal::Adaptor::GetImplementation(*this).PolicyDecisionSignal();
1667 } // namespace Dali;