diff options
author | Pierre Rossi <pierre.rossi@digia.com> | 2013-11-25 15:38:24 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-01-15 18:26:51 +0100 |
commit | c34b72183e85e7c615ca65381d8591cdca23faf2 (patch) | |
tree | d5359c75cc8178e1f0e07c56aa52f88daba3fa23 /src/webenginewidgets/api/qwebenginepage.cpp | |
parent | 0b611c393e8208af717bd1c5e6c1aed1379d03ca (diff) | |
download | qtwebengine-c34b72183e85e7c615ca65381d8591cdca23faf2.tar.gz |
[Widgets] wire the file pickers
Introduce a new version of chooseFiles in QWebEnginePage.
The existing API in WebKit1 seemed a bit dusty in any case (multiple
only supported via extensions).
Changes are:
* oldFile becomes oldFiles, so that we could at a later stage expose
the already selected files in the "multiple" case.
* a type is introduced, for now limited to multiple selection, but
over time, we might consider additions such as directory upload.
Change-Id: I14cfea64ce95e892a0a1877c8cb914c5a421409f
Reviewed-by: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Diffstat (limited to 'src/webenginewidgets/api/qwebenginepage.cpp')
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 6214c0f78..3f4287a02 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -33,11 +33,13 @@ #include <QAction> #include <QApplication> #include <QClipboard> +#include <QFileDialog> #include <QIcon> #include <QInputDialog> #include <QLayout> #include <QMenu> #include <QMessageBox> +#include <QStandardPaths> #include <QUrl> QT_BEGIN_NAMESPACE @@ -408,6 +410,19 @@ QMenu *QWebEnginePage::createStandardContextMenu() return menu; } +static inline QWebEnginePage::FileSelectionMode toPublic(WebContentsAdapterClient::FileChooserMode mode) +{ + // Should the underlying values change, we'll need a switch here. + return static_cast<QWebEnginePage::FileSelectionMode>(mode); +} + +void QWebEnginePagePrivate::runFileChooser(WebContentsAdapterClient::FileChooserMode mode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) +{ + Q_Q(QWebEnginePage); + QStringList selectedFileNames = q->chooseFiles(toPublic(mode), (QStringList() << defaultFileName), acceptedMimeTypes); + adapter->filesSelectedInChooser(selectedFileNames, mode); +} + void QWebEnginePage::load(const QUrl& url) { Q_D(QWebEnginePage); @@ -476,6 +491,34 @@ QWebEnginePage *QWebEnginePage::createWindow(WebWindowType type) return 0; } +Q_STATIC_ASSERT_X(static_cast<int>(WebContentsAdapterClient::Open) == static_cast<int>(QWebEnginePage::FileSelectOpen), "Enums out of sync"); +Q_STATIC_ASSERT_X(static_cast<int>(WebContentsAdapterClient::OpenMultiple) == static_cast<int>(QWebEnginePage::FileSelectOpenMultiple), "Enums out of sync"); + +QStringList QWebEnginePage::chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes) +{ + // FIXME: Should we expose this in QWebPage's API ? Right now it is very open and can contain a mix and match of file extensions (which QFileDialog + // can work with) and mimetypes ranging from text/plain or images/* to application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + Q_UNUSED(acceptedMimeTypes); + QStringList ret; + switch (static_cast<WebContentsAdapterClient::FileChooserMode>(mode)) { + case WebContentsAdapterClient::OpenMultiple: + ret = QFileDialog::getOpenFileNames(view(), QString()); + break; + // Chromium extension, not exposed as part of the public API for now. + case WebContentsAdapterClient::UploadFolder: + ret << QFileDialog::getExistingDirectory(view(), tr("Select folder to upload")) + QLatin1Char('/'); + break; + case WebContentsAdapterClient::Save: + ret << QFileDialog::getSaveFileName(view(), QString(), (QStandardPaths::writableLocation(QStandardPaths::DownloadLocation) + oldFiles.first())); + break; + default: + case WebContentsAdapterClient::Open: + ret << QFileDialog::getOpenFileName(view(), QString(), oldFiles.first()); + break; + } + return ret; +} + void QWebEnginePage::javaScriptAlert(QWebEngineFrame *originatingFrame, const QString &msg) { Q_UNUSED(originatingFrame); |