Chromium Code Reviews| Index: chrome/browser/ui/views/payments/editor_view_controller.cc |
| diff --git a/chrome/browser/ui/views/payments/editor_view_controller.cc b/chrome/browser/ui/views/payments/editor_view_controller.cc |
| index 5252645cf78a668e946e8be883c40930c3c589e7..01655de7900e50f8a8f63b62f411599850f917c3 100644 |
| --- a/chrome/browser/ui/views/payments/editor_view_controller.cc |
| +++ b/chrome/browser/ui/views/payments/editor_view_controller.cc |
| @@ -4,6 +4,7 @@ |
| #include "chrome/browser/ui/views/payments/editor_view_controller.h" |
| +#include <algorithm> |
| #include <map> |
| #include <memory> |
| #include <utility> |
| @@ -102,7 +103,8 @@ std::unique_ptr<views::View> EditorViewController::CreateHeaderView() { |
| } |
| std::unique_ptr<views::View> EditorViewController::CreateCustomFieldView( |
| - autofill::ServerFieldType type) { |
| + autofill::ServerFieldType type, |
| + views::View** focusable_field) { |
| return nullptr; |
| } |
| @@ -144,8 +146,6 @@ base::string16 EditorViewController::GetSecondaryButtonLabel() { |
| void EditorViewController::UpdateEditorView() { |
| UpdateContentView(); |
| - // TODO(crbug.com/704254): Find how to update the parent view bounds so that |
| - // the vertical scrollbar size gets updated. |
| dialog()->EditorViewUpdated(); |
| } |
| @@ -189,6 +189,7 @@ std::unique_ptr<views::View> EditorViewController::CreateEditorView() { |
| std::unique_ptr<views::View> editor_view = base::MakeUnique<views::View>(); |
| text_fields_.clear(); |
| comboboxes_.clear(); |
| + first_field_view_ = nullptr; |
| // The editor view is padded horizontally. |
| editor_view->SetBorder(views::CreateEmptyBorder( |
| @@ -280,6 +281,17 @@ std::unique_ptr<views::View> EditorViewController::CreateEditorView() { |
| editor_layout->AddView(required_field.release()); |
| editor_view->SetLayoutManager(editor_layout.release()); |
| + views::View* potential_first_field_view = nullptr; |
|
anthonyvd
2017/05/12 14:19:44
I'm confused: we seem to be creating the fields bo
MAD
2017/05/18 16:01:44
Oups, yes, merge fluke... Sorry about that... :-(
|
| + for (const auto& field : GetFieldDefinitions()) { |
| + views::View* focusable_field = CreateInputField( |
| + static_cast<views::GridLayout*>(editor_view->GetLayoutManager()), |
| + field); |
| + if (!potential_first_field_view) |
| + potential_first_field_view = focusable_field; |
| + } |
| + |
| + if (!first_field_view_) |
| + first_field_view_ = potential_first_field_view; |
| return editor_view; |
| } |
| @@ -290,8 +302,8 @@ std::unique_ptr<views::View> EditorViewController::CreateEditorView() { |
| // |_______________________|__________________________________| |
| // | (empty) | Error label | |
| // +----------------------------------------------------------+ |
| -void EditorViewController::CreateInputField(views::GridLayout* layout, |
| - const EditorField& field) { |
| +views::View* EditorViewController::CreateInputField(views::GridLayout* layout, |
| + const EditorField& field) { |
| int column_set = |
| field.length_hint == EditorField::LengthHint::HINT_SHORT ? 0 : 1; |
| @@ -305,6 +317,8 @@ void EditorViewController::CreateInputField(views::GridLayout* layout, |
| label->SetMultiLine(true); |
| layout->AddView(label.release()); |
| + views::View* focusable_field = nullptr; |
| + |
| constexpr int kInputFieldHeight = 28; |
| if (field.control_type == EditorField::ControlType::TEXTFIELD) { |
| ValidatingTextfield* text_field = |
| @@ -314,11 +328,13 @@ void EditorViewController::CreateInputField(views::GridLayout* layout, |
| // Using autofill field type as a view ID (for testing). |
| text_field->set_id(static_cast<int>(field.type)); |
| text_fields_.insert(std::make_pair(text_field, field)); |
| - |
| - // TODO(crbug.com/718582): Make the initial focus the first incomplete/empty |
| - // field. |
| - if (!first_field_view_) |
| - first_field_view_ = text_field; |
| + focusable_field = text_field; |
| + if (!first_field_view_) { |
| + text_field->Validate(/*display_error=*/false); |
| + if (text_field->invalid()) { |
| + first_field_view_ = text_field; |
| + } |
| + } |
| // |text_field| will now be owned by |row|. |
| layout->AddView(text_field, 1, 1, views::GridLayout::FILL, |
| @@ -333,9 +349,13 @@ void EditorViewController::CreateInputField(views::GridLayout* layout, |
| combobox->set_id(static_cast<int>(field.type)); |
| combobox->set_listener(this); |
| comboboxes_.insert(std::make_pair(combobox, field)); |
| - |
| - if (!first_field_view_) |
| - first_field_view_ = combobox; |
| + focusable_field = combobox; |
| + if (!first_field_view_) { |
| + combobox->Validate(/*display_error=*/false); |
| + if (combobox->invalid()) { |
| + first_field_view_ = combobox; |
| + } |
| + } |
| // |combobox| will now be owned by |row|. |
| layout->AddView(combobox, 1, 1, views::GridLayout::FILL, |
| @@ -343,7 +363,8 @@ void EditorViewController::CreateInputField(views::GridLayout* layout, |
| } else { |
| // Custom field view will now be owned by |row|. And it must be valid since |
| // the derived class specified a custom view for this field. |
| - std::unique_ptr<views::View> field_view = CreateCustomFieldView(field.type); |
| + std::unique_ptr<views::View> field_view = |
| + CreateCustomFieldView(field.type, &focusable_field); |
| DCHECK(field_view); |
| layout->AddView(field_view.release()); |
| } |
| @@ -364,6 +385,7 @@ void EditorViewController::CreateInputField(views::GridLayout* layout, |
| // Bottom padding for the row. |
| layout->AddPaddingRow(0, kInputRowSpacing); |
| + return focusable_field; |
| } |
| int EditorViewController::ComputeWidestExtraViewWidth( |