Add an API for getting web view when request is intercepted. 99/278799/12
authorhuayong.xu <huayong.xu@samsung.com>
Tue, 26 Jul 2022 07:33:32 +0000 (15:33 +0800)
committerhuayong.xu <huayong.xu@samsung.com>
Wed, 3 Aug 2022 07:39:06 +0000 (15:39 +0800)
Change-Id: Id0fef8fc8f2afc606d648728ca54771c46b3692f

automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-web-engine.cpp
automated-tests/src/dali-toolkit/utc-Dali-WebView.cpp
dali-toolkit/devel-api/controls/web-view/web-view.cpp
dali-toolkit/devel-api/controls/web-view/web-view.h
dali-toolkit/internal/controls/web-view/web-view-impl.cpp
dali-toolkit/internal/controls/web-view/web-view-impl.h

index 0e86810..6003749 100755 (executable)
@@ -487,7 +487,6 @@ public:
   }
 };
 
   }
 };
 
-
 class MockWebEngineCertificate : public Dali::WebEngineCertificate
 {
 public:
 class MockWebEngineCertificate : public Dali::WebEngineCertificate
 {
 public:
@@ -629,69 +628,6 @@ private:
   MockWebEngineFrame mockWebFrame;
 };
 
   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:
 class MockWebEngineConsoleMessage : public Dali::WebEngineConsoleMessage
 {
 public:
@@ -1210,6 +1146,186 @@ private:
   std::string mockDefaultTextEncodingName;
 };
 
   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<Dali::WebEngineHitTest> 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<int32_t> viewArea, float scaleFactor) override { return Dali::PixelData(); }
+  bool GetScreenshotAsynchronously(Dali::Rect<int32_t> viewArea, float scaleFactor, ScreenshotCapturedCallback callback) override { return false; }
+  bool CheckVideoPlayingAsynchronously(VideoPlayingCallback callback) override { return false; }
+  void RegisterGeolocationPermissionCallback(GeolocationPermissionCallback callback) override {}
+  void UpdateDisplayArea(Dali::Rect<int32_t> 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:
 class WebEngine: public Dali::BaseObject
 {
 public:
@@ -2063,6 +2179,11 @@ std::string WebEngine::GetUrl() const
   return Internal::Adaptor::GetImplementation( *this ).GetUrl();
 }
 
   return Internal::Adaptor::GetImplementation( *this ).GetUrl();
 }
 
+Dali::WebEnginePlugin* WebEngine::GetPlugin() const
+{
+  return Internal::Adaptor::GetWebEnginePlugin();
+}
+
 NativeImageSourcePtr WebEngine::GetNativeImageSource()
 {
   Any source;
 NativeImageSourcePtr WebEngine::GetNativeImageSource()
 {
   Any source;
index 30693fc..107582c 100755 (executable)
@@ -890,7 +890,7 @@ int UtcDaliWebViewGetWebContext(void)
   ToolkitTestApplication application;
 
   Dali::WebEngineContext* context = WebView::GetContext();
   ToolkitTestApplication application;
 
   Dali::WebEngineContext* context = WebView::GetContext();
-  DALI_TEST_CHECK(context != 0);
+  DALI_TEST_CHECK(context != nullptr);
 
   END_TEST;
 }
 
   END_TEST;
 }
@@ -1655,6 +1655,12 @@ int UtcDaliWebContextHttpRequestInterceptor(void)
   Dali::WebEngineContext* context = WebView::GetContext();
   DALI_TEST_CHECK(context != 0)
 
   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);
   // 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->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");
   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);
 
   Dali::Property::Map resultHeaders = gRequestInterceptorInstance->GetHeaders();
   DALI_TEST_EQUALS(resultHeaders.Count(), 2, TEST_LOCATION);
 
+  // Destroy web view.
+  view.Reset();
   gRequestInterceptorInstance = nullptr;
 
   END_TEST;
   gRequestInterceptorInstance = nullptr;
 
   END_TEST;
