/**************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWebEngine module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ #include #include #include #include #include class tst_Schemes : public QObject { Q_OBJECT private Q_SLOTS: void unknownUrlSchemePolicy(); }; class AcceptNavigationRequestHandler : public QWebEnginePage { public: AcceptNavigationRequestHandler(QObject* parent = nullptr) : QWebEnginePage(parent) { } int acceptNavigationRequestCalls = 0; bool acceptNavigationRequest(const QUrl &/*url*/, NavigationType type, bool /*isMainFrame*/) override { if (type == QWebEnginePage::NavigationTypeTyped) return true; this->acceptNavigationRequestCalls++; return false; } }; void tst_Schemes::unknownUrlSchemePolicy() { QWebEngineView view; AcceptNavigationRequestHandler page; QSignalSpy loadFinishedSpy(&page, &QWebEnginePage::loadFinished); view.setPage(&page); view.resize(400, 40); view.show(); QVERIFY(QTest::qWaitForWindowExposed(&view)); QWebEngineSettings *settings = view.page()->profile()->settings(); settings->setAttribute(QWebEngineSettings::ErrorPageEnabled, true); settings->setAttribute(QWebEngineSettings::FocusOnNavigationEnabled, true); QWebEngineSettings::UnknownUrlSchemePolicy policies[6] = {QWebEngineSettings::DisallowUnknownUrlSchemes, QWebEngineSettings::DisallowUnknownUrlSchemes, QWebEngineSettings::AllowUnknownUrlSchemesFromUserInteraction, QWebEngineSettings::AllowUnknownUrlSchemesFromUserInteraction, QWebEngineSettings::AllowAllUnknownUrlSchemes, QWebEngineSettings::AllowAllUnknownUrlSchemes}; // even iterations are for navigation-requests from javascript, // odd iterations are for navigations-requests from user-interaction for (int i = 0; i < 8; i++) { if (i <= 5) settings->setUnknownUrlSchemePolicy(policies[i]); else settings->resetUnknownUrlSchemePolicy(); loadFinishedSpy.clear(); page.acceptNavigationRequestCalls = 0; bool shouldAccept; if (i % 2 == 0) { // navigation request coming from javascript shouldAccept = (4 <= i && i <= 5); // only case AllowAllUnknownUrlSchemes view.setHtml("testing..."); } else { // navigation request coming from user interaction shouldAccept = (2 <= i); // all cases except DisallowUnknownUrlSchemes view.setHtml("nonexistentscheme://somewhere"); QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.size(), 1, 15000); // focus and trigger the link view.page()->runJavaScript("document.getElementById('nonexlink').focus();", [&view](const QVariant &result) { Q_UNUSED(result); QTest::sendKeyEvent(QTest::Press, view.focusProxy(), Qt::Key_Return, QString("\r"), Qt::NoModifier); QTest::sendKeyEvent(QTest::Release, view.focusProxy(), Qt::Key_Return, QString("\r"), Qt::NoModifier); }); } QTRY_COMPARE_WITH_TIMEOUT(loadFinishedSpy.size(), 2, 60000); QCOMPARE(page.acceptNavigationRequestCalls, shouldAccept ? 1 : 0); } } QTEST_MAIN(tst_Schemes) #include "tst_schemes.moc"