| Index: services/ui/public/cpp/window_tree_client.cc
 | 
| diff --git a/services/ui/public/cpp/window_tree_client.cc b/services/ui/public/cpp/window_tree_client.cc
 | 
| deleted file mode 100644
 | 
| index 8ed5e4e373daec063bc0bd09b35585262a5e6999..0000000000000000000000000000000000000000
 | 
| --- a/services/ui/public/cpp/window_tree_client.cc
 | 
| +++ /dev/null
 | 
| @@ -1,1482 +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 "services/ui/public/cpp/window_tree_client.h"
 | 
| -
 | 
| -#include <stddef.h>
 | 
| -
 | 
| -#include <string>
 | 
| -#include <utility>
 | 
| -#include <vector>
 | 
| -
 | 
| -#include "base/bind.h"
 | 
| -#include "base/memory/ptr_util.h"
 | 
| -#include "base/strings/stringprintf.h"
 | 
| -#include "mojo/public/cpp/bindings/map.h"
 | 
| -#include "services/service_manager/public/cpp/connector.h"
 | 
| -#include "services/ui/common/util.h"
 | 
| -#include "services/ui/public/cpp/in_flight_change.h"
 | 
| -#include "services/ui/public/cpp/input_event_handler.h"
 | 
| -#include "services/ui/public/cpp/window_drop_target.h"
 | 
| -#include "services/ui/public/cpp/window_manager_delegate.h"
 | 
| -#include "services/ui/public/cpp/window_observer.h"
 | 
| -#include "services/ui/public/cpp/window_private.h"
 | 
| -#include "services/ui/public/cpp/window_tracker.h"
 | 
| -#include "services/ui/public/cpp/window_tree_client_delegate.h"
 | 
| -#include "services/ui/public/cpp/window_tree_client_observer.h"
 | 
| -#include "services/ui/public/interfaces/constants.mojom.h"
 | 
| -#include "services/ui/public/interfaces/window_manager_window_tree_factory.mojom.h"
 | 
| -#include "ui/display/screen.h"
 | 
| -#include "ui/events/event.h"
 | 
| -#include "ui/gfx/geometry/dip_util.h"
 | 
| -#include "ui/gfx/geometry/insets.h"
 | 
| -#include "ui/gfx/geometry/size.h"
 | 
| -
 | 
