diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp index 920fda72e2cdecf564ec84f600b9805a19830641..9c03cd651978285d8d44be0dba237c548eb61b96 100644 --- a/src/core/renderer/user_resource_controller.cpp +++ b/src/core/renderer/user_resource_controller.cpp @@ -138,7 +138,6 @@ public: private: // RenderFrameObserver implementation. void DidCommitProvisionalLoad(bool is_new_navigation, bool is_same_document_navigation) override; - void DidClearWindowObject() override; void DidFinishDocumentLoad() override; void DidFinishLoad() override; void FrameDetached() override; @@ -241,14 +240,10 @@ void UserResourceController::RenderFrameObserverHelper::DidCommitProvisionalLoad // that the WebChannelTransportHost is ready to receive messages. m_runner.reset(new Runner(render_frame()->GetWebFrame())); -} -void UserResourceController::RenderFrameObserverHelper::DidClearWindowObject() -{ - // This is called both before and after DidCommitProvisionalLoad, non-null - // m_runner means it's after. - if (m_runner) - m_runner->run(UserScriptData::DocumentElementCreation); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::BindOnce(&Runner::run, m_runner->AsWeakPtr(), UserScriptData::DocumentElementCreation)); } void UserResourceController::RenderFrameObserverHelper::DidFinishDocumentLoad() diff --git a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp index 0fe0ec6cf836babce5767bba276db40b17a90834..be9e59b8cc79c931846a451053baee4e0a71c603 100644 --- a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp +++ b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp @@ -23,6 +23,7 @@ #include <qwebengineprofile.h> #include <qwebenginescript.h> #include <qwebenginescriptcollection.h> +#include <qwebenginesettings.h> #include <qwebengineview.h> #include "../util.h" #if QT_CONFIG(webengine_webchannel) @@ -37,6 +38,8 @@ private Q_SLOTS: void loadEvents(); void scriptWorld_data(); void scriptWorld(); + void scriptDisabled(); + void viewSource(); void scriptModifications(); #if QT_CONFIG(webengine_webchannel) void webChannel_data(); @@ -218,6 +221,50 @@ void tst_QWebEngineScript::scriptWorld() QCOMPARE(evaluateJavaScriptSyncInWorld(&page, "typeof(userScriptTest) != \"undefined\" && userScriptTest == 1;", worldId), QVariant::fromValue(true)); } +// Based on QTBUG-74304 +void tst_QWebEngineScript::scriptDisabled() +{ + QWebEnginePage page; + page.settings()->setAttribute(QWebEngineSettings::JavascriptEnabled, false); + QWebEngineScript script; + script.setInjectionPoint(QWebEngineScript::DocumentCreation); + script.setWorldId(QWebEngineScript::MainWorld); + script.setSourceCode("var foo = 42"); + page.scripts().insert(script); + page.load(QUrl("about:blank")); + QSignalSpy spy(&page, &QWebEnginePage::loadFinished); + QTRY_COMPARE(spy.count(), 1); + QCOMPARE(spy.takeFirst().value(0).toBool(), true); + // MainWorld scripts are disabled by the setting... + QCOMPARE(evaluateJavaScriptSyncInWorld(&page, "foo", QWebEngineScript::MainWorld), QVariant()); + QCOMPARE(evaluateJavaScriptSyncInWorld(&page, "foo", QWebEngineScript::ApplicationWorld), QVariant()); + script.setWorldId(QWebEngineScript::ApplicationWorld); + page.scripts().clear(); + page.scripts().insert(script); + page.load(QUrl("about:blank")); + QTRY_COMPARE(spy.count(), 1); + QCOMPARE(spy.takeFirst().value(0).toBool(), true); + // ...but ApplicationWorld scripts should still work + QCOMPARE(evaluateJavaScriptSyncInWorld(&page, "foo", QWebEngineScript::MainWorld), QVariant()); + QCOMPARE(evaluateJavaScriptSyncInWorld(&page, "foo", QWebEngineScript::ApplicationWorld), QVariant(42)); +} + +// Based on QTBUG-66011 +void tst_QWebEngineScript::viewSource() +{ + QWebEnginePage page; + QWebEngineScript script; + script.setInjectionPoint(QWebEngineScript::DocumentCreation); + script.setWorldId(QWebEngineScript::MainWorld); + script.setSourceCode("var foo = 42"); + page.scripts().insert(script); + page.load(QUrl("view-source:about:blank")); + QSignalSpy spy(&page, &QWebEnginePage::loadFinished); + QTRY_COMPARE(spy.count(), 1); + QCOMPARE(spy.takeFirst().value(0).toBool(), true); + QCOMPARE(evaluateJavaScriptSync(&page, "foo"), QVariant(42)); +} + void tst_QWebEngineScript::scriptModifications() { QWebEnginePage page;