Commit ce803c21 authored by Jeevan Shikaram's avatar Jeevan Shikaram Committed by Commit Bot

[Play Billing] Perform checks before returning DigitalGoods.

This CL checks to see if the the payment method is supported and if
there is an APK that will be able to handle the request.

Bug: 1137688
Change-Id: I93508af961fade71a584b54a76b13c610f8e3a02
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2528809
Commit-Queue: Jeevan Shikaram <jshikaram@chromium.org>
Reviewed-by: default avatarGlen Robertson <glenrob@chromium.org>
Cr-Commit-Position: refs/heads/master@{#826128}
parent 4a09210e
......@@ -2302,6 +2302,8 @@ static_library("browser") {
"apps/digital_goods/digital_goods_factory_impl.h",
"apps/digital_goods/digital_goods_impl.cc",
"apps/digital_goods/digital_goods_impl.h",
"apps/digital_goods/util.cc",
"apps/digital_goods/util.h",
]
deps += [
"//chrome/app/theme:chrome_unscaled_resources_grit",
......
......@@ -8,9 +8,16 @@
#include "base/feature_list.h"
#include "chrome/browser/apps/digital_goods/digital_goods_impl.h"
#include "chrome/browser/apps/digital_goods/util.h"
#include "components/payments/core/features.h"
#include "components/payments/core/payments_experimental_features.h"
namespace {
constexpr char kSupportedPaymentMethod[] = "https://play.google.com/billing";
} // namespace
namespace apps {
// Public methods:
......@@ -33,12 +40,21 @@ void DigitalGoodsFactoryImpl::CreateDigitalGoods(
payments::features::kAppStoreBilling)) {
std::move(callback).Run(
payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
/* digital_goods = */ mojo::NullRemote());
/*digital_goods=*/mojo::NullRemote());
return;
}
// TODO(jshikaram): Check that it's a valid TWA (check the host was installed
// via the play store using ApkWebApp Service)
if (payment_method != kSupportedPaymentMethod) {
std::move(callback).Run(payments::mojom::CreateDigitalGoodsResponseCode::
kUnsupportedPaymentMethod,
/*digital_goods=*/mojo::NullRemote());
}
if (apps::GetTwaPackageName(render_frame_host_).empty()) {
std::move(callback).Run(
payments::mojom::CreateDigitalGoodsResponseCode::kUnsupportedContext,
/*digital_goods=*/mojo::NullRemote());
}
// TODO(jshikaram): check with Android if there is a payment_method available.
std::move(callback).Run(payments::mojom::CreateDigitalGoodsResponseCode::kOk,
......
......@@ -4,13 +4,8 @@
#include "chrome/browser/apps/digital_goods/digital_goods_impl.h"
#include "base/optional.h"
#include "chrome/browser/chromeos/apps/apk_web_app_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/web_applications/components/app_registrar.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "chrome/browser/apps/digital_goods/util.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/web_contents.h"
namespace {
......@@ -50,8 +45,8 @@ void DigitalGoodsImpl::GetDetails(const std::vector<std::string>& item_ids,
return;
}
const std::string package_name = GetTwaPackageName();
const std::string scope = GetScope();
const std::string package_name = apps::GetTwaPackageName(render_frame_host_);
const std::string scope = apps::GetScope(render_frame_host_);
if (package_name.empty() || scope.empty()) {
LogErrorState(package_name, scope);
std::move(callback).Run(
......@@ -75,8 +70,8 @@ void DigitalGoodsImpl::Acknowledge(const std::string& purchase_token,
return;
}
const std::string package_name = GetTwaPackageName();
const std::string scope = GetScope();
const std::string package_name = apps::GetTwaPackageName(render_frame_host_);
const std::string scope = apps::GetScope(render_frame_host_);
if (package_name.empty() || scope.empty()) {
LogErrorState(package_name, scope);
std::move(callback).Run(
......@@ -94,17 +89,17 @@ void DigitalGoodsImpl::ListPurchases(ListPurchasesCallback callback) {
if (!digital_goods_service) {
std::move(callback).Run(
payments::mojom::BillingResponseCode::kClientAppUnavailable,
/* purchase_details_list = */ {});
/*purchase_details_list=*/{});
return;
}
const std::string package_name = GetTwaPackageName();
const std::string scope = GetScope();
const std::string package_name = apps::GetTwaPackageName(render_frame_host_);
const std::string scope = apps::GetScope(render_frame_host_);
if (package_name.empty() || scope.empty()) {
LogErrorState(package_name, scope);
std::move(callback).Run(
payments::mojom::BillingResponseCode::kClientAppUnavailable,
/* purchase_details_list = */ {});
/*purchase_details_list=*/{});
return;
}
......@@ -121,42 +116,6 @@ arc::ArcDigitalGoodsBridge* DigitalGoodsImpl::GetArcDigitalGoodsBridge() {
render_frame_host_->GetBrowserContext());
}
std::string DigitalGoodsImpl::GetTwaPackageName() {
auto* apk_web_app_service = chromeos::ApkWebAppService::Get(
Profile::FromBrowserContext(render_frame_host_->GetBrowserContext()));
if (!apk_web_app_service) {
return "";
}
base::Optional<std::string> twa_package_name =
apk_web_app_service->GetPackageNameForWebApp(
content::WebContents::FromRenderFrameHost(render_frame_host_)
->GetLastCommittedURL());
return twa_package_name.value_or("");
}
std::string DigitalGoodsImpl::GetScope() {
web_app::AppRegistrar& registrar =
web_app::WebAppProvider::Get(
Profile::FromBrowserContext(render_frame_host_->GetBrowserContext()))
->registrar();
base::Optional<web_app::AppId> app_id = registrar.FindAppWithUrlInScope(
content::WebContents::FromRenderFrameHost(render_frame_host_)
->GetLastCommittedURL());
if (!app_id) {
return "";
}
GURL scope = registrar.GetAppScope(app_id.value());
if (!scope.is_valid()) {
return "";
}
return scope.spec();
}
RENDER_DOCUMENT_HOST_USER_DATA_KEY_IMPL(DigitalGoodsImpl)
} // namespace apps
// 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/apps/digital_goods/util.h"
#include "base/optional.h"
#include "chrome/browser/chromeos/apps/apk_web_app_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/web_applications/components/app_registrar.h"
#include "chrome/browser/web_applications/web_app_provider.h"
#include "content/public/browser/render_document_host_user_data.h"
#include "content/public/browser/web_contents.h"
namespace apps {
std::string GetTwaPackageName(content::RenderFrameHost* render_frame_host) {
auto* apk_web_app_service = chromeos::ApkWebAppService::Get(
Profile::FromBrowserContext(render_frame_host->GetBrowserContext()));
if (!apk_web_app_service) {
return "";
}
base::Optional<std::string> twa_package_name =
apk_web_app_service->GetPackageNameForWebApp(
content::WebContents::FromRenderFrameHost(render_frame_host)
->GetLastCommittedURL());
return twa_package_name.value_or("");
}
std::string GetScope(content::RenderFrameHost* render_frame_host) {
web_app::AppRegistrar& registrar =
web_app::WebAppProvider::Get(
Profile::FromBrowserContext(render_frame_host->GetBrowserContext()))
->registrar();
base::Optional<web_app::AppId> app_id = registrar.FindAppWithUrlInScope(
content::WebContents::FromRenderFrameHost(render_frame_host)
->GetLastCommittedURL());
if (!app_id) {
return "";
}
GURL scope = registrar.GetAppScope(app_id.value());
if (!scope.is_valid()) {
return "";
}
return scope.spec();
}
} // namespace apps
// 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_APPS_DIGITAL_GOODS_UTIL_H_
#define CHROME_BROWSER_APPS_DIGITAL_GOODS_UTIL_H_
#include <string>
namespace content {
class RenderFrameHost;
} // namespace content
namespace apps {
std::string GetTwaPackageName(content::RenderFrameHost* render_frame_host);
std::string GetScope(content::RenderFrameHost* render_frame_host);
} // namespace apps
#endif // CHROME_BROWSER_APPS_DIGITAL_GOODS_UTIL_H_
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