From 1b8aa58a618eee23c4fd23b4fb51667fd8a3f2b8 Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Tue, 16 Nov 2021 16:05:27 +0100 Subject: Fix race condition on layout Calling some methods without 'meaningful' layout when render frame is visible tiggers at the best some DCHECKS. Therefore if frame is visible wait for 'meaningful' layout. This fixes some flaky tests on toPlainTextSync call. Pick-to: 6.2 Change-Id: I746a1c436798b440c59f9b8b4a1d297e3fa7e56d Reviewed-by: Allan Sandfeld Jensen --- src/core/renderer/web_engine_page_render_frame.cpp | 36 +++++++++++++++++++--- src/core/renderer/web_engine_page_render_frame.h | 4 +++ 2 files changed, 35 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/core/renderer/web_engine_page_render_frame.cpp b/src/core/renderer/web_engine_page_render_frame.cpp index e230e7fa3..ad5aa4b93 100644 --- a/src/core/renderer/web_engine_page_render_frame.cpp +++ b/src/core/renderer/web_engine_page_render_frame.cpp @@ -53,7 +53,7 @@ namespace QtWebEngineCore { WebEnginePageRenderFrame::WebEnginePageRenderFrame(content::RenderFrame *render_frame) - : content::RenderFrameObserver(render_frame), m_binding(this) + : content::RenderFrameObserver(render_frame), m_binding(this), m_needsLayout(false) { render_frame->GetAssociatedInterfaceRegistry()->AddInterface( base::BindRepeating(&WebEnginePageRenderFrame::BindReceiver, base::Unretained(this))); @@ -68,16 +68,21 @@ void WebEnginePageRenderFrame::BindReceiver( void WebEnginePageRenderFrame::FetchDocumentMarkup(uint64_t requestId, FetchDocumentMarkupCallback callback) { - blink::WebString markup = blink::WebFrameContentDumper::DumpAsMarkup( - render_frame()->GetWebFrame()) ; + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); + blink::WebString markup; + if (!m_needsLayout) + markup = blink::WebFrameContentDumper::DumpAsMarkup(frame); std::move(callback).Run(requestId, markup.Utf8()); } void WebEnginePageRenderFrame::FetchDocumentInnerText(uint64_t requestId, FetchDocumentInnerTextCallback callback) { - blink::WebString text = blink::WebFrameContentDumper::DumpFrameTreeAsText( - render_frame()->GetWebFrame(), std::numeric_limits::max()); + blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); + blink::WebString text; + if (!m_needsLayout) + text = blink::WebFrameContentDumper::DumpFrameTreeAsText( + frame, std::numeric_limits::max()); std::move(callback).Run(requestId, text.Utf8()); } @@ -91,4 +96,25 @@ void WebEnginePageRenderFrame::OnDestruct() delete this; } +void WebEnginePageRenderFrame::DidMeaningfulLayout(blink::WebMeaningfulLayout layout_type) +{ + switch (layout_type) { + case blink::WebMeaningfulLayout::kFinishedParsing: + case blink::WebMeaningfulLayout::kFinishedLoading: + m_needsLayout = false; + break; + default: + break; + } +} + +void WebEnginePageRenderFrame::WasShown() +{ + m_needsLayout = true; +} + +void WebEnginePageRenderFrame::WasHidden() +{ + m_needsLayout = false; +} } diff --git a/src/core/renderer/web_engine_page_render_frame.h b/src/core/renderer/web_engine_page_render_frame.h index 3fb4657c5..f2ae8fd25 100644 --- a/src/core/renderer/web_engine_page_render_frame.h +++ b/src/core/renderer/web_engine_page_render_frame.h @@ -63,12 +63,16 @@ private: FetchDocumentInnerTextCallback callback) override; void SetBackgroundColor(uint32_t color) override; void OnDestruct() override; + void DidMeaningfulLayout(blink::WebMeaningfulLayout layout_type) override; + void WasShown() override; + void WasHidden() override; void BindReceiver(mojo::PendingAssociatedReceiver receiver); private: mojo::AssociatedReceiver m_binding; + bool m_needsLayout; }; } // namespace -- cgit v1.2.3