зеркало из https://github.com/mozilla/gecko-dev.git
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:
Коммит
1ea076bea7
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче