forked from mirrors/gecko-dev
We want to encourage extension developers to use `browser_specific_settings` instead of `applications`, which will be unsupported in Manifest Version 3+. This patch prepares the introduction of a new warning (that is usually converted into an error in the test environment). Differential Revision: https://phabricator.services.mozilla.com/D160059
208 lines
5.7 KiB
JavaScript
208 lines
5.7 KiB
JavaScript
"use strict";
|
|
|
|
const Cm = Components.manager;
|
|
|
|
const uuidGenerator = Services.uuid;
|
|
|
|
AddonTestUtils.init(this);
|
|
|
|
var mockNetworkStatusService = {
|
|
contractId: "@mozilla.org/network/network-link-service;1",
|
|
|
|
_mockClassId: uuidGenerator.generateUUID(),
|
|
|
|
_originalClassId: "",
|
|
|
|
QueryInterface: ChromeUtils.generateQI(["nsINetworkLinkService"]),
|
|
|
|
createInstance(iiD) {
|
|
return this.QueryInterface(iiD);
|
|
},
|
|
|
|
register() {
|
|
let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
|
|
if (!registrar.isCIDRegistered(this._mockClassId)) {
|
|
this._originalClassId = registrar.contractIDToCID(this.contractId);
|
|
registrar.registerFactory(
|
|
this._mockClassId,
|
|
"Unregister after testing",
|
|
this.contractId,
|
|
this
|
|
);
|
|
}
|
|
},
|
|
|
|
unregister() {
|
|
let registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
|
|
registrar.unregisterFactory(this._mockClassId, this);
|
|
registrar.registerFactory(this._originalClassId, "", this.contractId, null);
|
|
},
|
|
|
|
_isLinkUp: true,
|
|
_linkStatusKnown: false,
|
|
_linkType: Ci.nsINetworkLinkService.LINK_TYPE_UNKNOWN,
|
|
|
|
get isLinkUp() {
|
|
return this._isLinkUp;
|
|
},
|
|
|
|
get linkStatusKnown() {
|
|
return this._linkStatusKnown;
|
|
},
|
|
|
|
setLinkStatus(status) {
|
|
switch (status) {
|
|
case "up":
|
|
this._isLinkUp = true;
|
|
this._linkStatusKnown = true;
|
|
this._networkID = "foo";
|
|
break;
|
|
case "down":
|
|
this._isLinkUp = false;
|
|
this._linkStatusKnown = true;
|
|
this._linkType = Ci.nsINetworkLinkService.LINK_TYPE_UNKNOWN;
|
|
this._networkID = undefined;
|
|
break;
|
|
case "changed":
|
|
this._linkStatusKnown = true;
|
|
this._networkID = "foo";
|
|
break;
|
|
case "unknown":
|
|
this._linkStatusKnown = false;
|
|
this._linkType = Ci.nsINetworkLinkService.LINK_TYPE_UNKNOWN;
|
|
this._networkID = undefined;
|
|
break;
|
|
}
|
|
Services.obs.notifyObservers(null, "network:link-status-changed", status);
|
|
},
|
|
|
|
get linkType() {
|
|
return this._linkType;
|
|
},
|
|
|
|
setLinkType(val) {
|
|
this._linkType = val;
|
|
this._linkStatusKnown = true;
|
|
this._isLinkUp = true;
|
|
this._networkID = "bar";
|
|
Services.obs.notifyObservers(
|
|
null,
|
|
"network:link-type-changed",
|
|
this._linkType
|
|
);
|
|
},
|
|
|
|
get networkID() {
|
|
return this._networkID;
|
|
},
|
|
};
|
|
|
|
// nsINetworkLinkService is not directly testable. With the mock service above,
|
|
// we just exercise a couple small things here to validate the api works somewhat.
|
|
add_task(async function test_networkStatus() {
|
|
mockNetworkStatusService.register();
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
manifest: {
|
|
browser_specific_settings: {
|
|
gecko: { id: "networkstatus@tests.mozilla.org" },
|
|
},
|
|
permissions: ["networkStatus"],
|
|
},
|
|
isPrivileged: true,
|
|
async background() {
|
|
browser.networkStatus.onConnectionChanged.addListener(async details => {
|
|
browser.test.log(`connection status ${JSON.stringify(details)}`);
|
|
browser.test.sendMessage("connect-changed", {
|
|
details,
|
|
linkInfo: await browser.networkStatus.getLinkInfo(),
|
|
});
|
|
});
|
|
browser.test.sendMessage(
|
|
"linkdata",
|
|
await browser.networkStatus.getLinkInfo()
|
|
);
|
|
},
|
|
});
|
|
|
|
async function test(expected, change) {
|
|
if (change.status) {
|
|
info(`test link change status to ${change.status}`);
|
|
mockNetworkStatusService.setLinkStatus(change.status);
|
|
} else if (change.link) {
|
|
info(`test link change type to ${change.link}`);
|
|
mockNetworkStatusService.setLinkType(change.link);
|
|
}
|
|
let { details, linkInfo } = await extension.awaitMessage("connect-changed");
|
|
equal(details.type, expected.type, "network type is correct");
|
|
equal(details.status, expected.status, `network status is correct`);
|
|
equal(details.id, expected.id, "network id");
|
|
Assert.deepEqual(
|
|
linkInfo,
|
|
details,
|
|
"getLinkInfo should resolve to the same details received from onConnectionChanged"
|
|
);
|
|
}
|
|
|
|
await extension.startup();
|
|
|
|
let data = await extension.awaitMessage("linkdata");
|
|
equal(data.type, "unknown", "network type is unknown");
|
|
equal(data.status, "unknown", `network status is ${data.status}`);
|
|
equal(data.id, undefined, "network id");
|
|
|
|
await test(
|
|
{ type: "unknown", status: "up", id: "foo" },
|
|
{ status: "changed" }
|
|
);
|
|
|
|
await test(
|
|
{ type: "wifi", status: "up", id: "bar" },
|
|
{ link: Ci.nsINetworkLinkService.LINK_TYPE_WIFI }
|
|
);
|
|
|
|
await test({ type: "unknown", status: "down" }, { status: "down" });
|
|
|
|
await test({ type: "unknown", status: "unknown" }, { status: "unknown" });
|
|
|
|
await extension.unload();
|
|
mockNetworkStatusService.unregister();
|
|
});
|
|
|
|
add_task(
|
|
{
|
|
// Some builds (e.g. thunderbird) have experiments enabled by default.
|
|
pref_set: [["extensions.experiments.enabled", false]],
|
|
},
|
|
async function test_networkStatus_permission() {
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
temporarilyInstalled: true,
|
|
isPrivileged: false,
|
|
manifest: {
|
|
browser_specific_settings: {
|
|
gecko: { id: "networkstatus-permission@tests.mozilla.org" },
|
|
},
|
|
permissions: ["networkStatus"],
|
|
},
|
|
});
|
|
ExtensionTestUtils.failOnSchemaWarnings(false);
|
|
let { messages } = await promiseConsoleOutput(async () => {
|
|
await Assert.rejects(
|
|
extension.startup(),
|
|
/Using the privileged permission/,
|
|
"Startup failed with privileged permission"
|
|
);
|
|
});
|
|
ExtensionTestUtils.failOnSchemaWarnings(true);
|
|
AddonTestUtils.checkMessages(
|
|
messages,
|
|
{
|
|
expected: [
|
|
{
|
|
message: /Using the privileged permission 'networkStatus' requires a privileged add-on/,
|
|
},
|
|
],
|
|
},
|
|
true
|
|
);
|
|
}
|
|
);
|