diff --git a/shell/browser/mac/in_app_purchase.mm b/shell/browser/mac/in_app_purchase.mm index d015183652aa..3ff87a98300d 100644 --- a/shell/browser/mac/in_app_purchase.mm +++ b/shell/browser/mac/in_app_purchase.mm @@ -26,6 +26,7 @@ in_app_purchase::InAppPurchaseCallback callback_; NSInteger quantity_; NSString* username_; + InAppPurchase __strong* self_; } - (id)initWithCallback:(in_app_purchase::InAppPurchaseCallback)callback @@ -53,6 +54,7 @@ callback_ = std::move(callback); quantity_ = quantity; username_ = [username copy]; + self_ = self; } return self; @@ -91,6 +93,7 @@ // Return if the product is not found or invalid. if (product == nil) { [self runCallback:false]; + self_ = nil; return; } @@ -114,6 +117,7 @@ // Notify that the payment has been added to the queue with success. [self runCallback:true]; + self_ = nil; } /** @@ -128,10 +132,6 @@ } } -- (void)dealloc { - username_ = nil; -} - @end // ============================================================================ diff --git a/shell/browser/mac/in_app_purchase_product.mm b/shell/browser/mac/in_app_purchase_product.mm index adae14602bf1..f1b3ea541e2f 100644 --- a/shell/browser/mac/in_app_purchase_product.mm +++ b/shell/browser/mac/in_app_purchase_product.mm @@ -24,6 +24,7 @@ @interface InAppPurchaseProduct : NSObject { @private in_app_purchase::InAppPurchaseProductsCallback callback_; + InAppPurchaseProduct __strong* self_; } - (id)initWithCallback:(in_app_purchase::InAppPurchaseProductsCallback)callback; @@ -43,6 +44,7 @@ (in_app_purchase::InAppPurchaseProductsCallback)callback { if ((self = [super init])) { callback_ = std::move(callback); + self_ = self; } return self; @@ -81,6 +83,7 @@ // Send the callback to the browser thread. content::GetUIThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(std::move(callback_), converted)); + self_ = nil; } /** diff --git a/spec/api-in-app-purchase-spec.ts b/spec/api-in-app-purchase-spec.ts index 67c8d66f4f3b..72b892b2fa94 100644 --- a/spec/api-in-app-purchase-spec.ts +++ b/spec/api-in-app-purchase-spec.ts @@ -1,5 +1,6 @@ import { expect } from 'chai'; import { inAppPurchase } from 'electron/main'; +import { ifdescribe } from './lib/spec-helpers'; describe('inAppPurchase module', function () { if (process.platform !== 'darwin') return; @@ -33,11 +34,9 @@ describe('inAppPurchase module', function () { expect(inAppPurchase.getReceiptURL()).to.match(/_MASReceipt\/receipt$/); }); - // The following three tests are disabled because they hit Apple servers, and - // Apple started blocking requests from AWS IPs (we think), so they fail on CI. - // TODO: find a way to mock out the server requests so we can test these APIs - // without relying on a remote service. - xdescribe('handles product purchases', () => { + // This fails on x64 in CI - likely owing to some weirdness with the machines. + // We should look into fixing it there but at least run it on arm6 machines. + ifdescribe(process.arch !== 'x64')('handles product purchases', () => { it('purchaseProduct() fails when buying invalid product', async () => { const success = await inAppPurchase.purchaseProduct('non-exist'); expect(success).to.be.false('failed to purchase non-existent product');