| 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 |