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

Unified Diff: chrome/browser/ui/views/payments/payment_request_sheet_controller.cc

Issue 2866443002: [Web Payments] Handle "Enter" accelerator when there's a primary action (Closed)
Patch Set: Add tests to sheets that handle the enter accelerator Created 3 years, 7 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
Index: chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
diff --git a/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc b/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
index de6934cf3e1cf43edb88e29da3c840a81bf8f68c..6052121600bf91362124c395b28c2162db5bb34e 100644
--- a/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
@@ -5,7 +5,6 @@
#include "chrome/browser/ui/views/payments/payment_request_sheet_controller.h"
#include "chrome/browser/ui/views/payments/payment_request_dialog_view.h"
-#include "chrome/browser/ui/views/payments/payment_request_dialog_view_ids.h"
#include "chrome/browser/ui/views/payments/payment_request_views_util.h"
#include "components/payments/content/payment_request.h"
#include "components/strings/grit/components_strings.h"
@@ -22,6 +21,13 @@ namespace payments {
namespace {
+// This event is used to pass to ButtonPressed when its event parameter doesn't
+// matter, only the sender.
+class DummyEvent : public ui::Event {
+ public:
+ DummyEvent() : ui::Event(ui::ET_UNKNOWN, base::TimeTicks(), 0) {}
+};
+
// This class is the actual sheet that gets pushed on the view_stack_. It
// implements views::FocusTraversable to trap focus within its hierarchy. This
// way, focus doesn't leave the topmost sheet on the view stack to go on views
@@ -32,9 +38,14 @@ namespace {
// this SheetView's RequestFocus() is called.
class SheetView : public views::View, public views::FocusTraversable {
public:
- SheetView()
+ explicit SheetView(
+ const base::Callback<bool()>& enter_key_accelerator_callback)
: first_focusable_(nullptr),
- focus_search_(base::MakeUnique<views::FocusSearch>(this, true, false)) {
+ focus_search_(base::MakeUnique<views::FocusSearch>(this, true, false)),
+ enter_key_accelerator_(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)),
+ enter_key_accelerator_callback_(enter_key_accelerator_callback) {
+ if (enter_key_accelerator_callback_)
+ AddAccelerator(enter_key_accelerator_);
}
// Sets |view| as the first focusable view in this pane. If it's nullptr, the
@@ -69,8 +80,18 @@ class SheetView : public views::View, public views::FocusTraversable {
first_focusable->RequestFocus();
}
+ bool AcceleratorPressed(const ui::Accelerator& accelerator) override {
+ if (accelerator == enter_key_accelerator_ &&
+ enter_key_accelerator_callback_) {
+ return enter_key_accelerator_callback_.Run();
+ }
+ return views::View::AcceleratorPressed(accelerator);
+ }
+
views::View* first_focusable_;
std::unique_ptr<views::FocusSearch> focus_search_;
+ ui::Accelerator enter_key_accelerator_;
+ base::Callback<bool()> enter_key_accelerator_callback_;
DISALLOW_COPY_AND_ASSIGN(SheetView);
};
@@ -139,7 +160,21 @@ void PaymentRequestSheetController::ButtonPressed(
std::unique_ptr<views::View>
PaymentRequestSheetController::CreatePaymentView() {
- std::unique_ptr<SheetView> view = base::MakeUnique<SheetView>();
+ // Create the footer now so that it's known if there's a primary button or not
+ // before creating the sheet view. This way, it's possible to determine
+ // whether there's something to do when the user hits enter.
+ std::unique_ptr<views::View> footer = CreateFooterView();
+ std::unique_ptr<SheetView> view = base::MakeUnique<SheetView>(
+ primary_button_
+ ? base::Bind(
+ &PaymentRequestSheetController::PerformPrimaryButtonAction,
+ base::Unretained(this))
+ : base::Callback<bool()>());
+
+ DialogViewID sheet_id;
+ if (GetSheetId(&sheet_id))
+ view->set_id(static_cast<int>(sheet_id));
+
view->set_background(views::Background::CreateSolidBackground(SK_ColorWHITE));
// Paint the sheets to layers, otherwise the MD buttons (which do paint to a
@@ -186,7 +221,7 @@ PaymentRequestSheetController::CreatePaymentView() {
layout->AddView(scroll_.get());
layout->StartRow(0, 0);
- layout->AddView(CreateFooterView().release());
+ layout->AddView(footer.release());
view->SetFirstFocusableView(GetFirstFocusedView());
@@ -256,4 +291,16 @@ views::View* PaymentRequestSheetController::GetFirstFocusedView() {
return secondary_button_.get();
}
+bool PaymentRequestSheetController::GetSheetId(DialogViewID* sheet_id) {
+ return false;
+}
+
+bool PaymentRequestSheetController::PerformPrimaryButtonAction() {
+ if (primary_button_ && primary_button_->enabled()) {
+ ButtonPressed(primary_button_.get(), DummyEvent());
+ return true;
+ }
+ return false;
+}
+
} // namespace payments

Powered by Google App Engine
This is Rietveld 408576698