Bug 1429180 - Change selectedStateKey to an array that defines the path within the state object that should be updated. r?mattn draft
authorJared Wein <jwein@mozilla.com>
Mon, 21 May 2018 22:05:47 -0400
changeset 798379 1b0dfaf79ba8f497b20158a16156fae3be7ef94c
parent 798378 a892847d1db0f9db95abf93375df16472a12957b
child 798508 3a1fd67de54bd5ea78654dd02950e95a30acac9a
child 798546 dbff34de25b835739587f14ee0f7f2c12882f22a
child 798952 d6e3bc574c580eacb62ddd8a56c2e99426104831
push id110742
push userbmo:jaws@mozilla.com
push dateTue, 22 May 2018 19:21:05 +0000
reviewersmattn
bugs1429180
milestone62.0a1
Bug 1429180 - Change selectedStateKey to an array that defines the path within the state object that should be updated. r?mattn MozReview-Commit-ID: IjJfmUtvjdz
browser/components/payments/content/paymentDialogWrapper.js
browser/components/payments/res/containers/address-form.js
browser/components/payments/res/containers/basic-card-form.js
browser/components/payments/test/browser/browser_card_edit.js
browser/components/payments/test/mochitest/test_address_form.html
browser/components/payments/test/mochitest/test_basic_card_form.html
--- a/browser/components/payments/content/paymentDialogWrapper.js
+++ b/browser/components/payments/content/paymentDialogWrapper.js
@@ -572,26 +572,32 @@ var paymentDialogWrapper = {
         // so add updated collection here
         Object.assign(successStateChange, {
           tempBasicCards: this.temporaryStore.creditCards.getAll(),
         });
       }
 
       // Select the new record
       if (selectedStateKey) {
-        Object.assign(successStateChange, {
-          [selectedStateKey]: guid,
-        });
+        if (selectedStateKey.length == 1) {
+          Object.assign(successStateChange, {
+            [selectedStateKey[0]]: guid,
+          });
+        } else if (selectedStateKey.length == 2) {
+          // Need to keep properties like preserveFieldValues from getting removed.
+          let subObj = Object.assign({}, successStateChange[selectedStateKey[0]]);
+          subObj[selectedStateKey[1]] = guid;
+          Object.assign(successStateChange, {
+            [selectedStateKey[0]]: subObj,
+          });
+        } else {
+          throw new Error(`selectedStateKey not supported: '${selectedStateKey}'`);
+        }
       }
 
