11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/view_manager/connection_manager.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/application_connection.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/interfaces/application/service_provider.mojom.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/public/cpp/input_events/input_events_type_converters.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/view_manager/view_manager_service_impl.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace mojo { 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace service { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConnectionManager::ScopedChange::ScopedChange( 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewManagerServiceImpl* connection, 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionManager* connection_manager, 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_delete_view) 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : connection_manager_(connection_manager), 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection_id_(connection->id()), 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci is_delete_view_(is_delete_view) { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection_manager_->PrepareForChange(this); 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConnectionManager::ScopedChange::~ScopedChange() { 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection_manager_->FinishChange(); 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConnectionManager::ConnectionManager( 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ApplicationConnection* app_connection, 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const Callback<void()>& native_viewport_closed_callback) 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : app_connection_(app_connection), 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci next_connection_id_(1), 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_(app_connection, 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci this, 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci native_viewport_closed_callback), 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_(new ServerView(this, RootViewId())), 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_change_(NULL) { 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_->SetBounds(gfx::Rect(800, 600)); 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConnectionManager::~ConnectionManager() { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (!connections_created_by_connect_.empty()) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci delete *(connections_created_by_connect_.begin()); 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // All the connections should have been destroyed. 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(connection_map_.empty()); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_.reset(); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() { 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ConnectionSpecificId id = next_connection_id_++; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_LT(id, next_connection_id_); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return id; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::AddConnection(ViewManagerServiceImpl* connection) { 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_EQ(0u, connection_map_.count(connection->id())); 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection_map_[connection->id()] = connection; 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::RemoveConnection(ViewManagerServiceImpl* connection) { 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection_map_.erase(connection->id()); 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connections_created_by_connect_.erase(connection); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Notify remaining connections so that they can cleanup. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::const_iterator i = connection_map_.begin(); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->OnViewManagerServiceImplDestroyed(connection->id()); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::EmbedRoot( 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& url, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<ServiceProvider> service_provider) { 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (connection_map_.empty()) { 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EmbedImpl(kInvalidConnectionId, 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci String::From(url), 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RootViewId(), 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_provider.Pass()); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewManagerServiceImpl* connection = GetConnection(kWindowManagerConnection); 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->client()->Embed(url, service_provider.Pass()); 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::Embed( 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionSpecificId creator_id, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const String& url, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Id transport_view_id, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<ServiceProvider> service_provider) { 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EmbedImpl(creator_id, 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url, 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewIdFromTransportId(transport_view_id), 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_provider.Pass())->set_delete_on_connection_error(); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciViewManagerServiceImpl* ConnectionManager::GetConnection( 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionSpecificId connection_id) { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionMap::iterator i = connection_map_.find(connection_id); 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return i == connection_map_.end() ? NULL : i->second; 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciServerView* ConnectionManager::GetView(const ViewId& id) { 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (id == root_->id()) 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return root_.get(); 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionMap::iterator i = connection_map_.find(id.connection_id); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return i == connection_map_.end() ? NULL : i->second->GetView(id); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnConnectionMessagedClient(ConnectionSpecificId id) { 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (current_change_) 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_change_->MarkConnectionAsMessaged(id); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ConnectionManager::DidConnectionMessageClient( 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionSpecificId id) const { 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return current_change_ && current_change_->DidMessageConnection(id); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst ViewManagerServiceImpl* ConnectionManager::GetConnectionWithRoot( 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ViewId& id) const { 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::const_iterator i = connection_map_.begin(); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (i->second->HasRoot(id)) 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return i->second; 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::DispatchViewInputEventToWindowManager(EventPtr event) { 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Input events are forwarded to the WindowManager. The WindowManager 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // eventually calls back to us with DispatchOnViewInputEvent(). 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewManagerServiceImpl* connection = GetConnection(kWindowManagerConnection); 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!connection) 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connection->client()->DispatchOnViewInputEvent(event.Pass()); 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::ProcessViewBoundsChanged(const ServerView* view, 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& old_bounds, 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& new_bounds) { 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessViewBoundsChanged( 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view, old_bounds, new_bounds, IsChangeSource(i->first)); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::ProcessWillChangeViewHierarchy( 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* view, 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* new_parent, 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* old_parent) { 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessWillChangeViewHierarchy( 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view, new_parent, old_parent, IsChangeSource(i->first)); 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::ProcessViewHierarchyChanged( 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* view, 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* new_parent, 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* old_parent) { 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessViewHierarchyChanged( 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view, new_parent, old_parent, IsChangeSource(i->first)); 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::ProcessViewReorder(const ServerView* view, 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* relative_view, 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const OrderDirection direction) { 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessViewReorder( 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view, relative_view, direction, IsChangeSource(i->first)); 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::ProcessViewDeleted(const ViewId& view) { 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessViewDeleted(view, IsChangeSource(i->first)); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::PrepareForChange(ScopedChange* change) { 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should only ever have one change in flight. 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(!current_change_); 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_change_ = change; 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::FinishChange() { 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // PrepareForChange/FinishChange should be balanced. 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CHECK(current_change_); 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci current_change_ = NULL; 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciViewManagerServiceImpl* ConnectionManager::EmbedImpl( 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ConnectionSpecificId creator_id, 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const String& url, 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ViewId& root_id, 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfaceRequest<ServiceProvider> service_provider) { 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MessagePipe pipe; 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ServiceProvider* view_manager_service_provider = 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci app_connection_->ConnectToApplication(url)->GetServiceProvider(); 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_manager_service_provider->ConnectToService( 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewManagerServiceImpl::Client::Name_, pipe.handle1.Pass()); 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string creator_url; 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectionMap::const_iterator it = connection_map_.find(creator_id); 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it != connection_map_.end()) 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci creator_url = it->second->url(); 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ViewManagerServiceImpl* connection = 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ViewManagerServiceImpl(this, 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci creator_id, 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci creator_url, 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url.To<std::string>(), 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci root_id, 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_provider.Pass()); 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WeakBindToPipe(connection, pipe.handle0.Pass()); 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci connections_created_by_connect_.insert(connection); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci OnConnectionMessagedClient(connection->id()); 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return connection; 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnViewDestroyed(const ServerView* view) { 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessViewDeleted(view->id()); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnWillChangeViewHierarchy( 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* view, 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* new_parent, 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* old_parent) { 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!display_manager_.in_setup()) 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessWillChangeViewHierarchy(view, new_parent, old_parent); 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnViewHierarchyChanged(const ServerView* view, 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* new_parent, 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ServerView* old_parent) { 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!display_manager_.in_setup()) 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessViewHierarchyChanged(view, new_parent, old_parent); 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(beng): optimize. 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (old_parent) { 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_.SchedulePaint(old_parent, 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect(old_parent->bounds().size())); 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (new_parent) { 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_.SchedulePaint(new_parent, 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gfx::Rect(new_parent->bounds().size())); 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnViewBoundsChanged(const ServerView* view, 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& old_bounds, 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Rect& new_bounds) { 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProcessViewBoundsChanged(view, old_bounds, new_bounds); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!view->parent()) 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(sky): optimize this. 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_.SchedulePaint(view->parent(), old_bounds); 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_.SchedulePaint(view->parent(), new_bounds); 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnViewSurfaceIdChanged(const ServerView* view) { 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci display_manager_.SchedulePaint(view, gfx::Rect(view->bounds().size())); 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ConnectionManager::OnWillChangeViewVisibility(const ServerView* view) { 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ConnectionMap::iterator i = connection_map_.begin(); 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i != connection_map_.end(); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++i) { 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci i->second->ProcessWillChangeViewVisibility(view, IsChangeSource(i->first)); 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace service 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace mojo 292