diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-04-30 15:20:48 +0200 |
---|---|---|
committer | Jüri Valdmann <juri.valdmann@qt.io> | 2021-05-06 19:27:44 +0200 |
commit | a5c7b4d4f16574e35ce36550bda2d45baf345c79 (patch) | |
tree | f4668442049d871763200accd249740c90a98157 | |
parent | f5e1fce9998a3eb1790ddb7c1440b47ab508fdfb (diff) | |
download | qtwebengine-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.cpp | 9 | ||||
-rw-r--r-- | src/core/renderer/user_resource_controller.h | 2 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginescript/tst_qwebenginescript.cpp | 49 |
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" |