Merge b2g-inbound to m-c. a=merge

--HG--
rename : layout/style/nsCSSStyleSheet.cpp => layout/style/CSSStyleSheet.cpp
rename : layout/style/nsCSSStyleSheet.h => layout/style/CSSStyleSheet.h
This commit is contained in:
Ryan VanderMeulen 2014-06-23 10:56:03 -04:00
Родитель adb70139cc 780344c15f
Коммит 1ea076bea7
24 изменённых файлов: 580 добавлений и 629 удалений

Просмотреть файл

@ -19,13 +19,13 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="3326b51017252e09ccdd715dec6c5e12a7d1ecfe"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>

Просмотреть файл

@ -17,10 +17,10 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->
@ -128,7 +128,7 @@
<project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="3a9a17613cc685aa232432566ad6cc607eab4ec1"/>
<project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="0e31f35a2a77301e91baa8a237aa9e9fa4076084"/>
<project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="7d33aaf740bbf6c7c6e9c34a92b371eda311b66b"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="973367035a1f2545f3dad6e40e354463dc56a7f4"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="346c7694b156a3933f3d87cbc077c657e2ce571f"/>
<project name="platform/external/wpa_supplicant_8" path="external/wpa_supplicant_8" revision="0e56e450367cd802241b27164a2979188242b95f"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="832f4acaf481a19031e479a40b03d9ce5370ddee"/>
<project name="platform_system_nfcd" path="system/nfcd" remote="b2g" revision="d0aa65b140a45016975ed0ecf35f280dd336e1d3"/>

Просмотреть файл

@ -15,15 +15,15 @@
<project name="platform_build" path="build" remote="b2g" revision="276ce45e78b09c4a4ee643646f691d22804754c1">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>

Просмотреть файл

@ -19,13 +19,13 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="cd88d860656c31c7da7bb310d6a160d0011b0961"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="3326b51017252e09ccdd715dec6c5e12a7d1ecfe"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>

Просмотреть файл

@ -17,10 +17,10 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

Просмотреть файл

@ -4,6 +4,6 @@
"remote": "",
"branch": ""
},
"revision": "387f4c0123a7e82eae4c83f88f73e81f907c00e2",
"revision": "aba00cfd579caaf205e05c269f0a8100f242f39c",
"repo_path": "/integration/gaia-central"
}

Просмотреть файл

@ -17,12 +17,12 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
<project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>

Просмотреть файл

@ -15,8 +15,8 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>

Просмотреть файл

@ -17,10 +17,10 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

Просмотреть файл

@ -17,12 +17,12 @@
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="bd5065ced020014df5fd45259fba1ac32d65673b"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="44b04243e31cd16f3baf54fcd4b5fecf9deb8b94"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="41cc1de26e4edbe12add0009cdc0bd292f2e94fe"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="bbb7659d8ea2afb396f99b3dc971ab3c42da3778"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="c510babaf88dfa2cfe2c202afb2649ee124569af"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="8ba14125aba912707f44761f194339e6e59701b7"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="23db533981ee2cd04fc5d946420402aed2792381"/>
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>

Просмотреть файл

