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)27void MessagePump::SetTimerSlack(TimerSlack) { 28 } 29 30 // static OverrideMessagePumpForUIFactory(MessagePumpFactory * factory)31void MessagePump::OverrideMessagePumpForUIFactory(MessagePumpFactory* factory) { 32 DCHECK(!message_pump_for_ui_factory_); 33 message_pump_for_ui_factory_ = factory; 34 } 35 36 // static IsMessagePumpForUIFactoryOveridden()37bool MessagePump::IsMessagePumpForUIFactoryOveridden() { 38 return message_pump_for_ui_factory_ != nullptr; 39 } 40 41 // static Create(MessagePumpType type)42std::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