mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
205 lines
6.0 KiB
JavaScript
205 lines
6.0 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
MARIONETTE_TIMEOUT = 60000;
|
|
MARIONETTE_CONTEXT = "chrome";
|
|
|
|
Cu.import("resource://gre/modules/Promise.jsm");
|
|
|
|
const DATA_KEY = "ril.data.enabled";
|
|
const APN_KEY = "ril.data.apnSettings";
|
|
|
|
let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer);
|
|
ok(ril, "ril.constructor is " + ril.constructor);
|
|
|
|
let radioInterface = ril.getRadioInterface(0);
|
|
ok(radioInterface, "radioInterface.constructor is " + radioInterface.constrctor);
|
|
|
|
function setSetting(key, value) {
|
|
log("setSetting: '" + key + "'' -> " + JSON.stringify(value));
|
|
|
|
let deferred = Promise.defer();
|
|
let obj = {};
|
|
obj[key] = value;
|
|
|
|
let setRequest = window.navigator.mozSettings.createLock().set(obj);
|
|
setRequest.addEventListener("success", function() {
|
|
log("set '" + key + "' to " + JSON.stringify(value) + " success");
|
|
deferred.resolve();
|
|
});
|
|
setRequest.addEventListener("error", function() {
|
|
ok(false, "cannot set '" + key + "' to " + JSON.stringify(value));
|
|
deferred.reject();
|
|
});
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
function getSetting(key) {
|
|
log("getSetting: '" + key + "'");
|
|
|
|
let deferred = Promise.defer();
|
|
|
|
let getRequest = window.navigator.mozSettings.createLock().get(key);
|
|
getRequest.addEventListener("success", function() {
|
|
let result = getRequest.result[key];
|
|
log("setting '" + key + "': " + JSON.stringify(result));
|
|
deferred.resolve(result);
|
|
});
|
|
getRequest.addEventListener("error", function() {
|
|
ok(false, "cannot get '" + key + "'");
|
|
deferred.reject();
|
|
});
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
function setEmulatorAPN() {
|
|
let apn = [
|
|
[{"carrier":"T-Mobile US",
|
|
"apn":"epc.tmobile.com",
|
|
"mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc",
|
|
"types":["default","supl","mms","ims"]}]
|
|
];
|
|
|
|
return setSetting(APN_KEY, apn);
|
|
}
|
|
|
|
function waitNetworkConnected(networkType) {
|
|
log("wait network " + networkType + " connected");
|
|
|
|
let interfaceStateChangeTopic = "network-interface-state-changed";
|
|
let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
|
|
let deferred = Promise.defer();
|
|
|
|
function observer(subject, topic, data) {
|
|
let network = subject.QueryInterface(Ci.nsINetworkInterface);
|
|
log("Network " + network.type + " state changes to " + network.state);
|
|
if (network.type == networkType &&
|
|
network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
|
|
obs.removeObserver(observer, interfaceStateChangeTopic);
|
|
deferred.resolve();
|
|
}
|
|
}
|
|
|
|
obs.addObserver(observer, interfaceStateChangeTopic, false);
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
function waitNetworkDisconnected(networkType) {
|
|
log("wait network " + networkType + " disconnected");
|
|
|
|
let interfaceStateChangeTopic = "network-interface-state-changed";
|
|
let obs = Cc["@mozilla.org/observer-service;1"].getService(Ci.nsIObserverService);
|
|
let deferred = Promise.defer();
|
|
|
|
function observer(subject, topic, data) {
|
|
let network = subject.QueryInterface(Ci.nsINetworkInterface);
|
|
log("Network " + network.type + " state changes to " + network.state);
|
|
// We can not check network.type here cause network.type would return
|
|
// NETWORK_TYPE_MOBILE_SUPL (NETWORK_TYPE_MOBILE_OTHERS) when disconnecting
|
|
// and disconnected, see bug 939046.
|
|
if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED ||
|
|
network.state == Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN) {
|
|
obs.removeObserver(observer, interfaceStateChangeTopic);
|
|
deferred.resolve();
|
|
}
|
|
}
|
|
|
|
obs.addObserver(observer, interfaceStateChangeTopic, false);
|
|
|
|
return deferred.promise;
|
|
}
|
|
|
|
// Test initial State
|
|
function testInitialState() {
|
|
log("= testInitialState =");
|
|
|
|
// Data should be off before starting any test.
|
|
return Promise.resolve()
|
|
.then(() => getSetting(DATA_KEY))
|
|
.then(value => {
|
|
is(value, false, "Data must be off");
|
|
})
|
|
.then(null, () => {
|
|
ok(false, "promise rejected during test");
|
|
})
|
|
.then(runNextTest);
|
|
}
|
|
|
|
// Test default data Connection
|
|
function testDefaultDataConnection() {
|
|
log("= testDefaultDataConnection =");
|
|
|
|
return Promise.resolve()
|
|
// Enable data
|
|
.then(() => setSetting(DATA_KEY, true))
|
|
.then(() => waitNetworkConnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE))
|
|
// Disable data
|
|
.then(() => setSetting(DATA_KEY, false))
|
|
.then(() => waitNetworkDisconnected(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE))
|
|
.then(null, () => {
|
|
ok(false, "promise rejected during test");
|
|
})
|
|
.then(runNextTest);
|
|
}
|
|
|
|
// Test non default data connection
|
|
function testNonDefaultDataConnection() {
|
|
log("= testNonDefaultDataConnection =");
|
|
|
|
function doTestNonDefaultDataConnection(type) {
|
|
log("doTestNonDefaultDataConnection: " + type);
|
|
|
|
let typeMapping = {
|
|
"mms": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS,
|
|
"supl": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL,
|
|
"ims": Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS
|
|
};
|
|
let networkType = typeMapping[type];
|
|
|
|
return Promise.resolve()
|
|
.then(() => radioInterface.setupDataCallByType(type))
|
|
.then(() => waitNetworkConnected(networkType))
|
|
.then(() => radioInterface.deactivateDataCallByType(type))
|
|
.then(() => waitNetworkDisconnected(networkType));
|
|
}
|
|
|
|
let currentApn;
|
|
return Promise.resolve()
|
|
.then(() => getSetting(APN_KEY))
|
|
.then(value => {
|
|
currentApn = value;
|
|
})
|
|
.then(setEmulatorAPN)
|
|
.then(() => doTestNonDefaultDataConnection("mms"))
|
|
.then(() => doTestNonDefaultDataConnection("supl"))
|
|
.then(() => doTestNonDefaultDataConnection("ims"))
|
|
// Restore APN settings
|
|
.then(() => setSetting(APN_KEY, currentApn))
|
|
.then(null, () => {
|
|
ok(false, "promise rejected during test");
|
|
})
|
|
.then(runNextTest);
|
|
}
|
|
|
|
let tests = [
|
|
testInitialState,
|
|
testDefaultDataConnection,
|
|
testNonDefaultDataConnection
|
|
];
|
|
|
|
function runNextTest() {
|
|
let test = tests.shift();
|
|
if (!test) {
|
|
finish();
|
|
return;
|
|
}
|
|
|
|
test();
|
|
}
|
|
|
|
// Start Tests
|
|
runNextTest();
|