summaryrefslogtreecommitdiffstats
path: root/src/webenginewidgets
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-07-29 14:09:05 +0200
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-08-02 12:00:57 +0200
commit1a49f193afe1ba54339182a49d891917159f6719 (patch)
tree986cf277193c625c2f61015c7f29c6b403a5eb02 /src/webenginewidgets
parent47d6b5ce11d1014548ba69df5d7b698381a8343e (diff)
parentfa138d4a76e9e820f01a75771c30dbced8c4e6f3 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
Conflicts: src/3rdparty src/core/resources/resources.gyp src/webengine/doc/src/qtwebengine-overview.qdoc src/webenginewidgets/api/qwebenginepage.cpp src/webenginewidgets/api/qwebenginescriptcollection.cpp src/webenginewidgets/api/qwebenginescriptcollection_p.h tests/auto/widgets/qwebenginepage/BLACKLIST And readded newly in 5.6 enabled tests to the BLACKLIST. Change-Id: I4ab1fc54ebfaaf940df81b0d8d6bdd15cae8b7c4
Diffstat (limited to 'src/webenginewidgets')
-rw-r--r--src/webenginewidgets/api/qwebenginedownloaditem.cpp1
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp41
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h7
-rw-r--r--src/webenginewidgets/api/qwebenginescriptcollection.cpp30
-rw-r--r--src/webenginewidgets/api/qwebenginescriptcollection_p.h9
-rw-r--r--src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc7
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp8
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h1
8 files changed, 67 insertions, 37 deletions
diff --git a/src/webenginewidgets/api/qwebenginedownloaditem.cpp b/src/webenginewidgets/api/qwebenginedownloaditem.cpp
index 3b75480f9..bfb0dd0e8 100644
--- a/src/webenginewidgets/api/qwebenginedownloaditem.cpp
+++ b/src/webenginewidgets/api/qwebenginedownloaditem.cpp
@@ -88,7 +88,6 @@ QWebEngineDownloadItemPrivate::QWebEngineDownloadItemPrivate(QWebEngineProfilePr
QWebEngineDownloadItemPrivate::~QWebEngineDownloadItemPrivate()
{
- profile->downloadDestroyed(downloadId);
}
void QWebEngineDownloadItemPrivate::update(const BrowserContextAdapterClient::DownloadItemInfo &info)
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index db1915b9f..e4b10faa6 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -81,6 +81,7 @@
#include <QMimeData>
#include <QStandardPaths>
#include <QStyle>
+#include <QTimer>
#include <QUrl>
#include <private/qguiapplication_p.h>
@@ -127,13 +128,13 @@ QWebEnginePage::WebAction editorActionForKeyEvent(QKeyEvent* event)
}
QWebEnginePagePrivate::QWebEnginePagePrivate(QWebEngineProfile *_profile)
- : adapter(new WebContentsAdapter)
+ : adapter(QSharedPointer<WebContentsAdapter>::create())
, history(new QWebEngineHistory(new QWebEngineHistoryPrivate(this)))
, profile(_profile ? _profile : QWebEngineProfile::defaultProfile())
, settings(new QWebEngineSettings(profile->settings()))
, view(0)
, isLoading(false)
- , scriptCollection(new QWebEngineScriptCollectionPrivate(browserContextAdapter()->userResourceController(), adapter.data()))
+ , scriptCollection(new QWebEngineScriptCollectionPrivate(browserContextAdapter()->userResourceController(), adapter))
, m_isBeingAdopted(false)
, m_backgroundColor(Qt::white)
, fullscreenMode(false)
@@ -284,7 +285,7 @@ void QWebEnginePagePrivate::unhandledKeyEvent(QKeyEvent *event)
QGuiApplication::sendEvent(view->parentWidget(), event);
}
-void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, WindowOpenDisposition disposition, bool userGesture, const QRect &initialGeometry)
+void QWebEnginePagePrivate::adoptNewWindow(QSharedPointer<WebContentsAdapter> newWebContents, WindowOpenDisposition disposition, bool userGesture, const QRect &initialGeometry)
{
Q_Q(QWebEnginePage);
Q_UNUSED(userGesture);
@@ -293,6 +294,20 @@ void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, W
if (!newPage)
return;
+ if (newPage->d_func() == this) {
+ // If createWindow returns /this/ we must delay the adoption.
+ Q_ASSERT(q == newPage);
+ QTimer::singleShot(0, q, [this, newPage, newWebContents, initialGeometry] () {
+ adoptNewWindowImpl(newPage, newWebContents, initialGeometry);
+ });
+ } else {
+ adoptNewWindowImpl(newPage, newWebContents, initialGeometry);
+ }
+}
+
+void QWebEnginePagePrivate::adoptNewWindowImpl(QWebEnginePage *newPage,
+ const QSharedPointer<WebContentsAdapter> &newWebContents, const QRect &initialGeometry)
+{
// 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
@@ -305,12 +320,11 @@ void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, W
newPage->d_func()->m_isBeingAdopted = true;
// Overwrite the new page's WebContents with ours.
- if (newPage->d_func() != this) {
- newPage->d_func()->adapter = newWebContents;
- newWebContents->initialize(newPage->d_func());
- if (!initialGeometry.isEmpty())
- emit newPage->geometryChangeRequested(initialGeometry);
- }
+ newPage->d_func()->adapter = newWebContents;
+ newWebContents->initialize(newPage->d_func());
+ newPage->d_func()->scriptCollection.d->rebindToContents(newWebContents);
+ if (!initialGeometry.isEmpty())
+ emit newPage->geometryChangeRequested(initialGeometry);
// Page has finished the adoption process.
newPage->d_func()->m_isBeingAdopted = false;
@@ -487,16 +501,13 @@ void QWebEnginePagePrivate::_q_webActionTriggered(bool checked)
void QWebEnginePagePrivate::recreateFromSerializedHistory(QDataStream &input)
{
- QExplicitlySharedDataPointer<WebContentsAdapter> newWebContents = WebContentsAdapter::createFromSerializedNavigationHistory(input, this);
+ QSharedPointer<WebContentsAdapter> newWebContents = WebContentsAdapter::createFromSerializedNavigationHistory(input, this);
if (newWebContents) {
- // Keep the old adapter referenced so the user-scripts are not
- // unregistered immediately.
- QExplicitlySharedDataPointer<WebContentsAdapter> oldWebContents = adapter;
- adapter = newWebContents.data();
+ adapter = std::move(newWebContents);
adapter->initialize(this);
if (webChannel)
adapter->setWebChannel(webChannel, webChannelWorldId);
- scriptCollection.d->rebindToContents(adapter.data());
+ scriptCollection.d->rebindToContents(adapter);
}
}
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index 089dc1cc6..96640a63a 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -100,7 +100,10 @@ public:
virtual void loadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()) Q_DECL_OVERRIDE;
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 void adoptNewWindow(QSharedPointer<QtWebEngineCore::WebContentsAdapter> newWebContents, WindowOpenDisposition disposition, bool userGesture, const QRect &initialGeometry) Q_DECL_OVERRIDE;
+ void adoptNewWindowImpl(QWebEnginePage *newPage,
+ const QSharedPointer<QtWebEngineCore::WebContentsAdapter> &newWebContents,
+ const QRect &initialGeometry);
virtual bool isBeingAdopted() Q_DECL_OVERRIDE;
virtual void close() Q_DECL_OVERRIDE;
virtual void windowCloseRejected() Q_DECL_OVERRIDE;
@@ -155,7 +158,7 @@ public:
void setFullScreenMode(bool);
- QExplicitlySharedDataPointer<QtWebEngineCore::WebContentsAdapter> adapter;
+ QSharedPointer<QtWebEngineCore::WebContentsAdapter> adapter;
QWebEngineHistory *history;
QWebEngineProfile *profile;
QWebEngineSettings *settings;
diff --git a/src/webenginewidgets/api/qwebenginescriptcollection.cpp b/src/webenginewidgets/api/qwebenginescriptcollection.cpp
index a31c26a16..4b77b4699 100644
--- a/src/webenginewidgets/api/qwebenginescriptcollection.cpp
+++ b/src/webenginewidgets/api/qwebenginescriptcollection.cpp
@@ -167,7 +167,7 @@ QList<QWebEngineScript> QWebEngineScriptCollection::toList() const
}
-QWebEngineScriptCollectionPrivate::QWebEngineScriptCollectionPrivate(QtWebEngineCore::UserResourceControllerHost *controller, QtWebEngineCore::WebContentsAdapter *webContents)
+QWebEngineScriptCollectionPrivate::QWebEngineScriptCollectionPrivate(QtWebEngineCore::UserResourceControllerHost *controller, QSharedPointer<QtWebEngineCore::WebContentsAdapter> webContents)
: m_scriptController(controller)
, m_contents(webContents)
{
@@ -175,32 +175,32 @@ QWebEngineScriptCollectionPrivate::QWebEngineScriptCollectionPrivate(QtWebEngine
int QWebEngineScriptCollectionPrivate::count() const
{
- return m_scriptController->registeredScripts(m_contents).count();
+ return m_scriptController->registeredScripts(m_contents.data()).count();
}
bool QWebEngineScriptCollectionPrivate::contains(const QWebEngineScript &s) const
{
- return m_scriptController->containsUserScript(*s.d, m_contents);
+ return m_scriptController->containsUserScript(*s.d, m_contents.data());
}
void QWebEngineScriptCollectionPrivate::insert(const QWebEngineScript &script)
{
if (!script.d)
return;
- m_scriptController->addUserScript(*script.d, m_contents);
+ m_scriptController->addUserScript(*script.d, m_contents.data());
}
bool QWebEngineScriptCollectionPrivate::remove(const QWebEngineScript &script)
{
if (!script.d)
return false;
- return m_scriptController->removeUserScript(*script.d, m_contents);
+ return m_scriptController->removeUserScript(*script.d, m_contents.data());
}
QList<QWebEngineScript> QWebEngineScriptCollectionPrivate::toList(const QString &scriptName) const
{
QList<QWebEngineScript> ret;
- Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents))
+ Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents.data()))
if (scriptName.isNull() || scriptName == script.name())
ret.append(QWebEngineScript(script));
return ret;
@@ -208,7 +208,7 @@ QList<QWebEngineScript> QWebEngineScriptCollectionPrivate::toList(const QString
QWebEngineScript QWebEngineScriptCollectionPrivate::find(const QString &name) const
{
- Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents))
+ Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents.data()))
if (name == script.name())
return QWebEngineScript(script);
return QWebEngineScript();
@@ -216,22 +216,22 @@ QWebEngineScript QWebEngineScriptCollectionPrivate::find(const QString &name) co
void QWebEngineScriptCollectionPrivate::clear()
{
- m_scriptController->clearAllScripts(m_contents);
+ m_scriptController->clearAllScripts(m_contents.data());
}
void QWebEngineScriptCollectionPrivate::reserve(int capacity)
{
- m_scriptController->reserve(m_contents, capacity);
+ m_scriptController->reserve(m_contents.data(), capacity);
}
-void QWebEngineScriptCollectionPrivate::rebindToContents(QtWebEngineCore::WebContentsAdapter *page)
+void QWebEngineScriptCollectionPrivate::rebindToContents(QSharedPointer<QtWebEngineCore::WebContentsAdapter> contents)
{
Q_ASSERT(m_contents);
- Q_ASSERT(page);
- Q_ASSERT(m_contents != page);
+ Q_ASSERT(contents);
+ Q_ASSERT(m_contents != contents);
- Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents)) {
- m_scriptController->addUserScript(script, page);
+ Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents.data())) {
+ m_scriptController->addUserScript(script, contents.data());
}
- m_contents = page;
+ m_contents = contents;
}
diff --git a/src/webenginewidgets/api/qwebenginescriptcollection_p.h b/src/webenginewidgets/api/qwebenginescriptcollection_p.h
index 008453224..fa4b4d790 100644
--- a/src/webenginewidgets/api/qwebenginescriptcollection_p.h
+++ b/src/webenginewidgets/api/qwebenginescriptcollection_p.h
@@ -54,25 +54,26 @@
#include "qtwebenginewidgetsglobal.h"
#include "qwebenginescript.h"
+#include "web_contents_adapter.h"
#include <QtCore/QSet>
+#include <QtCore/QSharedPointer>
namespace QtWebEngineCore {
class UserResourceControllerHost;
-class WebContentsAdapter;
} // namespace
QT_BEGIN_NAMESPACE
class QWebEngineScriptCollectionPrivate {
public:
- QWebEngineScriptCollectionPrivate(QtWebEngineCore::UserResourceControllerHost *, QtWebEngineCore::WebContentsAdapter * = 0);
+ QWebEngineScriptCollectionPrivate(QtWebEngineCore::UserResourceControllerHost *, QSharedPointer<QtWebEngineCore::WebContentsAdapter> = QSharedPointer<QtWebEngineCore::WebContentsAdapter>());
int count() const;
bool contains(const QWebEngineScript &) const;
QList<QWebEngineScript> toList(const QString &scriptName = QString()) const;
QWebEngineScript find(const QString & name) const;
- void rebindToContents(QtWebEngineCore::WebContentsAdapter *contents);
+ void rebindToContents(QSharedPointer<QtWebEngineCore::WebContentsAdapter> contents);
void insert(const QWebEngineScript &);
bool remove(const QWebEngineScript &);
@@ -81,7 +82,7 @@ public:
private:
QtWebEngineCore::UserResourceControllerHost *m_scriptController;
- QtWebEngineCore::WebContentsAdapter *m_contents;
+ QSharedPointer<QtWebEngineCore::WebContentsAdapter> m_contents;
};
QT_END_NAMESPACE
diff --git a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
index f652b1d5f..7bc7ff48d 100644
--- a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
+++ b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
@@ -35,6 +35,13 @@
\l{http://doc.qt.io/archives/qt-5.3/qml-qtwebkit-webview.html}{QWebView API} to use the
\l{Qt WebEngine} QWebEngineView.
+ \section1 Architecture
+
+ Chromium provides its own network and painting engines, which Qt WebEngine uses. This, among
+ other things, allows Qt WebEngine to provide better and more reliable support for the latest
+ HTML5 specification than Qt WebKit. However, Qt WebEngine is thus also heavier than Qt WebKit
+ and does not provide direct access to the network stack and the HTML document through C++ APIs.
+
\section1 Class Names
The Qt WebEngine equivalent of Qt WebKit C++ classes are prefixed by
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index f0385a252..28c40fed5 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -269,6 +269,13 @@ QVariant RenderWidgetHostViewQtDelegateWidget::inputMethodQuery(Qt::InputMethodQ
void RenderWidgetHostViewQtDelegateWidget::resizeEvent(QResizeEvent *resizeEvent)
{
QOpenGLWidget::resizeEvent(resizeEvent);
+
+ const QPoint globalPos = mapToGlobal(pos());
+ if (globalPos != m_lastGlobalPos) {
+ m_lastGlobalPos = globalPos;
+ m_client->windowBoundsChanged();
+ }
+
m_client->notifyResize();
}
@@ -387,6 +394,7 @@ void RenderWidgetHostViewQtDelegateWidget::paintGL()
void RenderWidgetHostViewQtDelegateWidget::onWindowPosChanged()
{
+ m_lastGlobalPos = mapToGlobal(pos());
m_client->windowBoundsChanged();
}
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
index 9fd0cdc48..7307bcd55 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
@@ -104,6 +104,7 @@ private:
QScopedPointer<QSGAbstractRenderer> m_sgRenderer;
bool m_isPopup;
QColor m_clearColor;
+ QPoint m_lastGlobalPos;
QList<QMetaObject::Connection> m_windowConnections;
};