summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp')
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 95a46fbc2..8b36d5a6f 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -128,6 +128,8 @@ private Q_SLOTS:
void getUserMediaRequest();
void getUserMediaRequestDesktopAudio();
void getUserMediaRequestSettingDisabled();
+ void getUserMediaRequestDesktopVideoManyPages();
+ void getUserMediaRequestDesktopVideoManyRequests();
void savePage();
void crashTests_LazyInitializationOfMainFrame();
@@ -2470,6 +2472,44 @@ void tst_QWebEnginePage::getUserMediaRequestSettingDisabled()
QTRY_VERIFY(!page.jsPromiseFulfilled() && page.jsPromiseRejected());
}
+// Try to trigger any possible race condition between the UI thread (permission
+// management) and the audio/device thread (desktop capture initialization).
+void tst_QWebEnginePage::getUserMediaRequestDesktopVideoManyPages()
+{
+ const QString constraints = QStringLiteral("{video: { mandatory: { chromeMediaSource: 'desktop' }}}");
+ const QWebEnginePage::Feature feature = QWebEnginePage::DesktopVideoCapture;
+ std::vector<GetUserMediaTestPage> pages(10);
+ for (GetUserMediaTestPage &page : pages)
+ QTRY_VERIFY_WITH_TIMEOUT(page.loadSucceeded(), 20000);
+ for (GetUserMediaTestPage &page : pages)
+ page.settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled, true);
+ for (GetUserMediaTestPage &page : pages)
+ page.jsGetUserMedia(constraints);
+ for (GetUserMediaTestPage &page : pages)
+ QTRY_VERIFY(page.gotFeatureRequest(feature));
+ for (GetUserMediaTestPage &page : pages)
+ page.acceptPendingRequest();
+ for (GetUserMediaTestPage &page : pages)
+ QTRY_VERIFY(page.jsPromiseFulfilled() || page.jsPromiseRejected());
+}
+
+// Try to trigger any possible race condition between the UI or audio/device
+// threads and the desktop capture thread, where the capture actually happens.
+void tst_QWebEnginePage::getUserMediaRequestDesktopVideoManyRequests()
+{
+ const QString constraints = QStringLiteral("{video: { mandatory: { chromeMediaSource: 'desktop' }}}");
+ const QWebEnginePage::Feature feature = QWebEnginePage::DesktopVideoCapture;
+ GetUserMediaTestPage page;
+ QTRY_VERIFY_WITH_TIMEOUT(page.loadSucceeded(), 20000);
+ page.settings()->setAttribute(QWebEngineSettings::ScreenCaptureEnabled, true);
+ for (int i = 0; i != 100; ++i) {
+ page.jsGetUserMedia(constraints);
+ QTRY_VERIFY(page.gotFeatureRequest(feature));
+ page.acceptPendingRequest();
+ QTRY_VERIFY(page.jsPromiseFulfilled() || page.jsPromiseRejected());
+ }
+}
+
void tst_QWebEnginePage::savePage()
{
QWebEngineView view;
@@ -4078,6 +4118,7 @@ void tst_QWebEnginePage::mouseMovementProperties()
ConsolePage page;
view.setPage(&page);
view.resize(640, 480);
+ QTest::mouseMove(&view, QPoint(10, 10));
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));