michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_TIMEOUT = 60000; michael@0: michael@0: const DATA_KEY = "ril.data.enabled"; michael@0: const APN_KEY = "ril.data.apnSettings"; michael@0: michael@0: let Promise = SpecialPowers.Cu.import("resource://gre/modules/Promise.jsm").Promise; michael@0: michael@0: SpecialPowers.setBoolPref("dom.mozSettings.enabled", true); michael@0: SpecialPowers.addPermission("mobileconnection", true, document); michael@0: SpecialPowers.addPermission("settings-read", true, document); michael@0: SpecialPowers.addPermission("settings-write", true, document); michael@0: michael@0: let settings = window.navigator.mozSettings; michael@0: let connection = window.navigator.mozMobileConnections[0]; michael@0: ok(connection instanceof MozMobileConnection, michael@0: "connection is instanceof " + connection.constructor); michael@0: michael@0: function setSetting(key, value) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: let setLock = settings.createLock(); michael@0: let obj = {}; michael@0: obj[key] = value; michael@0: michael@0: let setReq = setLock.set(obj); michael@0: setReq.addEventListener("success", function onSetSuccess() { michael@0: ok(true, "set '" + key + "' to " + obj[key]); michael@0: deferred.resolve(); michael@0: }); michael@0: setReq.addEventListener("error", function onSetError() { michael@0: ok(false, "cannot set '" + key + "'"); michael@0: deferred.reject(); michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function setEmulatorAPN() { michael@0: let apn = michael@0: [ michael@0: [ michael@0: {"carrier":"T-Mobile US", michael@0: "apn":"epc.tmobile.com", michael@0: "mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc", michael@0: "types":["default","supl","mms"]} michael@0: ] michael@0: ]; michael@0: return setSetting(APN_KEY, apn); michael@0: } michael@0: michael@0: function enableData() { michael@0: log("Turn data on."); michael@0: michael@0: let deferred = Promise.defer(); michael@0: michael@0: connection.addEventListener("datachange", function ondatachange() { michael@0: if (connection.data.connected === true) { michael@0: connection.removeEventListener("datachange", ondatachange); michael@0: log("mobileConnection.data.connected is now '" michael@0: + connection.data.connected + "'."); michael@0: deferred.resolve(); michael@0: } michael@0: }); michael@0: michael@0: setEmulatorAPN() michael@0: .then(() => setSetting(DATA_KEY, true)); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function receivedPending(received, pending, nextAction) { michael@0: let index = pending.indexOf(received); michael@0: if (index != -1) { michael@0: pending.splice(index, 1); michael@0: } michael@0: if (pending.length === 0) { michael@0: nextAction(); michael@0: } michael@0: } michael@0: michael@0: function waitRadioState(state) { michael@0: let deferred = Promise.defer(); michael@0: michael@0: waitFor(function() { michael@0: deferred.resolve(); michael@0: }, function() { michael@0: return connection.radioState == state; michael@0: }); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function setRadioEnabled(enabled, transientState, finalState) { michael@0: log("setRadioEnabled to " + enabled); michael@0: michael@0: let deferred = Promise.defer(); michael@0: let done = function() { michael@0: deferred.resolve(); michael@0: }; michael@0: michael@0: let pending = ["onradiostatechange", "onsuccess"]; michael@0: michael@0: let receivedTransient = false; michael@0: connection.onradiostatechange = function() { michael@0: let state = connection.radioState; michael@0: log("Received 'radiostatechange' event, radioState: " + state); michael@0: michael@0: if (state == transientState) { michael@0: receivedTransient = true; michael@0: } else if (state == finalState) { michael@0: ok(receivedTransient); michael@0: receivedPending("onradiostatechange", pending, done); michael@0: } michael@0: }; michael@0: michael@0: let req = connection.setRadioEnabled(enabled); michael@0: michael@0: req.onsuccess = function() { michael@0: log("setRadioEnabled success"); michael@0: receivedPending("onsuccess", pending, done); michael@0: }; michael@0: michael@0: req.onerror = function() { michael@0: ok(false, "setRadioEnabled should not fail"); michael@0: deferred.reject(); michael@0: }; michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testSwitchRadio() { michael@0: log("= testSwitchRadio ="); michael@0: return waitRadioState("enabled") michael@0: .then(setRadioEnabled.bind(null, false, "disabling", "disabled")) michael@0: .then(setRadioEnabled.bind(null, true, "enabling", "enabled")); michael@0: } michael@0: michael@0: function testDisableRadioWhenDataConnected() { michael@0: log("= testDisableRadioWhenDataConnected ="); michael@0: return waitRadioState("enabled") michael@0: .then(enableData) michael@0: .then(setRadioEnabled.bind(null, false, "disabling", "disabled")) michael@0: .then(() => { michael@0: // Data should be disconnected. michael@0: is(connection.data.connected, false); michael@0: }) michael@0: .then(setRadioEnabled.bind(null, true, "enabling", "enabled")) michael@0: // Disable data michael@0: .then(setSetting.bind(null, DATA_KEY, false)); michael@0: } michael@0: michael@0: function cleanUp() { michael@0: SpecialPowers.removePermission("mobileconnection", document); michael@0: SpecialPowers.removePermission("settings-write", document); michael@0: SpecialPowers.removePermission("settings-read", document); michael@0: SpecialPowers.clearUserPref("dom.mozSettings.enabled"); michael@0: finish(); michael@0: } michael@0: michael@0: testSwitchRadio() michael@0: .then(testDisableRadioWhenDataConnected) michael@0: .then(null, () => { michael@0: ok(false, "promise reject somewhere"); michael@0: }) michael@0: .then(cleanUp);