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 "components/view_manager/connection_manager.h" | 5 #include "components/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 "components/view_manager/client_connection.h" | 9 #include "components/view_manager/client_connection.h" |
10 #include "components/view_manager/connection_manager_delegate.h" | 10 #include "components/view_manager/connection_manager_delegate.h" |
11 #include "components/view_manager/focus_controller.h" | 11 #include "components/view_manager/focus_controller.h" |
12 #include "components/view_manager/server_view.h" | 12 #include "components/view_manager/server_view.h" |
13 #include "components/view_manager/view_coordinate_conversions.h" | 13 #include "components/view_manager/view_coordinate_conversions.h" |
14 #include "components/view_manager/view_manager_root_connection.h" | 14 #include "components/view_manager/view_manager_root_connection.h" |
15 #include "components/view_manager/view_manager_service_impl.h" | 15 #include "components/view_manager/view_tree_impl.h" |
16 #include "mojo/application/public/cpp/application_connection.h" | 16 #include "mojo/application/public/cpp/application_connection.h" |
17 #include "mojo/converters/geometry/geometry_type_converters.h" | 17 #include "mojo/converters/geometry/geometry_type_converters.h" |
18 #include "mojo/converters/input_events/input_events_type_converters.h" | 18 #include "mojo/converters/input_events/input_events_type_converters.h" |
19 | 19 |
20 using mojo::ConnectionSpecificId; | 20 using mojo::ConnectionSpecificId; |
21 | 21 |
22 namespace view_manager { | 22 namespace view_manager { |
23 namespace { | 23 namespace { |
24 | 24 |
25 // Creates a copy of |view|. The copied view has |delegate| as its delegate. | 25 // Creates a copy of |view|. The copied view has |delegate| as its delegate. |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 for (ServerView* child : view->GetChildren()) { | 90 for (ServerView* child : view->GetChildren()) { |
91 if (DecrementAnimatingViewsOpacity(child)) | 91 if (DecrementAnimatingViewsOpacity(child)) |
92 ret_value = true; | 92 ret_value = true; |
93 } | 93 } |
94 return ret_value; | 94 return ret_value; |
95 } | 95 } |
96 | 96 |
97 } // namespace | 97 } // namespace |
98 | 98 |
99 ConnectionManager::ScopedChange::ScopedChange( | 99 ConnectionManager::ScopedChange::ScopedChange( |
100 ViewManagerServiceImpl* connection, | 100 ViewTreeImpl* connection, |
101 ConnectionManager* connection_manager, | 101 ConnectionManager* connection_manager, |
102 bool is_delete_view) | 102 bool is_delete_view) |
103 : connection_manager_(connection_manager), | 103 : connection_manager_(connection_manager), |
104 connection_id_(connection->id()), | 104 connection_id_(connection->id()), |
105 is_delete_view_(is_delete_view) { | 105 is_delete_view_(is_delete_view) { |
106 connection_manager_->PrepareForChange(this); | 106 connection_manager_->PrepareForChange(this); |
107 } | 107 } |
108 | 108 |
109 ConnectionManager::ScopedChange::~ScopedChange() { | 109 ConnectionManager::ScopedChange::~ScopedChange() { |
110 connection_manager_->FinishChange(); | 110 connection_manager_->FinishChange(); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 const uint16_t id = next_root_id_++; | 164 const uint16_t id = next_root_id_++; |
165 DCHECK_LT(id, next_root_id_); | 165 DCHECK_LT(id, next_root_id_); |
166 return id; | 166 return id; |
167 } | 167 } |
168 | 168 |
169 void ConnectionManager::OnConnectionError(ClientConnection* connection) { | 169 void ConnectionManager::OnConnectionError(ClientConnection* connection) { |
170 // This will be null if the root has been destroyed. | 170 // This will be null if the root has been destroyed. |
171 const ViewId* view_id = connection->service()->root(); | 171 const ViewId* view_id = connection->service()->root(); |
172 ServerView* view = | 172 ServerView* view = |
173 view_id ? GetView(*connection->service()->root()) : nullptr; | 173 view_id ? GetView(*connection->service()->root()) : nullptr; |
174 // If the ViewManagerService root is a viewport root, then we'll wait until | 174 // If the ViewTree root is a viewport root, then we'll wait until |
175 // the root connection goes away to cleanup. | 175 // the root connection goes away to cleanup. |
176 if (view && (GetRootView(view) == view)) | 176 if (view && (GetRootView(view) == view)) |
177 return; | 177 return; |
178 | 178 |
179 scoped_ptr<ClientConnection> connection_owner(connection); | 179 scoped_ptr<ClientConnection> connection_owner(connection); |
180 | 180 |
181 connection_map_.erase(connection->service()->id()); | 181 connection_map_.erase(connection->service()->id()); |
182 | 182 |
183 // TODO(sky): I may want to advance focus differently if focus is in | 183 // TODO(sky): I may want to advance focus differently if focus is in |
184 // |connection|. | 184 // |connection|. |
185 | 185 |
186 // Notify remaining connections so that they can cleanup. | 186 // Notify remaining connections so that they can cleanup. |
187 for (auto& pair : connection_map_) { | 187 for (auto& pair : connection_map_) { |
188 pair.second->service()->OnWillDestroyViewManagerServiceImpl( | 188 pair.second->service()->OnWillDestroyViewTreeImpl( |
189 connection->service()); | 189 connection->service()); |
190 } | 190 } |
191 } | 191 } |
192 | 192 |
193 void ConnectionManager::OnRootConnectionClosed( | 193 void ConnectionManager::OnRootConnectionClosed( |
194 ViewManagerRootConnection* connection) { | 194 ViewManagerRootConnection* connection) { |
195 auto it = root_connection_map_.find(connection->view_manager_root()); | 195 auto it = root_connection_map_.find(connection->view_manager_root()); |
196 DCHECK(it != root_connection_map_.end()); | 196 DCHECK(it != root_connection_map_.end()); |
197 | 197 |
198 // Clear focus if the focused view is in this viewport. | 198 // Clear focus if the focused view is in this viewport. |
199 if (GetRootView(GetFocusedView()) == it->first->root_view()) | 199 if (GetRootView(GetFocusedView()) == it->first->root_view()) |
200 SetFocusedView(nullptr); | 200 SetFocusedView(nullptr); |
201 | 201 |
202 // Get the ClientConnection by ViewManagerServiceImpl ID. | 202 // Get the ClientConnection by ViewTreeImpl ID. |
203 ConnectionMap::iterator service_connection_it = | 203 ConnectionMap::iterator service_connection_it = |
204 connection_map_.find(it->first->GetViewManagerService()->id()); | 204 connection_map_.find(it->first->GetViewTree()->id()); |
205 DCHECK(service_connection_it != connection_map_.end()); | 205 DCHECK(service_connection_it != connection_map_.end()); |
206 | 206 |
207 // Tear down the associated ViewManagerService connection. | 207 // Tear down the associated ViewTree connection. |
208 // TODO(fsamuel): I don't think this is quite right, we should tear down all | 208 // TODO(fsamuel): I don't think this is quite right, we should tear down all |
209 // connections within the root's viewport. We should probably employ an | 209 // connections within the root's viewport. We should probably employ an |
210 // observer pattern to do this. Each ViewManagerServiceImpl should track its | 210 // observer pattern to do this. Each ViewTreeImpl should track its |
211 // parent's lifetime. | 211 // parent's lifetime. |
212 root_connection_map_.erase(it); | 212 root_connection_map_.erase(it); |
213 OnConnectionError(service_connection_it->second); | 213 OnConnectionError(service_connection_it->second); |
214 | 214 |
215 // If we have no more roots left, let the app know so it can terminate. | 215 // If we have no more roots left, let the app know so it can terminate. |
216 if (!root_connection_map_.size()) | 216 if (!root_connection_map_.size()) |
217 delegate_->OnNoMoreRootConnections(); | 217 delegate_->OnNoMoreRootConnections(); |
218 } | 218 } |
219 | 219 |
220 void ConnectionManager::EmbedAtView(mojo::ConnectionSpecificId creator_id, | 220 void ConnectionManager::EmbedAtView(mojo::ConnectionSpecificId creator_id, |
221 const ViewId& view_id, | 221 const ViewId& view_id, |
222 mojo::URLRequestPtr request) { | 222 mojo::URLRequestPtr request) { |
223 mojo::ViewManagerServicePtr service_ptr; | 223 mojo::ViewTreePtr service_ptr; |
224 ClientConnection* client_connection = | 224 ClientConnection* client_connection = |
225 delegate_->CreateClientConnectionForEmbedAtView( | 225 delegate_->CreateClientConnectionForEmbedAtView( |
226 this, GetProxy(&service_ptr), creator_id, request.Pass(), view_id); | 226 this, GetProxy(&service_ptr), creator_id, request.Pass(), view_id); |
227 AddConnection(client_connection); | 227 AddConnection(client_connection); |
228 client_connection->service()->Init(client_connection->client(), | 228 client_connection->service()->Init(client_connection->client(), |
229 service_ptr.Pass()); | 229 service_ptr.Pass()); |
230 OnConnectionMessagedClient(client_connection->service()->id()); | 230 OnConnectionMessagedClient(client_connection->service()->id()); |
231 } | 231 } |
232 | 232 |
233 ViewManagerServiceImpl* ConnectionManager::EmbedAtView( | 233 ViewTreeImpl* ConnectionManager::EmbedAtView( |
234 mojo::ConnectionSpecificId creator_id, | 234 mojo::ConnectionSpecificId creator_id, |
235 const ViewId& view_id, | 235 const ViewId& view_id, |
236 mojo::ViewManagerClientPtr client) { | 236 mojo::ViewTreeClientPtr client) { |
237 mojo::ViewManagerServicePtr service_ptr; | 237 mojo::ViewTreePtr service_ptr; |
238 ClientConnection* client_connection = | 238 ClientConnection* client_connection = |
239 delegate_->CreateClientConnectionForEmbedAtView( | 239 delegate_->CreateClientConnectionForEmbedAtView( |
240 this, GetProxy(&service_ptr), creator_id, view_id, client.Pass()); | 240 this, GetProxy(&service_ptr), creator_id, view_id, client.Pass()); |
241 AddConnection(client_connection); | 241 AddConnection(client_connection); |
242 client_connection->service()->Init(client_connection->client(), | 242 client_connection->service()->Init(client_connection->client(), |
243 service_ptr.Pass()); | 243 service_ptr.Pass()); |
244 OnConnectionMessagedClient(client_connection->service()->id()); | 244 OnConnectionMessagedClient(client_connection->service()->id()); |
245 | 245 |
246 return client_connection->service(); | 246 return client_connection->service(); |
247 } | 247 } |
248 | 248 |
249 void ConnectionManager::OnAccelerator(ServerView* root, mojo::EventPtr event) { | 249 void ConnectionManager::OnAccelerator(ServerView* root, mojo::EventPtr event) { |
250 for (auto& pair : root_connection_map_) { | 250 for (auto& pair : root_connection_map_) { |
251 if (root == pair.first->root_view()) { | 251 if (root == pair.first->root_view()) { |
252 pair.first->client()->OnAccelerator(event.Pass()); | 252 pair.first->client()->OnAccelerator(event.Pass()); |
253 return; | 253 return; |
254 } | 254 } |
255 } | 255 } |
256 } | 256 } |
257 | 257 |
258 ViewManagerServiceImpl* ConnectionManager::GetConnection( | 258 ViewTreeImpl* ConnectionManager::GetConnection( |
259 ConnectionSpecificId connection_id) { | 259 ConnectionSpecificId connection_id) { |
260 ConnectionMap::iterator i = connection_map_.find(connection_id); | 260 ConnectionMap::iterator i = connection_map_.find(connection_id); |
261 return i == connection_map_.end() ? nullptr : i->second->service(); | 261 return i == connection_map_.end() ? nullptr : i->second->service(); |
262 } | 262 } |
263 | 263 |
264 ServerView* ConnectionManager::GetView(const ViewId& id) { | 264 ServerView* ConnectionManager::GetView(const ViewId& id) { |
265 for (auto& pair : root_connection_map_) { | 265 for (auto& pair : root_connection_map_) { |
266 if (pair.first->root_view()->id() == id) | 266 if (pair.first->root_view()->id() == id) |
267 return pair.first->root_view(); | 267 return pair.first->root_view(); |
268 } | 268 } |
269 ViewManagerServiceImpl* service = GetConnection(id.connection_id); | 269 ViewTreeImpl* service = GetConnection(id.connection_id); |
270 return service ? service->GetView(id) : nullptr; | 270 return service ? service->GetView(id) : nullptr; |
271 } | 271 } |
272 | 272 |
273 void ConnectionManager::SetFocusedView(ServerView* view) { | 273 void ConnectionManager::SetFocusedView(ServerView* view) { |
274 if (!focus_controller_) | 274 if (!focus_controller_) |
275 return; | 275 return; |
276 ServerView* old_focused = GetFocusedView(); | 276 ServerView* old_focused = GetFocusedView(); |
277 if (old_focused == view) | 277 if (old_focused == view) |
278 return; | 278 return; |
279 focus_controller_->SetFocusedView(view); | 279 focus_controller_->SetFocusedView(view); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 return view_manager_root->GetViewportMetrics().Clone(); | 319 return view_manager_root->GetViewportMetrics().Clone(); |
320 | 320 |
321 if (!root_connection_map_.empty()) | 321 if (!root_connection_map_.empty()) |
322 return root_connection_map_.begin()->first->GetViewportMetrics().Clone(); | 322 return root_connection_map_.begin()->first->GetViewportMetrics().Clone(); |
323 | 323 |
324 mojo::ViewportMetricsPtr metrics = mojo::ViewportMetrics::New(); | 324 mojo::ViewportMetricsPtr metrics = mojo::ViewportMetrics::New(); |
325 metrics->size_in_pixels = mojo::Size::New(); | 325 metrics->size_in_pixels = mojo::Size::New(); |
326 return metrics.Pass(); | 326 return metrics.Pass(); |
327 } | 327 } |
328 | 328 |
329 const ViewManagerServiceImpl* ConnectionManager::GetConnectionWithRoot( | 329 const ViewTreeImpl* ConnectionManager::GetConnectionWithRoot( |
330 const ViewId& id) const { | 330 const ViewId& id) const { |
331 for (auto& pair : connection_map_) { | 331 for (auto& pair : connection_map_) { |
332 if (pair.second->service()->IsRoot(id)) | 332 if (pair.second->service()->IsRoot(id)) |
333 return pair.second->service(); | 333 return pair.second->service(); |
334 } | 334 } |
335 return nullptr; | 335 return nullptr; |
336 } | 336 } |
337 | 337 |
338 ViewManagerServiceImpl* ConnectionManager::GetEmbedRoot( | 338 ViewTreeImpl* ConnectionManager::GetEmbedRoot(ViewTreeImpl* service) { |
339 ViewManagerServiceImpl* service) { | |
340 while (service) { | 339 while (service) { |
341 const ViewId* root_id = service->root(); | 340 const ViewId* root_id = service->root(); |
342 if (!root_id || root_id->connection_id == service->id()) | 341 if (!root_id || root_id->connection_id == service->id()) |
343 return nullptr; | 342 return nullptr; |
344 | 343 |
345 ViewManagerServiceImpl* parent_service = | 344 ViewTreeImpl* parent_service = GetConnection(root_id->connection_id); |
346 GetConnection(root_id->connection_id); | |
347 service = parent_service; | 345 service = parent_service; |
348 if (service && service->is_embed_root()) | 346 if (service && service->is_embed_root()) |
349 return service; | 347 return service; |
350 } | 348 } |
351 return nullptr; | 349 return nullptr; |
352 } | 350 } |
353 | 351 |
354 bool ConnectionManager::CloneAndAnimate(const ViewId& view_id) { | 352 bool ConnectionManager::CloneAndAnimate(const ViewId& view_id) { |
355 ServerView* view = GetView(view_id); | 353 ServerView* view = GetView(view_id); |
356 if (!view || !view->IsDrawn() || (view->GetRoot() == view)) | 354 if (!view || !view->IsDrawn() || (view->GetRoot() == view)) |
357 return false; | 355 return false; |
358 if (!animation_timer_.IsRunning()) { | 356 if (!animation_timer_.IsRunning()) { |
359 animation_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(100), | 357 animation_timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(100), |
360 this, &ConnectionManager::DoAnimation); | 358 this, &ConnectionManager::DoAnimation); |
361 } | 359 } |
362 ServerView* clone = CloneView(view, this); | 360 ServerView* clone = CloneView(view, this); |
363 CloneViewTree(view, clone, this); | 361 CloneViewTree(view, clone, this); |
364 view->parent()->Add(clone); | 362 view->parent()->Add(clone); |
365 view->parent()->Reorder(clone, view, mojo::ORDER_DIRECTION_ABOVE); | 363 view->parent()->Reorder(clone, view, mojo::ORDER_DIRECTION_ABOVE); |
366 return true; | 364 return true; |
367 } | 365 } |
368 | 366 |
369 void ConnectionManager::DispatchInputEventToView(const ServerView* view, | 367 void ConnectionManager::DispatchInputEventToView(const ServerView* view, |
370 mojo::EventPtr event) { | 368 mojo::EventPtr event) { |
371 // If the view is an embed root, forward to the embedded view, not the owner. | 369 // If the view is an embed root, forward to the embedded view, not the owner. |
372 ViewManagerServiceImpl* connection = GetConnectionWithRoot(view->id()); | 370 ViewTreeImpl* connection = GetConnectionWithRoot(view->id()); |
373 if (!connection) | 371 if (!connection) |
374 connection = GetConnection(view->id().connection_id); | 372 connection = GetConnection(view->id().connection_id); |
375 CHECK(connection); | 373 CHECK(connection); |
376 connection->client()->OnViewInputEvent(ViewIdToTransportId(view->id()), | 374 connection->client()->OnViewInputEvent(ViewIdToTransportId(view->id()), |
377 event.Pass(), | 375 event.Pass(), |
378 base::Bind(&base::DoNothing)); | 376 base::Bind(&base::DoNothing)); |
379 } | 377 } |
380 | 378 |
381 void ConnectionManager::OnEvent(ViewManagerRootImpl* root, | 379 void ConnectionManager::OnEvent(ViewManagerRootImpl* root, |
382 mojo::EventPtr event) { | 380 mojo::EventPtr event) { |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 | 648 |
651 void ConnectionManager::OnFocusChanged(ServerView* old_focused_view, | 649 void ConnectionManager::OnFocusChanged(ServerView* old_focused_view, |
652 ServerView* new_focused_view) { | 650 ServerView* new_focused_view) { |
653 // There are up to four connections that need to be notified: | 651 // There are up to four connections that need to be notified: |
654 // . the connection containing |old_focused_view|. | 652 // . the connection containing |old_focused_view|. |
655 // . the connection with |old_focused_view| as its root. | 653 // . the connection with |old_focused_view| as its root. |
656 // . the connection containing |new_focused_view|. | 654 // . the connection containing |new_focused_view|. |
657 // . the connection with |new_focused_view| as its root. | 655 // . the connection with |new_focused_view| as its root. |
658 // Some of these connections may be the same. The following takes care to | 656 // Some of these connections may be the same. The following takes care to |
659 // notify each only once. | 657 // notify each only once. |
660 ViewManagerServiceImpl* owning_connection_old = nullptr; | 658 ViewTreeImpl* owning_connection_old = nullptr; |
661 ViewManagerServiceImpl* embedded_connection_old = nullptr; | 659 ViewTreeImpl* embedded_connection_old = nullptr; |
662 | 660 |
663 if (old_focused_view) { | 661 if (old_focused_view) { |
664 owning_connection_old = GetConnection(old_focused_view->id().connection_id); | 662 owning_connection_old = GetConnection(old_focused_view->id().connection_id); |
665 if (owning_connection_old) { | 663 if (owning_connection_old) { |
666 owning_connection_old->ProcessFocusChanged(old_focused_view, | 664 owning_connection_old->ProcessFocusChanged(old_focused_view, |
667 new_focused_view); | 665 new_focused_view); |
668 } | 666 } |
669 embedded_connection_old = GetConnectionWithRoot(old_focused_view->id()); | 667 embedded_connection_old = GetConnectionWithRoot(old_focused_view->id()); |
670 if (embedded_connection_old) { | 668 if (embedded_connection_old) { |
671 DCHECK_NE(owning_connection_old, embedded_connection_old); | 669 DCHECK_NE(owning_connection_old, embedded_connection_old); |
672 embedded_connection_old->ProcessFocusChanged(old_focused_view, | 670 embedded_connection_old->ProcessFocusChanged(old_focused_view, |
673 new_focused_view); | 671 new_focused_view); |
674 } | 672 } |
675 } | 673 } |
676 ViewManagerServiceImpl* owning_connection_new = nullptr; | 674 ViewTreeImpl* owning_connection_new = nullptr; |
677 ViewManagerServiceImpl* embedded_connection_new = nullptr; | 675 ViewTreeImpl* embedded_connection_new = nullptr; |
678 if (new_focused_view) { | 676 if (new_focused_view) { |
679 owning_connection_new = GetConnection(new_focused_view->id().connection_id); | 677 owning_connection_new = GetConnection(new_focused_view->id().connection_id); |
680 if (owning_connection_new && | 678 if (owning_connection_new && |
681 owning_connection_new != owning_connection_old && | 679 owning_connection_new != owning_connection_old && |
682 owning_connection_new != embedded_connection_old) { | 680 owning_connection_new != embedded_connection_old) { |
683 owning_connection_new->ProcessFocusChanged(old_focused_view, | 681 owning_connection_new->ProcessFocusChanged(old_focused_view, |
684 new_focused_view); | 682 new_focused_view); |
685 } | 683 } |
686 embedded_connection_new = GetConnectionWithRoot(new_focused_view->id()); | 684 embedded_connection_new = GetConnectionWithRoot(new_focused_view->id()); |
687 if (embedded_connection_new && | 685 if (embedded_connection_new && |
688 embedded_connection_new != owning_connection_old && | 686 embedded_connection_new != owning_connection_old && |
689 embedded_connection_new != embedded_connection_old) { | 687 embedded_connection_new != embedded_connection_old) { |
690 DCHECK_NE(owning_connection_new, embedded_connection_new); | 688 DCHECK_NE(owning_connection_new, embedded_connection_new); |
691 embedded_connection_new->ProcessFocusChanged(old_focused_view, | 689 embedded_connection_new->ProcessFocusChanged(old_focused_view, |
692 new_focused_view); | 690 new_focused_view); |
693 } | 691 } |
694 } | 692 } |
695 | 693 |
696 for (auto& pair : root_connection_map_) { | 694 for (auto& pair : root_connection_map_) { |
697 ViewManagerServiceImpl* service = pair.first->GetViewManagerService(); | 695 ViewTreeImpl* service = pair.first->GetViewTree(); |
698 if (service != owning_connection_old && | 696 if (service != owning_connection_old && |
699 service != embedded_connection_old && | 697 service != embedded_connection_old && |
700 service != owning_connection_new && | 698 service != owning_connection_new && |
701 service != embedded_connection_new) { | 699 service != embedded_connection_new) { |
702 service->ProcessFocusChanged(old_focused_view, new_focused_view); | 700 service->ProcessFocusChanged(old_focused_view, new_focused_view); |
703 } | 701 } |
704 } | 702 } |
705 | 703 |
706 ViewManagerRootImpl* old_view_manager_root = | 704 ViewManagerRootImpl* old_view_manager_root = |
707 old_focused_view ? GetViewManagerRootByView(old_focused_view) : nullptr; | 705 old_focused_view ? GetViewManagerRootByView(old_focused_view) : nullptr; |
708 | 706 |
709 ViewManagerRootImpl* new_view_manager_root = | 707 ViewManagerRootImpl* new_view_manager_root = |
710 new_focused_view ? GetViewManagerRootByView(new_focused_view) : nullptr; | 708 new_focused_view ? GetViewManagerRootByView(new_focused_view) : nullptr; |
711 | 709 |
712 if (new_view_manager_root) { | 710 if (new_view_manager_root) { |
713 new_view_manager_root->UpdateTextInputState( | 711 new_view_manager_root->UpdateTextInputState( |
714 new_focused_view->text_input_state()); | 712 new_focused_view->text_input_state()); |
715 } else if (old_view_manager_root) { | 713 } else if (old_view_manager_root) { |
716 old_view_manager_root->UpdateTextInputState(ui::TextInputState()); | 714 old_view_manager_root->UpdateTextInputState(ui::TextInputState()); |
717 } | 715 } |
718 } | 716 } |
719 | 717 |
720 } // namespace view_manager | 718 } // namespace view_manager |
OLD | NEW |