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

Unified Diff: chrome/browser/ui/views/autofill/autofill_popup_view_views.cc

Issue 2670003002: Accessibility for Autofill Popup View in native code (Closed)
Patch Set: Moves AutofillPopupChildView to anonymous namespace. Created 3 years, 10 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/ui/views/autofill/autofill_popup_view_views.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/views/autofill/autofill_popup_view_views.cc
diff --git a/chrome/browser/ui/views/autofill/autofill_popup_view_views.cc b/chrome/browser/ui/views/autofill/autofill_popup_view_views.cc
index 89925cee23efa839e82e4105a6ff2f6b6bc68806..55cc3ebf19320bd33be81b085e7c8903154eb216 100644
--- a/chrome/browser/ui/views/autofill/autofill_popup_view_views.cc
+++ b/chrome/browser/ui/views/autofill/autofill_popup_view_views.cc
@@ -6,8 +6,11 @@
#include "chrome/browser/ui/autofill/autofill_popup_controller.h"
#include "chrome/browser/ui/autofill/autofill_popup_layout_model.h"
+#include "chrome/grit/generated_resources.h"
#include "components/autofill/core/browser/popup_item_ids.h"
#include "components/autofill/core/browser/suggestion.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/base/l10n/l10n_util.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/point.h"
@@ -20,23 +23,51 @@
namespace autofill {
+namespace {
+
+// Child view only for triggering accessibility events. Rendering is handled
+// by |AutofillPopupViewViews|.
+class AutofillPopupChildView : public views::View {
+ public:
+ AutofillPopupChildView(AutofillPopupController* controller, size_t index);
+
+ private:
+ ~AutofillPopupChildView() override;
+
+ // views::Views implementation
+ void GetAccessibleNodeData(ui::AXNodeData* node_data) override;
+
+ AutofillPopupController* controller_; // Weak reference.
+ const size_t index_;
+
+ DISALLOW_COPY_AND_ASSIGN(AutofillPopupChildView);
+};
+
+} // namespace
+
AutofillPopupViewViews::AutofillPopupViewViews(
- AutofillPopupController* controller,
- views::Widget* parent_widget)
+ AutofillPopupController* controller, views::Widget* parent_widget)
: AutofillPopupBaseView(controller, parent_widget),
- controller_(controller) {}
+ controller_(controller) {
+ for (size_t i = 0; i < controller_->GetLineCount(); ++i) {
+ AutofillPopupChildView *child = new AutofillPopupChildView(controller, i);
+ AddChildViewAt(child, static_cast<int>(i));
+ }
+ SetFocusBehavior(FocusBehavior::ALWAYS);
+}
AutofillPopupViewViews::~AutofillPopupViewViews() {}
void AutofillPopupViewViews::Show() {
DoShow();
+ NotifyAccessibilityEvent(ui::AX_EVENT_MENU_START, true);
}
void AutofillPopupViewViews::Hide() {
// The controller is no longer valid after it hides us.
controller_ = NULL;
-
DoHide();
+ NotifyAccessibilityEvent(ui::AX_EVENT_MENU_END, true);
}
void AutofillPopupViewViews::UpdateBoundsAndRedrawPopup() {
@@ -70,6 +101,13 @@ void AutofillPopupViewViews::InvalidateRow(size_t row) {
SchedulePaintInRect(controller_->layout_model().GetRowBounds(row));
}
+void AutofillPopupViewViews::NotifyAccessibilityEventForRow(
+ ui::AXEvent event_type, size_t row) {
+ AutofillPopupChildView *child_view =
+ static_cast<AutofillPopupChildView*>(child_at(row));
+ child_view->NotifyAccessibilityEvent(event_type, true);
+}
+
/**
* Autofill entries in ltr.
*
@@ -189,6 +227,12 @@ void AutofillPopupViewViews::DrawAutofillEntry(gfx::Canvas* canvas,
}
}
+void AutofillPopupViewViews::GetAccessibleNodeData(ui::AXNodeData* node_data) {
+ node_data->role = ui::AX_ROLE_MENU;
+ node_data->SetName(l10n_util::GetStringUTF16(
+ IDS_AUTOFILL_POPUP_ACCESSIBLE_NODE_DATA));
+}
+
AutofillPopupView* AutofillPopupView::Create(
AutofillPopupController* controller) {
views::Widget* observing_widget =
@@ -203,4 +247,25 @@ AutofillPopupView* AutofillPopupView::Create(
return new AutofillPopupViewViews(controller, observing_widget);
}
+namespace {
+
+AutofillPopupChildView::AutofillPopupChildView(
+ AutofillPopupController* controller, size_t index)
+ : controller_(controller), index_(index) {
+ SetFocusBehavior(FocusBehavior::ALWAYS);
Mathieu 2017/02/27 19:01:05 I think we can have the function bodies in the ano
csashi 2017/02/27 19:09:38 Done.
+}
+
+AutofillPopupChildView::~AutofillPopupChildView() {}
+
+void AutofillPopupChildView::GetAccessibleNodeData(ui::AXNodeData* node_data) {
+ if (!controller_)
+ return;
+ // We do not special case |POPUP_ITEM_ID_SEPARATOR| suggestion because we
+ // skip that suggestion when the user navigates through the popup suggestions.
+ node_data->role = ui::AX_ROLE_MENU_ITEM;
+ node_data->SetName(controller_->GetElidedValueAt(index_));
+}
+
+} // namespace
+
} // namespace autofill
« no previous file with comments | « chrome/browser/ui/views/autofill/autofill_popup_view_views.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698