Files
electron/shell/browser/mac/in_app_purchase_product.mm
electron-roller[bot] 61374019c0 chore: bump chromium to 103.0.5046.0 (main) (#33906)
* chore: bump chromium in DEPS to 103.0.5020.0

* chore: bump chromium in DEPS to 103.0.5022.0

* chore: bump chromium in DEPS to 103.0.5024.0

* chore: update patches

* 3587410: [Printing] Remove JobEventDetails

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3587410

* chore: bump chromium in DEPS to 103.0.5026.0

* chore: update patches

* 3577218: WebUI: Delete webui_resources.grd and related GN targets.

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3577218

* chore: bump chromium in DEPS to 103.0.5028.0

* chore: update patches

* 3579297: Convert UpdatePrintSettings() to use non-deprecated base::Value APIs.

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3579297

* 3560622: serial: Add SerialPort.forget() method

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3560622

* 3581708: Restore original display when moving from tab-fullscreen to browser-fullscreen.

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3581708

* chore: fix authorization flags lint error

* 3583363: Remove net wrappers around base/strings/escape.h

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3583363

* fixup! 3560622: serial: Add SerialPort.forget() method

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3560622

* 3587589: Reland "Propagate the MIME type from DownloadTargetDeterminer to DownloadItem"

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3587589

* 3584006: Remove IsRenderViewLive from content public

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3584006

* 3596174: [api] Remove APIs for resurrecting finalizers

Ref: https://chromium-review.googlesource.com/c/v8/v8/+/3596174

* 3368244: Hook SnapshotForContentAnalysis renderer API to scan system prints

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3368244

* chore: bump chromium in DEPS to 103.0.5030.0

* chore: update patches

* chore: bump chromium in DEPS to 103.0.5032.0

* chore: bump chromium in DEPS to 103.0.5034.0

* chore: bump chromium in DEPS to 103.0.5036.0

* chore: update patches

* 3586363: Introduce PrintRenderFrame.PrintWithParams() for batch printing to PDF

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3586363

* 3593199: Remove content::PermissionType references and replace them with blink::PermissionType

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3593199

* 3368244: Hook SnapshotForContentAnalysis renderer API to scan system prints

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3368244

* chore: lint

* chore: bump chromium in DEPS to 103.0.5038.0

* chore: update patches

* fixup! 3560622: serial: Add SerialPort.forget() method

* 3606495: mac screen capture: add metric

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3606495

* chore: bump chromium in DEPS to 103.0.5040.0

* chore: update patches

* 3590840: Add IPs to DnsOverHttpsServerConfig

https://chromium-review.googlesource.com/c/chromium/src/+/3590840

* stub functions for ElectronSerialDelegate and SerialChooserController to fix link

* 3566412: [base] Remove base/android dependency on post_task.h and officially remove post_task.h!

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3566412

* 3347944: [content] No longer hand-off whole MainFunctionParams to BrowserMainParts

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3347944

* fixup! 3566412: [base] Remove base/android dependency on post_task.h and off…
e3ea3e1
…icially remove post_task.h!

* chore: update process_singleton patches for content::GetIOThreadTaskRunner({})

Ref: 2015655: [BrowserThread] Migrate co/pub/br and co/br/scheduler to the new API | https://chromium-review.googlesource.com/c/chromium/src/+/2015655

* chore: migrate base::DeleteSoon to content::GetUIThreadTaskRunner({})->DeleteSoon

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3566412

* chore: remove duplicate functions for RevokePortPermissionWebInitiated & GetPortInfo

* chore: migrate Linux/Windows methods off of post_task.h

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3566412

* 64908: Stop building legacy SwiftShader GL in Chromium

https://swiftshader-review.googlesource.com/c/SwiftShader/+/64908

* 3573245: Added Themed versions of RoundedRectBackground and RoundedRectBorder.

Ref: https://chromium-review.googlesource.com/c/chromium/src/+/3573245

* chore: bump chromium in DEPS to 103.0.5042.0

* chore: update patches

* 3571804: [api] Advance API deprecation for V8 version v10.2

https://chromium-review.googlesource.com/c/v8/v8/+/3571804

* fixup! 3571804: [api] Advance API deprecation for V8 version v10.2

* build: fix run-clang-format extension matching

* lint

* fix windows build

* how is clang-format still not working for me

* chore: update patches

* 3623985: Replace ad-hoc SetPublicFirstPartySets calls with method in ContentBrowserClient.

https://chromium-review.googlesource.com/c/chromium/src/+/3623985

* no need to implement WillProvidePublicFirstPartySets; the default is false

* 3601036: [QT] Introduce ui/views/linux_ui/linux_ui_factory.*

https://chromium-review.googlesource.com/c/chromium/src/+/3601036

* 3583363: Remove net wrappers around base/strings/escape.h

https://chromium-review.googlesource.com/c/chromium/src/+/3583363

* lint

* chore: bump chromium in DEPS to 103.0.5044.0

* fix conflicts

* chore: update patches

* upgrade nan

* pin version of nan in tests

* replace my hacky deprecated override fix with the fix from upstream

* revert runtime dcheck in v8

* pin nan version at root too

* refactor: tell gyp to use c++17 when building with our node

* Revert "refactor: tell gyp to use c++17 when building with our node"

This reverts commit 41a03a5799.

* Undo the reversion of 41a03a5799.

This reverts commit 54440abc59.

* disable sequential/test-cpu-prof-kill for now

* also sequential/test-diagnostic-dir-cpu-prof

Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Keeley Hammond <khammond@slack-corp.com>
Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
Co-authored-by: VerteDinde <vertedinde@electronjs.org>
Co-authored-by: Jeremy Rose <japthorp@slack-corp.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
Co-authored-by: Jeremy Rose <jeremya@chromium.org>
Co-authored-by: Charles Kerr <charles@charleskerr.com>
2022-05-17 12:48:40 -04:00

332 lines
10 KiB
Plaintext

// Copyright (c) 2017 Amaplex Software, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "shell/browser/mac/in_app_purchase_product.h"
#include <string>
#include <utility>
#include <vector>
#include "base/bind.h"
#include "base/strings/sys_string_conversions.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#import <StoreKit/StoreKit.h>
// ============================================================================
// InAppPurchaseProduct
// ============================================================================
// --------------------------------- Interface --------------------------------
@interface InAppPurchaseProduct : NSObject <SKProductsRequestDelegate> {
@private
in_app_purchase::InAppPurchaseProductsCallback callback_;
}
- (id)initWithCallback:(in_app_purchase::InAppPurchaseProductsCallback)callback;
@end
// ------------------------------- Implementation -----------------------------
@implementation InAppPurchaseProduct
/**
* Init with a callback.
*
* @param callback - The callback that will be called to return the products.
*/
- (id)initWithCallback:
(in_app_purchase::InAppPurchaseProductsCallback)callback {
if ((self = [super init])) {
callback_ = std::move(callback);
}
return self;
}
/**
* Return products.
*
* @param productIDs - The products' id to fetch.
*/
- (void)getProducts:(NSSet*)productIDs {
SKProductsRequest* productsRequest;
productsRequest =
[[SKProductsRequest alloc] initWithProductIdentifiers:productIDs];
productsRequest.delegate = self;
[productsRequest start];
}
/**
* @see SKProductsRequestDelegate
*/
- (void)productsRequest:(SKProductsRequest*)request
didReceiveResponse:(SKProductsResponse*)response {
// Release request object.
[request release];
// Get the products.
NSArray* products = response.products;
// Convert the products.
std::vector<in_app_purchase::Product> converted;
converted.reserve([products count]);
for (SKProduct* product in products) {
converted.push_back([self skProductToStruct:product]);
}
// Send the callback to the browser thread.
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, base::BindOnce(std::move(callback_), converted));
[self release];
}
/**
* Format local price.
*
* @param price - The price to format.
* @param priceLocal - The local format.
*/
- (NSString*)formatPrice:(NSDecimalNumber*)price
withLocal:(NSLocale*)priceLocal {
NSNumberFormatter* numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:priceLocal];
return [numberFormatter stringFromNumber:price];
}
/**
* Convert a SKProductSubscriptionPeriod object to a ProductSubscriptionPeriod
* structure.
*
* @param productProductSubscriptionPeriod - The SKProductSubscriptionPeriod
* object to convert.
*/
- (in_app_purchase::ProductSubscriptionPeriod)
skProductSubscriptionPeriodToStruct:
(SKProductSubscriptionPeriod*)productSubscriptionPeriod
API_AVAILABLE(macosx(10.13.2)) {
in_app_purchase::ProductSubscriptionPeriod productSubscriptionPeriodStruct;
productSubscriptionPeriodStruct.numberOfUnits =
(int)productSubscriptionPeriod.numberOfUnits;
if (productSubscriptionPeriod.unit == SKProductPeriodUnitDay) {
productSubscriptionPeriodStruct.unit = "day";
} else if (productSubscriptionPeriod.unit == SKProductPeriodUnitWeek) {
productSubscriptionPeriodStruct.unit = "week";
} else if (productSubscriptionPeriod.unit == SKProductPeriodUnitMonth) {
productSubscriptionPeriodStruct.unit = "month";
} else if (productSubscriptionPeriod.unit == SKProductPeriodUnitYear) {
productSubscriptionPeriodStruct.unit = "year";
}
return productSubscriptionPeriodStruct;
}
/**
* Convert a SKProductDiscount object to a ProductDiscount structure.
*
* @param productDiscount - The SKProductDiscount object to convert.
*/
- (in_app_purchase::ProductDiscount)skProductDiscountToStruct:
(SKProductDiscount*)productDiscount API_AVAILABLE(macosx(10.13.2)) {
in_app_purchase::ProductDiscount productDiscountStruct;
if (productDiscount.paymentMode == SKProductDiscountPaymentModePayAsYouGo) {
productDiscountStruct.paymentMode = "payAsYouGo";
} else if (productDiscount.paymentMode ==
SKProductDiscountPaymentModePayUpFront) {
productDiscountStruct.paymentMode = "payUpFront";
} else if (productDiscount.paymentMode ==
SKProductDiscountPaymentModeFreeTrial) {
productDiscountStruct.paymentMode = "freeTrial";
}
productDiscountStruct.numberOfPeriods = (int)productDiscount.numberOfPeriods;
if (productDiscount.priceLocale != nil) {
productDiscountStruct.priceLocale =
[[self formatPrice:productDiscount.price
withLocal:productDiscount.priceLocale] UTF8String];
}
if (productDiscount.subscriptionPeriod != nil) {
productDiscountStruct.subscriptionPeriod = [self
skProductSubscriptionPeriodToStruct:productDiscount.subscriptionPeriod];
}
if (@available(macOS 10.14.4, *)) {
productDiscountStruct.type = (int)productDiscount.type;
if (productDiscount.identifier != nil) {
productDiscountStruct.identifier =
[productDiscount.identifier UTF8String];
}
productDiscountStruct.price = [productDiscount.price doubleValue];
}
return productDiscountStruct;
}
/**
* Convert a skProduct object to Product structure.
*
* @param product - The SKProduct object to convert.
*/
- (in_app_purchase::Product)skProductToStruct:(SKProduct*)product {
in_app_purchase::Product productStruct;
// Product Identifier
if (product.productIdentifier != nil) {
productStruct.productIdentifier = [product.productIdentifier UTF8String];
}
// Product Attributes
if (product.localizedDescription != nil) {
productStruct.localizedDescription =
[product.localizedDescription UTF8String];
}
if (product.localizedTitle != nil) {
productStruct.localizedTitle = [product.localizedTitle UTF8String];
}
if (product.contentVersion != nil) {
productStruct.contentVersion = [product.contentVersion UTF8String];
}
if (product.contentLengths != nil) {
productStruct.contentLengths.reserve([product.contentLengths count]);
for (NSNumber* contentLength in product.contentLengths) {
productStruct.contentLengths.push_back([contentLength longLongValue]);
}
}
// Pricing Information
if (product.price != nil) {
productStruct.price = [product.price doubleValue];
if (product.priceLocale != nil) {
productStruct.formattedPrice =
[[self formatPrice:product.price
withLocal:product.priceLocale] UTF8String];
// Currency Information
if (@available(macOS 10.12, *)) {
if (product.priceLocale.currencyCode != nil) {
productStruct.currencyCode =
[product.priceLocale.currencyCode UTF8String];
}
}
}
}
if (@available(macOS 10.13.2, *)) {
if (product.introductoryPrice != nil) {
productStruct.introductoryPrice =
[self skProductDiscountToStruct:product.introductoryPrice];
}
if (product.subscriptionPeriod != nil) {
productStruct.subscriptionPeriod =
[self skProductSubscriptionPeriodToStruct:product.subscriptionPeriod];
}
}
if (@available(macOS 10.14, *)) {
if (product.subscriptionGroupIdentifier != nil) {
productStruct.subscriptionGroupIdentifier =
[product.subscriptionGroupIdentifier UTF8String];
}
}
if (@available(macOS 10.14.4, *)) {
if (product.discounts != nil) {
productStruct.discounts.reserve([product.discounts count]);
for (SKProductDiscount* discount in product.discounts) {
productStruct.discounts.push_back(
[self skProductDiscountToStruct:discount]);
}
}
}
// Downloadable Content Information
productStruct.isDownloadable = [product downloadable];
if (@available(macOS 10.14, *)) {
if (product.downloadContentVersion != nil) {
productStruct.downloadContentVersion =
[product.downloadContentVersion UTF8String];
}
if (product.downloadContentLengths != nil) {
productStruct.downloadContentLengths.reserve(
[product.downloadContentLengths count]);
for (NSNumber* contentLength in product.downloadContentLengths) {
productStruct.downloadContentLengths.push_back(
[contentLength longLongValue]);
}
}
} else {
if (product.contentVersion != nil) {
productStruct.downloadContentVersion =
[product.contentVersion UTF8String];
}
if (product.contentLengths != nil) {
productStruct.downloadContentLengths.reserve(
[product.contentLengths count]);
for (NSNumber* contentLength in product.contentLengths) {
productStruct.downloadContentLengths.push_back(
[contentLength longLongValue]);
}
}
}
return productStruct;
}
@end
// ============================================================================
// C++ in_app_purchase
// ============================================================================
namespace in_app_purchase {
ProductSubscriptionPeriod::ProductSubscriptionPeriod(
const ProductSubscriptionPeriod&) = default;
ProductSubscriptionPeriod::ProductSubscriptionPeriod() = default;
ProductSubscriptionPeriod::~ProductSubscriptionPeriod() = default;
ProductDiscount::ProductDiscount(const ProductDiscount&) = default;
ProductDiscount::ProductDiscount() = default;
ProductDiscount::~ProductDiscount() = default;
Product::Product() = default;
Product::Product(const Product&) = default;
Product::~Product() = default;
void GetProducts(const std::vector<std::string>& productIDs,
InAppPurchaseProductsCallback callback) {
auto* iapProduct =
[[InAppPurchaseProduct alloc] initWithCallback:std::move(callback)];
// Convert the products' id to NSSet.
NSMutableSet* productsIDSet =
[NSMutableSet setWithCapacity:productIDs.size()];
for (auto& productID : productIDs) {
[productsIDSet addObject:base::SysUTF8ToNSString(productID)];
}
// Fetch the products.
[iapProduct getProducts:productsIDSet];
}
} // namespace in_app_purchase