OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/histogram.h" | 7 #include "base/histogram.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/win_util.h" | 9 #include "base/win_util.h" |
10 #include "chrome/browser/renderer_host/render_widget_host_view_win.h" | 10 #include "chrome/browser/renderer_host/render_widget_host_view_win.h" |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
462 while (window) { | 462 while (window) { |
463 if (window == root_) | 463 if (window == root_) |
464 return true; | 464 return true; |
465 window = ::GetParent(window); | 465 window = ::GetParent(window); |
466 } | 466 } |
467 return false; | 467 return false; |
468 } | 468 } |
469 | 469 |
470 void FocusManager::AdvanceFocus(bool reverse) { | 470 void FocusManager::AdvanceFocus(bool reverse) { |
471 View* v = GetNextFocusableView(focused_view_, reverse, false); | 471 View* v = GetNextFocusableView(focused_view_, reverse, false); |
472 if (v && (v != focused_view_)) { | 472 // Note: Do not skip this next block when v == focused_view_. If the user |
| 473 // tabs past the last focusable element in a webpage, we'll get here, and if |
| 474 // the TabContentsContainerView is the only focusable view (possible in |
| 475 // fullscreen mode), we need to run this block in order to cycle around to the |
| 476 // first element on the page. |
| 477 if (v) { |
473 v->AboutToRequestFocusFromTabTraversal(reverse); | 478 v->AboutToRequestFocusFromTabTraversal(reverse); |
474 v->RequestFocus(); | 479 v->RequestFocus(); |
475 } | 480 } |
476 } | 481 } |
477 | 482 |
478 View* FocusManager::GetNextFocusableView(View* original_starting_view, | 483 View* FocusManager::GetNextFocusableView(View* original_starting_view, |
479 bool reverse, | 484 bool reverse, |
480 bool dont_loop) { | 485 bool dont_loop) { |
481 FocusTraversable* focus_traversable = NULL; | 486 FocusTraversable* focus_traversable = NULL; |
482 | 487 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 // top_root_view. | 551 // top_root_view. |
547 return GetNextFocusableView(NULL, false, true); | 552 return GetNextFocusableView(NULL, false, true); |
548 } | 553 } |
549 } | 554 } |
550 } | 555 } |
551 } | 556 } |
552 return NULL; | 557 return NULL; |
553 } | 558 } |
554 | 559 |
555 View* FocusManager::FindLastFocusableView() { | 560 View* FocusManager::FindLastFocusableView() { |
556 // For now we'll just walk the entire focus loop until we reach the end. | 561 // Just walk the entire focus loop from where we're at until we reach the end. |
557 | |
558 // Let's start at whatever focused view we are at. | |
559 View* starting_view = focused_view_; | |
560 | |
561 // Now advance until you reach the end. | |
562 View* new_focused = NULL; | 562 View* new_focused = NULL; |
563 View* last_focused = NULL; | 563 View* last_focused = focused_view_; |
564 while (new_focused = GetNextFocusableView(starting_view, false, true)) { | 564 while (new_focused = GetNextFocusableView(last_focused, false, true)) |
565 last_focused = new_focused; | 565 last_focused = new_focused; |
566 starting_view = new_focused; | |
567 } | |
568 return last_focused; | 566 return last_focused; |
569 } | 567 } |
570 | 568 |
571 void FocusManager::SetFocusedView(View* view) { | 569 void FocusManager::SetFocusedView(View* view) { |
572 if (focused_view_ != view) { | 570 if (focused_view_ != view) { |
573 View* prev_focused_view = focused_view_; | 571 View* prev_focused_view = focused_view_; |
574 if (focused_view_) | 572 if (focused_view_) |
575 focused_view_->WillLoseFocus(); | 573 focused_view_->WillLoseFocus(); |
576 | 574 |
577 if (view) | 575 if (view) |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 listener); | 830 listener); |
833 if (place == focus_change_listeners_.end()) { | 831 if (place == focus_change_listeners_.end()) { |
834 NOTREACHED() << "Removing a listener that isn't registered."; | 832 NOTREACHED() << "Removing a listener that isn't registered."; |
835 return; | 833 return; |
836 } | 834 } |
837 focus_change_listeners_.erase(place); | 835 focus_change_listeners_.erase(place); |
838 } | 836 } |
839 | 837 |
840 } // namespace views | 838 } // namespace views |
841 | 839 |
OLD | NEW |