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