@ -1316,6 +1316,12 @@ this.DOMApplicationRegistry = {
return;
}
// Ensure we don't send additional errors for this download
app.isCanceling = true;
// Ensure this app can be downloaded again after canceling
app.downloading = false;
this._saveApps().then(() => {
this.broadcastMessage("Webapps:UpdateState", {
app: {
@ -1339,6 +1345,7 @@ this.DOMApplicationRegistry = {
let id = this._appIdForManifestURL(aManifestURL);
let app = this.webapps[id];
if (!app) {
debug("startDownload: No app found for " + aManifestURL);
throw new Error("NO_SUCH_APP");
@ -2770,6 +2777,14 @@ this.DOMApplicationRegistry = {
// initialize the progress to 0 right now
oldApp.progress = 0;
// Save the current state of the app to handle cases where we may be
// retrying a past download.
yield DOMApplicationRegistry._saveApps();
DOMApplicationRegistry.broadcastMessage("Webapps:UpdateState", {
app: oldApp,
manifestURL: aNewApp.manifestURL
});
let zipFile = yield this._getPackage(requestChannel, id, oldApp, aNewApp);
let hash = yield this._computeFileHash(zipFile.path);
@ -4083,6 +4098,15 @@ AppcacheObserver.prototype = {
let setError = function appObs_setError(aError) {
debug("Offlinecache setError to " + aError);
app.downloading = false;
mustSave = true;
// If we are canceling the download, we already send a DOWNLOAD_CANCELED
// error.
if (app.isCanceling) {
delete app.isCanceling;
return;
}
DOMApplicationRegistry.broadcastMessage("Webapps:UpdateState", {
app: app,
error: aError,
@ -4092,7 +4116,6 @@ AppcacheObserver.prototype = {
eventType: "downloaderror",
manifestURL: app.manifestURL
});
mustSave = true;
}
switch (aState) {

Просмотреть файл

@ -699,7 +699,10 @@ BluetoothAdapter::EnableDisable(bool aEnable)
}
nsTArray<nsString> types;
types.AppendElement(NS_LITERAL_STRING("State"));
BT_APPEND_ENUM_STRING(types,
BluetoothAdapterAttribute,
BluetoothAdapterAttribute::State);
DispatchAttributeEvent(types);
nsRefPtr<BluetoothReplyRunnable> result =
@ -792,7 +795,7 @@ BluetoothAdapter::HandlePropertyChanged(const BluetoothValue& aValue)
// BluetoothAdapterAttribute properties
if (IsAdapterAttributeChanged(type, arr[i].value())) {
SetPropertyByValue(arr[i]);
types.AppendElement(arr[i].name());
BT_APPEND_ENUM_STRING(types, BluetoothAdapterAttribute, type);
}
}

Просмотреть файл

@ -83,6 +83,18 @@ extern bool gBluetoothDebugFlag;
} \
} while(0)
/**
* Convert an enum value to string then append it to an array.
*/
#define BT_APPEND_ENUM_STRING(array, enumType, enumValue) \
do { \
uint32_t index = uint32_t(enumValue); \
nsAutoString name; \
name.AssignASCII(enumType##Values::strings[index].value, \
enumType##Values::strings[index].length); \
array.AppendElement(name); \
} while(0) \
#define BEGIN_BLUETOOTH_NAMESPACE \
namespace mozilla { namespace dom { namespace bluetooth {
#define END_BLUETOOTH_NAMESPACE \

Просмотреть файл

@ -260,7 +260,9 @@ BluetoothManager::DispatchAttributeEvent()
JSAutoCompartment ac(cx, scope);
nsTArray<nsString> types;
types.AppendElement(NS_LITERAL_STRING("DefaultAdapter"));
BT_APPEND_ENUM_STRING(types,
BluetoothManagerAttribute,
BluetoothManagerAttribute::DefaultAdapter);
if (!ToJSValue(cx, types, &value)) {
JS_ClearPendingException(cx);

Просмотреть файл

@ -566,7 +566,7 @@ function sendMMI(aMmi) {
* Query current voice privacy mode.
*
* Fulfill params:
A boolean indicates the current voice privacy mode.
* A boolean indicates the current voice privacy mode.
* Reject params:
* 'RadioNotAvailable', 'RequestNotSupported', or 'GenericFailure'.
*
@ -578,6 +578,54 @@ function sendMMI(aMmi) {
.then(() => request.result, () => { throw request.error });
}
/**
* Configures call barring options.
*
* Fulfill params: (none)
* Reject params:
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter' or
* 'GenericFailure'.
*
* @return A deferred promise.
*/
function setCallBarringOption(aOptions) {
let request = mobileConnection.setCallBarringOption(aOptions);
return wrapDomRequestAsPromise(request)
.then(null, () => { throw request.error });
}
/**
* Queries current call barring status.
*
* Fulfill params:
* An object contains call barring status.
* Reject params:
* 'RadioNotAvailable', 'RequestNotSupported', 'InvalidParameter' or
* 'GenericFailure'.
*
* @return A deferred promise.
*/
function getCallBarringOption(aOptions) {
let request = mobileConnection.getCallBarringOption(aOptions);
return wrapDomRequestAsPromise(request)
.then(() => request.result, () => { throw request.error });
}
/**
* Change call barring facility password.
*
* Fulfill params: (none)
* Reject params:
* 'RadioNotAvailable', 'RequestNotSupported', or 'GenericFailure'.
*
* @return A deferred promise.
*/
function changeCallBarringPassword(aOptions) {
let request = mobileConnection.changeCallBarringPassword(aOptions);
return wrapDomRequestAsPromise(request)
.then(null, () => { throw request.error });
}
/**
* Set data connection enabling state and wait for "datachange" event.
*
@ -959,6 +1007,94 @@ function setEmulatorOperatorNamesAndWait(aOperator, aLongName, aShortName,
return Promise.all(promises);
}
/**
* Set GSM signal strength.
*
* Fulfill params: (none)
* Reject params: (none)
*
* @param aRssi
*
* @return A deferred promise.
*/
function setEmulatorGsmSignalStrength(aRssi) {
let cmd = "gsm signal " + aRssi;
return runEmulatorCmdSafe(cmd);
}
/**
* Set emulator GSM signal strength and wait for voice and/or data state change.
*
* Fulfill params: (none)
*
* @param aRssi
* @param aWaitVoice [optional]
* A boolean value. Default true.
* @param aWaitData [optional]
* A boolean value. Default false.
*
* @return A deferred promise.
*/
function setEmulatorGsmSignalStrengthAndWait(aRssi,
aWaitVoice = true,
aWaitData = false) {
let promises = [];
if (aWaitVoice) {
promises.push(waitForManagerEvent("voicechange"));
}
if (aWaitData) {
promises.push(waitForManagerEvent("datachange"));
}
promises.push(setEmulatorGsmSignalStrength(aRssi));
return Promise.all(promises);
}
/**
* Set LTE signal strength.
*
* Fulfill params: (none)
* Reject params: (none)
*
* @param aRxlev
* @param aRsrp
* @param aRssnr
*
* @return A deferred promise.
*/
function setEmulatorLteSignalStrength(aRxlev, aRsrp, aRssnr) {
let cmd = "gsm lte_signal " + aRxlev + " " + aRsrp + " " + aRssnr;
return runEmulatorCmdSafe(cmd);
}
/**
* Set emulator LTE signal strength and wait for voice and/or data state change.
*
* Fulfill params: (none)
*
* @param aRxlev
* @param aRsrp
* @param aRssnr
* @param aWaitVoice [optional]
* A boolean value. Default true.
* @param aWaitData [optional]
* A boolean value. Default false.
*
* @return A deferred promise.
*/
function setEmulatorLteSignalStrengthAndWait(aRxlev, aRsrp, aRssnr,
aWaitVoice = true,
aWaitData = false) {
let promises = [];
if (aWaitVoice) {
promises.push(waitForManagerEvent("voicechange"));
}
if (aWaitData) {
promises.push(waitForManagerEvent("datachange"));
}
promises.push(setEmulatorLteSignalStrength(aRxlev, aRsrp, aRssnr));
return Promise.all(promises);
}
let _networkManager;
/**

Просмотреть файл

@ -1,60 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
SpecialPowers.addPermission("mobileconnection", true, document);
// In single sim scenario, there is only one mobileConnection, we can always use
// the first instance.
let mobileConnection = window.navigator.mozMobileConnections[0];
ok(mobileConnection instanceof MozMobileConnection,
"mobileConnection is instanceof " + mobileConnection.constructor);
let _pendingEmulatorCmdCount = 0;
/* Remove permission and execute finish() */
let cleanUp = function() {
waitFor(function() {
SpecialPowers.removePermission("mobileconnection", document);
finish();
}, function() {
return _pendingEmulatorCmdCount === 0;
});
};
/* Helper for tasks */
let taskHelper = {
tasks: [],
push: function(task) {
this.tasks.push(task);
},
runNext: function() {
let task = this.tasks.shift();
if (!task) {
cleanUp();
return;
}
if (typeof task === "function") {
task();
}
},
};
/* Helper for emulator console command */
let emulatorHelper = {
sendCommand: function(cmd, callback) {
_pendingEmulatorCmdCount++;
runEmulatorCmd(cmd, function(results) {
_pendingEmulatorCmdCount--;
let result = results[results.length - 1];
is(result, "OK", "'"+ cmd +"' returns '" + result + "'");
if (callback && typeof callback === "function") {
callback(results);
}
});
},
};

Просмотреть файл

@ -2,62 +2,49 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
SpecialPowers.addPermission("mobileconnection", true, document);
const TEST_DATA = [
// [<pin>, <new pin>, <expected error>]
// Permission changes can't change existing Navigator.prototype
// objects, so grab our objects from a new Navigator
let ifr = document.createElement("iframe");
let connection;
ifr.onload = function() {
connection = ifr.contentWindow.navigator.mozMobileConnections[0];
// Test passing an invalid pin or newPin.
[null, "0000", "InvalidPassword"],
["0000", null, "InvalidPassword"],
[null, null, "InvalidPassword"],
ok(connection instanceof ifr.contentWindow.MozMobileConnection,
"connection is instanceof " + connection.constructor);
// Test passing mismatched newPin.
["000", "0000", "InvalidPassword"],
["00000", "1111", "InvalidPassword"],
["abcd", "efgh", "InvalidPassword"],
setTimeout(testChangeCallBarringPasswordWithFailure, 0);
};
document.body.appendChild(ifr);
// TODO: Bug 906603 - B2G RIL: Support Change Call Barring Password on Emulator.
// Currently emulator doesn't support REQUEST_CHANGE_BARRING_PASSWORD, so we
// expect to get a 'RequestNotSupported' error here.
["1234", "1234", "RequestNotSupported"]
];
function testChangeCallBarringPasswordWithFailure() {
// Incorrect parameters, expect onerror callback.
let options = [
{pin: null, newPin: '0000'},
{pin: '0000', newPin: null},
{pin: null, newPin: null},
{pin: '000', newPin: '0000'},
{pin: '00000', newPin: '1111'},
{pin: 'abcd', newPin: 'efgh'},
];
function testChangeCallBarringPassword(aPin, aNewPin, aExpectedError) {
log("Test changing call barring password to " + aPin + "/" + aNewPin);
function do_test() {
for (let i = 0; i < options.length; i++) {
let request = connection.changeCallBarringPassword(options[i]);
let options = {
pin: aPin,
newPin: aNewPin
};
return changeCallBarringPassword(options)
.then(function resolve() {
ok(!aExpectedError, "changeCallBarringPassword success");
}, function reject(aError) {
is(aError.name, aExpectedError, "failed to changeCallBarringPassword");
});
}
request.onsuccess = function() {
ok(false, 'Unexpected result.');
setTimeout(cleanUp , 0);
};
request.onerror = function() {
ok(request.error.name === 'InvalidPassword', 'InvalidPassword');
if (i >= options.length) {
setTimeout(testChangeCallBarringPasswordWithSuccess, 0);
}
};
}
// Start tests
startTestCommon(function() {
let promise = Promise.resolve();
for (let i = 0; i < TEST_DATA.length; i++) {
let data = TEST_DATA[i];
promise =
promise.then(() => testChangeCallBarringPassword(data[0], data[1], data[2]));
}
do_test();
}
function testChangeCallBarringPasswordWithSuccess() {
// TODO: Bug 906603 - B2G RIL: Support Change Call Barring Password on
// Emulator.
setTimeout(cleanUp , 0);
}
function cleanUp() {
SpecialPowers.removePermission("mobileconnection", document);
finish();
}
return promise;
});

Просмотреть файл

@ -2,38 +2,73 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
SpecialPowers.addPermission("mobileconnection", true, document);
const TEST_DATA = [
// Test passing invalid program.
{
options: {
program: 5, /* Invalid program */
serviceClass: 0
},
expectedError: "InvalidParameter"
}, {
options: {
program: null,
serviceClass: 0
},
expectedError: "InvalidParameter"
}, {
options: {
/* Undefined program */
serviceClass: 0
},
expectedError: "InvalidParameter"
},
// Test passing invalid serviceClass.
{
options: {
program: MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
serviceClass: null
},
expectedError: "InvalidParameter"
}, {
options: {
program: MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
/* Undefined serviceClass */
},
expectedError: "InvalidParameter"
},
// TODO: Bug 1027546 - [B2G][Emulator] Support call barring
// Currently emulator doesn't support call barring, so we expect to get a
// 'RequestNotSupported' error here.
{
options: {
program: MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
serviceClass: 0
},
expectedError: "RequestNotSupported"
}
];
// Permission changes can't change existing Navigator.prototype
// objects, so grab our objects from a new Navigator
let ifr = document.createElement("iframe");
let connection;
ifr.onload = function() {
connection = ifr.contentWindow.navigator.mozMobileConnections[0];
function testGetCallBarringOption(aOptions, aExpectedError) {
log("Test getting call barring to " + JSON.stringify(aOptions));
ok(connection instanceof ifr.contentWindow.MozMobileConnection,
"connection is instanceof " + connection.constructor);
testGetCallBarringOption();
};
document.body.appendChild(ifr);
function testGetCallBarringOption() {
let option = {'program': 0, 'password': '', 'serviceClass': 0};
let request = connection.getCallBarringOption(option);
request.onsuccess = function() {
ok(request.result);
ok('enabled' in request.result, 'should have "enabled" field');
cleanUp();
};
request.onerror = function() {
// Call barring is not supported by current emulator.
cleanUp();
};
return getCallBarringOption(aOptions)
.then(function resolve(aResult) {
ok(false, "should not success");
}, function reject(aError) {
is(aError.name, aExpectedError, "failed to getCallBarringOption");
});
}
function cleanUp() {
SpecialPowers.removePermission("mobileconnection", document);
finish();
}
// Start tests
startTestCommon(function() {
let promise = Promise.resolve();
for (let i = 0; i < TEST_DATA.length; i++) {
let data = TEST_DATA[i];
promise = promise.then(() => testGetCallBarringOption(data.options,
data.expectedError));
}
return promise;
});

Просмотреть файл

@ -2,73 +2,121 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
SpecialPowers.addPermission("mobileconnection", true, document);
// Permission changes can't change existing Navigator.prototype
// objects, so grab our objects from a new Navigator
let ifr = document.createElement("iframe");
let connection;
ifr.onload = function() {
connection = ifr.contentWindow.navigator.mozMobileConnections[0];
ok(connection instanceof ifr.contentWindow.MozMobileConnection,
"connection is instanceof " + connection.constructor);
nextTest();
};
document.body.appendChild(ifr);
let caseId = 0;
let options = [
buildOption(5, true, '0000', 0), // invalid program.
// test null.
buildOption(null, true, '0000', 0),
buildOption(0, null, '0000', 0),
buildOption(0, true, null, 0),
buildOption(0, true, '0000', null),
// test undefined.
{'enabled': true, 'password': '0000', 'serviceClass': 0},
{'program': 0, 'password': '0000', 'serviceClass': 0},
{'program': 0, 'enabled': true, 'serviceClass': 0},
{'program': 0, 'enabled': true, 'password': '0000'},
const TEST_DATA = [
// Test passing invalid program.
{
options: {
"program": 5, /* Invalid program */
"enabled": true,
"password": "0000",
"serviceClass": 0
},
expectedError: "InvalidParameter"
}, {
options: {
"program": null,
"enabled": true,
"password": "0000",
"serviceClass": 0
},
expectedError: "InvalidParameter"
}, {
options: {
/* Undefined program */
"enabled": true,
"password": "0000",
"serviceClass": 0
},
expectedError: "InvalidParameter"
},
// Test passing invalid enabled.
{
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": null,
"password": "0000",
"serviceClass": 0
},
expectedError: "InvalidParameter"
}, {
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
/* Undefined enabled */
"password": "0000",
"serviceClass": 0
},
expectedError: "InvalidParameter"
},
// Test passing invalid password.
{
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": true,
"password": null,
"serviceClass": 0
},
expectedError: "InvalidParameter"
}, {
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": true,
/* Undefined password */
"serviceClass": 0
},
expectedError: "InvalidParameter"
},
// Test passing invalid serviceClass.
{
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": true,
"password": "0000",
"serviceClass": null
},
expectedError: "InvalidParameter"
}, {
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": true,
"password": "0000",
/* Undefined serviceClass */
},
expectedError: "InvalidParameter"
},
// TODO: Bug 1027546 - [B2G][Emulator] Support call barring
// Currently emulator doesn't support call barring, so we expect to get a
// 'RequestNotSupported' error here.
{
options: {
"program": MozMobileConnection.CALL_BARRING_PROGRAM_ALL_OUTGOING,
"enabled": true,
"password": "0000",
"serviceClass": 0
},
expectedError: "RequestNotSupported"
}
];
function buildOption(program, enabled, password, serviceClass) {
return {
'program': program,
'enabled': enabled,
'password': password,
'serviceClass': serviceClass
};
function testSetCallBarringOption(aOptions, aExpectedError) {
log("Test setting call barring to " + JSON.stringify(aOptions));
return setCallBarringOption(aOptions)
.then(function resolve() {
ok(false, "changeCallBarringPassword success");
}, function reject(aError) {
is(aError.name, aExpectedError, "failed to changeCallBarringPassword");
});
}
function testSetCallBarringOptionError(option) {
let request = connection.setCallBarringOption(option);
request.onsuccess = function() {
ok(false,
'should not fire onsuccess for invaild call barring option: '
+ JSON.stringify(option));
};
request.onerror = function(event) {
is(event.target.error.name, 'InvalidParameter', JSON.stringify(option));
nextTest();
};
}
function nextTest() {
if (caseId >= options.length) {
cleanUp();
} else {
let option = options[caseId++];
log('test for ' + JSON.stringify(option));
testSetCallBarringOptionError(option);
// Start tests
startTestCommon(function() {
let promise = Promise.resolve();
for (let i = 0; i < TEST_DATA.length; i++) {
let data = TEST_DATA[i];
promise = promise.then(() => testSetCallBarringOption(data.options,
data.expectedError));
}
}
function cleanUp() {
SpecialPowers.removePermission("mobileconnection", document);
finish();
}
return promise;
});

Просмотреть файл

@ -1,84 +1,33 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 30000;
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
SpecialPowers.addPermission("mobileconnection", true, document);
// The emulator's hard coded iccid value.
const ICCID = "89014103211118510720";
// Permission changes can't change existing Navigator.prototype
// objects, so grab our objects from a new Navigator
let ifr = document.createElement("iframe");
let connection;
ifr.onload = function() {
connection = ifr.contentWindow.navigator.mozMobileConnections[0];
ok(connection instanceof ifr.contentWindow.MozMobileConnection,
"connection is instanceof " + connection.constructor);
function setRadioEnabledAndWaitIccChange(aEnabled) {
let promises = [];
promises.push(waitForManagerEvent("iccchange"));
promises.push(setRadioEnabled(aEnabled));
// The emulator's hard coded iccid value.
// See it here {B2G_HOME}/external/qemu/telephony/sim_card.c.
is(connection.iccId, 89014103211118510720);
runNextTest();
};
document.body.appendChild(ifr);
function waitForIccChange(callback) {
connection.addEventListener("iccchange", function handler() {
connection.removeEventListener("iccchange", handler);
callback();
});
return Promise.all(promises);
}
function setRadioEnabled(enabled) {
let request = connection.setRadioEnabled(enabled);
// Start tests
startTestCommon(function() {
log("Test initial iccId");
is(mobileConnection.iccId, ICCID);
request.onsuccess = function onsuccess() {
log('setRadioEnabled: ' + enabled);
};
return setRadioEnabledAndWaitIccChange(false)
.then(() => {
is(mobileConnection.iccId, null);
})
request.onerror = function onerror() {
ok(false, "setRadioEnabled should be ok");
};
}
function testIccChangeOnRadioPowerOff() {
// Turn off radio
setRadioEnabled(false);
waitForIccChange(function() {
is(connection.iccId, null);
runNextTest();
});
}
function testIccChangeOnRadioPowerOn() {
// Turn on radio
setRadioEnabled(true);
waitForIccChange(function() {
// The emulator's hard coded iccid value.
is(connection.iccId, 89014103211118510720);
runNextTest();
});
}
let tests = [
testIccChangeOnRadioPowerOff,
testIccChangeOnRadioPowerOn
];
function runNextTest() {
let test = tests.shift();
if (!test) {
cleanUp();
return;
}
test();
}
function cleanUp() {
SpecialPowers.removePermission("mobileconnection", document);
finish();
}
// Restore radio state.
.then(() => setRadioEnabledAndWaitIccChange(true))
.then(() => {
is(mobileConnection.iccId, ICCID);
});
});

Просмотреть файл

@ -1,47 +1,13 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 30000;
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
SpecialPowers.addPermission("mobilenetwork", true, document);
let connection = navigator.mozMobileConnections[0];
ok(connection instanceof MozMobileConnection,
"connection is instanceof " + connection.constructor);
function testLastKnownNetwork() {
log("testLastKnownNetwork: " + connection.lastKnownNetwork);
// Start tests
startTestCommon(function() {
// The emulator's hard coded operatoer's mcc and mnc codes.
is(connection.lastKnownNetwork, "310-260");
runNextTest();
}
function testLastKnownHomeNetwork() {
log("testLastKnownHomeNetwork: " + connection.lastKnownHomeNetwork);
is(mobileConnection.lastKnownNetwork, "310-260");
// The emulator's hard coded icc's mcc and mnc codes.
is(connection.lastKnownHomeNetwork, "310-260");
runNextTest();
}
let tests = [
testLastKnownNetwork,
testLastKnownHomeNetwork
];
function runNextTest() {
let test = tests.shift();
if (!test) {
cleanUp();
return;
}
test();
}
function cleanUp() {
SpecialPowers.removePermission("mobilenetwork", document);
finish();
}
runNextTest();
is(mobileConnection.lastKnownHomeNetwork, "310-260");
});

Просмотреть файл

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

Просмотреть файл

@ -1,132 +1,98 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 30000;
MARIONETTE_HEAD_JS = "mobile_header.js";
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = "head.js";
/* Emulator command for GSM/UMTS signal strength */
function setEmulatorGsmSignalStrength(rssi) {
emulatorHelper.sendCommand("gsm signal " + rssi);
}
// Emulator uses rssi = 7 as default value.
const DEFAULT_RSSI = 7;
/* Emulator command for LTE signal strength */
function setEmulatorLteSignalStrength(rxlev, rsrp, rssnr) {
let lteSignal = rxlev + " " + rsrp + " " + rssnr;
emulatorHelper.sendCommand("gsm lte_signal " + lteSignal);
}
function waitForVoiceChangeEvent(callback) {
mobileConnection.addEventListener("voicechange", function onvoicechange() {
mobileConnection.removeEventListener("voicechange", onvoicechange);
if (callback && typeof callback === "function") {
callback();
const TEST_DATA = [
// All invalid case.
{
input: {
rxlev: 99,
rsrp: 65535,
rssnr: 65535
},
expect: {
signalStrength: null,
relSignalStrength: null
}
});
}
},
// Valid rxlev with max value.
{
input: {
rxlev: 63,
rsrp: 65535,
rssnr: 65535
},
expect: {
signalStrength: -48,
relSignalStrength: 100
}
},
// Valid rxlev.
{
input: {
rxlev: 12,
rsrp: 65535,
rssnr: 65535
},
expect: {
signalStrength: -99,
relSignalStrength: 100
}
},
// Valid rxlev with min value.
{
input: {
rxlev: 0,
rsrp: 65535,
rssnr: 65535
},
expect: {
signalStrength: -111,
relSignalStrength: 0
}
}
];
/* Test Initial Signal Strength Info */
taskHelper.push(function testInitialSignalStrengthInfo() {
function testInitialSignalStrengthInfo() {
log("Test initial signal strength info");
let voice = mobileConnection.voice;
// Android emulator initializes the signal strength to -99 dBm
is(voice.signalStrength, -99, "check voice.signalStrength");
is(voice.relSignalStrength, 44, "check voice.relSignalStrength");
}
taskHelper.runNext();
});
function testLteSignalStrength(aInput, aExpect) {
log("Test setting LTE signal strength to " + JSON.stringify(aInput));
/* Test Unsolicited Signal Strength Events for LTE */
taskHelper.push(function testLteSignalStrength() {
// Set emulator's LTE signal strength and wait for 'onvoicechange' event.
function doTestLteSignalStrength(input, expect, callback) {
log("Test LTE signal info with data : " + JSON.stringify(input));
waitForVoiceChangeEvent(function() {
return setEmulatorLteSignalStrengthAndWait(aInput.rxlev, aInput.rsrp, aInput.rssnr)
.then(() => {
let voice = mobileConnection.voice;
is(voice.signalStrength, expect.signalStrength,
is(voice.signalStrength, aExpect.signalStrength,
"check voice.signalStrength");
is(voice.relSignalStrength, expect.relSignalStrength,
is(voice.relSignalStrength, aExpect.relSignalStrength,
"check voice.relSignalStrength");
if (callback && typeof callback === "function") {
callback();
}
});
}
setEmulatorLteSignalStrength(input.rxlev, input.rsrp, input.rssnr);
// Start tests
startTestCommon(function() {
// Test initial status
testInitialSignalStrengthInfo();
// Test Unsolicited Signal Strength Events for LTE
let promise = Promise.resolve();
for (let i = 0; i < TEST_DATA.length; i++) {
let data = TEST_DATA[i];
promise = promise.then(() => testLteSignalStrength(data.input,
data.expect));
}
let testData = [
// All invalid case.
{input: {
rxlev: 99,
rsrp: 65535,
rssnr: 65535},
expect: {
signalStrength: null,
relSignalStrength: null}
},
// Valid rxlev with max value.
{input: {
rxlev: 63,
rsrp: 65535,
rssnr: 65535},
expect: {
signalStrength: -48,
relSignalStrength: 100}
},
// Valid rxlev.
{input: {
rxlev: 12,
rsrp: 65535,
rssnr: 65535},
expect: {
signalStrength: -99,
relSignalStrength: 100}
},
// Valid rxlev with min value.
{input: {
rxlev: 0,
rsrp: 65535,
rssnr: 65535},
expect: {
signalStrength: -111,
relSignalStrength: 0}
}
];
// Run all test data.
(function do_call() {
let next = testData.shift();
if (!next) {
taskHelper.runNext();
return;
}
doTestLteSignalStrength(next.input, next.expect, do_call);
})();
// Reset Signal Strength Info to default
return promise.then(() => setEmulatorGsmSignalStrengthAndWait(DEFAULT_RSSI));
});
/* Reset Signal Strength Info to default, and finsih the test */
taskHelper.push(function testResetSignalStrengthInfo() {
// Reset emulator's signal strength and wait for 'onvoicechange' event.
function doResetSignalStrength(rssi) {
waitForVoiceChangeEvent(function() {
let voice = mobileConnection.voice;
is(voice.signalStrength, -99, "check voice.signalStrength");
is(voice.relSignalStrength, 44, "check voice.relSignalStrength");
taskHelper.runNext();
});
setEmulatorGsmSignalStrength(rssi);
}
// Emulator uses rssi = 7 as default value, and we need to reset it after
// finishing test in case other test cases need those values for testing.
doResetSignalStrength(7);
});
// Start test
taskHelper.runNext();

Просмотреть файл

@ -19,6 +19,24 @@ struct MutexData {
namespace mozilla {
static void
InitMutex(pthread_mutex_t* mMutex)
{
pthread_mutexattr_t mutexAttributes;
pthread_mutexattr_init(&mutexAttributes);
// Make the mutex reentrant so it behaves the same as a win32 mutex
if (pthread_mutexattr_settype(&mutexAttributes, PTHREAD_MUTEX_RECURSIVE)) {
MOZ_CRASH();
}
if (pthread_mutexattr_setpshared(&mutexAttributes, PTHREAD_PROCESS_SHARED)) {
MOZ_CRASH();
}
if (pthread_mutex_init(mMutex, &mutexAttributes)) {
MOZ_CRASH();
}
}
CrossProcessMutex::CrossProcessMutex(const char*)
: mSharedBuffer(nullptr)
, mMutex(nullptr)
@ -43,20 +61,7 @@ CrossProcessMutex::CrossProcessMutex(const char*)
mCount = &(data->mCount);
*mCount = 1;
pthread_mutexattr_t mutexAttributes;
pthread_mutexattr_init(&mutexAttributes);
// Make the mutex reentrant so it behaves the same as a win32 mutex
if (pthread_mutexattr_settype(&mutexAttributes, PTHREAD_MUTEX_RECURSIVE)) {
MOZ_CRASH();
}
if (pthread_mutexattr_setpshared(&mutexAttributes, PTHREAD_PROCESS_SHARED)) {
MOZ_CRASH();
}
if (pthread_mutex_init(mMutex, &mutexAttributes)) {
MOZ_CRASH();
}
InitMutex(mMutex);
MOZ_COUNT_CTOR(CrossProcessMutex);
}
@ -84,7 +89,13 @@ CrossProcessMutex::CrossProcessMutex(CrossProcessMutexHandle aHandle)
mMutex = &(data->mMutex);
mCount = &(data->mCount);
(*mCount)++;
int32_t count = (*mCount)++;
if (count == 0) {
// The other side has already let go of their CrossProcessMutex, so now
// mMutex is garbage. We need to re-initialize it.
InitMutex(mMutex);
}
MOZ_COUNT_CTOR(CrossProcessMutex);
}