Chromium Code Reviews| Index: chrome/browser/chromeos/login/ui/webui_login_view.cc |
| diff --git a/chrome/browser/chromeos/login/ui/webui_login_view.cc b/chrome/browser/chromeos/login/ui/webui_login_view.cc |
| index 52bac0110ed21563bb76c63d1b9cbc6a3b656de2..f5d8ad7f218c7e4b5191fdf1f2fe7db63e7e2d8b 100644 |
| --- a/chrome/browser/chromeos/login/ui/webui_login_view.cc |
| +++ b/chrome/browser/chromeos/login/ui/webui_login_view.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/chromeos/login/ui/webui_login_view.h" |
| #include "ash/common/focus_cycler.h" |
| +#include "ash/common/system/status_area_widget_delegate.h" |
| #include "ash/common/system/tray/system_tray.h" |
| #include "ash/common/wm_shell.h" |
| #include "ash/shell.h" |
| @@ -53,6 +54,8 @@ |
| #include "ui/gfx/geometry/rect.h" |
| #include "ui/gfx/geometry/size.h" |
| #include "ui/views/controls/webview/webview.h" |
| +#include "ui/views/focus/focus_manager.h" |
| +#include "ui/views/focus/focus_search.h" |
| #include "ui/views/widget/widget.h" |
| using content::NativeWebKeyboardEvent; |
| @@ -104,6 +107,59 @@ namespace chromeos { |
| const char WebUILoginView::kViewClassName[] = |
| "browser/chromeos/login/WebUILoginView"; |
| +// WebUILoginView::CycleFocusTraversable --------------------------------------- |
| +class WebUILoginView::CycleFocusTraversable : public views::FocusTraversable { |
| + public: |
| + explicit CycleFocusTraversable(WebUILoginView* webui_login_view) |
| + : cycle_focus_search_(webui_login_view, true, false) {} |
| + ~CycleFocusTraversable() override {} |
| + |
| + // views::FocusTraversable |
| + views::FocusSearch* GetFocusSearch() override { return &cycle_focus_search_; } |
| + |
| + views::FocusTraversable* GetFocusTraversableParent() override { |
| + return nullptr; |
| + } |
| + |
| + views::View* GetFocusTraversableParentView() override { return nullptr; } |
| + |
| + private: |
| + views::FocusSearch cycle_focus_search_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(CycleFocusTraversable); |
| +}; |
| + |
| +// WebUILoginView::StatusAreaFocusTraversable ---------------------------------- |
| +class WebUILoginView::StatusAreaFocusTraversable |
| + : public views::FocusTraversable { |
| + public: |
| + StatusAreaFocusTraversable( |
| + ash::StatusAreaWidgetDelegate* status_area_widget_delegate, |
| + WebUILoginView* webui_login_view) |
| + : webui_login_view_(webui_login_view), |
| + status_area_focus_search_(status_area_widget_delegate, false, false) {} |
| + ~StatusAreaFocusTraversable() override {} |
| + |
| + // views::FocusTraversable |
| + views::FocusSearch* GetFocusSearch() override { |
| + return &status_area_focus_search_; |
| + } |
| + |
| + views::FocusTraversable* GetFocusTraversableParent() override { |
| + return webui_login_view_->cycle_focus_traversable_.get(); |
| + } |
| + |
| + views::View* GetFocusTraversableParentView() override { |
| + return webui_login_view_->status_area_widget_host_; |
| + } |
| + |
| + private: |
| + WebUILoginView* const webui_login_view_; |
| + views::FocusSearch status_area_focus_search_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(StatusAreaFocusTraversable); |
| +}; |
| + |
| // WebUILoginView public: ------------------------------------------------------ |
| WebUILoginView::WebUILoginView() |
| @@ -169,8 +225,13 @@ WebUILoginView::~WebUILoginView() { |
| if (!chrome::IsRunningInMash() && |
| ash::Shell::GetInstance()->HasPrimaryStatusArea()) { |
| - ash::Shell::GetInstance()->GetPrimarySystemTray()-> |
| - SetNextFocusableView(NULL); |
| + views::Widget* tray_widget = |
| + ash::Shell::GetInstance()->GetPrimarySystemTray()->GetWidget(); |
| + ash::StatusAreaWidgetDelegate* status_area_widget_delegate = |
| + static_cast<ash::StatusAreaWidgetDelegate*>( |
| + tray_widget->GetContentsView()); |
| + status_area_widget_delegate->set_custom_focus_traversable(nullptr); |
| + status_area_widget_delegate->set_default_last_focusable_child(false); |
| } else { |
| NOTIMPLEMENTED(); |
| } |
| @@ -206,6 +267,9 @@ void WebUILoginView::Init() { |
| content::RendererPreferences* prefs = web_contents->GetMutableRendererPrefs(); |
| renderer_preferences_util::UpdateFromSystemSettings( |
| prefs, signin_profile, web_contents); |
| + |
| + status_area_widget_host_ = new views::View; |
| + AddChildView(status_area_widget_host_); |
| } |
| const char* WebUILoginView::GetClassName() const { |
| @@ -281,6 +345,17 @@ void WebUILoginView::LoadURL(const GURL & url) { |
| ->GetWidget() |
| ->GetView() |
| ->SetBackgroundColor(SK_ColorTRANSPARENT); |
| + |
| + views::Widget* tray_widget = |
| + ash::Shell::GetInstance()->GetPrimarySystemTray()->GetWidget(); |
| + ash::StatusAreaWidgetDelegate* status_area_widget_delegate = |
| + static_cast<ash::StatusAreaWidgetDelegate*>( |
| + tray_widget->GetContentsView()); |
|
xiyuan
2016/09/13 18:00:57
nit: Let's create a helper function to get this St
Qiang(Joe) Xu
2016/09/13 21:44:56
Done.
|
| + cycle_focus_traversable_.reset(new CycleFocusTraversable(this)); |
| + status_area_focus_traversable_.reset( |
| + new StatusAreaFocusTraversable(status_area_widget_delegate, this)); |
| + status_area_widget_delegate->set_custom_focus_traversable( |
| + status_area_focus_traversable_.get()); |
| } |
| content::WebUI* WebUILoginView::GetWebUI() { |
| @@ -437,7 +512,10 @@ bool WebUILoginView::TakeFocus(content::WebContents* source, bool reverse) { |
| ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray(); |
| if (tray && tray->GetWidget()->IsVisible()) { |
| - tray->SetNextFocusableView(this); |
| + ash::StatusAreaWidgetDelegate* status_area_widget_delegate = |
| + static_cast<ash::StatusAreaWidgetDelegate*>( |
| + tray->GetWidget()->GetContentsView()); |
| + status_area_widget_delegate->set_default_last_focusable_child(reverse); |
| ash::WmShell::Get()->focus_cycler()->RotateFocus( |
| reverse ? ash::FocusCycler::BACKWARD : ash::FocusCycler::FORWARD); |
| } |