X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fweb-view%2Fweb-view-impl.cpp;h=db14c27797aeaee328b274e5551bd03eb859570a;hp=5836f42537083a9a3974a6f7ff4adec3df194ed8;hb=c1fe36eb61a52b0efb91218b41c09ed7ba7fd819;hpb=c4d99a8276061b0ceb6bac5d14fed81897def053 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 5836f42..db14c27 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,15 +20,18 @@ // EXTERNAL INCLUDES #include -#include -#include +#include +#include +#include #include #include #include // INTERNAL INCLUDES #include +#include #include +#include namespace Dali { @@ -47,17 +50,49 @@ BaseHandle Create() return Toolkit::WebView::New(); } -DALI_TYPE_REGISTRATION_BEGIN( Toolkit::WebView, Toolkit::Control, Create ); - -DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "url", STRING, URL ); - -DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadStarted", PAGE_LOAD_STARTED_SIGNAL ); -DALI_SIGNAL_REGISTRATION( Toolkit, WebView, "pageLoadFinished", PAGE_LOAD_FINISHED_SIGNAL ); +DALI_ENUM_TO_STRING_TABLE_BEGIN( CacheModel ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CacheModel, DOCUMENT_VIEWER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CacheModel, DOCUMENT_BROWSER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CacheModel, PRIMARY_WEB_BROWSER ) +DALI_ENUM_TO_STRING_TABLE_END( CacheModel ) + +DALI_ENUM_TO_STRING_TABLE_BEGIN( CookieAcceptPolicy ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CookieAcceptPolicy, ALWAYS ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CookieAcceptPolicy, NEVER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Toolkit::WebView::CookieAcceptPolicy, NO_THIRD_PARTY ) +DALI_ENUM_TO_STRING_TABLE_END( CookieAcceptPolicy ) + +DALI_TYPE_REGISTRATION_BEGIN( Toolkit::WebView, Toolkit::Control, Create ) + +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "url", STRING, URL ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "cacheModel", STRING, CACHE_MODEL ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "cookieAcceptPolicy", STRING, COOKIE_ACCEPT_POLICY ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "userAgent", STRING, USER_AGENT ) +DALI_PROPERTY_REGISTRATION( Toolkit, WebView, "enableJavaScript", BOOLEAN, ENABLE_JAVASCRIPT ) +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() +const std::string kEmptyString; + } // anonymous namepsace +#define GET_ENUM_STRING( structName, inputExp ) \ + Scripting::GetLinearEnumerationName< Toolkit::WebView::structName::Type >( static_cast< Toolkit::WebView::structName::Type >( inputExp ), structName##_TABLE, structName##_TABLE_COUNT ) + +#define GET_ENUM_VALUE( structName, inputExp, outputExp ) \ + Scripting::GetEnumerationProperty< Toolkit::WebView::structName::Type >( inputExp, structName##_TABLE, structName##_TABLE_COUNT, outputExp ) + WebView::WebView( const std::string& locale, const std::string& timezoneId ) : Control( ControlBehaviour( ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS ) ), mUrl(), @@ -65,10 +100,13 @@ WebView::WebView( const std::string& locale, const std::string& timezoneId ) mWebViewSize( Stage::GetCurrent().GetSize() ), mWebEngine(), mPageLoadStartedSignal(), - mPageLoadFinishedSignal() + mPageLoadFinishedSignal(), + mPageLoadErrorSignal() { mWebEngine = Dali::WebEngine::New(); - if ( mWebEngine ) + + // WebEngine is empty when it is not properly initialized. + if( mWebEngine ) { mWebEngine.Create( mWebViewSize.width, mWebViewSize.height, locale, timezoneId ); } @@ -103,25 +141,30 @@ Toolkit::WebView WebView::New( const std::string& locale, const std::string& tim void WebView::OnInitialize() { - Self().SetKeyboardFocusable( true ); - Self().TouchSignal().Connect( this, &WebView::OnTouchEvent ); + Self().SetProperty( Actor::Property::KEYBOARD_FOCUSABLE, true ); + Self().TouchedSignal().Connect( this, &WebView::OnTouchEvent ); - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.PageLoadStartedSignal().Connect( this, &WebView::OnPageLoadStarted ); mWebEngine.PageLoadFinishedSignal().Connect( this, &WebView::OnPageLoadFinished ); + mWebEngine.PageLoadErrorSignal().Connect( this, &WebView::OnPageLoadError ); + mWebEngine.ScrollEdgeReachedSignal().Connect( this, &WebView::OnScrollEdgeReached ); } } void WebView::LoadUrl( const std::string& url ) { mUrl = url; - if ( mWebEngine ) + if( mWebEngine ) { - Dali::Image image = Dali::NativeImage::New( *mWebEngine.GetNativeImageSource() ); - mVisual = Toolkit::VisualFactory::Get().CreateVisual( image ); + Texture texture = Dali::Texture::New( *mWebEngine.GetNativeImageSource() ); + const std::string nativeImageUrl = Dali::Toolkit::TextureManager::AddTexture( texture ); + mVisual = Toolkit::VisualFactory::Get().CreateVisual( + { { Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE } , + { Toolkit::ImageVisual::Property::URL, nativeImageUrl } } ); - if ( mVisual ) + if( mVisual ) { // Clean up previously registered visual and add new one. DevelControl::RegisterVisual( *this, Toolkit::WebView::Property::URL, mVisual ); @@ -130,19 +173,17 @@ void WebView::LoadUrl( const std::string& url ) } } -const std::string& WebView::GetUrl() -{ - return mWebEngine ? mWebEngine.GetUrl() : mUrl; -} - void WebView::LoadHTMLString( const std::string& htmlString ) { - if ( mWebEngine ) + if( mWebEngine ) { - Dali::Image image = Dali::NativeImage::New( *mWebEngine.GetNativeImageSource() ); - mVisual = Toolkit::VisualFactory::Get().CreateVisual( image ); + Texture texture = Dali::Texture::New( *mWebEngine.GetNativeImageSource() ); + const std::string nativeImageUrl = Dali::Toolkit::TextureManager::AddTexture( texture ); + mVisual = Toolkit::VisualFactory::Get().CreateVisual( + { { Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE } , + { Toolkit::ImageVisual::Property::URL, nativeImageUrl } } ); - if ( mVisual ) + if( mVisual ) { DevelControl::RegisterVisual( *this, Toolkit::WebView::Property::URL, mVisual ); mWebEngine.LoadHTMLString( htmlString ); @@ -152,7 +193,7 @@ void WebView::LoadHTMLString( const std::string& htmlString ) void WebView::Reload() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.Reload(); } @@ -160,12 +201,36 @@ void WebView::Reload() void WebView::StopLoading() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.StopLoading(); } } +void WebView::Suspend() +{ + if( mWebEngine ) + { + mWebEngine.Suspend(); + } +} + +void WebView::Resume() +{ + if( mWebEngine ) + { + mWebEngine.Resume(); + } +} + +void WebView::ScrollBy( int deltaX, int deltaY ) +{ + if ( mWebEngine ) + { + mWebEngine.ScrollBy( deltaX, deltaY ); + } +} + bool WebView::CanGoForward() { return mWebEngine ? mWebEngine.CanGoForward() : false; @@ -173,7 +238,7 @@ bool WebView::CanGoForward() void WebView::GoForward() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.GoForward(); } @@ -186,23 +251,23 @@ bool WebView::CanGoBack() void WebView::GoBack() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.GoBack(); } } -void WebView::EvaluateJavaScript( const std::string& script ) +void WebView::EvaluateJavaScript( const std::string& script, std::function< void( const std::string& ) > resultHandler ) { - if ( mWebEngine ) + if( mWebEngine ) { - mWebEngine.EvaluateJavaScript( script ); + mWebEngine.EvaluateJavaScript( script, resultHandler ); } } void WebView::AddJavaScriptMessageHandler( const std::string& exposedObjectName, std::function< void( const std::string& ) > handler ) { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.AddJavaScriptMessageHandler( exposedObjectName, handler ); } @@ -210,7 +275,7 @@ void WebView::AddJavaScriptMessageHandler( const std::string& exposedObjectName, void WebView::ClearHistory() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.ClearHistory(); } @@ -218,22 +283,40 @@ void WebView::ClearHistory() void WebView::ClearCache() { - if ( mWebEngine ) + if( mWebEngine ) { mWebEngine.ClearCache(); } } -Dali::Toolkit::WebView::WebViewSignalType& WebView::PageLoadStartedSignal() +void WebView::ClearCookies() +{ + if( mWebEngine ) + { + mWebEngine.ClearCookies(); + } +} + +Dali::Toolkit::WebView::WebViewPageLoadSignalType& WebView::PageLoadStartedSignal() { return mPageLoadStartedSignal; } -Dali::Toolkit::WebView::WebViewSignalType& WebView::PageLoadFinishedSignal() +Dali::Toolkit::WebView::WebViewPageLoadSignalType& WebView::PageLoadFinishedSignal() { return mPageLoadFinishedSignal; } +Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType& WebView::PageLoadErrorSignal() +{ + return mPageLoadErrorSignal; +} + +Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType& WebView::ScrollEdgeReachedSignal() +{ + return mScrollEdgeReachedSignal; +} + void WebView::OnPageLoadStarted( const std::string& url ) { if( !mPageLoadStartedSignal.Empty() ) @@ -252,6 +335,24 @@ void WebView::OnPageLoadFinished( const std::string& url ) } } +void WebView::OnPageLoadError( const std::string& url, int errorCode ) +{ + if( !mPageLoadErrorSignal.Empty() ) + { + Dali::Toolkit::WebView handle( GetOwner() ); + mPageLoadErrorSignal.Emit( handle, url, static_cast< Toolkit::WebView::LoadErrorCode >( 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 ); @@ -269,6 +370,16 @@ bool WebView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* t webView.PageLoadFinishedSignal().Connect( tracker, functor ); connected = true; } + else if( 0 == strcmp( signalName.c_str(), PAGE_LOAD_ERROR_SIGNAL ) ) + { + 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; } @@ -318,6 +429,74 @@ void WebView::SetProperty( BaseObject* object, Property::Index index, const Prop } break; } + case Toolkit::WebView::Property::CACHE_MODEL: + { + Toolkit::WebView::CacheModel::Type output = impl.GetCacheModel(); + GET_ENUM_VALUE( CacheModel, value, output ); + impl.SetCacheModel( output ); + break; + } + case Toolkit::WebView::Property::COOKIE_ACCEPT_POLICY: + { + Toolkit::WebView::CookieAcceptPolicy::Type output = impl.GetCookieAcceptPolicy(); + GET_ENUM_VALUE( CookieAcceptPolicy, value, output ); + impl.SetCookieAcceptPolicy( output ); + break; + } + case Toolkit::WebView::Property::USER_AGENT: + { + std::string input; + if( value.Get( input ) ) + { + impl.SetUserAgent( input ); + } + break; + } + case Toolkit::WebView::Property::ENABLE_JAVASCRIPT: + { + bool input; + if( value.Get( input ) ) + { + impl.EnableJavaScript( input ); + } + break; + } + case Toolkit::WebView::Property::LOAD_IMAGES_AUTOMATICALLY: + { + bool input; + if( value.Get( input ) ) + { + impl.LoadImagesAutomatically( input ); + } + break; + } + case Toolkit::WebView::Property::DEFAULT_TEXT_ENCODING_NAME: + { + std::string input; + if( value.Get( input ) ) + { + impl.SetDefaultTextEncodingName( input ); + } + break; + } + case Toolkit::WebView::Property::DEFAULT_FONT_SIZE: + { + int input; + if( value.Get( input ) ) + { + impl.SetDefaultFontSize( input ); + } + break; + } + case Toolkit::WebView::Property::SCROLL_POSITION: + { + Vector2 input; + if ( value.Get( input ) ) + { + impl.SetScrollPosition( input.x, input.y ); + } + break; + } } } } @@ -335,20 +514,78 @@ Property::Value WebView::GetProperty( BaseObject* object, Property::Index proper { case Toolkit::WebView::Property::URL: { - value = impl.GetUrl(); + value = impl.mUrl; + break; + } + case Toolkit::WebView::Property::CACHE_MODEL: + { + value = GET_ENUM_STRING( CacheModel, impl.GetCacheModel() ); break; } + case Toolkit::WebView::Property::COOKIE_ACCEPT_POLICY: + { + value = GET_ENUM_STRING( CookieAcceptPolicy, impl.GetCookieAcceptPolicy() ); + break; + } + case Toolkit::WebView::Property::USER_AGENT: + { + value = impl.GetUserAgent(); + break; + } + case Toolkit::WebView::Property::ENABLE_JAVASCRIPT: + { + value = impl.IsJavaScriptEnabled(); + break; + } + case Toolkit::WebView::Property::LOAD_IMAGES_AUTOMATICALLY: + { + value = impl.AreImagesAutomaticallyLoaded(); + break; + } + case Toolkit::WebView::Property::DEFAULT_TEXT_ENCODING_NAME: + { + value = impl.GetDefaultTextEncodingName(); + break; + } + case Toolkit::WebView::Property::DEFAULT_FONT_SIZE: + { + 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; } } return value; } -bool WebView::OnTouchEvent( Actor actor, const Dali::TouchData& touch ) +bool WebView::OnTouchEvent( Actor actor, const Dali::TouchEvent& touch ) { bool result = false; - if ( mWebEngine ) + if( mWebEngine ) { result = mWebEngine.SendTouchEvent( touch ); } @@ -359,13 +596,159 @@ bool WebView::OnKeyEvent( const Dali::KeyEvent& event ) { bool result = false; - if ( mWebEngine ) + if( mWebEngine ) { result = mWebEngine.SendKeyEvent( event ); } return result; } +void WebView::OnKeyInputFocusGained() +{ + if( mWebEngine ) + { + mWebEngine.SetFocus( true ); + } + + EmitKeyInputFocusSignal( true ); // Calls back into the Control hence done last. +} + +void WebView::OnKeyInputFocusLost() +{ + if( mWebEngine ) + { + mWebEngine.SetFocus( false ); + } + + 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; +} + +void WebView::SetCacheModel( Toolkit::WebView::CacheModel::Type cacheModel ) +{ + if( mWebEngine ) + { + mWebEngine.SetCacheModel( static_cast< WebEnginePlugin::CacheModel >( cacheModel ) ); + } +} + +Toolkit::WebView::CookieAcceptPolicy::Type WebView::GetCookieAcceptPolicy() const +{ + return mWebEngine ? static_cast< Toolkit::WebView::CookieAcceptPolicy::Type >( mWebEngine.GetCookieAcceptPolicy() ) : Toolkit::WebView::CookieAcceptPolicy::NO_THIRD_PARTY; +} + +void WebView::SetCookieAcceptPolicy( Toolkit::WebView::CookieAcceptPolicy::Type policy ) +{ + if( mWebEngine ) + { + mWebEngine.SetCookieAcceptPolicy( static_cast< WebEnginePlugin::CookieAcceptPolicy >( policy ) ); + } +} + +const std::string& WebView::GetUserAgent() const +{ + return mWebEngine ? mWebEngine.GetUserAgent() : kEmptyString; +} + +void WebView::SetUserAgent( const std::string& userAgent ) +{ + if( mWebEngine ) + { + mWebEngine.SetUserAgent( userAgent ); + } +} + +bool WebView::IsJavaScriptEnabled() const +{ + return mWebEngine ? mWebEngine.IsJavaScriptEnabled() : true; +} + +void WebView::EnableJavaScript( bool enabled ) +{ + if( mWebEngine ) + { + mWebEngine.EnableJavaScript( enabled ); + } +} + +bool WebView::AreImagesAutomaticallyLoaded() const +{ + return mWebEngine ? mWebEngine.AreImagesAutomaticallyLoaded() : true; +} + +void WebView::LoadImagesAutomatically( bool automatic ) +{ + if( mWebEngine ) + { + mWebEngine.LoadImagesAutomatically( automatic ); + } +} + +const std::string& WebView::GetDefaultTextEncodingName() const +{ + return mWebEngine ? mWebEngine.GetDefaultTextEncodingName() : kEmptyString; +} + +void WebView::SetDefaultTextEncodingName( const std::string& defaultTextEncodingName ) +{ + if( mWebEngine ) + { + mWebEngine.SetDefaultTextEncodingName( defaultTextEncodingName ); + } +} + +int WebView::GetDefaultFontSize() const +{ + return mWebEngine ? mWebEngine.GetDefaultFontSize() : 0; +} + +void WebView::SetDefaultFontSize( int defaultFontSize ) +{ + if( mWebEngine ) + { + mWebEngine.SetDefaultFontSize( defaultFontSize ); + } +} + +#undef GET_ENUM_STRING +#undef GET_ENUM_VALUE + } // namespace Internal } // namespace Toolkit