summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Varga <pvarga@inf.u-szeged.hu>2015-07-08 14:18:50 +0200
committerPeter Varga <pvarga@inf.u-szeged.hu>2015-07-14 11:49:52 +0000
commitbf784bdf4350c178f030d34532fdd33953dac95a (patch)
treed8dc1804352058405961dbb26809744cc8c29e85
parent7345ef65af262eb0b958905d7175cc836821cf25 (diff)
Fix single-process mode
Destroy RenderprocesHostimpl first then the WebEngineContext. RenderProcessHostImpl's destructor may use the default BrowserContext stored by the WebEngineContext. Task-number: QTBUG-45722 Change-Id: Ide8875a89bd339ecf65ddd32a5f00842102c1c43 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
-rw-r--r--src/core/content_browser_client_qt.cpp4
-rw-r--r--src/core/web_engine_context.cpp19
-rw-r--r--src/core/web_engine_context.h3
3 files changed, 25 insertions, 1 deletions
diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index 3d318047b..fdfbaf0f5 100644
--- a/src/core/content_browser_client_qt.cpp
+++ b/src/core/content_browser_client_qt.cpp
@@ -71,6 +71,7 @@
#include "resource_dispatcher_host_delegate_qt.h"
#include "user_script_controller_host.h"
#include "web_contents_delegate_qt.h"
+#include "web_engine_context.h"
#include "web_engine_library_info.h"
#include <QGuiApplication>
@@ -218,6 +219,9 @@ public:
void PostMainMessageLoopRun()
{
+ // The BrowserContext's destructor uses the MessageLoop so it should be deleted
+ // right before the RenderProcessHostImpl's destructor destroys it.
+ WebEngineContext::current()->destroyBrowserContext();
}
int PreCreateThreads() Q_DECL_OVERRIDE
diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp
index 10d6bdd74..8bc047321 100644
--- a/src/core/web_engine_context.cpp
+++ b/src/core/web_engine_context.cpp
@@ -91,6 +91,10 @@ scoped_refptr<WebEngineContext> sContext;
void destroyContext()
{
+ // Destroy WebEngineContext before its static pointer is zeroed and destructor called.
+ // Before destroying MessageLoop via destroying BrowserMainRunner destructor
+ // WebEngineContext's pointer is used.
+ sContext->destroy();
sContext = 0;
}
@@ -136,9 +140,13 @@ bool usingQtQuick2DRenderer()
} // namespace
-WebEngineContext::~WebEngineContext()
+void WebEngineContext::destroyBrowserContext()
{
m_defaultBrowserContext = 0;
+}
+
+void WebEngineContext::destroy()
+{
delete m_globalQObject;
m_globalQObject = 0;
base::MessagePump::Delegate *delegate = m_runLoop->loop_;
@@ -146,6 +154,15 @@ WebEngineContext::~WebEngineContext()
while (delegate->DoWork()) { }
GLContextHelper::destroy();
m_runLoop->AfterRun();
+
+ // Force to destroy RenderProcessHostImpl by destroying BrowserMainRunner.
+ // RenderProcessHostImpl should be destroyed before WebEngineContext since
+ // default BrowserContext might be used by the RenderprocessHostImpl's destructor.
+ m_browserRunner.reset(0);
+}
+
+WebEngineContext::~WebEngineContext()
+{
}
scoped_refptr<WebEngineContext> WebEngineContext::current()
diff --git a/src/core/web_engine_context.h b/src/core/web_engine_context.h
index f900c93d8..dea54ef8a 100644
--- a/src/core/web_engine_context.h
+++ b/src/core/web_engine_context.h
@@ -70,6 +70,9 @@ public:
QtWebEngineCore::BrowserContextAdapter *defaultBrowserContext();
QObject *globalQObject();
+ void destroyBrowserContext();
+ void destroy();
+
private:
friend class base::RefCounted<WebEngineContext>;
WebEngineContext();