Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(231)

Side by Side Diff: services/ui/service.cc

Issue 2979933002: Add support to the UI Service to run it inside the browser's process. (Closed)
Patch Set: Addressing review feedback Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/ui/service.h ('k') | services/ui/ws/BUILD.gn » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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"
11 #include "base/memory/ptr_util.h" 11 #include "base/memory/ptr_util.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 13 #include "base/run_loop.h"
15 #include "base/threading/platform_thread.h" 14 #include "base/threading/platform_thread.h"
16 #include "base/trace_event/trace_event.h" 15 #include "base/trace_event/trace_event.h"
17 #include "build/build_config.h" 16 #include "build/build_config.h"
18 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h" 17 #include "components/discardable_memory/service/discardable_shared_memory_manage r.h"
19 #include "mojo/public/cpp/bindings/strong_binding.h" 18 #include "mojo/public/cpp/bindings/strong_binding.h"
20 #include "services/catalog/public/cpp/resource_loader.h" 19 #include "services/catalog/public/cpp/resource_loader.h"
21 #include "services/catalog/public/interfaces/constants.mojom.h" 20 #include "services/catalog/public/interfaces/constants.mojom.h"
22 #include "services/service_manager/public/c/main.h" 21 #include "services/service_manager/public/c/main.h"
23 #include "services/service_manager/public/cpp/connector.h" 22 #include "services/service_manager/public/cpp/connector.h"
24 #include "services/service_manager/public/cpp/service_context.h" 23 #include "services/service_manager/public/cpp/service_context.h"
25 #include "services/ui/clipboard/clipboard_impl.h" 24 #include "services/ui/clipboard/clipboard_impl.h"
25 #include "services/ui/common/image_cursors_set.h"
26 #include "services/ui/common/switches.h" 26 #include "services/ui/common/switches.h"
27 #include "services/ui/display/screen_manager.h" 27 #include "services/ui/display/screen_manager.h"
28 #include "services/ui/ime/ime_driver_bridge.h" 28 #include "services/ui/ime/ime_driver_bridge.h"
29 #include "services/ui/ime/ime_registrar_impl.h" 29 #include "services/ui/ime/ime_registrar_impl.h"
30 #include "services/ui/ws/accessibility_manager.h" 30 #include "services/ui/ws/accessibility_manager.h"
31 #include "services/ui/ws/display_binding.h" 31 #include "services/ui/ws/display_binding.h"
32 #include "services/ui/ws/display_creation_config.h" 32 #include "services/ui/ws/display_creation_config.h"
33 #include "services/ui/ws/display_manager.h" 33 #include "services/ui/ws/display_manager.h"
34 #include "services/ui/ws/frame_sink_manager_client_binding.h" 34 #include "services/ui/ws/frame_sink_manager_client_binding.h"
35 #include "services/ui/ws/gpu_host.h" 35 #include "services/ui/ws/gpu_host.h"
36 #include "services/ui/ws/threaded_image_cursors.h"
37 #include "services/ui/ws/threaded_image_cursors_factory.h"
36 #include "services/ui/ws/user_activity_monitor.h" 38 #include "services/ui/ws/user_activity_monitor.h"
37 #include "services/ui/ws/user_display_manager.h" 39 #include "services/ui/ws/user_display_manager.h"
38 #include "services/ui/ws/window_server.h" 40 #include "services/ui/ws/window_server.h"
39 #include "services/ui/ws/window_server_test_impl.h" 41 #include "services/ui/ws/window_server_test_impl.h"
40 #include "services/ui/ws/window_tree.h" 42 #include "services/ui/ws/window_tree.h"
41 #include "services/ui/ws/window_tree_binding.h" 43 #include "services/ui/ws/window_tree_binding.h"
42 #include "services/ui/ws/window_tree_factory.h" 44 #include "services/ui/ws/window_tree_factory.h"
43 #include "services/ui/ws/window_tree_host_factory.h" 45 #include "services/ui/ws/window_tree_host_factory.h"
46 #include "ui/base/cursor/image_cursors.h"
44 #include "ui/base/platform_window_defaults.h" 47 #include "ui/base/platform_window_defaults.h"
45 #include "ui/base/resource/resource_bundle.h" 48 #include "ui/base/resource/resource_bundle.h"
46 #include "ui/base/ui_base_paths.h" 49 #include "ui/base/ui_base_paths.h"
47 #include "ui/events/event_switches.h" 50 #include "ui/events/event_switches.h"
48 #include "ui/events/platform/platform_event_source.h" 51 #include "ui/events/platform/platform_event_source.h"
49 #include "ui/gfx/geometry/rect.h" 52 #include "ui/gfx/geometry/rect.h"
50 #include "ui/gl/gl_surface.h" 53 #include "ui/gl/gl_surface.h"
51 54
52 #if defined(USE_X11) 55 #if defined(USE_X11)
53 #include <X11/Xlib.h> 56 #include <X11/Xlib.h>
(...skipping 15 matching lines...) Expand all
69 using ui::mojom::WindowTreeHostFactory; 72 using ui::mojom::WindowTreeHostFactory;
70 73
71 namespace ui { 74 namespace ui {
72 75
73 namespace { 76 namespace {
74 77
75 const char kResourceFileStrings[] = "mus_app_resources_strings.pak"; 78 const char kResourceFileStrings[] = "mus_app_resources_strings.pak";
76 const char kResourceFile100[] = "mus_app_resources_100.pak"; 79 const char kResourceFile100[] = "mus_app_resources_100.pak";
77 const char kResourceFile200[] = "mus_app_resources_200.pak"; 80 const char kResourceFile200[] = "mus_app_resources_200.pak";
78 81
82 class ThreadedImageCursorsFactoryImpl : public ws::ThreadedImageCursorsFactory {
83 public:
84 // Uses the same InProcessConfig as the UI Service. |config| will be null when
85 // the UI Service runs in it's own separate process as opposed to the WM's
86 // process.
87 explicit ThreadedImageCursorsFactoryImpl(
88 const Service::InProcessConfig* config) {
89 if (config) {
90 resource_runner_ = config->resource_runner;
91 image_cursors_set_weak_ptr_ = config->image_cursors_set_weak_ptr;
92 DCHECK(resource_runner_);
93 }
94 }
95
96 ~ThreadedImageCursorsFactoryImpl() override {}
97
98 // ws::ThreadedImageCursorsFactory:
99 std::unique_ptr<ws::ThreadedImageCursors> CreateCursors() override {
100 // |resource_runner_| will not be initialized if and only if UI Service runs
101 // in it's own separate process. In this case we can (lazily) initialize it
102 // to the current thread (i.e. the UI Services's thread). We also initialize
103 // the local |image_cursors_set_| and make |image_cursors_set_weak_ptr_|
104 // point to it.
105 if (!resource_runner_) {
106 resource_runner_ = base::ThreadTaskRunnerHandle::Get();
107 image_cursors_set_ = base::MakeUnique<ui::ImageCursorsSet>();
108 image_cursors_set_weak_ptr_ = image_cursors_set_->GetWeakPtr();
109 }
110 return base::MakeUnique<ws::ThreadedImageCursors>(
111 resource_runner_, image_cursors_set_weak_ptr_);
112 }
113
114 private:
115 scoped_refptr<base::SingleThreadTaskRunner> resource_runner_;
116 base::WeakPtr<ui::ImageCursorsSet> image_cursors_set_weak_ptr_;
117
118 // Used when UI Service doesn't run inside WM's process.
119 std::unique_ptr<ui::ImageCursorsSet> image_cursors_set_;
120
121 DISALLOW_COPY_AND_ASSIGN(ThreadedImageCursorsFactoryImpl);
122 };
123
79 } // namespace 124 } // namespace
80 125
81 // TODO(sky): this is a pretty typical pattern, make it easier to do. 126 // TODO(sky): this is a pretty typical pattern, make it easier to do.
82 struct Service::PendingRequest { 127 struct Service::PendingRequest {
83 service_manager::BindSourceInfo source_info; 128 service_manager::BindSourceInfo source_info;
84 std::unique_ptr<mojom::WindowTreeFactoryRequest> wtf_request; 129 std::unique_ptr<mojom::WindowTreeFactoryRequest> wtf_request;
85 std::unique_ptr<mojom::DisplayManagerRequest> dm_request; 130 std::unique_ptr<mojom::DisplayManagerRequest> dm_request;
86 }; 131 };
87 132
88 struct Service::UserState { 133 struct Service::UserState {
89 std::unique_ptr<clipboard::ClipboardImpl> clipboard; 134 std::unique_ptr<clipboard::ClipboardImpl> clipboard;
90 std::unique_ptr<ws::AccessibilityManager> accessibility; 135 std::unique_ptr<ws::AccessibilityManager> accessibility;
91 std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory; 136 std::unique_ptr<ws::WindowTreeHostFactory> window_tree_host_factory;
92 }; 137 };
93 138
94 Service::Service() : test_config_(false), ime_registrar_(&ime_driver_) {} 139 Service::InProcessConfig::InProcessConfig() = default;
140
141 Service::InProcessConfig::~InProcessConfig() = default;
142
143 Service::Service(const InProcessConfig* config)
144 : is_in_process_(config != nullptr),
145 threaded_image_cursors_factory_(
146 base::MakeUnique<ThreadedImageCursorsFactoryImpl>(config)),
147 test_config_(false),
148 ime_registrar_(&ime_driver_) {}
95 149
96 Service::~Service() { 150 Service::~Service() {
97 // Destroy |window_server_| first, since it depends on |event_source_|. 151 // Destroy |window_server_| first, since it depends on |event_source_|.
98 // WindowServer (or more correctly its Displays) may have state that needs to 152 // WindowServer (or more correctly its Displays) may have state that needs to
99 // be destroyed before GpuState as well. 153 // be destroyed before GpuState as well.
100 window_server_.reset(); 154 window_server_.reset();
101 155
102 #if defined(USE_OZONE) 156 #if defined(USE_OZONE)
103 #if defined(OS_CHROMEOS) 157 #if defined(OS_CHROMEOS)
104 // InputDeviceController uses ozone. 158 // InputDeviceController uses ozone.
105 input_device_controller_.reset(); 159 input_device_controller_.reset();
106 #endif 160 #endif
107 161
108 OzonePlatform::Shutdown(); 162 OzonePlatform::Shutdown();
109 #endif 163 #endif
110 } 164 }
111 165
112 bool Service::InitializeResources(service_manager::Connector* connector) { 166 bool Service::InitializeResources(service_manager::Connector* connector) {
113 if (ui::ResourceBundle::HasSharedInstance()) 167 if (is_in_process() || ui::ResourceBundle::HasSharedInstance())
114 return true; 168 return true;
115 169
116 std::set<std::string> resource_paths; 170 std::set<std::string> resource_paths;
117 resource_paths.insert(kResourceFileStrings); 171 resource_paths.insert(kResourceFileStrings);
118 resource_paths.insert(kResourceFile100); 172 resource_paths.insert(kResourceFile100);
119 resource_paths.insert(kResourceFile200); 173 resource_paths.insert(kResourceFile200);
120 174
121 catalog::ResourceLoader loader; 175 catalog::ResourceLoader loader;
122 filesystem::mojom::DirectoryPtr directory; 176 filesystem::mojom::DirectoryPtr directory;
123 connector->BindInterface(catalog::mojom::kServiceName, &directory); 177 connector->BindInterface(catalog::mojom::kServiceName, &directory);
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 // Because GL libraries need to be initialized before entering the sandbox, 235 // Because GL libraries need to be initialized before entering the sandbox,
182 // in MUS, |InitializeForUI| will load the GL libraries. 236 // in MUS, |InitializeForUI| will load the GL libraries.
183 ui::OzonePlatform::InitParams params; 237 ui::OzonePlatform::InitParams params;
184 params.connector = context()->connector(); 238 params.connector = context()->connector();
185 params.single_process = false; 239 params.single_process = false;
186 ui::OzonePlatform::InitializeForUI(params); 240 ui::OzonePlatform::InitializeForUI(params);
187 241
188 // Assume a client will change the layout to an appropriate configuration. 242 // Assume a client will change the layout to an appropriate configuration.
189 ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine() 243 ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()
190 ->SetCurrentLayoutByName("us"); 244 ->SetCurrentLayoutByName("us");
191 client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone(); 245
192 gfx::ClientNativePixmapFactory::SetInstance( 246 if (!is_in_process()) {
193 client_native_pixmap_factory_.get()); 247 client_native_pixmap_factory_ = ui::CreateClientNativePixmapFactoryOzone();
248 gfx::ClientNativePixmapFactory::SetInstance(
249 client_native_pixmap_factory_.get());
250 }
194 251
195 DCHECK(gfx::ClientNativePixmapFactory::GetInstance()); 252 DCHECK(gfx::ClientNativePixmapFactory::GetInstance());
196 253
197 #if defined(OS_CHROMEOS) 254 #if defined(OS_CHROMEOS)
198 input_device_controller_ = base::MakeUnique<InputDeviceController>(); 255 input_device_controller_ = base::MakeUnique<InputDeviceController>();
199 input_device_controller_->AddInterface(&registry_); 256 input_device_controller_->AddInterface(&registry_);
200 #endif 257 #endif
201 #endif 258 #endif
202 259
203 // TODO(rjkroege): Enter sandbox here before we start threads in GpuState 260 // TODO(rjkroege): Enter sandbox here before we start threads in GpuState
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 373
317 DVLOG(3) << "OnWillCreateTreeForWindowManager " 374 DVLOG(3) << "OnWillCreateTreeForWindowManager "
318 << automatically_create_display_roots; 375 << automatically_create_display_roots;
319 ws::DisplayCreationConfig config = automatically_create_display_roots 376 ws::DisplayCreationConfig config = automatically_create_display_roots
320 ? ws::DisplayCreationConfig::AUTOMATIC 377 ? ws::DisplayCreationConfig::AUTOMATIC
321 : ws::DisplayCreationConfig::MANUAL; 378 : ws::DisplayCreationConfig::MANUAL;
322 window_server_->SetDisplayCreationConfig(config); 379 window_server_->SetDisplayCreationConfig(config);
323 if (window_server_->display_creation_config() == 380 if (window_server_->display_creation_config() ==
324 ws::DisplayCreationConfig::MANUAL) { 381 ws::DisplayCreationConfig::MANUAL) {
325 #if defined(USE_OZONE) && defined(OS_CHROMEOS) 382 #if defined(USE_OZONE) && defined(OS_CHROMEOS)
326 screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>(); 383 display::ScreenManagerForwarding::Mode mode =
384 is_in_process() ? display::ScreenManagerForwarding::Mode::IN_WM_PROCESS
385 : display::ScreenManagerForwarding::Mode::OWN_PROCESS;
386 screen_manager_ = base::MakeUnique<display::ScreenManagerForwarding>(mode);
327 #else 387 #else
328 CHECK(false); 388 CHECK(false);
329 #endif 389 #endif
330 } else { 390 } else {
331 screen_manager_ = display::ScreenManager::Create(); 391 screen_manager_ = display::ScreenManager::Create();
332 } 392 }
333 screen_manager_->AddInterfaces(&registry_); 393 screen_manager_->AddInterfaces(&registry_);
334 if (is_gpu_ready_) 394 if (is_gpu_ready_)
335 screen_manager_->Init(window_server_->display_manager()); 395 screen_manager_->Init(window_server_->display_manager());
336 } 396 }
337 397
398 ws::ThreadedImageCursorsFactory* Service::GetThreadedImageCursorsFactory() {
399 return threaded_image_cursors_factory_.get();
400 }
401
338 void Service::BindAccessibilityManagerRequest( 402 void Service::BindAccessibilityManagerRequest(
339 const service_manager::BindSourceInfo& source_info, 403 const service_manager::BindSourceInfo& source_info,
340 mojom::AccessibilityManagerRequest request) { 404 mojom::AccessibilityManagerRequest request) {
341 UserState* user_state = GetUserState(source_info.identity); 405 UserState* user_state = GetUserState(source_info.identity);
342 if (!user_state->accessibility) { 406 if (!user_state->accessibility) {
343 const ws::UserId& user_id = source_info.identity.user_id(); 407 const ws::UserId& user_id = source_info.identity.user_id();
344 user_state->accessibility.reset( 408 user_state->accessibility.reset(
345 new ws::AccessibilityManager(window_server_.get(), user_id)); 409 new ws::AccessibilityManager(window_server_.get(), user_id));
346 } 410 }
347 user_state->accessibility->Bind(std::move(request)); 411 user_state->accessibility->Bind(std::move(request));
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 mojom::WindowServerTestRequest request) { 520 mojom::WindowServerTestRequest request) {
457 if (!test_config_) 521 if (!test_config_)
458 return; 522 return;
459 mojo::MakeStrongBinding( 523 mojo::MakeStrongBinding(
460 base::MakeUnique<ws::WindowServerTestImpl>(window_server_.get()), 524 base::MakeUnique<ws::WindowServerTestImpl>(window_server_.get()),
461 std::move(request)); 525 std::move(request));
462 } 526 }
463 527
464 528
465 } // namespace ui 529 } // namespace ui
OLDNEW
« no previous file with comments | « services/ui/service.h ('k') | services/ui/ws/BUILD.gn » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698