--- a/browser/components/payments/res/paymentRequest.js
+++ b/browser/components/payments/res/paymentRequest.js
@@ -111,40 +111,52 @@ var paymentRequest = {
// Handle getting called before the DOM is ready.
log.debug("onShowPaymentRequest:", detail);
await this.domReadyPromise;
log.debug("onShowPaymentRequest: domReadyPromise resolved");
log.debug("onShowPaymentRequest, isPrivate?", detail.isPrivate);
let paymentDialog = document.querySelector("payment-dialog");
+ let hasSavedAddresses = Object.keys(detail.savedAddresses).length != 0;
+ let hasSavedCards = Object.keys(detail.savedBasicCards).length != 0;
+ let shippingRequested = detail.request.paymentOptions.requestShipping;
let state = {
request: detail.request,
savedAddresses: detail.savedAddresses,
savedBasicCards: detail.savedBasicCards,
isPrivate: detail.isPrivate,
page: {
id: "payment-summary",
},
};
// Onboarding wizard flow.
- if (Object.keys(detail.savedAddresses).length == 0) {
+ if (!hasSavedAddresses && (shippingRequested || !hasSavedCards)) {
state.page = {
id: "address-page",
onboardingWizard: true,
};
state["address-page"] = {
selectedStateKey: "selectedShippingAddress",
addressFields: null,
guid: null,
- title: paymentDialog.dataset.shippingAddressTitleAdd,
};
- } else if (Object.keys(detail.savedBasicCards).length == 0) {
+
+ if (shippingRequested) {
+ Object.assign(state["address-page"], {
+ title: paymentDialog.dataset.shippingAddressTitleAdd,
+ });
+ } else {
+ Object.assign(state["address-page"], {
+ title: paymentDialog.dataset.billingAddressTitleAdd,
+ });
+ }
+ } else if (!hasSavedCards) {
state.page = {
id: "basic-card-page",
onboardingWizard: true,
};
}
paymentDialog.setStateFromParent(state);
},
--- a/browser/components/payments/test/browser/browser_payments_onboarding_wizard.js
+++ b/browser/components/payments/test/browser/browser_payments_onboarding_wizard.js
@@ -2,16 +2,23 @@
async function addAddress() {
let onChanged = TestUtils.topicObserved("formautofill-storage-changed",
(subject, data) => data == "add");
formAutofillStorage.addresses.add(PTU.Addresses.TimBL);
await onChanged;
}
+async function addBasicCard() {
+ let onChanged = TestUtils.topicObserved("formautofill-storage-changed",
+ (subject, data) => data == "add");
+ formAutofillStorage.creditCards.add(PTU.BasicCards.JohnDoe);
+ await onChanged;
+}
+
add_task(async function test_onboarding_wizard_without_saved_addresses_and_saved_cards() {
await BrowserTestUtils.withNewTab({
gBrowser,
url: BLANK_PAGE_URL,
}, async browser => {
cleanupFormAutofillStorage();
info("Opening the payment dialog");
@@ -79,16 +86,24 @@ add_task(async function test_onboarding_
content.document.querySelector("address-form .save-button").click();
});
let isBasicCardPageSaveButtonVisible =
await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
"basic-card-form .save-button");
ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
+ info("Check if the total header is visible on the basic card page during on-boarding");
+ isHeaderVisible =
+ spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "header");
+ ok(isHeaderVisible, "Total Header is visible on the basic card page during on-boarding");
+ headerTextContent =
+ spawnPaymentDialogTask(frame, PTU.DialogContentTasks.getElementTextContent, "header");
+ ok(headerTextContent, "Total Header contains text");
+
let isBasicCardPageTitleVisible = spawnPaymentDialogTask(frame,
// eslint-disable-next-line max-len
PTU.DialogContentTasks.isElementVisible,
"basic-card-form h1");
ok(isBasicCardPageTitleVisible, "Basic card page title is visible");
titleTextContent =
spawnPaymentDialogTask(frame,
PTU.DialogContentTasks.getElementTextContent,
@@ -226,17 +241,17 @@ add_task(async function test_onboarding_
let {win, frame} =
await setupPaymentDialog(browser, {
methodData: [PTU.MethodData.basicCard],
details: PTU.Details.total60USD,
options: PTU.Options.requestShippingOption,
merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
});
- info("Checking if the basic card has been rendered");
+ info("Checking if the basic card page has been rendered");
let isBasicCardPageSaveButtonVisible =
await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
"basic-card-form .save-button");
ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
await spawnPaymentDialogTask(frame, async function() {
let {
PaymentTestUtils: PTU,
@@ -263,8 +278,179 @@ add_task(async function test_onboarding_
spawnPaymentDialogTask(frame, async function() {
content.document.querySelector("basic-card-form .cancel-button").click();
});
await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
cleanupFormAutofillStorage();
});
});
+
+add_task(async function test_onboarding_wizard_without_saved_address_with_saved_cards() {
+ await BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: BLANK_PAGE_URL,
+ }, async browser => {
+ cleanupFormAutofillStorage();
+ addBasicCard();
+
+ info("Opening the payment dialog");
+ let {win, frame} =
+ await setupPaymentDialog(browser, {
+ methodData: [PTU.MethodData.basicCard],
+ details: PTU.Details.total60USD,
+ options: PTU.Options.requestShippingOption,
+ merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+ });
+
+ info("Checking if the address page has been rendered");
+ let isAddressPageSaveButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+ "address-form .save-button");
+ ok(isAddressPageSaveButtonVisible, "Address page is rendered");
+
+ await spawnPaymentDialogTask(frame, async function() {
+ let {
+ PaymentTestUtils: PTU,
+ } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+ for (let [key, val] of Object.entries(PTU.Addresses.TimBL2)) {
+ let field = content.document.getElementById(key);
+ if (!field) {
+ ok(false, `${key} field not found`);
+ }
+ field.value = val;
+ ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+ }
+ content.document.querySelector("address-form .save-button").click();
+ });
+
+ let isPaymentSummaryCancelButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+ ok(isPaymentSummaryCancelButtonVisible,
+ "Payment summary page is shown next");
+
+ info("Closing the payment dialog");
+ spawnPaymentDialogTask(frame, async function() {
+ content.document.getElementById("cancel").click();
+ });
+ await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+ cleanupFormAutofillStorage();
+ });
+});
+
+add_task(async function test_onboarding_wizard_with_requestShipping_turned_off() {
+ await BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: BLANK_PAGE_URL,
+ }, async browser => {
+ cleanupFormAutofillStorage();
+
+ info("Opening the payment dialog");
+ let {win, frame} =
+ await setupPaymentDialog(browser, {
+ methodData: [PTU.MethodData.basicCard],
+ details: PTU.Details.total60USD,
+ merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+ });
+
+ info("Checking if the address page has been rendered");
+ let isAddressPageSaveButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+ "address-form .save-button");
+ ok(isAddressPageSaveButtonVisible, "Billing address page is rendered");
+
+ info("Check if the page title is visible on the address page");
+ let isAddressPageTitleVisible = spawnPaymentDialogTask(frame,
+ PTU.DialogContentTasks.isElementVisible,
+ "address-form h1");
+ ok(isAddressPageTitleVisible, "Address page title is visible");
+ let titleTextContent =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.getElementTextContent,
+ "address-form h1");
+ is(titleTextContent, "Add Billing Address", "Address page title contains text");
+
+ await spawnPaymentDialogTask(frame, async function() {
+ let {
+ PaymentTestUtils: PTU,
+ } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+ for (let [key, val] of Object.entries(PTU.Addresses.TimBL2)) {
+ let field = content.document.getElementById(key);
+ if (!field) {
+ ok(false, `${key} field not found`);
+ }
+ field.value = val;
+ ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+ }
+ content.document.querySelector("address-form .save-button").click();
+ });
+
+ let isBasicCardPageSaveButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible,
+ "basic-card-form .save-button");
+ ok(isBasicCardPageSaveButtonVisible, "Basic card page is rendered");
+
+ await spawnPaymentDialogTask(frame, async function() {
+ let {
+ PaymentTestUtils: PTU,
+ } = ChromeUtils.import("resource://testing-common/PaymentTestUtils.jsm", {});
+
+ await PTU.DialogContentUtils.waitForState(content, (state) => {
+ return state.page.id == "basic-card-page";
+ // eslint-disable-next-line max-len
+ }, "Basic card page is shown after the billing address page during onboarding if requestShipping is turned off");
+
+ for (let [key, val] of Object.entries(PTU.BasicCards.JohnDoe)) {
+ let field = content.document.getElementById(key);
+ field.value = val;
+ ok(!field.disabled, `Field #${key} shouldn't be disabled`);
+ }
+ content.document.querySelector("basic-card-form .save-button").click();
+ });
+
+ let isPaymentSummaryCancelButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+ ok(isPaymentSummaryCancelButtonVisible,
+ "Payment summary page is shown after the basic card page during on boarding");
+
+ info("Closing the payment dialog");
+ spawnPaymentDialogTask(frame, async function() {
+ content.document.getElementById("cancel").click();
+ });
+ await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+ cleanupFormAutofillStorage();
+ });
+});
+
+add_task(async function test_on_boarding_wizard_with_requestShipping_turned_off_with_saved_cards() {
+ await BrowserTestUtils.withNewTab({
+ gBrowser,
+ url: BLANK_PAGE_URL,
+ }, async browser => {
+ cleanupFormAutofillStorage();
+ addBasicCard();
+
+ info("Opening the payment dialog");
+ let {win, frame} =
+ await setupPaymentDialog(browser, {
+ methodData: [PTU.MethodData.basicCard],
+ details: PTU.Details.total60USD,
+ merchantTaskFn: PTU.ContentTasks.createAndShowRequest,
+ });
+
+ let isPaymentSummaryCancelButtonVisible =
+ await spawnPaymentDialogTask(frame, PTU.DialogContentTasks.isElementVisible, "#cancel");
+ ok(isPaymentSummaryCancelButtonVisible,
+ // eslint-disable-next-line max-len
+ "Payment summary page is shown if requestShipping is turned off and there's a saved card but no saved address");
+
+ info("Closing the payment dialog");
+ spawnPaymentDialogTask(frame, async function() {
+ content.document.getElementById("cancel").click();
+ });
+ await BrowserTestUtils.waitForCondition(() => win.closed, "dialog should be closed");
+
+ cleanupFormAutofillStorage();
+ });
+});