From: huayong.xu Date: Tue, 2 Mar 2021 12:04:46 +0000 (+0800) Subject: Add APIs for context menu into web view. X-Git-Tag: dali_2.0.21~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=ce0f6a98e157fda761dd9c3d0514609be937f388 Add APIs for context menu into web view. This patch is to add some APIs for context menu in web view. Items of context menu is a short-cut to do something, e.g. back, forward, etc. Change-Id: If7820f5e1ea169a9a6645581e018e08d3c18bd70 --- 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 b33e169..d760930 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 @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include #include @@ -573,6 +575,107 @@ private: std::string mockUrl; }; +class MockWebEngineContextMenuItem : public Dali::WebEngineContextMenuItem +{ +public: + MockWebEngineContextMenuItem() + { + } + + ItemTag GetTag() const override + { + return ItemTag::NO_ACTION; + } + + ItemType GetType() const override + { + return ItemType::ACTION; + } + + bool IsEnabled() const override + { + return true; + } + + std::string GetLinkUrl() const override + { + return "http://test.html"; + } + + std::string GetImageUrl() const override + { + return "http://test.jpg"; + } + + std::string GetTitle() const override + { + return "title"; + } + + std::unique_ptr GetParentMenu() const override + { + std::unique_ptr result; + return result; + } +}; + +class MockWebEngineContextMenu : public Dali::WebEngineContextMenu +{ +public: + MockWebEngineContextMenu() + { + } + + uint32_t GetItemCount() const override + { + return 1; + } + + std::unique_ptr GetItemAt(uint32_t index) const override + { + std::unique_ptr webitem(new MockWebEngineContextMenuItem()); + return webitem; + } + + std::vector> GetItemList() const override + { + std::vector> result; + std::unique_ptr webitem(new MockWebEngineContextMenuItem()); + result.push_back(std::move(webitem)); + return result; + } + + Dali::Vector2 GetPosition() const override + { + return Dali::Vector2(100, 100); + } + + bool RemoveItem(WebEngineContextMenuItem& item) override + { + return true; + } + + bool AppendItemAsAction(WebEngineContextMenuItem::ItemTag tag, const std::string& title, bool enabled) override + { + return true; + } + + bool AppendItem(WebEngineContextMenuItem::ItemTag tag, const std::string& title, const std::string& iconFile, bool enabled) override + { + return true; + } + + bool SelectItem(WebEngineContextMenuItem& item) override + { + return true; + } + + bool Hide() override + { + return true; + } +}; + class MockWebEngineSettings : public WebEngineSettings { public: @@ -1174,25 +1277,37 @@ public: return mHttpAuthHandlerSignal; } + Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& ContextMenuCustomizedSignal() + { + return mContextMenuCustomizedSignal; + } + + Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal() + { + return mContextMenuItemSelectedSignal; + } + std::string mUrl; std::vector mHistory; size_t mCurrentPlusOnePos; std::string mUserAgent; - Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadStartedSignal; - Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadInProgressSignal; - Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadFinishedSignal; - Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType mPageLoadErrorSignal; - Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType mScrollEdgeReachedSignal; - Dali::WebEnginePlugin::WebEngineUrlChangedSignalType mUrlChangedSignal; - Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal; - Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType mFrameRenderedSignal; - Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal; - Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType mConsoleMessageSignal; - Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType mPolicyDecisionSignal; - Dali::WebEnginePlugin::WebEngineCertificateSignalType mCertificateConfirmSignal; - Dali::WebEnginePlugin::WebEngineCertificateSignalType mSslCertificateChangedSignal; - Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType mHttpAuthHandlerSignal; + Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadStartedSignal; + Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadInProgressSignal; + Dali::WebEnginePlugin::WebEnginePageLoadSignalType mPageLoadFinishedSignal; + Dali::WebEnginePlugin::WebEnginePageLoadErrorSignalType mPageLoadErrorSignal; + Dali::WebEnginePlugin::WebEngineScrollEdgeReachedSignalType mScrollEdgeReachedSignal; + Dali::WebEnginePlugin::WebEngineUrlChangedSignalType mUrlChangedSignal; + Dali::WebEnginePlugin::WebEngineFormRepostDecisionSignalType mFormRepostDecisionSignal; + Dali::WebEnginePlugin::WebEngineFrameRenderedSignalType mFrameRenderedSignal; + Dali::WebEnginePlugin::WebEngineRequestInterceptorSignalType mRequestInterceptorSignal; + Dali::WebEnginePlugin::WebEngineConsoleMessageSignalType mConsoleMessageSignal; + Dali::WebEnginePlugin::WebEnginePolicyDecisionSignalType mPolicyDecisionSignal; + Dali::WebEnginePlugin::WebEngineCertificateSignalType mCertificateConfirmSignal; + Dali::WebEnginePlugin::WebEngineCertificateSignalType mSslCertificateChangedSignal; + Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType mHttpAuthHandlerSignal; + Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType mContextMenuCustomizedSignal; + Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType mContextMenuItemSelectedSignal; bool mEvaluating; float mPageZoomFactor; @@ -1278,6 +1393,11 @@ bool OnLoadUrl() gInstance->mSslCertificateChangedSignal.Emit(std::move(sslCertificate)); std::shared_ptr handler(new MockWebEngineHttpAuthHandler()); gInstance->mHttpAuthHandlerSignal.Emit(std::move(handler)); + + std::shared_ptr menu(new MockWebEngineContextMenu()); + gInstance->mContextMenuCustomizedSignal.Emit(std::move(menu)); + std::shared_ptr item(new MockWebEngineContextMenuItem()); + gInstance->mContextMenuItemSelectedSignal.Emit(std::move(item)); } return false; } @@ -1934,5 +2054,15 @@ Dali::WebEnginePlugin::WebEngineHttpAuthHandlerSignalType& WebEngine::HttpAuthHa return Internal::Adaptor::GetImplementation(*this).HttpAuthHandlerSignal(); } +Dali::WebEnginePlugin::WebEngineContextMenuCustomizedSignalType& WebEngine::ContextMenuCustomizedSignal() +{ + return Internal::Adaptor::GetImplementation( *this ).ContextMenuCustomizedSignal(); +} + +Dali::WebEnginePlugin::WebEngineContextMenuItemSelectedSignalType& WebEngine::ContextMenuItemSelectedSignal() +{ + return Internal::Adaptor::GetImplementation( *this ).ContextMenuItemSelectedSignal(); +} + } // 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 0d254ab..bc0c261 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp @@ -24,6 +24,8 @@ #include #include #include +#include +#include #include #include #include @@ -94,6 +96,10 @@ static int gDownloadStartedCallbackCalled = 0; static int gMimeOverriddenCallbackCalled = 0; static std::vector> gSecurityOriginList; static std::vector> gPasswordDataList; +static int gContextMenuCustomizedCallbackCalled = 0; +static std::shared_ptr gContextMenuInstance = 0; +static int gContextMenuItemSelectedCallbackCalled = 0; +static std::shared_ptr gContextMenuItemInstance = 0; struct CallbackFunctor { @@ -274,6 +280,18 @@ static bool OnMimeOverridden(const std::string&, const std::string&, std::string return false; } +static void OnContextMenuCustomized(WebView view, std::shared_ptr menu) +{ + gContextMenuCustomizedCallbackCalled++; + gContextMenuInstance = std::move(menu); +} + +static void OnContextMenuItemSelected(WebView view, std::shared_ptr item) +{ + gContextMenuItemSelectedCallbackCalled++; + gContextMenuItemInstance = std::move(item); +} + } // namespace void web_view_startup(void) @@ -1037,6 +1055,67 @@ int UtcDaliWebViewPropertyTitleFavicon(void) END_TEST; } +int UtcDaliWebViewContextMenuCustomizedAndItemSelected(void) +{ + ToolkitTestApplication application; + + WebView view = WebView::New(); + DALI_TEST_CHECK( view ); + + // load url. + ConnectionTracker* testTracker = new ConnectionTracker(); + view.ContextMenuCustomizedSignal().Connect( &OnContextMenuCustomized ); + view.ContextMenuItemSelectedSignal().Connect( &OnContextMenuItemSelected ); + bool signal1 = false; + bool signal2 = false; + view.ConnectSignal( testTracker, "contextMenuCustomized", CallbackFunctor(&signal1) ); + view.ConnectSignal( testTracker, "contextMenuItemSelected", CallbackFunctor(&signal2) ); + DALI_TEST_EQUALS( gContextMenuCustomizedCallbackCalled, 0, TEST_LOCATION ); + DALI_TEST_EQUALS( gContextMenuItemSelectedCallbackCalled, 0, TEST_LOCATION ); + DALI_TEST_CHECK(gContextMenuInstance == 0); + DALI_TEST_CHECK(gContextMenuItemInstance == 0); + + view.LoadUrl( TEST_URL1 ); + Test::EmitGlobalTimerSignal(); + DALI_TEST_EQUALS( gContextMenuCustomizedCallbackCalled, 1, TEST_LOCATION ); + DALI_TEST_EQUALS( gContextMenuItemSelectedCallbackCalled, 1, TEST_LOCATION ); + DALI_TEST_CHECK( signal1 ); + DALI_TEST_CHECK( signal2 ); + + // check context meun & its items. + DALI_TEST_CHECK(gContextMenuInstance != 0); + std::unique_ptr item = gContextMenuInstance->GetItemAt(0); + DALI_TEST_CHECK(item.get() != 0); + std::vector> itemList = gContextMenuInstance->GetItemList(); + DALI_TEST_CHECK(itemList.size() == 1); + Dali::Vector2 testPosition = Dali::Vector2(100, 100); + DALI_TEST_EQUALS(gContextMenuInstance->GetPosition(), testPosition, TEST_LOCATION); + DALI_TEST_CHECK(gContextMenuInstance->RemoveItem(*(item.get()))); + DALI_TEST_CHECK(gContextMenuInstance->AppendItemAsAction(WebEngineContextMenuItem::ItemTag::NO_ACTION, "", false)); + DALI_TEST_CHECK(gContextMenuInstance->AppendItem(WebEngineContextMenuItem::ItemTag::NO_ACTION, "", "", false)); + DALI_TEST_CHECK(gContextMenuInstance->SelectItem(*(item.get()))); + DALI_TEST_CHECK(gContextMenuInstance->Hide()); + + DALI_TEST_CHECK(gContextMenuItemInstance != 0); + Dali::WebEngineContextMenuItem::ItemTag testItemTag = Dali::WebEngineContextMenuItem::ItemTag::NO_ACTION; + DALI_TEST_EQUALS(gContextMenuItemInstance->GetTag(), testItemTag, TEST_LOCATION); + Dali::WebEngineContextMenuItem::ItemType testItemType = Dali::WebEngineContextMenuItem::ItemType::ACTION; + DALI_TEST_EQUALS(gContextMenuItemInstance->GetType(), testItemType, TEST_LOCATION); + DALI_TEST_CHECK(gContextMenuItemInstance->IsEnabled()); + std::string testLinkUrl("http://test.html"); + DALI_TEST_EQUALS(gContextMenuItemInstance->GetLinkUrl(), testLinkUrl, TEST_LOCATION); + std::string testImageUrl("http://test.jpg"); + DALI_TEST_EQUALS(gContextMenuItemInstance->GetImageUrl(), testImageUrl, TEST_LOCATION); + std::string testTitle("title"); + DALI_TEST_EQUALS(gContextMenuItemInstance->GetTitle(), testTitle, TEST_LOCATION); + DALI_TEST_CHECK(gContextMenuItemInstance->GetParentMenu().get() == 0); + + gContextMenuInstance = nullptr; + gContextMenuItemInstance = nullptr; + + END_TEST; +} + int UtcDaliWebViewScrollBy(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 index 06c4ee9..f73e9dc 100755 --- a/dali-toolkit/devel-api/controls/web-view/web-view.cpp +++ b/dali-toolkit/devel-api/controls/web-view/web-view.cpp @@ -369,6 +369,16 @@ WebView::WebViewHttpAuthHandlerSignalType& WebView::HttpAuthHandlerSignal() return Dali::Toolkit::GetImpl(*this).HttpAuthHandlerSignal(); } +WebView::WebViewContextMenuCustomizedSignalType& WebView::ContextMenuCustomizedSignal() +{ + return Dali::Toolkit::GetImpl(*this).ContextMenuCustomizedSignal(); +} + +WebView::WebViewContextMenuItemSelectedSignalType& WebView::ContextMenuItemSelectedSignal() +{ + return Dali::Toolkit::GetImpl(*this).ContextMenuItemSelectedSignal(); +} + 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 index df73d0e..6d8d3b9 100755 --- a/dali-toolkit/devel-api/controls/web-view/web-view.h +++ b/dali-toolkit/devel-api/controls/web-view/web-view.h @@ -33,6 +33,8 @@ namespace Toolkit class ImageView; class WebBackForwardList; class WebContext; +class WebContextMenu; +class WebContextMenuItem; class WebCookieManager; class WebFormRepostDecision; class WebSettings; @@ -246,6 +248,16 @@ public: */ using WebViewHttpAuthHandlerSignalType = Signal)>; + /** + * @brief WebView signal type related with context menu customized. + */ + using WebViewContextMenuCustomizedSignalType = Signal)>; + + /** + * @brief WebView signal type related with context menu item selected. + */ + using WebViewContextMenuItemSelectedSignalType = Signal)>; + public: /** * @brief Creates an initialized WebView. @@ -641,110 +653,124 @@ public: bool CheckVideoPlayingAsynchronously(Dali::WebEnginePlugin::VideoPlayingCallback callback); /** - * @brief Sets callback which will be called upon geolocation permission request. + * @brief Set callback which will be called upon geolocation permission request. * * @param[in] callback The callback for requesting geolocation permission */ void RegisterGeolocationPermissionCallback(Dali::WebEnginePlugin::GeolocationPermissionCallback callback); /** - * @brief Connects to this signal to be notified when page loading is started. + * @brief Connect to this signal to be notified when page loading is started. * * @return A signal object to connect with */ WebViewPageLoadSignalType& PageLoadStartedSignal(); /** - * @brief Connects to this signal to be notified when page loading is in progress. + * @brief Connect to this signal to be notified when page loading is in progress. * * @return A signal object to connect with */ WebViewPageLoadSignalType& PageLoadInProgressSignal(); /** - * @brief Connects to this signal to be notified when page loading is finished. + * @brief Connect to this signal to be notified when page loading is finished. * * @return A signal object to connect with */ WebViewPageLoadSignalType& PageLoadFinishedSignal(); /** - * @brief Connects to this signal to be notified when an error occurs in page loading. + * @brief Connect to this signal to be notified when an error occurs in page loading. * * @return A signal object to connect with */ WebViewPageLoadErrorSignalType& PageLoadErrorSignal(); /** - * @brief Connects to this signal to be notified when scroll edge is reached. + * @brief Connect to this signal to be notified when scroll edge is reached. * * @return A signal object to connect with */ WebViewScrollEdgeReachedSignalType& ScrollEdgeReachedSignal(); /** - * @brief Connects to this signal to be notified when url is changed. + * @brief Connect to this signal to be notified when url is changed. * * @return A signal object to connect with */ WebViewUrlChangedSignalType& UrlChangedSignal(); /** - * @brief Connects to this signal to be notified when form repost decision is requested. + * @brief Connect to this signal to be notified when form repost decision is requested. * * @return A signal object to connect with. */ WebViewFormRepostDecisionSignalType& FormRepostDecisionSignal(); /** - * @brief Connects to this signal to be notified when frame is rendered. + * @brief Connect to this signal to be notified when frame is rendered. * * @return A signal object to connect with. */ WebViewFrameRenderedSignalType& FrameRenderedSignal(); /** - * @brief Connects to this signal to be notified when http request need be intercepted. + * @brief Connect to this signal to be notified when http request need be intercepted. * * @return A signal object to connect with. */ WebViewRequestInterceptorSignalType& RequestInterceptorSignal(); /** - * @brief Connects to this signal to be notified when console message will be logged. + * @brief Connect to this signal to be notified when console message will be logged. * * @return A signal object to connect with. */ WebViewConsoleMessageSignalType& ConsoleMessageSignal(); /** - * @brief Connects to this signal to be notified when new policy would be decided. + * @brief Connect to this signal to be notified when new policy would be decided. * * @return A signal object to connect with. */ WebViewPolicyDecisionSignalType& PolicyDecisionSignal(); /** - * @brief Connects to this signal to be notified when certificate need be confirmed. + * @brief Connect to this signal to be notified when certificate need be confirmed. * * @return A signal object to connect with. */ WebViewCertificateSignalType& CertificateConfirmSignal(); /** - * @brief Connects to this signal to be notified when ssl certificate is changed. + * @brief Connect to this signal to be notified when ssl certificate is changed. * * @return A signal object to connect with. */ WebViewCertificateSignalType& SslCertificateChangedSignal(); /** - * @brief Connects to this signal to be notified when http authentication need be confirmed. + * @brief Connect to this signal to be notified when http authentication need be confirmed. * * @return A signal object to connect with. */ WebViewHttpAuthHandlerSignalType& HttpAuthHandlerSignal(); + /** + * @brief Connect to this signal to be notified when context menu would be customized. + * + * @return A signal object to connect with. + */ + WebViewContextMenuCustomizedSignalType& ContextMenuCustomizedSignal(); + + /** + * @brief Connect to this signal to be notified when context menu item is selected. + * + * @return A signal object to connect with. + */ + WebViewContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal(); + 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 100755 new mode 100644 index 2eeabeb..0dd6834 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include #include @@ -85,20 +87,22 @@ DALI_PROPERTY_REGISTRATION(Toolkit, WebView, "pageZoomFactor", FLOAT, DALI_PROPERTY_REGISTRATION(Toolkit, WebView, "textZoomFactor", FLOAT, TEXT_ZOOM_FACTOR ) DALI_PROPERTY_REGISTRATION(Toolkit, WebView, "loadProgressPercentage", FLOAT, LOAD_PROGRESS_PERCENTAGE ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "pageLoadStarted", PAGE_LOAD_STARTED_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "pageLoadInProgress", PAGE_LOAD_IN_PROGRESS_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_SIGNAL_REGISTRATION(Toolkit, WebView, "urlChanged", URL_CHANGED_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "formRepostDecision", FORM_REPOST_DECISION_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "frameRendered", FRAME_RENDERED_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "requestInterceptor", REQUEST_INTERCEPTOR_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "consoleMessage", CONSOLE_MESSAGE_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "policyDecision", POLICY_DECISION ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "certificateConfirm", CERTIFICATE_CONFIRM_SIGNAL ) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "sslCertificateChanged", SSL_CERTIFICATE_CHANGED_SIGNAL) -DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "httpAuthRequest", HTTP_AUTH_REQUEST_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "pageLoadStarted", PAGE_LOAD_STARTED_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "pageLoadInProgress", PAGE_LOAD_IN_PROGRESS_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_SIGNAL_REGISTRATION(Toolkit, WebView, "urlChanged", URL_CHANGED_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "formRepostDecision", FORM_REPOST_DECISION_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "frameRendered", FRAME_RENDERED_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "requestInterceptor", REQUEST_INTERCEPTOR_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "consoleMessage", CONSOLE_MESSAGE_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "policyDecision", POLICY_DECISION ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "certificateConfirm", CERTIFICATE_CONFIRM_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "sslCertificateChanged", SSL_CERTIFICATE_CHANGED_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "httpAuthRequest", HTTP_AUTH_REQUEST_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "contextMenuCustomized", CONTEXT_MENU_CUSTOMIZED_SIGNAL ) +DALI_SIGNAL_REGISTRATION(Toolkit, WebView, "contextMenuItemSelected", CONTEXT_MENU_ITEM_SELECTED_SIGNAL) DALI_TYPE_REGISTRATION_END() // clang-format on @@ -234,6 +238,8 @@ void WebView::OnInitialize() mWebEngine.CertificateConfirmSignal().Connect(this, &WebView::OnCertificateConfirm); mWebEngine.SslCertificateChangedSignal().Connect(this, &WebView::OnSslCertificateChanged); mWebEngine.HttpAuthHandlerSignal().Connect(this, &WebView::OnHttpAuthenticationRequest); + mWebEngine.ContextMenuCustomizedSignal().Connect(this, &WebView::OnContextMenuCustomized); + mWebEngine.ContextMenuItemSelectedSignal().Connect(this, &WebView::OnContextMenuItemSelected); mWebContext = std::unique_ptr(new WebContext(mWebEngine.GetContext())); mWebCookieManager = std::unique_ptr(new WebCookieManager(mWebEngine.GetCookieManager())); @@ -757,6 +763,16 @@ Dali::Toolkit::WebView::WebViewHttpAuthHandlerSignalType& WebView::HttpAuthHandl return mHttpAuthHandlerSignal; } +Dali::Toolkit::WebView::WebViewContextMenuCustomizedSignalType& WebView::ContextMenuCustomizedSignal() +{ + return mContextMenuCustomizedSignal; +} + +Dali::Toolkit::WebView::WebViewContextMenuItemSelectedSignalType& WebView::ContextMenuItemSelectedSignal() +{ + return mContextMenuItemSelectedSignal; +} + void WebView::OnPageLoadStarted(const std::string& url) { if(!mPageLoadStartedSignal.Empty()) @@ -901,6 +917,24 @@ void WebView::OnHttpAuthenticationRequest(std::shared_ptr menu) +{ + if(!mContextMenuCustomizedSignal.Empty()) + { + Dali::Toolkit::WebView handle(GetOwner()); + mContextMenuCustomizedSignal.Emit(handle, std::move(menu)); + } +} + +void WebView::OnContextMenuItemSelected(std::shared_ptr item) +{ + if(!mContextMenuItemSelectedSignal.Empty()) + { + Dali::Toolkit::WebView handle(GetOwner()); + mContextMenuItemSelectedSignal.Emit(handle, std::move(item)); + } +} + bool WebView::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor) { Dali::BaseHandle handle(object); @@ -978,6 +1012,16 @@ bool WebView::DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tr webView.HttpAuthHandlerSignal().Connect(tracker, functor); connected = true; } + else if(0 == strcmp(signalName.c_str(), CONTEXT_MENU_CUSTOMIZED_SIGNAL)) + { + webView.ContextMenuCustomizedSignal().Connect(tracker, functor); + connected = true; + } + else if(0 == strcmp(signalName.c_str(), CONTEXT_MENU_ITEM_SELECTED_SIGNAL)) + { + webView.ContextMenuItemSelectedSignal().Connect(tracker, functor); + connected = true; + } return connected; } diff --git a/dali-toolkit/internal/controls/web-view/web-view-impl.h b/dali-toolkit/internal/controls/web-view/web-view-impl.h index 532fec6..99a964c 100755 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.h +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.h @@ -369,6 +369,16 @@ public: */ Dali::Toolkit::WebView::WebViewHttpAuthHandlerSignalType& HttpAuthHandlerSignal(); + /** + * @copydoc Dali::Toolkit::WebView::ContextMenuCustomizedSignal() + */ + Dali::Toolkit::WebView::WebViewContextMenuCustomizedSignalType& ContextMenuCustomizedSignal(); + + /** + * @copydoc Dali::Toolkit::WebView::ContextMenuItemSelectedSignal() + */ + Dali::Toolkit::WebView::WebViewContextMenuItemSelectedSignalType& ContextMenuItemSelectedSignal(); + public: // Properties /** * @brief Called when a property of an object of this type is set. @@ -714,26 +724,40 @@ private: */ void OnHttpAuthenticationRequest(std::shared_ptr handler); + /** + * @brief Callback function to be called when context menu would be customized. + * @param[in] e The scroll edge reached. + */ + void OnContextMenuCustomized(std::shared_ptr menu); + + /** + * @brief Callback function to be called when context menu item is selected. + * @param[in] url The url currently being loaded + */ + void OnContextMenuItemSelected(std::shared_ptr item); + private: std::string mUrl; Dali::Toolkit::Visual::Base mVisual; Dali::Size mWebViewSize; Dali::WebEngine mWebEngine; - Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadStartedSignal; - Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadInProgressSignal; - Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadFinishedSignal; - Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType mPageLoadErrorSignal; - Dali::Toolkit::WebView::WebViewUrlChangedSignalType mUrlChangedSignal; - Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType mScrollEdgeReachedSignal; - Dali::Toolkit::WebView::WebViewFormRepostDecisionSignalType mFormRepostDecisionSignal; - Dali::Toolkit::WebView::WebViewFrameRenderedSignalType mFrameRenderedSignal; - Dali::Toolkit::WebView::WebViewRequestInterceptorSignalType mRequestInterceptorSignal; - Dali::Toolkit::WebView::WebViewConsoleMessageSignalType mConsoleMessageSignal; - Dali::Toolkit::WebView::WebViewPolicyDecisionSignalType mPolicyDecisionSignal; - Dali::Toolkit::WebView::WebViewCertificateSignalType mCertificateConfirmSignal; - Dali::Toolkit::WebView::WebViewCertificateSignalType mSslCertificateChangedSignal; - Dali::Toolkit::WebView::WebViewHttpAuthHandlerSignalType mHttpAuthHandlerSignal; + Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadStartedSignal; + Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadInProgressSignal; + Dali::Toolkit::WebView::WebViewPageLoadSignalType mPageLoadFinishedSignal; + Dali::Toolkit::WebView::WebViewPageLoadErrorSignalType mPageLoadErrorSignal; + Dali::Toolkit::WebView::WebViewUrlChangedSignalType mUrlChangedSignal; + Dali::Toolkit::WebView::WebViewScrollEdgeReachedSignalType mScrollEdgeReachedSignal; + Dali::Toolkit::WebView::WebViewFormRepostDecisionSignalType mFormRepostDecisionSignal; + Dali::Toolkit::WebView::WebViewFrameRenderedSignalType mFrameRenderedSignal; + Dali::Toolkit::WebView::WebViewRequestInterceptorSignalType mRequestInterceptorSignal; + Dali::Toolkit::WebView::WebViewConsoleMessageSignalType mConsoleMessageSignal; + Dali::Toolkit::WebView::WebViewPolicyDecisionSignalType mPolicyDecisionSignal; + Dali::Toolkit::WebView::WebViewCertificateSignalType mCertificateConfirmSignal; + Dali::Toolkit::WebView::WebViewCertificateSignalType mSslCertificateChangedSignal; + Dali::Toolkit::WebView::WebViewHttpAuthHandlerSignalType mHttpAuthHandlerSignal; + Dali::Toolkit::WebView::WebViewContextMenuCustomizedSignalType mContextMenuCustomizedSignal; + Dali::Toolkit::WebView::WebViewContextMenuItemSelectedSignalType mContextMenuItemSelectedSignal; std::unique_ptr mWebContext; std::unique_ptr mWebCookieManager;