index 321b43f..ddc0461 100755 (executable)
@@ -64,6 +64,11 @@ WebView WebView::New(uint32_t argc, char** argv)
   return Internal::WebView::New(argc, 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();
 Dali::WebEngineContext* WebView::GetContext()
 {
   return Internal::WebView::GetContext();
index 4d90fbd..1fb893f 100755 (executable)
@@ -216,6 +216,11 @@ public:
   static WebView New(uint32_t argc, char** argv);
 
   /**
   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();
    * @brief Get context of web engine.
    */
   static Dali::WebEngineContext* GetContext();
index 5aeeabf..632baaf 100755 (executable)
@@ -95,6 +95,8 @@ DALI_TYPE_REGISTRATION_END()
 #define GET_ENUM_VALUE(structName, inputExp, outputExp) \
   Scripting::GetEnumerationProperty<Toolkit::WebView::structName::Type>(inputExp, structName##_TABLE, structName##_TABLE_COUNT, outputExp)
 
 #define GET_ENUM_VALUE(structName, inputExp, outputExp) \
   Scripting::GetEnumerationProperty<Toolkit::WebView::structName::Type>(inputExp, structName##_TABLE, structName##_TABLE_COUNT, outputExp)
 
+std::unordered_map<Dali::WebEnginePlugin*, Dali::WeakHandle<Toolkit::WebView>> WebView::mPluginWebViewMap;
+
 WebView::WebView(const std::string& locale, const std::string& timezoneId)
 : Control(ControlBehaviour(ACTOR_BEHAVIOUR_DEFAULT | DISABLE_STYLE_CHANGE_SIGNALS)),
   mVisual(),
 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);
   if(mWebEngine)
   {
     mWebEngine.FrameRenderedSignal().Disconnect(this, &WebView::OnFrameRendered);
+    auto iter = mPluginWebViewMap.find(mWebEngine.GetPlugin());
+    if (iter != mPluginWebViewMap.end())
+    {
+      mPluginWebViewMap.erase(iter);
+    }
     mWebEngine.Destroy();
   }
 }
     mWebEngine.Destroy();
   }
 }
@@ -153,7 +160,10 @@ Toolkit::WebView WebView::New()
 {
   WebView*         impl   = new WebView();
   Toolkit::WebView handle = Toolkit::WebView(*impl);
 {
   WebView*         impl   = new WebView();
   Toolkit::WebView handle = Toolkit::WebView(*impl);
-
+  if (impl->GetPlugin())
+  {
+    mPluginWebViewMap[impl->GetPlugin()] = handle;
+  }
   impl->Initialize();
   return 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);
 {
   WebView*         impl   = new WebView(locale, timezoneId);
   Toolkit::WebView handle = Toolkit::WebView(*impl);
-
+  if (impl->GetPlugin())
+  {
+    mPluginWebViewMap[impl->GetPlugin()] = handle;
+  }
   impl->Initialize();
   return 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);
 {
   WebView*         impl   = new WebView(argc, argv);
   Toolkit::WebView handle = Toolkit::WebView(*impl);
-
+  if (impl->GetPlugin())
+  {
+    mPluginWebViewMap[impl->GetPlugin()] = handle;
+  }
   impl->Initialize();
   return 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();
 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);
 }
 
   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);
 DevelControl::ControlAccessible* WebView::CreateAccessibleObject()
 {
   return new WebViewAccessible(Self(), mWebEngine);
index 377ea61..6f5e386 100755 (executable)
@@ -25,6 +25,7 @@
 #include <dali/public-api/images/image-operations.h>
 #include <dali/public-api/object/property-notification.h>
 #include <memory>
 #include <dali/public-api/images/image-operations.h>
 #include <dali/public-api/object/property-notification.h>
 #include <memory>
+#include <unordered_map>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/controls/control-accessible.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/devel-api/controls/control-accessible.h>
@@ -73,6 +74,11 @@ public:
   static Toolkit::WebView New(uint32_t argc, char** argv);
 
   /**
   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();
    * @copydoc Dali::Toolkit::WebView::GetContext()
    */
   static Dali::WebEngineContext* GetContext();
@@ -459,6 +465,11 @@ private:
   WebView& operator=(const WebView& webView);
 
   /**
   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
    * @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;
 
   Dali::Toolkit::WebView::WebViewScreenshotCapturedCallback mScreenshotCapturedCallback;
   Dali::WebEnginePlugin::WebEngineFrameRenderedCallback     mFrameRenderedCallback;
+
+  static std::unordered_map<Dali::WebEnginePlugin*, Dali::WeakHandle<Toolkit::WebView>> mPluginWebViewMap;
 };
 
 } // namespace Internal
 };
 
 } // namespace Internal