summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/renderer/user_resource_controller.cpp20
-rw-r--r--tests/auto/widgets/qwebenginepage/resources/dynamicFrame.html16
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp10
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc1
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>