PaymentMethodChangeEvent.cpp (6558B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 #include "mozilla/dom/PaymentMethodChangeEvent.h" 8 9 #include "BasicCardPayment.h" 10 #include "PaymentRequestUtils.h" 11 #include "mozilla/HoldDropJSObjects.h" 12 #include "mozilla/dom/PaymentRequestUpdateEvent.h" 13 14 namespace mozilla::dom { 15 16 NS_IMPL_CYCLE_COLLECTION_CLASS(PaymentMethodChangeEvent) 17 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(PaymentMethodChangeEvent, 18 PaymentRequestUpdateEvent) 19 mozilla::DropJSObjects(tmp); 20 NS_IMPL_CYCLE_COLLECTION_UNLINK_END 21 22 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(PaymentMethodChangeEvent, 23 PaymentRequestUpdateEvent) 24 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END 25 26 NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PaymentMethodChangeEvent, 27 PaymentRequestUpdateEvent) 28 NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBER_CALLBACK(mMethodDetails) 29 NS_IMPL_CYCLE_COLLECTION_TRACE_END 30 31 NS_IMPL_ADDREF_INHERITED(PaymentMethodChangeEvent, PaymentRequestUpdateEvent) 32 NS_IMPL_RELEASE_INHERITED(PaymentMethodChangeEvent, PaymentRequestUpdateEvent) 33 34 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(PaymentMethodChangeEvent) 35 NS_INTERFACE_MAP_END_INHERITING(PaymentRequestUpdateEvent) 36 37 already_AddRefed<PaymentMethodChangeEvent> 38 PaymentMethodChangeEvent::Constructor( 39 mozilla::dom::EventTarget* aOwner, const nsAString& aType, 40 const PaymentRequestUpdateEventInit& aEventInitDict, 41 const nsAString& aMethodName, const ChangeDetails& aMethodDetails) { 42 RefPtr<PaymentMethodChangeEvent> e = new PaymentMethodChangeEvent(aOwner); 43 bool trusted = e->Init(aOwner); 44 e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable); 45 e->SetTrusted(trusted); 46 e->SetComposed(aEventInitDict.mComposed); 47 e->SetMethodName(aMethodName); 48 e->SetMethodDetails(aMethodDetails); 49 return e.forget(); 50 } 51 52 already_AddRefed<PaymentMethodChangeEvent> 53 PaymentMethodChangeEvent::Constructor( 54 const GlobalObject& aGlobal, const nsAString& aType, 55 const PaymentMethodChangeEventInit& aEventInitDict) { 56 nsCOMPtr<mozilla::dom::EventTarget> owner = 57 do_QueryInterface(aGlobal.GetAsSupports()); 58 RefPtr<PaymentMethodChangeEvent> e = new PaymentMethodChangeEvent(owner); 59 bool trusted = e->Init(owner); 60 e->InitEvent(aType, aEventInitDict.mBubbles, aEventInitDict.mCancelable); 61 e->SetTrusted(trusted); 62 e->SetComposed(aEventInitDict.mComposed); 63 e->init(aEventInitDict); 64 return e.forget(); 65 } 66 67 PaymentMethodChangeEvent::PaymentMethodChangeEvent(EventTarget* aOwner) 68 : PaymentRequestUpdateEvent(aOwner) { 69 MOZ_ASSERT(aOwner); 70 mozilla::HoldJSObjects(this); 71 } 72 73 void PaymentMethodChangeEvent::init( 74 const PaymentMethodChangeEventInit& aEventInitDict) { 75 mMethodName.Assign(aEventInitDict.mMethodName); 76 mMethodDetails = aEventInitDict.mMethodDetails; 77 } 78 79 void PaymentMethodChangeEvent::GetMethodName(nsAString& aMethodName) { 80 aMethodName.Assign(mMethodName); 81 } 82 83 void PaymentMethodChangeEvent::SetMethodName(const nsAString& aMethodName) { 84 mMethodName = aMethodName; 85 } 86 87 void PaymentMethodChangeEvent::GetMethodDetails( 88 JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) { 89 MOZ_ASSERT(aCx); 90 91 if (mMethodDetails) { 92 aRetVal.set(mMethodDetails.get()); 93 return; 94 } 95 96 RefPtr<BasicCardService> service = BasicCardService::GetService(); 97 MOZ_ASSERT(service); 98 aRetVal.set(nullptr); 99 switch (mInternalDetails.type()) { 100 case ChangeDetails::GeneralMethodDetails: { 101 const GeneralDetails& rawDetails = mInternalDetails.generalDetails(); 102 DeserializeToJSObject(rawDetails.details, aCx, aRetVal); 103 break; 104 } 105 case ChangeDetails::BasicCardMethodDetails: { 106 const BasicCardDetails& rawDetails = mInternalDetails.basicCardDetails(); 107 BasicCardChangeDetails basicCardDetails; 108 PaymentOptions options; 109 mRequest->GetOptions(options); 110 if (options.mRequestBillingAddress) { 111 if (!rawDetails.billingAddress.country.IsEmpty() || 112 !rawDetails.billingAddress.addressLine.IsEmpty() || 113 !rawDetails.billingAddress.region.IsEmpty() || 114 !rawDetails.billingAddress.regionCode.IsEmpty() || 115 !rawDetails.billingAddress.city.IsEmpty() || 116 !rawDetails.billingAddress.dependentLocality.IsEmpty() || 117 !rawDetails.billingAddress.postalCode.IsEmpty() || 118 !rawDetails.billingAddress.sortingCode.IsEmpty() || 119 !rawDetails.billingAddress.organization.IsEmpty() || 120 !rawDetails.billingAddress.recipient.IsEmpty() || 121 !rawDetails.billingAddress.phone.IsEmpty()) { 122 nsCOMPtr<nsPIDOMWindowInner> window = 123 do_QueryInterface(GetParentObject()); 124 basicCardDetails.mBillingAddress = 125 new PaymentAddress(window, rawDetails.billingAddress.country, 126 rawDetails.billingAddress.addressLine, 127 rawDetails.billingAddress.region, 128 rawDetails.billingAddress.regionCode, 129 rawDetails.billingAddress.city, 130 rawDetails.billingAddress.dependentLocality, 131 rawDetails.billingAddress.postalCode, 132 rawDetails.billingAddress.sortingCode, 133 rawDetails.billingAddress.organization, 134 rawDetails.billingAddress.recipient, 135 rawDetails.billingAddress.phone); 136 } 137 } 138 MOZ_ASSERT(aCx); 139 JS::Rooted<JS::Value> value(aCx); 140 if (NS_WARN_IF(!basicCardDetails.ToObjectInternal(aCx, &value))) { 141 return; 142 } 143 aRetVal.set(&value.toObject()); 144 break; 145 } 146 default: { 147 break; 148 } 149 } 150 } 151 152 void PaymentMethodChangeEvent::SetMethodDetails( 153 const ChangeDetails& aMethodDetails) { 154 mInternalDetails = aMethodDetails; 155 } 156 157 PaymentMethodChangeEvent::~PaymentMethodChangeEvent() { 158 mozilla::DropJSObjects(this); 159 } 160 161 JSObject* PaymentMethodChangeEvent::WrapObjectInternal( 162 JSContext* aCx, JS::Handle<JSObject*> aGivenProto) { 163 return PaymentMethodChangeEvent_Binding::Wrap(aCx, this, aGivenProto); 164 } 165 166 } // namespace mozilla::dom