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

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: 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
« no previous file with comments | « chrome/browser/ui/views/payments/payment_request_sheet_controller.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/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..658c877950630036856f78945f5efe72294ea784 100644
--- a/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
+++ b/chrome/browser/ui/views/payments/payment_request_sheet_controller.cc
@@ -22,6 +22,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 +39,13 @@ namespace {
// this SheetView's RequestFocus() is called.
class SheetView : public views::View, public views::FocusTraversable {
public:
- SheetView()
+ explicit SheetView(const base::Callback<bool()>& confirm_accelerator_callback)
: first_focusable_(nullptr),
- focus_search_(base::MakeUnique<views::FocusSearch>(this, true, false)) {
+ focus_search_(base::MakeUnique<views::FocusSearch>(this, true, false)),
+ confirm_accelerator_(ui::Accelerator(ui::VKEY_RETURN, ui::EF_NONE)),
Mathieu 2017/05/04 17:12:43 nit: I would prefer |enter_key_accelerator|, becau
anthonyvd 2017/05/04 18:56:46 Done.
+ confirm_accelerator_callback_(confirm_accelerator_callback) {
+ if (confirm_accelerator_callback_)
+ AddAccelerator(confirm_accelerator_);
}
// Sets |view| as the first focusable view in this pane. If it's nullptr, the
@@ -69,8 +80,17 @@ class SheetView : public views::View, public views::FocusTraversable {
first_focusable->RequestFocus();
}
+ bool AcceleratorPressed(const ui::Accelerator& accelerator) override {
+ if (accelerator == confirm_accelerator_ && confirm_accelerator_callback_) {
Mathieu 2017/05/04 17:12:43 no curlies?
anthonyvd 2017/05/04 18:56:46 Since enter_key_accelerator is longer, the conditi
+ return confirm_accelerator_callback_.Run();
+ }
+ return views::View::AcceleratorPressed(accelerator);
+ }
+
views::View* first_focusable_;
std::unique_ptr<views::FocusSearch> focus_search_;
+ ui::Accelerator confirm_accelerator_;
+ base::Callback<bool()> confirm_accelerator_callback_;
DISALLOW_COPY_AND_ASSIGN(SheetView);
};
@@ -139,7 +159,16 @@ 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()>());
view->set_background(views::Background::CreateSolidBackground(SK_ColorWHITE));
// Paint the sheets to layers, otherwise the MD buttons (which do paint to a
@@ -186,7 +215,7 @@ PaymentRequestSheetController::CreatePaymentView() {
layout->AddView(scroll_.get());
layout->StartRow(0, 0);
- layout->AddView(CreateFooterView().release());
+ layout->AddView(footer.release());
view->SetFirstFocusableView(GetFirstFocusedView());
@@ -256,4 +285,12 @@ views::View* PaymentRequestSheetController::GetFirstFocusedView() {
return secondary_button_.get();
}
+bool PaymentRequestSheetController::PerformPrimaryButtonAction() {
+ if (primary_button_ && primary_button_->enabled()) {
+ ButtonPressed(primary_button_.get(), DummyEvent());
Mathieu 2017/05/04 17:12:43 could we inline ui::Event(ui::ET_UNKNOWN, base::Ti
anthonyvd 2017/05/04 18:56:46 That constructor is protected.
+ return true;
+ }
+ return false;
+}
+
} // namespace payments
« no previous file with comments | « chrome/browser/ui/views/payments/payment_request_sheet_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698