diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-05 17:09:46 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-05 17:09:46 +0100 |
commit | 79f5361400fa91b30cc4a1b34335b49284ba3e07 (patch) | |
tree | 3c5f79b230ff4c83b441cba5df7da357bc9c4f2e /src/webenginewidgets/api | |
parent | bc1529f56b8c86259c7f952b0ea9b439f5cc8d53 (diff) | |
parent | 34b714122051eae86ac49fd95c7015fb081f79eb (diff) |
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts:
src/core/render_widget_host_view_qt.cpp
src/core/web_contents_adapter_client.h
src/webenginewidgets/api/qwebenginepage_p.h
Change-Id: Ibd011c40839c09469218ac4c71a13d0a0b1c9778
Diffstat (limited to 'src/webenginewidgets/api')
-rw-r--r-- | src/webenginewidgets/api/qwebengineclientcertificateselection.cpp | 4 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineclientcertificateselection.h | 4 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 97 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.h | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage_p.h | 11 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 102 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 11 |
7 files changed, 142 insertions, 89 deletions
diff --git a/src/webenginewidgets/api/qwebengineclientcertificateselection.cpp b/src/webenginewidgets/api/qwebengineclientcertificateselection.cpp index 8d3c8d223..9eca01bbe 100644 --- a/src/webenginewidgets/api/qwebengineclientcertificateselection.cpp +++ b/src/webenginewidgets/api/qwebengineclientcertificateselection.cpp @@ -39,7 +39,7 @@ #include "qwebengineclientcertificateselection.h" -#if QT_CONFIG(ssl) +#if !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) #include "client_cert_select_controller.h" @@ -124,4 +124,4 @@ QUrl QWebEngineClientCertificateSelection::host() const QT_END_NAMESPACE -#endif // QT_CONFIG(ssl) +#endif // !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) diff --git a/src/webenginewidgets/api/qwebengineclientcertificateselection.h b/src/webenginewidgets/api/qwebengineclientcertificateselection.h index 15b8a47c6..d451d09ae 100644 --- a/src/webenginewidgets/api/qwebengineclientcertificateselection.h +++ b/src/webenginewidgets/api/qwebengineclientcertificateselection.h @@ -43,7 +43,7 @@ #include <QtWebEngineWidgets/qtwebenginewidgetsglobal.h> #include <QtNetwork/qtnetwork-config.h> -#if QT_CONFIG(ssl) +#if !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) #include <QtCore/qscopedpointer.h> #include <QtCore/qvector.h> @@ -75,6 +75,6 @@ private: QT_END_NAMESPACE -#endif // QT_CONFIG(ssl) +#endif // !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) #endif // QWEBENGINECLIENTCERTSELECTION_H diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 1f9b2f72a..6a70203be 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -276,8 +276,6 @@ RenderWidgetHostViewQtDelegate *QWebEnginePagePrivate::CreateRenderWidgetHostVie // The new delegate will not be deleted by the parent view though, because we unset the parent // when the parent is destroyed. The delegate will be destroyed by Chromium when the popup is // dismissed. - // If the delegate is not for a popup, but for a newly created QWebEngineView, the parent is 0 - // just like before. return new RenderWidgetHostViewQtDelegateWidget(client, this->view); } @@ -371,12 +369,6 @@ void QWebEnginePagePrivate::loadStarted(const QUrl &provisionalUrl, bool isError isLoading = true; QTimer::singleShot(0, q, &QWebEnginePage::loadStarted); - updateNavigationActions(); -} - -void QWebEnginePagePrivate::loadCommitted() -{ - updateNavigationActions(); } void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isErrorPage, int errorCode, const QString &errorDescription) @@ -404,7 +396,6 @@ void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, bool isE emit q->loadFinished(success); }); } - updateNavigationActions(); } void QWebEnginePagePrivate::didPrintPageToPdf(const QString &filePath, bool success) @@ -688,6 +679,8 @@ void QWebEnginePagePrivate::recreateFromSerializedHistory(QDataStream &input) adapter = std::move(newWebContents); adapter->setClient(this); adapter->loadDefault(); + if (view && view->isVisible()) + wasShown(); } } @@ -728,12 +721,87 @@ const QObject *QWebEnginePagePrivate::holdingQObject() const return q; } +void QWebEnginePagePrivate::widgetChanged(RenderWidgetHostViewQtDelegate *newWidgetBase) +{ + Q_Q(QWebEnginePage); + bindPageAndWidget(q, static_cast<RenderWidgetHostViewQtDelegateWidget *>(newWidgetBase)); +} + void QWebEnginePagePrivate::ensureInitialized() const { if (!adapter->isInitialized()) adapter->loadDefault(); } +void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView *view) +{ + auto oldView = page ? page->d_func()->view : nullptr; + auto oldPage = view ? view->d_func()->page : nullptr; + + // Change pointers first. + + if (page && oldView != view) { + if (oldView) + oldView->d_func()->page = nullptr; + page->d_func()->view = view; + } + + if (view && oldPage != page) { + if (oldPage) + oldPage->d_func()->view = nullptr; + view->d_func()->page = page; + } + + // Then notify. + + auto widget = page ? page->d_func()->widget : nullptr; + auto oldWidget = oldPage ? oldPage->d_func()->widget : nullptr; + + if (page && oldView != view && oldView) { + oldView->d_func()->pageChanged(page, nullptr); + if (widget) + oldView->d_func()->widgetChanged(widget, nullptr); + } + + if (view && oldPage != page) { + view->d_func()->pageChanged(oldPage, page); + if (oldWidget != widget) + view->d_func()->widgetChanged(oldWidget, widget); + } +} + +void QWebEnginePagePrivate::bindPageAndWidget(QWebEnginePage *page, RenderWidgetHostViewQtDelegateWidget *widget) +{ + auto oldPage = widget ? widget->m_page : nullptr; + auto oldWidget = page ? page->d_func()->widget : nullptr; + + // Change pointers first. + + if (widget && oldPage != page) { + if (oldPage) + oldPage->d_func()->widget = nullptr; + widget->m_page = page; + } + + if (page && oldWidget != widget) { + if (oldWidget) + oldWidget->m_page = nullptr; + page->d_func()->widget = widget; + } + + // Then notify. + + if (widget && oldPage != page && oldPage) { + if (auto oldView = oldPage->d_func()->view) + oldView->d_func()->widgetChanged(widget, nullptr); + } + + if (page && oldWidget != widget) { + if (auto view = page->d_func()->view) + view->d_func()->widgetChanged(oldWidget, widget); + } +} + QWebEnginePage::QWebEnginePage(QObject* parent) : QObject(parent) , d_ptr(new QWebEnginePagePrivate()) @@ -905,7 +973,8 @@ QWebEnginePage::~QWebEnginePage() Q_D(QWebEnginePage); setDevToolsPage(nullptr); d->adapter->stopFinding(); - QWebEngineViewPrivate::removePageFromView(this); + QWebEnginePagePrivate::bindPageAndView(this, nullptr); + QWebEnginePagePrivate::bindPageAndWidget(this, nullptr); } QWebEngineHistory *QWebEnginePage::history() const @@ -1074,9 +1143,9 @@ bool QWebEnginePage::recentlyAudible() const return d->adapter->isInitialized() && d->adapter->recentlyAudible(); } -void QWebEnginePage::setView(QWidget *view) +void QWebEnginePage::setView(QWidget *newViewBase) { - QWebEngineViewPrivate::bind(qobject_cast<QWebEngineView*>(view), this); + QWebEnginePagePrivate::bindPageAndView(this, qobject_cast<QWebEngineView *>(newViewBase)); } QWidget *QWebEnginePage::view() const @@ -1680,7 +1749,7 @@ void QWebEnginePagePrivate::allowCertificateError(const QSharedPointer<Certifica void QWebEnginePagePrivate::selectClientCert(const QSharedPointer<ClientCertSelectController> &controller) { -#if QT_CONFIG(ssl) +#if !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) Q_Q(QWebEnginePage); QWebEngineClientCertificateSelection certSelection(controller); @@ -1690,7 +1759,7 @@ void QWebEnginePagePrivate::selectClientCert(const QSharedPointer<ClientCertSele #endif } -#if QT_CONFIG(ssl) +#if !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) /*! \fn void QWebEnginePage::selectClientCertificate(QWebEngineClientCertificateSelection clientCertificateSelection) \since 5.12 diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h index a6bad4f26..4fd195074 100644 --- a/src/webenginewidgets/api/qwebenginepage.h +++ b/src/webenginewidgets/api/qwebenginepage.h @@ -325,7 +325,7 @@ Q_SIGNALS: void fullScreenRequested(QWebEngineFullScreenRequest fullScreenRequest); void quotaRequested(QWebEngineQuotaRequest quotaRequest); void registerProtocolHandlerRequested(QWebEngineRegisterProtocolHandlerRequest request); -#if QT_CONFIG(ssl) +#if !defined(QT_NO_SSL) || QT_VERSION >= QT_VERSION_CHECK(5, 12, 0) void selectClientCertificate(QWebEngineClientCertificateSelection clientCertSelection); #endif diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h index 6d214adca..7b4e52f79 100644 --- a/src/webenginewidgets/api/qwebenginepage_p.h +++ b/src/webenginewidgets/api/qwebenginepage_p.h @@ -65,6 +65,7 @@ namespace QtWebEngineCore { class RenderWidgetHostViewQtDelegate; +class RenderWidgetHostViewQtDelegateWidget; class WebContentsAdapter; } @@ -100,7 +101,7 @@ public: qreal dpiScale() const override; QColor backgroundColor() const override; void loadStarted(const QUrl &provisionalUrl, bool isErrorPage = false) override; - void loadCommitted() override; + void loadCommitted() override { } void loadVisuallyCommitted() override { } void loadFinished(bool success, const QUrl &url, bool isErrorPage = false, int errorCode = 0, const QString &errorDescription = QString()) override; void focusContainer() override; @@ -141,6 +142,7 @@ public: void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; void updateContentsSize(const QSizeF &size) override; + void updateNavigationActions() override; void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) override; bool supportsDragging() const override; @@ -150,12 +152,12 @@ public: const QObject *holdingQObject() const override; ClientType clientType() override { return QtWebEngineCore::WebContentsAdapterClient::WidgetsClient; } void interceptRequest(QWebEngineUrlRequestInfo &) override; + void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegate *newWidget) override; QtWebEngineCore::ProfileAdapter *profileAdapter() override; QtWebEngineCore::WebContentsAdapter *webContentsAdapter() override; void updateAction(QWebEnginePage::WebAction) const; - void updateNavigationActions(); void _q_webActionTriggered(bool checked); void wasShown(); @@ -167,6 +169,10 @@ public: void setFullScreenMode(bool); void ensureInitialized() const; + static void bindPageAndView(QWebEnginePage *page, QWebEngineView *view); + static void bindPageAndWidget(QWebEnginePage *page, + QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *widget); + QSharedPointer<QtWebEngineCore::WebContentsAdapter> adapter; QWebEngineHistory *history; QWebEngineProfile *profile; @@ -189,6 +195,7 @@ public: qreal defaultZoomFactor; QTimer wasShownTimer; QWebEngineUrlRequestInterceptor *requestInterceptor; + QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *widget = nullptr; mutable QtWebEngineCore::CallbackDirectory m_callbacks; mutable QAction *actions[QWebEnginePage::WebActionCount]; diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index e6f9fcb49..576baad17 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -41,6 +41,7 @@ #include "qwebengineview_p.h" #include "qwebenginepage_p.h" +#include "render_widget_host_view_qt_delegate_widget.h" #include "web_contents_adapter.h" #if QT_CONFIG(action) @@ -55,89 +56,61 @@ QT_BEGIN_NAMESPACE -void QWebEngineViewPrivate::notify(QWebEngineView *view, QWebEnginePage *oldPage, QWebEnginePage *newPage) +void QWebEngineViewPrivate::pageChanged(QWebEnginePage *oldPage, QWebEnginePage *newPage) { - Q_ASSERT(view); + Q_Q(QWebEngineView); + + if (oldPage) { + oldPage->disconnect(q); + } + + if (newPage) { + QObject::connect(newPage, &QWebEnginePage::titleChanged, q, &QWebEngineView::titleChanged); + QObject::connect(newPage, &QWebEnginePage::urlChanged, q, &QWebEngineView::urlChanged); + QObject::connect(newPage, &QWebEnginePage::iconUrlChanged, q, &QWebEngineView::iconUrlChanged); + QObject::connect(newPage, &QWebEnginePage::iconChanged, q, &QWebEngineView::iconChanged); + QObject::connect(newPage, &QWebEnginePage::loadStarted, q, &QWebEngineView::loadStarted); + QObject::connect(newPage, &QWebEnginePage::loadProgress, q, &QWebEngineView::loadProgress); + QObject::connect(newPage, &QWebEnginePage::loadFinished, q, &QWebEngineView::loadFinished); + QObject::connect(newPage, &QWebEnginePage::selectionChanged, q, &QWebEngineView::selectionChanged); + QObject::connect(newPage, &QWebEnginePage::renderProcessTerminated, q, &QWebEngineView::renderProcessTerminated); + } auto oldUrl = oldPage ? oldPage->url() : QUrl(); auto newUrl = newPage ? newPage->url() : QUrl(); if (oldUrl != newUrl) - Q_EMIT view->urlChanged(newUrl); + Q_EMIT q->urlChanged(newUrl); auto oldTitle = oldPage ? oldPage->title() : QString(); auto newTitle = newPage ? newPage->title() : QString(); if (oldTitle != newTitle) - Q_EMIT view->titleChanged(newTitle); + Q_EMIT q->titleChanged(newTitle); auto oldIcon = oldPage ? oldPage->iconUrl() : QUrl(); auto newIcon = newPage ? newPage->iconUrl() : QUrl(); if (oldIcon != newIcon) { - Q_EMIT view->iconUrlChanged(newIcon); - Q_EMIT view->iconChanged(newPage ? newPage->icon() : QIcon()); + Q_EMIT q->iconUrlChanged(newIcon); + Q_EMIT q->iconChanged(newPage ? newPage->icon() : QIcon()); } if ((oldPage && oldPage->hasSelection()) || (newPage && newPage->hasSelection())) - Q_EMIT view->selectionChanged(); -} - -QWebEnginePage* QWebEngineViewPrivate::removeViewFromPage(QWebEngineView *view) -{ - Q_ASSERT(view); - QWebEnginePage *oldPage = view->d_func()->page; - - if (oldPage) { - oldPage->disconnect(view); - oldPage->d_func()->view = nullptr; - if (oldPage->parent() != view) - oldPage->d_func()->adapter->reattachRWHV(); - } - return oldPage; -} - -void QWebEngineViewPrivate::removePageFromView(QWebEnginePage *page) -{ - Q_ASSERT(page); - if (QWebEngineView *oldView = page->d_func()->view) { - page->disconnect(oldView); - page->d_func()->view = nullptr; - oldView->d_func()->page = nullptr; - notify(oldView, page, nullptr); - } + Q_EMIT q->selectionChanged(); } -void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page) +void QWebEngineViewPrivate::widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *oldWidget, + QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *newWidget) { - if (view && page == view->d_func()->page) - return; - - if (page) { - // Un-bind page from its current view. - removePageFromView(page); - page->d_func()->view = view; - page->d_func()->adapter->reattachRWHV(); - } - - if (view) { - // Un-bind view from its current page. - QWebEnginePage *oldPage = removeViewFromPage(view); - - view->d_func()->page = page; - notify(view, oldPage, page); + Q_Q(QWebEngineView); - if (oldPage && oldPage->parent() == view) - delete oldPage; + if (oldWidget) { + q->layout()->removeWidget(oldWidget); + oldWidget->hide(); } - if (view && page) { - QObject::connect(page, &QWebEnginePage::titleChanged, view, &QWebEngineView::titleChanged); - QObject::connect(page, &QWebEnginePage::urlChanged, view, &QWebEngineView::urlChanged); - QObject::connect(page, &QWebEnginePage::iconUrlChanged, view, &QWebEngineView::iconUrlChanged); - QObject::connect(page, &QWebEnginePage::iconChanged, view, &QWebEngineView::iconChanged); - QObject::connect(page, &QWebEnginePage::loadStarted, view, &QWebEngineView::loadStarted); - QObject::connect(page, &QWebEnginePage::loadProgress, view, &QWebEngineView::loadProgress); - QObject::connect(page, &QWebEnginePage::loadFinished, view, &QWebEngineView::loadFinished); - QObject::connect(page, &QWebEnginePage::selectionChanged, view, &QWebEngineView::selectionChanged); - QObject::connect(page, &QWebEnginePage::renderProcessTerminated, view, &QWebEngineView::renderProcessTerminated); + if (newWidget) { + q->layout()->addWidget(newWidget); + q->setFocusProxy(newWidget); + newWidget->show(); } } @@ -193,7 +166,8 @@ QWebEngineView::QWebEngineView(QWidget *parent) QWebEngineView::~QWebEngineView() { - QWebEngineViewPrivate::removeViewFromPage(this); + blockSignals(true); + QWebEnginePagePrivate::bindPageAndView(nullptr, this); } QWebEnginePage* QWebEngineView::page() const @@ -206,9 +180,9 @@ QWebEnginePage* QWebEngineView::page() const return d->page; } -void QWebEngineView::setPage(QWebEnginePage* page) +void QWebEngineView::setPage(QWebEnginePage *newPage) { - QWebEngineViewPrivate::bind(this, page); + QWebEnginePagePrivate::bindPageAndView(newPage, this); } void QWebEngineView::load(const QUrl& url) diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 1845bfb60..28fb883aa 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -55,6 +55,10 @@ #include <QtWidgets/qaccessiblewidget.h> +namespace QtWebEngineCore { +class RenderWidgetHostViewQtDelegateWidget; +} + QT_BEGIN_NAMESPACE class QWebEngineView; @@ -65,10 +69,9 @@ public: Q_DECLARE_PUBLIC(QWebEngineView) QWebEngineView *q_ptr; - static void notify(QWebEngineView *view, QWebEnginePage *oldPage, QWebEnginePage *newPage); - static QWebEnginePage* removeViewFromPage(QWebEngineView *view); - static void removePageFromView(QWebEnginePage *page); - static void bind(QWebEngineView *view, QWebEnginePage *page); + void pageChanged(QWebEnginePage *oldPage, QWebEnginePage *newPage); + void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *oldWidget, + QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *newWidget); QWebEngineViewPrivate(); |