From c4cded3fd5ba64b2544a6f0c5307c661c55fddb3 Mon Sep 17 00:00:00 2001 From: Michal Klocek Date: Thu, 2 Aug 2018 20:48:28 +0200 Subject: Do not force default profile on WebEngineView Do lazy initialization for WebEngineProfile on WebEngineView. Fix unnecessary creation on default profile on destruction. Task-number: QTBUG-66068 Change-Id: I9a5889387ac64f0dc718a9e105c8d498aed47a43 Reviewed-by: Allan Sandfeld Jensen --- src/webengine/api/qquickwebengineprofile.cpp | 4 +- src/webengine/api/qquickwebengineview.cpp | 70 ++++++++++++++++++++-------- src/webengine/api/qquickwebengineview_p.h | 4 +- src/webengine/api/qquickwebengineview_p_p.h | 5 +- 4 files changed, 58 insertions(+), 25 deletions(-) (limited to 'src/webengine/api') diff --git a/src/webengine/api/qquickwebengineprofile.cpp b/src/webengine/api/qquickwebengineprofile.cpp index da84af8d0..02e15454b 100644 --- a/src/webengine/api/qquickwebengineprofile.cpp +++ b/src/webengine/api/qquickwebengineprofile.cpp @@ -173,7 +173,7 @@ QQuickWebEngineProfilePrivate::~QQuickWebEngineProfilePrivate() m_ongoingDownloads.clear(); - if (q_ptr != QQuickWebEngineProfile::defaultProfile()) + if (m_profileAdapter != QtWebEngineCore::ProfileAdapter::defaultProfileAdapter()) delete m_profileAdapter; } @@ -341,8 +341,6 @@ QQuickWebEngineProfile::QQuickWebEngineProfile(QObject *parent) : QObject(parent), d_ptr(new QQuickWebEngineProfilePrivate(new QtWebEngineCore::ProfileAdapter())) { - // Sets up the global WebEngineContext - QQuickWebEngineProfile::defaultProfile(); d_ptr->q_ptr = this; } diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index f0c071161..418035d0b 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -108,10 +108,8 @@ static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *obje #endif // QT_NO_ACCESSIBILITY QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() - : m_profile(QQuickWebEngineProfile::defaultProfile()) - , adapter(QSharedPointer::create()) + : m_profile(nullptr) , m_history(new QQuickWebEngineHistory(this)) - , m_settings(new QQuickWebEngineSettings(m_profile->settings())) #if QT_CONFIG(webengine_testsupport) , m_testSupport(0) #endif @@ -129,9 +127,10 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() , m_backgroundColor(Qt::white) , m_defaultZoomFactor(1.0) , m_ui2Enabled(false) + , m_profileInitialized(false) { - m_profile->d_ptr->addWebContentsAdapterClient(this); memset(actions, 0, sizeof(actions)); + QString platform = qApp->platformName().toLower(); if (platform == QLatin1Literal("eglfs")) m_ui2Enabled = true; @@ -159,12 +158,32 @@ QQuickWebEngineViewPrivate::QQuickWebEngineViewPrivate() QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() { + Q_ASSERT(m_profileInitialized); m_profile->d_ptr->removeWebContentsAdapterClient(this); adapter->stopFinding(); if (faviconProvider) faviconProvider->detach(q_ptr); } +void QQuickWebEngineViewPrivate::initializeProfile() +{ + if (!m_profileInitialized) { + m_profileInitialized = true; + if (!m_profile) + m_profile = QQuickWebEngineProfile::defaultProfile(); + m_profile->d_ptr->addWebContentsAdapterClient(this); + adapter = QSharedPointer::create(); + m_settings.reset(new QQuickWebEngineSettings(m_profile->settings())); + if (m_webChannel) + adapter->setWebChannel(m_webChannel, m_webChannelWorld); + } +} + +bool QQuickWebEngineViewPrivate::profileInitialized() const +{ + return m_profileInitialized; +} + void QQuickWebEngineViewPrivate::destroy() { // the profile for this web contens is about to be @@ -753,8 +772,6 @@ QQuickWebEngineView::QQuickWebEngineView(QQuickItem *parent) { Q_D(QQuickWebEngineView); d->q_ptr = this; - d->adapter->setClient(d); - this->setActiveFocusOnTab(true); this->setFlags(QQuickItem::ItemIsFocusScope | QQuickItem::ItemAcceptsDrops); } @@ -865,7 +882,7 @@ void QQuickWebEngineView::setUrl(const QUrl& url) Q_D(QQuickWebEngineView); d->explicitUrl = url; - if (d->adapter->isInitialized()) + if (d->profileInitialized() && d->adapter->isInitialized()) d->adapter->load(url); if (!qmlEngine(this) || isComponentComplete()) d->ensureContentsAdapter(); @@ -930,9 +947,11 @@ void QQuickWebEngineView::setZoomFactor(qreal arg) emit zoomFactorChanged(arg); } -QQuickWebEngineProfile *QQuickWebEngineView::profile() const +QQuickWebEngineProfile *QQuickWebEngineView::profile() { - Q_D(const QQuickWebEngineView); + Q_D(QQuickWebEngineView); + // this can be called before onComplete for group properties + d->initializeProfile(); return d->m_profile; } @@ -942,9 +961,10 @@ void QQuickWebEngineView::setProfile(QQuickWebEngineProfile *profile) d->setProfile(profile); } -QQuickWebEngineSettings *QQuickWebEngineView::settings() const +QQuickWebEngineSettings *QQuickWebEngineView::settings() { - Q_D(const QQuickWebEngineView); + Q_D(QQuickWebEngineView); + d->initializeProfile(); return d->m_settings.data(); } @@ -964,7 +984,15 @@ void QQuickWebEngineViewPrivate::setProfile(QQuickWebEngineProfile *profile) if (profile == m_profile) return; - m_profile->d_ptr->removeWebContentsAdapterClient(this); + + if (!m_profileInitialized) { + m_profile = profile; + return; + } + + if (m_profile) + m_profile->d_ptr->removeWebContentsAdapterClient(this); + m_profile = profile; m_profile->d_ptr->addWebContentsAdapterClient(this); Q_EMIT q->profileChanged(); @@ -1281,9 +1309,7 @@ QQmlWebChannel *QQuickWebEngineView::webChannel() Q_D(QQuickWebEngineView); if (!d->m_webChannel) { d->m_webChannel = new QQmlWebChannel(this); - d->adapter->setWebChannel(d->m_webChannel, d->m_webChannelWorld); } - return d->m_webChannel; #endif qWarning("WebEngine compiled without webchannel support"); @@ -1297,7 +1323,8 @@ void QQuickWebEngineView::setWebChannel(QQmlWebChannel *webChannel) if (d->m_webChannel == webChannel) return; d->m_webChannel = webChannel; - d->adapter->setWebChannel(webChannel, d->m_webChannelWorld); + if (d->profileInitialized()) + d->adapter->setWebChannel(webChannel, d->m_webChannelWorld); Q_EMIT webChannelChanged(); #else Q_UNUSED(webChannel) @@ -1318,7 +1345,8 @@ void QQuickWebEngineView::setWebChannelWorld(uint webChannelWorld) if (d->m_webChannelWorld == webChannelWorld) return; d->m_webChannelWorld = webChannelWorld; - d->adapter->setWebChannel(d->m_webChannel, d->m_webChannelWorld); + if (d->profileInitialized()) + d->adapter->setWebChannel(d->m_webChannel, d->m_webChannelWorld); Q_EMIT webChannelWorldChanged(webChannelWorld); #else Q_UNUSED(webChannelWorld) @@ -1353,6 +1381,7 @@ QQuickWebEngineView *QQuickWebEngineView::devToolsView() const return d->devToolsView; } + void QQuickWebEngineView::setDevToolsView(QQuickWebEngineView *devToolsView) { Q_D(QQuickWebEngineView); @@ -1365,7 +1394,7 @@ void QQuickWebEngineView::setDevToolsView(QQuickWebEngineView *devToolsView) d->devToolsView = devToolsView; if (devToolsView) devToolsView->setInspectedView(this); - if (d->adapter->isInitialized()) { + if (d->profileInitialized() && d->adapter->isInitialized()) { if (devToolsView) d->adapter->openDevToolsFrontend(devToolsView->d_ptr->adapter); else @@ -1452,7 +1481,8 @@ void QQuickWebEngineView::geometryChanged(const QRectF &newGeometry, const QRect void QQuickWebEngineView::itemChange(ItemChange change, const ItemChangeData &value) { Q_D(QQuickWebEngineView); - if (d && d->adapter->isInitialized() && (change == ItemSceneChange || change == ItemVisibleHasChanged)) { + if (d && d->profileInitialized() && d->adapter->isInitialized() + && (change == ItemSceneChange || change == ItemVisibleHasChanged)) { if (window() && isVisible()) d->adapter->wasShown(); else @@ -1929,7 +1959,9 @@ void QQuickWebEngineViewPrivate::userScripts_clear(QQmlListPropertyinitializeProfile(); + d->adapter->setClient(d); #ifndef QT_NO_ACCESSIBILITY // Enable accessibility via a dynamic QQmlProperty, instead of using private API call // QQuickAccessibleAttached::qmlAttachedProperties(this). The qmlContext is required, otherwise diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h index f60fdcddf..ae92b6df0 100644 --- a/src/webengine/api/qquickwebengineview_p.h +++ b/src/webengine/api/qquickwebengineview_p.h @@ -461,11 +461,11 @@ public: // QmlParserStatus void componentComplete() override; - QQuickWebEngineProfile *profile() const; + QQuickWebEngineProfile *profile(); void setProfile(QQuickWebEngineProfile *); QQmlListProperty userScripts(); - QQuickWebEngineSettings *settings() const; + QQuickWebEngineSettings *settings(); QQmlWebChannel *webChannel(); void setWebChannel(QQmlWebChannel *); QQuickWebEngineHistory *navigationHistory() const; diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index b030b2a29..fda67a6bf 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -90,7 +90,7 @@ public: QQuickWebEngineViewPrivate(); ~QQuickWebEngineViewPrivate(); void destroy(); - + void initializeProfile(); QtWebEngineCore::UIDelegatesManager *ui(); QtWebEngineCore::RenderWidgetHostViewQtDelegate* CreateRenderWidgetHostViewQtDelegate(QtWebEngineCore::RenderWidgetHostViewQtDelegateClient *client) override; @@ -196,6 +196,8 @@ public: bool m_isBeingAdopted; mutable QQuickWebEngineAction *actions[QQuickWebEngineView::WebActionCount]; + bool profileInitialized() const; + private: QScopedPointer m_uIDelegatesManager; QList m_userScripts; @@ -203,6 +205,7 @@ private: QColor m_backgroundColor; qreal m_defaultZoomFactor; bool m_ui2Enabled; + bool m_profileInitialized; }; #ifndef QT_NO_ACCESSIBILITY -- cgit v1.2.3