From a96d1fdd51a5544bab52e5dbf176d31865f0542a Mon Sep 17 00:00:00 2001
From: Michal Klocek <michal.klocek@qt.io>
Date: Tue, 9 Jan 2018 16:15:43 +0100
Subject: [PATCH] Fix random crashes on exit

Destroy WebContentsDelegateQt before WebContents, since it
references already partly deleted WebContentsAdapterClient object.
This prevents calls by navigation handling on already destructed
web contents adapter client.

Task-number: QTBUG-65647
Task-number: QTBUG-47945
Change-Id: I0ed5887b337a43ab89ecbfe05130691b5f1f37ec
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
---
 src/core/web_contents_adapter.cpp     | 2 --
 src/core/web_contents_delegate_qt.cpp | 7 +++++++
 src/core/web_contents_delegate_qt.h   | 2 +-
 3 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 5850b07b5..dc36b98c4 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -363,8 +363,6 @@ WebContentsAdapterPrivate::WebContentsAdapterPrivate()
 
 WebContentsAdapterPrivate::~WebContentsAdapterPrivate()
 {
-    // Destroy the WebContents first
-    webContents.reset();
 }
 
 QSharedPointer<WebContentsAdapter> WebContentsAdapter::createFromSerializedNavigationHistory(QDataStream &input, WebContentsAdapterClient *adapterClient)
diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp
index f51a6dff3..db05fae4b 100644
--- a/src/core/web_contents_delegate_qt.cpp
+++ b/src/core/web_contents_delegate_qt.cpp
@@ -109,6 +109,13 @@ WebContentsDelegateQt::WebContentsDelegateQt(content::WebContents *webContents,
     Observe(webContents);
 }
 
+WebContentsDelegateQt::~WebContentsDelegateQt()
+{
+    // The destruction of this object should take place before
+    // WebContents destruction since WebContentsAdapterClient
+    // might be already deleted.
+}
+
 content::WebContents *WebContentsDelegateQt::OpenURLFromTab(content::WebContents *source, const content::OpenURLParams &params)
 {
     content::WebContents *target = source;
diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h
index 8440ec053..2ebdb2ffc 100644
--- a/src/core/web_contents_delegate_qt.h
+++ b/src/core/web_contents_delegate_qt.h
@@ -92,7 +92,7 @@ class WebContentsDelegateQt : public content::WebContentsDelegate
 {
 public:
     WebContentsDelegateQt(content::WebContents*, WebContentsAdapterClient *adapterClient);
-    ~WebContentsDelegateQt() { Q_ASSERT(m_loadingErrorFrameList.isEmpty()); }
+    ~WebContentsDelegateQt();
     QString lastSearchedString() const { return m_lastSearchedString; }
     void setLastSearchedString(const QString &s) { m_lastSearchedString = s; }
     int lastReceivedFindReply() const { return m_lastReceivedFindReply; }
-- 
GitLab