зеркало из https://github.com/mozilla/gecko-dev.git
167 строки
5.1 KiB
JavaScript
167 строки
5.1 KiB
JavaScript
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- /
|
|
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
|
|
/* 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/. */
|
|
|
|
// This JS shim contains the callbacks to fire DOMRequest events for
|
|
// navigator.pay API within the payment processor's scope.
|
|
|
|
"use strict";
|
|
|
|
var { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
|
|
"@mozilla.org/childprocessmessagemanager;1",
|
|
"nsIMessageSender");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "uuidgen",
|
|
"@mozilla.org/uuid-generator;1",
|
|
"nsIUUIDGenerator");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "Logger",
|
|
"resource://gre/modules/identity/LogUtils.jsm");
|
|
|
|
function log(...aMessageArgs) {
|
|
Logger.log.apply(Logger, ["injected identity.js"].concat(aMessageArgs));
|
|
}
|
|
|
|
log("\n\n======================= identity.js =======================\n\n");
|
|
|
|
// This script may be injected more than once into an iframe.
|
|
// It's hard to do this with |const| like we should, so use var instead.
|
|
if (typeof kIdentityJSLoaded === 'undefined') {
|
|
var kIdentityDelegateWatch = "identity-delegate-watch";
|
|
var kIdentityDelegateRequest = "identity-delegate-request";
|
|
var kIdentityDelegateLogout = "identity-delegate-logout";
|
|
var kIdentityDelegateReady = "identity-delegate-ready";
|
|
var kIdentityDelegateFinished = "identity-delegate-finished";
|
|
var kIdentityControllerDoMethod = "identity-controller-doMethod";
|
|
var kIdentktyJSLoaded = true;
|
|
}
|
|
|
|
var showUI = false;
|
|
var options = {};
|
|
var isLoaded = false;
|
|
var func = null;
|
|
|
|
/*
|
|
* Message back to the SignInToWebsite pipe. Message should be an
|
|
* object with the following keys:
|
|
*
|
|
* method: one of 'login', 'logout', 'ready'
|
|
* assertion: optional assertion
|
|
*/
|
|
function identityCall(message) {
|
|
if (options._internal) {
|
|
message._internal = options._internal;
|
|
}
|
|
sendAsyncMessage(kIdentityControllerDoMethod, message);
|
|
}
|
|
|
|
/*
|
|
* To close the dialog, we first tell the gecko SignInToWebsite manager that it
|
|
* can clean up. Then we tell the gaia component that we are finished. It is
|
|
* necessary to notify gecko first, so that the message can be sent before gaia
|
|
* destroys our context.
|
|
*/
|
|
function closeIdentityDialog() {
|
|
// tell gecko we're done.
|
|
func = null; options = null;
|
|
sendAsyncMessage(kIdentityDelegateFinished);
|
|
}
|
|
|
|
/*
|
|
* doInternalWatch - call the internal.watch api and relay the results
|
|
* up to the controller.
|
|
*/
|
|
function doInternalWatch() {
|
|
log("doInternalWatch:", options, isLoaded);
|
|
if (options && isLoaded) {
|
|
let BrowserID = content.wrappedJSObject.BrowserID;
|
|
BrowserID.internal.watch(function(aParams, aInternalParams) {
|
|
identityCall(aParams);
|
|
if (aParams.method === "ready") {
|
|
closeIdentityDialog();
|
|
}
|
|
},
|
|
JSON.stringify(options),
|
|
function(...things) {
|
|
// internal watch log callback
|
|
log("(watch) internal: ", things);
|
|
}
|
|
);
|
|
}
|
|
}
|
|
|
|
function doInternalRequest() {
|
|
log("doInternalRequest:", options && isLoaded);
|
|
if (options && isLoaded) {
|
|
var stringifiedOptions = JSON.stringify(options);
|
|
content.wrappedJSObject.BrowserID.internal.get(
|
|
options.origin,
|
|
function(assertion, internalParams) {
|
|
internalParams = internalParams || {};
|
|
if (assertion) {
|
|
identityCall({
|
|
method: 'login',
|
|
assertion: assertion,
|
|
_internalParams: internalParams});
|
|
} else {
|
|
identityCall({
|
|
method: 'cancel'
|
|
});
|
|
}
|
|
closeIdentityDialog();
|
|
},
|
|
stringifiedOptions);
|
|
}
|
|
}
|
|
function doInternalLogout(aOptions) {
|
|
log("doInternalLogout:", (options && isLoaded));
|
|
if (options && isLoaded) {
|
|
let BrowserID = content.wrappedJSObject.BrowserID;
|
|
BrowserID.internal.logout(options.origin, function() {
|
|
identityCall({method:'logout'});
|
|
closeIdentityDialog();
|
|
});
|
|
}
|
|
}
|
|
|
|
addEventListener("DOMContentLoaded", function(e) {
|
|
content.addEventListener("load", function(e) {
|
|
isLoaded = true;
|
|
// bring da func
|
|
if (func) func();
|
|
});
|
|
});
|
|
|
|
// listen for request
|
|
addMessageListener(kIdentityDelegateRequest, function(aMessage) {
|
|
log("injected identity.js received", kIdentityDelegateRequest);
|
|
options = aMessage.json;
|
|
showUI = true;
|
|
func = doInternalRequest;
|
|
func();
|
|
});
|
|
|
|
// listen for watch
|
|
addMessageListener(kIdentityDelegateWatch, function(aMessage) {
|
|
log("injected identity.js received", kIdentityDelegateWatch);
|
|
options = aMessage.json;
|
|
showUI = false;
|
|
func = doInternalWatch;
|
|
func();
|
|
});
|
|
|
|
// listen for logout
|
|
addMessageListener(kIdentityDelegateLogout, function(aMessage) {
|
|
log("injected identity.js received", kIdentityDelegateLogout);
|
|
options = aMessage.json;
|
|
showUI = false;
|
|
func = doInternalLogout;
|
|
func();
|
|
});
|