Index: chrome/browser/chromeos/ui/focus_ring_controller.cc |
diff --git a/chrome/browser/chromeos/ui/focus_ring_controller.cc b/chrome/browser/chromeos/ui/focus_ring_controller.cc |
index 6a9459acc374c49601d53b36844d51cafa165f4a..2e447a51e080d4b577cb12c8307a196de08375ad 100644 |
--- a/chrome/browser/chromeos/ui/focus_ring_controller.cc |
+++ b/chrome/browser/chromeos/ui/focus_ring_controller.cc |
@@ -4,8 +4,14 @@ |
#include "chrome/browser/chromeos/ui/focus_ring_controller.h" |
+#include "ash/system/tray/actionable_view.h" |
+#include "ash/system/tray/tray_background_view.h" |
+#include "ash/system/tray/tray_popup_header_button.h" |
#include "ash/wm/window_util.h" |
#include "chrome/browser/chromeos/ui/focus_ring_layer.h" |
+#include "ui/aura/window.h" |
+#include "ui/views/controls/button/label_button.h" |
+#include "ui/views/view.h" |
#include "ui/views/widget/widget.h" |
namespace chromeos { |
@@ -37,23 +43,59 @@ void FocusRingController::SetVisible(bool visible) { |
} |
void FocusRingController::UpdateFocusRing() { |
- views::View* focused_view = NULL; |
+ views::View* view = NULL; |
if (widget_ && widget_->GetFocusManager()) |
- focused_view = widget_->GetFocusManager()->GetFocusedView(); |
+ view = widget_->GetFocusManager()->GetFocusedView(); |
// No focus ring if no focused view or the focused view covers the whole |
// widget content area (such as RenderWidgetHostWidgetAura). |
- if (!focused_view || |
- focused_view->ConvertRectToWidget(focused_view->bounds()) == |
+ if (!view || |
+ view->ConvertRectToWidget(view->bounds()) == |
widget_->GetContentsView()->bounds()) { |
focus_ring_layer_.reset(); |
return; |
} |
+ gfx::Rect view_bounds = view->GetContentsBounds(); |
+ |
+ // Workarounds that attempts to pick a better bounds. |
+ if (view->GetClassName() == views::LabelButton::kViewClassName) { |
+ view_bounds = view->GetLocalBounds(); |
+ view_bounds.Inset(2, 2, 2, 2); |
+ } |
+ |
+ // Workarounds for system tray items that have customized focus borders. The |
+ // insets here must be consistent with the ones used by those classes. |
+ if (view->GetClassName() == ash::ActionableView::kViewClassName) { |
+ view_bounds = view->GetLocalBounds(); |
+ view_bounds.Inset(1, 1, 3, 3); |
+ } else if (view->GetClassName() == ash::TrayBackgroundView::kViewClassName) { |
+ view_bounds.Inset(1, 1, 3, 3); |
+ } else if (view->GetClassName() == |
+ ash::TrayPopupHeaderButton::kViewClassName) { |
+ view_bounds = view->GetLocalBounds(); |
+ view_bounds.Inset(2, 1, 2, 2); |
+ } |
+ |
+ // Convert view bounds to widget/window coordinates. |
+ view_bounds = view->ConvertRectToWidget(view_bounds); |
+ |
+ // Translate window coordinates to root window coordinates. |
+ DCHECK(view->GetWidget()); |
+ aura::Window* window = view->GetWidget()->GetNativeWindow(); |
+ aura::Window* root_window = window->GetRootWindow(); |
+ gfx::Point origin = view_bounds.origin(); |
+ aura::Window::ConvertPointToTarget(window, root_window, &origin); |
+ view_bounds.set_origin(origin); |
+ |
+ // Update the focus ring layer. |
if (!focus_ring_layer_) |
- focus_ring_layer_.reset(new FocusRingLayer); |
+ focus_ring_layer_.reset(new FocusRingLayer(this)); |
+ focus_ring_layer_->Set(root_window, view_bounds); |
+} |
- focus_ring_layer_->SetForView(focused_view); |
+void FocusRingController::OnDeviceScaleFactorChanged() { |
+ UpdateFocusRing(); |
} |
void FocusRingController::SetWidget(views::Widget* widget) { |