/* 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/. */ "use strict"; /* eslint-env mozilla/frame-script */ const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); let PaymentFrameScript = { init() { this.defineLazyLogGetter(this, "frameScript"); addEventListener("DOMContentLoaded", this, {once: true}); addEventListener("paymentContentToChrome", this, false, true); addMessageListener("paymentChromeToContent", this); }, handleEvent(event) { switch (event.type) { case "DOMContentLoaded": { this.sendMessageToChrome("DOMContentLoaded"); break; } case "paymentContentToChrome": { this.sendToChrome(event); break; } default: { throw new Error("Unexpected event type"); } } }, receiveMessage({data: {messageType, data}}) { switch (messageType) { case "showPaymentRequest": { this.sendToContent("showPaymentRequest", data); break; } } }, sendToChrome({detail}) { let {messageType, requestId} = detail; this.log.debug(`received message from content: ${messageType} ... ${requestId}`); switch (messageType) { case "paymentCancel": { this.sendMessageToChrome("paymentCancel", { requestId, }); break; } } }, defineLazyLogGetter(scope, logPrefix) { XPCOMUtils.defineLazyGetter(scope, "log", () => { let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {}); return new ConsoleAPI({ maxLogLevelPref: "dom.payments.loglevel", prefix: logPrefix, }); }); }, sendToContent(messageType, detail = {}) { this.log.debug(`sendToContent (${messageType})`); let response = Object.assign({messageType}, detail); let event = new content.document.defaultView.CustomEvent("paymentChromeToContent", { bubbles: true, detail: Cu.cloneInto(response, content.document.defaultView), }); content.document.dispatchEvent(event); }, sendMessageToChrome(messageType, detail = {}) { sendAsyncMessage("paymentContentToChrome", Object.assign(detail, {messageType})); }, }; PaymentFrameScript.init();