Commit 4a68f775 authored by Nick Burris's avatar Nick Burris Committed by Commit Bot

[SecurePaymentConfirmation] Create SecurePaymentConfirmationView

Create the view that draws the secure payment confirmation dialog.

Bug: 1110322
Change-Id: I99e113a24fda093423b9ebb0def776d57446ff4e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2340320
Commit-Queue: Nick Burris <nburris@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#798925}
parent c93e31f3
......@@ -3724,6 +3724,9 @@ static_library("ui") {
"views/payments/payment_sheet_view_controller.h",
"views/payments/profile_list_view_controller.cc",
"views/payments/profile_list_view_controller.h",
"views/payments/secure_payment_confirmation_dialog_view.cc",
"views/payments/secure_payment_confirmation_dialog_view.h",
"views/payments/secure_payment_confirmation_view.cc",
"views/payments/shipping_address_editor_view_controller.cc",
"views/payments/shipping_address_editor_view_controller.h",
"views/payments/shipping_option_view_controller.cc",
......@@ -4466,6 +4469,7 @@ static_library("test_support") {
"//chrome/browser/devtools",
"//components/omnibox/browser",
"//components/password_manager/core/browser",
"//components/payments/content",
"//components/permissions",
"//components/sessions",
"//components/translate/content/browser",
......@@ -4506,6 +4510,8 @@ static_library("test_support") {
"views/find_bar_host_unittest_util_views.cc",
"views/payments/test_chrome_payment_request_delegate.cc",
"views/payments/test_chrome_payment_request_delegate.h",
"views/payments/test_secure_payment_confirmation_payment_request_delegate.cc",
"views/payments/test_secure_payment_confirmation_payment_request_delegate.h",
"views/webauthn/authenticator_request_dialog_view_test_api.cc",
"views/webauthn/authenticator_request_dialog_view_test_api.h",
]
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.h"
#include "chrome/browser/ui/views/chrome_layout_provider.h"
#include "components/constrained_window/constrained_window_views.h"
#include "components/payments/content/secure_payment_confirmation_model.h"
namespace payments {
SecurePaymentConfirmationDialogView::SecurePaymentConfirmationDialogView(
ObserverForTest* observer_for_test)
: observer_for_test_(observer_for_test) {}
SecurePaymentConfirmationDialogView::~SecurePaymentConfirmationDialogView() =
default;
void SecurePaymentConfirmationDialogView::ShowDialog(
content::WebContents* web_contents,
base::WeakPtr<SecurePaymentConfirmationModel> model,
VerifyCallback verify_callback,
CancelCallback cancel_callback) {
DCHECK(model);
model_ = model;
OnModelUpdated();
// Set the dialog size. This is just for demonstration and will no longer be
// necessary once the layout is complete.
const int dialog_width = ChromeLayoutProvider::Get()->GetDistanceMetric(
DISTANCE_MODAL_DIALOG_PREFERRED_WIDTH);
const gfx::Size dialog_size(dialog_width, 300);
SetPreferredSize(dialog_size);
verify_callback_ = std::move(verify_callback);
cancel_callback_ = std::move(cancel_callback);
SetAcceptCallback(
base::BindOnce(&SecurePaymentConfirmationDialogView::OnDialogAccepted,
weak_ptr_factory_.GetWeakPtr()));
SetCancelCallback(
base::BindOnce(&SecurePaymentConfirmationDialogView::OnDialogCancelled,
weak_ptr_factory_.GetWeakPtr()));
SetCloseCallback(
base::BindOnce(&SecurePaymentConfirmationDialogView::OnDialogClosed,
weak_ptr_factory_.GetWeakPtr()));
constrained_window::ShowWebModalDialogViews(this, web_contents);
if (observer_for_test_)
observer_for_test_->OnDialogOpened();
}
void SecurePaymentConfirmationDialogView::OnDialogAccepted() {
std::move(verify_callback_).Run();
if (observer_for_test_) {
observer_for_test_->OnConfirmButtonPressed();
observer_for_test_->OnDialogClosed();
}
}
void SecurePaymentConfirmationDialogView::OnDialogCancelled() {
std::move(cancel_callback_).Run();
if (observer_for_test_) {
observer_for_test_->OnCancelButtonPressed();
observer_for_test_->OnDialogClosed();
}
}
void SecurePaymentConfirmationDialogView::OnDialogClosed() {
std::move(cancel_callback_).Run();
if (observer_for_test_) {
observer_for_test_->OnDialogClosed();
}
}
void SecurePaymentConfirmationDialogView::OnModelUpdated() {
SetButtonLabel(ui::DIALOG_BUTTON_OK, model_->verify_button_label());
SetButtonEnabled(ui::DIALOG_BUTTON_OK, model_->verify_button_enabled());
SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, model_->cancel_button_label());
SetButtonEnabled(ui::DIALOG_BUTTON_CANCEL, model_->cancel_button_enabled());
}
void SecurePaymentConfirmationDialogView::HideDialog() {
GetWidget()->Close();
}
ui::ModalType SecurePaymentConfirmationDialogView::GetModalType() const {
return ui::MODAL_TYPE_CHILD;
}
bool SecurePaymentConfirmationDialogView::ShouldShowCloseButton() const {
return false;
}
base::WeakPtr<SecurePaymentConfirmationDialogView>
SecurePaymentConfirmationDialogView::GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
} // namespace payments
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_PAYMENTS_SECURE_PAYMENT_CONFIRMATION_DIALOG_VIEW_H_
#define CHROME_BROWSER_UI_VIEWS_PAYMENTS_SECURE_PAYMENT_CONFIRMATION_DIALOG_VIEW_H_
#include "base/memory/weak_ptr.h"
#include "components/payments/content/secure_payment_confirmation_view.h"
#include "ui/views/window/dialog_delegate.h"
namespace payments {
// Draws the user interface in the secure payment confirmation flow. Owned by
// the SecurePaymentConfirmationController.
class SecurePaymentConfirmationDialogView
: public SecurePaymentConfirmationView,
public views::DialogDelegateView {
public:
class ObserverForTest {
public:
virtual void OnDialogOpened() = 0;
virtual void OnDialogClosed() = 0;
virtual void OnConfirmButtonPressed() = 0;
virtual void OnCancelButtonPressed() = 0;
};
explicit SecurePaymentConfirmationDialogView(
ObserverForTest* observer_for_test);
~SecurePaymentConfirmationDialogView() override;
// SecurePaymentConfirmationView:
void ShowDialog(content::WebContents* web_contents,
base::WeakPtr<SecurePaymentConfirmationModel> model,
VerifyCallback verify_callback,
CancelCallback cancel_callback) override;
void OnModelUpdated() override;
void HideDialog() override;
// views::WidgetDelegate:
ui::ModalType GetModalType() const override;
// views::DialogDelegate:
bool ShouldShowCloseButton() const override;
base::WeakPtr<SecurePaymentConfirmationDialogView> GetWeakPtr();
private:
void OnDialogAccepted();
void OnDialogCancelled();
void OnDialogClosed();
// May be null.
ObserverForTest* observer_for_test_;
VerifyCallback verify_callback_;
CancelCallback cancel_callback_;
base::WeakPtrFactory<SecurePaymentConfirmationDialogView> weak_ptr_factory_{
this};
};
} // namespace payments
#endif // CHROME_BROWSER_UI_VIEWS_PAYMENTS_SECURE_PAYMENT_CONFIRMATION_DIALOG_VIEW_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.h"
#include "chrome/browser/ui/views/payments/test_secure_payment_confirmation_payment_request_delegate.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/autofill/core/browser/test_event_waiter.h"
#include "components/strings/grit/components_strings.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/events/base_event_utils.h"
namespace payments {
class SecurePaymentConfirmationDialogViewTest
: public InProcessBrowserTest,
public SecurePaymentConfirmationDialogView::ObserverForTest {
public:
enum DialogEvent : int {
DIALOG_OPENED,
DIALOG_CLOSED,
};
content::WebContents* GetActiveWebContents() {
return browser()->tab_strip_model()->GetActiveWebContents();
}
void CreateModel() {
model_.set_verify_button_label(l10n_util::GetStringUTF16(
IDS_SECURE_PAYMENT_CONFIRMATION_VERIFY_BUTTON_LABEL));
model_.set_cancel_button_label(l10n_util::GetStringUTF16(IDS_CANCEL));
}
void InvokeSecurePaymentConfirmationUI() {
content::WebContents* web_contents = GetActiveWebContents();
test_delegate_ =
std::make_unique<TestSecurePaymentConfirmationPaymentRequestDelegate>(
web_contents, model_.GetWeakPtr(), this);
ResetEventWaiter(DialogEvent::DIALOG_OPENED);
test_delegate_->ShowDialog(nullptr);
event_waiter_->Wait();
// The web-modal dialog should be open.
web_modal::WebContentsModalDialogManager*
web_contents_modal_dialog_manager =
web_modal::WebContentsModalDialogManager::FromWebContents(
web_contents);
EXPECT_TRUE(web_contents_modal_dialog_manager->IsDialogActive());
}
void ExpectViewMatchesModel() {
ASSERT_NE(test_delegate_->dialog_view(), nullptr);
EXPECT_EQ(l10n_util::GetStringUTF16(
IDS_SECURE_PAYMENT_CONFIRMATION_VERIFY_BUTTON_LABEL),
test_delegate_->dialog_view()->GetDialogButtonLabel(
ui::DIALOG_BUTTON_OK));
EXPECT_EQ(l10n_util::GetStringUTF16(IDS_CANCEL),
test_delegate_->dialog_view()->GetDialogButtonLabel(
ui::DIALOG_BUTTON_CANCEL));
}
void ClickAcceptAndWait() {
ResetEventWaiter(DialogEvent::DIALOG_CLOSED);
test_delegate_->dialog_view()->AcceptDialog();
event_waiter_->Wait();
EXPECT_TRUE(confirm_pressed_);
EXPECT_FALSE(cancel_pressed_);
}
void ClickCancelAndWait() {
ResetEventWaiter(DialogEvent::DIALOG_CLOSED);
test_delegate_->dialog_view()->CancelDialog();
event_waiter_->Wait();
EXPECT_TRUE(cancel_pressed_);
EXPECT_FALSE(confirm_pressed_);
}
void CloseDialogAndWait() {
ResetEventWaiter(DialogEvent::DIALOG_CLOSED);
test_delegate_->CloseDialog();
event_waiter_->Wait();
EXPECT_FALSE(cancel_pressed_);
EXPECT_FALSE(confirm_pressed_);
}
void ResetEventWaiter(DialogEvent event) {
event_waiter_ = std::make_unique<autofill::EventWaiter<DialogEvent>>(
std::list<DialogEvent>{event});
}
// SecurePaymentConfirmationDialogView::ObserverForTest:
void OnDialogOpened() override {
if (event_waiter_)
event_waiter_->OnEvent(DialogEvent::DIALOG_OPENED);
}
void OnDialogClosed() override {
if (event_waiter_)
event_waiter_->OnEvent(DialogEvent::DIALOG_CLOSED);
}
void OnConfirmButtonPressed() override { confirm_pressed_ = true; }
void OnCancelButtonPressed() override { cancel_pressed_ = true; }
protected:
std::unique_ptr<autofill::EventWaiter<DialogEvent>> event_waiter_;
SecurePaymentConfirmationModel model_;
std::unique_ptr<TestSecurePaymentConfirmationPaymentRequestDelegate>
test_delegate_;
bool confirm_pressed_ = false;
bool cancel_pressed_ = false;
};
IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationDialogViewTest,
AcceptButtonTest) {
CreateModel();
InvokeSecurePaymentConfirmationUI();
ExpectViewMatchesModel();
ClickAcceptAndWait();
}
IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationDialogViewTest,
CancelButtonTest) {
CreateModel();
InvokeSecurePaymentConfirmationUI();
ExpectViewMatchesModel();
ClickCancelAndWait();
}
IN_PROC_BROWSER_TEST_F(SecurePaymentConfirmationDialogViewTest,
CloseDialogTest) {
CreateModel();
InvokeSecurePaymentConfirmationUI();
ExpectViewMatchesModel();
CloseDialogAndWait();
}
} // namespace payments
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/payments/content/secure_payment_confirmation_view.h"
#include "chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.h"
namespace payments {
// static
base::WeakPtr<SecurePaymentConfirmationView>
SecurePaymentConfirmationView::Create() {
return (new SecurePaymentConfirmationDialogView(
/*observer_for_test=*/nullptr))
->GetWeakPtr();
}
SecurePaymentConfirmationView::SecurePaymentConfirmationView() = default;
SecurePaymentConfirmationView::~SecurePaymentConfirmationView() = default;
} // namespace payments
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/payments/test_secure_payment_confirmation_payment_request_delegate.h"
namespace payments {
TestSecurePaymentConfirmationPaymentRequestDelegate::
TestSecurePaymentConfirmationPaymentRequestDelegate(
content::WebContents* web_contents,
base::WeakPtr<SecurePaymentConfirmationModel> model,
SecurePaymentConfirmationDialogView::ObserverForTest* observer)
: SecurePaymentConfirmationPaymentRequestDelegate(nullptr),
web_contents_(web_contents),
model_(model),
dialog_view_(
(new SecurePaymentConfirmationDialogView(observer))->GetWeakPtr()) {}
TestSecurePaymentConfirmationPaymentRequestDelegate::
~TestSecurePaymentConfirmationPaymentRequestDelegate() = default;
void TestSecurePaymentConfirmationPaymentRequestDelegate::ShowDialog(
PaymentRequest* request) {
dialog_view_->ShowDialog(web_contents_, model_->GetWeakPtr(),
base::DoNothing(), base::DoNothing());
}
void TestSecurePaymentConfirmationPaymentRequestDelegate::CloseDialog() {
dialog_view_->HideDialog();
}
} // namespace payments
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_PAYMENTS_TEST_SECURE_PAYMENT_CONFIRMATION_PAYMENT_REQUEST_DELEGATE_H_
#define CHROME_BROWSER_UI_VIEWS_PAYMENTS_TEST_SECURE_PAYMENT_CONFIRMATION_PAYMENT_REQUEST_DELEGATE_H_
#include "components/payments/content/secure_payment_confirmation_payment_request_delegate.h"
#include "chrome/browser/ui/views/payments/secure_payment_confirmation_dialog_view.h"
namespace content {
class WebContents;
}
namespace payments {
class PaymentRequest;
// Implementation of the Secure Payment Confirmation delegate used in tests.
class TestSecurePaymentConfirmationPaymentRequestDelegate
: public SecurePaymentConfirmationPaymentRequestDelegate {
public:
// This delegate does not own things passed as pointers.
TestSecurePaymentConfirmationPaymentRequestDelegate(
content::WebContents* web_contents,
base::WeakPtr<SecurePaymentConfirmationModel> model,
SecurePaymentConfirmationDialogView::ObserverForTest* observer);
~TestSecurePaymentConfirmationPaymentRequestDelegate() override;
// SecurePaymentConfirmationPaymentRequestDelegate:
void ShowDialog(PaymentRequest* request) override;
void CloseDialog() override;
SecurePaymentConfirmationDialogView* dialog_view() {
return dialog_view_.get();
}
private:
content::WebContents* web_contents_;
base::WeakPtr<SecurePaymentConfirmationModel> model_;
base::WeakPtr<SecurePaymentConfirmationDialogView> dialog_view_;
};
} // namespace payments
#endif // CHROME_BROWSER_UI_VIEWS_PAYMENTS_TEST_SECURE_PAYMENT_CONFIRMATION_PAYMENT_REQUEST_DELEGATE_H_
......@@ -2095,6 +2095,7 @@ if (!is_android) {
"../browser/ui/views/payments/payment_request_use_stats_browsertest.cc",
"../browser/ui/views/payments/payment_sheet_view_controller_browsertest.cc",
"../browser/ui/views/payments/profile_list_view_controller_browsertest.cc",
"../browser/ui/views/payments/secure_payment_confirmation_dialog_view_browsertest.cc",
"../browser/ui/views/payments/shipping_address_editor_view_controller_browsertest.cc",
"../browser/ui/views/payments/shipping_option_view_controller_browsertest.cc",
"../browser/ui/views/permission_bubble/permission_prompt_bubble_view_browsertest.cc",
......
......@@ -36,6 +36,7 @@ static_library("content") {
"payment_request_converter.h",
"payment_request_spec.cc",
"payment_request_spec.h",
"secure_payment_confirmation_view.h",
"service_worker_payment_app.cc",
"service_worker_payment_app.h",
"service_worker_payment_app_factory.cc",
......@@ -74,7 +75,9 @@ static_library("content") {
sources += [ "android_app_communication_stub.cc" ]
}
if (!is_android) {
if (is_android) {
sources += [ "secure_payment_confirmation_view_stub.cc" ]
} else {
sources += [
"content_payment_request_delegate.h",
"payment_request.cc",
......
......@@ -7,30 +7,60 @@
#include "base/bind.h"
#include "base/location.h"
#include "base/threading/thread_task_runner_handle.h"
#include "build/build_config.h"
#include "components/payments/content/payment_request.h"
#include "components/strings/grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
namespace payments {
SecurePaymentConfirmationController::SecurePaymentConfirmationController() =
default;
SecurePaymentConfirmationController::SecurePaymentConfirmationController()
: view_(SecurePaymentConfirmationView::Create()) {}
SecurePaymentConfirmationController::~SecurePaymentConfirmationController() =
default;
void SecurePaymentConfirmationController::ShowDialog(
base::WeakPtr<PaymentRequest> request) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&PaymentRequest::UserCancelled, request));
#if defined(OS_ANDROID)
NOTREACHED();
#endif // OS_ANDROID
DCHECK(view_);
request_ = request;
model_.set_verify_button_label(l10n_util::GetStringUTF16(
IDS_SECURE_PAYMENT_CONFIRMATION_VERIFY_BUTTON_LABEL));
model_.set_cancel_button_label(l10n_util::GetStringUTF16(IDS_CANCEL));
view_->ShowDialog(
request->web_contents(), model_.GetWeakPtr(),
base::BindOnce(&SecurePaymentConfirmationController::OnConfirm,
weak_ptr_factory_.GetWeakPtr()),
base::BindOnce(&SecurePaymentConfirmationController::OnCancel,
weak_ptr_factory_.GetWeakPtr()));
}
void SecurePaymentConfirmationController::CloseDialog() {}
void SecurePaymentConfirmationController::CloseDialog() {
view_->HideDialog();
}
void SecurePaymentConfirmationController::ShowProcessingSpinner() {}
void SecurePaymentConfirmationController::OnDismiss() {}
void SecurePaymentConfirmationController::OnCancel() {}
void SecurePaymentConfirmationController::OnCancel() {
if (!request_)
return;
void SecurePaymentConfirmationController::OnConfirm() {}
request_->UserCancelled();
}
void SecurePaymentConfirmationController::OnConfirm() {
if (!request_)
return;
request_->UserCancelled();
}
} // namespace payments
......@@ -6,6 +6,8 @@
#define COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_CONTROLLER_H_
#include "base/memory/weak_ptr.h"
#include "components/payments/content/secure_payment_confirmation_model.h"
#include "components/payments/content/secure_payment_confirmation_view.h"
namespace payments {
......@@ -35,6 +37,20 @@ class SecurePaymentConfirmationController {
void OnDismiss();
void OnCancel();
void OnConfirm();
private:
base::WeakPtr<PaymentRequest> request_;
SecurePaymentConfirmationModel model_;
// On desktop, the SecurePaymentConfirmationView object is memory managed by
// the views:: machinery. It is deleted when the window is closed and
// views::DialogDelegateView::DeleteDelegate() is called by its corresponding
// views::Widget.
base::WeakPtr<SecurePaymentConfirmationView> view_;
base::WeakPtrFactory<SecurePaymentConfirmationController> weak_ptr_factory_{
this};
};
} // namespace payments
......
......@@ -10,4 +10,9 @@ SecurePaymentConfirmationModel::SecurePaymentConfirmationModel() = default;
SecurePaymentConfirmationModel::~SecurePaymentConfirmationModel() = default;
base::WeakPtr<SecurePaymentConfirmationModel>
SecurePaymentConfirmationModel::GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
} // namespace payments
......@@ -5,6 +5,7 @@
#ifndef COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_MODEL_H_
#define COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_MODEL_H_
#include "base/memory/weak_ptr.h"
#include "base/strings/string16.h"
#include "third_party/skia/include/core/SkBitmap.h"
......@@ -125,6 +126,8 @@ class SecurePaymentConfirmationModel {
cancel_button_visible_ = cancel_button_visible;
}
base::WeakPtr<SecurePaymentConfirmationModel> GetWeakPtr();
private:
const gfx::VectorIcon* header_icon_ = nullptr;
......@@ -150,6 +153,8 @@ class SecurePaymentConfirmationModel {
bool cancel_button_enabled_ = true;
bool cancel_button_visible_ = true;
base::WeakPtrFactory<SecurePaymentConfirmationModel> weak_ptr_factory_{this};
};
} // namespace payments
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_VIEW_H_
#define COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_VIEW_H_
#include "base/callback_forward.h"
#include "base/memory/weak_ptr.h"
namespace content {
class WebContents;
} // namespace content
namespace payments {
class SecurePaymentConfirmationModel;
// Draws the user interface in the secure payment confirmation flow. Owned by
// the SecurePaymentConfirmationController.
class SecurePaymentConfirmationView {
public:
using VerifyCallback = base::OnceCallback<void()>;
using CancelCallback = base::OnceCallback<void()>;
static base::WeakPtr<SecurePaymentConfirmationView> Create();
virtual ~SecurePaymentConfirmationView() = 0;
virtual void ShowDialog(content::WebContents* web_contents,
base::WeakPtr<SecurePaymentConfirmationModel> model,
VerifyCallback verify_callback,
CancelCallback cancel_callback) = 0;
virtual void OnModelUpdated() = 0;
virtual void HideDialog() = 0;
protected:
SecurePaymentConfirmationView();
base::WeakPtr<SecurePaymentConfirmationModel> model_;
};
} // namespace payments
#endif // COMPONENTS_PAYMENTS_CONTENT_SECURE_PAYMENT_CONFIRMATION_VIEW_H_
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/payments/content/secure_payment_confirmation_view.h"
namespace payments {
// static
base::WeakPtr<SecurePaymentConfirmationView>
SecurePaymentConfirmationView::Create() {
return nullptr;
}
} // namespace payments
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment