1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/message_loop/message_pump.h"
6 
7 #include "base/message_loop/message_pump_default.h"
8 #include "base/message_loop/message_pump_for_io.h"
9 #include "base/message_loop/message_pump_for_ui.h"
10 
11 #if defined(OS_MACOSX)
12 #include "base/message_loop/message_pump_mac.h"
13 #endif
14 
15 namespace base {
16 
17 namespace {
18 
19 MessagePump::MessagePumpFactory* message_pump_for_ui_factory_ = nullptr;
20 
21 }  // namespace
22 
23 MessagePump::MessagePump() = default;
24 
25 MessagePump::~MessagePump() = default;
26 
SetTimerSlack(TimerSlack)27 void MessagePump::SetTimerSlack(TimerSlack) {
28 }
29 
30 // static
OverrideMessagePumpForUIFactory(MessagePumpFactory * factory)31 void MessagePump::OverrideMessagePumpForUIFactory(MessagePumpFactory* factory) {
32   DCHECK(!message_pump_for_ui_factory_);
33   message_pump_for_ui_factory_ = factory;
34 }
35 
36 // static
IsMessagePumpForUIFactoryOveridden()37 bool MessagePump::IsMessagePumpForUIFactoryOveridden() {
38   return message_pump_for_ui_factory_ != nullptr;
39 }
40 
41 // static
Create(MessagePumpType type)42 std::unique_ptr<MessagePump> MessagePump::Create(MessagePumpType type) {
43   switch (type) {
44     case MessagePumpType::UI:
45       if (message_pump_for_ui_factory_)
46         return message_pump_for_ui_factory_();
47 #if defined(OS_IOS) || defined(OS_MACOSX)
48       return MessagePumpMac::Create();
49 #elif defined(OS_NACL) || defined(OS_AIX)
50       // Currently NaCl and AIX don't have a UI MessagePump.
51       // TODO(abarth): Figure out if we need this.
52       NOTREACHED();
53       return nullptr;
54 #else
55       return std::make_unique<MessagePumpForUI>();
56 #endif
57 
58     case MessagePumpType::IO:
59       return std::make_unique<MessagePumpForIO>();
60 
61 #if defined(OS_ANDROID)
62     case MessagePumpType::JAVA:
63       return std::make_unique<MessagePumpForUI>();
64 #endif
65 
66 #if defined(OS_MACOSX)
67     case MessagePumpType::NS_RUNLOOP:
68       return std::make_unique<MessagePumpNSRunLoop>();
69 #endif
70 
71 #if defined(OS_WIN)
72     case MessagePumpType::UI_WITH_WM_QUIT_SUPPORT: {
73       auto pump = std::make_unique<MessagePumpForUI>();
74       pump->EnableWmQuit();
75       return pump;
76     }
77 #endif  // defined(OS_WIN)
78 
79     case MessagePumpType::CUSTOM:
80       NOTREACHED();
81       return nullptr;
82 
83     case MessagePumpType::DEFAULT:
84 #if defined(OS_IOS)
85       // On iOS, a native runloop is always required to pump system work.
86       return std::make_unique<MessagePumpCFRunLoop>();
87 #else
88       return std::make_unique<MessagePumpDefault>();
89 #endif
90   }
91 }
92 
93 }  // namespace base
94