diff options
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 1 | ||||
-rw-r--r-- | src/core/api/qwebenginepage.h | 1 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 1 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc | 2 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp | 81 |
5 files changed, 85 insertions, 1 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index afb2eedda..e96763f5d 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -2130,6 +2130,7 @@ void QWebEnginePage::setDevToolsPage(QWebEnginePage *devToolsPage) ASSERT_ENUMS_MATCH(FilePickerController::Open, QWebEnginePage::FileSelectOpen) ASSERT_ENUMS_MATCH(FilePickerController::OpenMultiple, QWebEnginePage::FileSelectOpenMultiple) +ASSERT_ENUMS_MATCH(FilePickerController::UploadFolder, QWebEnginePage::FileSelectUploadFolder) // TODO: remove virtuals QStringList QWebEnginePage::chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes) diff --git a/src/core/api/qwebenginepage.h b/src/core/api/qwebenginepage.h index 9ccf8c917..d1838e51c 100644 --- a/src/core/api/qwebenginepage.h +++ b/src/core/api/qwebenginepage.h @@ -206,6 +206,7 @@ public: enum FileSelectionMode { FileSelectOpen, FileSelectOpenMultiple, + FileSelectUploadFolder, }; Q_ENUM(FileSelectionMode) diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index 1d099aa30..96f1bd650 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -207,7 +207,6 @@ QStringList QWebEngineViewPrivate::chooseFiles(QWebEnginePage::FileSelectionMode filter.join(QStringLiteral(";;")), nullptr, QFileDialog::HideNameFilterDetails); break; - // Chromium extension, not exposed as part of the public API for now. case QtWebEngineCore::FilePickerController::UploadFolder: str = QFileDialog::getExistingDirectory(q, QObject::tr("Select folder to upload")); if (!str.isNull()) diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc index 9c9f40f74..56a352979 100644 --- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc @@ -250,6 +250,8 @@ Return only one file name. \value FileSelectOpenMultiple Return multiple file names. + \value FileSelectUploadFolder + Allows users to specify a single existing folder for upload. \sa chooseFiles() */ diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index fecda7c47..c376cbbb3 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -236,6 +236,9 @@ private Q_SLOTS: void isSafeRedirect_data(); void isSafeRedirect(); + void testChooseFilesParameters_data(); + void testChooseFilesParameters(); + private: static QPoint elementCenter(QWebEnginePage *page, const QString &id); static bool isFalseJavaScriptResult(QWebEnginePage *page, const QString &javaScript); @@ -4645,6 +4648,84 @@ void tst_QWebEnginePage::renderProcessPid() QCOMPARE(m_page->renderProcessPid(), 0); } +class FileSelectionTestPage : public QWebEnginePage { +public: + FileSelectionTestPage() + { } + + QStringList chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes) override + { + Q_UNUSED(oldFiles); + chosenFileSelectionMode = mode; + chosenAcceptedMimeTypes = acceptedMimeTypes; + return QStringList(); + } + + int chosenFileSelectionMode = -1; + QStringList chosenAcceptedMimeTypes; +}; + +void tst_QWebEnginePage::testChooseFilesParameters_data() +{ + QTest::addColumn<QString>("uploadAttribute"); + QTest::addColumn<QString>("mimeTypeAttribute"); + QTest::addColumn<QWebEnginePage::FileSelectionMode>("expectedFileSelectionMode"); + QTest::addColumn<QStringList>("expectedMimeType"); + QStringList mimeTypes; + + QTest::addRow("Single file upload") << QString() << QString() + << QWebEnginePage::FileSelectOpen << QStringList(); + QTest::addRow("Multiple file upload") << QString("multiple") << QString() + << QWebEnginePage::FileSelectOpenMultiple << QStringList(); + QTest::addRow("Folder upload") << QString("multiple webkitdirectory") << QString() + << QWebEnginePage::FileSelectUploadFolder << QStringList(); + mimeTypes = QStringList() << "audio/*"; + QTest::addRow("MIME type: audio") << QString() << QString("accept='%1'").arg(mimeTypes.join(',')) + << QWebEnginePage::FileSelectOpen << mimeTypes; + mimeTypes = QStringList() << "video/*"; + QTest::addRow("MIME type: video") << QString() << QString("accept='%1'").arg(mimeTypes.join(',')) + << QWebEnginePage::FileSelectOpen << mimeTypes; + mimeTypes = QStringList() << "image/*"; + QTest::addRow("MIME type: image") << QString() << QString("accept='%1'").arg(mimeTypes.join(',')) + << QWebEnginePage::FileSelectOpen << mimeTypes; + mimeTypes = QStringList() << ".txt" << ".html"; + QTest::addRow("MIME type: custom") << QString() << QString("accept='%1'").arg(mimeTypes.join(',')) + << QWebEnginePage::FileSelectOpen << mimeTypes; + mimeTypes = QStringList() << "audio/*" << "video/*" << "image/*" << ".txt" << ".html"; + QTest::addRow("Multiple MIME types") << QString() << QString("accept='%1'").arg(mimeTypes.join(',')) + << QWebEnginePage::FileSelectOpen << mimeTypes; +} + +void tst_QWebEnginePage::testChooseFilesParameters() +{ + QFETCH(QString, uploadAttribute); + QFETCH(QString, mimeTypeAttribute); + QFETCH(QWebEnginePage::FileSelectionMode, expectedFileSelectionMode); + QFETCH(QStringList, expectedMimeType); + + FileSelectionTestPage page; + QSignalSpy spyFinished(&page, &QWebEnginePage::loadFinished); + + QWebEngineView view; + view.resize(500, 500); + view.setPage(&page); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + page.setHtml(QString("<html><body>" + "<input id='filePicker' type='file' name='filePicker' %1 %2 />" + "</body></html>").arg(uploadAttribute, mimeTypeAttribute)); + QVERIFY(spyFinished.wait()); + QTRY_COMPARE(spyFinished.count(), 1); + + evaluateJavaScriptSync(view.page(), "document.getElementById('filePicker').focus()"); + QTRY_COMPARE(evaluateJavaScriptSync(view.page(), "document.activeElement.id").toString(), QStringLiteral("filePicker")); + QTest::keyClick(view.focusProxy(), Qt::Key_Enter); + + QTRY_COMPARE(page.chosenFileSelectionMode, expectedFileSelectionMode); + QTRY_COMPARE(page.chosenAcceptedMimeTypes, expectedMimeType); +} + void tst_QWebEnginePage::backgroundColor() { QWebEngineProfile profile; |