From: huayong.xu Date: Tue, 26 Jul 2022 07:33:32 +0000 (+0800) Subject: Add an API for getting web view when request is intercepted. X-Git-Tag: dali_2.1.35~1^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2f810b8a969d39e569b39107a02dfaf35c0c48bc Add an API for getting web view when request is intercepted. Change-Id: Id0fef8fc8f2afc606d648728ca54771c46b3692f --- 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 0e86810..6003749 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 @@ -487,7 +487,6 @@ public: } }; - class MockWebEngineCertificate : public Dali::WebEngineCertificate { public: @@ -629,69 +628,6 @@ private: MockWebEngineFrame mockWebFrame; }; -class MockWebEngineRequestInterceptor : public WebEngineRequestInterceptor -{ -public: - MockWebEngineRequestInterceptor() - { - } - - std::string GetUrl() const override - { - return "http://test.html"; - } - - Dali::Property::Map GetHeaders() const override - { - return mockHeadersMap; - } - - std::string GetMethod() const override - { - return "GET"; - } - - bool Ignore() override - { - return true; - } - - bool SetResponseStatus(int statusCode, const std::string& customedStatusText) override - { - return true; - } - - bool AddResponseHeader(const std::string& fieldName, const std::string& fieldValue) override - { - mockHeadersMap.Add(fieldName, fieldValue); - return true; - } - - bool AddResponseHeaders(const Dali::Property::Map& headers) override - { - mockHeadersMap.Merge(headers); - return true; - } - - bool AddResponseBody(const int8_t* body, uint32_t length) override - { - return true; - } - - bool AddResponse(const std::string& headers, const int8_t* body, uint32_t length) override - { - return true; - } - - bool WriteResponseChunk(const int8_t* chunk, uint32_t length) override - { - return true; - } - -private: - Dali::Property::Map mockHeadersMap; -}; - class MockWebEngineConsoleMessage : public Dali::WebEngineConsoleMessage { public: @@ -1210,6 +1146,186 @@ private: std::string mockDefaultTextEncodingName; }; +class MockWebEnginePlugin : public Dali::WebEnginePlugin +{ +public: + MockWebEnginePlugin(){} + void Create(uint32_t width, uint32_t height, const std::string& locale, const std::string& timezoneId) override {} + void Create(uint32_t width, uint32_t height, uint32_t argc, char** argv) override {} + void Destroy() override {} + WebEngineSettings& GetSettings() const override { return *((WebEngineSettings*)&settings); } + WebEngineBackForwardList& GetBackForwardList() const override { return *((WebEngineBackForwardList*)&backForwardList); } + void LoadUrl(const std::string& url) override {} + std::string GetTitle() const override { return std::string(); } + Dali::PixelData GetFavicon() const override { return Dali::PixelData(); } + NativeImageSourcePtr GetNativeImageSource() override { return nullptr; } + std::string GetUrl() const override { return std::string(); } + void LoadHtmlString(const std::string& htmlString) override {} + bool LoadHtmlStringOverrideCurrentEntry(const std::string& html, const std::string& basicUri, const std::string& unreachableUrl) override { return false; } + bool LoadContents(const std::string& contents, uint32_t contentSize, const std::string& mimeType, const std::string& encoding, const std::string& baseUri) override { return false; } + void Reload() override {} + bool ReloadWithoutCache() override { return false; } + void StopLoading() override {} + void Suspend() override {} + void Resume() override {} + void SuspendNetworkLoading() override {} + void ResumeNetworkLoading() override {} + bool AddCustomHeader(const std::string& name, const std::string& value) override { return false; } + bool RemoveCustomHeader(const std::string& name) override { return false; } + uint32_t StartInspectorServer(uint32_t port) override { return 0; } + bool StopInspectorServer() override { return false; } + void ScrollBy(int32_t deltaX, int32_t deltaY) override {} + bool ScrollEdgeBy(int32_t deltaX, int32_t deltaY) override { return false; } + void SetScrollPosition(int32_t x, int32_t y) override {} + Dali::Vector2 GetScrollPosition() const override { return Dali::Vector2(); } + Dali::Vector2 GetScrollSize() const override { return Dali::Vector2(); } + Dali::Vector2 GetContentSize() const override { return Dali::Vector2(); } + bool CanGoForward() override { return false; } + void GoForward() override {} + bool CanGoBack() override { return false; } + void GoBack() override {} + void EvaluateJavaScript(const std::string& script, JavaScriptMessageHandlerCallback resultHandler) override {} + void AddJavaScriptMessageHandler(const std::string& exposedObjectName, JavaScriptMessageHandlerCallback handler) override {} + void RegisterJavaScriptAlertCallback(JavaScriptAlertCallback callback) override {} + void JavaScriptAlertReply() override {} + void RegisterJavaScriptConfirmCallback(JavaScriptConfirmCallback callback) override {} + void JavaScriptConfirmReply(bool confirmed) override {} + void RegisterJavaScriptPromptCallback(JavaScriptPromptCallback callback) override {} + void JavaScriptPromptReply(const std::string& result) override {} + std::unique_ptr CreateHitTest(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode) override { return nullptr; } + bool CreateHitTestAsynchronously(int32_t x, int32_t y, Dali::WebEngineHitTest::HitTestMode mode, WebEngineHitTestCreatedCallback callback) override { return false; } + void ClearHistory() override {} + void ClearAllTilesResources() override {} + std::string GetUserAgent() const override { return std::string(); } + void SetUserAgent(const std::string& userAgent) override {} + void SetSize(uint32_t width, uint32_t height) override {} + void SetDocumentBackgroundColor(Dali::Vector4 color) override {} + void ClearTilesWhenHidden(bool cleared) override {} + void SetTileCoverAreaMultiplier(float multiplier) override {} + void EnableCursorByClient(bool enabled) override {} + std::string GetSelectedText() const override { return std::string(); } + bool SendTouchEvent(const TouchEvent& touch) override { return false; } + bool SendKeyEvent(const KeyEvent& event) override { return false; } + void EnableMouseEvents(bool enabled) override {} + void EnableKeyEvents(bool enabled) override {} + void SetFocus(bool focused) override {} + void SetPageZoomFactor(float zoomFactor) override {} + float GetPageZoomFactor() const override { return 0.0f; } + void SetTextZoomFactor(float zoomFactor) override {} + float GetTextZoomFactor() const override { return 0.0f; } + float GetLoadProgressPercentage() const override { return 0.0f; } + void SetScaleFactor(float scaleFactor, Dali::Vector2 point) override {} + float GetScaleFactor() const override { return 0.0f; } + void ActivateAccessibility(bool activated) override {} + Accessibility::Address GetAccessibilityAddress() override { return Accessibility::Address(); } + bool SetVisibility(bool visible) override { return false; } + bool HighlightText(const std::string& text, FindOption options, uint32_t maxMatchCount) override { return false; } + void AddDynamicCertificatePath(const std::string& host, const std::string& certPath) override {} + Dali::PixelData GetScreenshot(Dali::Rect viewArea, float scaleFactor) override { return Dali::PixelData(); } + bool GetScreenshotAsynchronously(Dali::Rect viewArea, float scaleFactor, ScreenshotCapturedCallback callback) override { return false; } + bool CheckVideoPlayingAsynchronously(VideoPlayingCallback callback) override { return false; } + void RegisterGeolocationPermissionCallback(GeolocationPermissionCallback callback) override {} + void UpdateDisplayArea(Dali::Rect displayArea) override {} + void EnableVideoHole(bool enabled) override {} + bool SendHoverEvent(const HoverEvent& event) override { return false; } + bool SendWheelEvent(const WheelEvent& event) override { return false; } + WebEngineFrameRenderedSignalType& FrameRenderedSignal() override { return frameRenderedSignal; } + void RegisterPageLoadStartedCallback(WebEnginePageLoadCallback callback) override {} + void RegisterPageLoadInProgressCallback(WebEnginePageLoadCallback callback) override {} + void RegisterPageLoadFinishedCallback(WebEnginePageLoadCallback callback) override {} + void RegisterPageLoadErrorCallback(WebEnginePageLoadErrorCallback callback) override {} + void RegisterScrollEdgeReachedCallback(WebEngineScrollEdgeReachedCallback callback) override {} + void RegisterUrlChangedCallback(WebEngineUrlChangedCallback callback) override {} + void RegisterFormRepostDecidedCallback(WebEngineFormRepostDecidedCallback callback) override {} + void RegisterConsoleMessageReceivedCallback(WebEngineConsoleMessageReceivedCallback callback) override {} + void RegisterResponsePolicyDecidedCallback(WebEngineResponsePolicyDecidedCallback callback) override {} + void RegisterNavigationPolicyDecidedCallback(WebEngineNavigationPolicyDecidedCallback callback) override {} + void RegisterCertificateConfirmedCallback(WebEngineCertificateCallback callback) override {} + void RegisterSslCertificateChangedCallback(WebEngineCertificateCallback callback) override {} + void RegisterHttpAuthHandlerCallback(WebEngineHttpAuthHandlerCallback callback) override {} + void RegisterContextMenuShownCallback(WebEngineContextMenuShownCallback callback) override {} + void RegisterContextMenuHiddenCallback(WebEngineContextMenuHiddenCallback callback) override {} + void GetPlainTextAsynchronously(PlainTextReceivedCallback callback) override {} +private: + MockWebEngineSettings settings; + MockWebEngineBackForwardList backForwardList; + WebEngineFrameRenderedSignalType frameRenderedSignal; +}; + +Dali::WebEnginePlugin* GetWebEnginePlugin() +{ + static MockWebEnginePlugin plugin; + return &plugin; +} + +class MockWebEngineRequestInterceptor : public WebEngineRequestInterceptor +{ +public: + MockWebEngineRequestInterceptor() + { + } + + Dali::WebEnginePlugin* GetWebEngine() const + { + return GetWebEnginePlugin(); + } + + std::string GetUrl() const override + { + return "http://test.html"; + } + + Dali::Property::Map GetHeaders() const override + { + return mockHeadersMap; + } + + std::string GetMethod() const override + { + return "GET"; + } + + bool Ignore() override + { + return true; + } + + bool SetResponseStatus(int statusCode, const std::string& customedStatusText) override + { + return true; + } + + bool AddResponseHeader(const std::string& fieldName, const std::string& fieldValue) override + { + mockHeadersMap.Add(fieldName, fieldValue); + return true; + } + + bool AddResponseHeaders(const Dali::Property::Map& headers) override + { + mockHeadersMap.Merge(headers); + return true; + } + + bool AddResponseBody(const int8_t* body, uint32_t length) override + { + return true; + } + + bool AddResponse(const std::string& headers, const int8_t* body, uint32_t length) override + { + return true; + } + + bool WriteResponseChunk(const int8_t* chunk, uint32_t length) override + { + return true; + } + +private: + Dali::Property::Map mockHeadersMap; +}; + class WebEngine: public Dali::BaseObject { public: @@ -2063,6 +2179,11 @@ std::string WebEngine::GetUrl() const return Internal::Adaptor::GetImplementation( *this ).GetUrl(); } +Dali::WebEnginePlugin* WebEngine::GetPlugin() const +{ + return Internal::Adaptor::GetWebEnginePlugin(); +} + NativeImageSourcePtr WebEngine::GetNativeImageSource() { Any source; diff --git a/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp index 30693fc..107582c 100755 --- a/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp @@ -890,7 +890,7 @@ int UtcDaliWebViewGetWebContext(void) ToolkitTestApplication application; Dali::WebEngineContext* context = WebView::GetContext(); - DALI_TEST_CHECK(context != 0); + DALI_TEST_CHECK(context != nullptr); END_TEST; } @@ -1655,6 +1655,12 @@ int UtcDaliWebContextHttpRequestInterceptor(void) Dali::WebEngineContext* context = WebView::GetContext(); DALI_TEST_CHECK(context != 0) + WebView view = WebView::New(); + DALI_TEST_CHECK(view); + + // Check if web view is found or not when plugin is null. + DALI_TEST_CHECK(!WebView::FindWebView(nullptr)); + // load url. context->RegisterRequestInterceptedCallback(&OnRequestIntercepted); DALI_TEST_EQUALS(gRequestInterceptedCallbackCalled, 0, TEST_LOCATION); @@ -1674,6 +1680,11 @@ int UtcDaliWebContextHttpRequestInterceptor(void) DALI_TEST_CHECK(gRequestInterceptorInstance->AddResponseBody((const int8_t*)"test", 4)); DALI_TEST_CHECK(gRequestInterceptorInstance->AddResponse("key:value", (const int8_t*)"test", 4)); DALI_TEST_CHECK(gRequestInterceptorInstance->WriteResponseChunk((const int8_t*)"test", 4)); + + DALI_TEST_CHECK(gRequestInterceptorInstance->GetWebEngine()); + // Check if web view is found or not when plugin is not null. + DALI_TEST_CHECK(WebView::FindWebView(gRequestInterceptorInstance->GetWebEngine())); + std::string testUrl("http://test.html"); DALI_TEST_EQUALS(gRequestInterceptorInstance->GetUrl(), testUrl, TEST_LOCATION); std::string testMethod("GET"); @@ -1681,6 +1692,8 @@ int UtcDaliWebContextHttpRequestInterceptor(void) Dali::Property::Map resultHeaders = gRequestInterceptorInstance->GetHeaders(); DALI_TEST_EQUALS(resultHeaders.Count(), 2, TEST_LOCATION); + // Destroy web view. + view.Reset(); gRequestInterceptorInstance = nullptr; END_TEST; 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 321b43f..ddc0461 100755 --- a/dali-toolkit/devel-api/controls/web-view/web-view.cpp +++ b/dali-toolkit/devel-api/controls/web-view/web-view.cpp @@ -64,6 +64,11 @@ WebView WebView::New(uint32_t argc, char** argv) return Internal::WebView::New(argc, argv); } +Toolkit::WebView WebView::FindWebView(Dali::WebEnginePlugin* plugin) +{ + return Internal::WebView::FindWebView(plugin); +} + Dali::WebEngineContext* WebView::GetContext() { return Internal::WebView::GetContext(); 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 4d90fbd..1fb893f 100755 --- a/dali-toolkit/devel-api/controls/web-view/web-view.h +++ b/dali-toolkit/devel-api/controls/web-view/web-view.h @@ -216,6 +216,11 @@ public: static WebView New(uint32_t argc, char** argv); /** + * @brief Find web view by web engine plugin. + */ + static Toolkit::WebView FindWebView(Dali::WebEnginePlugin* plugin); + + /** * @brief Get context of web engine. */ static Dali::WebEngineContext* GetContext(); diff --git a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp index 5aeeabf..632baaf 100755 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.cpp +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.cpp @@ -95,6 +95,8 @@ DALI_TYPE_REGISTRATION_END() #define GET_ENUM_VALUE(structName, inputExp, outputExp) \ Scripting::GetEnumerationProperty(inputExp, structName##_TABLE, structName##_TABLE_COUNT, outputExp) +std::unordered_map> WebView::mPluginWebViewMap; + WebView::WebView(const std::string& locale, const std::string& timezoneId) : Control(ControlBehaviour(ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS)), mVisual(), @@ -145,6 +147,11 @@ WebView::~WebView() if(mWebEngine) { mWebEngine.FrameRenderedSignal().Disconnect(this, &WebView::OnFrameRendered); + auto iter = mPluginWebViewMap.find(mWebEngine.GetPlugin()); + if (iter != mPluginWebViewMap.end()) + { + mPluginWebViewMap.erase(iter); + } mWebEngine.Destroy(); } } @@ -153,7 +160,10 @@ Toolkit::WebView WebView::New() { WebView* impl = new WebView(); Toolkit::WebView handle = Toolkit::WebView(*impl); - + if (impl->GetPlugin()) + { + mPluginWebViewMap[impl->GetPlugin()] = handle; + } impl->Initialize(); return handle; } @@ -162,7 +172,10 @@ Toolkit::WebView WebView::New(const std::string& locale, const std::string& time { WebView* impl = new WebView(locale, timezoneId); Toolkit::WebView handle = Toolkit::WebView(*impl); - + if (impl->GetPlugin()) + { + mPluginWebViewMap[impl->GetPlugin()] = handle; + } impl->Initialize(); return handle; } @@ -171,11 +184,24 @@ Toolkit::WebView WebView::New(uint32_t argc, char** argv) { WebView* impl = new WebView(argc, argv); Toolkit::WebView handle = Toolkit::WebView(*impl); - + if (impl->GetPlugin()) + { + mPluginWebViewMap[impl->GetPlugin()] = handle; + } impl->Initialize(); return handle; } +Toolkit::WebView WebView::FindWebView(Dali::WebEnginePlugin* plugin) +{ + auto iter = mPluginWebViewMap.find(plugin); + if (iter != mPluginWebViewMap.end()) + { + return iter->second.GetHandle(); + } + return Toolkit::WebView(); +} + Dali::WebEngineContext* WebView::GetContext() { return Dali::WebEngine::GetContext(); @@ -214,6 +240,11 @@ void WebView::OnInitialize() self.SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::FILLER); } +Dali::WebEnginePlugin* WebView::GetPlugin() const +{ + return mWebEngine ? mWebEngine.GetPlugin() : nullptr; +} + DevelControl::ControlAccessible* WebView::CreateAccessibleObject() { return new WebViewAccessible(Self(), mWebEngine); 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 377ea61..6f5e386 100755 --- a/dali-toolkit/internal/controls/web-view/web-view-impl.h +++ b/dali-toolkit/internal/controls/web-view/web-view-impl.h @@ -25,6 +25,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include @@ -73,6 +74,11 @@ public: static Toolkit::WebView New(uint32_t argc, char** argv); /** + * @copydoc Dali::Toolkit::WebView::FindWebView() + */ + static Toolkit::WebView FindWebView(Dali::WebEnginePlugin* plugin); + + /** * @copydoc Dali::Toolkit::WebView::GetContext() */ static Dali::WebEngineContext* GetContext(); @@ -459,6 +465,11 @@ private: WebView& operator=(const WebView& webView); /** + * @brief Gets web engine plugin. + */ + Dali::WebEnginePlugin* GetPlugin() const; + + /** * @brief Set an absolute scroll of the given view. * @param[in] x The coordinate x of scroll * @param[in] y The coordinate y of scroll @@ -709,6 +720,8 @@ private: Dali::Toolkit::WebView::WebViewScreenshotCapturedCallback mScreenshotCapturedCallback; Dali::WebEnginePlugin::WebEngineFrameRenderedCallback mFrameRenderedCallback; + + static std::unordered_map> mPluginWebViewMap; }; } // namespace Internal