/**************************************************************************** ** ** Copyright (C) 2021 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 "testwindow.h" #include "quickutil.h" #include #include #include #include #include #include #include class tst_UIDelegates : public QObject { Q_OBJECT public: tst_UIDelegates(); private Q_SLOTS: void init(); void initTestCase(); void cleanup(); void javaScriptDialog(); void javaScriptDialog_data(); void fileDialog(); void contextMenu(); void tooltip(); void colorDialog(); void authenticationDialog_data(); void authenticationDialog(); private: inline QQuickWebEngineView *newWebEngineView(); inline QQuickWebEngineView *webEngineView() const; void runJavaScript(const QString &script); QScopedPointer m_window; QScopedPointer m_component; }; tst_UIDelegates::tst_UIDelegates() { QtWebEngineQuick::initialize(); static QQmlEngine *engine = new QQmlEngine(this); m_component.reset(new QQmlComponent(engine, this)); m_component->setData(QByteArrayLiteral("import QtQuick\n" "import QtWebEngine\n" "WebEngineView {}"), QUrl()); } QQuickWebEngineView *tst_UIDelegates::newWebEngineView() { QObject *viewInstance = m_component->create(); QQuickWebEngineView *webEngineView = qobject_cast(viewInstance); return webEngineView; } void tst_UIDelegates::init() { m_window.reset(new TestWindow(newWebEngineView())); } void tst_UIDelegates::initTestCase() { QNetworkProxy proxy; proxy.setType(QNetworkProxy::HttpProxy); proxy.setHostName("localhost"); proxy.setPort(5555); QNetworkProxy::setApplicationProxy(proxy); } void tst_UIDelegates::cleanup() { m_window.reset(); } inline QQuickWebEngineView *tst_UIDelegates::webEngineView() const { return static_cast(m_window->webEngineView.data()); } void tst_UIDelegates::runJavaScript(const QString &script) { webEngineView()->runJavaScript(script); } void tst_UIDelegates::javaScriptDialog_data() { QTest::addColumn("javaScriptCode"); QTest::addColumn("expectedObjectName"); QTest::newRow("AlertDialog") << QString("alert('This is the Alert Dialog!');") << QString("alertDialog"); QTest::newRow("ConfirmDialog") << QString("confirm('This is the Confirm Dialog.');") << QString("confirmDialog"); QTest::newRow("PromptDialog") << QString("prompt('Is this the Prompt Dialog?', 'Yes');") << QString("promptDialog"); } void tst_UIDelegates::javaScriptDialog() { QFETCH(QString, javaScriptCode); QFETCH(QString, expectedObjectName); m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" ""); QVERIFY(waitForLoadSucceeded(view)); runJavaScript(javaScriptCode); QTRY_VERIFY(view->findChild(expectedObjectName)); } void tst_UIDelegates::fileDialog() { m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" "" ""); QVERIFY(waitForLoadSucceeded(view)); QPoint filePickerCenter = elementCenter(view, QStringLiteral("filePicker")); QTest::mouseClick(view->window(), Qt::LeftButton, {}, filePickerCenter); QTRY_VERIFY(view->findChild(QStringLiteral("fileDialog"))); } void tst_UIDelegates::contextMenu() { m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" ""); QVERIFY(waitForLoadSucceeded(view)); QTest::mouseClick(view->window(), Qt::RightButton); QTRY_VERIFY(view->findChild(QStringLiteral("menu"))); } void tst_UIDelegates::tooltip() { m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" "

Hover this text to display a tooltip

" ""); QVERIFY(waitForLoadSucceeded(view)); QString toolTipStr = QStringLiteral("toolTip"); QPoint tooltipCenter = elementCenter(view, toolTipStr); QPoint windowCenter = QPoint(view->window()->width() / 2, view->window()->height() / 2); QVERIFY(tooltipCenter.x() == windowCenter.x()); int distance = windowCenter.y() - tooltipCenter.y(); for (int i = 3; i > 0; i--) { QTest::mouseMove(view->window(), QPoint(windowCenter.x(), windowCenter.y() - distance / i)); } QTRY_VERIFY(view->findChild(toolTipStr)); } void tst_UIDelegates::colorDialog() { m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" "" ""); QVERIFY(waitForLoadSucceeded(view)); QPoint filePickerCenter = elementCenter(view, QStringLiteral("colorPicker")); QTest::mouseClick(view->window(), Qt::LeftButton, {}, filePickerCenter); QTRY_VERIFY(view->findChild(QStringLiteral("colorDialog"))); } void tst_UIDelegates::authenticationDialog_data() { QTest::addColumn("url"); QTest::addColumn("response"); QTest::newRow("Http Authentication Dialog") << QUrl("http://localhost:5555/") << QByteArrayLiteral("HTTP/1.1 401 Unauthorized\nWWW-Authenticate: " "Basic realm=\"Very Restricted Area\"\r\n\r\n"); QTest::newRow("Proxy Authentication Dialog") << QUrl("http://qt.io/") << QByteArrayLiteral("HTTP/1.1 407 Proxy Auth Required\nProxy-Authenticate: " "Basic realm=\"Proxy requires authentication\"\r\n" "content-length: 0\r\n\r\n"); } void tst_UIDelegates::authenticationDialog() { QFETCH(QUrl, url); QFETCH(QByteArray, response); HttpServer server(QHostAddress::LocalHost, 5555); connect(&server, &HttpServer::newRequest, [url, response](HttpReqRep *rr) { rr->sendResponse(response); }); QVERIFY(server.start()); m_window->show(); QTRY_VERIFY(qApp->focusObject()); QQuickWebEngineView *view = webEngineView(); view->loadHtml("" ""); QVERIFY(waitForLoadSucceeded(view)); view->setUrl(url); QTRY_VERIFY(view->findChild(QStringLiteral("authenticationDialog"))); QVERIFY(server.stop()); } QTEST_MAIN(tst_UIDelegates) #include "tst_uidelegates.moc" #include "moc_quickutil.cpp"