fune/browser/components/payments/test/browser/head.js
Matthew Noorenberghe c0d0384218 Bug 1457287 - Move Payment Request UI code to browser/. r=jaws
MozReview-Commit-ID: LjrRXr1thc8

--HG--
rename : toolkit/components/payments/.eslintrc.js => browser/components/payments/.eslintrc.js
rename : toolkit/components/payments/content/paymentDialogFrameScript.js => browser/components/payments/content/paymentDialogFrameScript.js
rename : toolkit/components/payments/content/paymentDialogWrapper.css => browser/components/payments/content/paymentDialogWrapper.css
rename : toolkit/components/payments/content/paymentDialogWrapper.js => browser/components/payments/content/paymentDialogWrapper.js
rename : toolkit/components/payments/content/paymentDialogWrapper.xhtml => browser/components/payments/content/paymentDialogWrapper.xhtml
rename : toolkit/components/payments/docs/index.rst => browser/components/payments/docs/index.rst
rename : toolkit/components/payments/jar.mn => browser/components/payments/jar.mn
rename : toolkit/components/payments/moz.build => browser/components/payments/moz.build
rename : toolkit/components/payments/paymentUIService.js => browser/components/payments/paymentUIService.js
rename : toolkit/components/payments/payments.manifest => browser/components/payments/payments.manifest
rename : toolkit/components/payments/res/PaymentsStore.js => browser/components/payments/res/PaymentsStore.js
rename : toolkit/components/payments/res/components/address-option.css => browser/components/payments/res/components/address-option.css
rename : toolkit/components/payments/res/components/address-option.js => browser/components/payments/res/components/address-option.js
rename : toolkit/components/payments/res/components/basic-card-option.css => browser/components/payments/res/components/basic-card-option.css
rename : toolkit/components/payments/res/components/basic-card-option.js => browser/components/payments/res/components/basic-card-option.js
rename : toolkit/components/payments/res/components/currency-amount.js => browser/components/payments/res/components/currency-amount.js
rename : toolkit/components/payments/res/components/labelled-checkbox.js => browser/components/payments/res/components/labelled-checkbox.js
rename : toolkit/components/payments/res/components/payment-details-item.css => browser/components/payments/res/components/payment-details-item.css
rename : toolkit/components/payments/res/components/payment-details-item.js => browser/components/payments/res/components/payment-details-item.js
rename : toolkit/components/payments/res/components/rich-option.js => browser/components/payments/res/components/rich-option.js
rename : toolkit/components/payments/res/components/rich-select.css => browser/components/payments/res/components/rich-select.css
rename : toolkit/components/payments/res/components/rich-select.js => browser/components/payments/res/components/rich-select.js
rename : toolkit/components/payments/res/components/shipping-option.css => browser/components/payments/res/components/shipping-option.css
rename : toolkit/components/payments/res/components/shipping-option.js => browser/components/payments/res/components/shipping-option.js
rename : toolkit/components/payments/res/containers/address-picker.js => browser/components/payments/res/containers/address-picker.js
rename : toolkit/components/payments/res/containers/basic-card-form.js => browser/components/payments/res/containers/basic-card-form.js
rename : toolkit/components/payments/res/containers/order-details.css => browser/components/payments/res/containers/order-details.css
rename : toolkit/components/payments/res/containers/order-details.js => browser/components/payments/res/containers/order-details.js
rename : toolkit/components/payments/res/containers/payment-dialog.js => browser/components/payments/res/containers/payment-dialog.js
rename : toolkit/components/payments/res/containers/payment-method-picker.js => browser/components/payments/res/containers/payment-method-picker.js
rename : toolkit/components/payments/res/containers/shipping-option-picker.js => browser/components/payments/res/containers/shipping-option-picker.js
rename : toolkit/components/payments/res/debugging.css => browser/components/payments/res/debugging.css
rename : toolkit/components/payments/res/debugging.html => browser/components/payments/res/debugging.html
rename : toolkit/components/payments/res/debugging.js => browser/components/payments/res/debugging.js
rename : toolkit/components/payments/res/mixins/ObservedPropertiesMixin.js => browser/components/payments/res/mixins/ObservedPropertiesMixin.js
rename : toolkit/components/payments/res/mixins/PaymentStateSubscriberMixin.js => browser/components/payments/res/mixins/PaymentStateSubscriberMixin.js
rename : toolkit/components/payments/res/paymentRequest.css => browser/components/payments/res/paymentRequest.css
rename : toolkit/components/payments/res/paymentRequest.js => browser/components/payments/res/paymentRequest.js
rename : toolkit/components/payments/res/paymentRequest.xhtml => browser/components/payments/res/paymentRequest.xhtml
rename : toolkit/components/payments/res/unprivileged-fallbacks.js => browser/components/payments/res/unprivileged-fallbacks.js
rename : toolkit/components/payments/res/vendor/custom-elements.min.js => browser/components/payments/res/vendor/custom-elements.min.js
rename : toolkit/components/payments/res/vendor/custom-elements.min.js.map => browser/components/payments/res/vendor/custom-elements.min.js.map
rename : toolkit/components/payments/server.py => browser/components/payments/server.py
rename : toolkit/components/payments/test/PaymentTestUtils.jsm => browser/components/payments/test/PaymentTestUtils.jsm
rename : toolkit/components/payments/test/browser/.eslintrc.js => browser/components/payments/test/browser/.eslintrc.js
rename : toolkit/components/payments/test/browser/blank_page.html => browser/components/payments/test/browser/blank_page.html
rename : toolkit/components/payments/test/browser/browser.ini => browser/components/payments/test/browser/browser.ini
rename : toolkit/components/payments/test/browser/browser_card_edit.js => browser/components/payments/test/browser/browser_card_edit.js
rename : toolkit/components/payments/test/browser/browser_change_shipping.js => browser/components/payments/test/browser/browser_change_shipping.js
rename : toolkit/components/payments/test/browser/browser_host_name.js => browser/components/payments/test/browser/browser_host_name.js
rename : toolkit/components/payments/test/browser/browser_profile_storage.js => browser/components/payments/test/browser/browser_profile_storage.js
rename : toolkit/components/payments/test/browser/browser_request_serialization.js => browser/components/payments/test/browser/browser_request_serialization.js
rename : toolkit/components/payments/test/browser/browser_request_shipping.js => browser/components/payments/test/browser/browser_request_shipping.js
rename : toolkit/components/payments/test/browser/browser_request_summary.js => browser/components/payments/test/browser/browser_request_summary.js
rename : toolkit/components/payments/test/browser/browser_shippingaddresschange_error.js => browser/components/payments/test/browser/browser_shippingaddresschange_error.js
rename : toolkit/components/payments/test/browser/browser_show_dialog.js => browser/components/payments/test/browser/browser_show_dialog.js
rename : toolkit/components/payments/test/browser/browser_total.js => browser/components/payments/test/browser/browser_total.js
rename : toolkit/components/payments/test/browser/head.js => browser/components/payments/test/browser/head.js
rename : toolkit/components/payments/test/mochitest/.eslintrc.js => browser/components/payments/test/mochitest/.eslintrc.js
rename : toolkit/components/payments/test/mochitest/formautofill/mochitest.ini => browser/components/payments/test/mochitest/formautofill/mochitest.ini
rename : toolkit/components/payments/test/mochitest/formautofill/test_editCreditCard.html => browser/components/payments/test/mochitest/formautofill/test_editCreditCard.html
rename : toolkit/components/payments/test/mochitest/mochitest.ini => browser/components/payments/test/mochitest/mochitest.ini
rename : toolkit/components/payments/test/mochitest/payments_common.js => browser/components/payments/test/mochitest/payments_common.js
rename : toolkit/components/payments/test/mochitest/test_ObservedPropertiesMixin.html => browser/components/payments/test/mochitest/test_ObservedPropertiesMixin.html
rename : toolkit/components/payments/test/mochitest/test_PaymentStateSubscriberMixin.html => browser/components/payments/test/mochitest/test_PaymentStateSubscriberMixin.html
rename : toolkit/components/payments/test/mochitest/test_PaymentsStore.html => browser/components/payments/test/mochitest/test_PaymentsStore.html
rename : toolkit/components/payments/test/mochitest/test_address_picker.html => browser/components/payments/test/mochitest/test_address_picker.html
rename : toolkit/components/payments/test/mochitest/test_basic_card_form.html => browser/components/payments/test/mochitest/test_basic_card_form.html
rename : toolkit/components/payments/test/mochitest/test_currency_amount.html => browser/components/payments/test/mochitest/test_currency_amount.html
rename : toolkit/components/payments/test/mochitest/test_labelled_checkbox.html => browser/components/payments/test/mochitest/test_labelled_checkbox.html
rename : toolkit/components/payments/test/mochitest/test_order_details.html => browser/components/payments/test/mochitest/test_order_details.html
rename : toolkit/components/payments/test/mochitest/test_payer_address_picker.html => browser/components/payments/test/mochitest/test_payer_address_picker.html
rename : toolkit/components/payments/test/mochitest/test_payment_details_item.html => browser/components/payments/test/mochitest/test_payment_details_item.html
rename : toolkit/components/payments/test/mochitest/test_payment_dialog.html => browser/components/payments/test/mochitest/test_payment_dialog.html
rename : toolkit/components/payments/test/mochitest/test_payment_method_picker.html => browser/components/payments/test/mochitest/test_payment_method_picker.html
rename : toolkit/components/payments/test/mochitest/test_rich_select.html => browser/components/payments/test/mochitest/test_rich_select.html
rename : toolkit/components/payments/test/mochitest/test_shipping_option_picker.html => browser/components/payments/test/mochitest/test_shipping_option_picker.html
rename : toolkit/components/payments/test/unit/.eslintrc.js => browser/components/payments/test/unit/.eslintrc.js
rename : toolkit/components/payments/test/unit/head.js => browser/components/payments/test/unit/head.js
rename : toolkit/components/payments/test/unit/test_response_creation.js => browser/components/payments/test/unit/test_response_creation.js
rename : toolkit/components/payments/test/unit/xpcshell.ini => browser/components/payments/test/unit/xpcshell.ini
2018-04-27 07:20:32 -07:00

