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

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: fix shift-tab skipping notification tray 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..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);
}
« 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