summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets
diff options
context:
space:
mode:
authorPierre Rossi <pierre.rossi@digia.com>2013-11-25 15:38:24 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-01-15 18:26:51 +0100
commitc34b72183e85e7c615ca65381d8591cdca23faf2 (patch)
treed5359c75cc8178e1f0e07c56aa52f88daba3fa23 /src/webenginewidgets
parent0b611c393e8208af717bd1c5e6c1aed1379d03ca (diff)
[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')
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp43
-rw-r--r--src/webenginewidgets/api/qwebenginepage.h19
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h2
3 files changed, 51 insertions, 13 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);
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index a613f4a27..4d6a72fc4 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -269,6 +269,11 @@ public:
AutoOwnership
};
+ enum FileSelectionMode {
+ FileSelectOpen,
+ FileSelectOpenMultiple,
+ };
+
class QWEBENGINEWIDGETS_EXPORT ViewportAttributes {
public:
ViewportAttributes();
@@ -375,7 +380,6 @@ public:
bool supportsContentType(const QString& mimeType) const;
enum Extension {
- ChooseMultipleFilesExtension,
ErrorPageExtension
};
class ExtensionOption
@@ -383,17 +387,6 @@ public:
class ExtensionReturn
{};
- class ChooseMultipleFilesExtensionOption : public ExtensionOption {
- public:
- QWebEngineFrame *parentFrame;
- QStringList suggestedFileNames;
- };
-
- class ChooseMultipleFilesExtensionReturn : public ExtensionReturn {
- public:
- QStringList fileNames;
- };
-
enum ErrorDomain { QtNetwork, Http, WebKit };
class ErrorPageExtensionOption : public ExtensionOption {
public:
@@ -558,7 +551,7 @@ protected:
virtual QObject *createPlugin(const QString &classid, const QUrl &url, const QStringList &paramNames, const QStringList &paramValues) { Q_UNUSED(classid); Q_UNUSED(url); Q_UNUSED(paramNames); Q_UNUSED(paramValues); Q_UNREACHABLE(); return 0; }
virtual bool acceptNavigationRequest(QWebEngineFrame *frame, const QNetworkRequest &request, NavigationType type) { Q_UNUSED(frame); Q_UNUSED(request); Q_UNUSED(type); Q_UNREACHABLE(); return false; }
- virtual QString chooseFile(QWebEngineFrame *originatingFrame, const QString& oldFile) { Q_UNUSED(originatingFrame); Q_UNUSED(oldFile); Q_UNREACHABLE(); return QString(); }
+ virtual QStringList chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes);
virtual void javaScriptAlert(QWebEngineFrame *originatingFrame, const QString& msg);
virtual bool javaScriptConfirm(QWebEngineFrame *originatingFrame, const QString& msg);
virtual bool javaScriptPrompt(QWebEngineFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index a8df3ba6a..8901f5ec4 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -46,6 +46,7 @@
#include "web_contents_adapter_client.h"
#include <QtCore/private/qobject_p.h>
+#include <QtCore/qcompilerdetection.h>
#include <QSharedData>
class RenderWidgetHostViewQtDelegate;
@@ -78,6 +79,7 @@ public:
virtual void close() Q_DECL_OVERRIDE;
virtual bool contextMenuRequested(const WebEngineContextMenuData &data) Q_DECL_OVERRIDE;
virtual bool javascriptDialog(JavascriptDialogType type, const QString &message, const QString &defaultValue = QString(), QString *result = 0) Q_DECL_OVERRIDE;
+ virtual void runFileChooser(FileChooserMode, const QString &defaultFileName, const QStringList &acceptedMimeTypes) Q_DECL_OVERRIDE;
void updateAction(QWebEnginePage::WebAction) const;
void updateNavigationActions();