Files
tubestation/toolkit/components/payments/res/paymentRequest.js
Matthew Noorenberghe 12ab72b8a0 Bug 1444949 - Pref-controlled console logging for unprivileged code. r=sfoster
* Default log implementation for unprivileged content
* Export methods of a ConsoleAPI instance into the content frame to replace the default log
* Initialize the content logger when the "initializeRequest" message is received

MozReview-Commit-ID: 8hiaIqf2ChX
2018-03-19 21:57:13 -07:00

141 lines
3.8 KiB
JavaScript

/* 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/. */
/**
* Loaded in the unprivileged frame of each payment dialog.
*
* Communicates with privileged code via DOM Events.
*/
/* import-globals-from log.js */
"use strict";
var paymentRequest = {
domReadyPromise: null,
init() {
// listen to content
window.addEventListener("paymentChromeToContent", this);
window.addEventListener("keydown", this);
this.domReadyPromise = new Promise(function dcl(resolve) {
window.addEventListener("DOMContentLoaded", resolve, {once: true});
}).then(this.handleEvent.bind(this));
// This scope is now ready to listen to the initialization data
this.sendMessageToChrome("initializeRequest");
},
handleEvent(event) {
switch (event.type) {
case "DOMContentLoaded": {
this.onPaymentRequestLoad();
break;
}
case "keydown": {
if (event.code != "KeyD" || !event.altKey || !event.ctrlKey) {
break;
}
let debuggingConsole = document.getElementById("debugging-console");
debuggingConsole.hidden = !debuggingConsole.hidden;
break;
}
case "unload": {
this.onPaymentRequestUnload();
break;
}
case "paymentChromeToContent": {
this.onChromeToContent(event);
break;
}
default: {
throw new Error("Unexpected event type");
}
}
},
sendMessageToChrome(messageType, detail = {}) {
log.debug("sendMessageToChrome: ", messageType, detail);
let event = new CustomEvent("paymentContentToChrome", {
bubbles: true,
detail: Object.assign({
messageType,
}, detail),
});
document.dispatchEvent(event);
},
onChromeToContent({detail}) {
let {messageType} = detail;
log.debug("onChromeToContent: ", messageType);
switch (messageType) {
case "responseSent": {
document.querySelector("payment-dialog").requestStore.setState({
changesPrevented: true,
completionState: "processing",
});
break;
}
case "showPaymentRequest": {
this.onShowPaymentRequest(detail);
break;
}
case "updateState": {
document.querySelector("payment-dialog").setStateFromParent(detail);
break;
}
}
},
onPaymentRequestLoad(requestId) {
log.debug("onPaymentRequestLoad:", requestId);
window.addEventListener("unload", this, {once: true});
this.sendMessageToChrome("paymentDialogReady");
// Automatically show the debugging console if loaded with a truthy `debug` query parameter.
if (new URLSearchParams(location.search).get("debug")) {
document.getElementById("debugging-console").hidden = false;
}
},
async onShowPaymentRequest(detail) {
// Handle getting called before the DOM is ready.
log.debug("onShowPaymentRequest:", detail);
await this.domReadyPromise;
log.debug("onShowPaymentRequest: domReadyPromise resolved");
document.querySelector("payment-dialog").setStateFromParent({
request: detail.request,
savedAddresses: detail.savedAddresses,
savedBasicCards: detail.savedBasicCards,
});
},
cancel() {
this.sendMessageToChrome("paymentCancel");
},
pay(data) {
this.sendMessageToChrome("pay", data);
},
changeShippingAddress(data) {
this.sendMessageToChrome("changeShippingAddress", data);
},
changeShippingOption(data) {
this.sendMessageToChrome("changeShippingOption", data);
},
onPaymentRequestUnload() {
// remove listeners that may be used multiple times here
window.removeEventListener("paymentChromeToContent", this);
},
};
paymentRequest.init();