diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp
index f19199cc3db07c3c471850692b165e5fb5285559..022c02ff57604faea978e75c3b2fc8ca45e9ca0e 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()