Chromium Code Reviews| Index: services/ui/service.cc | 
| diff --git a/services/ui/service.cc b/services/ui/service.cc | 
| index b7ff96918dc2a27bcbf7f241e2a52e78dbdd7947..ada338c46c813b4c991435124456c8e105bdd193 100644 | 
| --- a/services/ui/service.cc | 
| +++ b/services/ui/service.cc | 
| @@ -42,6 +42,7 @@ | 
| #include "ui/base/platform_window_defaults.h" | 
| #include "ui/base/resource/resource_bundle.h" | 
| #include "ui/base/ui_base_paths.h" | 
| +#include "ui/display/screen_base.h" | 
| #include "ui/events/event_switches.h" | 
| #include "ui/events/platform/platform_event_source.h" | 
| #include "ui/gfx/geometry/rect.h" | 
| @@ -52,6 +53,7 @@ | 
| #include "ui/base/x/x11_util.h" // nogncheck | 
| #include "ui/platform_window/x11/x11_window.h" | 
| #elif defined(USE_OZONE) | 
| +#include "services/ui/display/screen_manager_forwarding.h" | 
| #include "ui/events/ozone/layout/keyboard_layout_engine.h" | 
| #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" | 
| #include "ui/ozone/public/ozone_platform.h" | 
| @@ -86,7 +88,6 @@ struct Service::UserState { | 
| Service::Service() | 
| : test_config_(false), | 
| - screen_manager_(display::ScreenManager::Create()), | 
| ime_registrar_(&ime_server_) {} | 
| Service::~Service() { | 
| @@ -98,6 +99,9 @@ Service::~Service() { | 
| #if defined(USE_OZONE) | 
| OzonePlatform::Shutdown(); | 
| #endif | 
| + | 
| + if (screen_) | 
| + display::Screen::SetScreenInstance(nullptr); | 
| } | 
| void Service::InitializeResources(service_manager::Connector* connector) { | 
| @@ -220,8 +224,6 @@ void Service::OnStart() { | 
| if (input_device_server_.IsRegisteredAsObserver()) | 
| input_device_server_.AddInterface(®istry_); | 
| - screen_manager_->AddInterfaces(®istry_); | 
| - | 
| #if defined(USE_OZONE) | 
| ui::OzonePlatform::GetInstance()->AddInterfaces(®istry_); | 
| #endif | 
| @@ -235,7 +237,10 @@ void Service::OnBindInterface(const service_manager::ServiceInfo& source_info, | 
| } | 
| void Service::StartDisplayInit() { | 
| - screen_manager_->Init(window_server_->display_manager()); | 
| + DCHECK(!is_gpu_ready_); // This should only be called once. | 
| + is_gpu_ready_ = true; | 
| + if (screen_manager_) | 
| + screen_manager_->Init(window_server_->display_manager()); | 
| } | 
| void Service::OnFirstDisplayReady() { | 
| @@ -261,6 +266,36 @@ bool Service::IsTestConfig() const { | 
| return test_config_; | 
| } | 
| +void Service::OnWillCreateTreeForWindowManager( | 
| 
 
kylechar
2017/04/19 18:06:08
What's the expected order that StartDisplayInit()
 
sky
2017/04/19 19:30:03
You are correct. One is not guaranteed to be calle
 
 | 
| + bool automatically_create_display_roots) { | 
| + if (screen_manager_config_ != ScreenManagerConfig::UNKNOWN) | 
| + return; | 
| + | 
| + DVLOG(3) << "OnWillCreateTreeForWindowManager " | 
| + << automatically_create_display_roots; | 
| + screen_manager_config_ = automatically_create_display_roots | 
| + ? ScreenManagerConfig::INTERNAL | 
| + : ScreenManagerConfig::FORWARDING; | 
| + if (screen_manager_config_ == ScreenManagerConfig::FORWARDING) { | 
| + screen_ = base::MakeUnique<display::ScreenBase>(); | 
| + display::Screen::SetScreenInstance(screen_.get()); | 
| +#if defined(USE_OZONE) | 
| + screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>(); | 
| +#else | 
| + CHECK(false); | 
| +#endif | 
| + } else { | 
| + screen_manager_ = display::ScreenManager::Create(); | 
| + } | 
| + screen_manager_->AddInterfaces(®istry_); | 
| + if (is_gpu_ready_) | 
| + screen_manager_->Init(window_server_->display_manager()); | 
| +} | 
| + | 
| +display::ScreenBase* Service::GetScreen() { | 
| + return screen_.get(); | 
| +} | 
| + | 
| void Service::Create(const service_manager::Identity& remote_identity, | 
| mojom::AccessibilityManagerRequest request) { | 
| UserState* user_state = GetUserState(remote_identity); |