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