OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "services/ui/service.h" | 5 #include "services/ui/service.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 namespace { | 62 namespace { |
63 | 63 |
64 const char kResourceFileStrings[] = "mus_app_resources_strings.pak"; | 64 const char kResourceFileStrings[] = "mus_app_resources_strings.pak"; |
65 const char kResourceFile100[] = "mus_app_resources_100.pak"; | 65 const char kResourceFile100[] = "mus_app_resources_100.pak"; |
66 const char kResourceFile200[] = "mus_app_resources_200.pak"; | 66 const char kResourceFile200[] = "mus_app_resources_200.pak"; |
67 | 67 |
68 } // namespace | 68 } // namespace |
69 | 69 |
70 // TODO(sky): this is a pretty typical pattern, make it easier to do. | 70 // TODO(sky): this is a pretty typical pattern, make it easier to do. |
71 struct Service::PendingRequest { | 71 struct Service::PendingRequest { |
72 shell::Connection* connection; | 72 shell::Identity remote_identity; |
73 std::unique_ptr<mojom::WindowTreeFactoryRequest> wtf_request; | 73 std::unique_ptr<mojom::WindowTreeFactoryRequest> wtf_request; |
74 std::unique_ptr<mojom::DisplayManagerRequest> dm_request; | 74 std::unique_ptr<mojom::DisplayManagerRequest> dm_request; |
75 }; | 75 }; |
76 | 76 |
77 struct Service::UserState { | 77 struct Service::UserState { |
78 std::unique_ptr<ws::AccessibilityManager> accessibility; | 78 std::unique_ptr<ws::AccessibilityManager> accessibility; |
79 std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory; | 79 std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory; |
80 }; | 80 }; |
81 | 81 |
82 Service::Service() | 82 Service::Service() |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 ui::ResourceBundle::InitSharedInstanceWithPakFileRegion( | 122 ui::ResourceBundle::InitSharedInstanceWithPakFileRegion( |
123 loader.TakeFile(kResourceFileStrings), | 123 loader.TakeFile(kResourceFileStrings), |
124 base::MemoryMappedFile::Region::kWholeFile); | 124 base::MemoryMappedFile::Region::kWholeFile); |
125 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 125 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
126 rb.AddDataPackFromFile(loader.TakeFile(kResourceFile100), | 126 rb.AddDataPackFromFile(loader.TakeFile(kResourceFile100), |
127 ui::SCALE_FACTOR_100P); | 127 ui::SCALE_FACTOR_100P); |
128 rb.AddDataPackFromFile(loader.TakeFile(kResourceFile200), | 128 rb.AddDataPackFromFile(loader.TakeFile(kResourceFile200), |
129 ui::SCALE_FACTOR_200P); | 129 ui::SCALE_FACTOR_200P); |
130 } | 130 } |
131 | 131 |
132 Service::UserState* Service::GetUserState(shell::Connection* connection) { | 132 Service::UserState* Service::GetUserState( |
133 const ws::UserId& user_id = connection->GetRemoteIdentity().user_id(); | 133 const shell::Identity& remote_identity) { |
| 134 const ws::UserId& user_id = remote_identity.user_id(); |
134 auto it = user_id_to_user_state_.find(user_id); | 135 auto it = user_id_to_user_state_.find(user_id); |
135 if (it != user_id_to_user_state_.end()) | 136 if (it != user_id_to_user_state_.end()) |
136 return it->second.get(); | 137 return it->second.get(); |
137 user_id_to_user_state_[user_id] = base::WrapUnique(new UserState); | 138 user_id_to_user_state_[user_id] = base::WrapUnique(new UserState); |
138 return user_id_to_user_state_[user_id].get(); | 139 return user_id_to_user_state_[user_id].get(); |
139 } | 140 } |
140 | 141 |
141 void Service::AddUserIfNecessary(shell::Connection* connection) { | 142 void Service::AddUserIfNecessary(const shell::Identity& remote_identity) { |
142 window_server_->user_id_tracker()->AddUserId( | 143 window_server_->user_id_tracker()->AddUserId(remote_identity.user_id()); |
143 connection->GetRemoteIdentity().user_id()); | |
144 } | 144 } |
145 | 145 |
146 void Service::OnStart(shell::Connector* connector, | 146 void Service::OnStart(shell::Connector* connector, |
147 const shell::Identity& identity, | 147 const shell::Identity& identity, |
148 uint32_t id) { | 148 uint32_t id) { |
149 platform_display_init_params_.surfaces_state = new SurfacesState; | 149 platform_display_init_params_.surfaces_state = new SurfacesState; |
150 | 150 |
151 base::PlatformThread::SetName("mus"); | 151 base::PlatformThread::SetName("mus"); |
152 tracing_.Initialize(connector, identity.name()); | 152 tracing_.Initialize(connector, identity.name()); |
153 TRACE_EVENT0("mus", "Service::Initialize started"); | 153 TRACE_EVENT0("mus", "Service::Initialize started"); |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 #endif | 252 #endif |
253 | 253 |
254 return true; | 254 return true; |
255 } | 255 } |
256 | 256 |
257 void Service::OnFirstDisplayReady() { | 257 void Service::OnFirstDisplayReady() { |
258 PendingRequests requests; | 258 PendingRequests requests; |
259 requests.swap(pending_requests_); | 259 requests.swap(pending_requests_); |
260 for (auto& request : requests) { | 260 for (auto& request : requests) { |
261 if (request->wtf_request) | 261 if (request->wtf_request) |
262 Create(request->connection, std::move(*request->wtf_request)); | 262 Create(request->remote_identity, std::move(*request->wtf_request)); |
263 else | 263 else |
264 Create(request->connection, std::move(*request->dm_request)); | 264 Create(request->remote_identity, std::move(*request->dm_request)); |
265 } | 265 } |
266 } | 266 } |
267 | 267 |
268 void Service::OnNoMoreDisplays() { | 268 void Service::OnNoMoreDisplays() { |
269 // We may get here from the destructor, in which case there is no messageloop. | 269 // We may get here from the destructor, in which case there is no messageloop. |
270 if (base::MessageLoop::current()) | 270 if (base::MessageLoop::current()) |
271 base::MessageLoop::current()->QuitWhenIdle(); | 271 base::MessageLoop::current()->QuitWhenIdle(); |
272 } | 272 } |
273 | 273 |
274 bool Service::IsTestConfig() const { | 274 bool Service::IsTestConfig() const { |
275 return test_config_; | 275 return test_config_; |
276 } | 276 } |
277 | 277 |
278 void Service::CreateDefaultDisplays() { | 278 void Service::CreateDefaultDisplays() { |
279 // An asynchronous callback will create the Displays once the physical | 279 // An asynchronous callback will create the Displays once the physical |
280 // displays are ready. | 280 // displays are ready. |
281 platform_screen_->ConfigurePhysicalDisplay(base::Bind( | 281 platform_screen_->ConfigurePhysicalDisplay(base::Bind( |
282 &Service::OnCreatedPhysicalDisplay, weak_ptr_factory_.GetWeakPtr())); | 282 &Service::OnCreatedPhysicalDisplay, weak_ptr_factory_.GetWeakPtr())); |
283 } | 283 } |
284 | 284 |
285 void Service::Create(shell::Connection* connection, | 285 void Service::Create(const shell::Identity& remote_identity, |
286 mojom::AccessibilityManagerRequest request) { | 286 mojom::AccessibilityManagerRequest request) { |
287 UserState* user_state = GetUserState(connection); | 287 UserState* user_state = GetUserState(remote_identity); |
288 if (!user_state->accessibility) { | 288 if (!user_state->accessibility) { |
289 const ws::UserId& user_id = connection->GetRemoteIdentity().user_id(); | 289 const ws::UserId& user_id = remote_identity.user_id(); |
290 user_state->accessibility.reset( | 290 user_state->accessibility.reset( |
291 new ws::AccessibilityManager(window_server_.get(), user_id)); | 291 new ws::AccessibilityManager(window_server_.get(), user_id)); |
292 } | 292 } |
293 user_state->accessibility->Bind(std::move(request)); | 293 user_state->accessibility->Bind(std::move(request)); |
294 } | 294 } |
295 | 295 |
296 void Service::Create(shell::Connection* connection, | 296 void Service::Create(const shell::Identity& remote_identity, |
297 mojom::ClipboardRequest request) { | 297 mojom::ClipboardRequest request) { |
298 const ws::UserId& user_id = connection->GetRemoteIdentity().user_id(); | 298 const ws::UserId& user_id = remote_identity.user_id(); |
299 window_server_->GetClipboardForUser(user_id)->AddBinding(std::move(request)); | 299 window_server_->GetClipboardForUser(user_id)->AddBinding(std::move(request)); |
300 } | 300 } |
301 | 301 |
302 void Service::Create(shell::Connection* connection, | 302 void Service::Create(const shell::Identity& remote_identity, |
303 mojom::DisplayManagerRequest request) { | 303 mojom::DisplayManagerRequest request) { |
304 // DisplayManagerObservers generally expect there to be at least one display. | 304 // DisplayManagerObservers generally expect there to be at least one display. |
305 if (!window_server_->display_manager()->has_displays()) { | 305 if (!window_server_->display_manager()->has_displays()) { |
306 std::unique_ptr<PendingRequest> pending_request(new PendingRequest); | 306 std::unique_ptr<PendingRequest> pending_request(new PendingRequest); |
307 pending_request->connection = connection; | 307 pending_request->remote_identity = remote_identity; |
308 pending_request->dm_request.reset( | 308 pending_request->dm_request.reset( |
309 new mojom::DisplayManagerRequest(std::move(request))); | 309 new mojom::DisplayManagerRequest(std::move(request))); |
310 pending_requests_.push_back(std::move(pending_request)); | 310 pending_requests_.push_back(std::move(pending_request)); |
311 return; | 311 return; |
312 } | 312 } |
313 window_server_->display_manager() | 313 window_server_->display_manager() |
314 ->GetUserDisplayManager(connection->GetRemoteIdentity().user_id()) | 314 ->GetUserDisplayManager(remote_identity.user_id()) |
315 ->AddDisplayManagerBinding(std::move(request)); | 315 ->AddDisplayManagerBinding(std::move(request)); |
316 } | 316 } |
317 | 317 |
318 void Service::Create(shell::Connection* connection, mojom::GpuRequest request) { | 318 void Service::Create(const shell::Identity& remote_identity, |
| 319 mojom::GpuRequest request) { |
319 if (use_chrome_gpu_command_buffer_) | 320 if (use_chrome_gpu_command_buffer_) |
320 return; | 321 return; |
321 DCHECK(platform_display_init_params_.gpu_state); | 322 DCHECK(platform_display_init_params_.gpu_state); |
322 new GpuImpl(std::move(request), platform_display_init_params_.gpu_state); | 323 new GpuImpl(std::move(request), platform_display_init_params_.gpu_state); |
323 } | 324 } |
324 | 325 |
325 void Service::Create(shell::Connection* connection, | 326 void Service::Create(const shell::Identity& remote_identity, |
326 mojom::GpuServiceRequest request) { | 327 mojom::GpuServiceRequest request) { |
327 if (!use_chrome_gpu_command_buffer_) | 328 if (!use_chrome_gpu_command_buffer_) |
328 return; | 329 return; |
329 new GpuServiceImpl(std::move(request), connection); | 330 new GpuServiceImpl(std::move(request)); |
330 } | 331 } |
331 | 332 |
332 void Service::Create(shell::Connection* connection, | 333 void Service::Create(const shell::Identity& remote_identity, |
333 mojom::UserAccessManagerRequest request) { | 334 mojom::UserAccessManagerRequest request) { |
334 window_server_->user_id_tracker()->Bind(std::move(request)); | 335 window_server_->user_id_tracker()->Bind(std::move(request)); |
335 } | 336 } |
336 | 337 |
337 void Service::Create(shell::Connection* connection, | 338 void Service::Create(const shell::Identity& remote_identity, |
338 mojom::UserActivityMonitorRequest request) { | 339 mojom::UserActivityMonitorRequest request) { |
339 AddUserIfNecessary(connection); | 340 AddUserIfNecessary(remote_identity); |
340 const ws::UserId& user_id = connection->GetRemoteIdentity().user_id(); | 341 const ws::UserId& user_id = remote_identity.user_id(); |
341 window_server_->GetUserActivityMonitorForUser(user_id)->Add( | 342 window_server_->GetUserActivityMonitorForUser(user_id)->Add( |
342 std::move(request)); | 343 std::move(request)); |
343 } | 344 } |
344 | 345 |
345 void Service::Create(shell::Connection* connection, | 346 void Service::Create(const shell::Identity& remote_identity, |
346 mojom::WindowManagerWindowTreeFactoryRequest request) { | 347 mojom::WindowManagerWindowTreeFactoryRequest request) { |
347 AddUserIfNecessary(connection); | 348 AddUserIfNecessary(remote_identity); |
348 window_server_->window_manager_window_tree_factory_set()->Add( | 349 window_server_->window_manager_window_tree_factory_set()->Add( |
349 connection->GetRemoteIdentity().user_id(), std::move(request)); | 350 remote_identity.user_id(), std::move(request)); |
350 } | 351 } |
351 | 352 |
352 void Service::Create(Connection* connection, | 353 void Service::Create(const shell::Identity& remote_identity, |
353 mojom::WindowTreeFactoryRequest request) { | 354 mojom::WindowTreeFactoryRequest request) { |
354 AddUserIfNecessary(connection); | 355 AddUserIfNecessary(remote_identity); |
355 if (!window_server_->display_manager()->has_displays()) { | 356 if (!window_server_->display_manager()->has_displays()) { |
356 std::unique_ptr<PendingRequest> pending_request(new PendingRequest); | 357 std::unique_ptr<PendingRequest> pending_request(new PendingRequest); |
357 pending_request->connection = connection; | 358 pending_request->remote_identity = remote_identity; |
358 pending_request->wtf_request.reset( | 359 pending_request->wtf_request.reset( |
359 new mojom::WindowTreeFactoryRequest(std::move(request))); | 360 new mojom::WindowTreeFactoryRequest(std::move(request))); |
360 pending_requests_.push_back(std::move(pending_request)); | 361 pending_requests_.push_back(std::move(pending_request)); |
361 return; | 362 return; |
362 } | 363 } |
363 AddUserIfNecessary(connection); | 364 AddUserIfNecessary(remote_identity); |
364 new ws::WindowTreeFactory( | 365 new ws::WindowTreeFactory(window_server_.get(), remote_identity.user_id(), |
365 window_server_.get(), connection->GetRemoteIdentity().user_id(), | 366 remote_identity.name(), std::move(request)); |
366 connection->GetRemoteIdentity().name(), std::move(request)); | |
367 } | 367 } |
368 | 368 |
369 void Service::Create(Connection* connection, | 369 void Service::Create(const shell::Identity& remote_identity, |
370 mojom::WindowTreeHostFactoryRequest request) { | 370 mojom::WindowTreeHostFactoryRequest request) { |
371 UserState* user_state = GetUserState(connection); | 371 UserState* user_state = GetUserState(remote_identity); |
372 if (!user_state->window_tree_host_factory) { | 372 if (!user_state->window_tree_host_factory) { |
373 user_state->window_tree_host_factory.reset(new ws::WindowTreeHostFactory( | 373 user_state->window_tree_host_factory.reset(new ws::WindowTreeHostFactory( |
374 window_server_.get(), connection->GetRemoteIdentity().user_id(), | 374 window_server_.get(), remote_identity.user_id(), |
375 platform_display_init_params_)); | 375 platform_display_init_params_)); |
376 } | 376 } |
377 user_state->window_tree_host_factory->AddBinding(std::move(request)); | 377 user_state->window_tree_host_factory->AddBinding(std::move(request)); |
378 } | 378 } |
379 | 379 |
380 void Service::Create(Connection* connection, | 380 void Service::Create(const shell::Identity& remote_identity, |
381 mojom::WindowServerTestRequest request) { | 381 mojom::WindowServerTestRequest request) { |
382 if (!test_config_) | 382 if (!test_config_) |
383 return; | 383 return; |
384 new ws::WindowServerTestImpl(window_server_.get(), std::move(request)); | 384 new ws::WindowServerTestImpl(window_server_.get(), std::move(request)); |
385 } | 385 } |
386 | 386 |
387 void Service::OnCreatedPhysicalDisplay(int64_t id, const gfx::Rect& bounds) { | 387 void Service::OnCreatedPhysicalDisplay(int64_t id, const gfx::Rect& bounds) { |
388 platform_display_init_params_.display_bounds = bounds; | 388 platform_display_init_params_.display_bounds = bounds; |
389 platform_display_init_params_.display_id = id; | 389 platform_display_init_params_.display_id = id; |
390 | 390 |
391 // Display manages its own lifetime. | 391 // Display manages its own lifetime. |
392 ws::Display* host_impl = | 392 ws::Display* host_impl = |
393 new ws::Display(window_server_.get(), platform_display_init_params_); | 393 new ws::Display(window_server_.get(), platform_display_init_params_); |
394 host_impl->Init(nullptr); | 394 host_impl->Init(nullptr); |
395 | 395 |
396 if (touch_controller_) | 396 if (touch_controller_) |
397 touch_controller_->UpdateTouchTransforms(); | 397 touch_controller_->UpdateTouchTransforms(); |
398 } | 398 } |
399 | 399 |
400 } // namespace ui | 400 } // namespace ui |
OLD | NEW |