+void WebView::RegisterNewWindowCreatedCallback(Dali::WebEnginePlugin::WebEngineNewWindowCreatedCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterNewWindowCreatedCallback(std::move(callback));
+ }
+}
+
+void WebView::RegisterCertificateConfirmedCallback(Dali::WebEnginePlugin::WebEngineCertificateCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterCertificateConfirmedCallback(std::move(callback));
+ }
+}
+
+void WebView::RegisterSslCertificateChangedCallback(Dali::WebEnginePlugin::WebEngineCertificateCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterSslCertificateChangedCallback(std::move(callback));
+ }
+}
+
+void WebView::RegisterHttpAuthHandlerCallback(Dali::WebEnginePlugin::WebEngineHttpAuthHandlerCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterHttpAuthHandlerCallback(std::move(callback));
+ }
+}
+
+void WebView::RegisterContextMenuShownCallback(Dali::WebEnginePlugin::WebEngineContextMenuShownCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterContextMenuShownCallback(std::move(callback));
+ }
+}
+
+void WebView::RegisterContextMenuHiddenCallback(Dali::WebEnginePlugin::WebEngineContextMenuHiddenCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.RegisterContextMenuHiddenCallback(std::move(callback));
+ }
+}
+
+void WebView::GetPlainTextAsynchronously(Dali::WebEnginePlugin::PlainTextReceivedCallback callback)
+{
+ if(mWebEngine)
+ {
+ mWebEngine.GetPlainTextAsynchronously(std::move(callback));
+ }
+}
+
+void WebView::OnFrameRendered()
+{
+ if(mFrameRenderedCallback)
+ {
+ mFrameRenderedCallback();
+ }
+
+ // Make sure that mVisual is created only if required.
+ if(mVisualChangeRequired || !mVisual)
+ {
+ // Reset flag
+ mVisualChangeRequired = false;
+
+ auto nativeImageSourcePtr = mWebEngine.GetNativeImageSource();
+
+ mLastRenderedNativeImageWidth = nativeImageSourcePtr->GetWidth();
+ mLastRenderedNativeImageHeight = nativeImageSourcePtr->GetHeight();
+
+ Dali::Toolkit::ImageUrl nativeImageUrl = Dali::Toolkit::Image::GenerateUrl(nativeImageSourcePtr);
+
+ mVisual = Toolkit::VisualFactory::Get().CreateVisual(
+ {{Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
+ {Toolkit::ImageVisual::Property::URL, nativeImageUrl.GetUrl()},
+ {Toolkit::ImageVisual::Property::PIXEL_AREA, FULL_TEXTURE_RECT},
+ {Toolkit::ImageVisual::Property::WRAP_MODE_U, Dali::WrapMode::CLAMP_TO_EDGE},
+ {Toolkit::ImageVisual::Property::WRAP_MODE_V, Dali::WrapMode::CLAMP_TO_EDGE}});
+
+ if(mVisual)
+ {
+ DevelControl::RegisterVisual(*this, Toolkit::WebView::Property::URL, mVisual);
+ EnableBlendMode(!mVideoHoleEnabled);
+ }
+ }
+}
+
+void WebView::OnDisplayAreaUpdated(Dali::PropertyNotification& /*source*/)
+{
+ if(!mWebEngine)
+ {
+ return;
+ }
+
+ auto displayArea = CalculateDisplayArea(Self(), DisplayAreaCalculateOption::CURRENT_PROPERTY);
+
+ SetDisplayArea(displayArea);
+}
+
+void WebView::OnVisibilityChanged(Actor actor, bool isVisible, Dali::DevelActor::VisibilityChange::Type type)
+{
+ if(type == Dali::DevelActor::VisibilityChange::Type::SELF)
+ {
+ if(isVisible)
+ {
+ mWebViewVisibleState |= WebViewVisibleStateFlag::SELF_SHOW;
+ }
+ else
+ {
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::SELF_SHOW;
+ }
+ }
+ else if(type == Dali::DevelActor::VisibilityChange::Type::PARENT)
+ {
+ if(isVisible)
+ {
+ mWebViewVisibleState |= WebViewVisibleStateFlag::PARENT_SHOW;
+ // TODO : We should consider double-hide called from parent
+ }
+ else
+ {
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::PARENT_SHOW;
+ }
+ }
+ ApplyVisibilityCheck();
+}
+
+void WebView::OnWindowVisibilityChanged(Window window, bool visible)
+{
+ if(visible)
+ {
+ mWebViewVisibleState |= WebViewVisibleStateFlag::WINDOW_SHOW;
+ }
+ else
+ {
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::WINDOW_SHOW;
+ }
+ ApplyVisibilityCheck();
+}
+
+void WebView::OnScreenshotCaptured(Dali::PixelData pixel)
+{
+ if(mScreenshotCapturedCallback)
+ {
+ Dali::Toolkit::ImageView imageView = CreateImageView(pixel);
+ mScreenshotCapturedCallback(imageView);
+ }
+}
+
+void WebView::SetDisplayArea(const Dali::Rect<int32_t>& displayArea)
+{
+ Size displaySize = Size(displayArea.width, displayArea.height);
+ if(mWebViewSize != displaySize)
+ {
+ mWebViewSize = displaySize;
+ }
+
+ if(mWebViewArea != displayArea)
+ {
+ // WebEngine visual size changed. we have to re-create visual.
+ mVisualChangeRequired = true;
+
+ // Change old visual's pixel area matched as changed web view size
+ if(mVisual)
+ {
+ auto pixelArea = CalculatePixelArea(mWebViewSize, mLastRenderedNativeImageWidth, mLastRenderedNativeImageHeight);
+ Toolkit::GetImplementation(mVisual).DoAction(Toolkit::DevelVisual::Action::UPDATE_PROPERTY, {{Toolkit::ImageVisual::Property::PIXEL_AREA, pixelArea}});
+ }
+
+ mWebViewArea = displayArea;
+ mWebEngine.UpdateDisplayArea(mWebViewArea);
+ }
+}
+
+void WebView::OnSceneConnection(int depth)
+{
+ mWebViewVisibleState |= WebViewVisibleStateFlag::SCENE_ON;
+ mWebViewVisibleState |= WebViewVisibleStateFlag::PARENT_SHOW;
+ // TODO : We should consider already hided parent
+ Window window = DevelWindow::Get(Self());
+ if(window)
+ {
+ // Hold the weak handle of the placement window.
+ mPlacementWindow = window;
+ if(window.IsVisible())
+ {
+ mWebViewVisibleState |= WebViewVisibleStateFlag::WINDOW_SHOW;
+ }
+ else