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

Side by Side Diff: mojo/services/view_manager/connection_manager.cc

Issue 721243003: Changes ViewManagerServiceImpl so that it no longer subclasses InterfaceImpl (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: format Created 6 years, 1 month 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
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 "mojo/services/view_manager/connection_manager.h" 5 #include "mojo/services/view_manager/connection_manager.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "mojo/converters/geometry/geometry_type_converters.h" 9 #include "mojo/converters/geometry/geometry_type_converters.h"
10 #include "mojo/converters/input_events/input_events_type_converters.h" 10 #include "mojo/converters/input_events/input_events_type_converters.h"
11 #include "mojo/public/cpp/application/application_connection.h" 11 #include "mojo/public/cpp/application/application_connection.h"
12 #include "mojo/public/interfaces/application/service_provider.mojom.h" 12 #include "mojo/public/interfaces/application/service_provider.mojom.h"
13 #include "mojo/services/view_manager/client_connection.h"
13 #include "mojo/services/view_manager/connection_manager_delegate.h" 14 #include "mojo/services/view_manager/connection_manager_delegate.h"
14 #include "mojo/services/view_manager/view_manager_service_impl.h" 15 #include "mojo/services/view_manager/view_manager_service_impl.h"
15 16
16 namespace mojo { 17 namespace mojo {
17 namespace service { 18 namespace service {
18 19
19 class WindowManagerInternalClientImpl 20 class WindowManagerInternalClientImpl
20 : public InterfaceImpl<WindowManagerInternalClient> { 21 : public InterfaceImpl<WindowManagerInternalClient> {
21 public: 22 public:
22 WindowManagerInternalClientImpl(WindowManagerInternalClient* real_client, 23 explicit WindowManagerInternalClientImpl(
23 ErrorHandler* error_handler) 24 WindowManagerInternalClient* real_client)
24 : real_client_(real_client), error_handler_(error_handler) {} 25 : real_client_(real_client) {}
25 ~WindowManagerInternalClientImpl() override {} 26 ~WindowManagerInternalClientImpl() override {}
26 27
27 // WindowManagerInternalClient: 28 // WindowManagerInternalClient:
28 void DispatchInputEventToView(Id transport_view_id, EventPtr event) override { 29 void DispatchInputEventToView(Id transport_view_id, EventPtr event) override {
29 real_client_->DispatchInputEventToView(transport_view_id, event.Pass()); 30 real_client_->DispatchInputEventToView(transport_view_id, event.Pass());
30 } 31 }
31 32
32 void SetViewportSize(SizePtr size) override { 33 void SetViewportSize(SizePtr size) override {
33 real_client_->SetViewportSize(size.Pass()); 34 real_client_->SetViewportSize(size.Pass());
34 } 35 }
35 36
36 // InterfaceImpl: 37 // TODO(sky): ErrorHandling temporarily nuked. Will be fixed shortly.
37 void OnConnectionError() override { error_handler_->OnConnectionError(); }
38 38
39 private: 39 private:
40 WindowManagerInternalClient* real_client_; 40 WindowManagerInternalClient* real_client_;
41 ErrorHandler* error_handler_;
42 41
43 DISALLOW_COPY_AND_ASSIGN(WindowManagerInternalClientImpl); 42 DISALLOW_COPY_AND_ASSIGN(WindowManagerInternalClientImpl);
44 }; 43 };
45 44
46 ConnectionManager::ScopedChange::ScopedChange( 45 ConnectionManager::ScopedChange::ScopedChange(
47 ViewManagerServiceImpl* connection, 46 ViewManagerServiceImpl* connection,
48 ConnectionManager* connection_manager, 47 ConnectionManager* connection_manager,
49 bool is_delete_view) 48 bool is_delete_view)
50 : connection_manager_(connection_manager), 49 : connection_manager_(connection_manager),
51 connection_id_(connection->id()), 50 connection_id_(connection->id()),
52 is_delete_view_(is_delete_view) { 51 is_delete_view_(is_delete_view) {
53 connection_manager_->PrepareForChange(this); 52 connection_manager_->PrepareForChange(this);
54 } 53 }
55 54
56 ConnectionManager::ScopedChange::~ScopedChange() { 55 ConnectionManager::ScopedChange::~ScopedChange() {
57 connection_manager_->FinishChange(); 56 connection_manager_->FinishChange();
58 } 57 }
59 58
60 ConnectionManager::ConnectionManager(ApplicationConnection* app_connection, 59 ConnectionManager::ConnectionManager(ApplicationConnection* app_connection,
61 ConnectionManagerDelegate* delegate) 60 ConnectionManagerDelegate* delegate)
62 : app_connection_(app_connection), 61 : app_connection_(app_connection),
63 delegate_(delegate), 62 delegate_(delegate),
64 window_manager_vm_service_(nullptr), 63 window_manager_client_connection_(nullptr),
65 next_connection_id_(1), 64 next_connection_id_(1),
66 display_manager_( 65 display_manager_(
67 app_connection, 66 app_connection,
68 this, 67 this,
69 base::Bind(&ConnectionManagerDelegate::OnNativeViewportDestroyed, 68 base::Bind(&ConnectionManagerDelegate::OnNativeViewportDestroyed,
70 base::Unretained(delegate))), 69 base::Unretained(delegate))),
71 root_(new ServerView(this, RootViewId())), 70 root_(new ServerView(this, RootViewId())),
72 current_change_(NULL), 71 current_change_(NULL),
73 in_destructor_(false) { 72 in_destructor_(false) {
74 // |app_connection| originates from the WindowManager. Let it connect 73 // |app_connection| originates from the WindowManager. Let it connect
(...skipping 14 matching lines...) Expand all
89 DCHECK(connection_map_.empty()); 88 DCHECK(connection_map_.empty());
90 root_.reset(); 89 root_.reset();
91 } 90 }
92 91
93 ConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() { 92 ConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() {
94 const ConnectionSpecificId id = next_connection_id_++; 93 const ConnectionSpecificId id = next_connection_id_++;
95 DCHECK_LT(id, next_connection_id_); 94 DCHECK_LT(id, next_connection_id_);
96 return id; 95 return id;
97 } 96 }
98 97
99 void ConnectionManager::OnConnectionError(ViewManagerServiceImpl* connection) { 98 void ConnectionManager::OnConnectionError(ClientConnection* connection) {
100 if (connection == window_manager_vm_service_) { 99 if (connection == window_manager_client_connection_) {
101 window_manager_vm_service_ = nullptr; 100 window_manager_client_connection_ = nullptr;
102 delegate_->OnLostConnectionToWindowManager(); 101 delegate_->OnLostConnectionToWindowManager();
103 // Assume we've been destroyed. 102 // Assume we've been destroyed.
104 return; 103 return;
105 } 104 }
106 105
107 scoped_ptr<ViewManagerServiceImpl> connection_owner(connection); 106 scoped_ptr<ClientConnection> connection_owner(connection);
108 107
109 connection_map_.erase(connection->id()); 108 connection_map_.erase(connection->service()->id());
110 109
111 // Notify remaining connections so that they can cleanup. 110 // Notify remaining connections so that they can cleanup.
112 for (ConnectionMap::const_iterator i = connection_map_.begin(); 111 for (auto& pair : connection_map_) {
113 i != connection_map_.end(); 112 pair.second->service()->OnWillDestroyViewManagerServiceImpl(
114 ++i) { 113 connection->service());
115 i->second->OnWillDestroyViewManagerServiceImpl(connection);
116 } 114 }
117 } 115 }
118 116
119 void ConnectionManager::EmbedAtView( 117 void ConnectionManager::EmbedAtView(
120 ConnectionSpecificId creator_id, 118 ConnectionSpecificId creator_id,
121 const String& url, 119 const String& url,
122 Id transport_view_id, 120 Id transport_view_id,
123 InterfaceRequest<ServiceProvider> service_provider) { 121 InterfaceRequest<ServiceProvider> service_provider) {
122 std::string creator_url;
123 ConnectionMap::const_iterator it = connection_map_.find(creator_id);
124 if (it != connection_map_.end())
125 creator_url = it->second->service()->url();
126
124 MessagePipe pipe; 127 MessagePipe pipe;
125 128
126 ServiceProvider* view_manager_service_provider = 129 ServiceProvider* view_manager_service_provider =
127 app_connection_->ConnectToApplication(url)->GetServiceProvider(); 130 app_connection_->ConnectToApplication(url)->GetServiceProvider();
128
129 view_manager_service_provider->ConnectToService( 131 view_manager_service_provider->ConnectToService(
130 ViewManagerServiceImpl::Client::Name_, pipe.handle1.Pass()); 132 ViewManagerServiceImpl::Client::Name_, pipe.handle1.Pass());
131 133 scoped_ptr<ViewManagerServiceImpl> service(
132 std::string creator_url; 134 new ViewManagerServiceImpl(this, creator_id, creator_url, url,
133 ConnectionMap::const_iterator it = connection_map_.find(creator_id); 135 ViewIdFromTransportId(transport_view_id)));
134 if (it != connection_map_.end()) 136 DefaultClientConnection* client_connection =
135 creator_url = it->second->url(); 137 new DefaultClientConnection(this, service.Pass());
136 138 client_connection->binding()->Bind(pipe.handle0.Pass());
137 ViewManagerServiceImpl* connection = 139 client_connection->SetClient();
138 new ViewManagerServiceImpl(this, 140 AddConnection(client_connection);
139 creator_id, 141 client_connection->service()->Init(client_connection->client(),
140 creator_url, 142 service_provider.Pass());
141 url.To<std::string>(), 143 OnConnectionMessagedClient(client_connection->service()->id());
142 ViewIdFromTransportId(transport_view_id));
143 AddConnection(connection);
144 WeakBindToPipe(connection, pipe.handle0.Pass());
145 connection->Init(service_provider.Pass());
146 OnConnectionMessagedClient(connection->id());
147 } 144 }
148 145
149 ViewManagerServiceImpl* ConnectionManager::GetConnection( 146 ViewManagerServiceImpl* ConnectionManager::GetConnection(
150 ConnectionSpecificId connection_id) { 147 ConnectionSpecificId connection_id) {
151 ConnectionMap::iterator i = connection_map_.find(connection_id); 148 ConnectionMap::iterator i = connection_map_.find(connection_id);
152 return i == connection_map_.end() ? NULL : i->second; 149 return i == connection_map_.end() ? nullptr : i->second->service();
153 } 150 }
154 151
155 ServerView* ConnectionManager::GetView(const ViewId& id) { 152 ServerView* ConnectionManager::GetView(const ViewId& id) {
156 if (id == root_->id()) 153 if (id == root_->id())
157 return root_.get(); 154 return root_.get();
158 ConnectionMap::iterator i = connection_map_.find(id.connection_id); 155 ViewManagerServiceImpl* service = GetConnection(id.connection_id);
159 return i == connection_map_.end() ? NULL : i->second->GetView(id); 156 return service ? service->GetView(id) : nullptr;
160 } 157 }
161 158
162 void ConnectionManager::OnConnectionMessagedClient(ConnectionSpecificId id) { 159 void ConnectionManager::OnConnectionMessagedClient(ConnectionSpecificId id) {
163 if (current_change_) 160 if (current_change_)
164 current_change_->MarkConnectionAsMessaged(id); 161 current_change_->MarkConnectionAsMessaged(id);
165 } 162 }
166 163
167 bool ConnectionManager::DidConnectionMessageClient( 164 bool ConnectionManager::DidConnectionMessageClient(
168 ConnectionSpecificId id) const { 165 ConnectionSpecificId id) const {
169 return current_change_ && current_change_->DidMessageConnection(id); 166 return current_change_ && current_change_->DidMessageConnection(id);
170 } 167 }
171 168
172 const ViewManagerServiceImpl* ConnectionManager::GetConnectionWithRoot( 169 const ViewManagerServiceImpl* ConnectionManager::GetConnectionWithRoot(
173 const ViewId& id) const { 170 const ViewId& id) const {
174 for (ConnectionMap::const_iterator i = connection_map_.begin(); 171 for (auto& pair : connection_map_) {
175 i != connection_map_.end(); 172 if (pair.second->service()->IsRoot(id))
176 ++i) { 173 return pair.second->service();
177 if (i->second->IsRoot(id))
178 return i->second;
179 } 174 }
180 return NULL; 175 return nullptr;
181 } 176 }
182 177
183 void ConnectionManager::ProcessViewBoundsChanged(const ServerView* view, 178 void ConnectionManager::ProcessViewBoundsChanged(const ServerView* view,
184 const gfx::Rect& old_bounds, 179 const gfx::Rect& old_bounds,
185 const gfx::Rect& new_bounds) { 180 const gfx::Rect& new_bounds) {
186 for (ConnectionMap::iterator i = connection_map_.begin(); 181 for (auto& pair : connection_map_) {
187 i != connection_map_.end(); 182 pair.second->service()->ProcessViewBoundsChanged(
188 ++i) { 183 view, old_bounds, new_bounds, IsChangeSource(pair.first));
189 i->second->ProcessViewBoundsChanged(
190 view, old_bounds, new_bounds, IsChangeSource(i->first));
191 } 184 }
192 } 185 }
193 186
194 void ConnectionManager::ProcessWillChangeViewHierarchy( 187 void ConnectionManager::ProcessWillChangeViewHierarchy(
195 const ServerView* view, 188 const ServerView* view,
196 const ServerView* new_parent, 189 const ServerView* new_parent,
197 const ServerView* old_parent) { 190 const ServerView* old_parent) {
198 for (ConnectionMap::iterator i = connection_map_.begin(); 191 for (auto& pair : connection_map_) {
199 i != connection_map_.end(); 192 pair.second->service()->ProcessWillChangeViewHierarchy(
200 ++i) { 193 view, new_parent, old_parent, IsChangeSource(pair.first));
201 i->second->ProcessWillChangeViewHierarchy(
202 view, new_parent, old_parent, IsChangeSource(i->first));
203 } 194 }
204 } 195 }
205 196
206 void ConnectionManager::ProcessViewHierarchyChanged( 197 void ConnectionManager::ProcessViewHierarchyChanged(
207 const ServerView* view, 198 const ServerView* view,
208 const ServerView* new_parent, 199 const ServerView* new_parent,
209 const ServerView* old_parent) { 200 const ServerView* old_parent) {
210 for (ConnectionMap::iterator i = connection_map_.begin(); 201 for (auto& pair : connection_map_) {
211 i != connection_map_.end(); 202 pair.second->service()->ProcessViewHierarchyChanged(
212 ++i) { 203 view, new_parent, old_parent, IsChangeSource(pair.first));
213 i->second->ProcessViewHierarchyChanged(
214 view, new_parent, old_parent, IsChangeSource(i->first));
215 } 204 }
216 } 205 }
217 206
218 void ConnectionManager::ProcessViewReorder(const ServerView* view, 207 void ConnectionManager::ProcessViewReorder(const ServerView* view,
219 const ServerView* relative_view, 208 const ServerView* relative_view,
220 const OrderDirection direction) { 209 const OrderDirection direction) {
221 for (ConnectionMap::iterator i = connection_map_.begin(); 210 for (auto& pair : connection_map_) {
222 i != connection_map_.end(); 211 pair.second->service()->ProcessViewReorder(view, relative_view, direction,
223 ++i) { 212 IsChangeSource(pair.first));
224 i->second->ProcessViewReorder(
225 view, relative_view, direction, IsChangeSource(i->first));
226 } 213 }
227 } 214 }
228 215
229 void ConnectionManager::ProcessViewDeleted(const ViewId& view) { 216 void ConnectionManager::ProcessViewDeleted(const ViewId& view) {
230 for (ConnectionMap::iterator i = connection_map_.begin(); 217 for (auto& pair : connection_map_) {
231 i != connection_map_.end(); 218 pair.second->service()->ProcessViewDeleted(view,
232 ++i) { 219 IsChangeSource(pair.first));
233 i->second->ProcessViewDeleted(view, IsChangeSource(i->first));
234 } 220 }
235 } 221 }
236 222
237 void ConnectionManager::PrepareForChange(ScopedChange* change) { 223 void ConnectionManager::PrepareForChange(ScopedChange* change) {
238 // Should only ever have one change in flight. 224 // Should only ever have one change in flight.
239 CHECK(!current_change_); 225 CHECK(!current_change_);
240 current_change_ = change; 226 current_change_ = change;
241 } 227 }
242 228
243 void ConnectionManager::FinishChange() { 229 void ConnectionManager::FinishChange() {
244 // PrepareForChange/FinishChange should be balanced. 230 // PrepareForChange/FinishChange should be balanced.
245 CHECK(current_change_); 231 CHECK(current_change_);
246 current_change_ = NULL; 232 current_change_ = NULL;
247 } 233 }
248 234
249 void ConnectionManager::AddConnection(ViewManagerServiceImpl* connection) { 235 void ConnectionManager::AddConnection(ClientConnection* connection) {
250 DCHECK_EQ(0u, connection_map_.count(connection->id())); 236 DCHECK_EQ(0u, connection_map_.count(connection->service()->id()));
251 connection_map_[connection->id()] = connection; 237 connection_map_[connection->service()->id()] = connection;
252 } 238 }
253 239
254 void ConnectionManager::OnViewDestroyed(const ServerView* view) { 240 void ConnectionManager::OnViewDestroyed(const ServerView* view) {
255 if (!in_destructor_) 241 if (!in_destructor_)
256 ProcessViewDeleted(view->id()); 242 ProcessViewDeleted(view->id());
257 } 243 }
258 244
259 void ConnectionManager::OnWillChangeViewHierarchy( 245 void ConnectionManager::OnWillChangeViewHierarchy(
260 const ServerView* view, 246 const ServerView* view,
261 const ServerView* new_parent, 247 const ServerView* new_parent,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 const ServerView* relative, 293 const ServerView* relative,
308 OrderDirection direction) { 294 OrderDirection direction) {
309 if (!in_destructor_) 295 if (!in_destructor_)
310 display_manager_.SchedulePaint(view, gfx::Rect(view->bounds().size())); 296 display_manager_.SchedulePaint(view, gfx::Rect(view->bounds().size()));
311 } 297 }
312 298
313 void ConnectionManager::OnWillChangeViewVisibility(const ServerView* view) { 299 void ConnectionManager::OnWillChangeViewVisibility(const ServerView* view) {
314 if (in_destructor_) 300 if (in_destructor_)
315 return; 301 return;
316 302
317 for (ConnectionMap::iterator i = connection_map_.begin(); 303 for (auto& pair : connection_map_) {
318 i != connection_map_.end(); 304 pair.second->service()->ProcessWillChangeViewVisibility(
319 ++i) { 305 view, IsChangeSource(pair.first));
320 i->second->ProcessWillChangeViewVisibility(view, IsChangeSource(i->first));
321 } 306 }
322 } 307 }
323 308
324 void ConnectionManager::OnViewPropertyChanged( 309 void ConnectionManager::OnViewPropertyChanged(
325 const ServerView* view, 310 const ServerView* view,
326 const std::string& name, 311 const std::string& name,
327 const std::vector<uint8_t>* new_data) { 312 const std::vector<uint8_t>* new_data) {
328 for (auto& pair : connection_map_) { 313 for (auto& pair : connection_map_) {
329 pair.second->ProcessViewPropertyChanged( 314 pair.second->service()->ProcessViewPropertyChanged(
330 view, name, new_data, IsChangeSource(pair.first)); 315 view, name, new_data, IsChangeSource(pair.first));
331 } 316 }
332 } 317 }
333 318
334 void ConnectionManager::SetViewportSize(SizePtr size) { 319 void ConnectionManager::SetViewportSize(SizePtr size) {
335 gfx::Size new_size = size.To<gfx::Size>(); 320 gfx::Size new_size = size.To<gfx::Size>();
336 display_manager_.SetViewportSize(new_size); 321 display_manager_.SetViewportSize(new_size);
337 } 322 }
338 323
339 void ConnectionManager::DispatchInputEventToView(Id transport_view_id, 324 void ConnectionManager::DispatchInputEventToView(Id transport_view_id,
340 EventPtr event) { 325 EventPtr event) {
341 const ViewId view_id(ViewIdFromTransportId(transport_view_id)); 326 const ViewId view_id(ViewIdFromTransportId(transport_view_id));
342 327
343 ViewManagerServiceImpl* connection = GetConnectionWithRoot(view_id); 328 ViewManagerServiceImpl* connection = GetConnectionWithRoot(view_id);
344 if (!connection) 329 if (!connection)
345 connection = GetConnection(view_id.connection_id); 330 connection = GetConnection(view_id.connection_id);
346 if (connection) { 331 if (connection) {
347 connection->client()->OnViewInputEvent( 332 connection->client()->OnViewInputEvent(
348 transport_view_id, event.Pass(), base::Bind(&base::DoNothing)); 333 transport_view_id, event.Pass(), base::Bind(&base::DoNothing));
349 } 334 }
350 } 335 }
351 336
352 void ConnectionManager::Create(ApplicationConnection* connection, 337 void ConnectionManager::Create(ApplicationConnection* connection,
353 InterfaceRequest<ViewManagerService> request) { 338 InterfaceRequest<ViewManagerService> request) {
354 if (window_manager_vm_service_) { 339 if (window_manager_client_connection_) {
355 VLOG(1) << "ViewManager interface requested more than once."; 340 VLOG(1) << "ViewManager interface requested more than once.";
356 return; 341 return;
357 } 342 }
358 343
359 window_manager_vm_service_ = 344 scoped_ptr<ViewManagerServiceImpl> service(new ViewManagerServiceImpl(
360 new ViewManagerServiceImpl(this, 345 this, kInvalidConnectionId, std::string(),
361 kInvalidConnectionId, 346 std::string("mojo:window_manager"), RootViewId()));
362 std::string(), 347 DefaultClientConnection* client_connection =
363 std::string("mojo:window_manager"), 348 new DefaultClientConnection(this, service.Pass());
364 RootViewId()); 349 client_connection->binding()->Bind(request.Pass());
365 AddConnection(window_manager_vm_service_); 350 client_connection->SetClient();
366 WeakBindToRequest(window_manager_vm_service_, &request); 351 window_manager_client_connection_ = client_connection;
367 window_manager_vm_service_->Init(InterfaceRequest<ServiceProvider>()); 352 AddConnection(window_manager_client_connection_);
353 window_manager_client_connection_->service()->Init(
354 window_manager_client_connection_->client(),
355 InterfaceRequest<ServiceProvider>());
368 } 356 }
369 357
370 void ConnectionManager::Create( 358 void ConnectionManager::Create(
371 ApplicationConnection* connection, 359 ApplicationConnection* connection,
372 InterfaceRequest<WindowManagerInternalClient> request) { 360 InterfaceRequest<WindowManagerInternalClient> request) {
373 if (wm_internal_client_impl_.get()) { 361 if (wm_internal_client_impl_.get()) {
374 VLOG(1) << "WindowManagerInternalClient requested more than once."; 362 VLOG(1) << "WindowManagerInternalClient requested more than once.";
375 return; 363 return;
376 } 364 }
377 365
378 wm_internal_client_impl_.reset( 366 wm_internal_client_impl_.reset(new WindowManagerInternalClientImpl(this));
379 new WindowManagerInternalClientImpl(this, this));
380 WeakBindToRequest(wm_internal_client_impl_.get(), &request); 367 WeakBindToRequest(wm_internal_client_impl_.get(), &request);
381 } 368 }
382 369
383 void ConnectionManager::OnConnectionError() {
384 delegate_->OnLostConnectionToWindowManager();
385 }
386
387 } // namespace service 370 } // namespace service
388 } // namespace mojo 371 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698