Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5444)

Unified Diff: chrome/browser/chromeos/login/ui/webui_login_view.cc

Issue 2295843006: Signin screen and locked screen status area focus advancing (Closed)
Patch Set: GetWidget->IsVisible() Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/login/ui/webui_login_view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..e5ce8aaa1d69ab3bfac21275e6db462321c4ea75 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;
@@ -96,6 +99,15 @@ class ScopedArrowKeyTraversal {
DISALLOW_COPY_AND_ASSIGN(ScopedArrowKeyTraversal);
};
+// A helper method returns status area widget delegate if exists,
+// otherwise nullptr.
+ash::StatusAreaWidgetDelegate* GetStatusAreaWidgetDelegate() {
+ ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
+ return tray ? static_cast<ash::StatusAreaWidgetDelegate*>(
+ tray->GetWidget()->GetContentsView())
+ : nullptr;
+}
+
} // namespace
namespace chromeos {
@@ -104,6 +116,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 +234,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 +276,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 +354,15 @@ void WebUILoginView::LoadURL(const GURL & url) {
->GetWidget()
->GetView()
->SetBackgroundColor(SK_ColorTRANSPARENT);
+
+ ash::StatusAreaWidgetDelegate* status_area_widget_delegate =
+ GetStatusAreaWidgetDelegate();
+ DCHECK(status_area_widget_delegate);
+ 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() {
@@ -435,9 +517,11 @@ bool WebUILoginView::TakeFocus(content::WebContents* source, bool reverse) {
if (chrome::IsRunningInMash())
return true;
- ash::SystemTray* tray = ash::Shell::GetInstance()->GetPrimarySystemTray();
- if (tray && tray->GetWidget()->IsVisible()) {
- tray->SetNextFocusableView(this);
+ ash::StatusAreaWidgetDelegate* status_area_widget_delegate =
+ GetStatusAreaWidgetDelegate();
+ if (status_area_widget_delegate &&
+ status_area_widget_delegate->GetWidget()->IsVisible()) {
+ status_area_widget_delegate->set_default_last_focusable_child(reverse);
ash::WmShell::Get()->focus_cycler()->RotateFocus(
reverse ? ash::FocusCycler::BACKWARD : ash::FocusCycler::FORWARD);
}
« no previous file with comments | « chrome/browser/chromeos/login/ui/webui_login_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698