Bug 1427950 - Have setStateFromParent handle removing deleted GUIDs from the "selected" keys. r=jaws
MozReview-Commit-ID: 3zD2XLkIj6n
--- a/toolkit/components/payments/res/containers/payment-dialog.js
+++ b/toolkit/components/payments/res/containers/payment-dialog.js
@@ -75,16 +75,40 @@ class PaymentDialog extends PaymentState
* Set some state from the privileged parent process.
* Other elements that need to set state should use their own `this.requestStore.setState`
* method provided by the `PaymentStateSubscriberMixin`.
*
* @param {object} state - See `PaymentsStore.setState`
*/
setStateFromParent(state) {
this.requestStore.setState(state);
+
+ // Check if any foreign-key constraints were invalidated.
+ let {
+ savedAddresses,
+ savedBasicCards,
+ selectedPaymentCard,
+ selectedShippingAddress,
+ } = this.requestStore.getState();
+
+ // Ensure `selectedShippingAddress` never refers to a deleted address and refers
+ // to an address if one exists.
+ if (!savedAddresses[selectedShippingAddress]) {
+ this.requestStore.setState({
+ selectedShippingAddress: Object.keys(savedAddresses)[0] || null,
+ });
+ }
+
+ // Ensure `selectedPaymentCard` never refers to a deleted payment card and refers
+ // to a payment card if one exists.
+ if (!savedBasicCards[selectedPaymentCard]) {
+ this.requestStore.setState({
+ selectedPaymentCard: Object.keys(savedBasicCards)[0] || null,
+ });
+ }
}
render(state) {
let request = state.request;
this._hostNameEl.textContent = request.topLevelPrincipal.URI.displayHost;
let totalItem = request.paymentDetails.totalItem;
let totalAmountEl = this.querySelector("#total > currency-amount");
--- a/toolkit/components/payments/res/debugging.js
+++ b/toolkit/components/payments/res/debugging.js
@@ -1,13 +1,16 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-const requestStore = window.parent.document.querySelector("payment-dialog").requestStore;
+const paymentDialog = window.parent.document.querySelector("payment-dialog");
+// The requestStore should be manipulated for most changes but autofill storage changes
+// happen through setStateFromParent which includes some consistency checks.
+const requestStore = paymentDialog.requestStore;
let REQUEST_1 = {
tabId: 9,
topLevelPrincipal: {URI: {displayHost: "tschaeff.github.io"}},
requestId: "3797081f-a96b-c34b-a58b-1083c6e66e25",
paymentMethods: [],
paymentDetails: {
id: "",
@@ -131,17 +134,19 @@ let ADDRESSES_1 = {
"tel": "+1 650 555-5555",
},
};
let buttonActions = {
delete1Address() {
let savedAddresses = Object.assign({}, requestStore.getState().savedAddresses);
delete savedAddresses[Object.keys(savedAddresses)[0]];
- requestStore.setState({
+ // Use setStateFromParent since it ensures there is no dangling
+ // `selectedShippingAddress` foreign key (FK) reference.
+ paymentDialog.setStateFromParent({
savedAddresses,
});
},
logState() {
let state = requestStore.getState();
// eslint-disable-next-line no-console
console.log(state);
@@ -152,17 +157,17 @@ let buttonActions = {
window.parent.location.reload(true);
},
rerender() {
requestStore.setState({});
},
setAddresses1() {
- requestStore.setState({savedAddresses: ADDRESSES_1});
+ paymentDialog.setStateFromParent({savedAddresses: ADDRESSES_1});
},
setRequest1() {
requestStore.setState({request: REQUEST_1});
},
setRequest2() {
requestStore.setState({request: REQUEST_2});
--- a/toolkit/components/payments/res/mixins/PaymentStateSubscriberMixin.js
+++ b/toolkit/components/payments/res/mixins/PaymentStateSubscriberMixin.js
@@ -31,16 +31,18 @@ let requestStore = new PaymentsStore({
paymentOptions: {
requestPayerName: false,
requestPayerEmail: false,
requestPayerPhone: false,
requestShipping: false,
shippingType: "shipping",
},
},
+ selectedPaymentCard: null,
+ selectedShippingAddress: null,
savedAddresses: {},
savedBasicCards: {},
});
/* exported PaymentStateSubscriberMixin */
/**