summaryrefslogtreecommitdiffstats
path: root/src/webengine/api
diff options
context:
space:
mode:
authorMichal Klocek <michal.klocek@qt.io>2018-08-02 20:48:28 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-25 22:13:39 +0000
commitc4cded3fd5ba64b2544a6f0c5307c661c55fddb3 (patch)
treee50c03b07d14741e7158eee84d844966551c823a /src/webengine/api
parenta03ce4b8aefb1174dce6de05babc441ac511298a (diff)
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 <allan.jensen@qt.io>
Diffstat (limited to 'src/webengine/api')
-rw-r--r--src/webengine/api/qquickwebengineprofile.cpp4
-rw-r--r--src/webengine/api/qquickwebengineview.cpp70
-rw-r--r--src/webengine/api/qquickwebengineview_p.h4
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h5
4 files changed, 58 insertions, 25 deletions
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<WebContentsAdapter>::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<WebContentsAdapter>::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(QQmlListProperty<QQuickWebEng
void QQuickWebEngineView::componentComplete()
{
QQuickItem::componentComplete();
-
+ Q_D(QQuickWebEngineView);
+ d->initializeProfile();
+ 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<QQuickWebEngineScript> 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<QtWebEngineCore::UIDelegatesManager> m_uIDelegatesManager;
QList<QQuickWebEngineScript *> m_userScripts;
@@ -203,6 +205,7 @@ private:
QColor m_backgroundColor;
qreal m_defaultZoomFactor;
bool m_ui2Enabled;
+ bool m_profileInitialized;
};
#ifndef QT_NO_ACCESSIBILITY