--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,19 +10,19 @@
<!--original fetch url was git://codeaurora.org/-->
<remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
- <project name="gaia" path="gaia" remote="mozillaorg" revision="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<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="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- 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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,18 +14,18 @@
<!--original fetch url was git://github.com/apitrace/-->
<remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
<default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
<!-- Gonk specific things and forks -->
<project name="platform_build" path="build" remote="b2g" revision="84923f1940625c47ff4c1fdf01b10fde3b7d909e">
<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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia.git" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<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="c058843242068d0df7c107e09da31b53d2e08fa6"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,18 +12,18 @@
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="8986df0f82e15ac2798df0b6c2ee3435400677ac">
<copyfile dest="Makefile" src="core/root.mk"/>
</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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
<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="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,19 +10,19 @@
<!--original fetch url was git://codeaurora.org/-->
<remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
- <project name="gaia" path="gaia" remote="mozillaorg" revision="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<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="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- 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"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,18 +14,18 @@
<!--original fetch url was git://github.com/apitrace/-->
<remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
<default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
<!-- Gonk specific things and forks -->
<project name="platform_build" path="build" remote="b2g" revision="84923f1940625c47ff4c1fdf01b10fde3b7d909e">
<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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia.git" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<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="c058843242068d0df7c107e09da31b53d2e08fa6"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,19 +10,19 @@
<!--original fetch url was git://codeaurora.org/-->
<remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="3a2947df41a480de1457a6dcdbf46ad0af70d8e0">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
- <project name="gaia" path="gaia" remote="mozillaorg" revision="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<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="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- 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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
--- a/b2g/config/flame/sources.xml
+++ b/b2g/config/flame/sources.xml
@@ -12,18 +12,18 @@
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="8986df0f82e15ac2798df0b6c2ee3435400677ac">
<copyfile dest="Makefile" src="core/root.mk"/>
</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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="e95b4ce22c825da44d14299e1190ea39a5260bde"/>
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="471afab478649078ad7c75ec6b252481a59e19b8"/>
<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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
{
"git": {
"git_revision": "",
"remote": "",
"branch": ""
},
- "revision": "3adc8626bd88ae4a8782d2f478656e8d52d805c2",
+ "revision": "9d8c254abad2ceaad8f1ae22a18e0f36af5860c4",
"repo_path": "/integration/gaia-central"
}
--- a/b2g/config/hamachi/sources.xml
+++ b/b2g/config/hamachi/sources.xml
@@ -12,18 +12,18 @@
<!--original fetch url was git://github.com/apitrace/-->
<remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
<default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
<!-- Gonk specific things and forks -->
<project name="platform_build" path="build" remote="b2g" revision="84923f1940625c47ff4c1fdf01b10fde3b7d909e">
<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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia.git" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<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="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
<project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
<project name="platform/bootable/recovery" path="bootable/recovery" revision="746bc48f34f5060f90801925dcdd964030c1ab6d"/>
--- a/b2g/config/helix/sources.xml
+++ b/b2g/config/helix/sources.xml
@@ -10,18 +10,18 @@
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<default remote="caf" revision="b2g/ics_strawberry" sync-j="4"/>
<!-- Gonk specific things and forks -->
<project name="platform_build" path="build" remote="b2g" revision="84923f1940625c47ff4c1fdf01b10fde3b7d909e">
<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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia.git" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<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="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
<project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>
<project name="platform/bootable/recovery" path="bootable/recovery" revision="575fdbf046e966a5915b1f1e800e5d6ad0ea14c0"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,18 +12,18 @@
<!--original fetch url was https://git.mozilla.org/releases-->
<remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
<!-- B2G specific things. -->
<project name="platform_build" path="build" remote="b2g" revision="8986df0f82e15ac2798df0b6c2ee3435400677ac">
<copyfile dest="Makefile" src="core/root.mk"/>
</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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
<project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
<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="9025e50b9d29b3cabbbb21e1dd94d0d13121a17e"/>
--- a/b2g/config/wasabi/sources.xml
+++ b/b2g/config/wasabi/sources.xml
@@ -12,18 +12,18 @@
<!--original fetch url was git://github.com/apitrace/-->
<remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
<default remote="caf" revision="ics_chocolate_rb4.2" sync-j="4"/>
<!-- Gonk specific things and forks -->
<project name="platform_build" path="build" remote="b2g" revision="84923f1940625c47ff4c1fdf01b10fde3b7d909e">
<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="2665e714beea5dc433862ca6bb8d2b47ffe2f2d1"/>
- <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="5883a99b6528ced9dafaed8d3ca2405fb285537e"/>
+ <project name="gaia.git" path="gaia" remote="mozillaorg" revision="7b92615bdc97e5c675cd385ec68bc5e47e0c5288"/>
+ <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="a42f56ffac1c52e5bbc82143a949feeed359d528"/>
<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="562d357b72279a9e35d4af5aeecc8e1ffa2f44f1"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6ca2008ac50b163d31244ef9f036cb224f4f229b"/>
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
<project name="platform/bionic" path="bionic" revision="cd5dfce80bc3f0139a56b58aca633202ccaee7f8"/>
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -393,18 +393,17 @@ panel[noactions] > richlistbox > richlis
panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .ac-action-icon {
visibility: collapse;
}
panel[noactions] > richlistbox > richlistitem[type~="action"] > .ac-url-box > .ac-url > .ac-url-text {
visibility: visible;
}
-#urlbar:not([actiontype]) > #urlbar-display-box,
-#urlbar:not([actiontype="switchtab"]) > #urlbar-display-box > .urlbar-display-switchtab {
+#urlbar:not([actiontype="switchtab"]) > #urlbar-display-box {
display: none;
}
#PopupAutoComplete {
-moz-binding: url("chrome://browser/content/urlbarBindings.xml#browser-autocomplete-result-popup");
}
#PopupAutoCompleteRichResult {
--- a/browser/components/loop/GoogleImporter.jsm
+++ b/browser/components/loop/GoogleImporter.jsm
@@ -420,17 +420,17 @@ this.GoogleImporter.prototype = {
["locality", "city"],
["postalCode", "postcode"],
["region", "region"],
["streetAddress", "street"]
]), addressNode, kNS_GD);
if (Object.keys(adr).length) {
adr.pref = (addressNode.getAttribute("primary") == "true");
adr.type = [getFieldType(addressNode)];
- contacts.adr.push(adr);
+ contact.adr.push(adr);
}
}
}
// Process email addresses.
let emailNodes = entry.getElementsByTagNameNS(kNS_GD, "email");
if (emailNodes.length) {
contact.email = [];
--- a/browser/components/loop/ui/ui-showcase.js
+++ b/browser/components/loop/ui/ui-showcase.js
@@ -53,16 +53,23 @@
var stageFeedbackApiClient = new loop.FeedbackAPIClient(
"https://input.allizom.org/api/v1/feedback", {
product: "Loop"
}
);
// Local mocks
+ var mockContact = {
+ name: ["Mr Smith"],
+ email: [{
+ value: "smith@invalid.com"
+ }]
+ };
+
var mockClient = {
requestCallUrl: noop,
requestCallUrlInfo: noop
};
var mockSDK = {};
var mockConversationModel = new loop.shared.models.ConversationModel({}, {
@@ -249,17 +256,18 @@
)
)
),
Section({name: "PendingConversationView (Desktop)"},
Example({summary: "Connecting", dashed: "true",
style: {width: "260px", height: "265px"}},
React.DOM.div({className: "fx-embedded"},
- DesktopPendingConversationView({callState: "gather", calleeId: "Mr Smith"})
+ DesktopPendingConversationView({callState: "gather",
+ contact: mockContact})
)
)
),
Section({name: "CallFailedView"},
Example({summary: "Call Failed", dashed: "true",
style: {width: "260px", height: "265px"}},
React.DOM.div({className: "fx-embedded"},
--- a/browser/components/loop/ui/ui-showcase.jsx
+++ b/browser/components/loop/ui/ui-showcase.jsx
@@ -53,16 +53,23 @@
var stageFeedbackApiClient = new loop.FeedbackAPIClient(
"https://input.allizom.org/api/v1/feedback", {
product: "Loop"
}
);
// Local mocks
+ var mockContact = {
+ name: ["Mr Smith"],
+ email: [{
+ value: "smith@invalid.com"
+ }]
+ };
+
var mockClient = {
requestCallUrl: noop,
requestCallUrlInfo: noop
};
var mockSDK = {};
var mockConversationModel = new loop.shared.models.ConversationModel({}, {
@@ -249,17 +256,18 @@
</div>
</Example>
</Section>
<Section name="PendingConversationView (Desktop)">
<Example summary="Connecting" dashed="true"
style={{width: "260px", height: "265px"}}>
<div className="fx-embedded">
- <DesktopPendingConversationView callState={"gather"} calleeId="Mr Smith" />
+ <DesktopPendingConversationView callState={"gather"}
+ contact={mockContact} />
</div>
</Example>
</Section>
<Section name="CallFailedView">
<Example summary="Call Failed" dashed="true"
style={{width: "260px", height: "265px"}}>
<div className="fx-embedded">
--- a/dom/apps/Webapps.jsm
+++ b/dom/apps/Webapps.jsm
@@ -1823,16 +1823,20 @@ this.DOMApplicationRegistry = {
// aOldManifest can be null if we don't have any handler to unregister.
updateAppHandlers: function(aOldManifest, aNewManifest, aApp) {
debug("updateAppHandlers: old=" + aOldManifest + " new=" + aNewManifest);
this.notifyAppsRegistryStart();
if (aApp.appStatus >= Ci.nsIPrincipal.APP_STATUS_PRIVILEGED) {
aApp.redirects = this.sanitizeRedirects(aNewManifest.redirects);
}
+ let manifest =
+ new ManifestHelper(aNewManifest, aApp.origin, aApp.manifestURL);
+ this._saveWidgetsFullPath(manifest, aApp);
+
if (supportSystemMessages()) {
if (aOldManifest) {
this._unregisterActivities(aOldManifest, aApp);
}
this._registerSystemMessages(aNewManifest, aApp);
this._registerActivities(aNewManifest, aApp, true);
this._registerInterAppConnections(aNewManifest, aApp);
} else {
@@ -2166,17 +2170,16 @@ this.DOMApplicationRegistry = {
}, true);
}
this.updateDataStore(this.webapps[aId].localId, aApp.origin,
aApp.manifestURL, aApp.manifest);
aApp.name = aNewManifest.name;
aApp.csp = manifest.csp || "";
- this._saveWidgetsFullPath(manifest, aApp);
aApp.updateTime = Date.now();
}
// Update the registry.
this.webapps[aId] = aApp;
yield this._saveApps();
if ((aApp.kind !== this.kHostedAppcache &&
new file mode 100644
--- /dev/null
+++ b/dom/icc/Assertions.cpp
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "mozilla/dom/MozIccBinding.h"
+#include "nsIIccProvider.h"
+
+namespace mozilla {
+namespace dom {
+
+#define ASSERT_ICC_CARD_STATE_EQUALITY(webidlState, xpidlState) \
+ static_assert(static_cast<uint32_t>(IccCardState::webidlState) == nsIIccProvider::xpidlState, \
+ "IccCardState::" #webidlState " should equal to nsIIccProvider::" #xpidlState)
+
+ASSERT_ICC_CARD_STATE_EQUALITY(Unknown, CARD_STATE_UNKNOWN);
+ASSERT_ICC_CARD_STATE_EQUALITY(Ready, CARD_STATE_READY);
+ASSERT_ICC_CARD_STATE_EQUALITY(PinRequired, CARD_STATE_PIN_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(PukRequired, CARD_STATE_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(PermanentBlocked, CARD_STATE_PERMANENT_BLOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(PersonalizationInProgress, CARD_STATE_PERSONALIZATION_IN_PROGRESS);
+ASSERT_ICC_CARD_STATE_EQUALITY(PersonalizationReady, CARD_STATE_PERSONALIZATION_READY);
+ASSERT_ICC_CARD_STATE_EQUALITY(NetworkLocked, CARD_STATE_NETWORK_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(NetworkSubsetLocked, CARD_STATE_NETWORK_SUBSET_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(CorporateLocked, CARD_STATE_CORPORATE_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(ServiceProviderLocked, CARD_STATE_SERVICE_PROVIDER_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(SimPersonalizationLocked, CARD_STATE_SIM_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(NetworkPukRequired, CARD_STATE_NETWORK_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(NetworkSubsetPukRequired, CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(CorporatePukRequired, CARD_STATE_CORPORATE_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(ServiceProviderPukRequired, CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(SimPersonalizationPukRequired, CARD_STATE_SIM_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(Network1Locked, CARD_STATE_NETWORK1_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(Network2Locked, CARD_STATE_NETWORK2_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(HrpdNetworkLocked, CARD_STATE_HRPD_NETWORK_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimCorporateLocked, CARD_STATE_RUIM_CORPORATE_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimServiceProviderLocked, CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimPersonalizationLocked, CARD_STATE_RUIM_LOCKED);
+ASSERT_ICC_CARD_STATE_EQUALITY(Network1PukRequired, CARD_STATE_NETWORK1_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(Network2PukRequired, CARD_STATE_NETWORK2_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(HrpdNetworkPukRequired, CARD_STATE_HRPD_NETWORK_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimCorporatePukRequired, CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimServiceProviderPukRequired, CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(RuimPersonalizationPukRequired, CARD_STATE_RUIM_PUK_REQUIRED);
+ASSERT_ICC_CARD_STATE_EQUALITY(Illegal, CARD_STATE_ILLEGAL);
+
+#undef ASSERT_ICC_CARD_STATE_EQUALITY
+
+} // namespace dom
+} // namespace mozilla
--- a/dom/icc/Icc.cpp
+++ b/dom/icc/Icc.cpp
@@ -1,17 +1,16 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/Icc.h"
#include "mozilla/dom/DOMRequest.h"
#include "mozilla/dom/IccInfo.h"
-#include "mozilla/dom/MozIccBinding.h"
#include "mozilla/dom/MozStkCommandEvent.h"
#include "mozilla/dom/ScriptSettings.h"
#include "nsIIccInfo.h"
#include "nsIIccProvider.h"
#include "nsJSON.h"
#include "nsRadioInterfaceLayer.h"
#include "nsServiceManagerUtils.h"
@@ -131,29 +130,30 @@ Icc::WrapObject(JSContext* aCx)
// MozIcc WebIDL
void
Icc::GetIccInfo(Nullable<OwningMozIccInfoOrMozGsmIccInfoOrMozCdmaIccInfo>& aIccInfo) const
{
aIccInfo = mIccInfo;
}
-void
-Icc::GetCardState(nsString& aCardState) const
+Nullable<IccCardState>
+Icc::GetCardState() const
{
- aCardState.SetIsVoid(true);
+ Nullable<IccCardState> result;
- if (!mProvider) {
- return;
+ uint32_t cardState = nsIIccProvider::CARD_STATE_UNDETECTED;
+ if (mProvider &&
+ NS_SUCCEEDED(mProvider->GetCardState(mClientId, &cardState)) &&
+ cardState != nsIIccProvider::CARD_STATE_UNDETECTED) {
+ MOZ_ASSERT(cardState < static_cast<uint32_t>(IccCardState::EndGuard_));
+ result.SetValue(static_cast<IccCardState>(cardState));
}
- nsresult rv = mProvider->GetCardState(mClientId, aCardState);
- if (NS_FAILED(rv)) {
- aCardState.SetIsVoid(true);
- }
+ return result;
}
void
Icc::SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand,
JS::Handle<JS::Value> aResponse, ErrorResult& aRv)
{
if (!mProvider) {
aRv.Throw(NS_ERROR_FAILURE);
--- a/dom/icc/Icc.h
+++ b/dom/icc/Icc.h
@@ -1,15 +1,16 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef mozilla_dom_Icc_h
#define mozilla_dom_Icc_h
+#include "mozilla/dom/MozIccBinding.h" // For IccCardState
#include "mozilla/dom/UnionTypes.h"
#include "mozilla/DOMEventTargetHelper.h"
class nsIIccInfo;
class nsIIccProvider;
namespace mozilla {
namespace dom {
@@ -52,18 +53,18 @@ public:
// WrapperCache
virtual JSObject*
WrapObject(JSContext* aCx) MOZ_OVERRIDE;
// MozIcc WebIDL
void
GetIccInfo(Nullable<OwningMozIccInfoOrMozGsmIccInfoOrMozCdmaIccInfo>& aIccInfo) const;
- void
- GetCardState(nsString& aCardState) const;
+ Nullable<IccCardState>
+ GetCardState() const;
void
SendStkResponse(const JSContext* aCx, JS::Handle<JS::Value> aCommand,
JS::Handle<JS::Value> aResponse, ErrorResult& aRv);
void
SendStkMenuSelection(uint16_t aItemIdentifier, bool aHelpRequested,
ErrorResult& aRv);
--- a/dom/icc/interfaces/nsIIccProvider.idl
+++ b/dom/icc/interfaces/nsIIccProvider.idl
@@ -15,36 +15,72 @@ interface nsIIccListener : nsISupports
void notifyStkSessionEnd();
void notifyCardStateChanged();
void notifyIccInfoChanged();
};
/**
* XPCOM component (in the content process) that provides the ICC information.
*/
-[scriptable, uuid(1afa72d0-3d70-11e4-916c-0800200c9a66)]
+[scriptable, uuid(bf802bf0-4df2-11e4-916c-0800200c9a66)]
interface nsIIccProvider : nsISupports
{
+ // MUST match enum IccCardState in MozIcc.webidl!
+ const unsigned long CARD_STATE_UNKNOWN = 0;
+ const unsigned long CARD_STATE_READY = 1;
+ const unsigned long CARD_STATE_PIN_REQUIRED = 2;
+ const unsigned long CARD_STATE_PUK_REQUIRED = 3;
+ const unsigned long CARD_STATE_PERMANENT_BLOCKED = 4;
+ const unsigned long CARD_STATE_PERSONALIZATION_IN_PROGRESS = 5;
+ const unsigned long CARD_STATE_PERSONALIZATION_READY = 6;
+ const unsigned long CARD_STATE_NETWORK_LOCKED = 7;
+ const unsigned long CARD_STATE_NETWORK_SUBSET_LOCKED = 8;
+ const unsigned long CARD_STATE_CORPORATE_LOCKED = 9;
+ const unsigned long CARD_STATE_SERVICE_PROVIDER_LOCKED = 10;
+ const unsigned long CARD_STATE_SIM_LOCKED = 11;
+ const unsigned long CARD_STATE_NETWORK_PUK_REQUIRED = 12;
+ const unsigned long CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED = 13;
+ const unsigned long CARD_STATE_CORPORATE_PUK_REQUIRED = 14;
+ const unsigned long CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED = 15;
+ const unsigned long CARD_STATE_SIM_PUK_REQUIRED = 16;
+ const unsigned long CARD_STATE_NETWORK1_LOCKED = 17;
+ const unsigned long CARD_STATE_NETWORK2_LOCKED = 18;
+ const unsigned long CARD_STATE_HRPD_NETWORK_LOCKED = 19;
+ const unsigned long CARD_STATE_RUIM_CORPORATE_LOCKED = 20;
+ const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED = 21;
+ const unsigned long CARD_STATE_RUIM_LOCKED = 22;
+ const unsigned long CARD_STATE_NETWORK1_PUK_REQUIRED = 23;
+ const unsigned long CARD_STATE_NETWORK2_PUK_REQUIRED = 24;
+ const unsigned long CARD_STATE_HRPD_NETWORK_PUK_REQUIRED = 25;
+ const unsigned long CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED = 26;
+ const unsigned long CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = 27;
+ const unsigned long CARD_STATE_RUIM_PUK_REQUIRED = 28;
+ const unsigned long CARD_STATE_ILLEGAL = 29;
+
+ const unsigned long CARD_STATE_UNDETECTED = 4294967295; // UINT32_MAX
+
/**
* Called when a content process registers receiving unsolicited messages from
* RadioInterfaceLayer in the chrome process. Only a content process that has
* the 'mobileconnection' permission is allowed to register.
*/
void registerIccMsg(in unsigned long clientId, in nsIIccListener listener);
void unregisterIccMsg(in unsigned long clientId, in nsIIccListener listener);
/**
* UICC Information
*/
nsIIccInfo getIccInfo(in unsigned long clientId);
/**
* Card State
+ *
+ * One of the nsIIccProvider.CARD_STATE_* values.
*/
- DOMString getCardState(in unsigned long clientId);
+ unsigned long getCardState(in unsigned long clientId);
/**
* STK interfaces.
*/
void sendStkResponse(in unsigned long clientId,
in nsIDOMWindow window,
in jsval command,
in jsval response);
--- a/dom/icc/moz.build
+++ b/dom/icc/moz.build
@@ -8,16 +8,17 @@ DIRS += ['interfaces']
EXPORTS.mozilla.dom += [
'Icc.h',
'IccInfo.h',
'IccManager.h',
]
UNIFIED_SOURCES += [
+ 'Assertions.cpp',
'Icc.cpp',
"IccInfo.cpp",
'IccListener.cpp',
'IccManager.cpp',
]
FAIL_ON_WARNINGS = True
--- a/dom/mobilemessage/gonk/MmsService.js
+++ b/dom/mobilemessage/gonk/MmsService.js
@@ -415,17 +415,18 @@ MmsConnection.prototype = {
// MMS request and try to setup the MMS network first.
if (!this.connected) {
this.pendingCallbacks.push(callback);
let errorStatus;
if (getRadioDisabledState()) {
if (DEBUG) debug("Error! Radio is disabled when sending MMS.");
errorStatus = _HTTP_STATUS_RADIO_DISABLED;
- } else if (this.radioInterface.rilContext.cardState != "ready") {
+ } else if (this.radioInterface.rilContext.cardState !=
+ Ci.nsIIccProvider.CARD_STATE_READY) {
if (DEBUG) debug("Error! SIM card is not ready when sending MMS.");
errorStatus = _HTTP_STATUS_NO_SIM_CARD;
}
if (errorStatus != null) {
this.flushPendingCallbacks(errorStatus);
return true;
}
--- a/dom/system/gonk/MozMtpDatabase.cpp
+++ b/dom/system/gonk/MozMtpDatabase.cpp
@@ -262,42 +262,41 @@ MozMtpDatabase::FileWatcherUpdate(RefCou
aFile->mFile->GetPath(wideFilePath);
NS_ConvertUTF16toUTF8 filePath(wideFilePath);
nsCString evtType(aEventType);
MTP_LOG("file %s %s", filePath.get(), evtType.get());
MtpObjectHandle entryHandle = FindEntryByPath(filePath);
- if (aEventType.EqualsLiteral("created")) {
+ if (aEventType.EqualsLiteral("modified")) {
+ // To update the file information to the newest, we remove the entry for
+ // the existing file, then re-add the entry for the file.
if (entryHandle != 0) {
- // The entry already exists. This means that we're being notified
- // about a file added by MTP. So we can ignore it.
-
- return;
+ MTP_LOG("About to call sendObjectRemoved Handle 0x%08x file %s", entryHandle, filePath.get());
+ aMtpServer->sendObjectRemoved(entryHandle);
+ RemoveEntry(entryHandle);
}
entryHandle = CreateEntryForFile(filePath, aFile);
if (entryHandle == 0) {
- // CreateEntryForFile didn't create a new entry. We can't tell MTP.
+ // creating entry for the file failed, don't tell MTP
return;
}
MTP_LOG("About to call sendObjectAdded Handle 0x%08x file %s", entryHandle, filePath.get());
aMtpServer->sendObjectAdded(entryHandle);
return;
}
if (aEventType.EqualsLiteral("deleted")) {
if (entryHandle == 0) {
// The entry has already been removed. We can't tell MTP.
return;
}
-
MTP_LOG("About to call sendObjectRemoved Handle 0x%08x file %s", entryHandle, filePath.get());
aMtpServer->sendObjectRemoved(entryHandle);
-
RemoveEntry(entryHandle);
return;
}
}
nsCString
MozMtpDatabase::BaseName(const nsCString& path)
{
@@ -611,21 +610,17 @@ MozMtpDatabase::endSendObject(const char
MtpObjectFormat aFormat,
bool aSucceeded)
{
MTP_LOG("Handle: 0x%08x Path: '%s'", aHandle, aPath);
if (aSucceeded) {
RefPtr<DbEntry> entry = GetEntry(aHandle);
if (entry) {
- if (mBeginSendObjectCalled) {
- FileWatcherNotify(entry, "created");
- } else {
- FileWatcherNotify(entry, "modified");
- }
+ FileWatcherNotify(entry, "modified");
}
} else {
RemoveEntry(aHandle);
}
mBeginSendObjectCalled = false;
}
//virtual
--- a/dom/system/gonk/MozMtpServer.cpp
+++ b/dom/system/gonk/MozMtpServer.cpp
@@ -103,18 +103,19 @@ public:
MOZ_ASSERT(NS_IsMainThread());
if (strcmp(aTopic, "file-watcher-update")) {
// We're only interested in file-watcher-update events
return NS_OK;
}
NS_ConvertUTF16toUTF8 eventType(aData);
- if (!eventType.EqualsLiteral("created") && !eventType.EqualsLiteral("deleted")) {
- // MTP doesn't have a modified notification.
+ if (!eventType.EqualsLiteral("modified") && !eventType.EqualsLiteral("deleted")) {
+ // Bug 1074604: Needn't handle "created" event, once file operation
+ // finished, it would trigger "modified" event.
return NS_OK;
}
DeviceStorageFile* file = static_cast<DeviceStorageFile*>(aSubject);
file->Dump("file-watcher-update");
MTP_LOG("file-watcher-update: file %s %s",
NS_LossyConvertUTF16toASCII(file->mPath).get(),
eventType.get());
--- a/dom/system/gonk/RILContentHelper.js
+++ b/dom/system/gonk/RILContentHelper.js
@@ -154,18 +154,18 @@ function RILContentHelper() {
this.updateDebugFlag();
this.numClients = gNumRadioInterfaces;
if (DEBUG) debug("Number of clients: " + this.numClients);
this.rilContexts = [];
for (let clientId = 0; clientId < this.numClients; clientId++) {
this.rilContexts[clientId] = {
- cardState: RIL.GECKO_CARDSTATE_UNKNOWN,
- iccInfo: null
+ cardState: Ci.nsIIccProvider.CARD_STATE_UNKNOWN,
+ iccInfo: null
};
}
this.initDOMRequestHelper(/* aWindow */ null, RIL_IPC_MSG_NAMES);
this._windowsMap = [];
this._iccListeners = [];
Services.obs.addObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false);
--- a/dom/system/gonk/RadioInterfaceLayer.js
+++ b/dom/system/gonk/RadioInterfaceLayer.js
@@ -495,18 +495,18 @@ XPCOMUtils.defineLazyGetter(this, "gRadi
numCards++;
}
}
return numCards;
},
_isCardPresentAtClient: function(clientId) {
let cardState = _ril.getRadioInterface(clientId).rilContext.cardState;
- return cardState !== RIL.GECKO_CARDSTATE_UNDETECTED &&
- cardState !== RIL.GECKO_CARDSTATE_UNKNOWN;
+ return cardState !== Ci.nsIIccProvider.CARD_STATE_UNDETECTED &&
+ cardState !== Ci.nsIIccProvider.CARD_STATE_UNKNOWN;
},
_isRadioAbleToEnableAtClient: function(clientId, numCards) {
if (!RILQUIRKS_RADIO_OFF_WO_CARD) {
return true;
}
// We could only turn on the radio for clientId if
@@ -1795,17 +1795,17 @@ function RadioInterface(aClientId, aWork
this.workerMessenger = {
send: aWorkerMessenger.send.bind(aWorkerMessenger, aClientId),
sendWithIPCMessage:
aWorkerMessenger.sendWithIPCMessage.bind(aWorkerMessenger, aClientId),
};
aWorkerMessenger.registerClient(aClientId, this);
this.rilContext = {
- cardState: RIL.GECKO_CARDSTATE_UNKNOWN,
+ cardState: Ci.nsIIccProvider.CARD_STATE_UNKNOWN,
iccInfo: null,
imsi: null
};
this.operatorInfo = {};
let lock = gSettingsService.createLock();
@@ -3631,17 +3631,17 @@ RadioInterface.prototype = {
if (!PhoneNumberUtils.isPlainPhoneNumber(options.number)) {
if (DEBUG) this.debug("Error! Address is invalid when sending SMS: " +
options.number);
errorCode = Ci.nsIMobileMessageCallback.INVALID_ADDRESS_ERROR;
} else if (radioState == null ||
radioState == RIL.GECKO_RADIOSTATE_DISABLED) {
if (DEBUG) this.debug("Error! Radio is disabled when sending SMS.");
errorCode = Ci.nsIMobileMessageCallback.RADIO_DISABLED_ERROR;
- } else if (this.rilContext.cardState != "ready") {
+ } else if (this.rilContext.cardState != Ci.nsIIccProvider.CARD_STATE_READY) {
if (DEBUG) this.debug("Error! SIM card is not ready when sending SMS.");
errorCode = Ci.nsIMobileMessageCallback.NO_SIM_CARD_ERROR;
}
if (errorCode) {
if (silent) {
request.notifySendMessageFailed(errorCode, domMessage);
return;
}
--- a/dom/system/gonk/nsIRadioInterfaceLayer.idl
+++ b/dom/system/gonk/nsIRadioInterfaceLayer.idl
@@ -18,20 +18,23 @@ interface nsIRilNetworkInterface : nsINe
readonly attribute DOMString iccId;
/* The following attributes are for MMS proxy settings. */
readonly attribute DOMString mmsc; // Empty string if not set.
readonly attribute DOMString mmsProxy; // Empty string if not set.
readonly attribute long mmsPort; // -1 if not set.
};
-[scriptable, uuid(08a69c70-34b1-11e4-8c21-0800200c9a66)]
+[scriptable, uuid(4441e660-4ad0-11e4-916c-0800200c9a66)]
interface nsIRilContext : nsISupports
{
- readonly attribute DOMString cardState;
+ /**
+ * One of the nsIIccProvider.CARD_STATE_* values.
+ */
+ readonly attribute unsigned long cardState;
readonly attribute DOMString imsi;
readonly attribute nsIIccInfo iccInfo;
};
[scriptable, function, uuid(3bc96351-53b0-47a1-a888-c74c64b60f25)]
interface nsIRilSendWorkerMessageCallback : nsISupports
--- a/dom/system/gonk/ril_consts.js
+++ b/dom/system/gonk/ril_consts.js
@@ -2487,48 +2487,50 @@ this.CALL_FAIL_ERROR_UNSPECIFIED = 0xfff
// Other Gecko-specific constants
this.GECKO_RADIOSTATE_UNKNOWN = null;
this.GECKO_RADIOSTATE_ENABLING = "enabling";
this.GECKO_RADIOSTATE_ENABLED = "enabled";
this.GECKO_RADIOSTATE_DISABLING = "disabling";
this.GECKO_RADIOSTATE_DISABLED = "disabled";
-this.GECKO_CARDSTATE_UNINITIALIZED = "uninitialized";
-this.GECKO_CARDSTATE_UNDETECTED = null;
-this.GECKO_CARDSTATE_ILLEGAL = "illegal";
-this.GECKO_CARDSTATE_UNKNOWN = "unknown";
-this.GECKO_CARDSTATE_PIN_REQUIRED = "pinRequired";
-this.GECKO_CARDSTATE_PUK_REQUIRED = "pukRequired";
-this.GECKO_CARDSTATE_PERSONALIZATION_IN_PROGRESS = "personalizationInProgress";
-this.GECKO_CARDSTATE_PERSONALIZATION_READY = "personalizationReady";
-this.GECKO_CARDSTATE_NETWORK_LOCKED = "networkLocked";
-this.GECKO_CARDSTATE_NETWORK_SUBSET_LOCKED = "networkSubsetLocked";
-this.GECKO_CARDSTATE_NETWORK1_LOCKED = "network1Locked";
-this.GECKO_CARDSTATE_NETWORK2_LOCKED = "network2Locked";
-this.GECKO_CARDSTATE_HRPD_NETWORK_LOCKED = "hrpdNetworkLocked";
-this.GECKO_CARDSTATE_CORPORATE_LOCKED = "corporateLocked";
-this.GECKO_CARDSTATE_SERVICE_PROVIDER_LOCKED = "serviceProviderLocked";
-this.GECKO_CARDSTATE_SIM_LOCKED = "simPersonalizationLock";
-this.GECKO_CARDSTATE_RUIM_CORPORATE_LOCKED = "ruimCorporateLocked";
-this.GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_LOCKED = "ruimServiceProviderLocked";
-this.GECKO_CARDSTATE_RUIM_LOCKED = "ruimPersonalizationLock";
-this.GECKO_CARDSTATE_NETWORK_PUK_REQUIRED = "networkPukRequired";
-this.GECKO_CARDSTATE_NETWORK_SUBSET_PUK_REQUIRED = "networkSubsetPukRequired";
-this.GECKO_CARDSTATE_NETWORK1_PUK_REQUIRED = "network1PukRequired";
-this.GECKO_CARDSTATE_NETWORK2_PUK_REQUIRED = "network2PukRequired";
-this.GECKO_CARDSTATE_HRPD_NETWORK_PUK_REQUIRED = "hrpdNetworkPukRequired";
-this.GECKO_CARDSTATE_CORPORATE_PUK_REQUIRED = "corporatePukRequired";
-this.GECKO_CARDSTATE_SERVICE_PROVIDER_PUK_REQUIRED = "serviceProviderPukRequired";
-this.GECKO_CARDSTATE_SIM_PUK_REQUIRED = "simPersonalizationPukRequired";
-this.GECKO_CARDSTATE_RUIM_CORPORATE_PUK_REQUIRED = "ruimCorporatePukRequired";
-this.GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = "ruimServiceProviderPukRequired";
-this.GECKO_CARDSTATE_RUIM_PUK_REQUIRED = "ruimPersonalizationPukRequired";
-this.GECKO_CARDSTATE_READY = "ready";
-this.GECKO_CARDSTATE_PERMANENT_BLOCKED = "permanentBlocked";
+// Only used in ril_worker.js
+this.GECKO_CARDSTATE_UNINITIALIZED = 4294967294; // UINT32_MAX - 1
+// See nsIIccProvider::CARD_STATE_*
+this.GECKO_CARDSTATE_UNDETECTED = 4294967295; // UINT32_MAX
+this.GECKO_CARDSTATE_UNKNOWN = 0;
+this.GECKO_CARDSTATE_READY = 1;
+this.GECKO_CARDSTATE_PIN_REQUIRED = 2;
+this.GECKO_CARDSTATE_PUK_REQUIRED = 3;
+this.GECKO_CARDSTATE_PERMANENT_BLOCKED = 4;
+this.GECKO_CARDSTATE_PERSONALIZATION_IN_PROGRESS = 5;
+this.GECKO_CARDSTATE_PERSONALIZATION_READY = 6;
+this.GECKO_CARDSTATE_NETWORK_LOCKED = 7;
+this.GECKO_CARDSTATE_NETWORK_SUBSET_LOCKED = 8;
+this.GECKO_CARDSTATE_CORPORATE_LOCKED = 9;
+this.GECKO_CARDSTATE_SERVICE_PROVIDER_LOCKED = 10;
+this.GECKO_CARDSTATE_SIM_LOCKED = 11;
+this.GECKO_CARDSTATE_NETWORK_PUK_REQUIRED = 12;
+this.GECKO_CARDSTATE_NETWORK_SUBSET_PUK_REQUIRED = 13;
+this.GECKO_CARDSTATE_CORPORATE_PUK_REQUIRED = 14;
+this.GECKO_CARDSTATE_SERVICE_PROVIDER_PUK_REQUIRED = 15;
+this.GECKO_CARDSTATE_SIM_PUK_REQUIRED = 16;
+this.GECKO_CARDSTATE_NETWORK1_LOCKED = 17;
+this.GECKO_CARDSTATE_NETWORK2_LOCKED = 18;
+this.GECKO_CARDSTATE_HRPD_NETWORK_LOCKED = 19;
+this.GECKO_CARDSTATE_RUIM_CORPORATE_LOCKED = 20;
+this.GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_LOCKED = 21;
+this.GECKO_CARDSTATE_RUIM_LOCKED = 22;
+this.GECKO_CARDSTATE_NETWORK1_PUK_REQUIRED = 23;
+this.GECKO_CARDSTATE_NETWORK2_PUK_REQUIRED = 24;
+this.GECKO_CARDSTATE_HRPD_NETWORK_PUK_REQUIRED = 25;
+this.GECKO_CARDSTATE_RUIM_CORPORATE_PUK_REQUIRED = 26;
+this.GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED = 27;
+this.GECKO_CARDSTATE_RUIM_PUK_REQUIRED = 28;
+this.GECKO_CARDSTATE_ILLEGAL = 29;
this.GECKO_CARDLOCK_PIN = "pin";
this.GECKO_CARDLOCK_PIN2 = "pin2";
this.GECKO_CARDLOCK_PUK = "puk";
this.GECKO_CARDLOCK_PUK2 = "puk2";
this.GECKO_CARDLOCK_FDN = "fdn";
this.GECKO_CARDLOCK_NCK = "nck";
this.GECKO_CARDLOCK_NCK1 = "nck1";
@@ -2556,16 +2558,17 @@ PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_NE
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET] = GECKO_CARDSTATE_NETWORK_SUBSET_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_CORPORATE] = GECKO_CARDSTATE_CORPORATE_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER] = GECKO_CARDSTATE_SERVICE_PROVIDER_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_SIM] = GECKO_CARDSTATE_SIM_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_NETWORK_PUK] = GECKO_CARDSTATE_NETWORK_PUK_REQUIRED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK] = GECKO_CARDSTATE_NETWORK_SUBSET_PUK_REQUIRED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_CORPORATE_PUK] = GECKO_CARDSTATE_CORPORATE_PUK_REQUIRED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK] = GECKO_CARDSTATE_SERVICE_PROVIDER_PUK_REQUIRED;
+PERSONSUBSTATE[CARD_PERSOSUBSTATE_SIM_SIM_PUK] = GECKO_CARDSTATE_SIM_PUK_REQUIRED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_NETWORK1] = GECKO_CARDSTATE_NETWORK1_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_NETWORK2] = GECKO_CARDSTATE_NETWORK2_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_HRPD] = GECKO_CARDSTATE_HRPD_NETWORK_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_CORPORATE] = GECKO_CARDSTATE_RUIM_CORPORATE_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER] = GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_RUIM] = GECKO_CARDSTATE_RUIM_LOCKED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_NETWORK1_PUK] = GECKO_CARDSTATE_NETWORK1_PUK_REQUIRED;
PERSONSUBSTATE[CARD_PERSOSUBSTATE_RUIM_NETWORK2_PUK] = GECKO_CARDSTATE_NETWORK2_PUK_REQUIRED;
--- a/dom/system/gonk/tests/test_ril_worker_icc_CardState.js
+++ b/dom/system/gonk/tests/test_ril_worker_icc_CardState.js
@@ -28,55 +28,75 @@ add_test(function test_personalization_s
ril._isCdma = isCdma;
ril._processICCStatus(iccStatus);
do_check_eq(ril.cardState, geckoCardState);
}
// Test GSM personalization state.
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK,
- GECKO_CARDSTATE_NETWORK_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK_LOCKED);
+ testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET,
+ Ci.nsIIccProvider.CARD_STATE_NETWORK_SUBSET_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_CORPORATE,
- GECKO_CARDSTATE_CORPORATE_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_CORPORATE_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER,
- GECKO_CARDSTATE_SERVICE_PROVIDER_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_SERVICE_PROVIDER_LOCKED);
+ testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SIM,
+ Ci.nsIIccProvider.CARD_STATE_SIM_LOCKED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_PUK,
- GECKO_CARDSTATE_NETWORK_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK_PUK_REQUIRED);
+ testPersonalization(false, CARD_PERSOSUBSTATE_SIM_NETWORK_SUBSET_PUK,
+ Ci.nsIIccProvider.CARD_STATE_NETWORK_SUBSET_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_CORPORATE_PUK,
- GECKO_CARDSTATE_CORPORATE_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_CORPORATE_PUK_REQUIRED);
testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SERVICE_PROVIDER_PUK,
- GECKO_CARDSTATE_SERVICE_PROVIDER_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_SERVICE_PROVIDER_PUK_REQUIRED);
+ testPersonalization(false, CARD_PERSOSUBSTATE_SIM_SIM_PUK,
+ Ci.nsIIccProvider.CARD_STATE_SIM_PUK_REQUIRED);
+
+ testPersonalization(false, CARD_PERSOSUBSTATE_UNKNOWN,
+ Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
+ testPersonalization(false, CARD_PERSOSUBSTATE_IN_PROGRESS,
+ Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
testPersonalization(false, CARD_PERSOSUBSTATE_READY,
- GECKO_CARDSTATE_PERSONALIZATION_READY);
+ Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_READY);
// Test CDMA personalization state.
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK1,
- GECKO_CARDSTATE_NETWORK1_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK1_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK2,
- GECKO_CARDSTATE_NETWORK2_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK2_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_HRPD,
- GECKO_CARDSTATE_HRPD_NETWORK_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_HRPD_NETWORK_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_CORPORATE,
- GECKO_CARDSTATE_RUIM_CORPORATE_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_CORPORATE_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER,
- GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_SERVICE_PROVIDER_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_RUIM,
- GECKO_CARDSTATE_RUIM_LOCKED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_LOCKED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK1_PUK,
- GECKO_CARDSTATE_NETWORK1_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK1_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_NETWORK2_PUK,
- GECKO_CARDSTATE_NETWORK2_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_NETWORK2_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_HRPD_PUK,
- GECKO_CARDSTATE_HRPD_NETWORK_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_HRPD_NETWORK_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_CORPORATE_PUK,
- GECKO_CARDSTATE_RUIM_CORPORATE_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_CORPORATE_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_SERVICE_PROVIDER_PUK,
- GECKO_CARDSTATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_SERVICE_PROVIDER_PUK_REQUIRED);
testPersonalization(true, CARD_PERSOSUBSTATE_RUIM_RUIM_PUK,
- GECKO_CARDSTATE_RUIM_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_RUIM_PUK_REQUIRED);
+
+ testPersonalization(true, CARD_PERSOSUBSTATE_UNKNOWN,
+ Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
+ testPersonalization(true, CARD_PERSOSUBSTATE_IN_PROGRESS,
+ Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_IN_PROGRESS);
+ testPersonalization(true, CARD_PERSOSUBSTATE_READY,
+ Ci.nsIIccProvider.CARD_STATE_PERSONALIZATION_READY);
run_next_test();
});
/**
* Verify SIM app_state in _processICCStatus
*/
add_test(function test_card_app_state() {
@@ -96,27 +116,27 @@ add_test(function test_card_app_state()
}],
};
ril._processICCStatus(iccStatus);
do_check_eq(ril.cardState, geckoCardState);
}
testCardAppState(CARD_APPSTATE_ILLEGAL,
- GECKO_CARDSTATE_ILLEGAL);
+ Ci.nsIIccProvider.CARD_STATE_ILLEGAL);
testCardAppState(CARD_APPSTATE_PIN,
- GECKO_CARDSTATE_PIN_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_PIN_REQUIRED);
testCardAppState(CARD_APPSTATE_PUK,
- GECKO_CARDSTATE_PUK_REQUIRED);
+ Ci.nsIIccProvider.CARD_STATE_PUK_REQUIRED);
testCardAppState(CARD_APPSTATE_READY,
- GECKO_CARDSTATE_READY);
+ Ci.nsIIccProvider.CARD_STATE_READY);
testCardAppState(CARD_APPSTATE_UNKNOWN,
- GECKO_CARDSTATE_UNKNOWN);
+ Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
testCardAppState(CARD_APPSTATE_DETECTED,
- GECKO_CARDSTATE_UNKNOWN);
+ Ci.nsIIccProvider.CARD_STATE_UNKNOWN);
run_next_test();
});
/**
* Verify permanent blocked for ICC.
*/
add_test(function test_icc_permanent_blocked() {
@@ -134,17 +154,17 @@ add_test(function test_icc_permanent_blo
apps: [
{
pin1_replaced: pin1_replaced,
pin1: pin1
}]
};
ril._processICCStatus(iccStatus);
- do_check_eq(ril.cardState, GECKO_CARDSTATE_PERMANENT_BLOCKED);
+ do_check_eq(ril.cardState, Ci.nsIIccProvider.CARD_STATE_PERMANENT_BLOCKED);
}
testPermanentBlocked(1,
CARD_PINSTATE_ENABLED_PERM_BLOCKED,
CARD_PINSTATE_UNKNOWN);
testPermanentBlocked(1,
CARD_PINSTATE_ENABLED_PERM_BLOCKED,
CARD_PINSTATE_ENABLED_PERM_BLOCKED);
--- a/dom/webidl/MozIcc.webidl
+++ b/dom/webidl/MozIcc.webidl
@@ -1,12 +1,59 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
+enum IccCardState {
+ "unknown", // ICC card state is either not yet reported from modem or in an
+ // unknown state.
+ "ready",
+ "pinRequired",
+ "pukRequired",
+ "permanentBlocked",
+
+ /**
+ * Personalization States
+ */
+ "personalizationInProgress",
+ "personalizationReady",
+
+ // SIM Personalization States.
+ "networkLocked",
+ "networkSubsetLocked",
+ "corporateLocked",
+ "serviceProviderLocked",
+ "simPersonalizationLocked",
+ "networkPukRequired",
+ "networkSubsetPukRequired",
+ "corporatePukRequired",
+ "serviceProviderPukRequired",
+ "simPersonalizationPukRequired",
+
+ // RUIM Personalization States.
+ "network1Locked",
+ "network2Locked",
+ "hrpdNetworkLocked",
+ "ruimCorporateLocked",
+ "ruimServiceProviderLocked",
+ "ruimPersonalizationLocked",
+ "network1PukRequired",
+ "network2PukRequired",
+ "hrpdNetworkPukRequired",
+ "ruimCorporatePukRequired",
+ "ruimServiceProviderPukRequired",
+ "ruimPersonalizationPukRequired",
+
+ /**
+ * Additional States.
+ */
+ "illegal" // See Bug 916000. An owed pay card will be rejected by the network
+ // and fall in this state.
+};
+
[Pref="dom.icc.enabled"]
interface MozIcc : EventTarget
{
// Integrated Circuit Card Information.
/**
* Information stored in the device's ICC.
*
@@ -22,31 +69,21 @@ interface MozIcc : EventTarget
*/
attribute EventHandler oniccinfochange;
// Integrated Circuit Card State.
/**
* Indicates the state of the device's ICC.
*
- * Possible values: 'illegal', 'unknown', 'pinRequired', 'pukRequired',
- * 'personalizationInProgress', 'networkLocked', 'network1Locked',
- * 'network2Locked', 'hrpdNetworkLocked', 'corporateLocked',
- * 'serviceProviderLocked', 'ruimCorporateLocked', 'ruimServiceProviderLocked',
- * 'networkPukRequired', 'network1PukRequired', 'network2PukRequired',
- * 'hrpdNetworkPukRequired', 'corporatePukRequired',
- * 'serviceProviderPukRequired', 'ruimCorporatePukRequired',
- * 'ruimServiceProviderPukRequired', 'personalizationReady', 'ready',
- * 'permanentBlocked'.
- *
* Once the ICC becomes undetectable, cardstatechange event will be notified.
* Also, the attribute is set to null and this MozIcc object becomes invalid.
* Calling asynchronous functions raises exception then.
*/
- readonly attribute DOMString? cardState;
+ readonly attribute IccCardState? cardState;
/**
* The 'cardstatechange' event is notified when the 'cardState' attribute
* changes value.
*/
attribute EventHandler oncardstatechange;
// Integrated Circuit Card STK.
--- a/mobile/android/base/BrowserApp.java
+++ b/mobile/android/base/BrowserApp.java
@@ -186,17 +186,17 @@ public class BrowserApp extends GeckoApp
public boolean checkable;
public boolean checked;
public boolean enabled = true;
public boolean visible = true;
public int parent;
public boolean added; // So we can re-add after a locale change.
}
- // The types of guest mdoe dialogs we show
+ // The types of guest mode dialogs we show.
public static enum GuestModeDialog {
ENTERING,
LEAVING
}
private Vector<MenuItemInfo> mAddonMenuItemsCache;
private PropertyAnimator mMainLayoutAnimator;
@@ -515,21 +515,22 @@ public class BrowserApp extends GeckoApp
}).execute();
}
@Override
public void onCreate(Bundle savedInstanceState) {
mAboutHomeStartupTimer = new Telemetry.UptimeTimer("FENNEC_STARTUP_TIME_ABOUTHOME");
final Intent intent = getIntent();
- final String args = intent.getStringExtra("args");
-
- if (GuestSession.shouldUse(this, args)) {
- mProfile = GeckoProfile.createGuestProfile(this);
- } else {
+ final GeckoProfile p = GeckoProfile.get(this);
+ if (p != null && !p.inGuestMode()) {
+ // This is *only* valid because we never want to use the guest mode
+ // profile concurrently with a normal profile -- no syncing to it,
+ // no dual-profile usage, nothing. BrowserApp startup with a conventional
+ // GeckoProfile will cause the guest profile to be deleted.
GeckoProfile.maybeCleanupGuestProfile(this);
}
// This has to be prepared prior to calling GeckoApp.onCreate, because
// widget code and BrowserToolbar need it, and they're created by the
// layout, which GeckoApp takes care of.
((GeckoApplication) getApplication()).prepareLightweightTheme();
super.onCreate(savedInstanceState);
@@ -668,23 +669,16 @@ public class BrowserApp extends GeckoApp
if (mediaManagerClass != null) {
try {
Method init = mediaManagerClass.getMethod("init", Context.class);
init.invoke(null, this);
} catch(Exception ex) {
Log.e(LOGTAG, "Error initializing media manager", ex);
}
}
-
- if (getProfile().inGuestMode()) {
- GuestSession.showNotification(this);
- } else {
- // If we're restarting, we won't destroy the activity. Make sure we remove any guest notifications that might have been shown.
- GuestSession.hideNotification(this);
- }
}
private void setupSystemUITinting() {
if (!Versions.feature19Plus) {
return;
}
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
@@ -786,16 +780,45 @@ public class BrowserApp extends GeckoApp
EventDispatcher.getInstance().registerGeckoThreadListener((GeckoEventListener)this,
"Prompt:ShowTop");
final LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
lbm.unregisterReceiver(mOnboardingReceiver);
}
@Override
+ public void onStart() {
+ super.onStart();
+
+ // Queue this work so that the first launch of the activity doesn't
+ // trigger profile init too early.
+ ThreadUtils.postToBackgroundThread(new Runnable() {
+ @Override
+ public void run() {
+ if (getProfile().inGuestMode()) {
+ GuestSession.showNotification(BrowserApp.this);
+ } else {
+ // If we're restarting, we won't destroy the activity.
+ // Make sure we remove any guest notifications that might
+ // have been shown.
+ GuestSession.hideNotification(BrowserApp.this);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void onStop() {
+ super.onStop();
+
+ // We only show the guest mode notification when our activity is in the foreground.
+ GuestSession.hideNotification(this);
+ }
+
+ @Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// If Home Page is visible, the layerView surface has to be visible
// to avoid a surface issue in Gingerbread phones.
// We need to do this on the next iteration.
// See bugs: 1058027 and 1003123
if (mInitialized && hasFocus &&
Versions.preHC && isHomePagerVisible() &&
@@ -1082,18 +1105,16 @@ public class BrowserApp extends GeckoApp
mOrderedBroadcastHelper = null;
}
if (mBrowserHealthReporter != null) {
mBrowserHealthReporter.uninit();
mBrowserHealthReporter = null;
}
- GuestSession.onDestroy(this);
-
EventDispatcher.getInstance().unregisterGeckoThreadListener((GeckoEventListener)this,
"Menu:Update",
"Reader:Added",
"Reader:FaviconRequest",
"Search:Keyword",
"Prompt:ShowTop",
"Accounts:Exist");
@@ -2934,16 +2955,19 @@ public class BrowserApp extends GeckoApp
try {
int itemId = new JSONObject(result).getInt("button");
if (itemId == 0) {
String args = "";
if (type == GuestModeDialog.ENTERING) {
args = GUEST_BROWSING_ARG;
} else {
GeckoProfile.leaveGuestSession(BrowserApp.this);
+
+ // Now's a good time to make sure we're not displaying the Guest Browsing notification.
+ GuestSession.hideNotification(BrowserApp.this);
}
if (!GuestSession.isSecureKeyguardLocked(BrowserApp.this)) {
doRestart(args);
} else {
// If the secure keyguard is up, we don't want to restart.
// Just clear the guest profile data.
GeckoProfile.maybeCleanupGuestProfile(BrowserApp.this);
--- a/mobile/android/base/ChromeCast.java
+++ b/mobile/android/base/ChromeCast.java
@@ -188,17 +188,18 @@ class ChromeCast implements GeckoMediaPl
public void onApplicationDisconnected(int errorCode) { }
});
apiClient = new GoogleApiClient.Builder(context)
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle connectionHint) {
- if (!apiClient.isConnected()) {
+ // Sometimes apiClient is null here. See bug 1061032
+ if (apiClient != null && !apiClient.isConnected()) {
debug("Connection failed");
callback.sendError("Not connected");
return;
}
// Launch the media player app and launch this url once its loaded
try {
Cast.CastApi.launchApplication(apiClient, CastMediaControlIntent.DEFAULT_MEDIA_RECEIVER_APPLICATION_ID, true)
@@ -248,80 +249,95 @@ class ChromeCast implements GeckoMediaPl
return true;
}
public void play(final EventCallback callback) {
if (!verifySession(callback)) {
return;
}
- remoteMediaPlayer.play(apiClient).setResultCallback(new ResultCallback<MediaChannelResult>() {
- @Override
- public void onResult(MediaChannelResult result) {
- Status status = result.getStatus();
- if (!status.isSuccess()) {
- debug("Unable to play: " + status.getStatusCode());
- callback.sendError(status.toString());
- } else {
- callback.sendSuccess(null);
+ try {
+ remoteMediaPlayer.play(apiClient).setResultCallback(new ResultCallback<MediaChannelResult>() {
+ @Override
+ public void onResult(MediaChannelResult result) {
+ Status status = result.getStatus();
+ if (!status.isSuccess()) {
+ debug("Unable to play: " + status.getStatusCode());
+ callback.sendError(status.toString());
+ } else {
+ callback.sendSuccess(null);
+ }
}
- }
- });
+ });
+ } catch(IllegalStateException ex) {
+ // The media player may throw if the session has been killed. For now, we're just catching this here.
+ callback.sendError("Error playing");
+ }
}
public void pause(final EventCallback callback) {
if (!verifySession(callback)) {
return;
}
- remoteMediaPlayer.pause(apiClient).setResultCallback(new ResultCallback<MediaChannelResult>() {
- @Override
- public void onResult(MediaChannelResult result) {
- Status status = result.getStatus();
- if (!status.isSuccess()) {
- debug("Unable to pause: " + status.getStatusCode());
- callback.sendError(status.toString());
- } else {
- callback.sendSuccess(null);
+ try {
+ remoteMediaPlayer.pause(apiClient).setResultCallback(new ResultCallback<MediaChannelResult>() {
+ @Override
+ public void onResult(MediaChannelResult result) {
+ Status status = result.getStatus();
+ if (!status.isSuccess()) {
+ debug("Unable to pause: " + status.getStatusCode());
+ callback.sendError(status.toString());
+ } else {
+ callback.sendSuccess(null);
+ }
}
- }
- });
+ });
+ } catch(IllegalStateException ex) {
+ // The media player may throw if the session has been killed. For now, we're just catching this here.
+ callback.sendError("Error pausing");
+ }
}
public void end(final EventCallback callback) {
if (!verifySession(callback)) {
return;
}
- Cast.CastApi.stopApplication(apiClient).setResultCallback(new ResultCallback<Status>() {
- @Override
- public void onResult(Status result) {
- if (result.isSuccess()) {
- try {
- Cast.CastApi.removeMessageReceivedCallbacks(apiClient, remoteMediaPlayer.getNamespace());
- remoteMediaPlayer = null;
- mSessionId = null;
- apiClient.disconnect();
- apiClient = null;
+ try {
+ Cast.CastApi.stopApplication(apiClient).setResultCallback(new ResultCallback<Status>() {
+ @Override
+ public void onResult(Status result) {
+ if (result.isSuccess()) {
+ try {
+ Cast.CastApi.removeMessageReceivedCallbacks(apiClient, remoteMediaPlayer.getNamespace());
+ remoteMediaPlayer = null;
+ mSessionId = null;
+ apiClient.disconnect();
+ apiClient = null;
- if (callback != null) {
- callback.sendSuccess(null);
- }
+ if (callback != null) {
+ callback.sendSuccess(null);
+ }
- return;
- } catch(Exception ex) {
- debug("Error ending", ex);
+ return;
+ } catch(Exception ex) {
+ debug("Error ending", ex);
+ }
+ }
+
+ if (callback != null) {
+ callback.sendError(result.getStatus().toString());
}
}
-
- if (callback != null) {
- callback.sendError(result.getStatus().toString());
- }
- }
- });
+ });
+ } catch(IllegalStateException ex) {
+ // The media player may throw if the session has been killed. For now, we're just catching this here.
+ callback.sendError("Error stopping");
+ }
}
class MirrorChannel implements MessageReceivedCallback {
/**
* @return custom namespace
*/
public String getNamespace() {
return "urn:x-cast:org.mozilla.mirror";
@@ -408,17 +424,18 @@ class ChromeCast implements GeckoMediaPl
public void onApplicationDisconnected(int errorCode) { }
});
apiClient = new GoogleApiClient.Builder(context)
.addApi(Cast.API, apiOptionsBuilder.build())
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle connectionHint) {
- if (!apiClient.isConnected()) {
+ // Sometimes apiClient is null here. See bug 1061032
+ if (apiClient == null || !apiClient.isConnected()) {
return;
}
// Launch the media player app and launch this url once its loaded
try {
Cast.CastApi.launchApplication(apiClient, MIRROR_RECIEVER_APP_ID, true)
.setResultCallback(new MirrorCallback(callback));
} catch (Exception e) {
--- a/mobile/android/base/GeckoApp.java
+++ b/mobile/android/base/GeckoApp.java
@@ -4,17 +4,16 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
@@ -40,17 +39,16 @@ import org.mozilla.gecko.health.SessionI
import org.mozilla.gecko.health.StubbedHealthRecorder;
import org.mozilla.gecko.menu.GeckoMenu;
import org.mozilla.gecko.menu.GeckoMenuInflater;
import org.mozilla.gecko.menu.MenuPanel;
import org.mozilla.gecko.mozglue.GeckoLoader;
import org.mozilla.gecko.preferences.ClearOnShutdownPref;
import org.mozilla.gecko.preferences.GeckoPreferences;
import org.mozilla.gecko.prompts.PromptService;
-import org.mozilla.gecko.SmsManager;
import org.mozilla.gecko.updater.UpdateService;
import org.mozilla.gecko.updater.UpdateServiceHelper;
import org.mozilla.gecko.util.ActivityResultHandler;
import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.FileUtils;
import org.mozilla.gecko.util.GeckoEventListener;
import org.mozilla.gecko.util.HardwareUtils;
import org.mozilla.gecko.util.NativeEventListener;
@@ -438,16 +436,19 @@ public abstract class GeckoApp
}
return super.onMenuOpened(featureId, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.quit) {
+ // Make sure the Guest Browsing notification goes away when we quit.
+ GuestSession.hideNotification(this);
+
if (GeckoThread.checkAndSetLaunchState(GeckoThread.LaunchState.GeckoRunning, GeckoThread.LaunchState.GeckoExiting)) {
final SharedPreferences prefs = GeckoSharedPrefs.forProfile(this);
final Set<String> clearSet = PrefUtils.getStringSet(prefs, ClearOnShutdownPref.PREF, new HashSet<String>());
final JSONObject clearObj = new JSONObject();
for (String clear : clearSet) {
try {
clearObj.put(clear, true);
--- a/mobile/android/base/GeckoProfile.java
+++ b/mobile/android/base/GeckoProfile.java
@@ -18,16 +18,17 @@ import java.util.Hashtable;
import org.mozilla.gecko.GeckoProfileDirectories.NoMozillaDirectoryException;
import org.mozilla.gecko.GeckoProfileDirectories.NoSuchProfileException;
import org.mozilla.gecko.db.LocalBrowserDB;
import org.mozilla.gecko.distribution.Distribution;
import org.mozilla.gecko.mozglue.RobocopTarget;
import org.mozilla.gecko.util.INIParser;
import org.mozilla.gecko.util.INISection;
+import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
public final class GeckoProfile {
@@ -85,19 +86,29 @@ public final class GeckoProfile {
// Check for a cached profile on this context already
// TODO: We should not be caching profile information on the Activity context
final GeckoApp geckoApp = (GeckoApp) context;
if (geckoApp.mProfile != null) {
return geckoApp.mProfile;
}
}
- // If the guest profile should be used return it.
- if (GuestSession.shouldUse(context, "")) {
- return GeckoProfile.getGuestProfile(context);
+ final String args;
+ if (context instanceof Activity) {
+ args = ((Activity) context).getIntent().getStringExtra("args");
+ } else {
+ args = null;
+ }
+
+ if (GuestSession.shouldUse(context, args)) {
+ GeckoProfile p = GeckoProfile.getOrCreateGuestProfile(context);
+ if (isGeckoApp) {
+ ((GeckoApp) context).mProfile = p;
+ }
+ return p;
}
if (isGeckoApp) {
final GeckoApp geckoApp = (GeckoApp) context;
String defaultProfileName;
try {
defaultProfileName = geckoApp.getDefaultProfileName();
} catch (NoMozillaDirectoryException e) {
@@ -186,16 +197,18 @@ public final class GeckoProfile {
// Clear all shared prefs for the given profile.
GeckoSharedPrefs.forProfileName(context, profileName)
.edit().clear().apply();
}
return success;
}
+ // Only public for access from tests.
+ @RobocopTarget
public static GeckoProfile createGuestProfile(Context context) {
try {
// We need to force the creation of a new guest profile if we want it outside of the normal profile path,
// otherwise GeckoProfile.getDir will try to be smart and build it for us in the normal profiles dir.
getGuestDir(context).mkdir();
GeckoProfile profile = getGuestProfile(context);
// If we're creating this guest session over the keyguard, don't lock it.
@@ -227,16 +240,28 @@ public final class GeckoProfile {
private static File getGuestDir(Context context) {
if (sGuestDir == null) {
sGuestDir = context.getFileStreamPath("guest");
}
return sGuestDir;
}
+ /**
+ * Performs IO. Be careful of using this on the main thread.
+ */
+ public static GeckoProfile getOrCreateGuestProfile(Context context) {
+ GeckoProfile p = getGuestProfile(context);
+ if (p == null) {
+ return createGuestProfile(context);
+ }
+
+ return p;
+ }
+
public static GeckoProfile getGuestProfile(Context context) {
if (sGuestProfile == null) {
File guestDir = getGuestDir(context);
if (guestDir.exists()) {
sGuestProfile = get(context, GUEST_PROFILE, guestDir);
sGuestProfile.mInGuestMode = true;
}
}
--- a/mobile/android/base/GuestSession.java
+++ b/mobile/android/base/GuestSession.java
@@ -1,37 +1,23 @@
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko;
+import android.app.KeyguardManager;
import android.app.NotificationManager;
-import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
-import android.net.Uri;
-import android.util.Log;
+import android.support.v4.app.NotificationCompat;
import android.view.Window;
import android.view.WindowManager;
-import android.widget.ListView;
-import android.support.v4.app.NotificationCompat;
-
-import org.mozilla.gecko.prompts.Prompt;
-import org.mozilla.gecko.util.EventCallback;
-import org.mozilla.gecko.util.NativeEventListener;
-import org.mozilla.gecko.util.NativeJSObject;
-import org.mozilla.gecko.util.ThreadUtils;
-
-import java.io.File;
-
-import org.json.JSONException;
-import org.json.JSONObject;
// Utility methods for entering/exiting guest mode.
public class GuestSession {
public static final String NOTIFICATION_INTENT = "org.mozilla.gecko.GUEST_SESSION_INPROGRESS";
private static final String LOGTAG = "GeckoGuestSession";
// Returns true if the user is using a secure keyguard, and its currently locked.
static boolean isSecureKeyguardLocked(Context context) {
@@ -100,19 +86,13 @@ public class GuestSession {
manager.notify(R.id.guestNotification, builder.build());
}
public static void hideNotification(Context context) {
final NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(R.id.guestNotification);
}
- public static void onDestroy(Context context) {
- if (GeckoProfile.get(context).inGuestMode()) {
- hideNotification(context);
- }
- }
-
public static void handleIntent(BrowserApp context, Intent intent) {
context.showGuestModeDialog(BrowserApp.GuestModeDialog.LEAVING);
}
}
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -177,17 +177,17 @@
<!ENTITY pref_donottrack_allow_tracking "Tell sites that I want to be tracked">
<!ENTITY pref_donottrack_no_pref "Do not tell sites anything about my tracking preferences">
<!ENTITY pref_char_encoding "Character encoding">
<!ENTITY pref_char_encoding_on "Show menu">
<!ENTITY pref_char_encoding_off "Don\'t show menu">
<!ENTITY pref_clear_private_data2 "Clear now">
<!ENTITY pref_clear_private_data_category "Clear private data">
-<!ENTITY pref_clear_on_exit_title "Always clear when quitting">
+<!ENTITY pref_clear_on_exit_title2 "Clear on exit">
<!ENTITY pref_clear_on_exit_summary2 "&brandShortName; will automatically clear your data whenever you select \u0022Quit\u0022 from the main menu">
<!ENTITY pref_clear_on_exit_dialog_title "Select which data to clear">
<!ENTITY pref_plugins "Plugins">
<!ENTITY pref_plugins_enabled "Enabled">
<!ENTITY pref_plugins_tap_to_play "Tap to play">
<!ENTITY pref_plugins_disabled "Disabled">
<!ENTITY pref_text_size "Text size">
<!ENTITY pref_reflow_on_zoom4 "Text reflow">
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -186,17 +186,17 @@
<string name="pref_donottrack_allow_tracking">&pref_donottrack_allow_tracking;</string>
<string name="pref_donottrack_no_pref">&pref_donottrack_no_pref;</string>
<string name="pref_char_encoding">&pref_char_encoding;</string>
<string name="pref_char_encoding_on">&pref_char_encoding_on;</string>
<string name="pref_char_encoding_off">&pref_char_encoding_off;</string>
<string name="pref_clear_private_data">&pref_clear_private_data2;</string>
<string name="pref_clear_private_data_category">&pref_clear_private_data_category;</string>
- <string name="pref_clear_on_exit_title">&pref_clear_on_exit_title;</string>
+ <string name="pref_clear_on_exit_title">&pref_clear_on_exit_title2;</string>
<string name="pref_clear_on_exit_summary2">&pref_clear_on_exit_summary2;</string>
<string name="pref_clear_on_exit_dialog_title">&pref_clear_on_exit_dialog_title;</string>
<string name="pref_plugins">&pref_plugins;</string>
<string name="pref_plugins_enabled">&pref_plugins_enabled;</string>
<string name="pref_plugins_tap_to_play">&pref_plugins_tap_to_play;</string>
<string name="pref_plugins_disabled">&pref_plugins_disabled;</string>
<string name="pref_text_size">&pref_text_size;</string>
<string name="pref_font_size_tiny">&pref_font_size_tiny;</string>
--- a/mobile/android/base/tabs/TabsGridLayout.java
+++ b/mobile/android/base/tabs/TabsGridLayout.java
@@ -50,43 +50,43 @@ class TabsGridLayout extends GridView
mTabsAdapter = new TabsGridLayoutAdapter(mContext);
setAdapter(mTabsAdapter);
setRecyclerListener(new RecyclerListener() {
@Override
public void onMovedToScrapHeap(View view) {
TabsLayoutItemView item = (TabsLayoutItemView) view;
- item.thumbnail.setImageDrawable(null);
+ item.setThumbnail(null);
}
});
}
private class TabsGridLayoutAdapter extends TabsLayoutAdapter {
final private Button.OnClickListener mCloseClickListener;
final private View.OnClickListener mSelectClickListener;
public TabsGridLayoutAdapter (Context context) {
super(context);
mCloseClickListener = new Button.OnClickListener() {
@Override
public void onClick(View v) {
TabsLayoutItemView itemView = (TabsLayoutItemView) v.getTag();
- Tab tab = Tabs.getInstance().getTab(itemView.id);
+ Tab tab = Tabs.getInstance().getTab(itemView.getTabId());
Tabs.getInstance().closeTab(tab);
}
};
mSelectClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
TabsLayoutItemView tab = (TabsLayoutItemView) v;
- Tabs.getInstance().selectTab(tab.id);
+ Tabs.getInstance().selectTab(tab.getTabId());
autoHidePanel();
}
};
}
@Override
TabsLayoutItemView newView(int position, ViewGroup parent) {
final TabsLayoutItemView item = super.newView(position, parent);
--- a/mobile/android/base/tabs/TabsLayoutItemView.java
+++ b/mobile/android/base/tabs/TabsLayoutItemView.java
@@ -19,23 +19,21 @@ import android.widget.LinearLayout;
import android.widget.TextView;
public class TabsLayoutItemView extends LinearLayout
implements Checkable {
private static final String LOGTAG = "Gecko" + TabsLayoutItemView.class.getSimpleName();
private static final int[] STATE_CHECKED = { android.R.attr.state_checked };
private boolean mChecked;
- // yeah, it's a bit nasty having two different styles for the class members,
- // this'll be fixed once bug 1058574 is addressed
- int id;
- TextView title;
- ImageView thumbnail;
- ImageButton close;
- TabThumbnailWrapper thumbnailWrapper;
+ private int mTabId;
+ private TextView mTitle;
+ private ImageView mThumbnail;
+ private ImageButton mCloseButton;
+ private TabThumbnailWrapper mThumbnailWrapper;
public TabsLayoutItemView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
@@ -71,40 +69,52 @@ public class TabsLayoutItemView extends
}
@Override
public void toggle() {
mChecked = !mChecked;
}
public void setCloseOnClickListener(OnClickListener mOnClickListener) {
- close.setOnClickListener(mOnClickListener);
+ mCloseButton.setOnClickListener(mOnClickListener);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- title = (TextView) findViewById(R.id.title);
- thumbnail = (ImageView) findViewById(R.id.thumbnail);
- close = (ImageButton) findViewById(R.id.close);
- thumbnailWrapper = (TabThumbnailWrapper) findViewById(R.id.wrapper);
+ mTitle = (TextView) findViewById(R.id.title);
+ mThumbnail = (ImageView) findViewById(R.id.thumbnail);
+ mCloseButton = (ImageButton) findViewById(R.id.close);
+ mThumbnailWrapper = (TabThumbnailWrapper) findViewById(R.id.wrapper);
}
protected void assignValues(Tab tab) {
if (tab == null) {
return;
}
- id = tab.getId();
+ mTabId = tab.getId();
Drawable thumbnailImage = tab.getThumbnail();
if (thumbnailImage != null) {
- thumbnail.setImageDrawable(thumbnailImage);
+ mThumbnail.setImageDrawable(thumbnailImage);
} else {
- thumbnail.setImageResource(R.drawable.tab_thumbnail_default);
+ mThumbnail.setImageResource(R.drawable.tab_thumbnail_default);
+ }
+ if (mThumbnailWrapper != null) {
+ mThumbnailWrapper.setRecording(tab.isRecording());
}
- if (thumbnailWrapper != null) {
- thumbnailWrapper.setRecording(tab.isRecording());
- }
- title.setText(tab.getDisplayTitle());
- close.setTag(this);
+ mTitle.setText(tab.getDisplayTitle());
+ mCloseButton.setTag(this);
+ }
+
+ public int getTabId() {
+ return mTabId;
+ }
+
+ public void setThumbnail(Drawable thumbnail) {
+ mThumbnail.setImageDrawable(thumbnail);
+ }
+
+ public void setCloseVisibile(boolean visible) {
+ mCloseButton.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
}
}
--- a/mobile/android/base/tabs/TabsListLayout.java
+++ b/mobile/android/base/tabs/TabsListLayout.java
@@ -75,18 +75,18 @@ class TabsListLayout extends TwoWayView
mSwipeListener = new TabSwipeGestureListener();
setOnTouchListener(mSwipeListener);
setOnScrollListener(mSwipeListener.makeScrollListener());
setRecyclerListener(new RecyclerListener() {
@Override
public void onMovedToScrapHeap(View view) {
TabsLayoutItemView item = (TabsLayoutItemView) view;
- item.thumbnail.setImageDrawable(null);
- item.close.setVisibility(View.VISIBLE);
+ item.setThumbnail(null);
+ item.setCloseVisibile(true);
}
});
}
private class TabsListLayoutAdapter extends TabsLayoutAdapter {
private Button.OnClickListener mCloseOnClickListener;
public TabsListLayoutAdapter (Context context) {
super(context);
@@ -355,17 +355,17 @@ class TabsListLayout extends TwoWayView
PropertyAnimator animator = new PropertyAnimator(ANIMATION_DURATION);
final boolean isVertical = isVertical();
if (isVertical)
animator.attach(view, Property.HEIGHT, 1);
else
animator.attach(view, Property.WIDTH, 1);
- final int tabId = ((TabsLayoutItemView) view).id;
+ final int tabId = ((TabsLayoutItemView) view).getTabId();
// Caching this assumes that all rows are the same height
if (mOriginalSize == 0) {
mOriginalSize = (isVertical ? view.getHeight() : view.getWidth());
}
animator.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() {
@Override
@@ -392,17 +392,17 @@ class TabsListLayout extends TwoWayView
animator.addPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() {
@Override
public void onPropertyAnimationStart() { }
@Override
public void onPropertyAnimationEnd() {
TabsLayoutItemView tab = (TabsLayoutItemView) view;
- tab.close.setVisibility(View.VISIBLE);
+ tab.setCloseVisibile(true);
}
});
animator.start();
}
private class TabSwipeGestureListener implements View.OnTouchListener {
// same value the stock browser uses for after drag animation velocity in pixels/sec
@@ -490,17 +490,17 @@ class TabsListLayout extends TwoWayView
if (mSwipeView == null)
break;
cancelCheckForTap();
mSwipeView.setPressed(false);
if (!mSwiping) {
TabsLayoutItemView item = (TabsLayoutItemView) mSwipeView;
- Tabs.getInstance().selectTab(item.id);
+ Tabs.getInstance().selectTab(item.getTabId());
autoHidePanel();
mVelocityTracker.recycle();
mVelocityTracker = null;
break;
}
mVelocityTracker.addMovement(e);
@@ -577,17 +577,17 @@ class TabsListLayout extends TwoWayView
// set pressed state on the swiped view.
if (isScrollingX || isScrollingY)
cancelCheckForTap();
if (isSwipingToClose) {
mSwiping = true;
TabsListLayout.this.requestDisallowInterceptTouchEvent(true);
- ((TabsLayoutItemView) mSwipeView).close.setVisibility(View.INVISIBLE);
+ ((TabsLayoutItemView) mSwipeView).setCloseVisibile(false);
// Stops listview from highlighting the touched item
// in the list when swiping.
MotionEvent cancelEvent = MotionEvent.obtain(e);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL |
(e.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
TabsListLayout.this.onTouchEvent(cancelEvent);
cancelEvent.recycle();
--- a/mobile/android/components/HelperAppDialog.js
+++ b/mobile/android/components/HelperAppDialog.js
@@ -114,17 +114,17 @@ HelperAppLauncherDialog.prototype = {
if (!win) {
// Oops.
Services.console.logStringMessage("Refusing download, but can't show a toast.");
return;
}
Services.console.logStringMessage("Refusing download of non-downloadable file.");
let bundle = Services.strings.createBundle("chrome://browser/locale/handling.properties");
- let failedText = bundle.GetStringFromName("protocol.failed");
+ let failedText = bundle.GetStringFromName("download.blocked");
win.toast.show(failedText, "long");
return;
}
let bundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
let defaultHandler = new Object();
--- a/mobile/android/locales/en-US/chrome/handling.properties
+++ b/mobile/android/locales/en-US/chrome/handling.properties
@@ -1,7 +1,8 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+download.blocked=Unable to download file
protocol.failed=Couldn't find an app to open this link
# A very short string shown in the button toast when no application can open the url
protocol.toast.search=Search
--- a/netwerk/protocol/rtsp/controller/RtspController.cpp
+++ b/netwerk/protocol/rtsp/controller/RtspController.cpp
@@ -42,36 +42,47 @@
#include "zlib.h"
#include <algorithm>
#include "nsDebug.h"
extern PRLogModuleInfo* gRtspLog;
#undef LOG
#define LOG(args) PR_LOG(gRtspLog, PR_LOG_DEBUG, args)
+const unsigned long kCommandDelayMs = 200;
+
namespace mozilla {
namespace net {
+//-----------------------------------------------------------------------------
+// RtspController
+//-----------------------------------------------------------------------------
NS_IMPL_ISUPPORTS(RtspController,
nsIStreamingProtocolController)
RtspController::RtspController(nsIChannel *channel)
- : mState(INIT)
+ : mState(INIT),
+ mTimerLock("RtspController.mTimerLock"),
+ mPlayTimer(nullptr),
+ mPauseTimer(nullptr)
{
LOG(("RtspController::RtspController()"));
}
RtspController::~RtspController()
{
LOG(("RtspController::~RtspController()"));
if (mRtspSource.get()) {
mRtspSource.clear();
}
}
+//-----------------------------------------------------------------------------
+// nsIStreamingProtocolController
+//-----------------------------------------------------------------------------
NS_IMETHODIMP
RtspController::GetTrackMetaData(uint8_t index,
nsIStreamingProtocolMetaData * *_retval)
{
LOG(("RtspController::GetTrackMetaData()"));
return NS_OK;
}
@@ -83,69 +94,85 @@ RtspController::Play(void)
MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
return NS_ERROR_NOT_INITIALIZED;
}
if (mState != CONNECTED) {
return NS_ERROR_NOT_CONNECTED;
}
- mRtspSource->play();
+ MutexAutoLock lock(mTimerLock);
+ // Cancel the pause timer if it is active because successive pause-play in a
+ // short duration is unnecessary but could impair playback smoothing.
+ if (mPauseTimer) {
+ mPauseTimer->Cancel();
+ mPauseTimer = nullptr;
+ }
+
+ // Start a timer to delay the play operation for a short duration.
+ if (!mPlayTimer) {
+ mPlayTimer = do_CreateInstance("@mozilla.org/timer;1");
+ if (!mPlayTimer) {
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ mPlayTimer->InitWithFuncCallback(
+ RtspController::PlayTimerCallback,
+ this, kCommandDelayMs,
+ nsITimer::TYPE_ONE_SHOT);
+ }
+
return NS_OK;
}
NS_IMETHODIMP
RtspController::Pause(void)
{
LOG(("RtspController::Pause()"));
if (!mRtspSource.get()) {
MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
return NS_ERROR_NOT_INITIALIZED;
}
if (mState != CONNECTED) {
return NS_ERROR_NOT_CONNECTED;
}
- mRtspSource->pause();
+ MutexAutoLock lock(mTimerLock);
+ // Cancel the play timer if it is active because successive play-pause in a
+ // short duration is unnecessary but could impair playback smoothing.
+ if (mPlayTimer) {
+ mPlayTimer->Cancel();
+ mPlayTimer = nullptr;
+ }
+
+ // Start a timer to delay the pause operation for a short duration.
+ if (!mPauseTimer) {
+ mPauseTimer = do_CreateInstance("@mozilla.org/timer;1");
+ if (!mPauseTimer) {
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ mPauseTimer->InitWithFuncCallback(
+ RtspController::PauseTimerCallback,
+ this, kCommandDelayMs,
+ nsITimer::TYPE_ONE_SHOT);
+ }
+
return NS_OK;
}
NS_IMETHODIMP
RtspController::Resume(void)
{
- LOG(("RtspController::Resume()"));
- if (!mRtspSource.get()) {
- MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
- return NS_ERROR_NOT_INITIALIZED;
- }
-
- if (mState != CONNECTED) {
- return NS_ERROR_NOT_CONNECTED;
- }
-
- mRtspSource->play();
- return NS_OK;
+ return Play();
}
NS_IMETHODIMP
RtspController::Suspend(void)
{
- LOG(("RtspController::Suspend()"));
- if (!mRtspSource.get()) {
- MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
- return NS_ERROR_NOT_INITIALIZED;
- }
-
- if (mState != CONNECTED) {
- return NS_ERROR_NOT_CONNECTED;
- }
-
- mRtspSource->pause();
- return NS_OK;
+ return Pause();
}
NS_IMETHODIMP
RtspController::Seek(uint64_t seekTimeUs)
{
LOG(("RtspController::Seek() %llu", seekTimeUs));
if (!mRtspSource.get()) {
MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
@@ -205,16 +232,19 @@ RtspController::AsyncOpen(nsIStreamingPr
mUserAgent.get(), false, 0);
}
// Connect to Rtsp Server.
mRtspSource->start();
return NS_OK;
}
+//-----------------------------------------------------------------------------
+// nsIStreamingProtocolListener
+//-----------------------------------------------------------------------------
class SendMediaDataTask : public nsRunnable
{
public:
SendMediaDataTask(nsIStreamingProtocolListener *listener,
uint8_t index,
const nsACString & data,
uint32_t length,
uint32_t offset,
@@ -324,16 +354,30 @@ private:
};
NS_IMETHODIMP
RtspController::OnDisconnected(uint8_t index,
nsresult reason)
{
LOG(("RtspController::OnDisconnected() for track %d reason = 0x%x", index, reason));
mState = DISCONNECTED;
+
+ // Ensure play and pause timer are stopped.
+ {
+ MutexAutoLock lock(mTimerLock);
+ if (mPlayTimer) {
+ mPlayTimer->Cancel();
+ mPlayTimer = nullptr;
+ }
+ if (mPauseTimer) {
+ mPauseTimer->Cancel();
+ mPauseTimer = nullptr;
+ }
+ }
+
if (mListener) {
nsRefPtr<SendOnDisconnectedTask> task =
new SendOnDisconnectedTask(mListener, index, reason);
// Break the cycle reference between the Listener (RtspControllerParent) and
// us.
mListener = nullptr;
return NS_DispatchToMainThread(task);
}
@@ -387,10 +431,45 @@ RtspController::PlaybackEnded()
MOZ_ASSERT(mRtspSource.get(), "mRtspSource should not be null!");
return NS_ERROR_NOT_INITIALIZED;
}
mRtspSource->playbackEnded();
return NS_OK;
}
+//-----------------------------------------------------------------------------
+// RtspController static member methods
+//-----------------------------------------------------------------------------
+//static
+void RtspController::PlayTimerCallback(nsITimer *aTimer, void *aClosure)
+{
+ MOZ_ASSERT(aTimer);
+ MOZ_ASSERT(aClosure);
+
+ RtspController *self = static_cast<RtspController*>(aClosure);
+ MOZ_ASSERT(self->mRtspSource.get());
+
+ MutexAutoLock lock(self->mTimerLock);
+ if (self->mPlayTimer) {
+ self->mRtspSource->play();
+ self->mPlayTimer = nullptr;
+ }
+}
+
+//static
+void RtspController::PauseTimerCallback(nsITimer *aTimer, void *aClosure)
+{
+ MOZ_ASSERT(aTimer);
+ MOZ_ASSERT(aClosure);
+
+ RtspController *self = static_cast<RtspController*>(aClosure);
+ MOZ_ASSERT(self->mRtspSource.get());
+
+ MutexAutoLock lock(self->mTimerLock);
+ if (self->mPauseTimer) {
+ self->mRtspSource->pause();
+ self->mPauseTimer = nullptr;
+ }
+}
+
} // namespace mozilla::net
} // namespace mozilla
--- a/netwerk/protocol/rtsp/controller/RtspController.h
+++ b/netwerk/protocol/rtsp/controller/RtspController.h
@@ -2,36 +2,42 @@
/* vim: set sw=2 ts=8 et tw=80 : */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef RtspController_h
#define RtspController_h
+#include "mozilla/Mutex.h"
#include "nsIStreamingProtocolController.h"
#include "nsIChannel.h"
#include "nsCOMPtr.h"
#include "nsString.h"
+#include "nsITimer.h"
#include "RTSPSource.h"
namespace mozilla {
namespace net {
class RtspController : public nsIStreamingProtocolController
, public nsIStreamingProtocolListener
{
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSISTREAMINGPROTOCOLCONTROLLER
NS_DECL_NSISTREAMINGPROTOCOLLISTENER
RtspController(nsIChannel *channel);
~RtspController();
+ // These callbacks will be called when mPlayTimer/mPauseTimer fires.
+ static void PlayTimerCallback(nsITimer *aTimer, void *aClosure);
+ static void PauseTimerCallback(nsITimer *aTimer, void *aClosure);
+
private:
enum State {
INIT,
CONNECTED,
DISCONNECTED
};
// RTSP URL refer to a stream or an aggregate of streams.
@@ -42,13 +48,20 @@ private:
nsCString mSpec;
// UserAgent string.
nsCString mUserAgent;
// Indicate the connection state between the
// media streaming server and the Rtsp client.
State mState;
// Rtsp Streaming source.
android::sp<android::RTSPSource> mRtspSource;
+ // This lock protects mPlayTimer and mPauseTimer.
+ Mutex mTimerLock;
+ // Timers to delay the play and pause operations.
+ // They are used for optimization and avoid sending unnecessary requests to
+ // the server.
+ nsCOMPtr<nsITimer> mPlayTimer;
+ nsCOMPtr<nsITimer> mPauseTimer;
};
}
} // namespace mozilla::net
#endif
--- a/testing/xpcshell/mach_commands.py
+++ b/testing/xpcshell/mach_commands.py
@@ -137,19 +137,20 @@ class XPCShellRunner(MozbuildObject):
xpcshell_filter = TestStartFilter()
self.log_manager.terminal_handler.addFilter(xpcshell_filter)
tests_dir = os.path.join(self.topobjdir, '_tests', 'xpcshell')
modules_dir = os.path.join(self.topobjdir, '_tests', 'modules')
# We want output from the test to be written immediately if we are only
# running a single test.
- verbose_output = (test_path is not None or
- (manifest and len(manifest.test_paths())==1) or
- verbose)
+ single_test = (test_path is not None or
+ (manifest and len(manifest.test_paths())==1))
+ verbose_output = verbose or single_test
+ sequential = sequential or single_test
args = {
'manifest': manifest,
'xpcshell': self.get_binary_path('xpcshell'),
'mozInfo': os.path.join(self.topobjdir, 'mozinfo.json'),
'symbolsPath': os.path.join(self.distdir, 'crashreporter-symbols'),
'interactive': interactive,
'keepGoing': keep_going,
--- a/toolkit/components/places/Bookmarks.jsm
+++ b/toolkit/components/places/Bookmarks.jsm
@@ -2,65 +2,67 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* This module provides an asynchronous API for managing bookmarks.
*
- * Bookmarks are organized in a tree structure, and can be bookmarked URIs,
- * folders or separators. Multiple bookmarks for the same URI are allowed.
+ * Bookmarks are organized in a tree structure, and can be bookmarked URLs,
+ * folders or separators. Multiple bookmarks for the same URL are allowed.
*
* Note that if you are handling bookmarks operations in the UI, you should
* not use this API directly, but rather use PlacesTransactions.jsm, so that
* any operation is undo/redo-able.
*
* Each bookmarked item is represented by an object having the following
* properties:
*
* - guid (string)
* The globally unique identifier of the item.
* - parentGuid (string)
* The globally unique identifier of the folder containing the item.
* This will be an empty string for the Places root folder.
* - index (number)
* The 0-based position of the item in the parent folder.
- * - dateAdded (number, microseconds from the epoch)
- * The time at which the item was added. This is a PRTime (microseconds).
- * - lastModified (number, microseconds from the epoch)
- * The time at which the item was last modified. This is a PRTime (microseconds).
+ * - dateAdded (Date)
+ * The time at which the item was added.
+ * - lastModified (Date)
+ * The time at which the item was last modified.
* - type (number)
* The item's type, either TYPE_BOOKMARK, TYPE_FOLDER or TYPE_SEPARATOR.
*
* The following properties are only valid for bookmarks or folders.
*
* - title (string)
* The item's title, if any. Empty titles and null titles are considered
* the same and the property is unset on retrieval in such a case.
+ * Title cannot be longer than TITLE_LENGTH_MAX, or it will be truncated.
*
* The following properties are only valid for bookmarks:
*
- * - uri (nsIURI)
- * The item's URI.
+ * - url (URL, href or nsIURI)
+ * The item's URL. Note that while input objects can contains either
+ * an URL object, an href string, or an nsIURI, output objects will always
+ * contain an URL object.
+ * URL cannot be longer than URL_LENGTH_MAX, methods will throw if a
+ * longer value is provided
* - keyword (string)
* The associated keyword, if any.
*
* Each successful operation notifies through the nsINavBookmarksObserver
* interface. To listen to such notifications you must register using
* nsINavBookmarksService addObserver and removeObserver methods.
* Note that bookmark addition or order changes won't notify onItemMoved for
* items that have their indexes changed.
* Similarly, lastModified changes not done explicitly (like changing another
* property) won't fire an onItemChanged notification for the lastModified
* property.
* @see nsINavBookmarkObserver
- *
- * @note livemarks are implemented as empty folders.
- * @see mozIAsyncLivemarks.idl
*/
this.EXPORTED_SYMBOLS = [ "Bookmarks" ];
const { classes: Cc, interfaces: Ci, results: Cr, utils: Cu } = Components;
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Services",
@@ -69,175 +71,189 @@ XPCOMUtils.defineLazyModuleGetter(this,
"resource://gre/modules/NetUtil.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Promise",
"resource://gre/modules/Promise.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Sqlite",
"resource://gre/modules/Sqlite.jsm");
-const URI_LENGTH_MAX = 65536;
+const URL_LENGTH_MAX = 65536;
const TITLE_LENGTH_MAX = 4096;
let Bookmarks = Object.freeze({
/**
* Item's type constants.
* These should stay consistent with nsINavBookmarksService.idl
*/
TYPE_BOOKMARK: 1,
TYPE_FOLDER: 2,
TYPE_SEPARATOR: 3,
/**
+ * Default index used to append a bookmarked item at the end of a container.
+ * This should stay consistent with nsINavBookmarksService.idl
+ */
+ DEFAULT_INDEX: -1,
+
+ /**
* Creates or updates a bookmarked item.
*
* If the given guid is found the corresponding item is updated, otherwise,
* if no guid is provided, a bookmark is created and a new guid is assigned
* to it.
*
* In the creation case, a minimum set of properties must be provided:
* - type
* - parentGuid
- * - URI, only for bookmarks
+ * - url, only for bookmarks
* If an index is not specified, it defaults to appending.
* It's also possible to pass a non-existent guid to force creation of an
* item with the given guid, but unless you have a very sound reason, such as
* an undo manager implementation or synchronization, you should not do that.
*
* In the update case, you should only set the properties which should be
* changed, undefined properties won't be taken into account for the update.
* Moreover, the item's type and the guid are ignored, since they are
* immutable after creation. Note that if the passed in values are not
* coherent with the known values, this rejects.
* Passing null or an empty string as keyword clears any keyword
* associated with this bookmark.
*
* Note that any known property that doesn't apply to the specific item type
- * causes rejection.
+ * throws an exception.
*
* @param info
* object representing a bookmarked item, as defined above.
+ * @param onResult [optional]
+ * Callback invoked for each created or updated bookmark. It gets
+ * the bookmark object as argument.
*
* @return {Promise} resolved when the update is complete.
- * @resolves to the input object, updated with relevant information.
- * @rejects JavaScript exception.
- *
- * @note title is truncated to TITLE_LENGTH_MAX and URI is rejected if
- * greater than URI_LENGTH_MAX.
+ * @resolves to a boolean indicating whether any new bookmark has been created.
+ * @rejects JavaScript exception if it's not possible to update or create the
+ * requested bookmark.
+ * @throws if input is invalid.
*/
// XXX WIP XXX Will replace functionality from these methods:
// long long insertBookmark(in long long aParentId, in nsIURI aURI, in long aIndex, in AUTF8String aTitle, [optional] in ACString aGUID);
// long long createFolder(in long long aParentFolder, in AUTF8String name, in long index, [optional] in ACString aGUID);
// void moveItem(in long long aItemId, in long long aNewParentId, in long aIndex);
// long long insertSeparator(in long long aParentId, in long aIndex, [optional] in ACString aGUID);
// void setItemTitle(in long long aItemId, in AUTF8String aTitle);
// void setItemDateAdded(in long long aItemId, in PRTime aDateAdded);
// void setItemLastModified(in long long aItemId, in PRTime aLastModified);
// void changeBookmarkURI(in long long aItemId, in nsIURI aNewURI);
// void setKeywordForBookmark(in long long aItemId, in AString aKeyword);
- update: Task.async(function* (info) {
+ update: function (info, onResult=null) {
throw new Error("Not yet implemented");
- }),
+ },
/**
* Removes a bookmarked item.
*
* Input can either be a guid or an object with one of the following
* properties set:
* - guid: if set, only the corresponding item is removed.
* - parentGuid: if it's set and is a folder, any children of that folder is
* removed, but not the folder itself.
- * - URI: if set, any bookmark for that URI is removed.
- * If multiple of these properties are set, the method rejects.
+ * - url: if set, any bookmark for that URL is removed.
+ * If multiple of these properties are set, the method throws.
*
* Any other property is ignored, known properties may be overwritten.
*
* @param guidOrInfo
* The globally unique identifier of the item to remove, or an
* object representing it, as defined above.
+ * @param onResult [optional]
+ * Callback invoked for each removed bookmark. It gets the bookmark
+ * object as argument.
*
* @return {Promise} resolved when the removal is complete.
- * @resolves to the removed object or an array of them.
- * @rejects JavaScript exception.
+ * @resolves to a boolean indicating whether any object has been removed.
+ * @rejects JavaScript exception if the provided guid or parentGuid don't
+ * match any existing bookmark.
+ * @throws if input is invalid.
*/
// XXX WIP XXX Will replace functionality from these methods:
// removeItem(in long long aItemId);
// removeFolderChildren(in long long aItemId);
- remove: Task.async(function* (guidOrInfo) {
+ remove: function (guidOrInfo, onResult=null) {
throw new Error("Not yet implemented");
- }),
+ },
/**
* Fetches information about a bookmarked item.
*
* Input can be either a guid or an object with one, and only one, of these
* filtering properties set:
* - guid
* retrieves the item with the specified guid
* - parentGuid and index
* retrieves the item by its position
- * - URI
- * retrieves all items having the given URI.
+ * - url
+ * retrieves an array of items having the given URL.
* - keyword
- * retrieves all items having the given keyword.
+ * retrieves an array of items having the given keyword.
*
* Any other property is ignored. Known properties may be overwritten.
*
* @param guidOrInfo
* The globally unique identifier of the item to fetch, or an
* object representing it, as defined above.
*
* @return {Promise} resolved when the fetch is complete.
* @resolves to an object representing the found item, as described above, or
* an array of such objects. if no item is found, the returned
* promise is resolved to null.
* @rejects JavaScript exception.
+ * @throws if input is invalid.
*/
// XXX WIP XXX Will replace functionality from these methods:
// long long getIdForItemAt(in long long aParentId, in long aIndex);
// AUTF8String getItemTitle(in long long aItemId);
// PRTime getItemDateAdded(in long long aItemId);
// PRTime getItemLastModified(in long long aItemId);
// nsIURI getBookmarkURI(in long long aItemId);
// long getItemIndex(in long long aItemId);
// unsigned short getItemType(in long long aItemId);
// boolean isBookmarked(in nsIURI aURI);
// long long getFolderIdForItem(in long long aItemId);
// void getBookmarkIdsForURI(in nsIURI aURI, [optional] out unsigned long count, [array, retval, size_is(count)] out long long bookmarks);
// AString getKeywordForURI(in nsIURI aURI);
// AString getKeywordForBookmark(in long long aItemId);
// nsIURI getURIForKeyword(in AString keyword);
- fetch: Task.async(function* (guidOrInfo) {
+ fetch: function (guidOrInfo) {
throw new Error("Not yet implemented");
- }),
+ },
/**
* Retrieves an object representation of a bookmarked item, along with all of
* its descendants, if any.
*
- * Each node in the tree is an object that extends
- * the item representation described above with some additional properties:
+ * Each node in the tree is an object that extends the item representation
+ * described above with some additional properties:
*
* - [deprecated] id (number)
* the item's id. Defined only if aOptions.includeItemIds is set.
* - annos (array)
* the item's annotations. This is not set if there are no annotations
* set for the item.
*
* The root object of the tree also has the following properties set:
* - itemsCount (number, not enumerable)
* the number of items, including the root item itself, which are
* represented in the resolved object.
*
- * Bookmarked URIs may also have the following properties:
+ * Bookmarked URLs may also have the following properties:
* - tags (string)
* csv string of the bookmark's tags, if any.
* - charset (string)
* the last known charset of the bookmark, if any.
- * - iconuri (string)
+ * - iconurl (URL)
* the bookmark's favicon URL, if any.
*
* Folders may also have the following properties:
* - children (array)
* the folder's children information, each of them having the same set of
* properties as above.
*
* @param [optional] guid
@@ -261,35 +277,37 @@ let Bookmarks = Object.freeze({
* Use it if you must. It'll be removed once the switch to guids is
* complete.
*
* @return {Promise} resolved when the fetch is complete.
* @resolves to an object that represents either a single item or a
* bookmarks tree. if guid points to a non-existent item, the
* returned promise is resolved to null.
* @rejects JavaScript exception.
+ * @throws if input is invalid.
*/
// XXX WIP XXX: will replace functionality for these methods:
// PlacesUtils.promiseBookmarksTree()
- fetchTree: Task.async(function* (guid = "", options = {}) {
+ fetchTree: function (guid = "", options = {}) {
throw new Error("Not yet implemented");
- }),
+ },
/**
* Reorders contents of a folder based on a provided array of GUIDs.
*
* @param parentGuid
* The globally unique identifier of the folder whose contents should
* be reordered.
* @param orderedChildrenGuids
* Ordered array of the children's GUIDs. If this list contains
* non-existing entries they will be ignored. If the list is
* incomplete, missing entries will be appended.
*
* @return {Promise} resolved when reordering is complete.
* @rejects JavaScript exception.
+ * @throws if input is invalid.
*/
// XXX WIP XXX Will replace functionality from these methods:
// void setItemIndex(in long long aItemId, in long aNewIndex);
- reorder: Task.async(function* (parentGuid, orderedChildrenGuids) {
+ reorder: function (parentGuid, orderedChildrenGuids) {
throw new Error("Not yet implemented");
- })
+ }
});
--- a/toolkit/themes/linux/global/autocomplete.css
+++ b/toolkit/themes/linux/global/autocomplete.css
@@ -112,33 +112,36 @@ treechildren.autocomplete-treebody::-moz
color: HighlightText;
}
.autocomplete-richlistitem {
padding: 6px 2px;
color: MenuText;
}
+.ac-url-box {
+ /* When setting a vertical margin here, half of that needs to be added
+ .ac-title-box's translateY for when .ac-url-box is hidden (see below). */
+ margin-top: 1px;
+}
+
.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box,
.autocomplete-richlistitem[type~="autofill"] .ac-url-box {
- display: none;
+ visibility: hidden;
}
.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box,
.autocomplete-richlistitem[type~="autofill"] .ac-title-box {
- margin-top: 12px;
- margin-bottom: 12px;
-}
-
-.ac-url-box {
- margin-top: 1px;
+ /* Center the title by moving it down by half of .ac-url-box's height,
+ including vertical margins (if any). */
+ transform: translateY(.5em);
}
.ac-site-icon {
width: 16px;
height: 16px;
margin-bottom: -2px;
-moz-margin-start: 3px;
-moz-margin-end: 6px;
--- a/toolkit/themes/osx/global/autocomplete.css
+++ b/toolkit/themes/osx/global/autocomplete.css
@@ -97,33 +97,36 @@ treechildren.autocomplete-treebody::-moz
color: HighlightText;
background-image: linear-gradient(rgba(255,255,255,0.3), transparent);
}
.autocomplete-richlistitem {
padding: 5px 2px;
}
+.ac-url-box {
+ /* When setting a vertical margin here, half of that needs to be added
+ .ac-title-box's translateY for when .ac-url-box is hidden (see below). */
+ margin-top: 1px;
+}
+
.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box,
.autocomplete-richlistitem[type~="autofill"] .ac-url-box {
- display: none;
+ visibility: hidden;
}
.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box,
.autocomplete-richlistitem[type~="autofill"] .ac-title-box {
- margin-top: 12px;
- margin-bottom: 12px;
-}
-
-.ac-url-box {
- margin-top: 1px;
+ /* Center the title by moving it down by half of .ac-url-box's height,
+ including vertical margins (if any). */
+ transform: translateY(.5em);
}
.ac-site-icon {
width: 16px;
height: 16px;
margin-bottom: -1px;
-moz-margin-start: 7px;
-moz-margin-end: 5px;
--- a/toolkit/themes/windows/global/autocomplete.css
+++ b/toolkit/themes/windows/global/autocomplete.css
@@ -125,37 +125,40 @@ treechildren.autocomplete-treebody::-moz
border-radius: 6px;
outline: 1px solid rgb(124,163,206);
-moz-outline-radius: 3px;
outline-offset: -2px;
}
}
%endif
+.ac-title-box {
+ margin-top: 4px;
+}
+
+.ac-url-box {
+ /* When setting a vertical margin here, half of that needs to be added
+ .ac-title-box's translateY for when .ac-url-box is hidden (see below). */
+ margin: 1px 0 4px;
+}
+
.autocomplete-richlistitem[actiontype="keyword"] .ac-url-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-url-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-url-box,
.autocomplete-richlistitem[type~="autofill"] .ac-url-box {
- display: none;
+ visibility: hidden;
}
.autocomplete-richlistitem[actiontype="keyword"] .ac-title-box,
.autocomplete-richlistitem[actiontype="searchengine"] .ac-title-box,
.autocomplete-richlistitem[actiontype="visiturl"] .ac-title-box,
.autocomplete-richlistitem[type~="autofill"] .ac-title-box {
- margin-top: 12px;
- margin-bottom: 12px;
-}
-
-.ac-title-box {
- margin-top: 4px;
-}
-
-.ac-url-box {
- margin: 1px 0 4px;
+ /* Center the title by moving it down by half of .ac-url-box's height,
+ including vertical margins (if any). */
+ transform: translateY(calc(.5em + 2px));
}
.ac-site-icon {
width: 16px;
height: 16px;
margin: 0 5px -2px;
}