summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2021-12-02 08:05:31 +0100
committerMichal Klocek <michal.klocek@qt.io>2021-12-09 21:02:49 +0100
commit5b11835bc84e2a6ee8af62f156525d1ffa3d211f (patch)
tree949f520cd71581ff77be1f2271ff28e3ce142fab
parent8565ed8855fb65dd2db08f7cd901addce2a5ffe2 (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.cpp30
-rw-r--r--src/core/renderer/web_engine_page_render_frame.h6
-rw-r--r--tests/auto/core/certificateerror/BLACKLIST2
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]
-*