+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
+ {
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::WINDOW_SHOW;
+ }
+ DevelWindow::VisibilityChangedSignal(window).Connect(this, &WebView::OnWindowVisibilityChanged);
+ }
+ ApplyVisibilityCheck();
+ Control::OnSceneConnection(depth);
+ EnableBlendMode(!mVideoHoleEnabled);
+}
+
+void WebView::OnSceneDisconnection()
+{
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::SCENE_ON;
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::WINDOW_SHOW;
+ mWebViewVisibleState &= ~WebViewVisibleStateFlag::PARENT_SHOW;
+ Window window = mPlacementWindow.GetHandle();
+ if(window)
+ {
+ DevelWindow::VisibilityChangedSignal(window).Disconnect(this, &WebView::OnWindowVisibilityChanged);
+ mPlacementWindow.Reset();
+ }
+ ApplyVisibilityCheck();
+ Control::OnSceneDisconnection();
+}
+
+bool WebView::OnTouchEvent(Actor actor, const Dali::TouchEvent& touch)
+{
+ bool result = false;
+
+ if(mWebEngine)
+ {
+ result = mWebEngine.SendTouchEvent(touch);
+ }
+ return result;
+}
+
+bool WebView::OnKeyEvent(const Dali::KeyEvent& event)
+{
+ bool result = false;
+
+ if(mWebEngine)
+ {
+ result = mWebEngine.SendKeyEvent(event);
+ }
+ return result;
+}
+
+bool WebView::OnHoverEvent(Actor actor, const Dali::HoverEvent& hover)
+{
+ bool result = false;
+ if(mWebEngine && mMouseEventsEnabled)
+ {
+ result = mWebEngine.SendHoverEvent(hover);
+ }
+ return result;
+}
+
+bool WebView::OnWheelEvent(Actor actor, const Dali::WheelEvent& wheel)
+{
+ bool result = false;
+ if(mWebEngine && mMouseEventsEnabled)
+ {
+ result = mWebEngine.SendWheelEvent(wheel);
+ }
+ 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.
+}
+
+Vector3 WebView::GetNaturalSize()
+{
+ if(mVisual)
+ {
+ Vector2 rendererNaturalSize;
+ mVisual.GetNaturalSize(rendererNaturalSize);
+ return Vector3(rendererNaturalSize);
+ }
+
+ return Vector3(mWebViewSize);
+}
+
+void WebView::SetProperty(BaseObject* object, Property::Index index, const Property::Value& value)