Index: components/view_manager/connection_manager.cc |
diff --git a/components/view_manager/connection_manager.cc b/components/view_manager/connection_manager.cc |
deleted file mode 100644 |
index c3ab945ad0da56bd333708def132eb24553e4f20..0000000000000000000000000000000000000000 |
--- a/components/view_manager/connection_manager.cc |
+++ /dev/null |
@@ -1,466 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/view_manager/connection_manager.h" |
- |
-#include "base/logging.h" |
-#include "base/stl_util.h" |
-#include "cc/output/compositor_frame.h" |
-#include "cc/quads/shared_quad_state.h" |
-#include "components/view_manager/client_connection.h" |
-#include "components/view_manager/connection_manager_delegate.h" |
-#include "components/view_manager/server_view.h" |
-#include "components/view_manager/view_coordinate_conversions.h" |
-#include "components/view_manager/view_tree_host_connection.h" |
-#include "components/view_manager/view_tree_impl.h" |
-#include "mojo/application/public/cpp/application_connection.h" |
-#include "mojo/converters/geometry/geometry_type_converters.h" |
-#include "mojo/converters/input_events/input_events_type_converters.h" |
-#include "mojo/converters/surfaces/surfaces_type_converters.h" |
-#include "ui/gfx/geometry/size_conversions.h" |
- |
-using mojo::ConnectionSpecificId; |
- |
-namespace view_manager { |
- |
-ConnectionManager::ScopedChange::ScopedChange( |
- ViewTreeImpl* connection, |
- ConnectionManager* connection_manager, |
- bool is_delete_view) |
- : connection_manager_(connection_manager), |
- connection_id_(connection->id()), |
- is_delete_view_(is_delete_view) { |
- connection_manager_->PrepareForChange(this); |
-} |
- |
-ConnectionManager::ScopedChange::~ScopedChange() { |
- connection_manager_->FinishChange(); |
-} |
- |
-ConnectionManager::ConnectionManager( |
- ConnectionManagerDelegate* delegate, |
- const scoped_refptr<surfaces::SurfacesState>& surfaces_state) |
- : delegate_(delegate), |
- surfaces_state_(surfaces_state), |
- next_connection_id_(1), |
- next_host_id_(0), |
- current_change_(nullptr), |
- in_destructor_(false) { |
-} |
- |
-ConnectionManager::~ConnectionManager() { |
- in_destructor_ = true; |
- |
- // Copy the HostConnectionMap because it will be mutated as the connections |
- // are closed. |
- HostConnectionMap host_connection_map(host_connection_map_); |
- for (auto& pair : host_connection_map) |
- pair.second->CloseConnection(); |
- |
- STLDeleteValues(&connection_map_); |
- // All the connections should have been destroyed. |
- DCHECK(host_connection_map_.empty()); |
- DCHECK(connection_map_.empty()); |
-} |
- |
-void ConnectionManager::AddHost( |
- ViewTreeHostConnection* host_connection) { |
- DCHECK_EQ(0u, host_connection_map_.count(host_connection->view_tree_host())); |
- host_connection_map_[host_connection->view_tree_host()] = host_connection; |
-} |
- |
-ServerView* ConnectionManager::CreateServerView(const ViewId& id) { |
- ServerView* view = new ServerView(this, id); |
- view->AddObserver(this); |
- return view; |
-} |
- |
-ConnectionSpecificId ConnectionManager::GetAndAdvanceNextConnectionId() { |
- const ConnectionSpecificId id = next_connection_id_++; |
- DCHECK_LT(id, next_connection_id_); |
- return id; |
-} |
- |
-uint16_t ConnectionManager::GetAndAdvanceNextHostId() { |
- const uint16_t id = next_host_id_++; |
- DCHECK_LT(id, next_host_id_); |
- return id; |
-} |
- |
-void ConnectionManager::OnConnectionError(ClientConnection* connection) { |
- // This will be null if the root has been destroyed. |
- const ViewId* view_id = connection->service()->root(); |
- ServerView* view = |
- view_id ? GetView(*connection->service()->root()) : nullptr; |
- // If the ViewTree root is a viewport root, then we'll wait until |
- // the root connection goes away to cleanup. |
- if (view && (GetRootView(view) == view)) |
- return; |
- |
- scoped_ptr<ClientConnection> connection_owner(connection); |
- |
- connection_map_.erase(connection->service()->id()); |
- |
- // Notify remaining connections so that they can cleanup. |
- for (auto& pair : connection_map_) { |
- pair.second->service()->OnWillDestroyViewTreeImpl( |
- connection->service()); |
- } |
-} |
- |
-void ConnectionManager::OnHostConnectionClosed( |
- ViewTreeHostConnection* connection) { |
- auto it = host_connection_map_.find(connection->view_tree_host()); |
- DCHECK(it != host_connection_map_.end()); |
- |
- // Get the ClientConnection by ViewTreeImpl ID. |
- ConnectionMap::iterator service_connection_it = |
- connection_map_.find(it->first->GetViewTree()->id()); |
- DCHECK(service_connection_it != connection_map_.end()); |
- |
- // Tear down the associated ViewTree connection. |
- // TODO(fsamuel): I don't think this is quite right, we should tear down all |
- // connections within the root's viewport. We should probably employ an |
- // observer pattern to do this. Each ViewTreeImpl should track its |
- // parent's lifetime. |
- host_connection_map_.erase(it); |
- OnConnectionError(service_connection_it->second); |
- |
- // If we have no more roots left, let the app know so it can terminate. |
- if (!host_connection_map_.size()) |
- delegate_->OnNoMoreRootConnections(); |
-} |
- |
-void ConnectionManager::EmbedAtView(mojo::ConnectionSpecificId creator_id, |
- const ViewId& view_id, |
- mojo::URLRequestPtr request) { |
- mojo::ViewTreePtr service_ptr; |
- ClientConnection* client_connection = |
- delegate_->CreateClientConnectionForEmbedAtView( |
- this, GetProxy(&service_ptr), creator_id, request.Pass(), view_id); |
- AddConnection(client_connection); |
- client_connection->service()->Init(client_connection->client(), |
- service_ptr.Pass()); |
- OnConnectionMessagedClient(client_connection->service()->id()); |
-} |
- |
-ViewTreeImpl* ConnectionManager::EmbedAtView( |
- mojo::ConnectionSpecificId creator_id, |
- const ViewId& view_id, |
- mojo::ViewTreeClientPtr client) { |
- mojo::ViewTreePtr service_ptr; |
- ClientConnection* client_connection = |
- delegate_->CreateClientConnectionForEmbedAtView( |
- this, GetProxy(&service_ptr), creator_id, view_id, client.Pass()); |
- AddConnection(client_connection); |
- client_connection->service()->Init(client_connection->client(), |
- service_ptr.Pass()); |
- OnConnectionMessagedClient(client_connection->service()->id()); |
- |
- return client_connection->service(); |
-} |
- |
-ViewTreeImpl* ConnectionManager::GetConnection( |
- ConnectionSpecificId connection_id) { |
- ConnectionMap::iterator i = connection_map_.find(connection_id); |
- return i == connection_map_.end() ? nullptr : i->second->service(); |
-} |
- |
-ServerView* ConnectionManager::GetView(const ViewId& id) { |
- for (auto& pair : host_connection_map_) { |
- if (pair.first->root_view()->id() == id) |
- return pair.first->root_view(); |
- } |
- ViewTreeImpl* service = GetConnection(id.connection_id); |
- return service ? service->GetView(id) : nullptr; |
-} |
- |
-bool ConnectionManager::IsViewAttachedToRoot(const ServerView* view) const { |
- for (auto& pair : host_connection_map_) { |
- if (pair.first->IsViewAttachedToRoot(view)) |
- return true; |
- } |
- return false; |
-} |
- |
-void ConnectionManager::SchedulePaint(const ServerView* view, |
- const gfx::Rect& bounds) { |
- for (auto& pair : host_connection_map_) { |
- if (pair.first->SchedulePaintIfInViewport(view, bounds)) |
- return; |
- } |
-} |
- |
-void ConnectionManager::OnConnectionMessagedClient(ConnectionSpecificId id) { |
- if (current_change_) |
- current_change_->MarkConnectionAsMessaged(id); |
-} |
- |
-bool ConnectionManager::DidConnectionMessageClient( |
- ConnectionSpecificId id) const { |
- return current_change_ && current_change_->DidMessageConnection(id); |
-} |
- |
-mojo::ViewportMetricsPtr ConnectionManager::GetViewportMetricsForView( |
- const ServerView* view) { |
- ViewTreeHostImpl* host = GetViewTreeHostByView(view); |
- if (host) |
- return host->GetViewportMetrics().Clone(); |
- |
- if (!host_connection_map_.empty()) |
- return host_connection_map_.begin()->first->GetViewportMetrics().Clone(); |
- |
- mojo::ViewportMetricsPtr metrics = mojo::ViewportMetrics::New(); |
- metrics->size_in_pixels = mojo::Size::New(); |
- return metrics.Pass(); |
-} |
- |
-const ViewTreeImpl* ConnectionManager::GetConnectionWithRoot( |
- const ViewId& id) const { |
- for (auto& pair : connection_map_) { |
- if (pair.second->service()->IsRoot(id)) |
- return pair.second->service(); |
- } |
- return nullptr; |
-} |
- |
-ViewTreeHostImpl* ConnectionManager::GetViewTreeHostByView( |
- const ServerView* view) { |
- return const_cast<ViewTreeHostImpl*>( |
- static_cast<const ConnectionManager*>(this)->GetViewTreeHostByView(view)); |
-} |
- |
-const ViewTreeHostImpl* ConnectionManager::GetViewTreeHostByView( |
- const ServerView* view) const { |
- while (view && view->parent()) |
- view = view->parent(); |
- for (auto& pair : host_connection_map_) { |
- if (view == pair.first->root_view()) |
- return pair.first; |
- } |
- return nullptr; |
-} |
- |
-ViewTreeImpl* ConnectionManager::GetEmbedRoot(ViewTreeImpl* service) { |
- while (service) { |
- const ViewId* root_id = service->root(); |
- if (!root_id || root_id->connection_id == service->id()) |
- return nullptr; |
- |
- ViewTreeImpl* parent_service = GetConnection(root_id->connection_id); |
- service = parent_service; |
- if (service && service->is_embed_root()) |
- return service; |
- } |
- return nullptr; |
-} |
- |
-void ConnectionManager::ProcessViewBoundsChanged(const ServerView* view, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewBoundsChanged( |
- view, old_bounds, new_bounds, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::ProcessWillChangeViewHierarchy( |
- const ServerView* view, |
- const ServerView* new_parent, |
- const ServerView* old_parent) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessWillChangeViewHierarchy( |
- view, new_parent, old_parent, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::ProcessViewHierarchyChanged( |
- const ServerView* view, |
- const ServerView* new_parent, |
- const ServerView* old_parent) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewHierarchyChanged( |
- view, new_parent, old_parent, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::ProcessViewReorder( |
- const ServerView* view, |
- const ServerView* relative_view, |
- const mojo::OrderDirection direction) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewReorder(view, relative_view, direction, |
- IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::ProcessViewDeleted(const ViewId& view) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewDeleted(view, |
- IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::ProcessViewportMetricsChanged( |
- const mojo::ViewportMetrics& old_metrics, |
- const mojo::ViewportMetrics& new_metrics) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewportMetricsChanged( |
- old_metrics, new_metrics, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::PrepareForChange(ScopedChange* change) { |
- // Should only ever have one change in flight. |
- CHECK(!current_change_); |
- current_change_ = change; |
-} |
- |
-void ConnectionManager::FinishChange() { |
- // PrepareForChange/FinishChange should be balanced. |
- CHECK(current_change_); |
- current_change_ = NULL; |
-} |
- |
-void ConnectionManager::AddConnection(ClientConnection* connection) { |
- DCHECK_EQ(0u, connection_map_.count(connection->service()->id())); |
- connection_map_[connection->service()->id()] = connection; |
-} |
- |
-scoped_ptr<cc::CompositorFrame> |
-ConnectionManager::UpdateViewTreeFromCompositorFrame( |
- const mojo::CompositorFramePtr& input) { |
- return ConvertToCompositorFrame(input, this); |
-} |
- |
-surfaces::SurfacesState* ConnectionManager::GetSurfacesState() { |
- return surfaces_state_.get(); |
-} |
- |
-void ConnectionManager::OnScheduleViewPaint(const ServerView* view) { |
- if (!in_destructor_) |
- SchedulePaint(view, gfx::Rect(view->bounds().size())); |
-} |
- |
-const ServerView* ConnectionManager::GetRootView(const ServerView* view) const { |
- const ViewTreeHostImpl* host = GetViewTreeHostByView(view); |
- return host ? host->root_view() : nullptr; |
-} |
- |
-void ConnectionManager::OnViewDestroyed(ServerView* view) { |
- if (!in_destructor_) |
- ProcessViewDeleted(view->id()); |
-} |
- |
-void ConnectionManager::OnWillChangeViewHierarchy(ServerView* view, |
- ServerView* new_parent, |
- ServerView* old_parent) { |
- if (in_destructor_) |
- return; |
- |
- ProcessWillChangeViewHierarchy(view, new_parent, old_parent); |
-} |
- |
-void ConnectionManager::OnViewHierarchyChanged(ServerView* view, |
- ServerView* new_parent, |
- ServerView* old_parent) { |
- if (in_destructor_) |
- return; |
- |
- ProcessViewHierarchyChanged(view, new_parent, old_parent); |
- |
- // TODO(beng): optimize. |
- if (old_parent) |
- SchedulePaint(old_parent, gfx::Rect(old_parent->bounds().size())); |
- if (new_parent) |
- SchedulePaint(new_parent, gfx::Rect(new_parent->bounds().size())); |
-} |
- |
-void ConnectionManager::OnViewBoundsChanged(ServerView* view, |
- const gfx::Rect& old_bounds, |
- const gfx::Rect& new_bounds) { |
- if (in_destructor_) |
- return; |
- |
- ProcessViewBoundsChanged(view, old_bounds, new_bounds); |
- if (!view->parent()) |
- return; |
- |
- // TODO(sky): optimize this. |
- SchedulePaint(view->parent(), old_bounds); |
- SchedulePaint(view->parent(), new_bounds); |
-} |
- |
-void ConnectionManager::OnViewReordered(ServerView* view, |
- ServerView* relative, |
- mojo::OrderDirection direction) { |
- if (!in_destructor_) |
- SchedulePaint(view, gfx::Rect(view->bounds().size())); |
-} |
- |
-void ConnectionManager::OnWillChangeViewVisibility(ServerView* view) { |
- if (in_destructor_) |
- return; |
- |
- // Need to repaint if the view was drawn (which means it's in the process of |
- // hiding) or the view is transitioning to drawn. |
- if (view->parent() && (view->IsDrawn() || |
- (!view->visible() && view->parent()->IsDrawn()))) { |
- SchedulePaint(view->parent(), view->bounds()); |
- } |
- |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessWillChangeViewVisibility( |
- view, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::OnViewSharedPropertyChanged( |
- ServerView* view, |
- const std::string& name, |
- const std::vector<uint8_t>* new_data) { |
- for (auto& pair : connection_map_) { |
- pair.second->service()->ProcessViewPropertyChanged( |
- view, name, new_data, IsChangeSource(pair.first)); |
- } |
-} |
- |
-void ConnectionManager::OnViewTextInputStateChanged( |
- ServerView* view, |
- const ui::TextInputState& state) { |
- ViewTreeHostImpl* host = GetViewTreeHostByView(view); |
- host->UpdateTextInputState(view, state); |
-} |
- |
-bool ConnectionManager::ConvertSurfaceDrawQuad( |
- const mojo::QuadPtr& input, |
- const mojo::CompositorFrameMetadataPtr& metadata, |
- cc::SharedQuadState* sqs, |
- cc::RenderPass* render_pass) { |
- unsigned int id = static_cast<unsigned int>( |
- input->surface_quad_state->surface.To<cc::SurfaceId>().id); |
- // TODO(fsamuel): Security checks: |
- // 1. We need to make sure the embedder can only position views it's allowed |
- // to access. |
- // 2. We need to make sure that the embedder cannot place views in areas |
- // outside of its own bounds. |
- ServerView* view = GetView(ViewIdFromTransportId(id)); |
- // If a CompositorFrame message arrives late, say during a navigation, then |
- // it may contain view IDs that no longer exist. |
- if (!view) |
- return false; |
- gfx::Rect bounds(input->visible_rect.To<gfx::Rect>()); |
- gfx::Point p; |
- sqs->quad_to_target_transform.TransformPoint(&p); |
- bounds.set_origin(p); |
- // TODO(fsamuel): This seems like a crude way to set the size that probably |
- // doesn't work correctly in the general case. We need to get transforms |
- // working correctly in the general case. |
- bounds.set_size(gfx::ToRoundedSize( |
- gfx::ScaleSize(bounds.size(), metadata->device_scale_factor))); |
- view->SetBounds(bounds); |
- return true; |
-} |
- |
-} // namespace view_manager |