From fba650c3d774c595b6726c7140ff12353f8c0a4c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 18 Sep 2015 15:02:06 +0200 Subject: Make the MIME-type of downloads available An application currently have to rely on suggested filename only to guess the type of a download. This is often insufficient when the suffix is misleading or missing. This patch adds the mimetype to the reported metadata and also adds a mimetype appropriate suffix to suggested filenames. Task-number: QTBUG-48206 Change-Id: I4c70f076d6eb5ae820fd6b7f568515eeb7c18df5 Reviewed-by: Leena Miettinen Reviewed-by: Joerg Bornemann --- src/webenginewidgets/api/qwebenginedownloaditem.cpp | 12 ++++++++++++ src/webenginewidgets/api/qwebenginedownloaditem.h | 1 + src/webenginewidgets/api/qwebenginedownloaditem_p.h | 1 + src/webenginewidgets/api/qwebengineprofile.cpp | 1 + 4 files changed, 15 insertions(+) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebenginedownloaditem.cpp b/src/webenginewidgets/api/qwebenginedownloaditem.cpp index 6c9413280..9fdab3367 100644 --- a/src/webenginewidgets/api/qwebenginedownloaditem.cpp +++ b/src/webenginewidgets/api/qwebenginedownloaditem.cpp @@ -246,6 +246,18 @@ QUrl QWebEngineDownloadItem::url() const return d->downloadUrl; } +/*! + \since 5.6 + + Returns the MIME type of the download. +*/ + +QString QWebEngineDownloadItem::mimeType() const +{ + Q_D(const QWebEngineDownloadItem); + return d->mimeType; +} + /*! Returns the full target path where data is being downloaded to. diff --git a/src/webenginewidgets/api/qwebenginedownloaditem.h b/src/webenginewidgets/api/qwebenginedownloaditem.h index 38b9a4ad8..886d9ab9a 100644 --- a/src/webenginewidgets/api/qwebenginedownloaditem.h +++ b/src/webenginewidgets/api/qwebenginedownloaditem.h @@ -66,6 +66,7 @@ public: qint64 totalBytes() const; qint64 receivedBytes() const; QUrl url() const; + QString mimeType() const; QString path() const; void setPath(QString path); bool isFinished() const; diff --git a/src/webenginewidgets/api/qwebenginedownloaditem_p.h b/src/webenginewidgets/api/qwebenginedownloaditem_p.h index 87dc4114a..2c7bbf985 100644 --- a/src/webenginewidgets/api/qwebenginedownloaditem_p.h +++ b/src/webenginewidgets/api/qwebenginedownloaditem_p.h @@ -70,6 +70,7 @@ public: QWebEngineDownloadItem::DownloadState downloadState; QString downloadPath; const QUrl downloadUrl; + QString mimeType; qint64 totalBytes; qint64 receivedBytes; diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index e1cde4f08..7f63b312f 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -150,6 +150,7 @@ void QWebEngineProfilePrivate::downloadRequested(DownloadItemInfo &info) itemPrivate->downloadId = info.id; itemPrivate->downloadState = QWebEngineDownloadItem::DownloadRequested; itemPrivate->downloadPath = info.path; + itemPrivate->mimeType = info.mimeType; QWebEngineDownloadItem *download = new QWebEngineDownloadItem(itemPrivate, q); -- cgit v1.2.3 From 92261a7883809a2ef17a6ae12b472d3631f303d8 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 11 Dec 2015 12:41:06 +0100 Subject: Move WebEngine initialization to core library This means QtWebEngineWidgets no longer needs to depend on and link to the QML API. Change-Id: If59693bf0ae1fb43dc86c141daf4e09c8cc68c25 Reviewed-by: Joerg Bornemann --- src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp b/src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp index 4feacf748..1ef6386ad 100644 --- a/src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp +++ b/src/webenginewidgets/api/qtwebenginewidgetsglobal.cpp @@ -36,13 +36,17 @@ #include "qtwebenginewidgetsglobal.h" -#include "qtwebengineglobal.h" #include +namespace QtWebEngineCore +{ + extern void initialize(); +} + QT_BEGIN_NAMESPACE static void initialize() { - QtWebEngine::initialize(); + QtWebEngineCore::initialize(); } Q_COREAPP_STARTUP_FUNCTION(initialize) -- cgit v1.2.3 From 659490b7dd2c6092e85a1724a23ebb79f6e081d9 Mon Sep 17 00:00:00 2001 From: Alexandru Croitor Date: Mon, 21 Dec 2015 17:08:57 +0100 Subject: Fix MouseMove event handling when opening a new tab with middle click. When opening a new tab by middle clicking on a link in a web page, two MouseMove events are sent to Chromium consecutively, without getting proper acknowledgment events, which causes further move events not to be handled properly. Fix consists in preventing the second move event from being sent. Change-Id: Ia0a64698476226e472faa53f75b51dfb6ed477c9 Task-number: QTBUG-50031 Reviewed-by: Joerg Bornemann --- src/webenginewidgets/api/qwebenginepage.cpp | 22 ++++++++++++++++++++++ src/webenginewidgets/api/qwebenginepage_p.h | 2 ++ 2 files changed, 24 insertions(+) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index bb8babd7a..61feec244 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -185,6 +185,7 @@ QWebEnginePagePrivate::QWebEnginePagePrivate(QWebEngineProfile *_profile) , view(0) , isLoading(false) , scriptCollection(new QWebEngineScriptCollectionPrivate(browserContextAdapter()->userScriptController(), adapter.data())) + , m_isBeingAdopted(false) { memset(actions, 0, sizeof(actions)); } @@ -298,7 +299,20 @@ void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, W { Q_Q(QWebEnginePage); Q_UNUSED(userGesture); + QWebEnginePage *newPage = q->createWindow(toWindowType(disposition)); + + // Mark the new page as being in the process of being adopted, so that a second mouse move event + // sent by newWebContents->initialize() gets filtered in RenderWidgetHostViewQt::forwardEvent. + // The first mouse move event is being sent by q->createWindow(). This is necessary because + // Chromium does not get a mouse move acknowledgment message between the two events, and + // InputRouterImpl::ProcessMouseAck is not executed, thus all subsequent mouse move events + // get coalesced together, and don't get processed at all. + // The mouse move events are actually sent as a result of show() being called on + // RenderWidgetHostViewQtDelegateWidget, both when creating the window and when initialize is + // called. + newPage->d_func()->m_isBeingAdopted = true; + // Overwrite the new page's WebContents with ours. if (newPage && newPage->d_func() != this) { newPage->d_func()->adapter = newWebContents; @@ -306,6 +320,14 @@ void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, W if (!initialGeometry.isEmpty()) emit newPage->geometryChangeRequested(initialGeometry); } + + // Page has finished the adoption process. + newPage->d_func()->m_isBeingAdopted = false; +} + +bool QWebEnginePagePrivate::isBeingAdopted() +{ + return m_isBeingAdopted; } void QWebEnginePagePrivate::close() diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 0fcd05d3c..55c722f4c 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -136,6 +136,7 @@ public: virtual void focusContainer() Q_DECL_OVERRIDE; virtual void unhandledKeyEvent(QKeyEvent *event) Q_DECL_OVERRIDE; virtual void adoptNewWindow(QtWebEngineCore::WebContentsAdapter *newWebContents, WindowOpenDisposition disposition, bool userGesture, const QRect &initialGeometry) Q_DECL_OVERRIDE; + virtual bool isBeingAdopted() Q_DECL_OVERRIDE; virtual void close() Q_DECL_OVERRIDE; virtual bool contextMenuRequested(const QtWebEngineCore::WebEngineContextMenuData &data) Q_DECL_OVERRIDE; virtual void navigationRequested(int navigationType, const QUrl &url, int &navigationRequestAction, bool isMainFrame) Q_DECL_OVERRIDE; @@ -181,6 +182,7 @@ public: QtWebEngineCore::WebEngineContextMenuData m_menuData; bool isLoading; QWebEngineScriptCollection scriptCollection; + bool m_isBeingAdopted; mutable CallbackDirectory m_callbacks; mutable QAction *actions[QWebEnginePage::WebActionCount]; -- cgit v1.2.3