|  | // Copyright (c) 2017 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 "cursor_manager.h" | 
|  |  | 
|  | #include "content/browser/renderer_host/render_widget_host_view_base.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | CursorManager::CursorManager(RenderWidgetHostViewBase* root) | 
|  | : view_under_cursor_(root), root_view_(root) {} | 
|  |  | 
|  | CursorManager::~CursorManager() {} | 
|  |  | 
|  | void CursorManager::UpdateCursor(RenderWidgetHostViewBase* view, | 
|  | const WebCursor& cursor) { | 
|  | cursor_map_[view] = cursor; | 
|  | if (view == view_under_cursor_) | 
|  | root_view_->DisplayCursor(cursor); | 
|  | } | 
|  |  | 
|  | void CursorManager::UpdateViewUnderCursor(RenderWidgetHostViewBase* view) { | 
|  | view_under_cursor_ = view; | 
|  | WebCursor cursor; | 
|  |  | 
|  | // If no UpdateCursor has been received for this view, use an empty cursor. | 
|  | auto it = cursor_map_.find(view); | 
|  | if (it != cursor_map_.end()) | 
|  | cursor = it->second; | 
|  |  | 
|  | root_view_->DisplayCursor(cursor); | 
|  | } | 
|  |  | 
|  | void CursorManager::ViewBeingDestroyed(RenderWidgetHostViewBase* view) { | 
|  | cursor_map_.erase(view); | 
|  |  | 
|  | // If the view right under the mouse is going away, use the root's cursor | 
|  | // until UpdateViewUnderCursor is called again. | 
|  | if (view == view_under_cursor_ && view != root_view_) | 
|  | UpdateViewUnderCursor(root_view_); | 
|  | } | 
|  |  | 
|  | bool CursorManager::GetCursorForTesting(RenderWidgetHostViewBase* view, | 
|  | WebCursor& cursor) { | 
|  | if (cursor_map_.find(view) == cursor_map_.end()) | 
|  | return false; | 
|  |  | 
|  | cursor = cursor_map_[view]; | 
|  | return true; | 
|  | } | 
|  |  | 
|  | }  // namespace content |