summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJüri Valdmann <juri.valdmann@qt.io>2019-03-15 11:02:02 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-03-23 08:36:33 +0000
commit704c3cead9ab7c16c1e0673d42c37b4576ae4844 (patch)
treed93b743706eec896350c0958285fc5ef9f9fd5e8
parentcedb457045c9972ba6da9c101c2ad65006b4db93 (diff)
Use MessagePumpForUIQt for UI thread only
In what almost seems like intentionally confusing terminology, Chromium draws a distinction between the UI thread and UI type threads. The thread's type refers mainly to the MessagePump implementation that it uses: currently MessagePumpForUIQt for all UI type threads. It turns out however that the desktop capture thread on macOS requires the original MessagePumpMac implementation for some macOS specifics. So, with this patch, MessagePumpForUIQt will be used only for the actual UI thread, and all other UI type threads will use upstream message pump implementations. Theoretically, this means that we cannot send events or async signals to these other UI type threads any more (sending events *from* these threads should still work). Practically though it seems safer to try, as far as possible, to not mix different event/task frameworks on the same thread. Change-Id: I81308d62c64354230796fccce2d3e0fa6cbb5013 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io> Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu>
-rw-r--r--src/core/browser_main_parts_qt.cpp49
-rw-r--r--src/core/browser_main_parts_qt.h5
2 files changed, 31 insertions, 23 deletions
diff --git a/src/core/browser_main_parts_qt.cpp b/src/core/browser_main_parts_qt.cpp
index 7e1617802..dacaf177f 100644
--- a/src/core/browser_main_parts_qt.cpp
+++ b/src/core/browser_main_parts_qt.cpp
@@ -67,7 +67,6 @@
#include "service/service_qt.h"
#include "web_engine_context.h"
-#include <QEventLoop>
#include <QtGui/qtgui-config.h>
#if QT_CONFIG(opengl)
@@ -115,36 +114,31 @@ public:
: m_scheduler([this]() { handleScheduledWork(); })
{}
+ void setDelegate(Delegate *delegate)
+ {
+ m_delegate = delegate;
+ }
+
void Run(Delegate *delegate) override
{
- if (!m_delegate)
- m_delegate = delegate;
- else
- 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 = nullptr;
+ NOTIMPLEMENTED();
}
void Quit() override
{
- Q_ASSERT(m_explicitLoop);
- m_explicitLoop->quit();
+ // This is used only when MessagePumpForUIQt is used outside of the GUI thread.
+ NOTIMPLEMENTED();
}
void ScheduleWork() override
{
// NOTE: This method may called from any thread at any time.
- if (!m_delegate)
- m_delegate = static_cast<base::MessageLoopImpl*>(base::MessageLoopCurrentForUI::Get().ToMessageLoopBaseDeprecated());
m_scheduler.scheduleWork();
}
void ScheduleDelayedWork(const base::TimeTicks &delayed_work_time) override
{
- Q_ASSERT(m_delegate);
m_scheduler.scheduleDelayedWork(GetTimeIntervalMilliseconds(delayed_work_time));
}
@@ -196,6 +190,8 @@ private:
void handleScheduledWork()
{
+ Q_ASSERT(m_delegate);
+
ScopedGLContextChecker glContextChecker;
bool more_work_is_plausible = m_delegate->DoWork();
@@ -214,14 +210,26 @@ private:
}
Delegate *m_delegate = nullptr;
- QEventLoop *m_explicitLoop = nullptr;
QWebEngineMessagePumpScheduler m_scheduler;
};
-std::unique_ptr<base::MessagePump> messagePumpFactory()
-{
- return base::WrapUnique(new MessagePumpForUIQt);
-}
+// Needed to access protected constructor from MessageLoop.
+class MessageLoopForUIQt : public base::MessageLoop {
+public:
+ MessageLoopForUIQt() : MessageLoop(TYPE_UI, base::BindOnce(&messagePumpFactory))
+ {
+ BindToCurrentThread();
+
+ auto pump = static_cast<MessagePumpForUIQt *>(pump_);
+ auto backend = static_cast<base::MessageLoopImpl *>(backend_.get());
+ pump->setDelegate(backend);
+ }
+private:
+ static std::unique_ptr<base::MessagePump> messagePumpFactory()
+ {
+ return base::WrapUnique(new MessagePumpForUIQt);
+ }
+};
BrowserMainPartsQt::BrowserMainPartsQt() : content::BrowserMainParts()
{ }
@@ -234,12 +242,13 @@ int BrowserMainPartsQt::PreEarlyInitialization()
#if BUILDFLAG(ENABLE_EXTENSIONS)
content::ChildProcessSecurityPolicy::GetInstance()->RegisterWebSafeScheme(extensions::kExtensionScheme);
#endif //ENABLE_EXTENSIONS
- base::MessageLoop::InitMessagePumpForUIFactory(messagePumpFactory);
return 0;
}
void BrowserMainPartsQt::PreMainMessageLoopStart()
{
+ // Overrides message loop creation in BrowserMainLoop::MainMessageLoopStart().
+ m_mainMessageLoop.reset(new MessageLoopForUIQt);
}
void BrowserMainPartsQt::PreMainMessageLoopRun()
diff --git a/src/core/browser_main_parts_qt.h b/src/core/browser_main_parts_qt.h
index 374220c3b..4eb10e379 100644
--- a/src/core/browser_main_parts_qt.h
+++ b/src/core/browser_main_parts_qt.h
@@ -43,7 +43,7 @@
#include "content/public/browser/browser_main_parts.h"
namespace base {
-class MessagePump;
+class MessageLoop;
}
namespace content {
@@ -56,8 +56,6 @@ class ProcessResourceCoordinator;
namespace QtWebEngineCore {
-std::unique_ptr<base::MessagePump> messagePumpFactory();
-
class BrowserMainPartsQt : public content::BrowserMainParts
{
public:
@@ -74,6 +72,7 @@ public:
private:
DISALLOW_COPY_AND_ASSIGN(BrowserMainPartsQt);
std::unique_ptr<resource_coordinator::ProcessResourceCoordinator> m_processResourceCoordinator;
+ std::unique_ptr<base::MessageLoop> m_mainMessageLoop;
};
} // namespace QtWebEngineCore