Bug 1458376 - Convert PaymentRequest b-c tests to always test in the dialog. r=jaws draft
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Thu, 10 May 2018 22:05:32 -0700
changeset 795560 02c2bfaff6d4038d3e45549b7b1b429b984092a9
parent 795546 380cf87c1ee3966dd94499942b73085754dc4824
child 795561 98bdde63ee1bcc1ffcdd8db6cd61962edefb6348
push id110013
push usermozilla@noorenberghe.ca
push dateWed, 16 May 2018 03:33:50 +0000
reviewersjaws
bugs1458376
milestone62.0a1
Bug 1458376 - Convert PaymentRequest b-c tests to always test in the dialog. r=jaws This makes test check what we ship and makes them more consistent. It also avoids issues related to nested <xul:browser>. MozReview-Commit-ID: I7v0mVjAnQM
browser/components/payments/test/PaymentTestUtils.jsm
browser/components/payments/test/browser/browser_card_edit.js
browser/components/payments/test/browser/browser_host_name.js
browser/components/payments/test/browser/browser_request_serialization.js
browser/components/payments/test/browser/browser_total.js
browser/components/payments/test/browser/head.js
--- a/browser/components/payments/test/PaymentTestUtils.jsm
+++ b/browser/components/payments/test/PaymentTestUtils.jsm
@@ -57,29 +57,16 @@ var PaymentTestUtils = {
           content.rq.addEventListener(eventName, event => {
             event.updateWith(details);
             resolve();
           }, {once: true});
         });
     },
 
     /**
-     * Create a new payment request and cache it as `rq`.
-     *
-     * @param {Object} args
-     * @param {PaymentMethodData[]} methodData
-     * @param {PaymentDetailsInit} details
-     * @param {PaymentOptions} options
-     */
-    createRequest: ({methodData, details, options}) => {
-      const rq = new content.PaymentRequest(methodData, details, options);
-      content.rq = rq; // assign it so we can retrieve it later
-    },
-
-    /**
      * Create a new payment request cached as `rq` and then show it.
      *
      * @param {Object} args
      * @param {PaymentMethodData[]} methodData
      * @param {PaymentDetailsInit} details
      * @param {PaymentOptions} options
      */
     createAndShowRequest: ({methodData, details, options}) => {
--- a/browser/components/payments/test/browser/browser_card_edit.js
+++ b/browser/components/payments/test/browser/browser_card_edit.js
@@ -2,17 +2,17 @@
 
 "use strict";
 
 add_task(async function test_add_link() {
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, async function check() {
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, async function check() {
     let {
       PaymentTestUtils: PTU,
     } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
 
     let addLink = content.document.querySelector("payment-method-picker a");
     is(addLink.textContent, "Add", "Add link text");
 
     addLink.click();
@@ -64,17 +64,17 @@ add_task(async function test_add_link() 
   }, args);
 });
 
 add_task(async function test_edit_link() {
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, async function check() {
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, async function check() {
     let {
       PaymentTestUtils: PTU,
     } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
 
     let editLink = content.document.querySelector("payment-method-picker a:nth-of-type(2)");
     is(editLink.textContent, "Edit", "Edit link text");
 
     editLink.click();
@@ -124,17 +124,17 @@ add_task(async function test_edit_link()
   }, args);
 });
 
 add_task(async function test_private_persist_defaults() {
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, async function check() {
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, async function check() {
     let {
       PaymentTestUtils: PTU,
     } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
 
     let addLink = content.document.querySelector("payment-method-picker a");
     is(addLink.textContent, "Add", "Add link text");
 
     addLink.click();
@@ -146,17 +146,18 @@ add_task(async function test_private_per
 
     ok(!state.isPrivate,
        "isPrivate flag is not set when paymentrequest is shown from a non-private session");
     let persistInput = content.document.querySelector("basic-card-form labelled-checkbox");
     ok(Cu.waiveXrays(persistInput).checked,
        "checkbox is checked by default from a non-private session");
   }, args);
 
-  await spawnInDialogForPrivateMerchantTask(PTU.ContentTasks.createRequest, async function check() {
+  let privateWin = await BrowserTestUtils.openNewBrowserWindow({private: true});
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, async function check() {
     let {
       PaymentTestUtils: PTU,
     } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
 
     let addLink = content.document.querySelector("payment-method-picker a");
     is(addLink.textContent, "Add", "Add link text");
 
     addLink.click();
@@ -166,25 +167,29 @@ add_task(async function test_private_per
     },
                                                           "Check add page state");
 
     ok(state.isPrivate,
        "isPrivate flag is set when paymentrequest is shown from a private session");
     let persistInput = content.document.querySelector("labelled-checkbox");
     ok(!Cu.waiveXrays(persistInput).checked,
        "checkbox is not checked by default from a private session");
-  }, args);
+  }, args, {
+    browser: privateWin.gBrowser,
+  });
+  await BrowserTestUtils.closeWindow(privateWin);
 });
 
 add_task(async function test_private_card_adding() {
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForPrivateMerchantTask(PTU.ContentTasks.createRequest, async function check() {
+  let privateWin = await BrowserTestUtils.openNewBrowserWindow({private: true});
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, async function check() {
     let {
       PaymentTestUtils: PTU,
     } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
 
     let addLink = content.document.querySelector("payment-method-picker a");
     is(addLink.textContent, "Add", "Add link text");
 
     addLink.click();
@@ -216,10 +221,13 @@ add_task(async function test_private_car
 
     state = await PTU.DialogContentUtils.waitForState(content, (state) => {
       return Object.keys(state.tempBasicCards).length > tempCardCount;
     },
                                                       "Check card was added to temp collection");
 
     is(savedCardCount, Object.keys(state.savedBasicCards).length, "No card was saved in state");
     is(Object.keys(state.tempBasicCards).length, 1, "Card was added temporarily");
-  }, args);
+  }, args, {
+    browser: privateWin.gBrowser,
+  });
+  await BrowserTestUtils.closeWindow(privateWin);
 });
--- a/browser/components/payments/test/browser/browser_host_name.js
+++ b/browser/components/payments/test/browser/browser_host_name.js
@@ -1,16 +1,16 @@
 "use strict";
 
 async function withBasicRequestDialogForOrigin(origin, dialogTaskFn) {
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, dialogTaskFn, args, {
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, dialogTaskFn, args, {
     origin,
   });
 }
 
 add_task(async function test_host() {
   await withBasicRequestDialogForOrigin("https://example.com", () => {
     is(content.document.querySelector("#host-name").textContent, "example.com",
        "Check basic host name");
--- a/browser/components/payments/test/browser/browser_request_serialization.js
+++ b/browser/components/payments/test/browser/browser_request_serialization.js
@@ -20,17 +20,17 @@ add_task(async function test_serializeRe
     } else {
       is(actual.displayItems, null, "falsey input displayItems is serialized to null");
     }
   };
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.twoDisplayItems,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
 
 add_task(async function test_serializeRequest_shippingOptions() {
   const testTask = ({methodData, details}) => {
     let contentWin = Cu.waiveXrays(content);
     let store = contentWin.document.querySelector("payment-dialog").requestStore;
     let state = store && store.getState();
     ok(state, "got request store state");
@@ -50,17 +50,17 @@ add_task(async function test_serializeRe
     //   is(actual.shippingOptions, null, "falsey input shippingOptions is serialized to null");
     // }
   };
 
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.twoShippingOptions,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
 
 add_task(async function test_serializeRequest_paymentMethods() {
   const testTask = ({methodData, details}) => {
     let contentWin = Cu.waiveXrays(content);
     let store = contentWin.document.querySelector("payment-dialog").requestStore;
     let state = store && store.getState();
     ok(state, "got request store state");
@@ -70,17 +70,17 @@ add_task(async function test_serializeRe
     is(result.paymentMethods.length, 2, "Correct number of payment methods");
     ok(result.paymentMethods[0].supportedMethods && result.paymentMethods[1].supportedMethods,
        "Both payment methods look valid");
   };
   const args = {
     methodData: [PTU.MethodData.basicCard, PTU.MethodData.bobPay],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
 
 add_task(async function test_serializeRequest_modifiers() {
   const testTask = ({methodData, details}) => {
     let contentWin = Cu.waiveXrays(content);
     let store = contentWin.document.querySelector("payment-dialog").requestStore;
     let state = store && store.getState();
     ok(state, "got request store state");
@@ -106,13 +106,13 @@ add_task(async function test_serializeRe
       is(item.total.label, expectedItem.total.label, "modifier total label matches");
       is(item.total.amount.value, expectedItem.total.amount.value, "modifier label matches");
       is(item.total.amount.currency, expectedItem.total.amount.currency,
          "modifier total currency matches");
     }
   };
 
   const args = {
-    methodData: [PTU.MethodData.bobPay],
+    methodData: [PTU.MethodData.basicCard, PTU.MethodData.bobPay],
     details: PTU.Details.bobPayPaymentModifier,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
--- a/browser/components/payments/test/browser/browser_total.js
+++ b/browser/components/payments/test/browser/browser_total.js
@@ -5,42 +5,42 @@ add_task(async function test_total() {
     is(content.document.querySelector("#total > currency-amount").textContent,
        "$60.00",
        "Check total currency amount");
   };
   const args = {
     methodData: [PTU.MethodData.basicCard],
     details: PTU.Details.total60USD,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
 
 add_task(async function test_modifier_with_no_method_selected() {
   const testTask = async ({methodData, details}) => {
     // There are no payment methods installed/setup so we expect the original (unmodified) total.
     is(content.document.querySelector("#total > currency-amount").textContent,
        "$2.00",
        "Check unmodified total currency amount");
   };
   const args = {
     methodData: [PTU.MethodData.bobPay, PTU.MethodData.basicCard],
     details: PTU.Details.bobPayPaymentModifier,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
 });
 
 add_task(async function test_modifier_with_no_method_selected() {
   info("adding a basic-card");
   await addSampleAddressesAndBasicCard();
 
   const testTask = async ({methodData, details}) => {
     // We expect the *only* payment method (the one basic-card) to be selected initially.
     is(content.document.querySelector("#total > currency-amount").textContent,
        "$2.50",
        "Check modified total currency amount");
   };
   const args = {
     methodData: [PTU.MethodData.bobPay, PTU.MethodData.basicCard],
     details: PTU.Details.bobPayPaymentModifier,
   };
-  await spawnInDialogForMerchantTask(PTU.ContentTasks.createRequest, testTask, args);
+  await spawnInDialogForMerchantTask(PTU.ContentTasks.createAndShowRequest, testTask, args);
   await cleanupFormAutofillStorage();
 });
--- a/browser/components/payments/test/browser/head.js
+++ b/browser/components/payments/test/browser/head.js
@@ -107,17 +107,17 @@ function withNewDialogFrame(requestId, t
       await ContentTaskUtils.waitForCondition(() => content.document.readyState == "complete",
                                               "Waiting for the unprivileged frame to load");
     });
     await taskFn(paymentRequestFrame);
   }
 
   let args = {
     gBrowser,
-    url: `chrome://payments/content/paymentDialogWrapper.xhtml?requestId=${requestId}`,
+    url: `chrome://payments/content/paymentDialogWrapper.xul?requestId=${requestId}`,
   };
   return BrowserTestUtils.withNewTab(args, dialogTabTask);
 }
 
 /**
  * Spawn a content task inside the inner unprivileged frame of a privileged Payment Request dialog.
  *
  * @param {string} requestId
@@ -216,55 +216,34 @@ async function setupPaymentDialog(browse
  *
  * @param {Function} merchantTaskFn
  * @param {Function} dialogTaskFn
  * @param {Object} taskArgs
  * @param {Object} options
  * @param {string} options.origin
  */
 async function spawnInDialogForMerchantTask(merchantTaskFn, dialogTaskFn, taskArgs, {
+  browser,
   origin = "https://example.com",
 } = {
   origin: "https://example.com",
 }) {
   await withMerchantTab({
+    browser,
     url: origin + BLANK_PAGE_PATH,
   }, async merchBrowser => {
-    await ContentTask.spawn(merchBrowser, taskArgs, merchantTaskFn);
-
-    const requests = getPaymentRequests();
-    is(requests.length, 1, "Should have one payment request");
-    let request = requests[0];
-    ok(!!request.requestId, "Got a payment request with an ID");
-
-    await spawnTaskInNewDialog(request.requestId, dialogTaskFn, taskArgs);
-  });
-}
+    let {win, frame} = await setupPaymentDialog(merchBrowser, {
+      ...taskArgs,
+      merchantTaskFn,
+    });
 
-async function spawnInDialogForPrivateMerchantTask(merchantTaskFn, dialogTaskFn, taskArgs, {
-  origin = "https://example.com",
-} = {
-  origin: "https://example.com",
-}) {
-  let privateWin = await BrowserTestUtils.openNewBrowserWindow({private: true});
-
-  await withMerchantTab({
-    url: origin + BLANK_PAGE_PATH,
-    browser: privateWin.gBrowser,
-  }, async merchBrowser => {
-    await ContentTask.spawn(merchBrowser, taskArgs, merchantTaskFn);
-
-    const requests = getPaymentRequests();
-    is(requests.length, 1, "Should have one payment request");
-    let request = requests[0];
-    ok(!!request.requestId, "Got a payment request with an ID");
-
-    await spawnTaskInNewDialog(request.requestId, dialogTaskFn, taskArgs);
+    await spawnPaymentDialogTask(frame, dialogTaskFn, taskArgs);
+    spawnPaymentDialogTask(frame, PTU.DialogContentTasks.manuallyClickCancel);
+    await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
   });
-  await BrowserTestUtils.closeWindow(privateWin);
 }
 
 async function setupFormAutofillStorage() {
   await formAutofillStorage.initialize();
 }
 
 function cleanupFormAutofillStorage() {
   formAutofillStorage.addresses._nukeAllRecords();