* 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
141 lines
3.8 KiB
JavaScript
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();
|