summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-04-30 15:20:48 +0200
committerJüri Valdmann <juri.valdmann@qt.io>2021-05-06 19:27:44 +0200
commita5c7b4d4f16574e35ce36550bda2d45baf345c79 (patch)
treef4668442049d871763200accd249740c90a98157
parentf5e1fce9998a3eb1790ddb7c1440b47ab508fdfb (diff)
downloadqtwebengine-a5c7b4d4f16574e35ce36550bda2d45baf345c79.tar.gz
Make script execution order deterministic
Task-number: QTBUG-77765 Change-Id: I8680a46c62e6a915cbf10c3ae48573cb95f612a5 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Jüri Valdmann <juri.valdmann@qt.io>
-rw-r--r--src/core/renderer/user_resource_controller.cpp9
-rw-r--r--src/core/renderer/user_resource_controller.h2
-rw-r--r--tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp49
3 files changed, 55 insertions, 5 deletions
diff --git a/src/core/renderer/user_resource_controller.cpp b/src/core/renderer/user_resource_controller.cpp
index af1f234ac..89730e83f 100644
--- a/src/core/renderer/user_resource_controller.cpp
+++ b/src/core/renderer/user_resource_controller.cpp
@@ -198,8 +198,8 @@ void UserResourceController::runScripts(QtWebEngineCore::UserScriptData::Injecti
return;
const bool isMainFrame = renderFrame->IsMainFrame();
- QList<uint64_t> scriptsToRun = m_frameUserScriptMap.value(globalScriptsIndex).values();
- scriptsToRun.append(m_frameUserScriptMap.value(renderFrame).values());
+ QList<uint64_t> scriptsToRun = m_frameUserScriptMap.value(globalScriptsIndex);
+ scriptsToRun.append(m_frameUserScriptMap.value(renderFrame));
for (uint64_t id : qAsConst(scriptsToRun)) {
const QtWebEngineCore::UserScriptData &script = m_scripts.value(id);
@@ -346,7 +346,8 @@ void UserResourceController::addScriptForFrame(const QtWebEngineCore::UserScript
if (it == m_frameUserScriptMap.end())
it = m_frameUserScriptMap.insert(frame, UserScriptSet());
- (*it).insert(script.scriptId);
+ if (!(*it).contains(script.scriptId))
+ (*it).append(script.scriptId);
m_scripts.insert(script.scriptId, script);
}
@@ -357,7 +358,7 @@ void UserResourceController::removeScriptForFrame(const QtWebEngineCore::UserScr
if (it == m_frameUserScriptMap.end())
return;
- (*it).remove(script.scriptId);
+ (*it).removeOne(script.scriptId);
m_scripts.remove(script.scriptId);
}
diff --git a/src/core/renderer/user_resource_controller.h b/src/core/renderer/user_resource_controller.h
index 6c79d96fc..37e7175a4 100644
--- a/src/core/renderer/user_resource_controller.h
+++ b/src/core/renderer/user_resource_controller.h
@@ -91,7 +91,7 @@ private:
void runScripts(QtWebEngineCore::UserScriptData::InjectionPoint, blink::WebLocalFrame *);
- typedef QSet<uint64_t> UserScriptSet;
+ typedef QList<uint64_t> UserScriptSet;
typedef QHash<const content::RenderFrame *, UserScriptSet> FrameUserScriptMap;
FrameUserScriptMap m_frameUserScriptMap;
QHash<uint64_t, QtWebEngineCore::UserScriptData> m_scripts;
diff --git a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
index a0887275d..c141c0754 100644
--- a/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
+++ b/tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp
@@ -74,6 +74,7 @@ private Q_SLOTS:
void noTransportWithoutWebChannel();
void scriptsInNestedIframes();
void matchQrcUrl();
+ void injectionOrder();
};
void tst_QWebEngineScript::domEditing()
@@ -614,6 +615,54 @@ document.title = 'New title';
QCOMPARE(page.title(), "New title");
}
+// Add many scripts and check order of execution.
+void tst_QWebEngineScript::injectionOrder()
+{
+ QWebEngineProfile profile;
+ class Page : public QWebEnginePage
+ {
+ public:
+ Page(QWebEngineProfile *profile) : QWebEnginePage(profile) {}
+ QVector<QString> log;
+
+ protected:
+ void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel, const QString &message, int,
+ const QString &) override
+ {
+ log.append(message);
+ }
+ } page(&profile);
+ QWebEngineScript::InjectionPoint points[] = {
+ QWebEngineScript::DocumentCreation,
+ QWebEngineScript::DocumentReady,
+ QWebEngineScript::Deferred,
+ };
+ int nPoints = 3;
+ int nCollections = 2;
+ int nScripts = 5;
+
+ QVector<QString> expected;
+ for (int iPoint = 0; iPoint != nPoints; ++iPoint) {
+ for (int iCollection = 0; iCollection != nCollections; ++iCollection) {
+ for (int iScript = 0; iScript != nScripts; ++iScript) {
+ QWebEngineScript script;
+ script.setName(QString("%1%2%3").arg(iPoint).arg(iCollection).arg(iScript));
+ expected.append(script.name());
+ script.setInjectionPoint(points[iPoint]);
+ script.setWorldId(QWebEngineScript::MainWorld);
+ script.setSourceCode(QStringLiteral("console.error('%1');").arg(script.name()));
+ if (iCollection == 0)
+ profile.scripts()->insert(script);
+ else
+ page.scripts().insert(script);
+ }
+ }
+ }
+
+ page.load(QUrl("qrc:/resources/test_iframe_inner.html"));
+ QTRY_COMPARE(page.log, expected);
+}
+
QTEST_MAIN(tst_QWebEngineScript)
#include "tst_qwebenginescript.moc"