Merge mozilla-central to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Tue, 27 Jan 2015 15:55:34 +0100
changeset 239398 be3199827238d4c7ba5d5f9148fbf2a41f9ea867
parent 239397 e85214458163c1b88bf28568410c26921a3a226a (current diff)
parent 239331 63f8a47cfdf58f3b9da70f0387608490b5b75e5f (diff)
child 239399 cf8503e06f91972094871c514bd0cf79c3d69313
push id497
push usermleibovic@mozilla.com
push dateWed, 28 Jan 2015 16:43:37 +0000
milestone38.0a1
Merge mozilla-central to mozilla-inbound
browser/config/mozconfigs/win64/common-opt
browser/config/mozconfigs/win64/debug
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,17 +10,17 @@
   <!--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="e06971db7acf7a35c32eb74d675a4e12e288e6be">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <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="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,17 +14,17 @@
   <!--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="df362ace56338da8173d30d3e09e08c42c1accfa">
     <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="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="6fa7a4936414ceb4055fd27f7a30e76790f834fb"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--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="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <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"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--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="e06971db7acf7a35c32eb74d675a4e12e288e6be">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <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="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,17 +14,17 @@
   <!--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="df362ace56338da8173d30d3e09e08c42c1accfa">
     <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="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="d5d3f93914558b6f168447b805cd799c8233e300"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="6fa7a4936414ceb4055fd27f7a30e76790f834fb"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--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="e06971db7acf7a35c32eb74d675a4e12e288e6be">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <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="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
--- a/b2g/config/flame/sources.xml
+++ b/b2g/config/flame/sources.xml
@@ -12,17 +12,17 @@
   <!--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="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <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"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "b02ec9713e6de8d96c6954d2c0dfd0442b0656ac", 
+        "git_revision": "1eedbee8f26efbaa4a113e002c46f64e9b90249d", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "bdc67bb5e9be1469a96158d657a1829373c4152a", 
+    "revision": "080bbea403be57fffcbb800eb6f7e2fcd0b4c7d2", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/hamachi/sources.xml
+++ b/b2g/config/hamachi/sources.xml
@@ -12,17 +12,17 @@
   <!--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="df362ace56338da8173d30d3e09e08c42c1accfa">
     <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="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
   <project name="platform_bionic" path="bionic" remote="b2g" revision="1a2a32eda22ef2cd18f57f423a5e7b22a105a6f8"/>
   <project name="platform/bootable/recovery" path="bootable/recovery" revision="746bc48f34f5060f90801925dcdd964030c1ab6d"/>
--- a/b2g/config/helix/sources.xml
+++ b/b2g/config/helix/sources.xml
@@ -10,17 +10,17 @@
   <!--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="df362ace56338da8173d30d3e09e08c42c1accfa">
     <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="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <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" remote="b2g" revision="1a2a32eda22ef2cd18f57f423a5e7b22a105a6f8"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--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="0e94c080bee081a50aa2097527b0b40852f9143f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <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"/>
--- a/b2g/config/wasabi/sources.xml
+++ b/b2g/config/wasabi/sources.xml
@@ -12,17 +12,17 @@
   <!--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="df362ace56338da8173d30d3e09e08c42c1accfa">
     <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="b02ec9713e6de8d96c6954d2c0dfd0442b0656ac"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="1eedbee8f26efbaa4a113e002c46f64e9b90249d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2262d4a77d4f46ab230fd747bb91e9b77bad36cb"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="fe893bb760a3bb64375f62fdf4762a58c59df9ef"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="d6a27295acb0a25926bf6290dd2532a7f9027864"/>
   <project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