284 lines
9.7 KiB
JavaScript

"use strict";
/* eslint
"no-unused-vars": ["error", {
vars: "local",
args: "none",
}],
*/
const BLANK_PAGE_PATH = "/browser/browser/components/payments/test/browser/blank_page.html";
const BLANK_PAGE_URL = "https://example.com" + BLANK_PAGE_PATH;
const paymentSrv = Cc["@mozilla.org/dom/payments/payment-request-service;1"]
.getService(Ci.nsIPaymentRequestService);
const paymentUISrv = Cc["@mozilla.org/dom/payments/payment-ui-service;1"]
.getService().wrappedJSObject;
const {formAutofillStorage} = ChromeUtils.import(
"resource://formautofill/FormAutofillStorage.jsm", {});
const {PaymentTestUtils: PTU} = ChromeUtils.import(
"resource://testing-common/PaymentTestUtils.jsm", {});
function getPaymentRequests() {
let requestsEnum = paymentSrv.enumerate();
let requests = [];
while (requestsEnum.hasMoreElements()) {
requests.push(requestsEnum.getNext().QueryInterface(Ci.nsIPaymentRequest));
}
return requests;
}
/**
* Return the container (e.g. dialog or overlay) that the payment request contents are shown in.
* This abstracts away the details of the widget used so that this can more earily transition from a
* dialog to another kind of overlay.
* Consumers shouldn't rely on a dialog window being returned.
* @returns {Promise}
*/
async function getPaymentWidget() {
let win;
await BrowserTestUtils.waitForCondition(() => {
win = Services.wm.getMostRecentWindow(null);
return win.name.startsWith(paymentUISrv.REQUEST_ID_PREFIX);
}, "payment dialog should be the most recent");
return win;
}
async function getPaymentFrame(widget) {
return widget.document.getElementById("paymentRequestFrame");
}
function waitForMessageFromWidget(messageType, widget = null) {
info("waitForMessageFromWidget: " + messageType);
return new Promise(resolve => {
Services.mm.addMessageListener("paymentContentToChrome", function onMessage({data, target}) {
if (data.messageType != messageType) {
return;
}
if (widget && widget != target) {
return;
}
resolve();
info(`Got ${messageType} from widget`);
Services.mm.removeMessageListener("paymentContentToChrome", onMessage);
});
});
}
async function waitForWidgetReady(widget = null) {
return waitForMessageFromWidget("paymentDialogReady", widget);
}
function spawnPaymentDialogTask(paymentDialogFrame, taskFn, args = null) {
return ContentTask.spawn(paymentDialogFrame.frameLoader, args, taskFn);
}
async function withMerchantTab({browser = gBrowser, url = BLANK_PAGE_URL} = {
browser: gBrowser,
url: BLANK_PAGE_URL,
}, taskFn) {
await BrowserTestUtils.withNewTab({
gBrowser: browser,
url,
}, taskFn);
paymentSrv.cleanup(); // Temporary measure until bug 1408234 is fixed.
await new Promise(resolve => {
SpecialPowers.exactGC(resolve);
});
}
/**
* Load the privileged payment dialog wrapper document in a new tab and run the
* task function.
*
* @param {string} requestId of the PaymentRequest
* @param {Function} taskFn to run in the dialog with the frame as an argument.
* @returns {Promise} which resolves when the dialog document is loaded
*/
function withNewDialogFrame(requestId, taskFn) {
async function dialogTabTask(dialogBrowser) {
let paymentRequestFrame = dialogBrowser.contentDocument.getElementById("paymentRequestFrame");
// Ensure the inner frame is loaded
await spawnPaymentDialogTask(paymentRequestFrame, async function ensureLoaded() {
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}`,
};
return BrowserTestUtils.withNewTab(args, dialogTabTask);
}
/**
* Spawn a content task inside the inner unprivileged frame of a privileged Payment Request dialog.
*
* @param {string} requestId
* @param {Function} contentTaskFn
* @param {object?} [args = null] for the content task
* @returns {Promise}
*/
function spawnTaskInNewDialog(requestId, contentTaskFn, args = null) {
return withNewDialogFrame(requestId, async function spawnTaskInNewDialog_tabTask(reqFrame) {
await spawnPaymentDialogTask(reqFrame, contentTaskFn, args);
});
}
async function addSampleAddressesAndBasicCard() {
let onChanged = TestUtils.topicObserved("formautofill-storage-changed",
(subject, data) => data == "add");
formAutofillStorage.addresses.add(PTU.Addresses.TimBL);
await onChanged;
onChanged = TestUtils.topicObserved("formautofill-storage-changed",
(subject, data) => data == "add");
formAutofillStorage.addresses.add(PTU.Addresses.TimBL2);
await onChanged;
onChanged = TestUtils.topicObserved("formautofill-storage-changed",
(subject, data) => data == "add");
formAutofillStorage.creditCards.add(PTU.BasicCards.JohnDoe);
await onChanged;
}
/**
* Checks that an address from autofill storage matches a Payment Request PaymentAddress.
* @param {PaymentAddress} paymentAddress
* @param {object} storageAddress
* @param {string} msg to describe the check
*/
function checkPaymentAddressMatchesStorageAddress(paymentAddress, storageAddress, msg) {
info(msg);
let addressLines = storageAddress["street-address"].split("\n");
is(paymentAddress.addressLine[0], addressLines[0], "Address line 1 should match");
is(paymentAddress.addressLine[1], addressLines[1], "Address line 2 should match");
is(paymentAddress.country, storageAddress.country, "Country should match");
is(paymentAddress.region, storageAddress["address-level1"], "Region should match");
is(paymentAddress.city, storageAddress["address-level2"], "City should match");
is(paymentAddress.postalCode, storageAddress["postal-code"], "Zip code should match");
is(paymentAddress.organization, storageAddress.organization, "Org should match");
is(paymentAddress.recipient,
`${storageAddress["given-name"]} ${storageAddress["additional-name"]} ` +
`${storageAddress["family-name"]}`,
"Recipient name should match");
is(paymentAddress.phone, storageAddress.tel, "Phone should match");
}
/**
* Create a PaymentRequest object with the given parameters, then
* run the given merchantTaskFn.
*
* @param {Object} browser
* @param {Object} options
* @param {Object} options.methodData
* @param {Object} options.details
* @param {Object} options.options
* @param {Function} options.merchantTaskFn
* @returns {Object} References to the window, requestId, and frame
*/
async function setupPaymentDialog(browser, {methodData, details, options, merchantTaskFn}) {
let dialogReadyPromise = waitForWidgetReady();
await ContentTask.spawn(browser,
{
methodData,
details,
options,
},
merchantTaskFn);
// get a reference to the UI dialog and the requestId
let [win] = await Promise.all([getPaymentWidget(), dialogReadyPromise]);
ok(win, "Got payment widget");
let requestId = paymentUISrv.requestIdForWindow(win);
ok(requestId, "requestId should be defined");
is(win.closed, false, "dialog should not be closed");
let frame = await getPaymentFrame(win);
ok(frame, "Got payment frame");
await dialogReadyPromise;
info("dialog ready");
return {win, requestId, frame};
}
/**
* Open a merchant tab with the given merchantTaskFn to create a PaymentRequest
* and then open the associated PaymentRequest dialog in a new tab and run the
* associated dialogTaskFn. The same taskArgs are passed to both functions.
*
* @param {Function} merchantTaskFn
* @param {Function} dialogTaskFn
* @param {Object} taskArgs
* @param {Object} options
* @param {string} options.origin
*/
async function spawnInDialogForMerchantTask(merchantTaskFn, dialogTaskFn, taskArgs, {
origin = "https://example.com",
} = {
origin: "https://example.com",
}) {
await withMerchantTab({
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);
});
}
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 BrowserTestUtils.closeWindow(privateWin);
}
async function setupFormAutofillStorage() {
await formAutofillStorage.initialize();
}
function cleanupFormAutofillStorage() {
formAutofillStorage.addresses._nukeAllRecords();
formAutofillStorage.creditCards._nukeAllRecords();
}
add_task(async function setup_head() {
await setupFormAutofillStorage();
registerCleanupFunction(function cleanup() {
paymentSrv.cleanup();
cleanupFormAutofillStorage();
});
});
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}