158 lines
5.2 KiB
JavaScript
158 lines
5.2 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
const MozLoopServiceInternal = Cu.import("resource:///modules/loop/MozLoopService.jsm", {}).
|
|
MozLoopServiceInternal;
|
|
|
|
var gMozLoopAPI;
|
|
|
|
function promiseGetMozLoopAPI() {
|
|
let deferred = Promise.defer();
|
|
let loopPanel = document.getElementById("loop-notification-panel");
|
|
let btn = document.getElementById("loop-call-button");
|
|
|
|
// Wait for the popup to be shown, then we can get the iframe and
|
|
// wait for the iframe's load to be completed.
|
|
loopPanel.addEventListener("popupshown", function onpopupshown() {
|
|
loopPanel.removeEventListener("popupshown", onpopupshown, true);
|
|
let iframe = document.getElementById(btn.getAttribute("notificationFrameId"));
|
|
|
|
if (iframe.contentDocument &&
|
|
iframe.contentDocument.readyState == "complete") {
|
|
gMozLoopAPI = iframe.contentWindow.navigator.wrappedJSObject.mozLoop;
|
|
|
|
deferred.resolve();
|
|
} else {
|
|
iframe.addEventListener("load", function panelOnLoad(e) {
|
|
iframe.removeEventListener("load", panelOnLoad, true);
|
|
|
|
gMozLoopAPI = iframe.contentWindow.navigator.wrappedJSObject.mozLoop;
|
|
|
|
// We do this in an execute soon to allow any other event listeners to
|
|
// be handled, just in case.
|
|
deferred.resolve();
|
|
}, true);
|
|
}
|
|
}, true);
|
|
|
|
// Now we're setup, click the button.
|
|
btn.click();
|
|
|
|
// Remove the iframe after each test. This also avoids mochitest complaining
|
|
// about leaks on shutdown as we intentionally hold the iframe open for the
|
|
// life of the application.
|
|
registerCleanupFunction(function() {
|
|
loopPanel.hidePopup();
|
|
loopPanel.removeChild(document.getElementById(btn.getAttribute("notificationFrameId")));
|
|
});
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
/**
|
|
* Loads the loop panel by clicking the button and waits for its open to complete.
|
|
* It also registers
|
|
*
|
|
* This assumes that the tests are running in a generatorTest.
|
|
*/
|
|
function loadLoopPanel() {
|
|
// Set prefs to ensure we don't access the network externally.
|
|
Services.prefs.setCharPref("services.push.serverURL", "ws://localhost/");
|
|
Services.prefs.setCharPref("loop.server", "http://localhost/");
|
|
|
|
// Turn off the network for loop tests, so that we don't
|
|
// try to access the remote servers. If we want to turn this
|
|
// back on in future, be careful to check for intermittent
|
|
// failures.
|
|
let wasOffline = Services.io.offline;
|
|
Services.io.offline = true;
|
|
|
|
registerCleanupFunction(function() {
|
|
Services.prefs.clearUserPref("services.push.serverURL");
|
|
Services.prefs.clearUserPref("loop.server");
|
|
Services.io.offline = wasOffline;
|
|
});
|
|
|
|
// Turn off animations to make tests quicker.
|
|
let loopPanel = document.getElementById("loop-notification-panel");
|
|
loopPanel.setAttribute("animate", "false");
|
|
|
|
// Now get the actual API.
|
|
yield promiseGetMozLoopAPI();
|
|
}
|
|
|
|
function promiseOAuthParamsSetup(baseURL, params) {
|
|
let deferred = Promise.defer();
|
|
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
|
|
createInstance(Ci.nsIXMLHttpRequest);
|
|
xhr.open("POST", baseURL + "/setup_params", true);
|
|
xhr.setRequestHeader("X-Params", JSON.stringify(params));
|
|
xhr.addEventListener("load", () => deferred.resolve(xhr));
|
|
xhr.addEventListener("error", error => deferred.reject(error));
|
|
xhr.send();
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
function resetFxA() {
|
|
let global = Cu.import("resource:///modules/loop/MozLoopService.jsm", {});
|
|
global.gFxAOAuthClientPromise = null;
|
|
global.gFxAOAuthClient = null;
|
|
global.gFxAOAuthTokenData = null;
|
|
}
|
|
|
|
function promiseDeletedOAuthParams(baseURL) {
|
|
let deferred = Promise.defer();
|
|
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
|
|
createInstance(Ci.nsIXMLHttpRequest);
|
|
xhr.open("DELETE", baseURL + "/setup_params", true);
|
|
xhr.addEventListener("load", () => deferred.resolve(xhr));
|
|
xhr.addEventListener("error", deferred.reject);
|
|
xhr.send();
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
/**
|
|
* Get the last registration on the test server.
|
|
*/
|
|
function promiseOAuthGetRegistration(baseURL) {
|
|
let deferred = Promise.defer();
|
|
let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].
|
|
createInstance(Ci.nsIXMLHttpRequest);
|
|
xhr.open("GET", baseURL + "/get_registration", true);
|
|
xhr.responseType = "json";
|
|
xhr.addEventListener("load", () => deferred.resolve(xhr));
|
|
xhr.addEventListener("error", deferred.reject);
|
|
xhr.send();
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
/**
|
|
* This is used to fake push registration and notifications for
|
|
* MozLoopService tests. There is only one object created per test instance, as
|
|
* once registration has taken place, the object cannot currently be changed.
|
|
*/
|
|
let mockPushHandler = {
|
|
// This sets the registration result to be returned when initialize
|
|
// is called. By default, it is equivalent to success.
|
|
registrationResult: null,
|
|
pushUrl: undefined,
|
|
|
|
/**
|
|
* MozLoopPushHandler API
|
|
*/
|
|
initialize: function(registerCallback, notificationCallback) {
|
|
registerCallback(this.registrationResult, this.pushUrl);
|
|
this._notificationCallback = notificationCallback;
|
|
},
|
|
|
|
/**
|
|
* Test-only API to simplify notifying a push notification result.
|
|
*/
|
|
notify: function(version) {
|
|
this._notificationCallback(version);
|
|
}
|
|
};
|