--- a/browser/base/content/test/general/browser_devices_get_user_media.js
+++ b/browser/base/content/test/general/browser_devices_get_user_media.js
@@ -477,31 +477,24 @@ let gTests = [
     is(getMediaCaptureState(), "CameraAndMicrophone",
        "expected camera and microphone to be shared");
 
     yield checkSharingUI({video: true, audio: true});
 
     yield promiseNotificationShown(PopupNotifications.getNotification("webRTC-sharingDevices"));
 
     info("reloading the web page");
-    let deferred = Promise.defer();
-    let browser = gBrowser.selectedBrowser;
-    browser.addEventListener("load", function onload() {
-      browser.removeEventListener("load", onload, true);
-      deferred.resolve();
-    }, true);
-    content.location.reload();
-    yield deferred.promise;
+    yield promiseObserverCalled("recording-device-events",
+                                () => { content.location.reload(); });
 
     yield promiseNoPopupNotification("webRTC-sharingDevices");
-    if (gObservedTopics["recording-device-events"] == 2) {
+    if (gObservedTopics["recording-device-events"] == 1) {
       todo(false, "Got the 'recording-device-events' notification twice, likely because of bug 962719");
-      --gObservedTopics["recording-device-events"];
+      gObservedTopics["recording-device-events"] = 0;
     }
-    expectObserverCalled("recording-device-events");
     expectObserverCalled("recording-window-ended");
     expectNoObserverCalled();
     yield checkNotSharing();
   }
 },
 
 {
   desc: "getUserMedia prompt: Always/Never Share",
--- a/browser/base/content/test/general/browser_devices_get_user_media_in_frame.js
+++ b/browser/base/content/test/general/browser_devices_get_user_media_in_frame.js
@@ -314,31 +314,24 @@ let gTests = [
     expectObserverCalled("getUserMedia:response:allow");
     expectObserverCalled("recording-device-events");
     is(getMediaCaptureState(), "CameraAndMicrophone",
        "expected camera and microphone to be shared");
 
     yield checkSharingUI({video: true, audio: true});
 
     info("reloading the frame");
-    let deferred = Promise.defer();
-    let browser = gBrowser.selectedBrowser;
-    browser.addEventListener("load", function onload() {
-      browser.removeEventListener("load", onload, true);
-      deferred.resolve();
-    }, true);
-    global.location.reload();
-    yield deferred.promise;
+    yield promiseObserverCalled("recording-device-events",
+                                () => { global.location.reload(); });
 
     yield promiseNoPopupNotification("webRTC-sharingDevices");
-    if (gObservedTopics["recording-device-events"] == 2) {
+    if (gObservedTopics["recording-device-events"] == 1) {
       todo(false, "Got the 'recording-device-events' notification twice, likely because of bug 962719");
-      --gObservedTopics["recording-device-events"];
+      gObservedTopics["recording-device-events"] = 0;
     }
-    expectObserverCalled("recording-device-events");
     expectObserverCalled("recording-window-ended");
     expectNoObserverCalled();
     yield checkNotSharing();
   }
 },
 
 {
   desc: "getUserMedia audio+video: reloading the frame removes prompts",
@@ -347,28 +340,21 @@ let gTests = [
     yield promisePopupNotificationShown("webRTC-shareDevices", () => {
       info("requesting devices");
       global.requestDevice(true, true);
     });
     expectObserverCalled("getUserMedia:request");
     checkDeviceSelectors(true, true);
 
     info("reloading the frame");
-    let deferred = Promise.defer();
-    let browser = gBrowser.selectedBrowser;
-    browser.addEventListener("load", function onload() {
-      browser.removeEventListener("load", onload, true);
-      deferred.resolve();
-    }, true);
-    global.location.reload();
-    yield deferred.promise;
+    yield promiseObserverCalled("recording-window-ended",
+                                () => { global.location.reload(); });
 
     yield promiseNoPopupNotification("webRTC-shareDevices");
 
-    expectObserverCalled("recording-window-ended");
     expectNoObserverCalled();
     yield checkNotSharing();
   }
 },
 
 {
   desc: "getUserMedia audio+video: reloading a frame updates the sharing UI",
   run: function checkUpdateWhenReloading() {
@@ -408,32 +394,25 @@ let gTests = [
     expectObserverCalled("recording-device-events");
     is(getMediaCaptureState(), "CameraAndMicrophone",
        "expected camera and microphone to be shared");
 
     yield checkSharingUI({video: true, audio: true});
     expectNoObserverCalled();
 
     info("reloading the second frame");
-    let deferred = Promise.defer();
-    let browser = gBrowser.selectedBrowser;
-    browser.addEventListener("load", function onload() {
-      browser.removeEventListener("load", onload, true);
-      deferred.resolve();
-    }, true);
-    g2.location.reload();
-    yield deferred.promise;
+    yield promiseObserverCalled("recording-device-events",
+                                () => { g2.location.reload(); });
 
     yield checkSharingUI({video: false, audio: true});
     expectObserverCalled("recording-window-ended");
-    if (gObservedTopics["recording-device-events"] == 2) {
+    if (gObservedTopics["recording-device-events"] == 1) {
       todo(false, "Got the 'recording-device-events' notification twice, likely because of bug 962719");
-      --gObservedTopics["recording-device-events"];
+      gObservedTopics["recording-device-events"] = 0;
     }
-    expectObserverCalled("recording-device-events");
     expectNoObserverCalled();
 
     yield closeStream(g1);
     yield promiseNoPopupNotification("webRTC-sharingDevices");
     expectNoObserverCalled();
     yield checkNotSharing();
   }
 }
--- a/browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js
+++ b/browser/components/loop/standalone/content/libs/l10n-gaia-02ca67948fe8.js
@@ -1,8 +1,13 @@
+/*
+ * Note, please see l10n-gaia-upstream.txt for a list of changes
+ * that will need to be reapplied if this file is updated.
+ */
+
 (function(window, undefined) {
   'use strict';
 
   /* jshint validthis:true */
   function L10nError(message, id, loc) {
     this.name = 'L10nError';
     this.message = message;
     this.id = id;
@@ -1462,17 +1467,17 @@
 
   if (window.document) {
     isPretranslated = !PSEUDO_STRATEGIES.hasOwnProperty(navigator.language) &&
                       (document.documentElement.lang === navigator.language);
 
     // XXX always pretranslate if data-no-complete-bug is set;  this is
     // a workaround for a netError page not firing some onreadystatechange
     // events;  see https://bugzil.la/444165
-    var pretranslate = document.documentElement.dataset.noCompleteBug ?
+    var pretranslate = document.documentElement.getAttribute("data-noCompleteBug") ?
       true : !isPretranslated;
     waitFor('interactive', init.bind(navigator.mozL10n, pretranslate));
   }
 
   function initObserver() {
     nodeObserver = new MutationObserver(onMutations.bind(navigator.mozL10n));
     nodeObserver.observe(document, moConfig);
   }
@@ -1487,17 +1492,17 @@
       // are loaded because we're not going to translate the whole
       // document once l10n resources are ready.
       initObserver();
       window.setTimeout(initResources.bind(navigator.mozL10n));
     }
   }
 
   function inlineLocalization() {
-    var locale = this.ctx.getLocale(navigator.language);
+    var locale = this.ctx.getLocale(navigator.language || navigator.browserLanguage);
     var scriptLoc = locale.isPseudo ? this.ctx.defaultLocale : locale.id;
     var script = document.documentElement
                          .querySelector('script[type="application/l10n"]' +
                          '[lang="' + scriptLoc + '"]');
     if (!script) {
       return;
     }
 
new file mode 100644
--- /dev/null
+++ b/browser/components/loop/standalone/content/libs/l10n-gaia-upstream.txt
@@ -0,0 +1,5 @@
+This file tracks the changes that have been made to l10n-gaia and
+need to be reapplied when the library is updated.
+
+Bug 1117863
+Bug 1097852
--- a/browser/config/mozconfigs/win32/common-opt
+++ b/browser/config/mozconfigs/win32/common-opt
@@ -22,19 +22,15 @@ fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 ac_add_options --with-mozilla-api-keyfile=/c/builds/mozilla-desktop-geoloc-api.key
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
-if test "$PROCESSOR_ARCHITECTURE" = "AMD64" -o "$PROCESSOR_ARCHITEW6432" = "AMD64"; then
-  . $topsrcdir/build/win32/mozconfig.vs2013-win64
-else
-  . $topsrcdir/build/win32/mozconfig.vs2010
-fi
+. $topsrcdir/build/win32/mozconfig.vs2013-win64
 
 # Treat warnings as errors in directories with FAIL_ON_WARNINGS.
 ac_add_options --enable-warnings-as-errors
 
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
--- a/browser/config/mozconfigs/win32/debug
+++ b/browser/config/mozconfigs/win32/debug
@@ -13,21 +13,17 @@ if [ -f /c/builds/google-oauth-api.key ]
 else
   _google_oauth_api_keyfile=/e/builds/google-oauth-api.key
 fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
-if test "$PROCESSOR_ARCHITECTURE" = "AMD64" -o "$PROCESSOR_ARCHITEW6432" = "AMD64"; then
-  . $topsrcdir/build/win32/mozconfig.vs2013-win64
-else
-  . $topsrcdir/build/win32/mozconfig.vs2010
-fi
+. $topsrcdir/build/win32/mozconfig.vs2013-win64
 
 # Treat warnings as errors in directories with FAIL_ON_WARNINGS.
 ac_add_options --enable-warnings-as-errors
 
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 . "$topsrcdir/build/mozconfig.cache"
--- a/browser/config/mozconfigs/win64/beta
+++ b/browser/config/mozconfigs/win64/beta
@@ -1,10 +1,9 @@
 . "$topsrcdir/build/mozconfig.win-common"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
 . "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
 
 mk_add_options MOZ_PGO=1
 
 ac_add_options --enable-official-branding
-. $topsrcdir/build/win64/mozconfig.vs2013
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/win64/common-opt
+++ b/browser/config/mozconfigs/win64/common-opt
@@ -20,10 +20,12 @@ fi
 ac_add_options --with-google-oauth-api-keyfile=${_google_oauth_api_keyfile}
 ac_add_options --with-mozilla-api-keyfile=/c/builds/mozilla-desktop-geoloc-api.key
 
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 export MOZ_TELEMETRY_REPORTING=1
 
+. $topsrcdir/build/win64/mozconfig.vs2013
+
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
--- a/browser/config/mozconfigs/win64/debug
+++ b/browser/config/mozconfigs/win64/debug
@@ -20,9 +20,11 @@ ac_add_options --with-google-oauth-api-k
 # Needed to enable breakpad in application.ini
 export MOZILLA_OFFICIAL=1
 
 # Package js shell.
 export MOZ_PACKAGE_JSSHELL=1
 
 . $topsrcdir/build/win64/mozconfig.vs2013
 
+. "$topsrcdir/build/mozconfig.cache"
+
 . "$topsrcdir/build/mozconfig.common.override"
new file mode 100644
--- /dev/null
+++ b/browser/config/mozconfigs/win64/l10n-mozconfig
@@ -0,0 +1,12 @@
+. "$topsrcdir/browser/config/mozconfigs/common"
+
+ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
+ac_add_options --enable-update-packaging
+ac_add_options --with-l10n-base=../../l10n
+ac_add_options --with-windows-version=603
+
+export MOZILLA_OFFICIAL=1
+
+. $topsrcdir/build/win64/mozconfig.vs2013
+
+. "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/win64/nightly
+++ b/browser/config/mozconfigs/win64/nightly
@@ -3,11 +3,11 @@
 . "$topsrcdir/browser/config/mozconfigs/win64/common-opt"
 
 ac_add_options --enable-signmar
 ac_add_options --enable-profiling
 
 # Nightlies only since this has a cost in performance
 ac_add_options --enable-js-diagnostics
 
-. $topsrcdir/build/win64/mozconfig.vs2013
+. "$topsrcdir/build/mozconfig.cache"
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/config/mozconfigs/win64/release
+++ b/browser/config/mozconfigs/win64/release
@@ -6,11 +6,10 @@
 
 mk_add_options MOZ_PGO=1
 
 ac_add_options --enable-official-branding
 
 # safeguard against someone forgetting to re-set EARLY_BETA_OR_EARLIER in
 # defines.sh during the beta cycle
 export BUILDING_RELEASE=1
-. $topsrcdir/build/win64/mozconfig.vs2013
 
 . "$topsrcdir/build/mozconfig.common.override"
--- a/browser/devtools/inspector/inspector.xul
+++ b/browser/devtools/inspector/inspector.xul
@@ -115,17 +115,17 @@
         <arrowscrollbox id="inspector-breadcrumbs"
           class="breadcrumbs-widget-container"
           flex="1" orient="horizontal"
           clicktoscroll="true"/>
         <textbox id="inspector-searchbox"
           type="search"
           timeout="50"
           class="devtools-searchinput"
-          placeholder="&inspectorSearchHTML.label;"/>
+          placeholder="&inspectorSearchHTML.label2;"/>
       </toolbar>
       <vbox flex="1" id="markup-box">
       </vbox>
     </vbox>
     <splitter class="devtools-side-splitter"/>
     <tabbox id="inspector-sidebar" handleCtrlTab="false" class="devtools-sidebar-tabs" hidden="true">
       <tabs/>
       <tabpanels flex="1"/>
--- a/browser/devtools/webide/themes/webide.css
+++ b/browser/devtools/webide/themes/webide.css
@@ -290,15 +290,17 @@ panel > .panel-arrowcontainer > .panel-a
   margin-top: -3px;
   position: relative;
   border-bottom: 1px solid #aaa;
 }
 
 /* Toolbox */
 
 #notificationbox[toolboxfullscreen] > .devtools-horizontal-splitter,
-#notificationbox[toolboxfullscreen] > #deck {
-  display: none;
+#notificationbox[toolboxfullscreen] > #deck,
+#notificationbox[toolboxfullscreen] > #deck > iframe {
+  min-height: 0;
+  max-height: 0;
 }
 
 #notificationbox[toolboxfullscreen] > #toolbox {
   -moz-box-flex: 1;
 }
--- a/browser/locales/en-US/chrome/browser/devtools/inspector.dtd
+++ b/browser/locales/en-US/chrome/browser/devtools/inspector.dtd
@@ -72,19 +72,19 @@
 <!-- LOCALIZATION NOTE (inspectorHTMLDelete.label): This is the label shown in
      the inspector contextual-menu for the item that lets users delete the
      current node -->
 <!ENTITY inspectorHTMLDelete.label          "Delete Node">
 <!ENTITY inspectorHTMLDelete.accesskey      "D">
 
 <!ENTITY inspector.selectButton.tooltip     "Select element with mouse">
 
-<!-- LOCALIZATION NOTE (inspectorSearchHTML.label): This is the label shown as
+<!-- LOCALIZATION NOTE (inspectorSearchHTML.label2): This is the label shown as
      the placeholder in inspector search box -->
-<!ENTITY inspectorSearchHTML.label          "Search HTML">
+<!ENTITY inspectorSearchHTML.label2          "Search with CSS Selectors">
 <!ENTITY inspectorSearchHTML.key            "F">
 
 <!-- LOCALIZATION NOTE (inspectorCopyImageDataUri.label): This is the label
      shown in the inspector contextual-menu for the item that lets users copy
      the URL embedding the image data encoded in Base 64 (what we name
      here Image Data URL). For more information:
      https://developer.mozilla.org/en-US/docs/Web/HTTP/data_URIs -->
 <!ENTITY inspectorCopyImageDataUri.label       "Copy Image Data-URL">
--- a/browser/themes/shared/tabs.inc.css
+++ b/browser/themes/shared/tabs.inc.css
@@ -2,21 +2,20 @@
 /* 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/. */
 %endif
 
 :root {
   --tab-toolbar-navbar-overlap: 1px;
   --tab-min-height: 31px;
+  --tab-curve-width: 30px;
+  --tab-curve-half-width: 15px;
 }
 
-%define tabCurveWidth 30px
-%define tabCurveHalfWidth 15px
-
 /* image preloading hack */
 #tabbrowser-tabs::before {
   /* Because of bug 853415, we need to ordinal this to the first position: */
   -moz-box-ordinal-group: 0;
   content: '';
   display: block;
   background-image:
     url(chrome://browser/skin/tabbrowser/tab-background-end.png),
@@ -50,19 +49,22 @@
 .tabbrowser-tab[selected=true] {
   position: relative;
   z-index: 2;
 }
 
 .tab-background-middle {
   -moz-box-flex: 1;
   background-clip: padding-box;
-  border-left: @tabCurveHalfWidth@ solid transparent;
-  border-right: @tabCurveHalfWidth@ solid transparent;
-  margin: 0 -@tabCurveHalfWidth@;
+  border-left: var(--tab-curve-half-width) solid transparent;
+  border-right: var(--tab-curve-half-width) solid transparent;
+  /* XXX: Switch to `margin: 0 calc(-1 * var(--tab-curve-half-width))` after bug 1099448 */
+  margin: 0;
+  -moz-margin-start: calc(-1 * var(--tab-curve-half-width));
+  -moz-margin-end: calc(-1 * var(--tab-curve-half-width));
 }
 
 .tab-content {
   -moz-padding-end: 9px;
   -moz-padding-start: 9px;
 }
 
 .tab-throbber,
@@ -103,23 +105,23 @@
   -moz-margin-start: 4px;
   -moz-margin-end: -2px;
   padding: 0;
 }
 
 .tab-background,
 .tabs-newtab-button {
   /* overlap the tab curves */
-  -moz-margin-end: -@tabCurveHalfWidth@;
-  -moz-margin-start: -@tabCurveHalfWidth@;
+  -moz-margin-end: calc(-1 * var(--tab-curve-half-width));
+  -moz-margin-start: calc(-1 * var(--tab-curve-half-width));
 }
 
 .tabbrowser-arrowscrollbox > .arrowscrollbox-scrollbox {
-  -moz-padding-end: @tabCurveHalfWidth@;
-  -moz-padding-start: @tabCurveHalfWidth@;
+  -moz-padding-end: var(--tab-curve-half-width);
+  -moz-padding-start: var(--tab-curve-half-width);
 }
 
 /* Tab Overflow */
 .tabbrowser-arrowscrollbox > .arrowscrollbox-overflow-start-indicator:not([collapsed]),
 .tabbrowser-arrowscrollbox > .arrowscrollbox-overflow-end-indicator:not([collapsed]) {
   background-image: url(chrome://browser/skin/tabbrowser/tab-overflow-indicator.png);
   background-size: 100% 100%;
   width: 14px;
@@ -156,17 +158,17 @@
 
 .tab-background-start[selected=true]::after,
 .tab-background-start[selected=true]::before,
 .tab-background-start,
 .tab-background-end,
 .tab-background-end[selected=true]::after,
 .tab-background-end[selected=true]::before {
   min-height: var(--tab-min-height);
-  width: @tabCurveWidth@;
+  width: var(--tab-curve-width);
 }
 
 .tabbrowser-tab:not([selected=true]),
 .tabbrowser-tab:-moz-lwtheme {
   color: inherit;
 }
 
 /* Selected tab */
@@ -178,17 +180,17 @@
    - ::after  - provides the border/stroke of the tab curve and is overlayed above ::before.  Pointer
                 events go through to ::before to get the proper shape.
  */
 
 
 .tab-background-start[selected=true]::after,
 .tab-background-end[selected=true]::after {
   /* position ::after on top of its parent */
-  -moz-margin-start: -@tabCurveWidth@;
+  -moz-margin-start: calc(-1 * var(--tab-curve-width));
   background-size: 100% 100%;
   content: "";
   display: -moz-box;
   position: relative;
 }
 
 .tab-background-start[selected=true]::before,
 .tab-background-end[selected=true]::before {
@@ -269,19 +271,19 @@
 /* End selected tab */
 
 /* new tab button border and gradient on hover */
 .tabbrowser-tab:hover > .tab-stack > .tab-background:not([selected=true]),
 .tabs-newtab-button:hover {
   background-image: url(chrome://browser/skin/tabbrowser/tab-background-start.png),
                     url(chrome://browser/skin/tabbrowser/tab-background-middle.png),
                     url(chrome://browser/skin/tabbrowser/tab-background-end.png);
-  background-position: left bottom, @tabCurveWidth@ bottom, right bottom;
+  background-position: left bottom, var(--tab-curve-width) bottom, right bottom;
   background-repeat: no-repeat;
-  background-size: @tabCurveWidth@ 100%, calc(100% - (2 * @tabCurveWidth@)) 100%, @tabCurveWidth@ 100%;
+  background-size: var(--tab-curve-width) 100%, calc(100% - (2 * var(--tab-curve-width))) 100%, var(--tab-curve-width) 100%;
 }
 
 /* Tab pointer-events */
 .tabbrowser-tab {
   pointer-events: none;
 }
 
 .tab-background-middle,
@@ -327,10 +329,10 @@
 #TabsToolbar[currentset]:not([currentset*="tabbrowser-tabs,new-tab-button"]) #tabbrowser-tabs:not([overflow]) > .tabbrowser-tab[last-visible-tab]:not([selected]):not([beforehovered]):not(:hover)::after {
   -moz-margin-start: -3px;
   -moz-margin-end: 0;
 }
 
 /* New tab button */
 
 .tabs-newtab-button {
-  width: calc(36px + @tabCurveWidth@);
+  width: calc(36px + var(--tab-curve-width));
 }
--- a/dom/camera/GonkCameraControl.cpp
+++ b/dom/camera/GonkCameraControl.cpp
@@ -1,10 +1,10 @@
 /*
- * Copyright (C) 2012-2014 Mozilla Foundation
+ * Copyright (C) 2012-2015 Mozilla Foundation
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
@@ -344,21 +344,29 @@ nsGonkCameraControl::SetConfigurationInt
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
 
     rv = Set(CAMERA_PARAM_RECORDINGHINT, config.mMode == kVideoMode);
     if (NS_FAILED(rv)) {
       DOM_CAMERA_LOGE("Failed to set recording hint (0x%x)\n", rv);
     }
+
+    mCurrentConfiguration.mMode = config.mMode;
+    mCurrentConfiguration.mRecorderProfile = config.mRecorderProfile;
+    
+    if (config.mMode == kPictureMode) {
+      mCurrentConfiguration.mPictureSize = config.mPictureSize;
+    } else /* if config.mMode == kVideoMode */ {
+      // The following is best-effort; we don't currently support taking
+      // pictures while in video mode, but we should at least return
+      // sane values to OnConfigurationChange() handlers...
+      SetPictureSizeImpl(config.mPictureSize);
+    }
   }
-
-  mCurrentConfiguration.mMode = config.mMode;
-  mCurrentConfiguration.mRecorderProfile = config.mRecorderProfile;
-  mCurrentConfiguration.mPictureSize = config.mPictureSize;
   return NS_OK;
 }
 
 nsresult
 nsGonkCameraControl::SetConfigurationImpl(const Configuration& aConfig)
 {
   DOM_CAMERA_LOGT("%s:%d\n", __func__, __LINE__);
   MOZ_ASSERT(NS_GetCurrentThread() == mCameraThread);
--- a/mobile/android/base/resources/layout/browser_toolbar.xml
+++ b/mobile/android/base/resources/layout/browser_toolbar.xml
@@ -1,37 +1,32 @@
 <?xml version="1.0" encoding="utf-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/. -->
 
 <merge xmlns:android="http://schemas.android.com/apk/res/android">
 
     <!-- Note: any layout parameters setting the right edge of
-         this View should be matched in the url_bar_translating_edge.
-
-         Note 2: On devices where the editing mode cancel button is
-         wider than the tabs counter and nearby buttons, the url bar will
-         shrink, in which case the LayoutParams of this View are
-         changed dynamically. -->
+         this View should be matched in the url_bar_translating_edge. -->
     <ImageView android:id="@+id/url_bar_entry"
                style="@style/UrlBar.Button"
                android:layout_marginLeft="8dp"
                android:layout_marginRight="-6dp"
                android:layout_marginTop="8dp"
                android:layout_marginBottom="8dp"
                android:layout_toLeftOf="@+id/tabs"
                android:duplicateParentState="true"
                android:clickable="false"
                android:focusable="false"
                android:src="@drawable/url_bar_entry"
                android:scaleType="fitXY"/>
 
     <!-- A View that clips with url_bar_entry and translates
-         around it to animate shrinking or growing the url bar,
+         around it to animate growing the url bar,
          which occurs in the display/editing mode transitions. -->
     <ImageView android:id="@+id/url_bar_translating_edge"
                style="@style/UrlBar.Button"
                android:layout_alignLeft="@id/url_bar_entry"
                android:layout_alignRight="@+id/url_bar_entry"
                android:layout_alignTop="@id/url_bar_entry"
                android:layout_alignBottom="@id/url_bar_entry"
                android:duplicateParentState="true"
--- a/mobile/android/base/resources/layout/home_empty_panel.xml
+++ b/mobile/android/base/resources/layout/home_empty_panel.xml
@@ -23,21 +23,24 @@
                android:gravity="top|center"
                android:scaleType="fitCenter"/>
 
     <TextView android:id="@+id/home_empty_text"
               android:layout_width="match_parent"
               android:layout_height="0dip"
               android:gravity="top|center"
               android:textAppearance="@style/TextAppearance.EmptyMessage"
-              android:layout_weight="2"/>
+              android:layout_weight="1"/>
 
     <TextView android:id="@+id/home_empty_hint"
               android:layout_width="match_parent"
-              android:layout_height="0dip"
+              android:layout_height="wrap_content"
               android:visibility="gone"
               android:gravity="top|center"
               android:textAppearance="@style/TextAppearance.EmptyHint"
-              android:textColorLink="#FFA62F"
-              android:layout_weight="4"/>
+              android:textColorLink="#FFA62F" />
+    <!-- Empty spacer view -->
+    <View android:layout_width="match_parent"
+          android:layout_height="0dip"
+          android:layout_weight="2"/>
 
 </LinearLayout>
 
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -22,16 +22,17 @@
 #includesubst @BOOKMARKSPATH@
 <resources>
   <string name="moz_app_displayname">@MOZ_APP_DISPLAYNAME@</string>
   <string name="android_package_name">@ANDROID_PACKAGE_NAME@</string>
   <string name="content_authority_db_browser">@ANDROID_PACKAGE_NAME@.db.browser</string>
   <string name="content_authority_db_formhistory">@ANDROID_PACKAGE_NAME@.db.formhistory</string>
   <string name="content_authority_db_passwords">@ANDROID_PACKAGE_NAME@.db.passwords</string>
   <string name="content_authority_db_tabs">@ANDROID_PACKAGE_NAME@.db.tabs</string>
+  <string name="content_authority_db_readinglist">@ANDROID_PACKAGE_NAME@.db.readinglist</string>
   <string name="moz_android_shared_account_type">@MOZ_ANDROID_SHARED_ACCOUNT_TYPE@</string>
   <string name="moz_android_shared_fxaccount_type">@MOZ_ANDROID_SHARED_FXACCOUNT_TYPE@</string>
   <string name="android_package_name_for_ui">@ANDROID_PACKAGE_NAME@</string>
 
 #include ../search/strings/search_strings.xml.in
 
 #include ../services/strings.xml.in
   <string name="no_space_to_start_error">&no_space_to_start_error;</string>
--- a/mobile/android/base/tests/BaseRobocopTest.java
+++ b/mobile/android/base/tests/BaseRobocopTest.java
@@ -5,30 +5,36 @@
 package org.mozilla.gecko.tests;
 
 import java.util.Map;
 
 import org.apache.http.HttpResponse;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.impl.client.DefaultHttpClient;
+import org.mozilla.gecko.Actions;
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.Assert;
+import org.mozilla.gecko.Driver;
 import org.mozilla.gecko.FennecInstrumentationTestRunner;
 import org.mozilla.gecko.FennecMochitestAssert;
+import org.mozilla.gecko.FennecNativeActions;
 import org.mozilla.gecko.FennecNativeDriver;
 import org.mozilla.gecko.FennecTalosAssert;
 import org.mozilla.gecko.updater.UpdateServiceHelper;
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.os.PowerManager;
 import android.test.ActivityInstrumentationTestCase2;
 import android.util.Log;
 
+import com.jayway.android.robotium.solo.Solo;
+
 @SuppressWarnings("unchecked")
 public abstract class BaseRobocopTest extends ActivityInstrumentationTestCase2<Activity> {
     public enum Type {
         MOCHITEST,
         TALOS
     }
 
     private static final String DEFAULT_ROOT_PATH = "/mnt/sdcard/tests";
@@ -56,16 +62,25 @@ public abstract class BaseRobocopTest ex
     protected String mLogFile;
 
     protected String mBaseHostnameUrl;
     protected String mBaseIpUrl;
 
     protected Map<String, String> mConfig;
     protected String mRootPath;
 
+    protected Solo mSolo;
+    protected Driver mDriver;
+    protected Actions mActions;
+
+    protected Activity mActivity;
+    protected String mProfile;
+
+    protected abstract Intent createActivityIntent();
+
     /**
      * The browser is started at the beginning of this test. A single test is a
      * class inheriting from <code>BaseRobocopTest</code> that contains test
      * methods.
      * <p>
      * If a test should not start the browser at the beginning of a test,
      * specify a different activity class to the one-argument constructor. To do
      * as little as possible, specify <code>Activity.class</code>.
@@ -104,28 +119,38 @@ public abstract class BaseRobocopTest ex
         mRootPath = FennecInstrumentationTestRunner.getFennecArguments().getString("deviceroot");
         if (mRootPath == null) {
             Log.w("Robocop", "Did not find deviceroot in arguments; falling back to: " + DEFAULT_ROOT_PATH);
             mRootPath = DEFAULT_ROOT_PATH;
         }
         String configFile = FennecNativeDriver.getFile(mRootPath + "/robotium.config");
         mConfig = FennecNativeDriver.convertTextToTable(configFile);
         mLogFile = mConfig.get("logfile");
+        mProfile = mConfig.get("profile");
+        mBaseHostnameUrl = mConfig.get("host").replaceAll("(/$)", "");
+        mBaseIpUrl = mConfig.get("rawhost").replaceAll("(/$)", "");
 
         // Initialize the asserter.
         if (getTestType() == Type.TALOS) {
             mAsserter = new FennecTalosAssert();
         } else {
             mAsserter = new FennecMochitestAssert();
         }
         mAsserter.setLogFile(mLogFile);
         mAsserter.setTestName(getClass().getName());
 
-        mBaseHostnameUrl = mConfig.get("host").replaceAll("(/$)", "");
-        mBaseIpUrl = mConfig.get("rawhost").replaceAll("(/$)", "");
+        // Start the activity.
+        final Intent intent = createActivityIntent();
+        setActivityIntent(intent);
+        mActivity = getActivity();
+
+        // Set up Robotium.solo and Driver objects
+        mSolo = new Solo(getInstrumentation(), mActivity);
+        mDriver = new FennecNativeDriver(mActivity, mSolo, mRootPath);
+        mActions = new FennecNativeActions(mActivity, mSolo, getInstrumentation(), mAsserter);
     }
 
     /**
      * Function to early abort if we can't reach the given HTTP server. Provides local testers
      * with diagnostic information. Not currently available for TALOS tests, which are rarely run
      * locally in any case.
      */
     public void throwIfHttpGetFails() {
--- a/mobile/android/base/tests/BaseTest.java
+++ b/mobile/android/base/tests/BaseTest.java
@@ -10,22 +10,19 @@ import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.HashSet;
 
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
+
 import org.mozilla.gecko.Actions;
-import org.mozilla.gecko.BrowserApp;
-import org.mozilla.gecko.Driver;
 import org.mozilla.gecko.Element;
-import org.mozilla.gecko.FennecNativeActions;
-import org.mozilla.gecko.FennecNativeDriver;
 import org.mozilla.gecko.GeckoAppShell;
 import org.mozilla.gecko.GeckoEvent;
 import org.mozilla.gecko.GeckoProfile;
 import org.mozilla.gecko.GeckoThread;
 import org.mozilla.gecko.GeckoThread.LaunchState;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.RobocopUtils;
 import org.mozilla.gecko.Tab;
@@ -67,22 +64,17 @@ abstract class BaseTest extends BaseRobo
     private static final int MAX_WAIT_VERIFY_PAGE_TITLE_MS = 15000;
     public static final int MAX_WAIT_MS = 4500;
     public static final int LONG_PRESS_TIME = 6000;
     private static final int GECKO_READY_WAIT_MS = 180000;
     public static final int MAX_WAIT_BLOCK_FOR_EVENT_DATA_MS = 90000;
 
     protected static final String URL_HTTP_PREFIX = "http://";
 
-    private Activity mActivity;
     private int mPreferenceRequestID = 0;
-    protected Solo mSolo;
-    protected Driver mDriver;
-    protected Actions mActions;
-    protected String mProfile;
     public Device mDevice;
     protected DatabaseHelper mDatabaseHelper;
     protected int mScreenMidWidth;
     protected int mScreenMidHeight;
     private final HashSet<Integer> mKnownTabIDs = new HashSet<Integer>();
 
     protected void blockForDelayedStartup() {
         try {
@@ -105,40 +97,16 @@ abstract class BaseTest extends BaseRobo
             mAsserter.dumpLog("Exception in blockForGeckoReady", e);
         }
     }
 
     @Override
     public void setUp() throws Exception {
         super.setUp();
 
-        // Create the intent to be used with all the important arguments.
-        Intent i = new Intent(Intent.ACTION_MAIN);
-        mProfile = mConfig.get("profile");
-
-        // Don't show the first run experience.
-        i.putExtra(BrowserApp.EXTRA_SKIP_STARTPANE, true);
-
-        i.putExtra("args", "-no-remote -profile " + mProfile);
-
-        String envString = mConfig.get("envvars");
-        if (envString != "") {
-            String[] envStrings = envString.split(",");
-            for (int iter = 0; iter < envStrings.length; iter++) {
-                i.putExtra("env" + iter, envStrings[iter]);
-            }
-        }
-
-        // Start the activity.
-        setActivityIntent(i);
-        mActivity = getActivity();
-        // Set up Robotium.solo and Driver objects
-        mSolo = new Solo(getInstrumentation(), mActivity);
-        mDriver = new FennecNativeDriver(mActivity, mSolo, mRootPath);
-        mActions = new FennecNativeActions(mActivity, mSolo, getInstrumentation(), mAsserter);
         mDevice = new Device();
         mDatabaseHelper = new DatabaseHelper(mActivity, mAsserter);
 
         // Ensure Robocop tests have access to network, and are run with Display powered on.
         throwIfHttpGetFails();
         throwIfScreenNotOn();
     }
 
@@ -185,16 +153,33 @@ abstract class BaseTest extends BaseRobo
             // if still running, finish activities as recommended by Robotium
             mSolo.finishOpenedActivities();
         } catch (Throwable e) {
             e.printStackTrace();
         }
         super.tearDown();
     }
 
+    @Override
+    protected Intent createActivityIntent() {
+        final Intent intent = new Intent(Intent.ACTION_MAIN);
+        intent.putExtra("args", "-no-remote -profile " + mProfile);
+
+        final String envString = mConfig.get("envvars");
+        if (!TextUtils.isEmpty(envString)) {
+            final String[] envStrings = envString.split(",");
+
+            for (int iter = 0; iter < envStrings.length; iter++) {
+                intent.putExtra("env" + iter, envStrings[iter]);
+            }
+        }
+
+        return intent;
+    }
+
     public void assertMatches(String value, String regex, String name) {
         if (value == null) {
             mAsserter.ok(false, name, "Expected /" + regex + "/, got null");
             return;
         }
         mAsserter.ok(value.matches(regex), name, "Expected /" + regex +"/, got \"" + value + "\"");
     }
 
--- a/mobile/android/base/tests/UITest.java
+++ b/mobile/android/base/tests/UITest.java
@@ -1,32 +1,27 @@
 /* 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.tests;
 
-import java.util.Map;
-
 import org.mozilla.gecko.Actions;
 import org.mozilla.gecko.Assert;
 import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.Driver;
-import org.mozilla.gecko.FennecNativeActions;
-import org.mozilla.gecko.FennecNativeDriver;
 import org.mozilla.gecko.GeckoAppShell;
 import org.mozilla.gecko.GeckoEvent;
 import org.mozilla.gecko.tests.components.AboutHomeComponent;
 import org.mozilla.gecko.tests.components.AppMenuComponent;
 import org.mozilla.gecko.tests.components.BaseComponent;
 import org.mozilla.gecko.tests.components.GeckoViewComponent;
 import org.mozilla.gecko.tests.components.ToolbarComponent;
 import org.mozilla.gecko.tests.helpers.HelperInitializer;
 
-import android.app.Activity;
 import android.content.Intent;
 import android.text.TextUtils;
 
 import com.jayway.android.robotium.solo.Solo;
 
 /**
  * A base test class for Robocop (UI-centric) tests. This and the related classes attempt to
  * provide a framework to improve upon the issues discovered with the previous BaseTest
@@ -37,38 +32,25 @@ import com.jayway.android.robotium.solo.
  * https://wiki.mozilla.org/Mobile/Fennec/Android/UITest
  */
 abstract class UITest extends BaseRobocopTest
                       implements UITestContext {
 
     private static final String JUNIT_FAILURE_MSG = "A JUnit method was called. Make sure " +
         "you are using AssertionHelper to make assertions. Try `fAssert*(...);`";
 
-    private Solo mSolo;
-    private Driver mDriver;
-    private Actions mActions;
-
     protected AboutHomeComponent mAboutHome;
     protected AppMenuComponent mAppMenu;
     protected GeckoViewComponent mGeckoView;
     protected ToolbarComponent mToolbar;
 
     @Override
     protected void setUp() throws Exception {
         super.setUp();
 
-        // Start the activity.
-        final Intent intent = createActivityIntent(mConfig);
-        setActivityIntent(intent);
-        final Activity activity = getActivity();
-
-        mSolo = new Solo(getInstrumentation(), activity);
-        mDriver = new FennecNativeDriver(activity, mSolo, mRootPath);
-        mActions = new FennecNativeActions(activity, mSolo, getInstrumentation(), mAsserter);
-
         // Helpers depend on components so initialize them first.
         initComponents();
         initHelpers();
 
         // Ensure Robocop tests have access to network, and are run with Display powered on.
         throwIfHttpGetFails();
         throwIfScreenNotOn();
     }
@@ -186,26 +168,25 @@ abstract class UITest extends BaseRoboco
     public String getAbsoluteIpUrl(final String url) {
         return getAbsoluteUrl(mBaseIpUrl, url);
     }
 
     private String getAbsoluteUrl(final String baseUrl, final String url) {
         return baseUrl + "/" + url.replaceAll("(^/)", "");
     }
 
-    private static Intent createActivityIntent(final Map<String, String> config) {
+    @Override
+    protected Intent createActivityIntent() {
         final Intent intent = new Intent(Intent.ACTION_MAIN);
 
         // Don't show the first run experience.
         intent.putExtra(BrowserApp.EXTRA_SKIP_STARTPANE, true);
+        intent.putExtra("args", "-no-remote -profile " + mProfile);
 
-        final String profile = config.get("profile");
-        intent.putExtra("args", "-no-remote -profile " + profile);
-
-        final String envString = config.get("envvars");
+        final String envString = mConfig.get("envvars");
         if (!TextUtils.isEmpty(envString)) {
             final String[] envStrings = envString.split(",");
 
             for (int iter = 0; iter < envStrings.length; iter++) {
                 intent.putExtra("env" + iter, envStrings[iter]);
             }
         }
 
--- a/mobile/android/base/tests/testBrowserProviderPerf.java
+++ b/mobile/android/base/tests/testBrowserProviderPerf.java
@@ -14,16 +14,17 @@ import org.mozilla.gecko.db.BrowserDB.Fi
 import org.mozilla.gecko.db.BrowserProvider;
 import org.mozilla.gecko.db.LocalBrowserDB;
 import org.mozilla.gecko.util.FileUtils;
 
 import android.content.ContentProvider;
 import android.content.ContentProviderClient;
 import android.content.ContentResolver;
 import android.content.ContentValues;
+import android.content.Intent;
 import android.database.Cursor;
 import android.database.sqlite.SQLiteDatabase;
 import android.net.Uri;
 import android.os.SystemClock;
 import android.util.Log;
 
 /**
  * This test is meant to exercise the performance of Fennec's history and
@@ -308,9 +309,16 @@ public class testBrowserProviderPerf ext
             mAsserter.is(count, limit, "Retrieved results");
             mAsserter.dumpLog("Results: " + count);
             mAsserter.dumpLog("__start_report" + Long.toString(end - start) + "__end_report");
             mAsserter.dumpLog("__startTimestamp" + Long.toString(end - start) + "__endTimestamp");
         } finally {
             c.close();
         }
     }
+
+    // Returning null here refers to the default intent and it shouldn't
+    // impede activity launch.
+    @Override
+    protected Intent createActivityIntent() {
+        return null;
+    }
 }
--- a/mobile/android/base/toolbar/BrowserToolbarNewTablet.java
+++ b/mobile/android/base/toolbar/BrowserToolbarNewTablet.java
@@ -186,20 +186,24 @@ class BrowserToolbarNewTablet extends Br
     @Override
     public String commitEdit() {
         stopEditingNewTablet();
         return super.commitEdit();
     }
 
     @Override
     public String cancelEdit() {
-        stopEditingNewTablet();
+        // This can get called when we're not editing but we only want
+        // to make these changes when leaving editing mode.
+        if (isEditing()) {
+            stopEditingNewTablet();
 
-        setButtonEnabled(backButton, backButtonWasEnabledOnStartEditing);
-        updateForwardButtonState(forwardButtonState);
+            setButtonEnabled(backButton, backButtonWasEnabledOnStartEditing);
+            updateForwardButtonState(forwardButtonState);
+        }
 
         return super.cancelEdit();
     }
 
     private void stopEditingNewTablet() {
         // Undo the changes caused by calling setButtonEnabled in startEditing.
         // Note that this should be called first so the enabled state of the
         // forward button is set to the proper value.
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -4446,18 +4446,17 @@ Tab.prototype = {
       } catch (e) {}
     }
 
     // Update the page actions URI for helper apps.
     if (BrowserApp.selectedTab == this) {
       ExternalApps.updatePageActionUri(fixedURI);
     }
 
-    let webNav = BrowserApp.selectedTab.window
-        .QueryInterface(Ci.nsIInterfaceRequestor)
+    let webNav = contentWin.QueryInterface(Ci.nsIInterfaceRequestor)
         .getInterface(Ci.nsIWebNavigation);
 
     let message = {
       type: "Content:LocationChange",
       tabID: this.id,
       uri: truncate(fixedURI.spec, MAX_URI_LENGTH),
       userRequested: this.userRequested || "",
       baseDomain: baseDomain,
--- a/toolkit/components/places/Bookmarks.jsm
+++ b/toolkit/components/places/Bookmarks.jsm
@@ -528,17 +528,17 @@ let Bookmarks = Object.freeze({
       throw new Error(`Unexpected number of conditions provided: ${conditionsCount}`);
 
     // Even if we ignore any other unneeded property, we still validate any
     // known property to reduce likelihood of hidden bugs.
     let fetchInfo = validateBookmarkObject(info,
       { parentGuid: { requiredIf: b => b.hasOwnProperty("index") }
       , index: { requiredIf: b => b.hasOwnProperty("parentGuid")
                , validIf: b => typeof(b.index) == "number" &&
-                               b.index >= 0 }
+                               b.index >= 0 || b.index == this.DEFAULT_INDEX }
       , keyword: { validIf: b => typeof(b.keyword) == "string" &&
                                  b.keyword.length > 0 }
       });
 
     return Task.spawn(function* () {
       let results;
       if (fetchInfo.hasOwnProperty("guid"))
         results = yield fetchBookmark(fetchInfo);
@@ -910,29 +910,33 @@ function* fetchBookmark(info) {
      WHERE b.guid = :guid
     `, { guid: info.guid });
 
   return rows.length ? rowsToItemsArray(rows)[0] : null;
 }
 
 function* fetchBookmarkByPosition(info) {
   let db = yield DBConnPromised;
+  let index = info.index == Bookmarks.DEFAULT_INDEX ? null : info.index;
 
   let rows = yield db.executeCached(
     `SELECT b.guid, IFNULL(p.guid, "") AS parentGuid, b.position AS 'index',
             b.dateAdded, b.lastModified, b.type, b.title, h.url AS url,
             keyword, b.id AS _id, b.parent AS _parentId,
             (SELECT count(*) FROM moz_bookmarks WHERE parent = b.id) AS _childCount,
             p.parent AS _grandParentId
      FROM moz_bookmarks b
      LEFT JOIN moz_bookmarks p ON p.id = b.parent
      LEFT JOIN moz_keywords k ON k.id = b.keyword_id
      LEFT JOIN moz_places h ON h.id = b.fk
-     WHERE p.guid = :parentGuid AND b.position = :index
-    `, { parentGuid: info.parentGuid, index: info.index });
+     WHERE p.guid = :parentGuid
+     AND b.position = IFNULL(:index, (SELECT count(*) - 1
+                                      FROM moz_bookmarks
+                                      WHERE parent = p.id))
+    `, { parentGuid: info.parentGuid, index });
 
   return rows.length ? rowsToItemsArray(rows)[0] : null;
 }
 
 function* fetchBookmarksByURL(info) {
   let db = yield DBConnPromised;
 
   let rows = yield db.executeCached(
--- a/toolkit/components/places/tests/bookmarks/test_bookmarks_fetch.js
+++ b/toolkit/components/places/tests/bookmarks/test_bookmarks_fetch.js
@@ -61,19 +61,16 @@ add_task(function* invalid_input_throws(
                                                     index: "0" }),
                 /Invalid value for property 'index'/);
   Assert.throws(() => PlacesUtils.bookmarks.fetch({ parentGuid: "123456789012",
                                                     index: null }),
                 /Invalid value for property 'index'/);
   Assert.throws(() => PlacesUtils.bookmarks.fetch({ parentGuid: "123456789012",
                                                     index: -10 }),
                 /Invalid value for property 'index'/);
-  Assert.throws(() => PlacesUtils.bookmarks.fetch({ parentGuid: "123456789012",
-                                                    index: -1 }),
-                /Invalid value for property 'index'/);
 
   Assert.throws(() => PlacesUtils.bookmarks.fetch({ url: "http://te st/" }),
                 /Invalid value for property 'url'/);
   Assert.throws(() => PlacesUtils.bookmarks.fetch({ url: null }),
                 /Invalid value for property 'url'/);
   Assert.throws(() => PlacesUtils.bookmarks.fetch({ url: -10 }),
                 /Invalid value for property 'url'/);
 
@@ -236,16 +233,43 @@ add_task(function* fetch_byposition() {
   Assert.equal(bm2.index, 0);
   Assert.deepEqual(bm2.dateAdded, bm2.lastModified);
   Assert.equal(bm2.type, PlacesUtils.bookmarks.TYPE_BOOKMARK);
   Assert.equal(bm2.url.href, "http://example.com/");
   Assert.equal(bm2.title, "a bookmark");
   Assert.ok(!("keyword" in bm2));
 });
 
+add_task(function* fetch_byposition_default_index() {
+  let bm1 = yield PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+                                                 type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
+                                                 url: "http://example.com/last",
+                                                 title: "last child" });
+  checkBookmarkObject(bm1);
+
+  let bm2 = yield PlacesUtils.bookmarks.fetch({ parentGuid: bm1.parentGuid,
+                                                index: PlacesUtils.bookmarks.DEFAULT_INDEX },
+                                              gAccumulator.callback);
+  checkBookmarkObject(bm2);
+  Assert.equal(gAccumulator.results.length, 1);
+  checkBookmarkObject(gAccumulator.results[0]);
+  Assert.deepEqual(gAccumulator.results[0], bm1);
+
+  Assert.deepEqual(bm1, bm2);
+  Assert.equal(bm2.parentGuid, PlacesUtils.bookmarks.unfiledGuid);
+  Assert.equal(bm2.index, 1);
+  Assert.deepEqual(bm2.dateAdded, bm2.lastModified);
+  Assert.equal(bm2.type, PlacesUtils.bookmarks.TYPE_BOOKMARK);
+  Assert.equal(bm2.url.href, "http://example.com/last");
+  Assert.equal(bm2.title, "last child");
+  Assert.ok(!("keyword" in bm2));
+
+  yield PlacesUtils.bookmarks.remove(bm1.guid);
+});
+
 add_task(function* fetch_byurl_nonexisting() {
   let bm = yield PlacesUtils.bookmarks.fetch({ url: "http://nonexisting.com/" },
                                              gAccumulator.callback);
   Assert.equal(bm, null);
   Assert.equal(gAccumulator.results.length, 0);
 });
 
 add_task(function* fetch_byurl() {
--- a/toolkit/components/telemetry/Histograms.json
+++ b/toolkit/components/telemetry/Histograms.json
@@ -6617,17 +6617,17 @@
     "kind": "enumerated",
     "n_values": 24,
     "description": "DHE KEA (TLS_DHE_*) key size in full handshake"
   },
   "SSL_KEA_ECDHE_CURVE_FULL": {
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": "36",
-    "description": "ECDHE KEA (TLS_ECDHE_*) curve (1=P-256, 2=P-384, 3=P-521) in full handshake"
+    "description": "ECDHE KEA (TLS_ECDHE_*) curve (23=P-256, 24=P-384, 25=P-521) in full handshake"
   },
   "SSL_AUTH_ALGORITHM_FULL": {
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 16,
     "description": "SSL Authentication Algorithm (null=0, rsa=1, dsa=2, ecdsa=4) in full handshake"
   },
   "SSL_AUTH_RSA_KEY_SIZE_FULL": {
@@ -6641,17 +6641,17 @@
     "kind": "enumerated",
     "n_values": 24,
     "description": "DSA signature key size for TLS_*_DSS_* in full handshake"
   },
   "SSL_AUTH_ECDSA_CURVE_FULL": {
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": "36",
-    "description": "ECDSA signature curve for TLS_*_ECDSA_* in full handshake (1=P-256, 2=P-384, 3=P-521)"
+    "description": "ECDSA signature curve for TLS_*_ECDSA_* in full handshake (23=P-256, 24=P-384, 25=P-521)"
   },
   "SSL_SYMMETRIC_CIPHER_FULL": {
     "expires_in_version": "never",
     "kind": "enumerated",
     "n_values": 32,
     "description": "Symmetric cipher used in full handshake (null=0, rc4=1, 3des=4, aes-cbc=7, camellia=8, seed=9, aes-gcm=10)"
   },
   "SSL_SYMMETRIC_CIPHER_RESUMED": {
--- a/toolkit/devtools/server/actors/script.js
+++ b/toolkit/devtools/server/actors/script.js
@@ -2725,22 +2725,20 @@ SourceActor.prototype = {
       }
       else {
         return this._createBreakpoint(genLoc, originalLoc, aRequest.condition);
       }
     });
   },
 
   _createBreakpoint: function(loc, originalLoc, condition) {
-    return resolve(null).then(() => {
-      return this.setBreakpoint({
-        line: loc.line,
-        column: loc.column,
-      }, condition);
-    }).then(response => {
+    return this.setBreakpoint({
+      line: loc.line,
+      column: loc.column,
+    }, condition).then(response => {
       var actual = response.actualLocation;
       if (actual) {
         if (this.source) {
           return this.threadActor.sources.getOriginalLocation({
             source: this.source,
             line: actual.line,
             column: actual.column
           }).then(({ sourceActor, line, column }) => {
@@ -2927,27 +2925,27 @@ SourceActor.prototype = {
 
     if (scripts.length === 0) {
       // Since we did not find any scripts to set the breakpoint on now, return
       // early. When a new script that matches this breakpoint location is
       // introduced, the breakpoint actor will already be in the breakpoint
       // store and the breakpoint will be set at that time. This is similar to
       // GDB's "pending" breakpoints for shared libraries that aren't loaded
       // yet.
-      return {
+      return Promise.resolve({
         actor: actor.actorID
-      }
+      });
     }
 
     // Ignore scripts for which the BreakpointActor is already a breakpoint
     // handler.
     scripts = scripts.filter((script) => !actor.hasScript(script));
 
     if (location.column) {
-      return this._setBreakpointAtColumn(scripts, location, actor);
+      return Promise.resolve(this._setBreakpointAtColumn(scripts, location, actor));
     }
 
     let result;
     if (actor.scripts.size === 0) {
       // If the BreakpointActor is not a breakpoint handler for any script, its
       // location is not yet fixed. Use breakpoint sliding to select the first
       // line greater than or equal to the requested line that has one or more
       // offsets.
@@ -2961,20 +2959,20 @@ SourceActor.prototype = {
         result = {
           line: location.line,
           entryPoints: entryPoints
         };
       }
     }
 
     if (!result) {
-      return {
+      return Promise.resolve({
         error: "noCodeAtLineColumn",
         actor: actor.actorID
-      };
+      });
     }
 
     const { line, entryPoints } = result;
     const actualLocation = line !== location.line
                          ? { sourceActor: this, line }
       : undefined;
 
     if (actualLocation) {
@@ -2982,37 +2980,37 @@ SourceActor.prototype = {
       // location. If we do have an existing actor, then the actor we created
       // above is redundant and must be destroyed. If we do not have an existing
       // actor, we need to update the breakpoint store with the new location.
 
       let existingActor = this.breakpointActorMap.getActor(actualLocation);
       if (existingActor) {
         actor.onDelete();
         this.breakpointActorMap.deleteActor(location);
-        return {
+        return Promise.resolve({
           actor: existingActor.actorID,
           actualLocation
-        };
+        });
       } else {
         actor.location = actualLocation;
         actor.location = {
           sourceActor: this,
           line: actualLocation.line
         };
         this.breakpointActorMap.deleteActor(location);
         this.breakpointActorMap.setActor(actualLocation, actor);
       }
     }
 
     setBreakpointOnEntryPoints(this.threadActor, actor, entryPoints);
 
-    return {
+    return Promise.resolve({
       actor: actor.actorID,
       actualLocation
-    };
+    });
   },
 
   /**
    * Find all of the offset mappings associated with `aScript` that are closest
    * to `aTargetLocation`. If new offset mappings are found that are closer to
    * `aTargetOffset` than the existing offset mappings inside
    * `aScriptsAndOffsetMappings`, we empty that map and only consider the
    * closest offset mappings.
--- a/toolkit/devtools/server/tests/browser/browser_animation_actors_02.js
+++ b/toolkit/devtools/server/tests/browser/browser_animation_actors_02.js
@@ -42,16 +42,17 @@ function* theRightNumberOfPlayersIsRetur
   node = yield walker.querySelector(walker.rootNode, ".transition");
   players = yield front.getAnimationPlayersForNode(node);
   is(players.length, 1, "One animation player was returned for the transitioned node");
 }
 
 function* playersCanBePausedAndResumed(walker, front) {
   let node = yield walker.querySelector(walker.rootNode, ".simple-animation");
   let [player] = yield front.getAnimationPlayersForNode(node);
+  yield player.ready;
 
   ok(player.initialState, "The player has an initialState");
   ok(player.getCurrentState, "The player has the getCurrentState method");
   is(player.initialState.playState, "running", "The animation is currently running");
 
   yield player.pause();
   let state = yield player.getCurrentState();
   is(state.playState, "paused", "The animation is now paused");
--- a/toolkit/themes/shared/in-content/common.inc.css
+++ b/toolkit/themes/shared/in-content/common.inc.css
@@ -378,33 +378,33 @@ xul|textbox[focused] {
 html|textbox:disabled,
 xul|textbox[disabled="true"] {
   opacity: 0.5;
 }
 
 /* Links */
 
 html|a,
-xul|*.text-link,
-xul|*.inline-link {
+.text-link,
+.inline-link {
   line-height: 22px;
   color: #0095dd;
   text-decoration: none;
 }
 
 html|a:hover,
-xul|*.text-link:hover,
-xul|*.inline-link:hover {
-  color: #4cb1ff;
-  text-decoration: none;
+.text-link:hover,
+.inline-link:hover {
+  color: #178ce5;
+  text-decoration: underline;
 }
 
 html|a:hover:active,
-xul|*.text-link:hover:active,
-xul|*.inline-link:hover:active {
+.text-link:hover:active,
+.inline-link:hover:active {
   color: #ff9500;
   text-decoration: none;
 }
 
 /* Checkboxes and radio buttons */
 
 xul|checkbox {
   -moz-margin-start: 0;