diff options
4 files changed, 38 insertions, 9 deletions
diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index 50a3924c6..2b8fc714a 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -253,20 +253,22 @@ void UserResourceController::RenderFrameObserverHelper::DidClearWindowObject() void UserResourceController::RenderFrameObserverHelper::DidFinishDocumentLoad() { - DCHECK(m_runner); - base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad), - base::TimeDelta::FromMilliseconds(afterLoadTimeout)); + // Don't run scripts if provisional load failed (DidFailProvisionalLoad + // called instead of DidCommitProvisionalLoad). + if (m_runner) + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad), + base::TimeDelta::FromMilliseconds(afterLoadTimeout)); } void UserResourceController::RenderFrameObserverHelper::DidFinishLoad() { - DCHECK(m_runner); - base::ThreadTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad)); + if (m_runner) + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::AfterLoad)); } void UserResourceController::RenderFrameObserverHelper::FrameDetached() diff --git a/tests/auto/widgets/qwebenginepage/resources/dynamicFrame.html b/tests/auto/widgets/qwebenginepage/resources/dynamicFrame.html new file mode 100644 index 000000000..731387b37 --- /dev/null +++ b/tests/auto/widgets/qwebenginepage/resources/dynamicFrame.html @@ -0,0 +1,16 @@ +<!DOCTYPE html> +<html> + <head> + <title>Dynamic iframe</title> + </head> + <body> + <script> + const ifr = document.createElement("iframe"); + ifr.setAttribute("src", "invalid"); + document.body.appendChild(ifr); + ifr.contentWindow.document.open("text/html", "replace"); + ifr.contentWindow.document.write("foo"); + ifr.contentWindow.document.close(); + </script> + </body> +</html> diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 8b88973e5..599d918b3 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -219,6 +219,7 @@ private Q_SLOTS: void dataURLFragment(); void devTools(); void openLinkInDifferentProfile(); + void dynamicFrame(); private: static QPoint elementCenter(QWebEnginePage *page, const QString &id); @@ -4418,6 +4419,15 @@ void tst_QWebEnginePage::openLinkInDifferentProfile() QVERIFY(spy2.takeFirst().value(0).toBool()); } +void tst_QWebEnginePage::dynamicFrame() +{ + QWebEnginePage page; + QSignalSpy spy(&page, &QWebEnginePage::loadFinished); + page.load(QStringLiteral("qrc:/resources/dynamicFrame.html")); + QVERIFY(spy.wait()); + QCOMPARE(toPlainTextSync(&page).trimmed(), QStringLiteral("foo")); +} + static QByteArrayList params = {QByteArrayLiteral("--use-fake-device-for-media-stream")}; W_QTEST_MAIN(tst_QWebEnginePage, params) diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc index fc83aefa5..0e8381f21 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc @@ -2,6 +2,7 @@ <qresource> <file>resources/basic_printing_page.html</file> <file>resources/content.html</file> + <file>resources/dynamicFrame.html</file> <file>resources/index.html</file> <file>resources/frame_a.html</file> <file>resources/frame_c.html</file> |