OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/mus/window_manager_application.h" | 5 #include "ash/mus/window_manager_application.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "ash/common/material_design/material_design_controller.h" | 9 #include "ash/common/material_design/material_design_controller.h" |
10 #include "ash/common/wm_shell.h" | 10 #include "ash/common/wm_shell.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 // AcceleratorRegistrarImpl removes an observer in its destructor. Destroy | 76 // AcceleratorRegistrarImpl removes an observer in its destructor. Destroy |
77 // it early on. | 77 // it early on. |
78 std::set<AcceleratorRegistrarImpl*> accelerator_registrars( | 78 std::set<AcceleratorRegistrarImpl*> accelerator_registrars( |
79 accelerator_registrars_); | 79 accelerator_registrars_); |
80 for (AcceleratorRegistrarImpl* registrar : accelerator_registrars) | 80 for (AcceleratorRegistrarImpl* registrar : accelerator_registrars) |
81 registrar->Destroy(); | 81 registrar->Destroy(); |
82 | 82 |
83 // Destroy the WindowManager while still valid. This way we ensure | 83 // Destroy the WindowManager while still valid. This way we ensure |
84 // OnWillDestroyRootWindowController() is called (if it hasn't been already). | 84 // OnWillDestroyRootWindowController() is called (if it hasn't been already). |
85 window_manager_.reset(); | 85 window_manager_.reset(); |
| 86 |
| 87 if (blocking_pool_) { |
| 88 // Like BrowserThreadImpl, the goal is to make it impossible for ash to |
| 89 // 'infinite loop' during shutdown, but to reasonably expect that all |
| 90 // BLOCKING_SHUTDOWN tasks queued during shutdown get run. There's nothing |
| 91 // particularly scientific about the number chosen. |
| 92 const int kMaxNewShutdownBlockingTasks = 1000; |
| 93 blocking_pool_->Shutdown(kMaxNewShutdownBlockingTasks); |
| 94 } |
| 95 |
86 gpu_service_.reset(); | 96 gpu_service_.reset(); |
87 #if defined(OS_CHROMEOS) | 97 #if defined(OS_CHROMEOS) |
88 statistics_provider_.reset(); | 98 statistics_provider_.reset(); |
89 #endif | 99 #endif |
90 ShutdownComponents(); | 100 ShutdownComponents(); |
91 } | 101 } |
92 | 102 |
93 void WindowManagerApplication::OnAcceleratorRegistrarDestroyed( | 103 void WindowManagerApplication::OnAcceleratorRegistrarDestroyed( |
94 AcceleratorRegistrarImpl* registrar) { | 104 AcceleratorRegistrarImpl* registrar) { |
95 accelerator_registrars_.erase(registrar); | 105 accelerator_registrars_.erase(registrar); |
96 } | 106 } |
97 | 107 |
98 void WindowManagerApplication::InitWindowManager( | 108 void WindowManagerApplication::InitWindowManager( |
99 std::unique_ptr<ui::WindowTreeClient> window_tree_client) { | 109 std::unique_ptr<ui::WindowTreeClient> window_tree_client, |
| 110 const scoped_refptr<base::SequencedWorkerPool>& blocking_pool) { |
100 InitializeComponents(); | 111 InitializeComponents(); |
101 #if defined(OS_CHROMEOS) | 112 #if defined(OS_CHROMEOS) |
102 // TODO(jamescook): Refactor StatisticsProvider so we can get just the data | 113 // TODO(jamescook): Refactor StatisticsProvider so we can get just the data |
103 // we need in ash. Right now StatisticsProviderImpl launches the crossystem | 114 // we need in ash. Right now StatisticsProviderImpl launches the crossystem |
104 // binary to get system data, which we don't want to do twice on startup. | 115 // binary to get system data, which we don't want to do twice on startup. |
105 statistics_provider_.reset( | 116 statistics_provider_.reset( |
106 new chromeos::system::ScopedFakeStatisticsProvider()); | 117 new chromeos::system::ScopedFakeStatisticsProvider()); |
107 statistics_provider_->SetMachineStatistic("initial_locale", "en-US"); | 118 statistics_provider_->SetMachineStatistic("initial_locale", "en-US"); |
108 statistics_provider_->SetMachineStatistic("keyboard_layout", ""); | 119 statistics_provider_->SetMachineStatistic("keyboard_layout", ""); |
109 #endif | 120 #endif |
110 window_manager_->Init(std::move(window_tree_client)); | 121 window_manager_->Init(std::move(window_tree_client), blocking_pool); |
111 } | 122 } |
112 | 123 |
113 void WindowManagerApplication::OnStart(const shell::Identity& identity) { | 124 void WindowManagerApplication::OnStart(const shell::Identity& identity) { |
114 aura_init_.reset(new views::AuraInit(connector(), "ash_mus_resources.pak")); | 125 aura_init_.reset(new views::AuraInit(connector(), "ash_mus_resources.pak")); |
115 gpu_service_ = ui::GpuService::Create(connector()); | 126 gpu_service_ = ui::GpuService::Create(connector()); |
116 compositor_context_factory_.reset( | 127 compositor_context_factory_.reset( |
117 new views::SurfaceContextFactory(gpu_service_.get())); | 128 new views::SurfaceContextFactory(gpu_service_.get())); |
118 aura::Env::GetInstance()->set_context_factory( | 129 aura::Env::GetInstance()->set_context_factory( |
119 compositor_context_factory_.get()); | 130 compositor_context_factory_.get()); |
120 window_manager_.reset(new WindowManager(connector())); | 131 window_manager_.reset(new WindowManager(connector())); |
121 | 132 |
122 MaterialDesignController::Initialize(); | 133 MaterialDesignController::Initialize(); |
123 | 134 |
124 tracing_.Initialize(connector(), identity.name()); | 135 tracing_.Initialize(connector(), identity.name()); |
125 | 136 |
126 std::unique_ptr<ui::WindowTreeClient> window_tree_client = | 137 std::unique_ptr<ui::WindowTreeClient> window_tree_client = |
127 base::MakeUnique<ui::WindowTreeClient>(window_manager_.get(), | 138 base::MakeUnique<ui::WindowTreeClient>(window_manager_.get(), |
128 window_manager_.get()); | 139 window_manager_.get()); |
129 window_tree_client->ConnectAsWindowManager(connector()); | 140 window_tree_client->ConnectAsWindowManager(connector()); |
130 | 141 |
131 native_widget_factory_mus_.reset( | 142 native_widget_factory_mus_.reset( |
132 new NativeWidgetFactoryMus(window_manager_.get())); | 143 new NativeWidgetFactoryMus(window_manager_.get())); |
133 | 144 |
134 InitWindowManager(std::move(window_tree_client)); | 145 const size_t kMaxNumberThreads = 3u; // Matches that of content. |
| 146 const char kThreadNamePrefix[] = "MashBlocking"; |
| 147 blocking_pool_ = new base::SequencedWorkerPool( |
| 148 kMaxNumberThreads, kThreadNamePrefix, base::TaskPriority::USER_VISIBLE); |
| 149 InitWindowManager(std::move(window_tree_client), blocking_pool_); |
135 } | 150 } |
136 | 151 |
137 bool WindowManagerApplication::OnConnect(const shell::Identity& remote_identity, | 152 bool WindowManagerApplication::OnConnect(const shell::Identity& remote_identity, |
138 shell::InterfaceRegistry* registry) { | 153 shell::InterfaceRegistry* registry) { |
139 registry->AddInterface<ash::mojom::ShelfController>(this); | 154 registry->AddInterface<ash::mojom::ShelfController>(this); |
140 registry->AddInterface<ui::mojom::AcceleratorRegistrar>(this); | 155 registry->AddInterface<ui::mojom::AcceleratorRegistrar>(this); |
141 if (remote_identity.name() == "mojo:mash_session") { | 156 if (remote_identity.name() == "mojo:mash_session") { |
142 connector()->ConnectToInterface(remote_identity, &session_); | 157 connector()->ConnectToInterface(remote_identity, &session_); |
143 session_->AddScreenlockStateListener( | 158 session_->AddScreenlockStateListener( |
144 screenlock_state_listener_binding_.CreateInterfacePtrAndBind()); | 159 screenlock_state_listener_binding_.CreateInterfacePtrAndBind()); |
(...skipping 28 matching lines...) Expand all Loading... |
173 base::Bind(&WindowManagerApplication::OnAcceleratorRegistrarDestroyed, | 188 base::Bind(&WindowManagerApplication::OnAcceleratorRegistrarDestroyed, |
174 base::Unretained(this)))); | 189 base::Unretained(this)))); |
175 } | 190 } |
176 | 191 |
177 void WindowManagerApplication::ScreenlockStateChanged(bool locked) { | 192 void WindowManagerApplication::ScreenlockStateChanged(bool locked) { |
178 window_manager_->SetScreenLocked(locked); | 193 window_manager_->SetScreenLocked(locked); |
179 } | 194 } |
180 | 195 |
181 } // namespace mus | 196 } // namespace mus |
182 } // namespace ash | 197 } // namespace ash |
OLD | NEW |