| Index: mojo/services/view_manager/focus_controller.cc | 
| diff --git a/mojo/services/view_manager/focus_controller.cc b/mojo/services/view_manager/focus_controller.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..3e363eec232ee31d8d75b6e32c0821745c66997f | 
| --- /dev/null | 
| +++ b/mojo/services/view_manager/focus_controller.cc | 
| @@ -0,0 +1,54 @@ | 
| +// Copyright 2015 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 "mojo/services/view_manager/focus_controller.h" | 
| + | 
| +#include "mojo/services/view_manager/focus_controller_delegate.h" | 
| +#include "mojo/services/view_manager/server_view.h" | 
| +#include "mojo/services/view_manager/server_view_drawn_tracker.h" | 
| + | 
| +namespace view_manager { | 
| + | 
| +FocusController::FocusController(FocusControllerDelegate* delegate, | 
| +                                 ServerView* root) | 
| +    : delegate_(delegate), root_(root) { | 
| +} | 
| + | 
| +FocusController::~FocusController() { | 
| +} | 
| + | 
| +void FocusController::SetFocusedView(ServerView* view) { | 
| +  if (GetFocusedView() == view) | 
| +    return; | 
| + | 
| +  SetFocusedViewImpl(view, CHANGE_SOURCE_EXPLICIT); | 
| +} | 
| + | 
| +ServerView* FocusController::GetFocusedView() { | 
| +  return drawn_tracker_ ? drawn_tracker_->view() : nullptr; | 
| +} | 
| + | 
| +void FocusController::SetFocusedViewImpl(ServerView* view, | 
| +                                         ChangeSource change_source) { | 
| +  ServerView* old = GetFocusedView(); | 
| + | 
| +  DCHECK(!view || view->IsDrawn(root_)); | 
| + | 
| +  if (view) | 
| +    drawn_tracker_.reset(new ServerViewDrawnTracker(root_, view, this)); | 
| +  else | 
| +    drawn_tracker_.reset(); | 
| + | 
| +  if (change_source == CHANGE_SOURCE_DRAWN_STATE_CHANGED) | 
| +    delegate_->OnFocusChanged(old, view); | 
| +} | 
| + | 
| +void FocusController::OnDrawnStateChanged(ServerView* ancestor, | 
| +                                          ServerView* view, | 
| +                                          bool is_drawn) { | 
| +  DCHECK(!is_drawn);  // We only observe when drawn. | 
| +  SetFocusedViewImpl(ancestor, CHANGE_SOURCE_DRAWN_STATE_CHANGED); | 
| +} | 
| + | 
| +}  // namespace view_manager | 
|  |