From fd5bba617a152b11bb8b6e5429ef185dee4684b2 Mon Sep 17 00:00:00 2001
From: WebKit Team <webkit@WebKits-Mac-Pro.local>
Date: Thu, 28 Aug 2014 17:48:49 +0200
Subject: [PATCH] Support using MessagePumpForUIQt in standalone base::Threads

We currently assume that MessagePumpForUIQt will only be used on Qt's
GUI thread but OSX and Windows do have some cases where TYPE_UI is
used for non-UI threads. This currently causes asserts in debug on
OSX since the DNS thread quits prematurely.

Instead of overriding all those edge cases to use TYPE_DEFAULT,
properly support MessagePumpForUIQt::Run by using a QEventLoop.

Change-Id: Icdb65966867ca6fd3679c75a698007f63848babc
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
---
 src/core/content_browser_client_qt.cpp | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index f19199cc3..022c02ff5 100644
--- a/src/core/content_browser_client_qt.cpp
+++ b/src/core/content_browser_client_qt.cpp
@@ -99,18 +99,24 @@ public:
         // Usually this gets passed through Run, but since we have
         // our own event loop, attach it explicitly ourselves.
         : m_delegate(base::MessageLoopForUI::current())
+        , m_explicitLoop(0)
     {
     }
 
     virtual void Run(Delegate *delegate) Q_DECL_OVERRIDE
     {
-        // FIXME: This could be needed if we want to run Chromium tests.
-        // We could run a QEventLoop here.
+        Q_ASSERT(delegate == m_delegate);
+        // This is used only when MessagePumpForUIQt is used outside of the GUI thread.
+        QEventLoop loop;
+        m_explicitLoop = &loop;
+        loop.exec();
+        m_explicitLoop = 0;
     }
 
     virtual void Quit() Q_DECL_OVERRIDE
     {
-        Q_UNREACHABLE();
+        Q_ASSERT(m_explicitLoop);
+        m_explicitLoop->quit();
     }
 
     virtual void ScheduleWork() Q_DECL_OVERRIDE
@@ -159,6 +165,7 @@ private:
     }
 
     Delegate *m_delegate;
+    QEventLoop *m_explicitLoop;
 };
 
 scoped_ptr<base::MessagePump> messagePumpFactory()
-- 
GitLab