1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/lib/view_manager_client_impl.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/command_line.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/message_loop/message_loop.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/stl_util.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/cpp/application/application_impl.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/application/connect.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/cpp/application/service_provider_impl.h" 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "mojo/public/interfaces/application/service_provider.mojom.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/public/interfaces/application/shell.mojom.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/lib/view_private.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/util.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_manager_delegate.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/services/public/cpp/view_manager/view_observer.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/view_manager/window_manager_delegate.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/codec/png_codec.h" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace mojo { 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)Id MakeTransportId(ConnectionSpecificId connection_id, 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ConnectionSpecificId local_id) { 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return (connection_id << 16) | local_id; 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Helper called to construct a local view object from transport data. 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)View* AddViewToViewManager(ViewManagerClientImpl* client, 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* parent, 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Id view_id, 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const gfx::Rect& bounds) { 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // We don't use the ctor that takes a ViewManager here, since it will call 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // back to the service and attempt to create a new view. 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view = ViewPrivate::LocalCreate(); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate private_view(view); 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private_view.set_view_manager(client); 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private_view.set_id(view_id); 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) client->AddView(view); 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private_view.LocalSetBounds(gfx::Rect(), bounds); 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (parent) 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(parent).LocalAddChild(view); 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return view; 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)View* BuildViewTree(ViewManagerClientImpl* client, 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const Array<ViewDataPtr>& views, 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* initial_parent) { 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<View*> parents; 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* root = NULL; 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* last_view = NULL; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (initial_parent) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) parents.push_back(initial_parent); 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (size_t i = 0; i < views.size(); ++i) { 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (last_view && views[i]->parent_id == last_view->id()) { 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) parents.push_back(last_view); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } else if (!parents.empty()) { 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) while (parents.back()->id() != views[i]->parent_id) 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) parents.pop_back(); 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view = AddViewToViewManager( 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) client, 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !parents.empty() ? parents.back() : NULL, 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) views[i]->view_id, 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) views[i]->bounds.To<gfx::Rect>()); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!last_view) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root = view; 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) last_view = view; 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return root; 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Responsible for removing a root from the ViewManager when that view is 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// destroyed. 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class RootObserver : public ViewObserver { 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) explicit RootObserver(View* root) : root_(root) {} 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~RootObserver() {} 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Overridden from ViewObserver: 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnViewDestroyed(View* view) OVERRIDE { 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_EQ(view, root_); 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) static_cast<ViewManagerClientImpl*>( 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(root_).view_manager())->RemoveRoot(root_); 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) view->RemoveObserver(this); 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete this; 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* root_; 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(RootObserver); 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciViewManagerClientImpl::ViewManagerClientImpl(ViewManagerDelegate* delegate, 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Shell* shell) 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : connected_(false), 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) connection_id_(0), 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) next_id_(1), 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch delegate_(delegate), 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_manager_delegate_(NULL), 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shell_(shell) { 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // TODO(beng): Come up with a better way of establishing a configuration for 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // what the active window manager is. 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string window_manager_url = "mojo:mojo_window_manager"; 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (base::CommandLine::ForCurrentProcess()->HasSwitch("window-manager")) { 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_manager_url = 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "window-manager"); 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci InterfacePtr<ServiceProvider> sp; 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci shell->ConnectToApplication(window_manager_url, Get(&sp)); 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ConnectToService(sp.get(), &window_manager_); 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_manager_.set_client(this); 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)ViewManagerClientImpl::~ViewManagerClientImpl() { 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<View*> non_owned; 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) while (!views_.empty()) { 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IdToViewMap::iterator it = views_.begin(); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (OwnsView(it->second->id())) { 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it->second->Destroy(); 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } else { 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) non_owned.push_back(it->second); 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) views_.erase(it); 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Delete the non-owned views last. In the typical case these are roots. The 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // exception is the window manager, which may know aboutother random views 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // that it doesn't own. 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // NOTE: we manually delete as we're a friend. 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) for (size_t i = 0; i < non_owned.size(); ++i) 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delete non_owned[i]; 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delegate_->OnViewManagerDisconnected(this); 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)Id ViewManagerClientImpl::CreateView() { 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const Id view_id = MakeTransportId(connection_id_, ++next_id_); 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->CreateView(view_id, ActionCompletedCallbackWithErrorCode()); 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return view_id; 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::DestroyView(Id view_id) { 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_->DeleteView(view_id, ActionCompletedCallback()); 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ViewManagerClientImpl::AddChild(Id child_id, Id parent_id) { 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->AddView(parent_id, child_id, ActionCompletedCallback()); 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::RemoveChild(Id child_id, Id parent_id) { 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->RemoveViewFromParent(child_id, ActionCompletedCallback()); 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::Reorder( 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id view_id, 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id relative_view_id, 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OrderDirection direction) { 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->ReorderView(view_id, relative_view_id, direction, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ActionCompletedCallback()); 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ViewManagerClientImpl::OwnsView(Id id) const { 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return HiWord(id) == connection_id_; 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::SetBounds(Id view_id, const gfx::Rect& bounds) { 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->SetViewBounds(view_id, Rect::From(bounds), 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ActionCompletedCallback()); 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ViewManagerClientImpl::SetSurfaceId(Id view_id, SurfaceIdPtr surface_id) { 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(connected_); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (surface_id.is_null()) 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci service_->SetViewSurfaceId( 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci view_id, surface_id.Pass(), ActionCompletedCallback()); 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::SetFocus(Id view_id) { 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_manager_->FocusWindow(view_id, ActionCompletedCallback()); 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::SetVisible(Id view_id, bool visible) { 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(connected_); 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->SetViewVisibility(view_id, visible, ActionCompletedCallback()); 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::Embed(const String& url, Id view_id) { 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceProviderPtr sp; 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) BindToProxy(new ServiceProviderImpl, &sp); 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Embed(url, view_id, sp.Pass()); 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::Embed( 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const String& url, 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id view_id, 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceProviderPtr service_provider) { 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(connected_); 2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) service_->Embed(url, view_id, service_provider.Pass(), 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ActionCompletedCallback()); 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::AddView(View* view) { 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(views_.find(view->id()) == views_.end()); 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) views_[view->id()] = view; 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::RemoveView(Id view_id) { 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IdToViewMap::iterator it = views_.find(view_id); 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it != views_.end()) 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) views_.erase(it); 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ViewManagerClientImpl, ViewManager implementation: 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ViewManagerClientImpl::SetWindowManagerDelegate( 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WindowManagerDelegate* window_manager_delegate) { 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CHECK(NULL != GetViewById(1)); 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CHECK(!window_manager_delegate_); 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) window_manager_delegate_ = window_manager_delegate; 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ViewManagerClientImpl::DispatchEvent(View* target, EventPtr event) { 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK(window_manager_delegate_); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->DispatchOnViewInputEvent(target->id(), event.Pass()); 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const std::string& ViewManagerClientImpl::GetEmbedderURL() const { 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return creator_url_; 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::vector<View*>& ViewManagerClientImpl::GetRoots() const { 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return roots_; 246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)View* ViewManagerClientImpl::GetViewById(Id id) { 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IdToViewMap::const_iterator it = views_.find(id); 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return it != views_.end() ? it->second : NULL; 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ViewManagerClientImpl, InterfaceImpl overrides: 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::OnConnectionEstablished() { 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) service_ = client(); 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ViewManagerClientImpl, ViewManagerClient implementation: 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnEmbed( 2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ConnectionSpecificId connection_id, 2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const String& creator_url, 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewDataPtr root_data, 2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InterfaceRequest<ServiceProvider> service_provider) { 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!connected_) { 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) connected_ = true; 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) connection_id_ = connection_id; 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci creator_url_ = String::From(creator_url); 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(connection_id_, connection_id); 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK_EQ(creator_url_, creator_url); 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // A new root must not already exist as a root or be contained by an existing 2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // hierarchy visible to this view manager. 2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* root = AddViewToViewManager(this, NULL, root_data->view_id, 2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root_data->bounds.To<gfx::Rect>()); 2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) roots_.push_back(root); 2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) root->AddObserver(new RootObserver(root)); 2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // BindToRequest() binds the lifetime of |exported_services| to the pipe. 2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceProviderImpl* exported_services = new ServiceProviderImpl; 2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) BindToRequest(exported_services, &service_provider); 2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceProvider> remote( 2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) exported_services->CreateRemoteServiceProvider()); 2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) delegate_->OnEmbed(this, root, exported_services, remote.Pass()); 290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnViewBoundsChanged(Id view_id, 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RectPtr old_bounds, 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RectPtr new_bounds) { 2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view = GetViewById(view_id); 2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(view).LocalSetBounds(old_bounds.To<gfx::Rect>(), 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new_bounds.To<gfx::Rect>()); 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnViewHierarchyChanged( 3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id view_id, 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Id new_parent_id, 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Id old_parent_id, 3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mojo::Array<ViewDataPtr> views) { 3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* initial_parent = views.size() ? 3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GetViewById(views[0]->parent_id) : NULL; 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) BuildViewTree(this, views, initial_parent); 309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* new_parent = GetViewById(new_parent_id); 3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* old_parent = GetViewById(old_parent_id); 3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view = GetViewById(view_id); 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (new_parent) 3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(new_parent).LocalAddChild(view); 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(old_parent).LocalRemoveChild(view); 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnViewReordered(Id view_id, 3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id relative_view_id, 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch OrderDirection direction) { 3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* view = GetViewById(view_id); 3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* relative_view = GetViewById(relative_view_id); 3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (view && relative_view) 3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ViewPrivate(view).LocalReorder(relative_view, direction); 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::OnViewDeleted(Id view_id) { 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) View* view = GetViewById(view_id); 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (view) 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ViewPrivate(view).LocalDestroy(); 332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ViewManagerClientImpl::OnViewVisibilityChanged(Id view_id, bool visible) { 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(sky): implement me. 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTIMPLEMENTED(); 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ViewManagerClientImpl::OnViewDrawnStateChanged(Id view_id, bool drawn) { 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(sky): implement me. 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTIMPLEMENTED(); 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ViewManagerClientImpl::OnViewInputEvent( 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Id view_id, 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EventPtr event, 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const Callback<void()>& ack_callback) { 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) View* view = GetViewById(view_id); 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (view) { 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FOR_EACH_OBSERVER(ViewObserver, 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *ViewPrivate(view).observers(), 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OnViewInputEvent(view, event)); 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ack_callback.Run(); 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::Embed( 3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const String& url, 3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InterfaceRequest<ServiceProvider> service_provider) { 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (window_manager_delegate_) 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci window_manager_delegate_->Embed(url, service_provider.Pass()); 3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::DispatchOnViewInputEvent(EventPtr event) { 3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (window_manager_delegate_) 3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) window_manager_delegate_->DispatchEvent(event.Pass()); 3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// ViewManagerClientImpl, WindowManagerClient implementation: 3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnWindowManagerReady() {} 3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnCaptureChanged(Id old_capture_view_id, 3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id new_capture_view_id) {} 3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnFocusChanged(Id old_focused_view_id, 3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id new_focused_view_id) { 3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* focused = GetViewById(new_focused_view_id); 3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) View* blurred = GetViewById(old_focused_view_id); 381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (blurred) { 3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FOR_EACH_OBSERVER(ViewObserver, 3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *ViewPrivate(blurred).observers(), 3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OnViewFocusChanged(focused, blurred)); 385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (focused) { 3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FOR_EACH_OBSERVER(ViewObserver, 3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) *ViewPrivate(focused).observers(), 3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) OnViewFocusChanged(focused, blurred)); 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::OnActiveWindowChanged(Id old_focused_window, 3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Id new_focused_window) {} 395f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 396f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 397f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// ViewManagerClientImpl, private: 398f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void ViewManagerClientImpl::RemoveRoot(View* root) { 4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::vector<View*>::iterator it = 401f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::find(roots_.begin(), roots_.end(), root); 402f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (it != roots_.end()) 403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) roots_.erase(it); 404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ViewManagerClientImpl::OnActionCompleted(bool success) { 4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!change_acked_callback_.is_null()) 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) change_acked_callback_.Run(); 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ViewManagerClientImpl::OnActionCompletedWithErrorCode(ErrorCode code) { 4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) OnActionCompleted(code == ERROR_CODE_NONE); 4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::Callback<void(bool)> ViewManagerClientImpl::ActionCompletedCallback() { 4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return base::Bind(&ViewManagerClientImpl::OnActionCompleted, 4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this)); 4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::Callback<void(ErrorCode)> 4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ViewManagerClientImpl::ActionCompletedCallbackWithErrorCode() { 4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return base::Bind(&ViewManagerClientImpl::OnActionCompletedWithErrorCode, 4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(this)); 424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 425f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace mojo 427