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-06 08:26:53 +0000 |
commit | 1cf45eed088bd1ef1c89a9812c6f69d16bce56f7 (patch) | |
tree | 7b5db05bf0fa129da07fe06d8b0552b54437c643 /src/core/renderer/web_engine_page_render_frame.cpp | |
parent | 73896925432a720785efd6b83aea785a63836613 (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
Pick-to: 6.2
Change-Id: Ib702bbe813f6061eef446e2d87d7e9e455d715c5
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/renderer/web_engine_page_render_frame.cpp')
-rw-r--r-- | src/core/renderer/web_engine_page_render_frame.cpp | 30 |
1 files changed, 8 insertions, 22 deletions
diff --git a/src/core/renderer/web_engine_page_render_frame.cpp b/src/core/renderer/web_engine_page_render_frame.cpp index 1d5796092..524a8d364 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<int32_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; } } |