From ea503a2f07f2505d8d91a7d7999a1fb1b1d6b57c Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Date: Thu, 30 Jun 2016 16:22:33 +0200 Subject: [PATCH] Let script collection hold a reference to the adapter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While the script collection always follows a page, it is safer to have both hold a reference to the web-contents adapter, so it doesn't get deleted while adapters are being changed. Change-Id: I21e268f7228f13702468df61e0032bdf2f99873a Reviewed-by: Michael Brüning <michael.bruning@qt.io> --- src/webenginewidgets/api/qwebenginepage.cpp | 5 ----- .../api/qwebenginescriptcollection.cpp | 18 +++++++++--------- .../api/qwebenginescriptcollection_p.h | 5 +++-- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 0d556f15b..b35bb54ec 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -288,8 +288,6 @@ void QWebEnginePagePrivate::adoptNewWindow(WebContentsAdapter *newWebContents, W // Overwrite the new page's WebContents with ours. if (newPage->d_func() != this) { - // Keep the old adapter referenced until the scriptcollection is rebound - QExplicitlySharedDataPointer<WebContentsAdapter> oldWebContents = newPage->d_func()->adapter; newPage->d_func()->adapter = newWebContents; newWebContents->initialize(newPage->d_func()); newPage->d_func()->scriptCollection.d->rebindToContents(newWebContents); @@ -455,9 +453,6 @@ void QWebEnginePagePrivate::recreateFromSerializedHistory(QDataStream &input) { QExplicitlySharedDataPointer<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->initialize(this); if (webChannel) diff --git a/src/webenginewidgets/api/qwebenginescriptcollection.cpp b/src/webenginewidgets/api/qwebenginescriptcollection.cpp index 117c35b5a..8d581b60a 100644 --- a/src/webenginewidgets/api/qwebenginescriptcollection.cpp +++ b/src/webenginewidgets/api/qwebenginescriptcollection.cpp @@ -172,32 +172,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; @@ -205,7 +205,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(); @@ -213,12 +213,12 @@ 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) @@ -227,7 +227,7 @@ void QWebEngineScriptCollectionPrivate::rebindToContents(QtWebEngineCore::WebCon Q_ASSERT(page); Q_ASSERT(m_contents != page); - Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents)) { + Q_FOREACH (const UserScript &script, m_scriptController->registeredScripts(m_contents.data())) { m_scriptController->addUserScript(script, page); } m_contents = page; diff --git a/src/webenginewidgets/api/qwebenginescriptcollection_p.h b/src/webenginewidgets/api/qwebenginescriptcollection_p.h index b5ae60a2c..931f6c0e8 100644 --- a/src/webenginewidgets/api/qwebenginescriptcollection_p.h +++ b/src/webenginewidgets/api/qwebenginescriptcollection_p.h @@ -51,12 +51,13 @@ #include "qtwebenginewidgetsglobal.h" #include "qwebenginescript.h" +#include "web_contents_adapter.h" +#include <QtCore/QExplicitlySharedDataPointer> #include <QtCore/QSet> namespace QtWebEngineCore { class UserScriptControllerHost; -class WebContentsAdapter; } // namespace QT_BEGIN_NAMESPACE @@ -78,7 +79,7 @@ public: private: QtWebEngineCore::UserScriptControllerHost *m_scriptController; - QtWebEngineCore::WebContentsAdapter *m_contents; + QExplicitlySharedDataPointer<QtWebEngineCore::WebContentsAdapter> m_contents; }; QT_END_NAMESPACE -- GitLab