From: huayong.xu Date: Tue, 5 Jan 2021 07:02:50 +0000 (+0800) Subject: Support scroll in web view. X-Git-Tag: dali_2.0.10~4^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=c1fe36eb61a52b0efb91218b41c09ed7ba7fd819 Support scroll in web view. Some APIs related to scroll are supported. Change-Id: I6f4f4430ea236f437196398b4c14a29375a91495 --- diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp index 372aec9..9d7a582 100755 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp @@ -73,6 +73,9 @@ public: , mDefaultTextEncodingName() , mDefaultFontSize( 16 ) , mEvaluating( false ) + , mScrollPosition( 0, 0 ) + , mScrollSize( 500, 500 ) + , mContentSize( 500, 500 ) { gInstanceCount++; gInstance = this; @@ -205,6 +208,39 @@ public: mDefaultFontSize = defaultFontSize; } + void ScrollBy( int dx, int dy ) + { + mScrollPosition += Dali::Vector2( dx, dy ); + if ( mScrollPosition.y + mScrollSize.height > mContentSize.height ) + { + gInstance->mScrollEdgeReachedSignal.Emit( Dali::WebEnginePlugin::ScrollEdge::BOTTOM ); + } + } + + void SetScrollPosition( int x, int y ) + { + mScrollPosition.x = x; + mScrollPosition.y = y; + } + + void GetScrollPosition( int& x, int& y ) const + { + x = mScrollPosition.x; + y = mScrollPosition.y; + } + + void GetScrollSize( int& w, int& h ) const + { + w = mScrollSize.width; + h = mScrollSize.height; + } + + void GetContentSize( int& w, int& h ) const + { + w = mContentSize.width; + h = mContentSize.height; + } + Dali::WebEnginePlugin::WebEnginePageLoadSignalType& PageLoadStartedSignal() { return mPageLoadStartedSignal; @@ -220,6 +256,11 @@ public: return mPageLoadErrorSignal; } + Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& ScrollEdgeReachedSignal() + { + return mScrollEdgeReachedSignal; + } + std::string mUrl; std::vector< std::string > mHistory; size_t mCurrentPlusOnePos; @@ -235,6 +276,11 @@ public: Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType mPageLoadErrorSignal; std::vector< std::function< void( const std::string& ) > > mResultCallbacks; bool mEvaluating; + + Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType mScrollEdgeReachedSignal; + Dali::Vector2 mScrollPosition; + Dali::Vector2 mScrollSize; + Dali::Vector2 mContentSize; }; inline WebEngine& GetImplementation( Dali::WebEngine& webEngine ) @@ -522,6 +568,31 @@ void WebEngine::SetDefaultFontSize( int defaultFontSize ) Internal::Adaptor::GetImplementation( *this ).SetDefaultFontSize( defaultFontSize ); } +void WebEngine::ScrollBy( int dx, int dy ) +{ + Internal::Adaptor::GetImplementation( *this ).ScrollBy( dx, dy ); +} + +void WebEngine::SetScrollPosition( int x, int y ) +{ + Internal::Adaptor::GetImplementation( *this ).SetScrollPosition( x, y ); +} + +void WebEngine::GetScrollPosition( int& x, int& y ) const +{ + Internal::Adaptor::GetImplementation( *this ).GetScrollPosition( x, y ); +} + +void WebEngine::GetScrollSize( int& w, int& h ) const +{ + Internal::Adaptor::GetImplementation( *this ).GetScrollSize( w, h ); +} + +void WebEngine::GetContentSize( int& w, int& h ) const +{ + Internal::Adaptor::GetImplementation( *this ).GetContentSize( w, h ); +} + void WebEngine::SetSize( int width, int height ) { } @@ -555,5 +626,10 @@ Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType& WebEngine::PageLoadErro return Internal::Adaptor::GetImplementation( *this ).PageLoadErrorSignal(); } +Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType& WebEngine::ScrollEdgeReachedSignal() +{ + return Internal::Adaptor::GetImplementation( *this ).ScrollEdgeReachedSignal(); +} + } // namespace Dali; diff --git a/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp index d9c34a6..0ca47b6 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp @@ -39,6 +39,7 @@ const char* const TEST_URL2( "http://www.somewhere.valid2.com" ); static int gPageLoadStartedCallbackCalled = 0; static int gPageLoadFinishedCallbackCalled = 0; +static int gScrollEdgeReachedCallbackCalled = 0; static int gEvaluateJavaScriptCallbackCalled = 0; static bool gTouched = false; @@ -66,6 +67,11 @@ static void OnPageLoadFinished( WebView view, const std::string& url ) gPageLoadFinishedCallbackCalled++; } +static void OnScrollEdgeReached( WebView view, Dali::WebEnginePlugin::ScrollEdge edge ) +{ + gScrollEdgeReachedCallbackCalled++; +} + static void OnPageLoadError( WebView view, const std::string& url, WebView::LoadErrorCode errorCode ) { } @@ -491,6 +497,72 @@ int UtcDaliWebViewProperty8(void) END_TEST; } +int UtcDaliWebViewProperty9(void) +{ + // SCROLL_POSITION + ToolkitTestApplication application; + + WebView view = WebView::New(); + DALI_TEST_CHECK( view ); + + // Check default value + Dali::Vector2 output = Dali::Vector2::ONE; + view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output ); + DALI_TEST_CHECK( output.x == 0 && output.y == 0 ); + + // Check Set/GetProperty + Dali::Vector2 testValue = Dali::Vector2( 100, 100 ); + view.SetProperty( WebView::Property::SCROLL_POSITION, testValue ); + view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output ); + DALI_TEST_EQUALS( output, testValue, TEST_LOCATION ); + + // Check default value of scroll size + output = Dali::Vector2::ONE; + view.GetProperty( WebView::Property::SCROLL_SIZE ).Get( output ); + DALI_TEST_CHECK( output.x == 500 && output.y == 500 ); + + // Check default value of content size + output = Dali::Vector2::ONE; + view.GetProperty( WebView::Property::CONTENT_SIZE ).Get( output ); + DALI_TEST_CHECK( output.x == 500 && output.y == 500 ); + + END_TEST; +} + +int UtcDaliWebViewScrollBy(void) +{ + ToolkitTestApplication application; + + WebView view = WebView::New(); + DALI_TEST_CHECK( view ); + + // load url. + ConnectionTracker* testTracker = new ConnectionTracker(); + view.ScrollEdgeReachedSignal().Connect( &OnScrollEdgeReached ); + bool signal1 = false; + view.ConnectSignal( testTracker, "scrollEdgeReached", CallbackFunctor(&signal1) ); + DALI_TEST_EQUALS( gScrollEdgeReachedCallbackCalled, 0, TEST_LOCATION ); + + view.LoadUrl( TEST_URL1 ); + Test::EmitGlobalTimerSignal(); + + // set scroll position. + Dali::Vector2 output = Dali::Vector2::ONE; + Dali::Vector2 testValue = Dali::Vector2( 100, 100 ); + view.SetProperty( WebView::Property::SCROLL_POSITION, testValue ); + view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output ); + DALI_TEST_EQUALS( output, testValue, TEST_LOCATION ); + + // scroll by and trigger scrollEdgeReached event. + view.ScrollBy( 50, 50 ); + view.GetProperty( WebView::Property::SCROLL_POSITION ).Get( output ); + DALI_TEST_CHECK( output.x == 150 && output.y == 150 ); + DALI_TEST_EQUALS( gScrollEdgeReachedCallbackCalled, 1, TEST_LOCATION ); + DALI_TEST_CHECK( signal1 ); + + END_TEST; +} + int UtcDaliWebViewEvaluteJavaScript(void) { ToolkitTestApplication application; diff --git a/dali-toolkit/devel-api/controls/web-view/web-view.cpp b/dali-toolkit/devel-api/controls/web-view/web-view.cpp old mode 100644 new mode 100755 index 7758f7b..338f8b9 --- a/dali-toolkit/devel-api/controls/web-view/web-view.cpp +++ b/dali-toolkit/devel-api/controls/web-view/web-view.cpp @@ -93,6 +93,11 @@ void WebView::Resume() Dali::Toolkit::GetImpl(*this).Resume(); } +void WebView::ScrollBy( int deltaX, int deltaY ) +{ + Dali::Toolkit::GetImpl( *this ).ScrollBy( deltaX, deltaY ); +} + bool WebView::CanGoForward() { return Dali::Toolkit::GetImpl(*this).CanGoForward(); @@ -158,6 +163,11 @@ WebView::WebViewPageLoadErrorSignalType& WebView::PageLoadErrorSignal() return Dali::Toolkit::GetImpl(*this).PageLoadErrorSignal(); } +WebView::WebViewScrollEdgeReachedSignalType& WebView::ScrollEdgeReachedSignal() +{ + return Dali::Toolkit::GetImpl( *this ).ScrollEdgeReachedSignal(); +} + WebView::WebView(Internal::WebView& implementation) : Control(implementation) { diff --git a/dali-toolkit/devel-api/controls/web-view/web-view.h b/dali-toolkit/devel-api/controls/web-view/web-view.h old mode 100644 new mode 100755 index 83b5ebd..f447eda --- a/dali-toolkit/devel-api/controls/web-view/web-view.h +++ b/dali-toolkit/devel-api/controls/web-view/web-view.h @@ -22,6 +22,7 @@ #include // INTERNAL INCLUDES +#include #include namespace Dali @@ -173,7 +174,25 @@ public: * @details Name "defaultFontSize", type Property::INT. * @note Default is 16. */ - DEFAULT_FONT_SIZE + DEFAULT_FONT_SIZE, + + /** + * @brief The current position of scroll. + * @details Name "scrollPosition", type Property::VECTOR2. + */ + SCROLL_POSITION, + + /** + * @brief The current position of scroll. + * @details Name "scrollSize", type Property::VECTOR2. Read-only. + */ + SCROLL_SIZE, + + /** + * @brief The current position of scroll. + * @details Name "contentSize", type Property::VECTOR2. Read-only. + */ + CONTENT_SIZE, }; }; @@ -268,6 +287,11 @@ public: */ typedef Signal WebViewPageLoadErrorSignalType; + /** + * @brief WebView signal type related with scroll edge reached. + */ + typedef Signal WebViewScrollEdgeReachedSignalType; + public: /** * @brief Creates an initialized WebView. @@ -358,6 +382,13 @@ public: void Resume(); /** + * @brief Scrolls the webpage of view by deltaX and deltaY. + * @param[in] deltaX The delta x of scroll + * @param[in] deltaY The delta y of scroll + */ + void ScrollBy( int deltaX, int deltaY ); + + /** * @brief Returns whether forward is possible. * * @return True if forward is possible, false otherwise @@ -458,6 +489,13 @@ public: */ WebViewPageLoadErrorSignalType& PageLoadErrorSignal(); + /** + * @brief Connects to this signal to be notified when scroll edge is reached. + * + * @return A signal object to connect with. + */ + WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal(); + public: // Not intended for application developers /// @cond internal /** diff --git a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp old mode 100644 new mode 100755 index 1c9d939..db14c27 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp @@ -72,10 +72,14 @@ DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "enableJavaScript", BOOLEAN DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "loadImagesAutomatically", BOOLEAN, LOAD_IMAGES_AUTOMATICALLY ) DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "defaultTextEncodingName", STRING, DEFAULT_TEXT_ENCODING_NAME ) DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "defaultFontSize", INTEGER, DEFAULT_FONT_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "scrollPosition", VECTOR2, SCROLL_POSITION ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "scrollSize", VECTOR2, SCROLL_SIZE ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "contentSize", VECTOR2, CONTENT_SIZE ) DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadStarted", PAGE_LOAD_STARTED_SIGNAL ) DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadFinished", PAGE_LOAD_FINISHED_SIGNAL ) DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadError", PAGE_LOAD_ERROR_SIGNAL ) +DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "scrollEdgeReached", SCROLL_EDGE_REACHED_SIGNAL ) DALI_TYPE_REGISTRATION_END() @@ -145,6 +149,7 @@ void WebView::OnInitialize() mWebEngine.PageLoadStartedSignal().Connect( this, &WebView::OnPageLoadStarted ); mWebEngine.PageLoadFinishedSignal().Connect( this, &WebView::OnPageLoadFinished ); mWebEngine.PageLoadErrorSignal().Connect( this, &WebView::OnPageLoadError ); + mWebEngine.ScrollEdgeReachedSignal().Connect( this, &WebView::OnScrollEdgeReached ); } } @@ -218,6 +223,14 @@ void WebView::Resume() } } +void WebView::ScrollBy( int deltaX, int deltaY ) +{ + if ( mWebEngine ) + { + mWebEngine.ScrollBy( deltaX, deltaY ); + } +} + bool WebView::CanGoForward() { return mWebEngine ? mWebEngine.CanGoForward() : false; @@ -299,6 +312,11 @@ Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType& WebView::PageLoadErrorSi return mPageLoadErrorSignal; } +Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType& WebView::ScrollEdgeReachedSignal() +{ + return mScrollEdgeReachedSignal; +} + void WebView::OnPageLoadStarted( const std::string& url ) { if( !mPageLoadStartedSignal.Empty() ) @@ -326,6 +344,15 @@ void WebView::OnPageLoadError( const std::string& url, int errorCode ) } } +void WebView::OnScrollEdgeReached( Dali::WebEnginePlugin::ScrollEdge edge ) +{ + if( !mScrollEdgeReachedSignal.Empty() ) + { + Dali::Toolkit::WebView handle( GetOwner() ); + mScrollEdgeReachedSignal.Emit( handle, edge ); + } +} + bool WebView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor ) { Dali::BaseHandle handle( object ); @@ -348,6 +375,11 @@ bool WebView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* t webView.PageLoadErrorSignal().Connect( tracker, functor ); connected = true; } + else if( 0 == strcmp( signalName.c_str(), SCROLL_EDGE_REACHED_SIGNAL ) ) + { + webView.ScrollEdgeReachedSignal().Connect( tracker, functor ); + connected = true; + } return connected; } @@ -456,6 +488,15 @@ void WebView::SetProperty( BaseObject* object, Property::Index index, const Prop } break; } + case Toolkit::WebView::Property::SCROLL_POSITION: + { + Vector2 input; + if ( value.Get( input ) ) + { + impl.SetScrollPosition( input.x, input.y ); + } + break; + } } } } @@ -511,6 +552,27 @@ Property::Value WebView::GetProperty( BaseObject* object, Property::Index proper value = impl.GetDefaultFontSize(); break; } + case Toolkit::WebView::Property::SCROLL_POSITION: + { + int x, y; + impl.GetScrollPosition( x, y ); + value = Vector2( x, y ); + break; + } + case Toolkit::WebView::Property::SCROLL_SIZE: + { + int width, height; + impl.GetScrollSize( width, height ); + value = Vector2( width, height ); + break; + } + case Toolkit::WebView::Property::CONTENT_SIZE: + { + int width, height; + impl.GetContentSize( width, height ); + value = Vector2( width, height ); + break; + } default: break; } @@ -561,6 +623,38 @@ void WebView::OnKeyInputFocusLost() EmitKeyInputFocusSignal( false ); // Calls back into the Control hence done last. } +void WebView::SetScrollPosition( int x, int y ) +{ + if( mWebEngine ) + { + mWebEngine.SetScrollPosition( x, y ); + } +} + +void WebView::GetScrollPosition( int& x, int& y ) const +{ + if( mWebEngine ) + { + mWebEngine.GetScrollPosition( x, y ); + } +} + +void WebView::GetScrollSize( int& width, int& height ) const +{ + if( mWebEngine ) + { + mWebEngine.GetScrollSize( width, height ); + } +} + +void WebView::GetContentSize( int& width, int& height ) const +{ + if( mWebEngine ) + { + mWebEngine.GetContentSize( width, height ); + } +} + Toolkit::WebView::CacheModel::Type WebView::GetCacheModel() const { return mWebEngine ? static_cast< Toolkit::WebView::CacheModel::Type >( mWebEngine.GetCacheModel() ) : Toolkit::WebView::CacheModel::DOCUMENT_VIEWER; diff --git a/dali-toolkit/internal/controls/web-view/web-view-impl.h b/dali-toolkit/internal/controls/web-view/web-view-impl.h old mode 100644 new mode 100755 index 968b742..0769bad --- a/dali-toolkit/internal/controls/web-view/web-view-impl.h +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.h @@ -93,6 +93,11 @@ public: void Resume(); /** + * @copydoc Dali::Toolkit::WebView::ScrollBy() + */ + void ScrollBy( int deltaX, int deltaY ); + + /** * @copydoc Dali::Toolkit::WebView::CanGoForward() */ bool CanGoForward(); @@ -152,6 +157,11 @@ public: */ Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType& PageLoadErrorSignal(); + /** + * @copydoc Dali::Toolkit::WebView::ScrollEdgeReachedSignal() + */ + Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal(); + public: // Properties /** @@ -231,6 +241,34 @@ private: WebView& operator=( const WebView& webView ); /** + * @brief Sets an absolute scroll of the given view. + * @param[in] x The coordinate x of scroll + * @param[in] y The coordinate y of scroll + */ + void SetScrollPosition( int x, int y ); + + /** + * @brief Gets the current scroll position of the given view. + * @param[out] x The coordinate x of scroll + * @param[out] y The coordinate y of scroll + */ + void GetScrollPosition( int& x, int& y ) const; + + /** + * @brief Gets the possible scroll size of the given view. + * @param[out] width The width of scroll size + * @param[out] height The height of scroll size + */ + void GetScrollSize( int& width, int& height ) const; + + /** + * @brief Gets the last known content's size. + * @param[out] width The width of content's size + * @param[out] height The height of content's size + */ + void GetContentSize( int& width, int& height ) const; + + /** * @brief Get cache model option. The default isToolkit::WebView::CacheModel::DOCUMENT_VIEWER. * @see Toolkit::WebView::CacheModel::Type */ @@ -343,6 +381,12 @@ private: */ void OnPageLoadError( const std::string& url, int errorCode ); + /** + * @brief Callback function to be called when scroll edge is reached. + * @param[in] e The scroll edge reached. + */ + void OnScrollEdgeReached( Dali::WebEnginePlugin::ScrollEdge edge ); + private: std::string mUrl; @@ -353,6 +397,7 @@ private: Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadStartedSignal; Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadFinishedSignal; Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType mPageLoadErrorSignal; + Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType mScrollEdgeReachedSignal; }; } // namespace Internal