Commit 3a9b5a1a authored by DongJun Kim's avatar DongJun Kim Committed by Commit Bot

Implement WebContentsUserData in PaymentAppProviderImpl

This patch implements WebContentsUserData in PaymentAppProviderImpl
include below changes.

- PaymentAppProviderImpl will be owned WebContents rather than
it being a singleton.

- GetSourceIdForPaymentAppFromScope, IsValidInstallablePaymentApp
are moved out PaymentAppProviderUtil class.
This is a simple helper class that is not related WebContents.

Bug: 1075687
Change-Id: I62d212a53506e40bc104e59a18540898fd591946
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2282824Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Commit-Queue: DongJun Kim <djmix.kim@samsung.com>
Cr-Commit-Position: refs/heads/master@{#809808}
parent 3347e460
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/installed_payment_apps_finder.h" #include "content/public/browser/installed_payment_apps_finder.h"
#include "content/public/browser/payment_app_provider.h" #include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/payment_app_provider_util.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "services/metrics/public/cpp/ukm_recorder.h" #include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
...@@ -125,8 +126,8 @@ static void JNI_ServiceWorkerPaymentAppBridge_OnClosingPaymentAppWindow( ...@@ -125,8 +126,8 @@ static void JNI_ServiceWorkerPaymentAppBridge_OnClosingPaymentAppWindow(
content::WebContents* web_contents = content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(jweb_contents); content::WebContents::FromJavaWebContents(jweb_contents);
DCHECK(web_contents); // Verified in Java before invoking this function. DCHECK(web_contents); // Verified in Java before invoking this function.
content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow( content::PaymentAppProvider::GetOrCreateForWebContents(web_contents)
web_contents, ->OnClosingOpenedWindow(
static_cast<payments::mojom::PaymentEventResponseType>(reason)); static_cast<payments::mojom::PaymentEventResponseType>(reason));
} }
...@@ -138,7 +139,6 @@ JNI_ServiceWorkerPaymentAppBridge_GetSourceIdForPaymentAppFromScope( ...@@ -138,7 +139,6 @@ JNI_ServiceWorkerPaymentAppBridge_GetSourceIdForPaymentAppFromScope(
// payment app associated with this scope. Since this getter is called inside // payment app associated with this scope. Since this getter is called inside
// PaymentApp::getUkmSourceId() function which in turn gets called for the // PaymentApp::getUkmSourceId() function which in turn gets called for the
// invoked app inside PaymentRequestImpl::openPaymentHandlerWindowInternal. // invoked app inside PaymentRequestImpl::openPaymentHandlerWindowInternal.
return content::PaymentAppProvider::GetInstance() return content::PaymentAppProviderUtil::GetSourceIdForPaymentAppFromScope(
->GetSourceIdForPaymentAppFromScope(
url::GURLAndroid::ToNativeGURL(env, jscope).get()->GetOrigin()); url::GURLAndroid::ToNativeGURL(env, jscope).get()->GetOrigin());
} }
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/global_routing_id.h" #include "content/public/browser/global_routing_id.h"
#include "content/public/browser/manifest_icon_downloader.h" #include "content/public/browser/manifest_icon_downloader.h"
#include "content/public/browser/payment_app_provider.h" #include "content/public/browser/payment_app_provider_util.h"
#include "content/public/browser/permission_controller.h" #include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_type.h" #include "content/public/browser/permission_type.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
...@@ -337,7 +337,7 @@ bool InstallablePaymentAppCrawler::CompleteAndStorePaymentWebAppInfoIfValid( ...@@ -337,7 +337,7 @@ bool InstallablePaymentAppCrawler::CompleteAndStorePaymentWebAppInfoIfValid(
} }
std::string error_message; std::string error_message;
if (!content::PaymentAppProvider::GetInstance()->IsValidInstallablePaymentApp( if (!content::PaymentAppProviderUtil::IsValidInstallablePaymentApp(
web_app_manifest_url, GURL(app_info->sw_js_url), web_app_manifest_url, GURL(app_info->sw_js_url),
GURL(app_info->sw_scope), &error_message)) { GURL(app_info->sw_scope), &error_message)) {
SetFirstError(error_message); SetFirstError(error_message);
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#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/payment_app_provider.h" #include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/payment_app_provider_util.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"
#include "ui/gfx/image/image_skia.h" #include "ui/gfx/image/image_skia.h"
...@@ -130,8 +131,12 @@ void ServiceWorkerPaymentApp::ValidateCanMakePayment( ...@@ -130,8 +131,12 @@ void ServiceWorkerPaymentApp::ValidateCanMakePayment(
return; return;
} }
content::PaymentAppProvider::GetInstance()->CanMakePayment( auto* payment_app_provider = GetPaymentAppProvider();
web_contents(), stored_payment_app_info_->registration_id, if (!payment_app_provider)
return;
payment_app_provider->CanMakePayment(
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,
...@@ -206,11 +211,13 @@ void ServiceWorkerPaymentApp::OnCanMakePaymentEventResponded( ...@@ -206,11 +211,13 @@ void ServiceWorkerPaymentApp::OnCanMakePaymentEventResponded(
void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
delegate_ = delegate; delegate_ = delegate;
auto* payment_app_provider = GetPaymentAppProvider();
if (!payment_app_provider)
return;
if (needs_installation_) { if (needs_installation_) {
content::PaymentAppProvider::GetInstance()->InstallAndInvokePaymentApp( payment_app_provider->InstallAndInvokePaymentApp(
web_contents(), CreatePaymentRequestEventData(), 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()
: *(installable_web_app_info_->icon), : *(installable_web_app_info_->icon),
...@@ -228,8 +235,8 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { ...@@ -228,8 +235,8 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
url::Origin sw_origin = url::Origin sw_origin =
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( payment_app_provider->InvokePaymentApp(
web_contents(), stored_payment_app_info_->registration_id, sw_origin, 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()));
...@@ -240,8 +247,10 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) { ...@@ -240,8 +247,10 @@ void ServiceWorkerPaymentApp::InvokePaymentApp(Delegate* delegate) {
void ServiceWorkerPaymentApp::OnPaymentAppWindowClosed() { void ServiceWorkerPaymentApp::OnPaymentAppWindowClosed() {
delegate_ = nullptr; delegate_ = nullptr;
content::PaymentAppProvider::GetInstance()->OnClosingOpenedWindow( auto* payment_app_provider = GetPaymentAppProvider();
web_contents(), if (!payment_app_provider)
return;
payment_app_provider->OnClosingOpenedWindow(
mojom::PaymentEventResponseType::PAYMENT_HANDLER_WINDOW_CLOSING); mojom::PaymentEventResponseType::PAYMENT_HANDLER_WINDOW_CLOSING);
} }
...@@ -562,8 +571,8 @@ ukm::SourceId ServiceWorkerPaymentApp::UkmSourceId() { ...@@ -562,8 +571,8 @@ ukm::SourceId ServiceWorkerPaymentApp::UkmSourceId() {
// app since this getter is called for the invoked app inside the // app since this getter is called for the invoked app inside the
// PaymentRequest::OnPaymentHandlerOpenWindowCalled function. // PaymentRequest::OnPaymentHandlerOpenWindowCalled function.
ukm_source_id_ = ukm_source_id_ =
content::PaymentAppProvider::GetInstance() content::PaymentAppProviderUtil::GetSourceIdForPaymentAppFromScope(
->GetSourceIdForPaymentAppFromScope(sw_scope.GetOrigin()); sw_scope.GetOrigin());
} }
return ukm_source_id_; return ukm_source_id_;
} }
...@@ -592,12 +601,23 @@ void ServiceWorkerPaymentApp::OnPaymentDetailsNotUpdated() { ...@@ -592,12 +601,23 @@ 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( auto* payment_app_provider = GetPaymentAppProvider();
web_contents(), registration_id_, if (!payment_app_provider)
return;
payment_app_provider->AbortPayment(
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)),
*spec_->details().id, std::move(abort_callback)); *spec_->details().id, std::move(abort_callback));
} }
content::PaymentAppProvider* ServiceWorkerPaymentApp::GetPaymentAppProvider() {
return (!web_contents())
? nullptr
: content::PaymentAppProvider::GetOrCreateForWebContents(
web_contents());
}
} // namespace payments } // namespace payments
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#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 PaymentAppProvider;
class WebContents; class WebContents;
} // namespace content } // namespace content
...@@ -129,6 +130,8 @@ class ServiceWorkerPaymentApp : public PaymentApp, ...@@ -129,6 +130,8 @@ 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::PaymentAppProvider* GetPaymentAppProvider();
GURL top_origin_; GURL top_origin_;
GURL frame_origin_; GURL frame_origin_;
const PaymentRequestSpec* spec_; const PaymentRequestSpec* spec_;
......
...@@ -95,7 +95,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder ...@@ -95,7 +95,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder
: public base::SupportsUserData::Data { : public base::SupportsUserData::Data {
public: public:
static base::WeakPtr<SelfDeletingServiceWorkerPaymentAppFinder> static base::WeakPtr<SelfDeletingServiceWorkerPaymentAppFinder>
CreateAndSetOwnedBy(base::SupportsUserData* owner) { CreateAndSetOwnedBy(content::WebContents* owner) {
auto owned = auto owned =
std::make_unique<SelfDeletingServiceWorkerPaymentAppFinder>(owner); std::make_unique<SelfDeletingServiceWorkerPaymentAppFinder>(owner);
auto* pointer = owned.get(); auto* pointer = owned.get();
...@@ -104,7 +104,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder ...@@ -104,7 +104,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder
} }
explicit SelfDeletingServiceWorkerPaymentAppFinder( explicit SelfDeletingServiceWorkerPaymentAppFinder(
base::SupportsUserData* owner) content::WebContents* owner)
: owner_(owner) {} : owner_(owner) {}
SelfDeletingServiceWorkerPaymentAppFinder( SelfDeletingServiceWorkerPaymentAppFinder(
...@@ -314,13 +314,12 @@ class SelfDeletingServiceWorkerPaymentAppFinder ...@@ -314,13 +314,12 @@ class SelfDeletingServiceWorkerPaymentAppFinder
base::StringPiece(raw_data->front_as<char>(), raw_data->size()), base::StringPiece(raw_data->front_as<char>(), raw_data->size()),
&string_encoded_icon); &string_encoded_icon);
auto* browser_context = content::PaymentAppProvider::GetOrCreateForWebContents(owner_)
static_cast<content::WebContents*>(owner_)->GetBrowserContext(); ->UpdatePaymentAppIcon(
content::PaymentAppProvider::GetInstance()->UpdatePaymentAppIcon( app->registration_id, app->scope.spec(), app->name,
browser_context, app->registration_id, app->scope.spec(), app->name,
string_encoded_icon, method_name, app->supported_delegations, string_encoded_icon, method_name, app->supported_delegations,
base::BindOnce( base::BindOnce(&SelfDeletingServiceWorkerPaymentAppFinder::
&SelfDeletingServiceWorkerPaymentAppFinder::OnUpdatePaymentAppIcon, OnUpdatePaymentAppIcon,
weak_ptr_factory_.GetWeakPtr())); weak_ptr_factory_.GetWeakPtr()));
} }
...@@ -365,7 +364,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder ...@@ -365,7 +364,7 @@ class SelfDeletingServiceWorkerPaymentAppFinder
// |owner_| owns this SelfDeletingServiceWorkerPaymentAppFinder, so it is // |owner_| owns this SelfDeletingServiceWorkerPaymentAppFinder, so it is
// always valid. // always valid.
base::SupportsUserData* owner_; content::WebContents* owner_;
std::unique_ptr<PaymentManifestDownloader> downloader_; std::unique_ptr<PaymentManifestDownloader> downloader_;
std::unique_ptr<PaymentManifestParser> parser_; std::unique_ptr<PaymentManifestParser> parser_;
......
...@@ -1281,6 +1281,7 @@ source_set("browser") { ...@@ -1281,6 +1281,7 @@ source_set("browser") {
"payments/payment_app_installer.h", "payments/payment_app_installer.h",
"payments/payment_app_provider_impl.cc", "payments/payment_app_provider_impl.cc",
"payments/payment_app_provider_impl.h", "payments/payment_app_provider_impl.h",
"payments/payment_app_provider_util.cc",
"payments/payment_instrument_icon_fetcher.cc", "payments/payment_instrument_icon_fetcher.cc",
"payments/payment_instrument_icon_fetcher.h", "payments/payment_instrument_icon_fetcher.h",
"payments/payment_manager.cc", "payments/payment_manager.cc",
......
...@@ -132,8 +132,9 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -132,8 +132,9 @@ class PaymentAppBrowserTest : public ContentBrowserTest {
const std::string& payment_request_id) { const std::string& payment_request_id) {
base::RunLoop run_loop; base::RunLoop run_loop;
bool payment_aborted = false; bool payment_aborted = false;
PaymentAppProvider::GetInstance()->AbortPayment( PaymentAppProvider::GetOrCreateForWebContents(shell()->web_contents())
shell()->web_contents(), registration_id, sw_origin, payment_request_id, ->AbortPayment(
registration_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 +151,9 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -150,8 +151,9 @@ 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::GetOrCreateForWebContents(shell()->web_contents())
shell()->web_contents(), registration_id, sw_origin, payment_request_id, ->CanMakePayment(
registration_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));
...@@ -167,8 +169,9 @@ class PaymentAppBrowserTest : public ContentBrowserTest { ...@@ -167,8 +169,9 @@ class PaymentAppBrowserTest : public ContentBrowserTest {
const std::string& instrument_key) { const std::string& instrument_key) {
base::RunLoop run_loop; base::RunLoop run_loop;
PaymentHandlerResponsePtr response; PaymentHandlerResponsePtr response;
PaymentAppProvider::GetInstance()->InvokePaymentApp( PaymentAppProvider::GetOrCreateForWebContents(shell()->web_contents())
shell()->web_contents(), registration_id, sw_origin, ->InvokePaymentApp(
registration_id, 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));
......
...@@ -207,10 +207,10 @@ class SelfDeleteInstaller ...@@ -207,10 +207,10 @@ class SelfDeleteInstaller
if (callback_.is_null()) if (callback_.is_null())
return; return;
if (success && web_contents() != nullptr) { if (success) {
std::move(callback_).Run(web_contents(), registration_id_); std::move(callback_).Run(registration_id_);
} else { } else {
std::move(callback_).Run(nullptr, -1); std::move(callback_).Run(-1);
} }
service_worker_context_->RemoveObserver(this); service_worker_context_->RemoveObserver(this);
......
...@@ -23,8 +23,7 @@ class WebContents; ...@@ -23,8 +23,7 @@ class WebContents;
class PaymentAppInstaller { class PaymentAppInstaller {
public: public:
using InstallPaymentAppCallback = using InstallPaymentAppCallback =
base::OnceCallback<void(WebContents* web_contents, base::OnceCallback<void(int64_t registration_id)>;
int64_t registration_id)>;
// Installs the payment app. // Installs the payment app.
// |app_name| is the name of the payment app. // |app_name| is the name of the payment app.
......
...@@ -5,16 +5,27 @@ ...@@ -5,16 +5,27 @@
#ifndef CONTENT_BROWSER_PAYMENTS_PAYMENT_APP_PROVIDER_IMPL_H_ #ifndef CONTENT_BROWSER_PAYMENTS_PAYMENT_APP_PROVIDER_IMPL_H_
#define CONTENT_BROWSER_PAYMENTS_PAYMENT_APP_PROVIDER_IMPL_H_ #define CONTENT_BROWSER_PAYMENTS_PAYMENT_APP_PROVIDER_IMPL_H_
#include "base/memory/singleton.h" #include "content/browser/devtools/devtools_background_services_context_impl.h"
#include "content/browser/payments/payment_app_context_impl.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "content/public/browser/payment_app_provider.h" #include "content/public/browser/payment_app_provider.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
namespace content { namespace content {
class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { using payments::mojom::PaymentRequestEventDataPtr;
using ServiceWorkerStartCallback =
base::OnceCallback<void(scoped_refptr<ServiceWorkerVersion>,
blink::ServiceWorkerStatusCode)>;
class CONTENT_EXPORT PaymentAppProviderImpl
: public PaymentAppProvider,
public WebContentsUserData<PaymentAppProviderImpl> {
public: public:
static PaymentAppProviderImpl* GetInstance(); ~PaymentAppProviderImpl() override;
static PaymentAppProviderImpl* GetOrCreateForWebContents(
WebContents* web_contents);
// Disallow copy and assign. // Disallow copy and assign.
PaymentAppProviderImpl(const PaymentAppProviderImpl& other) = delete; PaymentAppProviderImpl(const PaymentAppProviderImpl& other) = delete;
...@@ -23,13 +34,11 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -23,13 +34,11 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider {
// PaymentAppProvider implementation: // PaymentAppProvider implementation:
// Should be accessed only on the UI thread. // Should be accessed only on the UI thread.
void InvokePaymentApp(WebContents* web_contents, void InvokePaymentApp(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,
InvokePaymentAppCallback callback) override; InvokePaymentAppCallback callback) override;
void InstallAndInvokePaymentApp( void InstallAndInvokePaymentApp(
WebContents* web_contents,
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
const std::string& app_name, const std::string& app_name,
const SkBitmap& app_icon, const SkBitmap& app_icon,
...@@ -40,42 +49,41 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -40,42 +49,41 @@ 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 UpdatePaymentAppIcon(BrowserContext* browser_context, void UpdatePaymentAppIcon(int64_t registration_id,
int64_t registration_id,
const std::string& instrument_key, const std::string& instrument_key,
const std::string& name, const std::string& name,
const std::string& string_encoded_icon, const std::string& string_encoded_icon,
const std::string& method_name, const std::string& method_name,
const SupportedDelegations& supported_delegations, const SupportedDelegations& supported_delegations,
UpdatePaymentAppIconCallback callback) override; UpdatePaymentAppIconCallback callback) override;
void CanMakePayment(WebContents* web_contents, void CanMakePayment(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(WebContents* web_contents, void AbortPayment(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() override;
void CloseOpenedWindow() override; void CloseOpenedWindow() override;
void OnClosingOpenedWindow( void OnClosingOpenedWindow(
WebContents* web_contents,
payments::mojom::PaymentEventResponseType reason) override; payments::mojom::PaymentEventResponseType reason) override;
bool IsValidInstallablePaymentApp(const GURL& manifest_url,
const GURL& sw_js_url,
const GURL& sw_scope,
std::string* error_message) override;
ukm::SourceId GetSourceIdForPaymentAppFromScope(
const GURL& sw_scope) override;
private: private:
PaymentAppProviderImpl(); explicit PaymentAppProviderImpl(WebContents* web_contents);
~PaymentAppProviderImpl() override; friend class WebContentsUserData<PaymentAppProviderImpl>;
WEB_CONTENTS_USER_DATA_KEY_DECL();
friend struct base::DefaultSingletonTraits<PaymentAppProviderImpl>; scoped_refptr<DevToolsBackgroundServicesContextImpl> GetDevTools(
const url::Origin& sw_origin);
void StartServiceWorkerForDispatch(int64_t registration_id,
ServiceWorkerStartCallback callback);
void OnInstallPaymentApp(const url::Origin& sw_origin,
PaymentRequestEventDataPtr event_data,
RegistrationIdCallback registration_id_callback,
InvokePaymentAppCallback callback,
int64_t registration_id);
// Note that constructor of WebContentsObserver is protected. // Note that constructor of WebContentsObserver is protected.
class PaymentHandlerWindowObserver : public WebContentsObserver { class PaymentHandlerWindowObserver : public WebContentsObserver {
...@@ -85,6 +93,11 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider { ...@@ -85,6 +93,11 @@ class CONTENT_EXPORT PaymentAppProviderImpl : public PaymentAppProvider {
}; };
std::unique_ptr<PaymentHandlerWindowObserver> payment_handler_window_; std::unique_ptr<PaymentHandlerWindowObserver> payment_handler_window_;
// Owns this object.
WebContents* web_contents_;
base::WeakPtrFactory<PaymentAppProviderImpl> weak_ptr_factory_{this};
}; };
} // namespace content } // namespace content
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
#include "base/run_loop.h" #include "base/run_loop.h"
#include "content/browser/payments/installed_payment_apps_finder_impl.h" #include "content/browser/payments/installed_payment_apps_finder_impl.h"
#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/public/browser/payment_app_provider.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/browser/web_contents.h"
#include "content/public/test/mock_permission_manager.h" #include "content/public/test/mock_permission_manager.h"
...@@ -107,8 +107,8 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -107,8 +107,8 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
const url::Origin& sw_origin, const url::Origin& sw_origin,
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
PaymentAppProvider::InvokePaymentAppCallback callback) { PaymentAppProvider::InvokePaymentAppCallback callback) {
PaymentAppProviderImpl::GetInstance()->InvokePaymentApp( PaymentAppProvider::GetOrCreateForWebContents(web_contents_)
web_contents_, registration_id, sw_origin, std::move(event_data), ->InvokePaymentApp(registration_id, sw_origin, std::move(event_data),
std::move(callback)); std::move(callback));
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
...@@ -118,8 +118,8 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -118,8 +118,8 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
const std::string& payment_request_id, const std::string& payment_request_id,
payments::mojom::CanMakePaymentEventDataPtr event_data, payments::mojom::CanMakePaymentEventDataPtr event_data,
PaymentAppProvider::CanMakePaymentCallback callback) { PaymentAppProvider::CanMakePaymentCallback callback) {
PaymentAppProviderImpl::GetInstance()->CanMakePayment( PaymentAppProvider::GetOrCreateForWebContents(web_contents_)
web_contents_, registration_id, sw_origin, payment_request_id, ->CanMakePayment(registration_id, sw_origin, payment_request_id,
std::move(event_data), std::move(callback)); std::move(event_data), std::move(callback));
} }
...@@ -127,14 +127,14 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase { ...@@ -127,14 +127,14 @@ class PaymentAppProviderTest : public PaymentAppContentUnitTestBase {
const url::Origin& sw_origin, const url::Origin& sw_origin,
const std::string& payment_request_id, const std::string& payment_request_id,
PaymentAppProvider::AbortCallback callback) { PaymentAppProvider::AbortCallback callback) {
PaymentAppProviderImpl::GetInstance()->AbortPayment( PaymentAppProvider::GetOrCreateForWebContents(web_contents_)
web_contents_, registration_id, sw_origin, payment_request_id, ->AbortPayment(registration_id, sw_origin, payment_request_id,
std::move(callback)); std::move(callback));
} }
void OnClosingOpenedWindow() { void OnClosingOpenedWindow() {
PaymentAppProviderImpl::GetInstance()->OnClosingOpenedWindow( PaymentAppProvider::GetOrCreateForWebContents(web_contents_)
web_contents_, payments::mojom::PaymentEventResponseType:: ->OnClosingOpenedWindow(payments::mojom::PaymentEventResponseType::
PAYMENT_HANDLER_WINDOW_CLOSING); PAYMENT_HANDLER_WINDOW_CLOSING);
base::RunLoop().RunUntilIdle(); base::RunLoop().RunUntilIdle();
} }
......
// 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 "content/public/browser/payment_app_provider_util.h"
#include "content/common/service_worker/service_worker_utils.h"
#include "content/public/browser/browser_thread.h"
namespace content {
// static
ukm::SourceId PaymentAppProviderUtil::GetSourceIdForPaymentAppFromScope(
const GURL& sw_scope) {
return ukm::UkmRecorder::GetSourceIdForPaymentAppFromScope(
sw_scope.GetOrigin());
}
// static
bool PaymentAppProviderUtil::IsValidInstallablePaymentApp(
const GURL& manifest_url,
const GURL& sw_js_url,
const GURL& sw_scope,
std::string* error_message) {
DCHECK(manifest_url.is_valid() && sw_js_url.is_valid() &&
sw_scope.is_valid());
// Scope will be checked against service worker js url when registering, but
// we check it here earlier to avoid presenting unusable payment handlers.
if (!ServiceWorkerUtils::IsPathRestrictionSatisfiedWithoutHeader(
sw_scope, sw_js_url, error_message)) {
return false;
}
// TODO(crbug.com/855312): Unify duplicated code between here and
// ServiceWorkerProviderHost::IsValidRegisterMessage.
std::vector<GURL> urls = {manifest_url, sw_js_url, sw_scope};
if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) {
*error_message =
"Origins are not matching, or some origins cannot access service "
"worker (manifest:" +
manifest_url.spec() + " scope:" + sw_scope.spec() +
" sw:" + sw_js_url.spec() + ")";
return false;
}
return true;
}
} // namespace content
...@@ -213,7 +213,8 @@ void DidOpenURLOnUI(WindowType type, ...@@ -213,7 +213,8 @@ void DidOpenURLOnUI(WindowType type,
if (type == WindowType::PAYMENT_HANDLER_WINDOW) { if (type == WindowType::PAYMENT_HANDLER_WINDOW) {
// Set the opened web_contents to payment app provider to manage its life // Set the opened web_contents to payment app provider to manage its life
// cycle. // cycle.
PaymentAppProvider::GetInstance()->SetOpenedWindow(web_contents); PaymentAppProvider::GetOrCreateForWebContents(web_contents)
->SetOpenedWindow();
} }
} }
......
...@@ -270,6 +270,7 @@ source_set("browser_sources") { ...@@ -270,6 +270,7 @@ source_set("browser_sources") {
"page_navigator.cc", "page_navigator.cc",
"page_navigator.h", "page_navigator.h",
"payment_app_provider.h", "payment_app_provider.h",
"payment_app_provider_util.h",
"peak_gpu_memory_tracker.h", "peak_gpu_memory_tracker.h",
"pepper_flash_settings_helper.h", "pepper_flash_settings_helper.h",
"pepper_vpn_provider_resource_host_proxy.h", "pepper_vpn_provider_resource_host_proxy.h",
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "content/common/content_export.h" #include "content/common/content_export.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h" #include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
class SkBitmap; class SkBitmap;
...@@ -18,7 +17,6 @@ class Origin; ...@@ -18,7 +17,6 @@ class Origin;
namespace content { namespace content {
class BrowserContext;
class WebContents; class WebContents;
struct SupportedDelegations; struct SupportedDelegations;
...@@ -33,7 +31,8 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -33,7 +31,8 @@ class CONTENT_EXPORT PaymentAppProvider {
public: public:
// This static function is actually implemented in PaymentAppProviderImpl.cc. // This static function is actually implemented in PaymentAppProviderImpl.cc.
// Please see: content/browser/payments/payment_app_provider_impl.cc // Please see: content/browser/payments/payment_app_provider_impl.cc
static PaymentAppProvider* GetInstance(); static PaymentAppProvider* GetOrCreateForWebContents(
WebContents* web_contents);
using RegistrationIdCallback = using RegistrationIdCallback =
base::OnceCallback<void(int64_t registration_id)>; base::OnceCallback<void(int64_t registration_id)>;
...@@ -47,13 +46,11 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -47,13 +46,11 @@ class CONTENT_EXPORT PaymentAppProvider {
// Should be accessed only on the UI thread. // Should be accessed only on the UI thread.
virtual void InvokePaymentApp( virtual 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,
InvokePaymentAppCallback callback) = 0; InvokePaymentAppCallback callback) = 0;
virtual void InstallAndInvokePaymentApp( virtual void InstallAndInvokePaymentApp(
WebContents* web_contents,
payments::mojom::PaymentRequestEventDataPtr event_data, payments::mojom::PaymentRequestEventDataPtr event_data,
const std::string& app_name, const std::string& app_name,
const SkBitmap& app_icon, const SkBitmap& app_icon,
...@@ -65,7 +62,6 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -65,7 +62,6 @@ class CONTENT_EXPORT PaymentAppProvider {
RegistrationIdCallback registration_id_callback, RegistrationIdCallback registration_id_callback,
InvokePaymentAppCallback callback) = 0; InvokePaymentAppCallback callback) = 0;
virtual void UpdatePaymentAppIcon( virtual void UpdatePaymentAppIcon(
BrowserContext* browser_context,
int64_t registration_id, int64_t registration_id,
const std::string& instrument_key, const std::string& instrument_key,
const std::string& name, const std::string& name,
...@@ -74,14 +70,12 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -74,14 +70,12 @@ class CONTENT_EXPORT PaymentAppProvider {
const SupportedDelegations& supported_delegations, const SupportedDelegations& supported_delegations,
UpdatePaymentAppIconCallback callback) = 0; UpdatePaymentAppIconCallback callback) = 0;
virtual void CanMakePayment( virtual 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) = 0; CanMakePaymentCallback callback) = 0;
virtual void AbortPayment(WebContents* web_contents, virtual void AbortPayment(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) = 0; AbortCallback callback) = 0;
...@@ -90,27 +84,14 @@ class CONTENT_EXPORT PaymentAppProvider { ...@@ -90,27 +84,14 @@ class CONTENT_EXPORT PaymentAppProvider {
// opened window for payment handler at any moment in a browser context. The // opened window for payment handler at any moment in a browser context. The
// 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() = 0;
virtual void CloseOpenedWindow() = 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(
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
// with |sw_scope|.
virtual bool IsValidInstallablePaymentApp(const GURL& manifest_url,
const GURL& sw_js_url,
const GURL& sw_scope,
std::string* error_message) = 0;
// Gets the ukm source id for a payment app with |sw_scope|.
// This must ONLY be called when payment app window has been opened.
virtual ukm::SourceId GetSourceIdForPaymentAppFromScope(
const GURL& sw_scope) = 0;
protected: protected:
virtual ~PaymentAppProvider() = default; virtual ~PaymentAppProvider() = default;
}; };
......
// 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 CONTENT_PUBLIC_BROWSER_PAYMENT_APP_PROVIDER_UTIL_H_
#define CONTENT_PUBLIC_BROWSER_PAYMENT_APP_PROVIDER_UTIL_H_
#include "content/common/content_export.h"
#include "services/metrics/public/cpp/ukm_recorder.h"
#include "third_party/blink/public/mojom/payments/payment_app.mojom.h"
namespace content {
class CONTENT_EXPORT PaymentAppProviderUtil {
public:
// Gets the ukm source id for a payment app with |sw_scope|.
// This must ONLY be called when payment app window has been opened.
static ukm::SourceId GetSourceIdForPaymentAppFromScope(const GURL& sw_scope);
// Check whether given |sw_js_url| from |manifest_url| is allowed to register
// with |sw_scope|.
static bool IsValidInstallablePaymentApp(const GURL& manifest_url,
const GURL& sw_js_url,
const GURL& sw_scope,
std::string* error_message);
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_PAYMENT_APP_PROVIDER_UTIL_H_
...@@ -29,7 +29,7 @@ class UkmRecorderInterface; ...@@ -29,7 +29,7 @@ class UkmRecorderInterface;
} // namespace metrics } // namespace metrics
namespace content { namespace content {
class PaymentAppProviderImpl; class PaymentAppProviderUtil;
} // namespace content } // namespace content
namespace web_app { namespace web_app {
...@@ -94,7 +94,7 @@ class METRICS_EXPORT UkmRecorder { ...@@ -94,7 +94,7 @@ class METRICS_EXPORT UkmRecorder {
// Gets new source Id for PAYMENT_APP_ID type and updates the source url to // Gets new source Id for PAYMENT_APP_ID type and updates the source url to
// the scope of the app. This method should only be called by // the scope of the app. This method should only be called by
// PaymentAppProviderImpl class when the payment app window is opened. // PaymentAppProviderUtil class when the payment app window is opened.
static SourceId GetSourceIdForPaymentAppFromScope( static SourceId GetSourceIdForPaymentAppFromScope(
const GURL& service_worker_scope); const GURL& service_worker_scope);
...@@ -105,7 +105,7 @@ class METRICS_EXPORT UkmRecorder { ...@@ -105,7 +105,7 @@ class METRICS_EXPORT UkmRecorder {
friend blink::Document; friend blink::Document;
friend metrics::UkmRecorderInterface; friend metrics::UkmRecorderInterface;
friend PermissionUmaUtil; friend PermissionUmaUtil;
friend content::PaymentAppProviderImpl; friend content::PaymentAppProviderUtil;
// WebApkUkmRecorder and DesktopWebAppUkmRecorder record metrics about // WebApkUkmRecorder and DesktopWebAppUkmRecorder record metrics about
// installed web apps. Instead of using // installed web apps. Instead of using
......
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