-      const pageId = collectionName == "creditCards" ?
-                                   "basic-card-page" :
-                                   "address-page";
-      successStateChange[pageId].guid = guid;
-
       this.sendMessageToContent("updateState", successStateChange);
     } catch (ex) {
       this.sendMessageToContent("updateState", errorStateChange);
     }
   },
 
   /**
    * @implements {nsIObserver}
--- a/browser/components/payments/res/containers/address-form.js
+++ b/browser/components/payments/res/containers/address-form.js
@@ -169,23 +169,23 @@ export default class AddressForm extends
       default: {
         throw new Error("Unexpected click target");
       }
     }
   }
 
   saveRecord() {
     let record = this.formHandler.buildFormObject();
+    let currentState = this.requestStore.getState();
     let {
       page,
       tempAddresses,
       savedBasicCards,
       "address-page": addressPage,
-      "basic-card-page": basicCardPage,
-    } = this.requestStore.getState();
+    } = currentState;
     let editing = !!addressPage.guid;
 
     if (editing ? (addressPage.guid in tempAddresses) : !this.persistCheckbox.checked) {
       record.isTemporary = true;
     }
 
     let state = {
       errorStateChange: {
@@ -195,39 +195,36 @@ export default class AddressForm extends
           error: this.dataset.errorGenericSave,
         },
         "address-page": addressPage,
       },
       preserveOldProperties: true,
       selectedStateKey: page.selectedStateKey,
     };
 
+    const previousId = page.previousId;
     if (page.onboardingWizard && !Object.keys(savedBasicCards).length) {
       state.successStateChange = {
         page: {
           id: "basic-card-page",
           previousId: "address-page",
           onboardingWizard: page.onboardingWizard,
         },
       };
     } else {
       state.successStateChange = {
         page: {
-          id: page.previousId || "payment-summary",
+          id: previousId || "payment-summary",
           onboardingWizard: page.onboardingWizard,
         },
       };
     }
 
-    state.successStateChange["address-page"] = addressPage;
-    state.successStateChange["basic-card-page"] = basicCardPage;
-
-    const previousId = page.previousId;
     if (previousId) {
+      state.successStateChange[previousId] = Object.assign({}, currentState[previousId]);
       state.successStateChange[previousId].preserveFieldValues = true;
-      state.successStateChange[previousId].addressesModified = true;
     }
 
     paymentRequest.updateAutofillRecord("addresses", record, addressPage.guid, state);
   }
 }
 
 customElements.define("address-form", AddressForm);
--- a/browser/components/payments/res/containers/basic-card-form.js
+++ b/browser/components/payments/res/containers/basic-card-form.js
@@ -150,18 +150,18 @@ export default class BasicCardForm exten
       this.persistCheckbox.hidden = false;
       this.persistCheckbox.checked = !state.isPrivate;
     }
 
     this.formHandler.loadRecord(record, addresses, basicCardPage.preserveFieldValues);
 
     this.form.querySelector(".billingAddressRow").hidden = false;
 
-    if (basicCardPage.addressesModified) {
-      let addressGuid = state["address-page"].guid;
+    if (basicCardPage.billingAddressGUID) {
+      let addressGuid = basicCardPage.billingAddressGUID;
       let billingAddressSelect = this.form.querySelector("#billingAddressGUID");
       billingAddressSelect.value = addressGuid;
     }
   }
 
   handleEvent(event) {
     switch (event.type) {
       case "click": {
@@ -181,16 +181,17 @@ export default class BasicCardForm exten
       case this.addressEditLink: {
         let {
           "basic-card-page": basicCardPage,
         } = this.requestStore.getState();
         let nextState = {
           page: {
             id: "address-page",
             previousId: "basic-card-page",
+            selectedStateKey: ["basic-card-page", "billingAddressGUID"],
           },
           "address-page": {
             guid: null,
             title: this.dataset.billingAddressTitleAdd,
           },
           "basic-card-page": {
             preserveFieldValues: true,
             guid: basicCardPage.guid,
@@ -251,17 +252,17 @@ export default class BasicCardForm exten
     let state = {
       errorStateChange: {
         page: {
           id: "basic-card-page",
           error: this.dataset.errorGenericSave,
         },
       },
       preserveOldProperties: true,
-      selectedStateKey: "selectedPaymentCard",
+      selectedStateKey: ["selectedPaymentCard"],
       successStateChange: {
         page: {
           id: "payment-summary",
         },
       },
     };
 
     const previousId = page.previousId;
--- a/browser/components/payments/test/browser/browser_card_edit.js
+++ b/browser/components/payments/test/browser/browser_card_edit.js
@@ -102,24 +102,35 @@ add_task(async function test_add_link() 
     }
 
     content.document.querySelector("address-form button:last-of-type").click();
     state = await PTU.DialogContentUtils.waitForState(content, (state) => {
       return state.page.id == "basic-card-page" && !state["basic-card-page"].guid &&
              Object.keys(state.savedAddresses).length == 1;
     }, "Check address was added and we're back on basic-card page (add)");
 
+    ok(state["basic-card-page"].preserveFieldValues,
+       "preserveFieldValues should be set when coming back from address-page");
+
+    ok(state["basic-card-page"].billingAddressGUID,
+       "billingAddressGUID should be set when coming back from address-page");
+
     is(billingAddressSelect.childElementCount, 2,
        "Two options should exist in the billingAddressSelect");
     let selectedOption =
       billingAddressSelect.children[billingAddressSelect.selectedIndex];
     let selectedAddressGuid = selectedOption.value;
     is(selectedAddressGuid, Object.values(state.savedAddresses)[0].guid,
        "The select should have the new address selected");
 
+    for (let [key, val] of Object.entries(card)) {
+      let field = content.document.getElementById(key);
+      is(field.value, val, `Field #${key} should have value`);
+    }
+
     content.document.querySelector("basic-card-form button:last-of-type").click();
 
     state = await PTU.DialogContentUtils.waitForState(content, (state) => {
       return Object.keys(state.savedBasicCards).length == 1;
     }, "Check card was not added again");
 
     let cardGUIDs = Object.keys(state.savedBasicCards);
     is(cardGUIDs.length, 1, "Check there is one card");
--- a/browser/components/payments/test/mochitest/test_address_form.html
+++ b/browser/components/payments/test/mochitest/test_address_form.html
@@ -160,22 +160,16 @@ add_task(async function test_saveButton(
       "tel": "+15555551212",
     },
     selectedStateKey: undefined,
     successStateChange: {
       page: {
         id: "payment-summary",
         onboardingWizard: undefined,
       },
-      "address-page": {
-        title: "Sample page title",
-      },
-      "basic-card-page": {
-        guid: null,
-      },
     },
   }, "Check event details for the message to chrome");
   form.remove();
 });
 
 add_task(async function test_genericError() {
   let form = new AddressForm();
   await form.requestStore.setState({
--- a/browser/components/payments/test/mochitest/test_basic_card_form.html
+++ b/browser/components/payments/test/mochitest/test_basic_card_form.html
@@ -125,17 +125,17 @@ add_task(async function test_saveButton(
     messageType: "updateAutofillRecord",
     preserveOldProperties: true,
     record: {
       "cc-exp-month": "11",
       "cc-exp-year": year,
       "cc-name": "J. Smith",
       "cc-number": "4111111111111111",
     },
-    selectedStateKey: "selectedPaymentCard",
+    selectedStateKey: ["selectedPaymentCard"],
     successStateChange: {
       page: {
         id: "payment-summary",
       },
     },
   }, "Check event details for the message to chrome");
   form.remove();
 });