diff -r 000000000000 -r 6474c204b198 dom/payment/Payment.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/payment/Payment.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,135 @@ +/* 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"; + +const {classes: Cc, interfaces: Ci, utils: Cu} = Components; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/DOMRequestHelper.jsm"); + +const PAYMENTCONTENTHELPER_CID = + Components.ID("{a920adc0-c36e-4fd0-8de0-aac1ac6ebbd0}"); + +const PAYMENT_IPC_MSG_NAMES = ["Payment:Success", + "Payment:Failed"]; + +const PREF_DEBUG = "dom.payment.debug"; + +XPCOMUtils.defineLazyServiceGetter(this, "cpmm", + "@mozilla.org/childprocessmessagemanager;1", + "nsIMessageSender"); + +function PaymentContentHelper() { +}; + +PaymentContentHelper.prototype = { + __proto__: DOMRequestIpcHelper.prototype, + + QueryInterface: XPCOMUtils.generateQI([Ci.nsINavigatorPayment, + Ci.nsIDOMGlobalPropertyInitializer, + Ci.nsISupportsWeakReference, + Ci.nsIObserver]), + classID: PAYMENTCONTENTHELPER_CID, + classInfo: XPCOMUtils.generateCI({ + classID: PAYMENTCONTENTHELPER_CID, + contractID: "@mozilla.org/payment/content-helper;1", + classDescription: "Payment Content Helper", + flags: Ci.nsIClassInfo.DOM_OBJECT, + interfaces: [Ci.nsINavigatorPayment] + }), + + // nsINavigatorPayment + + pay: function pay(aJwts) { + let request = this.createRequest(); + let requestId = this.getRequestId(request); + + let docShell = this._window.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell); + if (!docShell.isActive) { + if (this._debug) { + this.LOG("The caller application is a background app. No request " + + "will be sent"); + } + let runnable = { + run: function run() { + Services.DOMRequest.fireError(request, "BACKGROUND_APP"); + } + } + Services.tm.currentThread.dispatch(runnable, + Ci.nsIThread.DISPATCH_NORMAL); + return request; + } + + if (!Array.isArray(aJwts)) { + aJwts = [aJwts]; + } + + cpmm.sendAsyncMessage("Payment:Pay", { + jwts: aJwts, + requestId: requestId + }); + return request; + }, + + // nsIDOMGlobalPropertyInitializer + + init: function(aWindow) { + try { + if (!Services.prefs.getBoolPref("dom.mozPay.enabled")) { + return null; + } + } catch (e) { + return null; + } + + this._window = aWindow; + this.initDOMRequestHelper(aWindow, PAYMENT_IPC_MSG_NAMES); + + try { + this._debug = + Services.prefs.getPrefType(PREF_DEBUG) == Ci.nsIPrefBranch.PREF_BOOL + && Services.prefs.getBoolPref(PREF_DEBUG); + } catch(e) { + this._debug = false; + } + + return this.pay.bind(this); + }, + + // nsIFrameMessageListener + + receiveMessage: function receiveMessage(aMessage) { + let name = aMessage.name; + let msg = aMessage.json; + if (this._debug) { + this.LOG("Received message '" + name + "': " + JSON.stringify(msg)); + } + let requestId = msg.requestId; + let request = this.takeRequest(requestId); + if (!request) { + return; + } + switch (name) { + case "Payment:Success": + Services.DOMRequest.fireSuccess(request, msg.result); + break; + case "Payment:Failed": + Services.DOMRequest.fireError(request, msg.errorMsg); + break; + } + }, + + LOG: function LOG(s) { + if (!this._debug) { + return; + } + dump("-*- PaymentContentHelper: " + s + "\n"); + } +}; + +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PaymentContentHelper]);