gecko-dev/webapprt/test/chrome/head.js

235 строки
6.2 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/. */
Cu.import("resource://gre/modules/Services.jsm");
// Some of the code we want to provide to chrome mochitests is in another file
// so we can share it with the mochitest shim window, thus we need to load it.
Services.scriptloader
.loadSubScript("chrome://webapprt/content/mochitest-shared.js", this);
const MANIFEST_URL_BASE = Services.io.newURI(
"http://test/webapprtChrome/webapprt/test/chrome/", null, null);
/**
* Load the webapp in the app browser.
*
* @param {String} manifestURL
* @see becomeWebapp
* @param {Object} parameters
* @see becomeWebapp
* @param {Function} onLoad
* The callback to call once the webapp is loaded.
*/
function loadWebapp(manifest, parameters, onLoad) {
let url = Services.io.newURI(manifest, null, MANIFEST_URL_BASE);
becomeWebapp(url.spec, parameters, function onBecome() {
function onLoadApp() {
gAppBrowser.removeEventListener("load", onLoadApp, true);
onLoad();
}
gAppBrowser.addEventListener("load", onLoadApp, true);
gAppBrowser.setAttribute("src", WebappRT.launchURI);
});
registerCleanupFunction(function() {
// We load DOMApplicationRegistry into a local scope to avoid appearing
// to leak it.
let { DOMApplicationRegistry } = Cu.import("resource://gre/modules/Webapps.jsm", {});
return new Promise(function(resolve, reject) {
DOMApplicationRegistry.uninstall(url.spec).then(() => {
// Load another page in the browser element, this is needed for tests
// that use the same app (that have the same URL).
gAppBrowser.setAttribute("src", "about:blank");
resolve();
}, reject);
});
});
}
// Utilities for the downloads tests
var MockDownloadList = function() {
};
MockDownloadList.prototype = {
downloads: new Set(),
views: new Set(),
addView: function(aView) {
this.views.add(aView);
for (let download of this.downloads) {
for (let view of this.views) {
view.onDownloadAdded(download);
}
}
},
removeView: function(aView) {
this.views.delete(aView);
},
addDownload: function(aDownload) {
this.downloads.add(aDownload);
for (let view of this.views) {
view.onDownloadAdded(aDownload);
}
},
changeDownload: function(aDownload) {
for (let view of this.views) {
if (view.onDownloadChanged) {
view.onDownloadChanged(aDownload);
}
}
},
removeDownload: function(aDownload) {
this.downloads.delete(aDownload);
for (let view of this.views) {
if (view.onDownloadRemoved) {
view.onDownloadRemoved(aDownload);
}
}
},
}
function MockDownloadsModule() {
let { DownloadView } = Cu.import("resource://webapprt/modules/DownloadView.jsm", {});
let list = new MockDownloadList();
let { Downloads } = Cu.import("resource://gre/modules/Downloads.jsm", {});
let oldDownloadsGetList = Downloads.getList;
Downloads.getList = function(aKind) {
return new Promise(function(resolve, reject) {
resolve(list);
});
};
registerCleanupFunction(function() {
list.removeView(DownloadView);
Downloads.getList = oldDownloadsGetList;
});
// Reinitialize DownloadView because it's already initialized
// when the webapprt test starts.
// We need to reinitialize it so that it gets associated to the
// MockDownloadList object that we've created.
DownloadView.init();
return list;
}
function DummyDownload(aFileName) {
this.file = Services.dirsvc.get("ProfD", Ci.nsIFile);
this.file.append(aFileName);
this.file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0o644);
this.startTime = Date.now();
this.source = {
url: "http://mochi.test:8888//webapprtChrome/webapprt/test/chrome/download.webapp",
isPrivate: false,
referrer: null,
};
this.target = {
path: this.file.path,
partFilePath: this.file.path + ".part",
}
};
DummyDownload.prototype = {
succeeded: false,
canceled: false,
stopped: false,
hasPartialData: false,
hasProgress: false,
progress: 0,
currentBytes: 0,
totalBytes: 0,
error: null,
// Attributes needed to test the download item in the richlistbox
state: 0,
percentComplete: -1,
};
function waitDownloadListPopulation(aWin) {
return new Promise(function(resolve, reject) {
let disconnected = false;
var observer = new MutationObserver(function(aMutations) {
for (let mutation of aMutations) {
if (mutation.addedNodes) {
for (let node of mutation.addedNodes) {
if (node.id == "downloadView") {
observer.disconnect();
disconnected = true;
// Wait for the resolution of the Downloads.getList promise.
executeSoon(() => {
resolve();
});
}
}
}
}
});
observer.observe(aWin.document, {
childList: true,
subtree: true,
attributes: false,
characterData: false
});
registerCleanupFunction(function() {
if (!disconnected) {
observer.disconnect();
}
});
});
}
function test_downloadList(aWin, aDownloadList) {
let richlistbox = aWin.document.getElementById("downloadView");
is(richlistbox.children.length, aDownloadList.length,
"There is the correct number of richlistitems");
for (let i = 0; i < richlistbox.children.length; i++) {
let elm = richlistbox.children[i];
let name = elm.getAttribute("target");
let download = null;
for (let d = 0; d < aDownloadList.length; d++) {
if (aDownloadList[d].file.leafName == name) {
download = aDownloadList[d];
aDownloadList.splice(d, 1);
}
}
if (!download) {
ok(false, "Download item unexpected");
} else {
ok(true, "Download item expected");
is(elm.getAttribute("state"), download.state, "Download state correct");
is(elm.getAttribute("progress"), download.percentComplete,
"Download progress correct");
}
}
is(aDownloadList.length, 0,
"All the downloads expected to be in the list were in the list");
}