Commit 5012d3ea authored by Nick Burris's avatar Nick Burris Committed by Commit Bot

[Web Payment] Make PaymentAppProvider use WebContents*

This patch makes PaymentAppProvider methods take a WebContents* instead
of BrowserContext*. This is a first step toward making WebContents own
PaymentAppProviderImpl rather than it being a singleton.

The payment_handler_windows_ map is changed to a single
payment_handler_window_, but note this is just to remove the
BrowserContext* key dependency, we still enforce one payment request
per browser via PaymentRequestDisplayManager.

PaymentAppProviderImpl's RespondWithCallback and callback repository
still depend on BrowserContext*, since the callback may outlive the
WebContents. This will be cleaned up in step (3) of the bug, where the
callbacks will be owned by PaymentAppProviderImpl instead of a singleton
repository.

Bug: 1075687
Change-Id: Ib4460b82f9938e973f067f45669a6031f7f0da3c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2240064Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarSahel Sharify <sahel@chromium.org>
Commit-Queue: Nick Burris <nburris@chromium.org>
Cr-Commit-Position: refs/heads/master@{#779343}
parent 362f5ee0
...@@ -123,7 +123,7 @@ static void JNI_ServiceWorkerPaymentAppBridge_OnClosingPaymentAppWindow( ...@@ -123,7 +123,7 @@ static void JNI_ServiceWorkerPaymentAppBridge_OnClosingPaymentAppWindow(
content::WebContents::FromJavaWebContents(jweb_contents); content::WebContents::FromJavaWebContents(jweb_contents);
content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow( content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow(
web_contents->GetBrowserContext(), web_contents,
static_cast<payments::mojom::PaymentEventResponseType>(reason)); static_cast<payments::mojom::PaymentEventResponseType>(reason));
} }
......
...@@ -85,7 +85,7 @@ class PaymentAppTest : public testing::TestWithParam<RequiredPaymentOptions>, ...@@ -85,7 +85,7 @@ class PaymentAppTest : public testing::TestWithParam<RequiredPaymentOptions>,
} }
return std::make_unique<ServiceWorkerPaymentApp>( return std::make_unique<ServiceWorkerPaymentApp>(
&browser_context_, GURL("https://testmerchant.com"), web_contents_, GURL("https://testmerchant.com"),
GURL("https://testmerchant.com/bobpay"), spec_.get(), GURL("https://testmerchant.com/bobpay"), spec_.get(),
std::move(stored_app), /*is_incognito=*/false, std::move(stored_app), /*is_incognito=*/false,
/*show_processing_spinner=*/base::DoNothing()); /*show_processing_spinner=*/base::DoNothing());
......
...@@ -18,7 +18,6 @@ ...@@ -18,7 +18,6 @@
#include "components/payments/content/payment_request_converter.h" #include "components/payments/content/payment_request_converter.h"
#include "components/payments/core/features.h" #include "components/payments/core/features.h"
#include "components/payments/core/method_strings.h" #include "components/payments/core/method_strings.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/payment_app_provider.h" #include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
...@@ -30,7 +29,7 @@ namespace payments { ...@@ -30,7 +29,7 @@ namespace payments {
// Service worker payment app provides icon through bitmap, so set 0 as invalid // Service worker payment app provides icon through bitmap, so set 0 as invalid
// resource Id. // resource Id.
ServiceWorkerPaymentApp::ServiceWorkerPaymentApp( ServiceWorkerPaymentApp::ServiceWorkerPaymentApp(
content::BrowserContext* browser_context, content::WebContents* web_contents,
const GURL& top_origin, const GURL& top_origin,
const GURL& frame_origin, const GURL& frame_origin,
const PaymentRequestSpec* spec, const PaymentRequestSpec* spec,
...@@ -38,7 +37,7 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp( ...@@ -38,7 +37,7 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp(
bool is_incognito, bool is_incognito,
const base::RepeatingClosure& show_processing_spinner) const base::RepeatingClosure& show_processing_spinner)
: PaymentApp(0, PaymentApp::Type::SERVICE_WORKER_APP), : PaymentApp(0, PaymentApp::Type::SERVICE_WORKER_APP),
browser_context_(browser_context), content::WebContentsObserver(web_contents),
top_origin_(top_origin), top_origin_(top_origin),
frame_origin_(frame_origin), frame_origin_(frame_origin),
spec_(spec), spec_(spec),
...@@ -48,9 +47,8 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp( ...@@ -48,9 +47,8 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp(
show_processing_spinner_(show_processing_spinner), show_processing_spinner_(show_processing_spinner),
can_make_payment_result_(false), can_make_payment_result_(false),
has_enrolled_instrument_result_(false), has_enrolled_instrument_result_(false),
needs_installation_(false), needs_installation_(false) {
web_contents_(nullptr) { DCHECK(web_contents);
DCHECK(browser_context_);
DCHECK(top_origin_.is_valid()); DCHECK(top_origin_.is_valid());
DCHECK(frame_origin_.is_valid()); DCHECK(frame_origin_.is_valid());
DCHECK(spec_); DCHECK(spec_);
...@@ -71,7 +69,7 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp( ...@@ -71,7 +69,7 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp(
bool is_incognito, bool is_incognito,
const base::RepeatingClosure& show_processing_spinner) const base::RepeatingClosure& show_processing_spinner)
: PaymentApp(0, PaymentApp::Type::SERVICE_WORKER_APP), : PaymentApp(0, PaymentApp::Type::SERVICE_WORKER_APP),
browser_context_(web_contents->GetBrowserContext()), content::WebContentsObserver(web_contents),
top_origin_(top_origin), top_origin_(top_origin),
frame_origin_(frame_origin), frame_origin_(frame_origin),
spec_(spec), spec_(spec),
...@@ -81,11 +79,9 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp( ...@@ -81,11 +79,9 @@ ServiceWorkerPaymentApp::ServiceWorkerPaymentApp(
can_make_payment_result_(false), can_make_payment_result_(false),
has_enrolled_instrument_result_(false), has_enrolled_instrument_result_(false),
needs_installation_(true), needs_installation_(true),
web_contents_(web_contents),
installable_web_app_info_(std::move(installable_payment_app_info)), installable_web_app_info_(std::move(installable_payment_app_info)),
installable_enabled_method_(enabled_method) { installable_enabled_method_(enabled_method) {
DCHECK(browser_context_); DCHECK(web_contents);
DCHECK(web_contents_);
DCHECK(top_origin_.is_valid()); DCHECK(top_origin_.is_valid());
DCHECK(frame_origin_.is_valid()); DCHECK(frame_origin_.is_valid());
DCHECK(spec_); DCHECK(spec_);
...@@ -135,7 +131,7 @@ void ServiceWorkerPaymentApp::ValidateCanMakePayment( ...@@ -135,7 +131,7 @@ void ServiceWorkerPaymentApp::ValidateCanMakePayment(
} }
content::PaymentAppProvider::GetInstance()->CanMakePayment( content::PaymentAppProvider::GetInstance()->CanMakePayment(
browser_context_, stored_payment_app_info_->registration_id, web_contents(), stored_payment_app_info_->registration_id,
url::Origin::Create(stored_payment_app_info_->scope), url::Origin::Create(stored_payment_app_info_->scope),
*spec_->details().id, std::move(event_data), *spec_->details().id, std::move(event_data),
base::BindOnce(&ServiceWorkerPaymentApp::OnCanMakePaymentEventResponded, base::BindOnce(&ServiceWorkerPaymentApp::OnCanMakePaymentEventResponded,
...@@ -213,7 +209,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { ...@@ -213,7 +209,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
if (needs_installation_) { if (needs_installation_) {
content::PaymentAppProvider::GetInstance()->InstallAndInvokePaymentApp( content::PaymentAppProvider::GetInstance()->InstallAndInvokePaymentApp(
web_contents_, CreatePaymentRequestEventData(), web_contents(), CreatePaymentRequestEventData(),
installable_web_app_info_->name, installable_web_app_info_->name,
installable_web_app_info_->icon == nullptr installable_web_app_info_->icon == nullptr
? SkBitmap() ? SkBitmap()
...@@ -233,7 +229,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { ...@@ -233,7 +229,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
url::Origin::Create(stored_payment_app_info_->scope); url::Origin::Create(stored_payment_app_info_->scope);
OnPaymentAppIdentity(sw_origin, stored_payment_app_info_->registration_id); OnPaymentAppIdentity(sw_origin, stored_payment_app_info_->registration_id);
content::PaymentAppProvider::GetInstance()->InvokePaymentApp( content::PaymentAppProvider::GetInstance()->InvokePaymentApp(
browser_context_, stored_payment_app_info_->registration_id, sw_origin, web_contents(), stored_payment_app_info_->registration_id, sw_origin,
CreatePaymentRequestEventData(), CreatePaymentRequestEventData(),
base::BindOnce(&ServiceWorkerPaymentApp::OnPaymentAppInvoked, base::BindOnce(&ServiceWorkerPaymentApp::OnPaymentAppInvoked,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
...@@ -245,7 +241,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { ...@@ -245,7 +241,7 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
void ServiceWorkerPaymentApp::OnPaymentAppWindowClosed() { void ServiceWorkerPaymentApp::OnPaymentAppWindowClosed() {
delegate_ = nullptr; delegate_ = nullptr;
content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow( content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow(
browser_context_, web_contents(),
mojom::PaymentEventResponseType::PAYMENT_HANDLER_WINDOW_CLOSING); mojom::PaymentEventResponseType::PAYMENT_HANDLER_WINDOW_CLOSING);
} }
...@@ -597,7 +593,7 @@ void ServiceWorkerPaymentApp::OnPaymentDetailsNotUpdated() { ...@@ -597,7 +593,7 @@ void ServiceWorkerPaymentApp::OnPaymentDetailsNotUpdated() {
void ServiceWorkerPaymentApp::AbortPaymentApp( void ServiceWorkerPaymentApp::AbortPaymentApp(
base::OnceCallback<void(bool)> abort_callback) { base::OnceCallback<void(bool)> abort_callback) {
content::PaymentAppProvider::GetInstance()->AbortPayment( content::PaymentAppProvider::GetInstance()->AbortPayment(
browser_context_, registration_id_, web_contents(), registration_id_,
stored_payment_app_info_ stored_payment_app_info_
? url::Origin::Create(stored_payment_app_info_->scope) ? url::Origin::Create(stored_payment_app_info_->scope)
: url::Origin::Create(GURL(installable_web_app_info_->sw_scope)), : url::Origin::Create(GURL(installable_web_app_info_->sw_scope)),
......
...@@ -13,13 +13,13 @@ ...@@ -13,13 +13,13 @@
#include "components/payments/content/payment_request_spec.h" #include "components/payments/content/payment_request_spec.h"
#include "components/payments/content/web_app_manifest.h" #include "components/payments/content/web_app_manifest.h"
#include "content/public/browser/stored_payment_app.h" #include "content/public/browser/stored_payment_app.h"
#include "content/public/browser/web_contents_observer.h"
#include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/pending_remote.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
#include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h" #include "third_party/blink/public/mojom/payments/payment_handler_host.mojom.h"
#include "third_party/blink/public/mojom/payments/payment_request.mojom.h" #include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
namespace content { namespace content {
class BrowserContext;
class WebContents; class WebContents;
} // namespace content } // namespace content
...@@ -32,12 +32,13 @@ namespace payments { ...@@ -32,12 +32,13 @@ namespace payments {
class PaymentHandlerHost; class PaymentHandlerHost;
// Represents a service worker based payment app. // Represents a service worker based payment app.
class ServiceWorkerPaymentApp : public PaymentApp { class ServiceWorkerPaymentApp : public PaymentApp,
public content::WebContentsObserver {
public: public:
// This constructor is used for a payment app that has been installed in // This constructor is used for a payment app that has been installed in
// Chrome. // Chrome.
ServiceWorkerPaymentApp( ServiceWorkerPaymentApp(
content::BrowserContext* browser_context, content::WebContents* web_contents,
const GURL& top_origin, const GURL& top_origin,
const GURL& frame_origin, const GURL& frame_origin,
const PaymentRequestSpec* spec, const PaymentRequestSpec* spec,
...@@ -128,7 +129,6 @@ class ServiceWorkerPaymentApp : public PaymentApp { ...@@ -128,7 +129,6 @@ class ServiceWorkerPaymentApp : public PaymentApp {
// invoked. // invoked.
void OnPaymentAppIdentity(const url::Origin& origin, int64_t registration_id); void OnPaymentAppIdentity(const url::Origin& origin, int64_t registration_id);
content::BrowserContext* browser_context_;
GURL top_origin_; GURL top_origin_;
GURL frame_origin_; GURL frame_origin_;
const PaymentRequestSpec* spec_; const PaymentRequestSpec* spec_;
...@@ -157,7 +157,6 @@ class ServiceWorkerPaymentApp : public PaymentApp { ...@@ -157,7 +157,6 @@ class ServiceWorkerPaymentApp : public PaymentApp {
// Below variables are used for installable ServiceWorkerPaymentApp // Below variables are used for installable ServiceWorkerPaymentApp
// specifically. // specifically.
bool needs_installation_; bool needs_installation_;
content::WebContents* web_contents_;
std::unique_ptr<WebAppInstallationInfo> installable_web_app_info_; std::unique_ptr<WebAppInstallationInfo> installable_web_app_info_;
std::string installable_enabled_method_; std::string installable_enabled_method_;
......
...@@ -60,10 +60,10 @@ class ServiceWorkerPaymentAppCreator { ...@@ -60,10 +60,10 @@ class ServiceWorkerPaymentAppCreator {
for (auto& installed_app : apps) { for (auto& installed_app : apps) {
auto app = std::make_unique<ServiceWorkerPaymentApp>( auto app = std::make_unique<ServiceWorkerPaymentApp>(
delegate_->GetWebContents()->GetBrowserContext(), delegate_->GetWebContents(), delegate_->GetTopOrigin(),
delegate_->GetTopOrigin(), delegate_->GetFrameOrigin(), delegate_->GetFrameOrigin(), delegate_->GetSpec(),
delegate_->GetSpec(), std::move(installed_app.second), std::move(installed_app.second), delegate_->IsOffTheRecord(),
delegate_->IsOffTheRecord(), show_processing_spinner); show_processing_spinner);
app->ValidateCanMakePayment(base::BindOnce( app->ValidateCanMakePayment(base::BindOnce(
&ServiceWorkerPaymentAppCreator::OnSWPaymentAppValidated, &ServiceWorkerPaymentAppCreator::OnSWPaymentAppValidated,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "content/public/browser/stored_payment_app.h" #include "content/public/browser/stored_payment_app.h"
#include "content/public/test/browser_task_environment.h" #include "content/public/test/browser_task_environment.h"
#include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_context.h"
#include "content/public/test/test_web_contents_factory.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/payments/payment_request.mojom.h" #include "third_party/blink/public/mojom/payments/payment_request.mojom.h"
...@@ -19,8 +20,11 @@ namespace payments { ...@@ -19,8 +20,11 @@ namespace payments {
class ServiceWorkerPaymentAppTest : public testing::Test, class ServiceWorkerPaymentAppTest : public testing::Test,
public PaymentRequestSpec::Observer { public PaymentRequestSpec::Observer {
public: public:
ServiceWorkerPaymentAppTest() {} ServiceWorkerPaymentAppTest() {
~ServiceWorkerPaymentAppTest() override {} web_contents_ =
test_web_contents_factory_.CreateWebContents(&browser_context_);
}
~ServiceWorkerPaymentAppTest() override = default;
protected: protected:
const SkBitmap* icon_bitmap() const { return icon_bitmap_; } const SkBitmap* icon_bitmap() const { return icon_bitmap_; }
...@@ -112,7 +116,7 @@ class ServiceWorkerPaymentAppTest : public testing::Test, ...@@ -112,7 +116,7 @@ class ServiceWorkerPaymentAppTest : public testing::Test,
icon_bitmap_ = stored_app->icon.get(); icon_bitmap_ = stored_app->icon.get();
app_ = std::make_unique<ServiceWorkerPaymentApp>( app_ = std::make_unique<ServiceWorkerPaymentApp>(
&browser_context_, GURL("https://testmerchant.com"), web_contents_, GURL("https://testmerchant.com"),
GURL("https://testmerchant.com/bobpay"), spec_.get(), GURL("https://testmerchant.com/bobpay"), spec_.get(),
std::move(stored_app), /*is_incognito=*/false, std::move(stored_app), /*is_incognito=*/false,
/*show_processing_spinner=*/base::DoNothing()); /*show_processing_spinner=*/base::DoNothing());
...@@ -131,6 +135,8 @@ class ServiceWorkerPaymentAppTest : public testing::Test, ...@@ -131,6 +135,8 @@ class ServiceWorkerPaymentAppTest : public testing::Test,
private: private:
content::BrowserTaskEnvironment task_environment_; content::BrowserTaskEnvironment task_environment_;
content::TestBrowserContext browser_context_; content::TestBrowserContext browser_context_;
content::TestWebContentsFactory test_web_contents_factory_;
content::WebContents* web_contents_;
std::unique_ptr<PaymentRequestSpec> spec_; std::unique_ptr<PaymentRequestSpec> spec_;
std::unique_ptr<ServiceWorkerPaymentApp> app_; std::unique_ptr<ServiceWorkerPaymentApp> app_;
......
...@@ -131,8 +131,7 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -131,8 +131,7 @@ class PaymentAppBrowserTest : public ContentBrowserTest {
base::RunLoop run_loop; base::RunLoop run_loop;
bool payment_aborted = false; bool payment_aborted = false;
PaymentAppProvider::GetInstance()->AbortPayment( PaymentAppProvider::GetInstance()->AbortPayment(
shell()->web_contents()->GetBrowserContext(), registration_id, shell()->web_contents(), registration_id, sw_origin, payment_request_id,
sw_origin, payment_request_id,
base::BindOnce(&CaptureAbortResult, run_loop.QuitClosure(), base::BindOnce(&CaptureAbortResult, run_loop.QuitClosure(),
&payment_aborted)); &payment_aborted));
run_loop.Run(); run_loop.Run();
...@@ -150,8 +149,8 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -150,8 +149,8 @@ class PaymentAppBrowserTest : public ContentBrowserTest {
base::RunLoop run_loop; base::RunLoop run_loop;
bool can_make_payment = false; bool can_make_payment = false;
PaymentAppProvider::GetInstance()->CanMakePayment( PaymentAppProvider::GetInstance()->CanMakePayment(
shell()->web_contents()->GetBrowserContext(), registration_id, shell()->web_contents(), registration_id, sw_origin, payment_request_id,
sw_origin, payment_request_id, std::move(event_data), std::move(event_data),
base::BindOnce(&CaptureCanMakePaymentResult, run_loop.QuitClosure(), base::BindOnce(&CaptureCanMakePaymentResult, run_loop.QuitClosure(),
&can_make_payment)); &can_make_payment));
run_loop.Run(); run_loop.Run();
...@@ -167,8 +166,7 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -167,8 +166,7 @@ class PaymentAppBrowserTest : public ContentBrowserTest {
base::RunLoop run_loop; base::RunLoop run_loop;
PaymentHandlerResponsePtr response; PaymentHandlerResponsePtr response;
PaymentAppProvider::GetInstance()->InvokePaymentApp( PaymentAppProvider::GetInstance()->InvokePaymentApp(
shell()->web_contents()->GetBrowserContext(), registration_id, shell()->web_contents(), registration_id, sw_origin,
sw_origin,
CreatePaymentRequestEventData(supported_method, instrument_key), CreatePaymentRequestEventData(supported_method, instrument_key),
base::BindOnce(&InvokePaymentAppCallback, run_loop.QuitClosure(), base::BindOnce(&InvokePaymentAppCallback, run_loop.QuitClosure(),
&response)); &response));
......
...@@ -208,8 +208,7 @@ class SelfDeleteInstaller ...@@ -208,8 +208,7 @@ class SelfDeleteInstaller
return; return;
if (success && web_contents() != nullptr) { if (success && web_contents() != nullptr) {
std::move(callback_).Run(web_contents()->GetBrowserContext(), std::move(callback_).Run(web_contents(), registration_id_);
registration_id_);
} else { } else {
std::move(callback_).Run(nullptr, -1); std::move(callback_).Run(nullptr, -1);
} }
......
...@@ -16,7 +16,6 @@ class GURL; ...@@ -16,7 +16,6 @@ class GURL;
namespace content { namespace content {
class BrowserContext;
class WebContents; class WebContents;
// Installs a web payment app with a default payment instrument and returns // Installs a web payment app with a default payment instrument and returns
...@@ -24,7 +23,7 @@ class WebContents; ...@@ -24,7 +23,7 @@ class WebContents;
class PaymentAppInstaller { class PaymentAppInstaller {
public: public:
using InstallPaymentAppCallback = using InstallPaymentAppCallback =
base::OnceCallback<void(BrowserContext* browser_context, base::OnceCallback<void(WebContents* web_contents,
int64_t registration_id)>; int64_t registration_id)>;
// Installs the payment app. // Installs the payment app.
......
...@@ -188,15 +188,14 @@ class RespondWithCallback : public PaymentHandlerResponseCallback { ...@@ -188,15 +188,14 @@ class RespondWithCallback : public PaymentHandlerResponseCallback {
InvokePaymentAppCallbackRepository::GetInstance()->RemoveCallback( InvokePaymentAppCallbackRepository::GetInstance()->RemoveCallback(
browser_context_); browser_context_);
GetUIThreadTaskRunner({})->PostTask( GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, FROM_HERE, base::BindOnce(&CloseClientWindowOnUIThread));
base::BindOnce(&CloseClientWindowOnUIThread, browser_context_));
} }
private: private:
static void CloseClientWindowOnUIThread(BrowserContext* browser_context) { static void CloseClientWindowOnUIThread() {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
PaymentAppProvider::GetInstance()->CloseOpenedWindow(browser_context); PaymentAppProvider::GetInstance()->CloseOpenedWindow();
} }
int request_id_; int request_id_;
...@@ -564,14 +563,14 @@ void OnInstallPaymentApp( ...@@ -564,14 +563,14 @@ void OnInstallPaymentApp(
PaymentRequestEventDataPtr event_data, PaymentRequestEventDataPtr event_data,
PaymentAppProvider::RegistrationIdCallback registration_id_callback, PaymentAppProvider::RegistrationIdCallback registration_id_callback,
PaymentAppProvider::InvokePaymentAppCallback callback, PaymentAppProvider::InvokePaymentAppCallback callback,
BrowserContext* browser_context, WebContents* web_contents,
int64_t registration_id) { int64_t registration_id) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (registration_id >= 0 && browser_context != nullptr) { if (registration_id >= 0 && web_contents != nullptr) {
std::move(registration_id_callback).Run(registration_id); std::move(registration_id_callback).Run(registration_id);
PaymentAppProvider::GetInstance()->InvokePaymentApp( PaymentAppProvider::GetInstance()->InvokePaymentApp(
browser_context, registration_id, sw_origin, std::move(event_data), web_contents, registration_id, sw_origin, std::move(event_data),
std::move(callback)); std::move(callback));
} else { } else {
std::move(callback).Run(CreateBlankPaymentHandlerResponse( std::move(callback).Run(CreateBlankPaymentHandlerResponse(
...@@ -639,13 +638,15 @@ class PermissionChecker : public base::SupportsUserData::Data { ...@@ -639,13 +638,15 @@ class PermissionChecker : public base::SupportsUserData::Data {
base::WeakPtrFactory<PermissionChecker> weak_ptr_factory_{this}; base::WeakPtrFactory<PermissionChecker> weak_ptr_factory_{this};
}; };
void AbortInvokePaymentApp(BrowserContext* browser_context, void AbortInvokePaymentApp(WebContents* web_contents,
PaymentEventResponseType reason) { PaymentEventResponseType reason) {
DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId()); DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
if (!web_contents)
return;
InvokeRespondWithCallback* callback = InvokeRespondWithCallback* callback =
InvokePaymentAppCallbackRepository::GetInstance()->GetCallback( InvokePaymentAppCallbackRepository::GetInstance()->GetCallback(
browser_context); web_contents->GetBrowserContext());
if (callback) if (callback)
callback->AbortPaymentSinceOpennedWindowClosing(reason); callback->AbortPaymentSinceOpennedWindowClosing(reason);
} }
...@@ -808,15 +809,17 @@ void PaymentAppProviderImpl::GetAllPaymentApps( ...@@ -808,15 +809,17 @@ void PaymentAppProviderImpl::GetAllPaymentApps(
} }
void PaymentAppProviderImpl::InvokePaymentApp( void PaymentAppProviderImpl::InvokePaymentApp(
BrowserContext* browser_context, WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
PaymentRequestEventDataPtr event_data, PaymentRequestEventDataPtr event_data,
InvokePaymentAppCallback callback) { InvokePaymentAppCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools = scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools =
GetDevTools(browser_context, sw_origin); GetDevTools(web_contents->GetBrowserContext(), sw_origin);
if (dev_tools) { if (dev_tools) {
std::map<std::string, std::string> data = { std::map<std::string, std::string> data = {
{"Merchant Top Origin", event_data->top_origin.spec()}, {"Merchant Top Origin", event_data->top_origin.spec()},
...@@ -835,9 +838,10 @@ void PaymentAppProviderImpl::InvokePaymentApp( ...@@ -835,9 +838,10 @@ void PaymentAppProviderImpl::InvokePaymentApp(
} }
StartServiceWorkerForDispatch( StartServiceWorkerForDispatch(
browser_context, registration_id, web_contents->GetBrowserContext(), registration_id,
base::BindOnce( base::BindOnce(
&DispatchPaymentRequestEvent, browser_context, std::move(event_data), &DispatchPaymentRequestEvent, web_contents->GetBrowserContext(),
std::move(event_data),
base::BindOnce(&OnResponseForPaymentRequestOnUiThread, dev_tools, base::BindOnce(&OnResponseForPaymentRequestOnUiThread, dev_tools,
registration_id, sw_origin, registration_id, sw_origin,
event_data->payment_request_id, std::move(callback)))); event_data->payment_request_id, std::move(callback))));
...@@ -856,6 +860,8 @@ void PaymentAppProviderImpl::InstallAndInvokePaymentApp( ...@@ -856,6 +860,8 @@ void PaymentAppProviderImpl::InstallAndInvokePaymentApp(
RegistrationIdCallback registration_id_callback, RegistrationIdCallback registration_id_callback,
InvokePaymentAppCallback callback) { InvokePaymentAppCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
if (!sw_js_url.is_valid() || !sw_scope.is_valid() || method.empty()) { if (!sw_js_url.is_valid() || !sw_scope.is_valid() || method.empty()) {
GetUIThreadTaskRunner({})->PostTask( GetUIThreadTaskRunner({})->PostTask(
...@@ -886,16 +892,18 @@ void PaymentAppProviderImpl::InstallAndInvokePaymentApp( ...@@ -886,16 +892,18 @@ void PaymentAppProviderImpl::InstallAndInvokePaymentApp(
} }
void PaymentAppProviderImpl::CanMakePayment( void PaymentAppProviderImpl::CanMakePayment(
BrowserContext* browser_context, WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
CanMakePaymentEventDataPtr event_data, CanMakePaymentEventDataPtr event_data,
CanMakePaymentCallback callback) { CanMakePaymentCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools = scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools =
GetDevTools(browser_context, sw_origin); GetDevTools(web_contents->GetBrowserContext(), sw_origin);
if (dev_tools) { if (dev_tools) {
std::map<std::string, std::string> data = { std::map<std::string, std::string> data = {
{"Merchant Top Origin", event_data->top_origin.spec()}, {"Merchant Top Origin", event_data->top_origin.spec()},
...@@ -914,23 +922,25 @@ void PaymentAppProviderImpl::CanMakePayment( ...@@ -914,23 +922,25 @@ void PaymentAppProviderImpl::CanMakePayment(
} }
StartServiceWorkerForDispatch( StartServiceWorkerForDispatch(
browser_context, registration_id, web_contents->GetBrowserContext(), registration_id,
base::BindOnce(&DispatchCanMakePaymentEvent, browser_context, base::BindOnce(&DispatchCanMakePaymentEvent,
std::move(event_data), web_contents->GetBrowserContext(), std::move(event_data),
base::BindOnce(&OnResponseForCanMakePaymentOnUiThread, base::BindOnce(&OnResponseForCanMakePaymentOnUiThread,
dev_tools, registration_id, sw_origin, dev_tools, registration_id, sw_origin,
payment_request_id, std::move(callback)))); payment_request_id, std::move(callback))));
} }
void PaymentAppProviderImpl::AbortPayment(BrowserContext* browser_context, void PaymentAppProviderImpl::AbortPayment(WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
AbortCallback callback) { AbortCallback callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools = scoped_refptr<DevToolsBackgroundServicesContextImpl> dev_tools =
GetDevTools(browser_context, sw_origin); GetDevTools(web_contents->GetBrowserContext(), sw_origin);
if (dev_tools) { if (dev_tools) {
dev_tools->LogBackgroundServiceEvent( dev_tools->LogBackgroundServiceEvent(
registration_id, sw_origin, DevToolsBackgroundService::kPaymentHandler, registration_id, sw_origin, DevToolsBackgroundService::kPaymentHandler,
...@@ -939,8 +949,9 @@ void PaymentAppProviderImpl::AbortPayment(BrowserContext* browser_context, ...@@ -939,8 +949,9 @@ void PaymentAppProviderImpl::AbortPayment(BrowserContext* browser_context,
} }
StartServiceWorkerForDispatch( StartServiceWorkerForDispatch(
browser_context, registration_id, web_contents->GetBrowserContext(), registration_id,
base::BindOnce(&DispatchAbortPaymentEvent, browser_context, base::BindOnce(&DispatchAbortPaymentEvent,
web_contents->GetBrowserContext(),
base::BindOnce(&OnResponseForAbortPaymentOnUiThread, base::BindOnce(&OnResponseForAbortPaymentOnUiThread,
dev_tools, registration_id, sw_origin, dev_tools, registration_id, sw_origin,
payment_request_id, std::move(callback)))); payment_request_id, std::move(callback))));
...@@ -948,34 +959,35 @@ void PaymentAppProviderImpl::AbortPayment(BrowserContext* browser_context, ...@@ -948,34 +959,35 @@ void PaymentAppProviderImpl::AbortPayment(BrowserContext* browser_context,
void PaymentAppProviderImpl::SetOpenedWindow(WebContents* web_contents) { void PaymentAppProviderImpl::SetOpenedWindow(WebContents* web_contents) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
CloseOpenedWindow(web_contents->GetBrowserContext()); CloseOpenedWindow();
DCHECK(!payment_handler_window_);
payment_handler_windows_[web_contents->GetBrowserContext()] = payment_handler_window_ =
std::make_unique<PaymentHandlerWindowObserver>(web_contents); std::make_unique<PaymentHandlerWindowObserver>(web_contents);
} }
void PaymentAppProviderImpl::CloseOpenedWindow( void PaymentAppProviderImpl::CloseOpenedWindow() {
BrowserContext* browser_context) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
auto it = payment_handler_windows_.find(browser_context); if (payment_handler_window_ && payment_handler_window_->web_contents()) {
if (it != payment_handler_windows_.end()) { payment_handler_window_->web_contents()->Close();
if (it->second->web_contents() != nullptr) { payment_handler_window_.reset();
it->second->web_contents()->Close();
}
payment_handler_windows_.erase(it);
} }
} }
void PaymentAppProviderImpl::OnClosingOpenedWindow( void PaymentAppProviderImpl::OnClosingOpenedWindow(
BrowserContext* browser_context, WebContents* web_contents,
PaymentEventResponseType reason) { PaymentEventResponseType reason) {
DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (!web_contents)
return;
RunOrPostTaskOnThread( RunOrPostTaskOnThread(
FROM_HERE, ServiceWorkerContext::GetCoreThreadId(), FROM_HERE, ServiceWorkerContext::GetCoreThreadId(),
base::BindOnce(&AbortInvokePaymentApp, browser_context, reason)); base::BindOnce(&AbortInvokePaymentApp, web_contents, reason));
} }
bool PaymentAppProviderImpl::IsValidInstallablePaymentApp( bool PaymentAppProviderImpl::IsValidInstallablePaymentApp(
......
...@@ -25,7 +25,7 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -25,7 +25,7 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider {
// Should be accessed only on the UI thread. // Should be accessed only on the UI thread.
void GetAllPaymentApps(BrowserContext* browser_context, void GetAllPaymentApps(BrowserContext* browser_context,
GetAllPaymentAppsCallback callback) override; GetAllPaymentAppsCallback callback) override;
void InvokePaymentApp(BrowserContext* browser_context, void InvokePaymentApp(WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
...@@ -42,21 +42,21 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -42,21 +42,21 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider {
const SupportedDelegations& supported_delegations, const SupportedDelegations& supported_delegations,
RegistrationIdCallback registration_id_callback, RegistrationIdCallback registration_id_callback,
InvokePaymentAppCallback callback) override; InvokePaymentAppCallback callback) override;
void CanMakePayment(BrowserContext* browser_context, void CanMakePayment(WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
payments::mojom::CanMakePaymentEventDataPtr event_data, payments::mojom::CanMakePaymentEventDataPtr event_data,
CanMakePaymentCallback callback) override; CanMakePaymentCallback callback) override;
void AbortPayment(BrowserContext* browser_context, void AbortPayment(WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
AbortCallback callback) override; AbortCallback callback) override;
void SetOpenedWindow(WebContents* web_contents) override; void SetOpenedWindow(WebContents* web_contents) override;
void CloseOpenedWindow(BrowserContext* browser_context) override; void CloseOpenedWindow() override;
void OnClosingOpenedWindow( void OnClosingOpenedWindow(
BrowserContext* browser_context, WebContents* web_contents,
payments::mojom::PaymentEventResponseType reason) override; payments::mojom::PaymentEventResponseType reason) override;
bool IsValidInstallablePaymentApp(const GURL& manifest_url, bool IsValidInstallablePaymentApp(const GURL& manifest_url,
const GURL& sw_js_url, const GURL& sw_js_url,
...@@ -78,9 +78,7 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -78,9 +78,7 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider {
~PaymentHandlerWindowObserver() override; ~PaymentHandlerWindowObserver() override;
}; };
// Map to maintain at most one opened window per browser context. std::unique_ptr<PaymentHandlerWindowObserver> payment_handler_window_;
std::map<BrowserContext*, std::unique_ptr<PaymentHandlerWindowObserver>>
payment_handler_windows_;
}; };
} // namespace content } // namespace content
......
...@@ -12,8 +12,10 @@ ...@@ -12,8 +12,10 @@
#include "content/browser/payments/payment_app_content_unittest_base.h" #include "content/browser/payments/payment_app_content_unittest_base.h"
#include "content/browser/payments/payment_app_provider_impl.h" #include "content/browser/payments/payment_app_provider_impl.h"
#include "content/public/browser/permission_type.h" #include "content/public/browser/permission_type.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/mock_permission_manager.h" #include "content/public/test/mock_permission_manager.h"
#include "content/public/test/test_browser_context.h" #include "content/public/test/test_browser_context.h"
#include "content/public/test/test_web_contents_factory.h"
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
...@@ -75,6 +77,9 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -75,6 +77,9 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
testing::Return(blink::mojom::PermissionStatus::GRANTED)); testing::Return(blink::mojom::PermissionStatus::GRANTED));
static_cast<TestBrowserContext*>(browser_context()) static_cast<TestBrowserContext*>(browser_context())
->SetPermissionControllerDelegate(std::move(mock_permission_manager)); ->SetPermissionControllerDelegate(std::move(mock_permission_manager));
web_contents_ =
test_web_contents_factory_.CreateWebContents(browser_context());
} }
~PaymentAppProviderTest() override {} ~PaymentAppProviderTest() override {}
...@@ -101,7 +106,7 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -101,7 +106,7 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
PaymentAppProvider::InvokePaymentAppCallback callback) { PaymentAppProvider::InvokePaymentAppCallback callback) {
PaymentAppProviderImpl::GetInstance()->InvokePaymentApp( PaymentAppProviderImpl::GetInstance()->InvokePaymentApp(
browser_context(), registration_id, sw_origin, std::move(event_data), web_contents_, registration_id, sw_origin, std::move(event_data),
std::move(callback)); std::move(callback));
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
...@@ -112,7 +117,7 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -112,7 +117,7 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
payments::mojom::CanMakePaymentEventDataPtr event_data, payments::mojom::CanMakePaymentEventDataPtr event_data,
PaymentAppProvider::CanMakePaymentCallback callback) { PaymentAppProvider::CanMakePaymentCallback callback) {
PaymentAppProviderImpl::GetInstance()->CanMakePayment( PaymentAppProviderImpl::GetInstance()->CanMakePayment(
browser_context(), registration_id, sw_origin, payment_request_id, web_contents_, registration_id, sw_origin, payment_request_id,
std::move(event_data), std::move(callback)); std::move(event_data), std::move(callback));
} }
...@@ -121,18 +126,21 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -121,18 +126,21 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
const std::string& payment_request_id, const std::string& payment_request_id,
PaymentAppProvider::AbortCallback callback) { PaymentAppProvider::AbortCallback callback) {
PaymentAppProviderImpl::GetInstance()->AbortPayment( PaymentAppProviderImpl::GetInstance()->AbortPayment(
browser_context(), registration_id, sw_origin, payment_request_id, web_contents_, registration_id, sw_origin, payment_request_id,
std::move(callback)); std::move(callback));
} }
void OnClosingOpenedWindow() { void OnClosingOpenedWindow() {
PaymentAppProviderImpl::GetInstance()->OnClosingOpenedWindow( PaymentAppProviderImpl::GetInstance()->OnClosingOpenedWindow(
browser_context(), payments::mojom::PaymentEventResponseType:: web_contents_, payments::mojom::PaymentEventResponseType::
PAYMENT_HANDLER_WINDOW_CLOSING); PAYMENT_HANDLER_WINDOW_CLOSING);
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
private: private:
TestWebContentsFactory test_web_contents_factory_;
WebContents* web_contents_;
DISALLOW_COPY_AND_ASSIGN(PaymentAppProviderTest); DISALLOW_COPY_AND_ASSIGN(PaymentAppProviderTest);
}; };
......
...@@ -54,7 +54,7 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -54,7 +54,7 @@ class CONTENT_EXPORT PaymentAppProvider {
virtual void GetAllPaymentApps(BrowserContext* browser_context, virtual void GetAllPaymentApps(BrowserContext* browser_context,
GetAllPaymentAppsCallback callback) = 0; GetAllPaymentAppsCallback callback) = 0;
virtual void InvokePaymentApp( virtual void InvokePaymentApp(
BrowserContext* browser_context, WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
...@@ -72,13 +72,13 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -72,13 +72,13 @@ class CONTENT_EXPORT PaymentAppProvider {
RegistrationIdCallback registration_id_callback, RegistrationIdCallback registration_id_callback,
InvokePaymentAppCallback callback) = 0; InvokePaymentAppCallback callback) = 0;
virtual void CanMakePayment( virtual void CanMakePayment(
BrowserContext* browser_context, WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
payments::mojom::CanMakePaymentEventDataPtr event_data, payments::mojom::CanMakePaymentEventDataPtr event_data,
CanMakePaymentCallback callback) = 0; CanMakePaymentCallback callback) = 0;
virtual void AbortPayment(BrowserContext* browser_context, virtual void AbortPayment(WebContents* web_contents,
int64_t registration_id, int64_t registration_id,
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
...@@ -89,12 +89,12 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -89,12 +89,12 @@ class CONTENT_EXPORT PaymentAppProvider {
// previously opened window in the same browser context will be closed after // previously opened window in the same browser context will be closed after
// calling this interface. // calling this interface.
virtual void SetOpenedWindow(WebContents* web_contents) = 0; virtual void SetOpenedWindow(WebContents* web_contents) = 0;
virtual void CloseOpenedWindow(BrowserContext* browser_context) = 0; virtual void CloseOpenedWindow() = 0;
// Notify the opened payment handler window is closing or closed by user so as // Notify the opened payment handler window is closing or closed by user so as
// to abort payment request. // to abort payment request.
virtual void OnClosingOpenedWindow( virtual void OnClosingOpenedWindow(
BrowserContext* browser_context, WebContents* web_contents,
payments::mojom::PaymentEventResponseType reason) = 0; payments::mojom::PaymentEventResponseType reason) = 0;
// Check whether given |sw_js_url| from |manifest_url| is allowed to register // Check whether given |sw_js_url| from |manifest_url| is allowed to register
......
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