diff options
author | Michal Klocek <michal.klocek@qt.io> | 2021-12-02 08:05:31 +0100 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2021-12-09 21:02:49 +0100 |
commit | 5b11835bc84e2a6ee8af62f156525d1ffa3d211f (patch) | |
tree | 949f520cd71581ff77be1f2271ff28e3ce142fab | |
parent | 8565ed8855fb65dd2db08f7cd901addce2a5ffe2 (diff) |
Fix race condition on layout (take2)
Even if layout is 'meaningful' it can still require update before
toPlainTextSync call can proceed.
Simply wait for frame being loaded in stead of tracking layout
update.
Depending on DidLoadFinish will brake default toHtml call for empty
not loaded page, therefore return expected value if there is no load.
This fixes crashes/asserts on certificateError (stacktrace in bug report).
Remove blacklist on certificateError as bad certificate is back on line
and toPlainTextSync works without issues.
Fixes: QTBUG-97414
Change-Id: Ib702bbe813f6061eef446e2d87d7e9e455d715c5
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit 1cf45eed088bd1ef1c89a9812c6f69d16bce56f7)
-rw-r--r-- | src/core/renderer/web_engine_page_render_frame.cpp | 30 | ||||
-rw-r--r-- | src/core/renderer/web_engine_page_render_frame.h | 6 | ||||
-rw-r--r-- | tests/auto/core/certificateerror/BLACKLIST | 2 |
3 files changed, 10 insertions, 28 deletions
diff --git a/src/core/renderer/web_engine_page_render_frame.cpp b/src/core/renderer/web_engine_page_render_frame.cpp index ad5aa4b93..1f7e306db 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), m_needsLayout(false) + : content::RenderFrameObserver(render_frame), m_binding(this), m_ready(false) { render_frame->GetAssociatedInterfaceRegistry()->AddInterface( base::BindRepeating(&WebEnginePageRenderFrame::BindReceiver, base::Unretained(this))); @@ -70,8 +70,10 @@ void WebEnginePageRenderFrame::FetchDocumentMarkup(uint64_t requestId, { blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); blink::WebString markup; - if (!m_needsLayout) + if (m_ready) markup = blink::WebFrameContentDumper::DumpAsMarkup(frame); + else + markup = blink::WebString::FromUTF8("<html><head></head><body></body></html>"); std::move(callback).Run(requestId, markup.Utf8()); } @@ -80,9 +82,10 @@ void WebEnginePageRenderFrame::FetchDocumentInnerText(uint64_t requestId, { blink::WebLocalFrame *frame = render_frame()->GetWebFrame(); blink::WebString text; - if (!m_needsLayout) + if (m_ready) { text = blink::WebFrameContentDumper::DumpFrameTreeAsText( frame, std::numeric_limits<std::size_t>::max()); + } std::move(callback).Run(requestId, text.Utf8()); } @@ -96,25 +99,8 @@ 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() +void WebEnginePageRenderFrame::DidFinishLoad() { - m_needsLayout = false; + m_ready = true; } } diff --git a/src/core/renderer/web_engine_page_render_frame.h b/src/core/renderer/web_engine_page_render_frame.h index f2ae8fd25..b91c5cb52 100644 --- a/src/core/renderer/web_engine_page_render_frame.h +++ b/src/core/renderer/web_engine_page_render_frame.h @@ -63,16 +63,14 @@ 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 DidFinishLoad() override; void BindReceiver(mojo::PendingAssociatedReceiver<qtwebenginepage::mojom::WebEnginePageRenderFrame> receiver); private: mojo::AssociatedReceiver<qtwebenginepage::mojom::WebEnginePageRenderFrame> m_binding; - bool m_needsLayout; + bool m_ready; }; } // namespace diff --git a/tests/auto/core/certificateerror/BLACKLIST b/tests/auto/core/certificateerror/BLACKLIST deleted file mode 100644 index a8fd16bf3..000000000 --- a/tests/auto/core/certificateerror/BLACKLIST +++ /dev/null @@ -1,2 +0,0 @@ -[fatalError] -* |