summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/api/qwebenginepage.cpp1
-rw-r--r--src/core/api/qwebenginepage.h1
-rw-r--r--src/webenginewidgets/api/qwebengineview.cpp1
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc2
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp81
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;