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;