| -namespace ui {
 | 
| -
 | 
| -Id MakeTransportId(ClientSpecificId client_id, ClientSpecificId local_id) {
 | 
| -  return (client_id << 16) | local_id;
 | 
| -}
 | 
| -
 | 
| -// Helper function to get the device_scale_factor() of the display::Display
 | 
| -// with |display_id|.
 | 
| -float ScaleFactorForDisplay(int64_t display_id) {
 | 
| -  // TODO(jonross): Remove this once aura-mus is complete. Currently the screen
 | 
| -  // is not being set properly for mus-in-renderer. (http://crbug.com/659155)
 | 
| -  if (!display::Screen::GetScreen())
 | 
| -    return 1.f;
 | 
| -
 | 
| -  // TODO(riajiang): Change to use display::GetDisplayWithDisplayId() after
 | 
| -  // https://codereview.chromium.org/2361283002/ is landed.
 | 
| -  std::vector<display::Display> displays =
 | 
| -      display::Screen::GetScreen()->GetAllDisplays();
 | 
| -  auto iter = std::find_if(displays.begin(), displays.end(),
 | 
| -                           [display_id](const display::Display& display) {
 | 
| -                             return display.id() == display_id;
 | 
| -                           });
 | 
| -  if (iter != displays.end())
 | 
| -    return iter->device_scale_factor();
 | 
| -  return 1.f;
 | 
| -}
 | 
| -
 | 
| -// Helper called to construct a local window object from transport data.
 | 
| -Window* AddWindowToClient(WindowTreeClient* client,
 | 
| -                          Window* parent,
 | 
| -                          const mojom::WindowDataPtr& window_data) {
 | 
| -  // We don't use the ctor that takes a WindowTreeClient here, since it will
 | 
| -  // call back to the service and attempt to create a new window.
 | 
| -  Window* window = WindowPrivate::LocalCreate();
 | 
| -  WindowPrivate private_window(window);
 | 
| -  private_window.set_client(client);
 | 
| -  private_window.set_server_id(window_data->window_id);
 | 
| -  private_window.set_visible(window_data->visible);
 | 
| -  private_window.set_properties(
 | 
| -      mojo::UnorderedMapToMap(window_data->properties));
 | 
| -  client->AddWindow(window);
 | 
| -  private_window.LocalSetBounds(
 | 
| -      gfx::Rect(),
 | 
| -      gfx::ConvertRectToDIP(ScaleFactorForDisplay(window->display_id()),
 | 
| -                            window_data->bounds));
 | 
| -  if (parent)
 | 
| -    WindowPrivate(parent).LocalAddChild(window);
 | 
| -  return window;
 | 
| -}
 | 
| -
 | 
| -struct WindowTreeClient::CurrentDragState {
 | 
| -  // The current change id of the current drag an drop ipc.
 | 
| -  uint32_t change_id;
 | 
| -
 | 
| -  // The effect to return when we send our finish signal.
 | 
| -  uint32_t completed_action;
 | 
| -
 | 
| -  // Callback executed when a drag initiated by PerformDragDrop() is completed.
 | 
| -  base::Callback<void(bool, uint32_t)> on_finished;
 | 
| -};
 | 
| -
 | 
| -WindowTreeClient::WindowTreeClient(
 | 
| -    WindowTreeClientDelegate* delegate,
 | 
| -    WindowManagerDelegate* window_manager_delegate,
 | 
| -    mojo::InterfaceRequest<mojom::WindowTreeClient> request)
 | 
| -    : client_id_(0),
 | 
| -      next_window_id_(1),
 | 
| -      next_change_id_(1),
 | 
| -      delegate_(delegate),
 | 
| -      window_manager_delegate_(window_manager_delegate),
 | 
| -      capture_window_(nullptr),
 | 
| -      focused_window_(nullptr),
 | 
| -      binding_(this),
 | 
| -      tree_(nullptr),
 | 
| -      in_destructor_(false),
 | 
| -      weak_factory_(this) {
 | 
| -  // Allow for a null request in tests.
 | 
| -  if (request.is_pending())
 | 
| -    binding_.Bind(std::move(request));
 | 
| -  if (window_manager_delegate)
 | 
| -    window_manager_delegate->SetWindowManagerClient(this);
 | 
| -}
 | 
| -
 | 
| -WindowTreeClient::~WindowTreeClient() {
 | 
| -  in_destructor_ = true;
 | 
| -
 | 
| -  for (auto& observer : observers_)
 | 
| -    observer.OnWillDestroyClient(this);
 | 
| -
 | 
| -  std::vector<Window*> non_owned;
 | 
| -  WindowTracker tracker;
 | 
| -  while (!windows_.empty()) {
 | 
| -    IdToWindowMap::iterator it = windows_.begin();
 | 
| -    if (it->second->WasCreatedByThisClient()) {
 | 
| -      it->second->Destroy();
 | 
| -    } else {
 | 
| -      tracker.Add(it->second);
 | 
| -      windows_.erase(it);
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  // Delete the non-owned windows last. In the typical case these are roots. The
 | 
| -  // exception is the window manager and embed roots, which may know about
 | 
| -  // other random windows that it doesn't own.
 | 
| -  // NOTE: we manually delete as we're a friend.
 | 
| -  while (!tracker.windows().empty())
 | 
| -    delete tracker.windows().front();
 | 
| -
 | 
| -  for (auto& observer : observers_)
 | 
| -    observer.OnDidDestroyClient(this);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ConnectViaWindowTreeFactory(
 | 
| -    service_manager::Connector* connector) {
 | 
| -  // The client id doesn't really matter, we use 101 purely for debugging.
 | 
| -  client_id_ = 101;
 | 
| -
 | 
| -  mojom::WindowTreeFactoryPtr factory;
 | 
| -  connector->BindInterface(ui::mojom::kServiceName, &factory);
 | 
| -  mojom::WindowTreePtr window_tree;
 | 
| -  factory->CreateWindowTree(MakeRequest(&window_tree),
 | 
| -                            binding_.CreateInterfacePtrAndBind());
 | 
| -  SetWindowTree(std::move(window_tree));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ConnectAsWindowManager(
 | 
| -    service_manager::Connector* connector) {
 | 
| -  DCHECK(window_manager_delegate_);
 | 
| -
 | 
| -  mojom::WindowManagerWindowTreeFactoryPtr factory;
 | 
| -  connector->BindInterface(ui::mojom::kServiceName, &factory);
 | 
| -  mojom::WindowTreePtr window_tree;
 | 
| -  factory->CreateWindowTree(MakeRequest(&window_tree),
 | 
| -                            binding_.CreateInterfacePtrAndBind());
 | 
| -  SetWindowTree(std::move(window_tree));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WaitForEmbed() {
 | 
| -  DCHECK(roots_.empty());
 | 
| -  // OnEmbed() is the first function called.
 | 
| -  binding_.WaitForIncomingMethodCall();
 | 
| -  // TODO(sky): deal with pipe being closed before we get OnEmbed().
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::DestroyWindow(Window* window) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<CrashInFlightChange>(window, ChangeType::DELETE_WINDOW));
 | 
| -  tree_->DeleteWindow(change_id, server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AddChild(Window* parent, Id child_id) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<CrashInFlightChange>(parent, ChangeType::ADD_CHILD));
 | 
| -  tree_->AddWindow(change_id, parent->server_id(), child_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RemoveChild(Window* parent, Id child_id) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<CrashInFlightChange>(parent, ChangeType::REMOVE_CHILD));
 | 
| -  tree_->RemoveWindowFromParent(change_id, child_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AddTransientWindow(Window* window,
 | 
| -                                              Id transient_window_id) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<CrashInFlightChange>(
 | 
| -          window, ChangeType::ADD_TRANSIENT_WINDOW));
 | 
| -  tree_->AddTransientWindow(change_id, server_id(window), transient_window_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RemoveTransientWindowFromParent(Window* window) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<CrashInFlightChange>(
 | 
| -          window, ChangeType::REMOVE_TRANSIENT_WINDOW_FROM_PARENT));
 | 
| -  tree_->RemoveTransientWindowFromParent(change_id, server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetModal(Window* window) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<InFlightSetModalChange>(window));
 | 
| -  tree_->SetModal(change_id, server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::Reorder(Window* window,
 | 
| -                                   Id relative_window_id,
 | 
| -                                   mojom::OrderDirection direction) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<CrashInFlightChange>(window, ChangeType::REORDER));
 | 
| -  tree_->ReorderWindow(change_id, server_id(window), relative_window_id,
 | 
| -                       direction);
 | 
| -}
 | 
| -
 | 
| -bool WindowTreeClient::WasCreatedByThisClient(const Window* window) const {
 | 
| -  // Windows created via CreateTopLevelWindow() are not owned by us, but have
 | 
| -  // our client id. const_cast is required by set.
 | 
| -  return HiWord(server_id(window)) == client_id_ &&
 | 
| -         roots_.count(const_cast<Window*>(window)) == 0;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetBounds(Window* window,
 | 
| -                                 const gfx::Rect& old_bounds,
 | 
| -                                 const gfx::Rect& bounds) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightBoundsChange>(window, old_bounds));
 | 
| -  tree_->SetWindowBounds(
 | 
| -      change_id, server_id(window),
 | 
| -      gfx::ConvertRectToPixel(ScaleFactorForDisplay(window->display_id()),
 | 
| -                              bounds));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetCapture(Window* window) {
 | 
| -  // In order for us to get here we had to have exposed a window, which implies
 | 
| -  // we got a client.
 | 
| -  DCHECK(tree_);
 | 
| -  if (capture_window_ == window)
 | 
| -    return;
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightCaptureChange>(this, capture_window_));
 | 
| -  tree_->SetCapture(change_id, server_id(window));
 | 
| -  LocalSetCapture(window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ReleaseCapture(Window* window) {
 | 
| -  // In order for us to get here we had to have exposed a window, which implies
 | 
| -  // we got a client.
 | 
| -  DCHECK(tree_);
 | 
| -  if (capture_window_ != window)
 | 
| -    return;
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightCaptureChange>(this, window));
 | 
| -  tree_->ReleaseCapture(change_id, server_id(window));
 | 
| -  LocalSetCapture(nullptr);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetClientArea(
 | 
| -    Id window_id,
 | 
| -    const gfx::Insets& client_area,
 | 
| -    const std::vector<gfx::Rect>& additional_client_areas) {
 | 
| -  DCHECK(tree_);
 | 
| -  float device_scale_factor =
 | 
| -      ScaleFactorForDisplay(GetWindowByServerId(window_id)->display_id());
 | 
| -  std::vector<gfx::Rect> additional_client_areas_in_pixel;
 | 
| -  for (const gfx::Rect& area : additional_client_areas) {
 | 
| -    additional_client_areas_in_pixel.push_back(
 | 
| -        gfx::ConvertRectToPixel(device_scale_factor, area));
 | 
| -  }
 | 
| -  tree_->SetClientArea(
 | 
| -      window_id, gfx::ConvertInsetsToPixel(device_scale_factor, client_area),
 | 
| -      additional_client_areas_in_pixel);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetHitTestMask(Id window_id, const gfx::Rect& mask) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetHitTestMask(
 | 
| -      window_id,
 | 
| -      gfx::ConvertRectToPixel(
 | 
| -          ScaleFactorForDisplay(GetWindowByServerId(window_id)->display_id()),
 | 
| -          mask));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ClearHitTestMask(Id window_id) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetHitTestMask(window_id, base::nullopt);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetFocus(Window* window) {
 | 
| -  // In order for us to get here we had to have exposed a window, which implies
 | 
| -  // we got a client.
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightFocusChange>(this, focused_window_));
 | 
| -  tree_->SetFocus(change_id, window ? server_id(window) : 0);
 | 
| -  LocalSetFocus(window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetCanFocus(Id window_id, bool can_focus) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetCanFocus(window_id, can_focus);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetPredefinedCursor(Id window_id,
 | 
| -                                           ui::mojom::Cursor cursor_id) {
 | 
| -  DCHECK(tree_);
 | 
| -
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  // We make an inflight change thing here.
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<InFlightPredefinedCursorChange>(
 | 
| -          window, window->predefined_cursor()));
 | 
| -  tree_->SetPredefinedCursor(change_id, window_id, cursor_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetVisible(Window* window, bool visible) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightVisibleChange>(window, !visible));
 | 
| -  tree_->SetWindowVisibility(change_id, server_id(window), visible);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetOpacity(Window* window, float opacity) {
 | 
| -  DCHECK(tree_);
 | 
| -  const uint32_t change_id = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightOpacityChange>(window, window->opacity()));
 | 
| -  tree_->SetWindowOpacity(change_id, server_id(window), opacity);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetProperty(
 | 
| -    Window* window,
 | 
| -    const std::string& name,
 | 
| -    const base::Optional<std::vector<uint8_t>>& data) {
 | 
| -  DCHECK(tree_);
 | 
| -
 | 
| -  base::Optional<std::vector<uint8_t>> old_value;
 | 
| -  if (window->HasSharedProperty(name))
 | 
| -    old_value.emplace(window->properties_[name]);
 | 
| -
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<InFlightPropertyChange>(
 | 
| -          window, name, std::move(old_value)));
 | 
| -  tree_->SetWindowProperty(change_id, server_id(window), name, data);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetWindowTextInputState(
 | 
| -    Id window_id,
 | 
| -    mojo::TextInputStatePtr state) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetWindowTextInputState(window_id, std::move(state));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetImeVisibility(Id window_id,
 | 
| -                                            bool visible,
 | 
| -                                            mojo::TextInputStatePtr state) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetImeVisibility(window_id, visible, std::move(state));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::Embed(Id window_id,
 | 
| -                             mojom::WindowTreeClientPtr client,
 | 
| -                             uint32_t flags,
 | 
| -                             const mojom::WindowTree::EmbedCallback& callback) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->Embed(window_id, std::move(client), flags, callback);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RequestClose(Window* window) {
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->WmRequestClose(server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AttachCompositorFrameSink(
 | 
| -    Id window_id,
 | 
| -    cc::mojom::MojoCompositorFrameSinkRequest compositor_frame_sink,
 | 
| -    cc::mojom::MojoCompositorFrameSinkClientPtr client) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->AttachCompositorFrameSink(window_id, std::move(compositor_frame_sink),
 | 
| -                                   std::move(client));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::LocalSetCapture(Window* window) {
 | 
| -  if (capture_window_ == window)
 | 
| -    return;
 | 
| -  Window* lost_capture = capture_window_;
 | 
| -  capture_window_ = window;
 | 
| -  if (lost_capture) {
 | 
| -    for (auto& observer : *WindowPrivate(lost_capture).observers())
 | 
| -      observer.OnWindowLostCapture(lost_capture);
 | 
| -  }
 | 
| -  for (auto& observer : observers_)
 | 
| -    observer.OnWindowTreeCaptureChanged(window, lost_capture);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::LocalSetFocus(Window* focused) {
 | 
| -  Window* blurred = focused_window_;
 | 
| -  // Update |focused_window_| before calling any of the observers, so that the
 | 
| -  // observers get the correct result from calling |Window::HasFocus()|,
 | 
| -  // |WindowTreeClient::GetFocusedWindow()| etc.
 | 
| -  focused_window_ = focused;
 | 
| -  if (blurred) {
 | 
| -    for (auto& observer : *WindowPrivate(blurred).observers())
 | 
| -      observer.OnWindowFocusChanged(focused, blurred);
 | 
| -  }
 | 
| -  if (focused) {
 | 
| -    for (auto& observer : *WindowPrivate(focused).observers())
 | 
| -      observer.OnWindowFocusChanged(focused, blurred);
 | 
| -  }
 | 
| -  for (auto& observer : observers_)
 | 
| -    observer.OnWindowTreeFocusChanged(focused, blurred);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AddWindow(Window* window) {
 | 
| -  DCHECK(windows_.find(server_id(window)) == windows_.end());
 | 
| -  windows_[server_id(window)] = window;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowDestroying(Window* window) {
 | 
| -  if (window == capture_window_) {
 | 
| -    // Normally the queue updates itself upon window destruction. However since
 | 
| -    // |window| is being destroyed, it will not be possible to notify its
 | 
| -    // observers of the lost capture. Update local state now.
 | 
| -    LocalSetCapture(nullptr);
 | 
| -  }
 | 
| -  // For |focused_window_| window destruction clears the entire focus state.
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowDestroyed(Window* window) {
 | 
| -  windows_.erase(server_id(window));
 | 
| -
 | 
| -  for (auto& entry : embedded_windows_) {
 | 
| -    auto it = entry.second.find(window);
 | 
| -    if (it != entry.second.end()) {
 | 
| -      entry.second.erase(it);
 | 
| -      break;
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
| -  // Remove any InFlightChanges associated with the window.
 | 
| -  std::set<uint32_t> in_flight_change_ids_to_remove;
 | 
| -  for (const auto& pair : in_flight_map_) {
 | 
| -    if (pair.second->window() == window)
 | 
| -      in_flight_change_ids_to_remove.insert(pair.first);
 | 
| -  }
 | 
| -  for (auto change_id : in_flight_change_ids_to_remove)
 | 
| -    in_flight_map_.erase(change_id);
 | 
| -
 | 
| -  const bool was_root = roots_.erase(window) > 0;
 | 
| -  if (!in_destructor_ && was_root && roots_.empty() && is_from_embed_)
 | 
| -    delegate_->OnEmbedRootDestroyed(window);
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::GetWindowByServerId(Id id) {
 | 
| -  IdToWindowMap::const_iterator it = windows_.find(id);
 | 
| -  return it != windows_.end() ? it->second : NULL;
 | 
| -}
 | 
| -
 | 
| -InFlightChange* WindowTreeClient::GetOldestInFlightChangeMatching(
 | 
| -    const InFlightChange& change) {
 | 
| -  for (const auto& pair : in_flight_map_) {
 | 
| -    if (pair.second->window() == change.window() &&
 | 
| -        pair.second->change_type() == change.change_type() &&
 | 
| -        pair.second->Matches(change)) {
 | 
| -      return pair.second.get();
 | 
| -    }
 | 
| -  }
 | 
| -  return nullptr;
 | 
| -}
 | 
| -
 | 
| -uint32_t WindowTreeClient::ScheduleInFlightChange(
 | 
| -    std::unique_ptr<InFlightChange> change) {
 | 
| -  DCHECK(!change->window() ||
 | 
| -         windows_.count(change->window()->server_id()) > 0);
 | 
| -  const uint32_t change_id = next_change_id_++;
 | 
| -  in_flight_map_[change_id] = std::move(change);
 | 
| -  return change_id;
 | 
| -}
 | 
| -
 | 
| -bool WindowTreeClient::ApplyServerChangeToExistingInFlightChange(
 | 
| -    const InFlightChange& change) {
 | 
| -  InFlightChange* existing_change = GetOldestInFlightChangeMatching(change);
 | 
| -  if (!existing_change)
 | 
| -    return false;
 | 
| -
 | 
| -  existing_change->SetRevertValueFrom(change);
 | 
| -  return true;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::BuildWindowTree(
 | 
| -    const std::vector<mojom::WindowDataPtr>& windows,
 | 
| -    Window* initial_parent) {
 | 
| -  for (const auto& window_data : windows) {
 | 
| -    Window* parent = window_data->parent_id == 0
 | 
| -                         ? nullptr
 | 
| -                         : GetWindowByServerId(window_data->parent_id);
 | 
| -    Window* existing_window = GetWindowByServerId(window_data->window_id);
 | 
| -    if (!existing_window)
 | 
| -      AddWindowToClient(this, parent, window_data);
 | 
| -    else if (parent)
 | 
| -      WindowPrivate(parent).LocalAddChild(existing_window);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::NewWindowImpl(
 | 
| -    NewWindowType type,
 | 
| -    const Window::SharedProperties* properties) {
 | 
| -  DCHECK(tree_);
 | 
| -  Window* window =
 | 
| -      new Window(this, MakeTransportId(client_id_, next_window_id_++));
 | 
| -  if (properties)
 | 
| -    window->properties_ = *properties;
 | 
| -  AddWindow(window);
 | 
| -
 | 
| -  const uint32_t change_id =
 | 
| -      ScheduleInFlightChange(base::MakeUnique<CrashInFlightChange>(
 | 
| -          window, type == NewWindowType::CHILD
 | 
| -                      ? ChangeType::NEW_WINDOW
 | 
| -                      : ChangeType::NEW_TOP_LEVEL_WINDOW));
 | 
| -  std::unordered_map<std::string, std::vector<uint8_t>> transport_properties;
 | 
| -  if (properties)
 | 
| -    transport_properties = mojo::MapToUnorderedMap(*properties);
 | 
| -
 | 
| -  if (type == NewWindowType::CHILD) {
 | 
| -    tree_->NewWindow(change_id, server_id(window),
 | 
| -                     std::move(transport_properties));
 | 
| -  } else {
 | 
| -    roots_.insert(window);
 | 
| -    tree_->NewTopLevelWindow(change_id, server_id(window),
 | 
| -                             transport_properties);
 | 
| -  }
 | 
| -  return window;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetWindowTree(mojom::WindowTreePtr window_tree_ptr) {
 | 
| -  tree_ptr_ = std::move(window_tree_ptr);
 | 
| -  tree_ = tree_ptr_.get();
 | 
| -
 | 
| -  tree_ptr_->GetCursorLocationMemory(
 | 
| -      base::Bind(&WindowTreeClient::OnReceivedCursorLocationMemory,
 | 
| -                 weak_factory_.GetWeakPtr()));
 | 
| -
 | 
| -  tree_ptr_.set_connection_error_handler(base::Bind(
 | 
| -      &WindowTreeClient::OnConnectionLost, weak_factory_.GetWeakPtr()));
 | 
| -
 | 
| -  if (window_manager_delegate_) {
 | 
| -    tree_ptr_->GetWindowManagerClient(MakeRequest(
 | 
| -        &window_manager_internal_client_, tree_ptr_.associated_group()));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnConnectionLost() {
 | 
| -  delegate_->OnLostConnection(this);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnEmbedImpl(mojom::WindowTree* window_tree,
 | 
| -                                       ClientSpecificId client_id,
 | 
| -                                       mojom::WindowDataPtr root_data,
 | 
| -                                       int64_t display_id,
 | 
| -                                       Id focused_window_id,
 | 
| -                                       bool drawn) {
 | 
| -  // WARNING: this is only called if WindowTreeClient was created as the
 | 
| -  // result of an embedding.
 | 
| -  tree_ = window_tree;
 | 
| -  client_id_ = client_id;
 | 
| -
 | 
| -  DCHECK(roots_.empty());
 | 
| -  Window* root = AddWindowToClient(this, nullptr, root_data);
 | 
| -  WindowPrivate(root).LocalSetDisplay(display_id);
 | 
| -  roots_.insert(root);
 | 
| -
 | 
| -  focused_window_ = GetWindowByServerId(focused_window_id);
 | 
| -
 | 
| -  WindowPrivate(root).LocalSetParentDrawn(drawn);
 | 
| -
 | 
| -  delegate_->OnEmbed(root);
 | 
| -
 | 
| -  if (focused_window_) {
 | 
| -    for (auto& observer : observers_)
 | 
| -      observer.OnWindowTreeFocusChanged(focused_window_, nullptr);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmNewDisplayAddedImpl(const display::Display& display,
 | 
| -                                             mojom::WindowDataPtr root_data,
 | 
| -                                             bool parent_drawn) {
 | 
| -  DCHECK(window_manager_delegate_);
 | 
| -
 | 
| -  Window* root = AddWindowToClient(this, nullptr, root_data);
 | 
| -  WindowPrivate(root).LocalSetDisplay(display.id());
 | 
| -  WindowPrivate(root).LocalSetParentDrawn(parent_drawn);
 | 
| -  roots_.insert(root);
 | 
| -
 | 
| -  window_manager_delegate_->OnWmNewDisplay(root, display);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnReceivedCursorLocationMemory(
 | 
| -    mojo::ScopedSharedBufferHandle handle) {
 | 
| -  cursor_location_mapping_ = handle->Map(sizeof(base::subtle::Atomic32));
 | 
| -  DCHECK(cursor_location_mapping_);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWmMoveLoopCompleted(uint32_t change_id,
 | 
| -                                             bool completed) {
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->WmResponse(change_id, completed);
 | 
| -
 | 
| -  if (change_id == current_wm_move_loop_change_) {
 | 
| -    current_wm_move_loop_change_ = 0;
 | 
| -    current_wm_move_loop_window_id_ = 0;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| -// WindowTreeClient, WindowTreeClient implementation:
 | 
| -
 | 
| -const std::set<Window*>& WindowTreeClient::GetRoots() {
 | 
| -  return roots_;
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::GetFocusedWindow() {
 | 
| -  return focused_window_;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ClearFocus() {
 | 
| -  if (!focused_window_)
 | 
| -    return;
 | 
| -
 | 
| -  SetFocus(nullptr);
 | 
| -}
 | 
| -
 | 
| -gfx::Point WindowTreeClient::GetCursorScreenPoint() {
 | 
| -  // We raced initialization. Return (0, 0).
 | 
| -  if (!cursor_location_memory())
 | 
| -    return gfx::Point();
 | 
| -
 | 
| -  base::subtle::Atomic32 location =
 | 
| -      base::subtle::NoBarrier_Load(cursor_location_memory());
 | 
| -  return gfx::Point(static_cast<int16_t>(location >> 16),
 | 
| -                    static_cast<int16_t>(location & 0xFFFF));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::StartPointerWatcher(bool want_moves) {
 | 
| -  if (has_pointer_watcher_)
 | 
| -    StopPointerWatcher();
 | 
| -  has_pointer_watcher_ = true;
 | 
| -  tree_->StartPointerWatcher(want_moves);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::StopPointerWatcher() {
 | 
| -  DCHECK(has_pointer_watcher_);
 | 
| -  tree_->StopPointerWatcher();
 | 
| -  has_pointer_watcher_ = false;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::PerformDragDrop(
 | 
| -    Window* window,
 | 
| -    const std::map<std::string, std::vector<uint8_t>>& drag_data,
 | 
| -    int drag_operation,
 | 
| -    const gfx::Point& cursor_location,
 | 
| -    const SkBitmap& bitmap,
 | 
| -    const base::Callback<void(bool, uint32_t)>& callback) {
 | 
| -  DCHECK(!current_drag_state_);
 | 
| -
 | 
| -  // TODO(erg): Pass |cursor_location| and |bitmap| in PerformDragDrop() when
 | 
| -  // we start showing an image representation of the drag under the cursor.
 | 
| -
 | 
| -  auto unordered_drag_data = mojo::MapToUnorderedMap(drag_data);
 | 
| -
 | 
| -  if (window->drop_target()) {
 | 
| -    // To minimize the number of round trips, copy the drag drop data to our
 | 
| -    // handler here, instead of forcing mus to send this same data back.
 | 
| -    OnDragDropStart(unordered_drag_data);
 | 
| -  }
 | 
| -
 | 
| -  uint32_t current_drag_change = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightDragChange>(window, ChangeType::DRAG_LOOP));
 | 
| -  current_drag_state_.reset(new CurrentDragState{
 | 
| -      current_drag_change, ui::mojom::kDropEffectNone, callback});
 | 
| -
 | 
| -  tree_->PerformDragDrop(current_drag_change, window->server_id(),
 | 
| -                         unordered_drag_data, drag_operation);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::CancelDragDrop(Window* window) {
 | 
| -  // Server will clean up drag and fail the in-flight change.
 | 
| -  tree_->CancelDragDrop(window->server_id());
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::PerformWindowMove(
 | 
| -    Window* window,
 | 
| -    ui::mojom::MoveLoopSource source,
 | 
| -    const gfx::Point& cursor_location,
 | 
| -    const base::Callback<void(bool)>& callback) {
 | 
| -  DCHECK(on_current_move_finished_.is_null());
 | 
| -  on_current_move_finished_ = callback;
 | 
| -
 | 
| -  current_move_loop_change_ = ScheduleInFlightChange(
 | 
| -      base::MakeUnique<InFlightDragChange>(window, ChangeType::MOVE_LOOP));
 | 
| -  // Tell the window manager to take over moving us.
 | 
| -  tree_->PerformWindowMove(current_move_loop_change_, window->server_id(),
 | 
| -                           source, cursor_location);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::CancelWindowMove(Window* window) {
 | 
| -  tree_->CancelWindowMove(window->server_id());
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::NewWindow(
 | 
| -    const Window::SharedProperties* properties) {
 | 
| -  return NewWindowImpl(NewWindowType::CHILD, properties);
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::NewTopLevelWindow(
 | 
| -    const Window::SharedProperties* properties) {
 | 
| -  Window* window = NewWindowImpl(NewWindowType::TOP_LEVEL, properties);
 | 
| -  // Assume newly created top level windows are drawn by default, otherwise
 | 
| -  // requests to focus will fail. We will get the real value in
 | 
| -  // OnTopLevelCreated().
 | 
| -  window->LocalSetParentDrawn(true);
 | 
| -  return window;
 | 
| -}
 | 
| -
 | 
| -#if !defined(NDEBUG)
 | 
| -std::string WindowTreeClient::GetDebugWindowHierarchy() const {
 | 
| -  std::string result;
 | 
| -  for (Window* root : roots_)
 | 
| -    BuildDebugInfo(std::string(), root, &result);
 | 
| -  return result;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::BuildDebugInfo(const std::string& depth,
 | 
| -                                      Window* window,
 | 
| -                                      std::string* result) const {
 | 
| -  std::string name = window->GetName();
 | 
| -  *result += base::StringPrintf(
 | 
| -      "%sid=%d visible=%s bounds=%d,%d %dx%d %s\n", depth.c_str(),
 | 
| -      window->server_id(), window->visible() ? "true" : "false",
 | 
| -      window->bounds().x(), window->bounds().y(), window->bounds().width(),
 | 
| -      window->bounds().height(), !name.empty() ? name.c_str() : "(no name)");
 | 
| -  for (Window* child : window->children())
 | 
| -    BuildDebugInfo(depth + "  ", child, result);
 | 
| -}
 | 
| -#endif  // !defined(NDEBUG)
 | 
| -
 | 
| -////////////////////////////////////////////////////////////////////////////////
 | 
| -// WindowTreeClient, WindowTreeClient implementation:
 | 
| -
 | 
| -void WindowTreeClient::AddObserver(WindowTreeClientObserver* observer) {
 | 
| -  observers_.AddObserver(observer);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RemoveObserver(WindowTreeClientObserver* observer) {
 | 
| -  observers_.RemoveObserver(observer);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetCanAcceptDrops(Id window_id, bool can_accept_drops) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetCanAcceptDrops(window_id, can_accept_drops);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetCanAcceptEvents(Id window_id,
 | 
| -                                          bool can_accept_events) {
 | 
| -  DCHECK(tree_);
 | 
| -  tree_->SetCanAcceptEvents(window_id, can_accept_events);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnEmbed(ClientSpecificId client_id,
 | 
| -                               mojom::WindowDataPtr root_data,
 | 
| -                               mojom::WindowTreePtr tree,
 | 
| -                               int64_t display_id,
 | 
| -                               Id focused_window_id,
 | 
| -                               bool drawn) {
 | 
| -  DCHECK(!tree_ptr_);
 | 
| -  tree_ptr_ = std::move(tree);
 | 
| -
 | 
| -  is_from_embed_ = true;
 | 
| -
 | 
| -  if (window_manager_delegate_) {
 | 
| -    tree_ptr_->GetWindowManagerClient(MakeRequest(
 | 
| -        &window_manager_internal_client_, tree_ptr_.associated_group()));
 | 
| -  }
 | 
| -
 | 
| -  OnEmbedImpl(tree_ptr_.get(), client_id, std::move(root_data), display_id,
 | 
| -              focused_window_id, drawn);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnEmbeddedAppDisconnected(Id window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (window) {
 | 
| -    for (auto& observer : *WindowPrivate(window).observers())
 | 
| -      observer.OnWindowEmbeddedAppDisconnected(window);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnUnembed(Id window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  delegate_->OnUnembed(window);
 | 
| -  WindowPrivate(window).LocalDestroy();
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnCaptureChanged(Id new_capture_window_id,
 | 
| -                                        Id old_capture_window_id) {
 | 
| -  Window* new_capture_window = GetWindowByServerId(new_capture_window_id);
 | 
| -  Window* lost_capture_window = GetWindowByServerId(old_capture_window_id);
 | 
| -  if (!new_capture_window && !lost_capture_window)
 | 
| -    return;
 | 
| -
 | 
| -  InFlightCaptureChange change(this, new_capture_window);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(change))
 | 
| -    return;
 | 
| -
 | 
| -  LocalSetCapture(new_capture_window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnTopLevelCreated(uint32_t change_id,
 | 
| -                                             mojom::WindowDataPtr data,
 | 
| -                                             int64_t display_id,
 | 
| -                                             bool drawn) {
 | 
| -  // The server ack'd the top level window we created and supplied the state
 | 
| -  // of the window at the time the server created it. For properties we do not
 | 
| -  // have changes in flight for we can update them immediately. For properties
 | 
| -  // with changes in flight we set the revert value from the server.
 | 
| -
 | 
| -  if (!in_flight_map_.count(change_id)) {
 | 
| -    // The window may have been destroyed locally before the server could finish
 | 
| -    // creating the window, and before the server received the notification that
 | 
| -    // the window has been destroyed.
 | 
| -    return;
 | 
| -  }
 | 
| -  std::unique_ptr<InFlightChange> change(std::move(in_flight_map_[change_id]));
 | 
| -  in_flight_map_.erase(change_id);
 | 
| -
 | 
| -  Window* window = change->window();
 | 
| -  WindowPrivate window_private(window);
 | 
| -
 | 
| -  // Drawn state and display-id always come from the server (they can't be
 | 
| -  // modified locally).
 | 
| -  window_private.LocalSetParentDrawn(drawn);
 | 
| -  window_private.LocalSetDisplay(display_id);
 | 
| -
 | 
| -  // The default visibilty is false, we only need update visibility if it
 | 
| -  // differs from that.
 | 
| -  if (data->visible) {
 | 
| -    InFlightVisibleChange visible_change(window, data->visible);
 | 
| -    InFlightChange* current_change =
 | 
| -        GetOldestInFlightChangeMatching(visible_change);
 | 
| -    if (current_change)
 | 
| -      current_change->SetRevertValueFrom(visible_change);
 | 
| -    else
 | 
| -      window_private.LocalSetVisible(true);
 | 
| -  }
 | 
| -
 | 
| -  const gfx::Rect bounds(data->bounds);
 | 
| -  {
 | 
| -    InFlightBoundsChange bounds_change(window, bounds);
 | 
| -    InFlightChange* current_change =
 | 
| -        GetOldestInFlightChangeMatching(bounds_change);
 | 
| -    if (current_change)
 | 
| -      current_change->SetRevertValueFrom(bounds_change);
 | 
| -    else if (window->bounds() != bounds)
 | 
| -      window_private.LocalSetBounds(window->bounds(), bounds);
 | 
| -  }
 | 
| -
 | 
| -  // There is currently no API to bulk set properties, so we iterate over each
 | 
| -  // property individually.
 | 
| -  Window::SharedProperties properties =
 | 
| -      mojo::UnorderedMapToMap(data->properties);
 | 
| -  for (const auto& pair : properties) {
 | 
| -    InFlightPropertyChange property_change(window, pair.first, pair.second);
 | 
| -    InFlightChange* current_change =
 | 
| -        GetOldestInFlightChangeMatching(property_change);
 | 
| -    if (current_change)
 | 
| -      current_change->SetRevertValueFrom(property_change);
 | 
| -    else
 | 
| -      window_private.LocalSetSharedProperty(pair.first, &(pair.second));
 | 
| -  }
 | 
| -
 | 
| -  // Top level windows should not have a parent.
 | 
| -  DCHECK_EQ(0u, data->parent_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowBoundsChanged(Id window_id,
 | 
| -                                             const gfx::Rect& old_bounds,
 | 
| -                                             const gfx::Rect& new_bounds) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  float device_scale_factor = ScaleFactorForDisplay(window->display_id());
 | 
| -  gfx::Rect old_bounds_in_dip =
 | 
| -      gfx::ConvertRectToDIP(device_scale_factor, old_bounds);
 | 
| -  gfx::Rect new_bounds_in_dip =
 | 
| -      gfx::ConvertRectToDIP(device_scale_factor, new_bounds);
 | 
| -
 | 
| -  InFlightBoundsChange new_change(window, new_bounds_in_dip);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -  WindowPrivate(window).LocalSetBounds(old_bounds_in_dip, new_bounds_in_dip);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnClientAreaChanged(
 | 
| -    uint32_t window_id,
 | 
| -    const gfx::Insets& new_client_area,
 | 
| -    const std::vector<gfx::Rect>& new_additional_client_areas) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (window) {
 | 
| -    float device_scale_factor = ScaleFactorForDisplay(window->display_id());
 | 
| -    std::vector<gfx::Rect> new_additional_client_areas_in_dip;
 | 
| -    for (const gfx::Rect& area : new_additional_client_areas) {
 | 
| -      new_additional_client_areas_in_dip.push_back(
 | 
| -          gfx::ConvertRectToDIP(device_scale_factor, area));
 | 
| -    }
 | 
| -    WindowPrivate(window).LocalSetClientArea(
 | 
| -        gfx::ConvertInsetsToDIP(device_scale_factor, new_client_area),
 | 
| -        new_additional_client_areas_in_dip);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnTransientWindowAdded(
 | 
| -    uint32_t window_id,
 | 
| -    uint32_t transient_window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  Window* transient_window = GetWindowByServerId(transient_window_id);
 | 
| -  // window or transient_window or both may be null if a local delete occurs
 | 
| -  // with an in flight add from the server.
 | 
| -  if (window && transient_window)
 | 
| -    WindowPrivate(window).LocalAddTransientWindow(transient_window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnTransientWindowRemoved(
 | 
| -    uint32_t window_id,
 | 
| -    uint32_t transient_window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  Window* transient_window = GetWindowByServerId(transient_window_id);
 | 
| -  // window or transient_window or both may be null if a local delete occurs
 | 
| -  // with an in flight delete from the server.
 | 
| -  if (window && transient_window)
 | 
| -    WindowPrivate(window).LocalRemoveTransientWindow(transient_window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowHierarchyChanged(
 | 
| -    Id window_id,
 | 
| -    Id old_parent_id,
 | 
| -    Id new_parent_id,
 | 
| -    std::vector<mojom::WindowDataPtr> windows) {
 | 
| -  Window* initial_parent =
 | 
| -      windows.size() ? GetWindowByServerId(windows[0]->parent_id) : NULL;
 | 
| -
 | 
| -  const bool was_window_known = GetWindowByServerId(window_id) != nullptr;
 | 
| -
 | 
| -  BuildWindowTree(windows, initial_parent);
 | 
| -
 | 
| -  // If the window was not known, then BuildWindowTree() will have created it
 | 
| -  // and parented the window.
 | 
| -  if (!was_window_known)
 | 
| -    return;
 | 
| -
 | 
| -  Window* new_parent = GetWindowByServerId(new_parent_id);
 | 
| -  Window* old_parent = GetWindowByServerId(old_parent_id);
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (new_parent)
 | 
| -    WindowPrivate(new_parent).LocalAddChild(window);
 | 
| -  else
 | 
| -    WindowPrivate(old_parent).LocalRemoveChild(window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowReordered(Id window_id,
 | 
| -                                             Id relative_window_id,
 | 
| -                                             mojom::OrderDirection direction) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  Window* relative_window = GetWindowByServerId(relative_window_id);
 | 
| -  if (window && relative_window)
 | 
| -    WindowPrivate(window).LocalReorder(relative_window, direction);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowDeleted(Id window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (window)
 | 
| -    WindowPrivate(window).LocalDestroy();
 | 
| -}
 | 
| -
 | 
| -Window* WindowTreeClient::GetCaptureWindow() {
 | 
| -  return capture_window_;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowVisibilityChanged(Id window_id,
 | 
| -                                                     bool visible) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  InFlightVisibleChange new_change(window, visible);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -
 | 
| -  WindowPrivate(window).LocalSetVisible(visible);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowOpacityChanged(Id window_id,
 | 
| -                                                  float old_opacity,
 | 
| -                                                  float new_opacity) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  InFlightOpacityChange new_change(window, new_opacity);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -
 | 
| -  WindowPrivate(window).LocalSetOpacity(new_opacity);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowParentDrawnStateChanged(Id window_id,
 | 
| -                                                           bool drawn) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (window)
 | 
| -    WindowPrivate(window).LocalSetParentDrawn(drawn);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowSharedPropertyChanged(
 | 
| -    Id window_id,
 | 
| -    const std::string& name,
 | 
| -    const base::Optional<std::vector<uint8_t>>& new_data) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  InFlightPropertyChange new_change(window, name, new_data);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -
 | 
| -  WindowPrivate(window).LocalSetSharedProperty(
 | 
| -      name, new_data ? &new_data.value() : nullptr);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowInputEvent(uint32_t event_id,
 | 
| -                                          Id window_id,
 | 
| -                                          std::unique_ptr<ui::Event> event,
 | 
| -                                          bool matches_pointer_watcher) {
 | 
| -  DCHECK(event);
 | 
| -  Window* window = GetWindowByServerId(window_id);  // May be null.
 | 
| -
 | 
| -  if (matches_pointer_watcher && has_pointer_watcher_) {
 | 
| -    DCHECK(event->IsPointerEvent());
 | 
| -    delegate_->OnPointerEventObserved(*event->AsPointerEvent(), window);
 | 
| -  }
 | 
| -
 | 
| -  if (!window || !window->input_event_handler_) {
 | 
| -    tree_->OnWindowInputEventAck(event_id, mojom::EventResult::UNHANDLED);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  std::unique_ptr<base::Callback<void(mojom::EventResult)>> ack_callback(
 | 
| -      new base::Callback<void(mojom::EventResult)>(
 | 
| -          base::Bind(&mojom::WindowTree::OnWindowInputEventAck,
 | 
| -                     base::Unretained(tree_), event_id)));
 | 
| -
 | 
| -  // TODO(moshayedi): crbug.com/617222. No need to convert to ui::MouseEvent or
 | 
| -  // ui::TouchEvent once we have proper support for pointer events.
 | 
| -  if (event->IsMousePointerEvent()) {
 | 
| -    if (event->type() == ui::ET_POINTER_WHEEL_CHANGED) {
 | 
| -      window->input_event_handler_->OnWindowInputEvent(
 | 
| -          window, ui::MouseWheelEvent(*event->AsPointerEvent()), &ack_callback);
 | 
| -    } else {
 | 
| -      window->input_event_handler_->OnWindowInputEvent(
 | 
| -          window, ui::MouseEvent(*event->AsPointerEvent()), &ack_callback);
 | 
| -    }
 | 
| -  } else if (event->IsTouchPointerEvent()) {
 | 
| -    window->input_event_handler_->OnWindowInputEvent(
 | 
| -        window, ui::TouchEvent(*event->AsPointerEvent()), &ack_callback);
 | 
| -  } else {
 | 
| -    window->input_event_handler_->OnWindowInputEvent(window, *event.get(),
 | 
| -                                                     &ack_callback);
 | 
| -  }
 | 
| -
 | 
| -  // The handler did not take ownership of the callback, so we send the ack,
 | 
| -  // marking the event as not consumed.
 | 
| -  if (ack_callback)
 | 
| -    ack_callback->Run(mojom::EventResult::UNHANDLED);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnPointerEventObserved(std::unique_ptr<ui::Event> event,
 | 
| -                                              uint32_t window_id) {
 | 
| -  DCHECK(event);
 | 
| -  DCHECK(event->IsPointerEvent());
 | 
| -  if (has_pointer_watcher_) {
 | 
| -    Window* target_window = GetWindowByServerId(window_id);
 | 
| -    delegate_->OnPointerEventObserved(*event->AsPointerEvent(), target_window);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowFocused(Id focused_window_id) {
 | 
| -  Window* focused_window = GetWindowByServerId(focused_window_id);
 | 
| -  InFlightFocusChange new_change(this, focused_window);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -
 | 
| -  LocalSetFocus(focused_window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowPredefinedCursorChanged(
 | 
| -    Id window_id,
 | 
| -    mojom::Cursor cursor) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -
 | 
| -  InFlightPredefinedCursorChange new_change(window, cursor);
 | 
| -  if (ApplyServerChangeToExistingInFlightChange(new_change))
 | 
| -    return;
 | 
| -
 | 
| -  WindowPrivate(window).LocalSetPredefinedCursor(cursor);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnWindowSurfaceChanged(
 | 
| -    Id window_id,
 | 
| -    const cc::SurfaceInfo& surface_info) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window)
 | 
| -    return;
 | 
| -  WindowPrivate(window).LocalSetSurfaceInfo(surface_info);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnDragDropStart(
 | 
| -    const std::unordered_map<std::string, std::vector<uint8_t>>& mime_data) {
 | 
| -  mime_drag_data_ = mojo::UnorderedMapToMap(mime_data);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnDragEnter(Id window_id,
 | 
| -                                   uint32_t key_state,
 | 
| -                                   const gfx::Point& position,
 | 
| -                                   uint32_t effect_bitmask,
 | 
| -                                   const OnDragEnterCallback& callback) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window || !window->drop_target()) {
 | 
| -    callback.Run(mojom::kDropEffectNone);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  if (!base::ContainsKey(drag_entered_windows_, window_id)) {
 | 
| -    window->drop_target()->OnDragDropStart(mime_drag_data_);
 | 
| -    drag_entered_windows_.insert(window_id);
 | 
| -  }
 | 
| -
 | 
| -  uint32_t ret =
 | 
| -      window->drop_target()->OnDragEnter(key_state, position, effect_bitmask);
 | 
| -  callback.Run(ret);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnDragOver(Id window_id,
 | 
| -                                  uint32_t key_state,
 | 
| -                                  const gfx::Point& position,
 | 
| -                                  uint32_t effect_bitmask,
 | 
| -                                  const OnDragOverCallback& callback) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window || !window->drop_target()) {
 | 
| -    callback.Run(mojom::kDropEffectNone);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  uint32_t ret =
 | 
| -      window->drop_target()->OnDragOver(key_state, position, effect_bitmask);
 | 
| -  callback.Run(ret);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnDragLeave(Id window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window || !window->drop_target())
 | 
| -    return;
 | 
| -
 | 
| -  window->drop_target()->OnDragLeave();
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnDragDropDone() {
 | 
| -  for (Id id : drag_entered_windows_) {
 | 
| -    Window* window = GetWindowByServerId(id);
 | 
| -    if (!window || !window->drop_target())
 | 
| -      continue;
 | 
| -    window->drop_target()->OnDragDropDone();
 | 
| -  }
 | 
| -  drag_entered_windows_.clear();
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnCompleteDrop(Id window_id,
 | 
| -                                      uint32_t key_state,
 | 
| -                                      const gfx::Point& position,
 | 
| -                                      uint32_t effect_bitmask,
 | 
| -                                      const OnCompleteDropCallback& callback) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window || !window->drop_target()) {
 | 
| -    callback.Run(mojom::kDropEffectNone);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  uint32_t ret = window->drop_target()->OnCompleteDrop(key_state, position,
 | 
| -                                                       effect_bitmask);
 | 
| -  callback.Run(ret);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnPerformDragDropCompleted(uint32_t change_id,
 | 
| -                                                  bool success,
 | 
| -                                                  uint32_t action_taken) {
 | 
| -  if (current_drag_state_ && change_id == current_drag_state_->change_id) {
 | 
| -    current_drag_state_->completed_action = action_taken;
 | 
| -    OnChangeCompleted(change_id, success);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnChangeCompleted(uint32_t change_id, bool success) {
 | 
| -  std::unique_ptr<InFlightChange> change(std::move(in_flight_map_[change_id]));
 | 
| -  in_flight_map_.erase(change_id);
 | 
| -  if (!change)
 | 
| -    return;
 | 
| -
 | 
| -  if (!success)
 | 
| -    change->ChangeFailed();
 | 
| -
 | 
| -  InFlightChange* next_change = GetOldestInFlightChangeMatching(*change);
 | 
| -  if (next_change) {
 | 
| -    if (!success)
 | 
| -      next_change->SetRevertValueFrom(*change);
 | 
| -  } else if (!success) {
 | 
| -    change->Revert();
 | 
| -  }
 | 
| -
 | 
| -  if (change_id == current_move_loop_change_) {
 | 
| -    current_move_loop_change_ = 0;
 | 
| -    on_current_move_finished_.Run(success);
 | 
| -    on_current_move_finished_.Reset();
 | 
| -  }
 | 
| -
 | 
| -  if (current_drag_state_ && change_id == current_drag_state_->change_id) {
 | 
| -    OnDragDropDone();
 | 
| -
 | 
| -    current_drag_state_->on_finished.Run(success,
 | 
| -                                         current_drag_state_->completed_action);
 | 
| -    current_drag_state_.reset();
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::GetWindowManager(
 | 
| -    mojo::AssociatedInterfaceRequest<WindowManager> internal) {
 | 
| -  window_manager_internal_.reset(
 | 
| -      new mojo::AssociatedBinding<mojom::WindowManager>(this,
 | 
| -                                                        std::move(internal)));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RequestClose(uint32_t window_id) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (!window || !IsRoot(window))
 | 
| -    return;
 | 
| -
 | 
| -  for (auto& observer : *WindowPrivate(window).observers())
 | 
| -    observer.OnRequestClose(window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::OnConnect(ClientSpecificId client_id) {
 | 
| -  client_id_ = client_id;
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmNewDisplayAdded(const display::Display& display,
 | 
| -                                         mojom::WindowDataPtr root_data,
 | 
| -                                         bool parent_drawn) {
 | 
| -  WmNewDisplayAddedImpl(display, std::move(root_data), parent_drawn);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmDisplayRemoved(int64_t display_id) {
 | 
| -  DCHECK(window_manager_delegate_);
 | 
| -
 | 
| -  for (Window* root : roots_) {
 | 
| -    if (root->display_id() == display_id) {
 | 
| -      window_manager_delegate_->OnWmDisplayRemoved(root);
 | 
| -      return;
 | 
| -    }
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmDisplayModified(const display::Display& display) {
 | 
| -  DCHECK(window_manager_delegate_);
 | 
| -  window_manager_delegate_->OnWmDisplayModified(display);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmSetBounds(uint32_t change_id,
 | 
| -                                       Id window_id,
 | 
| -                                       const gfx::Rect& transit_bounds) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  bool result = false;
 | 
| -  if (window) {
 | 
| -    DCHECK(window_manager_delegate_);
 | 
| -    gfx::Rect transit_bounds_in_dip = gfx::ConvertRectToDIP(
 | 
| -        ScaleFactorForDisplay(window->display_id()), transit_bounds);
 | 
| -    gfx::Rect bounds = transit_bounds_in_dip;
 | 
| -    result = window_manager_delegate_->OnWmSetBounds(window, &bounds);
 | 
| -    if (result) {
 | 
| -      // If the resulting bounds differ return false. Returning false ensures
 | 
| -      // the client applies the bounds we set below.
 | 
| -      result = bounds == transit_bounds_in_dip;
 | 
| -      window->SetBounds(bounds);
 | 
| -    }
 | 
| -  }
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->WmResponse(change_id, result);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmSetProperty(
 | 
| -    uint32_t change_id,
 | 
| -    Id window_id,
 | 
| -    const std::string& name,
 | 
| -    const base::Optional<std::vector<uint8_t>>& transit_data) {
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  bool result = false;
 | 
| -  if (window) {
 | 
| -    DCHECK(window_manager_delegate_);
 | 
| -    std::unique_ptr<std::vector<uint8_t>> data;
 | 
| -    if (transit_data.has_value())
 | 
| -      data.reset(new std::vector<uint8_t>(transit_data.value()));
 | 
| -
 | 
| -    result = window_manager_delegate_->OnWmSetProperty(window, name, &data);
 | 
| -    if (result) {
 | 
| -      // If the resulting bounds differ return false. Returning false ensures
 | 
| -      // the client applies the bounds we set below.
 | 
| -      window->SetSharedPropertyInternal(name, data.get());
 | 
| -    }
 | 
| -  }
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->WmResponse(change_id, result);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmCreateTopLevelWindow(
 | 
| -    uint32_t change_id,
 | 
| -    ClientSpecificId requesting_client_id,
 | 
| -    const std::unordered_map<std::string, std::vector<uint8_t>>&
 | 
| -        transport_properties) {
 | 
| -  std::map<std::string, std::vector<uint8_t>> properties =
 | 
| -      mojo::UnorderedMapToMap(transport_properties);
 | 
| -  Window* window =
 | 
| -      window_manager_delegate_->OnWmCreateTopLevelWindow(&properties);
 | 
| -  embedded_windows_[requesting_client_id].insert(window);
 | 
| -  if (window_manager_internal_client_) {
 | 
| -    window_manager_internal_client_->OnWmCreatedTopLevelWindow(
 | 
| -        change_id, server_id(window));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmClientJankinessChanged(ClientSpecificId client_id,
 | 
| -                                                bool janky) {
 | 
| -  if (window_manager_delegate_) {
 | 
| -    auto it = embedded_windows_.find(client_id);
 | 
| -    CHECK(it != embedded_windows_.end());
 | 
| -    window_manager_delegate_->OnWmClientJankinessChanged(
 | 
| -        embedded_windows_[client_id], janky);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmPerformMoveLoop(uint32_t change_id,
 | 
| -                                         Id window_id,
 | 
| -                                         mojom::MoveLoopSource source,
 | 
| -                                         const gfx::Point& cursor_location) {
 | 
| -  if (!window_manager_delegate_ || current_wm_move_loop_change_ != 0) {
 | 
| -    OnWmMoveLoopCompleted(change_id, false);
 | 
| -    return;
 | 
| -  }
 | 
| -
 | 
| -  current_wm_move_loop_change_ = change_id;
 | 
| -  current_wm_move_loop_window_id_ = window_id;
 | 
| -  Window* window = GetWindowByServerId(window_id);
 | 
| -  if (window) {
 | 
| -    window_manager_delegate_->OnWmPerformMoveLoop(
 | 
| -        window, source, cursor_location,
 | 
| -        base::Bind(&WindowTreeClient::OnWmMoveLoopCompleted,
 | 
| -                   weak_factory_.GetWeakPtr(), change_id));
 | 
| -  } else {
 | 
| -    OnWmMoveLoopCompleted(change_id, false);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmCancelMoveLoop(uint32_t change_id) {
 | 
| -  if (!window_manager_delegate_ || change_id != current_wm_move_loop_change_)
 | 
| -    return;
 | 
| -
 | 
| -  Window* window = GetWindowByServerId(current_wm_move_loop_window_id_);
 | 
| -  if (window)
 | 
| -    window_manager_delegate_->OnWmCancelMoveLoop(window);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::WmDeactivateWindow(uint32_t window_id) {}
 | 
| -
 | 
| -void WindowTreeClient::OnAccelerator(uint32_t ack_id,
 | 
| -                                     uint32_t accelerator_id,
 | 
| -                                     std::unique_ptr<ui::Event> event) {
 | 
| -  DCHECK(event);
 | 
| -  const mojom::EventResult result =
 | 
| -      window_manager_delegate_->OnAccelerator(accelerator_id, *event.get());
 | 
| -  if (ack_id && window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->OnAcceleratorAck(ack_id, result);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetFrameDecorationValues(
 | 
| -    mojom::FrameDecorationValuesPtr values) {
 | 
| -  if (window_manager_internal_client_) {
 | 
| -    window_manager_internal_client_->WmSetFrameDecorationValues(
 | 
| -        std::move(values));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetNonClientCursor(Window* window,
 | 
| -                                          ui::mojom::Cursor cursor_id) {
 | 
| -  window_manager_internal_client_->WmSetNonClientCursor(server_id(window),
 | 
| -                                                        cursor_id);
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AddAccelerators(
 | 
| -    std::vector<mojom::AcceleratorPtr> accelerators,
 | 
| -    const base::Callback<void(bool)>& callback) {
 | 
| -  if (window_manager_internal_client_) {
 | 
| -    window_manager_internal_client_->AddAccelerators(std::move(accelerators),
 | 
| -                                                     callback);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RemoveAccelerator(uint32_t id) {
 | 
| -  if (window_manager_internal_client_) {
 | 
| -    window_manager_internal_client_->RemoveAccelerator(id);
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::AddActivationParent(Window* window) {
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->AddActivationParent(server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::RemoveActivationParent(Window* window) {
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->RemoveActivationParent(server_id(window));
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::ActivateNextWindow() {
 | 
| -  if (window_manager_internal_client_)
 | 
| -    window_manager_internal_client_->ActivateNextWindow();
 | 
| -}
 | 
| -
 | 
| -void WindowTreeClient::SetUnderlaySurfaceOffsetAndExtendedHitArea(
 | 
| -    Window* window,
 | 
| -    const gfx::Vector2d& offset,
 | 
| -    const gfx::Insets& hit_area) {
 | 
| -  if (window_manager_internal_client_) {
 | 
| -    // TODO(riajiang): Figure out if |offset| needs to be converted.
 | 
| -    // (http://crbugs.com/646932)
 | 
| -    window_manager_internal_client_->SetUnderlaySurfaceOffsetAndExtendedHitArea(
 | 
| -        server_id(window), offset.x(), offset.y(),
 | 
| -        gfx::ConvertInsetsToDIP(ScaleFactorForDisplay(window->display_id()),
 | 
| -                                hit_area));
 | 
| -  }
 | 
| -}
 | 
| -
 | 
| -}  // namespace ui
 | 
| 
 |