summaryrefslogtreecommitdiffstats
path: root/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
diff options
context:
space:
mode:
authorKirill Burtsev <kirill.burtsev@qt.io>2020-05-12 20:18:47 +0200
committerKirill Burtsev <kirill.burtsev@qt.io>2020-05-14 17:16:35 +0000
commit9202da6fac5c9f818ba8c70f3902cc03f6bc1d16 (patch)
tree188ee5da93681ae41c25189cbfd768e5673de055 /tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
parent4242f2e65493349af091c0f588182493090dbed2 (diff)
Allow to set feature permission before first ever navigation
Since PermissionManagerQt functions independent of webcontents initialization, permission installment may be done earlier (right after page base constructor). Practically, this allows to grant/deny permission before first ever navigation to avoid permission feature request from well-behaving web application. Unfortunately, this only applies to Web Notifications: there is a way to check without request: Notification.permission javascript static object. Other supported features lack similar mechanism: they operate through success/failure callbacks, which unconditionally invoke permission requests, and Page/View API doesn't automatically answer with remembered permissions. Task-number: QTBUG-83476 Change-Id: I63a3cbca25498d5026975073e125f2ab4f9ab2ad Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp')
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp66
1 files changed, 42 insertions, 24 deletions
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 3f3534931..515aa4ebb 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -203,11 +203,10 @@ private Q_SLOTS:
void triggerActionWithoutMenu();
void dynamicFrame();
- void notificationRequest_data();
- void notificationRequest();
+ void notificationPermission_data();
+ void notificationPermission();
void sendNotification();
void contentsSize();
- void notificationPermission();
void setLifecycleState();
void setVisible();
@@ -3590,42 +3589,61 @@ public:
}
};
-void tst_QWebEnginePage::notificationRequest_data()
+void tst_QWebEnginePage::notificationPermission_data()
{
+ QTest::addColumn<bool>("setOnInit");
QTest::addColumn<QWebEnginePage::PermissionPolicy>("policy");
QTest::addColumn<QString>("permission");
- QTest::newRow("deny") << QWebEnginePage::PermissionDeniedByUser << "denied";
- QTest::newRow("grant") << QWebEnginePage::PermissionGrantedByUser << "granted";
+ QTest::newRow("denyOnInit") << true << QWebEnginePage::PermissionDeniedByUser << "denied";
+ QTest::newRow("deny") << false << QWebEnginePage::PermissionDeniedByUser << "denied";
+ QTest::newRow("grant") << false << QWebEnginePage::PermissionGrantedByUser << "granted";
+ QTest::newRow("grantOnInit") << true << QWebEnginePage::PermissionGrantedByUser << "granted";
}
-void tst_QWebEnginePage::notificationRequest()
+void tst_QWebEnginePage::notificationPermission()
{
+ QFETCH(bool, setOnInit);
QFETCH(QWebEnginePage::PermissionPolicy, policy);
QFETCH(QString, permission);
- NotificationPage page(policy);
- QVERIFY(page.spyLoad.waitForResult());
+ QWebEngineProfile otr;
+ QWebEnginePage page(&otr, nullptr);
- page.resetPermission();
- QCOMPARE(page.getPermission(), "default");
+ QUrl baseUrl("https://www.example.com/somepage.html");
- page.requestPermission();
- page.spyRequest.waitForResult();
- QVERIFY(page.spyRequest.wasCalled());
+ bool permissionRequested = false, errorState = false;
+ connect(&page, &QWebEnginePage::featurePermissionRequested, &page, [&] (const QUrl &o, QWebEnginePage::Feature f) {
+ if (f != QWebEnginePage::Notifications)
+ return;
+ if (permissionRequested || o != baseUrl.url(QUrl::RemoveFilename)) {
+ qWarning() << "Unexpected case. Can't proceed." << setOnInit << permissionRequested << o;
+ errorState = true;
+ return;
+ }
+ permissionRequested = true;
+ page.setFeaturePermission(o, f, policy);
+ });
- QCOMPARE(page.getPermission(), permission);
-}
+ if (setOnInit)
+ page.setFeaturePermission(baseUrl, QWebEnginePage::Notifications, policy);
-void tst_QWebEnginePage::notificationPermission()
-{
- QWebEngineProfile otr;
- QWebEnginePage page(&otr, nullptr);
QSignalSpy spy(&page, &QWebEnginePage::loadFinished);
- page.setHtml(QString("<html><body>Test</body></html>"), QUrl("https://www.example.com"));
+ page.setHtml(QString("<html><body>Test</body></html>"), baseUrl);
QTRY_COMPARE(spy.count(), 1);
- QCOMPARE(evaluateJavaScriptSync(&page, QStringLiteral("Notification.permission")), QLatin1String("default"));
- page.setFeaturePermission(QUrl("https://www.example.com"), QWebEnginePage::Notifications, QWebEnginePage::PermissionGrantedByUser);
- QTRY_COMPARE(evaluateJavaScriptSync(&page, QStringLiteral("Notification.permission")), QLatin1String("granted"));
+
+ QCOMPARE(evaluateJavaScriptSync(&page, QStringLiteral("Notification.permission")), setOnInit ? permission : QLatin1String("default"));
+
+ if (!setOnInit) {
+ page.setFeaturePermission(baseUrl, QWebEnginePage::Notifications, policy);
+ QTRY_COMPARE(evaluateJavaScriptSync(&page, QStringLiteral("Notification.permission")), permission);
+ }
+
+ auto js = QStringLiteral("var permission; Notification.requestPermission().then(p => { permission = p })");
+ evaluateJavaScriptSync(&page, js);
+ QTRY_COMPARE(evaluateJavaScriptSync(&page, "permission").toString(), permission);
+ // permission is not 'remembered' from api standpoint, hence is not suppressed on explicit call from JS
+ QVERIFY(permissionRequested);
+ QVERIFY(!errorState);
}
void tst_QWebEnginePage::sendNotification()