From e9ed235b9f2cd5987ea24575234fb0ce2b58f753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Tue, 13 Aug 2019 14:49:58 +0200 Subject: Use RenderFrameMetadata for scroll position and contents size Needed for using viz display compositor since SubmitCompositorFrame will not be called any more. Also move the loadVisuallyCommitted call to the Compositor's callback. Task-number: QTBUG-71885 Change-Id: I062b3466671cc6af35877f2ff6995ea290cdf9de Reviewed-by: Allan Sandfeld Jensen --- src/core/render_widget_host_view_qt.cpp | 52 +++++++++++++++++++++------------ src/core/render_widget_host_view_qt.h | 7 +++-- src/core/web_contents_delegate_qt.cpp | 8 +---- 3 files changed, 40 insertions(+), 27 deletions(-) (limited to 'src') diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 0242506ee..21e9e9041 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -305,6 +305,8 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost *widget config.tap_slop = ui::GestureConfiguration::GetInstance()->max_touch_move_in_pixels_for_click(); config.enable_longpress_drag_selection = false; m_touchSelectionController.reset(new ui::TouchSelectionController(m_touchSelectionControllerClient.get(), config)); + + host()->render_frame_metadata_provider()->ReportAllFrameSubmissionsForTesting(true); } RenderWidgetHostViewQt::~RenderWidgetHostViewQt() @@ -669,11 +671,6 @@ void RenderWidgetHostViewQt::DidCreateNewRendererCompositorFrameSink(viz::mojom: void RenderWidgetHostViewQt::SubmitCompositorFrame(const viz::LocalSurfaceId &local_surface_id, viz::CompositorFrame frame, base::Optional) { - bool scrollOffsetChanged = (m_lastScrollOffset != frame.metadata.root_scroll_offset); - bool contentsSizeChanged = (m_lastContentsSize != frame.metadata.root_layer_size); - m_lastScrollOffset = frame.metadata.root_scroll_offset; - m_lastContentsSize = frame.metadata.root_layer_size; - // Force to process swap messages uint32_t frame_token = frame.metadata.frame_token; if (frame_token) @@ -681,19 +678,7 @@ void RenderWidgetHostViewQt::SubmitCompositorFrame(const viz::LocalSurfaceId &lo m_compositor->submitFrame( std::move(frame), - base::BindOnce(&RenderWidgetHostViewQtDelegate::update, base::Unretained(m_delegate.get()))); - - if (m_loadVisuallyCommittedState == NotCommitted) { - m_loadVisuallyCommittedState = DidFirstCompositorFrameSwap; - } else if (m_loadVisuallyCommittedState == DidFirstVisuallyNonEmptyPaint) { - m_adapterClient->loadVisuallyCommitted(); - m_loadVisuallyCommittedState = NotCommitted; - } - - if (scrollOffsetChanged) - m_adapterClient->updateScrollPosition(toQt(m_lastScrollOffset)); - if (contentsSizeChanged) - m_adapterClient->updateContentsSize(toQt(m_lastContentsSize)); + base::BindOnce(&RenderWidgetHostViewQt::callUpdate, base::Unretained(this))); } void RenderWidgetHostViewQt::GetScreenInfo(content::ScreenInfo *results) @@ -914,6 +899,28 @@ void RenderWidgetHostViewQt::OnDidUpdateVisualPropertiesComplete(const cc::Rende synchronizeVisualProperties(metadata.local_surface_id_allocation); } +void RenderWidgetHostViewQt::OnDidFirstVisuallyNonEmptyPaint() +{ + if (m_loadVisuallyCommittedState == NotCommitted) { + m_loadVisuallyCommittedState = DidFirstVisuallyNonEmptyPaint; + } else if (m_loadVisuallyCommittedState == DidFirstCompositorFrameSwap) { + m_adapterClient->loadVisuallyCommitted(); + m_loadVisuallyCommittedState = NotCommitted; + } +} + +void RenderWidgetHostViewQt::callUpdate() +{ + m_delegate->update(); + + if (m_loadVisuallyCommittedState == NotCommitted) { + m_loadVisuallyCommittedState = DidFirstCompositorFrameSwap; + } else if (m_loadVisuallyCommittedState == DidFirstVisuallyNonEmptyPaint) { + m_adapterClient->loadVisuallyCommitted(); + m_loadVisuallyCommittedState = NotCommitted; + } +} + QSGNode *RenderWidgetHostViewQt::updatePaintNode(QSGNode *oldNode) { return m_compositor->updatePaintNode(oldNode, m_delegate.get()); @@ -1729,6 +1736,15 @@ void RenderWidgetHostViewQt::OnRenderFrameMetadataChangedAfterActivation() m_selectionEnd = metadata.selection.end; m_touchSelectionControllerClient->UpdateClientSelectionBounds(m_selectionStart, m_selectionEnd); } + + gfx::Vector2dF scrollOffset = metadata.root_scroll_offset.value_or(gfx::Vector2dF()); + gfx::SizeF contentsSize = metadata.root_layer_size; + std::swap(m_lastScrollOffset, scrollOffset); + std::swap(m_lastContentsSize, contentsSize); + if (scrollOffset != m_lastScrollOffset) + m_adapterClient->updateScrollPosition(toQt(m_lastScrollOffset)); + if (contentsSize != m_lastContentsSize) + m_adapterClient->updateContentsSize(toQt(m_lastContentsSize)); } void RenderWidgetHostViewQt::synchronizeVisualProperties(const base::Optional &childSurfaceId) diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 91d5b8610..50a430d84 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -215,8 +215,9 @@ public: // Overridden from content::BrowserAccessibilityDelegate content::BrowserAccessibilityManager* CreateBrowserAccessibilityManager(content::BrowserAccessibilityDelegate* delegate, bool for_root_frame) override; - LoadVisuallyCommittedState getLoadVisuallyCommittedState() const { return m_loadVisuallyCommittedState; } - void setLoadVisuallyCommittedState(LoadVisuallyCommittedState state) { m_loadVisuallyCommittedState = state; } + + // Called from WebContentsDelegateQt + void OnDidFirstVisuallyNonEmptyPaint(); // Overridden from content::RenderFrameMetadataProvider::Observer void OnRenderFrameMetadataChangedAfterActivation() override; @@ -241,6 +242,8 @@ private: void synchronizeVisualProperties(const base::Optional &childSurfaceId); + void callUpdate(); + // Geometry of the view in screen DIPs. gfx::Rect m_viewRectInDips; // Geometry of the window, including frame, in screen DIPs. diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index f18617f8e..f4812f9db 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -623,13 +623,7 @@ void WebContentsDelegateQt::DidFirstVisuallyNonEmptyPaint() if (!rwhv) return; - RenderWidgetHostViewQt::LoadVisuallyCommittedState loadVisuallyCommittedState = rwhv->getLoadVisuallyCommittedState(); - if (loadVisuallyCommittedState == RenderWidgetHostViewQt::NotCommitted) { - rwhv->setLoadVisuallyCommittedState(RenderWidgetHostViewQt::DidFirstVisuallyNonEmptyPaint); - } else if (loadVisuallyCommittedState == RenderWidgetHostViewQt::DidFirstCompositorFrameSwap) { - m_viewClient->loadVisuallyCommitted(); - rwhv->setLoadVisuallyCommittedState(RenderWidgetHostViewQt::NotCommitted); - } + rwhv->OnDidFirstVisuallyNonEmptyPaint(); } void WebContentsDelegateQt::ActivateContents(content::WebContents* contents) -- cgit v1.2.3