Merge m-c to mozilla-inbound
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Thu, 22 Oct 2015 11:55:01 +0200
changeset 304140 23796582512a42dd726128c6ab638f28af6aa287
parent 304139 6946d1be728f7df2e6206281732089c088a2f6bf (current diff)
parent 304101 76bd0c01d72e64ca4f261ffdb2652a91f961e930 (diff)
child 304141 105c07e0c6ad723cf710d3bb56ede01921ad8a89
push id1001
push userraliiev@mozilla.com
push dateMon, 18 Jan 2016 19:06:03 +0000
treeherdermozilla-release@8b89261f3ac4 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone44.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to mozilla-inbound
mobile/android/gradle/thirdparty_adjust_sdk/AndroidManifest.xml
mobile/android/gradle/thirdparty_adjust_sdk/build.gradle
--- a/.hgignore
+++ b/.hgignore
@@ -47,18 +47,22 @@
 # SVN directories
 \.svn/
 
 # Ignore the files and directory that Eclipse IDE creates
 \.project$
 \.cproject$
 \.settings/
 
-# Ignore the directory that JetBrains IDEs create
+# Ignore the files and directory that JetBrains IDEs create.
 \.idea/
+\.iml$
+
+# Gradle cache.
+^.gradle/
 
 # Python stuff installed at build time.
 ^python/psutil/.*\.so
 ^python/psutil/.*\.pyd
 ^python/psutil/build/
 
 # Git repositories
 .git/
--- a/b2g/config/aries/sources.xml
+++ b/b2g/config/aries/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="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
--- 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="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
--- 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="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <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="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="4ace9aaee0e048dfda11bb787646c59982a3dc80"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
--- 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="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <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="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
--- 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="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>
--- a/b2g/config/emulator-l/sources.xml
+++ b/b2g/config/emulator-l/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="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>
--- 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="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <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="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="4ace9aaee0e048dfda11bb787646c59982a3dc80"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="c72c9278ddc2f442d193474993d36e7f2cfb08c4"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
--- 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="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "1b902ff26547e2a6c896351a6a73b673f65e19b2", 
+        "git_revision": "29ce8ec8606e59f582375234440812b046346513", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "8b7263ff51b72b49a16f3ff09ea98182aad1ffee", 
+    "revision": "9ba6b51b109bb675c8c8c2687c75b088df7e50ac", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4-kk/sources.xml
+++ b/b2g/config/nexus-4-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="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -13,17 +13,17 @@
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <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="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="0c28789b9957913be975eb002a22323f93585d4c"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
   <project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
--- a/b2g/config/nexus-5-l/sources.xml
+++ b/b2g/config/nexus-5-l/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="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="1b902ff26547e2a6c896351a6a73b673f65e19b2"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="29ce8ec8606e59f582375234440812b046346513"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="fake-qemu-kernel" path="prebuilts/qemu-kernel" remote="b2g" revision="939b377d55a2f081d94029a30a75d05e5a20daf3"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="3b9a47b517d345b8d98bc7f787b9a6c2f51ca75d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
--- a/browser/branding/aurora/content/aboutDialog.css
+++ b/browser/branding/aurora/content/aboutDialog.css
@@ -4,16 +4,26 @@
 
 #aboutDialogContainer {
   background-image: url("chrome://branding/content/about-background.png");
   background-repeat: no-repeat;
   background-color: rgb(26,58,99);
   color: #fff;
 }
 
+/* Use inverted spinner icon on the dark background */
+.update-throbber {
+  list-style-image: url("chrome://global/skin/icons/loading-inverted.png");
+}
+@media (min-resolution: 1.1dppx) {
+  .update-throbber {
+    list-style-image: url("chrome://global/skin/icons/loading-inverted@2x.png");
+  }
+}
+
 .text-link {
   color: #fff !important;
   text-decoration: underline;
 }
 
 .text-link:-moz-focusring {
   border-color: #fff;
 }
--- a/browser/branding/nightly/content/aboutDialog.css
+++ b/browser/branding/nightly/content/aboutDialog.css
@@ -4,16 +4,26 @@
 
 #aboutDialogContainer {
   background-image: url("chrome://branding/content/about-background.png");
   background-repeat: no-repeat;
   background-color: rgb(10,17,37);
   color: #fff;
 }
 
+/* Use inverted spinner icon on the dark background */
+.update-throbber {
+  list-style-image: url("chrome://global/skin/icons/loading-inverted.png");
+}
+@media (min-resolution: 1.1dppx) {
+  .update-throbber {
+    list-style-image: url("chrome://global/skin/icons/loading-inverted@2x.png");
+  }
+}
+
 .text-link {
   color: #fff !important;
   text-decoration: underline;
 }
 
 .text-link:-moz-focusring {
   border-color: #fff;
 }
--- a/browser/branding/unofficial/content/aboutDialog.css
+++ b/browser/branding/unofficial/content/aboutDialog.css
@@ -4,16 +4,26 @@
 
 #aboutDialogContainer {
   background-image: url("chrome://branding/content/about-background.png");
   background-repeat: no-repeat;
   background-color: #000;
   color: #fff;
 }
 
+/* Use inverted spinner icon on the dark background */
+.update-throbber {
+  list-style-image: url("chrome://global/skin/icons/loading-inverted.png");
+}
+@media (min-resolution: 1.1dppx) {
+  .update-throbber {
+    list-style-image: url("chrome://global/skin/icons/loading-inverted@2x.png");
+  }
+}
+
 .text-link {
   color: #fff !important;
   text-decoration: underline;
 }
 
 #rightBox {
   /* this margin prevents text from overlapping the planet image */
   margin-left: 280px;
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -123,43 +123,48 @@ global.openPanel = (node, popupURL, exte
   Services.scriptSecurityManager.checkLoadURIWithPrincipal(
     extension.principal, popupURI,
     Services.scriptSecurityManager.DISALLOW_SCRIPT);
 
   let panel = document.createElement("panel");
   panel.setAttribute("id", makeWidgetId(extension.id) + "-panel");
   panel.setAttribute("class", "browser-extension-panel");
   panel.setAttribute("type", "arrow");
-  panel.setAttribute("flip", "slide");
+  panel.setAttribute("role", "group");
 
   let anchor;
   if (node.localName == "toolbarbutton") {
     // Toolbar buttons are a special case. The panel becomes a child of
     // the button, and is anchored to the button's icon.
     node.appendChild(panel);
     anchor = document.getAnonymousElementByAttribute(node, "class", "toolbarbutton-icon");
   } else {
     // In all other cases, the panel is anchored to the target node
     // itself, and is a child of a popupset node.
     document.getElementById("mainPopupSet").appendChild(panel);
     anchor = node;
   }
 
-  let context;
-  panel.addEventListener("popuphidden", () => {
-    context.unload();
-    panel.remove();
-  });
-
   const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
   let browser = document.createElementNS(XUL_NS, "browser");
   browser.setAttribute("type", "content");
   browser.setAttribute("disableglobalhistory", "true");
   panel.appendChild(browser);
 
+  let titleChangedListener = () => {
+    panel.setAttribute("aria-label", browser.contentTitle);
+  }
+
+  let context;
+  panel.addEventListener("popuphidden", () => {
+    browser.removeEventListener("DOMTitleChanged", titleChangedListener, true);
+    context.unload();
+    panel.remove();
+  });
+
   let loadListener = () => {
     panel.removeEventListener("load", loadListener);
 
     context = new ExtensionPage(extension, {
       type: "popup",
       contentWindow: browser.contentWindow,
       uri: popupURI,
       docShell: browser.docShell,
@@ -187,16 +192,18 @@ global.openPanel = (node, popupURL, exte
       height = Math.min(height, 800);
 
       browser.setAttribute("width", width);
       browser.setAttribute("height", height);
 
       panel.openPopup(anchor, "bottomcenter topright", 0, 0, false, false);
     };
     browser.addEventListener("load", contentLoadListener, true);
+
+    browser.addEventListener("DOMTitleChanged", titleChangedListener, true);
   };
   panel.addEventListener("load", loadListener);
 
   return panel;
 }
 
 // Manages tab-specific context data, and dispatching tab select events
 // across all windows.
--- a/browser/components/loop/ui/fake-mozLoop.js
+++ b/browser/components/loop/ui/fake-mozLoop.js
@@ -112,17 +112,19 @@ var fakeRooms = [
    */
   navigator.mozLoop = {
     ensureRegistered: function() {},
     getAudioBlob: function(){},
     getLoopPref: function(pref) {
       switch(pref) {
         // Ensure we skip FTE completely.
         case "gettingStarted.seen":
+          return true;
       }
+      return null;
     },
     hasEncryptionKey: true,
     setLoopPref: function(){},
     releaseCallData: function() {},
     copyString: function() {},
     getUserAvatar: function(emailAddress) {
       var avatarUrl = "http://www.gravatar.com/avatar/0a996f0fe2727ef1668bdb11897e4459.jpg?default=blank&s=40";
       return Math.ceil(Math.random() * 3) === 2 ? avatarUrl : null;
copy from mobile/android/gradle/build.gradle
copy to build.gradle
--- a/mobile/android/gradle/build.gradle
+++ b/build.gradle
@@ -8,27 +8,27 @@ allprojects {
         topobjdir = gradle.mozconfig.topobjdir
     }
 
     repositories {
         jcenter()
     }
 }
 
-buildDir "${topobjdir}/mobile/android/gradle/build"
+buildDir "${topobjdir}/gradle/build"
 
 buildscript {
     repositories {
         jcenter()
 
         // For spoon-gradle-plugin SNAPSHOT release.  This needs to go before
         // the snapshots repository, otherwise we find a remote 1.0.3-SNAPSHOT
         // that doesn't include nalexander's local changes.
         maven {
-            url "file://${topsrcdir}/mobile/android/gradle/m2repo"
+            url "file://${gradle.mozconfig.topsrcdir}/mobile/android/gradle/m2repo"
         }
         // For spoon SNAPSHOT releases.
         maven {
             url 'https://oss.sonatype.org/content/repositories/snapshots'
         }
     }
 
     dependencies {
@@ -91,12 +91,37 @@ afterEvaluate {
 }
 
 apply plugin: 'idea'
 
 idea {
     project {
         languageLevel = '1.7'
     }
+
+    module {
+        // Object directories take a huge amount of time for IntelliJ to index.
+        // Exclude them.  Convention is that object directories start with obj.
+        // IntelliJ is clever and will not exclude the parts of the object
+        // directory that are referenced, if there are any.
+        def topsrcdirURI = file(topsrcdir).toURI()
+        excludeDirs += files(file(topsrcdir)
+            .listFiles({it.isDirectory()} as FileFilter)
+            .collect({topsrcdirURI.relativize(it.toURI()).toString()}) // Relative paths.
+            .findAll({it.startsWith('obj')}))
+
+        // If topobjdir is below topsrcdir, hide only some portions of that tree.
+        def topobjdirURI = file(topobjdir).toURI()
+        if (!topsrcdirURI.relativize(topobjdirURI).isAbsolute()) {
+            excludeDirs -= file(topobjdir)
+            excludeDirs += files(file(topobjdir).listFiles())
+            excludeDirs -= file("${topobjdir}/gradle")
+            excludeDirs -= file("${topobjdir}/mobile")
+        }
+
+        if (!mozconfig.substs.MOZ_INSTALL_TRACKING) {
+            excludeDirs += file("${topsrcdir}/mobile/android/thirdparty/com/adjust")
+        }
+    }
 }
 
 task wrapper(type: Wrapper) {
 }
--- a/configure.in
+++ b/configure.in
@@ -3752,16 +3752,17 @@ MOZ_ANDROID_HISTORY=
 MOZ_WEBSMS_BACKEND=
 MOZ_ANDROID_BEAM=
 MOZ_LOCALE_SWITCHER=
 MOZ_ANDROID_READING_LIST_SERVICE=
 MOZ_ANDROID_SEARCH_ACTIVITY=
 MOZ_ANDROID_DOWNLOADS_INTEGRATION=
 MOZ_ANDROID_MLS_STUMBLER=
 MOZ_ANDROID_SHARE_OVERLAY=
+MOZ_EXCLUDE_HYPHENATION_DICTIONARIES=
 MOZ_INSTALL_TRACKING=
 MOZ_SWITCHBOARD=
 ACCESSIBILITY=1
 MOZ_TIME_MANAGER=
 MOZ_SIMPLEPUSH=
 MOZ_PAY=
 MOZ_AUDIO_CHANNEL_MANAGER=
 MOZ_CONTENT_SANDBOX=
@@ -4859,16 +4860,23 @@ fi
 
 dnl = Include Tab Queue on Android
 dnl = Temporary build flag to allow development in Nightly
 dnl ========================================================
 if test -n "$MOZ_ANDROID_TAB_QUEUE"; then
     AC_DEFINE(MOZ_ANDROID_TAB_QUEUE)
 fi
 
+dnl =========================================================
+dnl = Whether to exclude hyphenations files in the build
+dnl =========================================================
+if test -n "$MOZ_EXCLUDE_HYPHENATION_DICTIONARIES"; then
+    AC_DEFINE(MOZ_EXCLUDE_HYPHENATION_DICTIONARIES)
+fi
+
 dnl ========================================================
 dnl = Include install tracking on Android
 dnl ========================================================
 if test -n "$MOZ_INSTALL_TRACKING"; then
     AC_DEFINE(MOZ_INSTALL_TRACKING)
 fi
 
 dnl ========================================================
@@ -8590,16 +8598,17 @@ AC_SUBST(MOZ_ANDROID_SEARCH_ACTIVITY)
 AC_SUBST(MOZ_ANDROID_SHARE_OVERLAY)
 AC_SUBST(MOZ_ANDROID_FIREFOX_ACCOUNT_PROFILES)
 AC_SUBST(MOZ_ANDROID_TAB_QUEUE)
 AC_SUBST(MOZ_ANDROID_MLS_STUMBLER)
 AC_SUBST(MOZ_ANDROID_DOWNLOADS_INTEGRATION)
 AC_SUBST(MOZ_ANDROID_APPLICATION_CLASS)
 AC_SUBST(MOZ_ANDROID_BROWSER_INTENT_CLASS)
 AC_SUBST(MOZ_ANDROID_SEARCH_INTENT_CLASS)
+AC_SUBST(MOZ_EXCLUDE_HYPHENATION_DICTIONARIES)
 AC_SUBST(MOZ_INSTALL_TRACKING)
 AC_SUBST(MOZ_SWITCHBOARD)
 AC_SUBST(ENABLE_STRIP)
 AC_SUBST(PKG_SKIP_STRIP)
 AC_SUBST(STRIP_FLAGS)
 AC_SUBST(USE_ELF_HACK)
 AC_SUBST(INCREMENTAL_LINKER)
 AC_SUBST(MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS)
--- a/devtools/client/framework/test/browser_toolbox_options.js
+++ b/devtools/client/framework/test/browser_toolbox_options.js
@@ -47,28 +47,28 @@ function* testSelectTool() {
   ok(true, "Toolbox selected via selectTool method");
 }
 
 function* testOptionsShortcut() {
   info ("Selecting another tool, then reselecting options panel with keyboard.");
 
   yield toolbox.selectTool("webconsole");
   is(toolbox.currentToolId, "webconsole", "webconsole is selected");
-  synthesizeKeyFromKeyTag("toolbox-options-key", doc);
+  synthesizeKeyFromKeyTag(doc.getElementById("toolbox-options-key"));
   is(toolbox.currentToolId, "options", "Toolbox selected via shortcut key (1)");
-  synthesizeKeyFromKeyTag("toolbox-options-key", doc);
+  synthesizeKeyFromKeyTag(doc.getElementById("toolbox-options-key"));
   is(toolbox.currentToolId, "webconsole", "webconsole is selected (1)");
 
   yield toolbox.selectTool("webconsole");
   is(toolbox.currentToolId, "webconsole", "webconsole is selected");
-  synthesizeKeyFromKeyTag("toolbox-options-key2", doc);
+  synthesizeKeyFromKeyTag(doc.getElementById("toolbox-options-key2"));
   is(toolbox.currentToolId, "options", "Toolbox selected via shortcut key (2)");
-  synthesizeKeyFromKeyTag("toolbox-options-key", doc);
+  synthesizeKeyFromKeyTag(doc.getElementById("toolbox-options-key"));
   is(toolbox.currentToolId, "webconsole", "webconsole is reselected (2)");
-  synthesizeKeyFromKeyTag("toolbox-options-key2", doc);
+  synthesizeKeyFromKeyTag(doc.getElementById("toolbox-options-key2"));
   is(toolbox.currentToolId, "options", "Toolbox selected via shortcut key (2)");
 }
 
 function* testOptions() {
   let tool = toolbox.getPanel("options");
   panelWin = tool.panelWin;
   let prefNodes = tool.panelDoc.querySelectorAll("checkbox[data-pref]");
 
--- a/devtools/client/framework/test/shared-head.js
+++ b/devtools/client/framework/test/shared-head.js
@@ -92,39 +92,39 @@ function removeTab(tab) {
       info("Tab removed and finished closing.");
       resolve();
     }, false);
 
     gBrowser.removeTab(tab);
   });
 }
 
-function synthesizeKeyFromKeyTag(aKeyId, document) {
-  let key = document.getElementById(aKeyId);
-  isnot(key, null, "Successfully retrieved the <key> node");
+function synthesizeKeyFromKeyTag(key) {
+  is(key && key.tagName, "key", "Successfully retrieved the <key> node");
 
   let modifiersAttr = key.getAttribute("modifiers");
 
   let name = null;
 
   if (key.getAttribute("keycode"))
     name = key.getAttribute("keycode");
   else if (key.getAttribute("key"))
     name = key.getAttribute("key");
 
   isnot(name, null, "Successfully retrieved keycode/key");
 
   let modifiers = {
-    shiftKey: modifiersAttr.match("shift"),
-    ctrlKey: modifiersAttr.match("ctrl"),
-    altKey: modifiersAttr.match("alt"),
-    metaKey: modifiersAttr.match("meta"),
-    accelKey: modifiersAttr.match("accel")
+    shiftKey: !!modifiersAttr.match("shift"),
+    ctrlKey: !!modifiersAttr.match("control"),
+    altKey: !!modifiersAttr.match("alt"),
+    metaKey: !!modifiersAttr.match("meta"),
+    accelKey: !!modifiersAttr.match("accel")
   };
 
+  info("Synthesizing key " + name + " " + JSON.stringify(modifiers));
   EventUtils.synthesizeKey(name, modifiers);
 }
 
 /**
  * Wait for eventName on target.
  * @param {Object} target An observable object that either supports on/off or
  * addEventListener/removeEventListener
  * @param {String} eventName
--- a/devtools/client/responsivedesign/test/browser_responsiveui.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveui.js
@@ -22,17 +22,17 @@ function test() {
         EventUtils.synthesizeKey(str.charAt(i), {});
       }
     }
 
     yield addTab("data:text/html,mop");
 
     let mgr = ResponsiveUI.ResponsiveUIManager;
 
-    synthesizeKeyFromKeyTag("key_responsiveUI");
+    synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
 
     yield once(mgr, "on");
 
     // Is it open?
     let container = gBrowser.getBrowserContainer();
     is(container.getAttribute("responsivemode"), "true", "In responsive mode.");
 
     // Menus are correctly updated?
--- a/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
+++ b/devtools/client/responsivedesign/test/browser_responsiveuiaddcustompreset.js
@@ -19,39 +19,23 @@ function test() {
         return c;
       } else {
         return testOnePreset(c - 1);
       }
     }
     return testOnePreset(instance.menulist.firstChild.childNodes.length - 4);
   }
 
-  function synthesizeKeyFromKeyTag(aKeyId) {
-    let key = document.getElementById(aKeyId);
-    isnot(key, null, "Successfully retrieved the <key> node");
-
-    let name = null;
-
-    if (key.getAttribute("keycode"))
-      name = key.getAttribute("keycode");
-    else if (key.getAttribute("key"))
-      name = key.getAttribute("key");
-
-    isnot(name, null, "Successfully retrieved keycode/key");
-
-    key.doCommand();
-  }
-
   Task.spawn(function*() {
 
     yield addTab("data:text/html;charset=utf8,test custom presets in responsive mode");
 
     let mgr = ResponsiveUI.ResponsiveUIManager;
 
-    synthesizeKeyFromKeyTag("key_responsiveUI");
+    synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
 
     yield once(mgr, "on");
 
     oldPrompt = Services.prompt;
     Services.prompt = {
       value: "",
       returnBool: true,
       prompt: function(aParent, aDialogTitle, aText, aValue, aCheckMsg, aCheckState) {
@@ -102,17 +86,17 @@ function test() {
 
     info("waiting for responsive mode to turn off");
     yield once(mgr, "off");
 
     // We're still in the loop of initializing the responsive mode.
     // Let's wait next loop to stop it.
     yield nextTick();
 
-    synthesizeKeyFromKeyTag("key_responsiveUI");
+    synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
 
     yield once(mgr, "on");
 
     is(container.getAttribute("responsivemode"), "true", "In responsive mode.");
 
     instance = mgr.getResponsiveUIForTab(gBrowser.selectedTab);
 
     let customPresetIndex = getPresetIndex("456" + "\u00D7" + "123 (Testing preset)");
@@ -135,17 +119,17 @@ function test() {
     instance.menulist.selectedIndex = 2;
     deletedPresetB = instance.menulist.selectedItem.getAttribute("label");
     instance.removebutton.doCommand();
 
     yield nextTick();
     instance.close();
     yield once(mgr, "off");
 
-    synthesizeKeyFromKeyTag("key_responsiveUI");
+    synthesizeKeyFromKeyTag(document.getElementById("key_responsiveUI"));
 
     info("waiting for responsive mode to turn on");
     yield once(mgr, "on");
 
     instance = mgr.getResponsiveUIForTab(gBrowser.selectedTab);
 
     customPresetIndex = getPresetIndex(deletedPresetA);
     is(customPresetIndex, -1, "deleted preset " + deletedPresetA + " is not in the list anymore");
--- a/devtools/client/responsivedesign/test/head.js
+++ b/devtools/client/responsivedesign/test/head.js
@@ -1,17 +1,15 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
-var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-var {TargetFactory} = require("devtools/client/framework/target");
-var DevToolsUtils = require("devtools/shared/DevToolsUtils");
-var promise = require("promise");
+// shared-head.js handles imports, constants, and utility functions
+Services.scriptloader.loadSubScript("chrome://mochitests/content/browser/devtools/client/framework/test/shared-head.js", this);
 
 // Import the GCLI test helper
 var testDir = gTestPath.substr(0, gTestPath.lastIndexOf("/"));
 Services.scriptloader.loadSubScript(testDir + "../../../commandline/test/helpers.js", this);
 
 DevToolsUtils.testing = true;
 registerCleanupFunction(() => {
   DevToolsUtils.testing = false;
@@ -179,42 +177,16 @@ function once(target, eventName, useCapt
 }
 
 function wait(ms) {
   let def = promise.defer();
   setTimeout(def.resolve, ms);
   return def.promise;
 }
 
-function synthesizeKeyFromKeyTag(aKeyId) {
-  let key = document.getElementById(aKeyId);
-  isnot(key, null, "Successfully retrieved the <key> node");
-
-  let modifiersAttr = key.getAttribute("modifiers");
-
-  let name = null;
-
-  if (key.getAttribute("keycode"))
-    name = key.getAttribute("keycode");
-  else if (key.getAttribute("key"))
-    name = key.getAttribute("key");
-
-  isnot(name, null, "Successfully retrieved keycode/key");
-
-  let modifiers = {
-    shiftKey: modifiersAttr.match("shift"),
-    ctrlKey: modifiersAttr.match("ctrl"),
-    altKey: modifiersAttr.match("alt"),
-    metaKey: modifiersAttr.match("meta"),
-    accelKey: modifiersAttr.match("accel")
-  }
-
-  EventUtils.synthesizeKey(name, modifiers);
-}
-
 function nextTick() {
   let def = promise.defer();
   executeSoon(() => def.resolve())
   return def.promise;
 }
 
 /**
  * Waits for the next load to complete in the current browser.
--- a/devtools/client/webconsole/test/browser_console_keyboard_accessibility.js
+++ b/devtools/client/webconsole/test/browser_console_keyboard_accessibility.js
@@ -48,17 +48,18 @@ var test = asyncTest(function*() {
   EventUtils.synthesizeKey("VK_END", {});
 
   let scrollTop = hud.outputNode.parentNode.scrollTop;
   ok(scrollTop > 0 && Math.abs(scrollTop - bottom) <= 5,
      "scroll position now at bottom");
 
   info("try ctrl-l to clear output");
   executeSoon(() => {
-    EventUtils.synthesizeKey("l", { ctrlKey: true });
+    let clearKey = hud.ui.window.document.querySelector("key[command=consoleCmd_clearOutput]:not([disabled])");
+    synthesizeKeyFromKeyTag(clearKey);
   });
   yield hud.jsterm.once("messages-cleared");
 
   is(hud.outputNode.textContent.indexOf("foobarz1"), -1, "output cleared");
   is(hud.jsterm.inputNode.getAttribute("focused"), "true",
      "jsterm input is focused");
 
   info("try ctrl-f to focus filter");
--- a/devtools/client/webconsole/test/head.js
+++ b/devtools/client/webconsole/test/head.js
@@ -1,24 +1,21 @@
 /* vim:set ts=2 sw=2 sts=2 et: */
 /* 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/. */
 
 "use strict";
 
-var {gDevTools} = Cu.import("resource://devtools/client/framework/gDevTools.jsm", {});
-var {console} = Cu.import("resource://gre/modules/Console.jsm", {});
+// shared-head.js handles imports, constants, and utility functions
+Services.scriptloader.loadSubScript("chrome://mochitests/content/browser/devtools/client/framework/test/shared-head.js", this);
+
 var {Task} = Cu.import("resource://gre/modules/Task.jsm", {});
-var {require} = Cu.import("resource://devtools/shared/Loader.jsm", {});
-var promise = require("promise");
-var {TargetFactory} = require("devtools/client/framework/target");
 var {Utils: WebConsoleUtils} = require("devtools/shared/webconsole/utils");
 var {Messages} = require("devtools/client/webconsole/console-output");
-var DevToolsUtils = require("devtools/shared/DevToolsUtils");
 const asyncStorage = require("devtools/shared/async-storage");
 
 // Services.prefs.setBoolPref("devtools.debugger.log", true);
 
 var gPendingOutputTest = 0;
 
 // The various categories of messages.
 const CATEGORY_NETWORK = 0;
--- a/devtools/client/webconsole/webconsole.js
+++ b/devtools/client/webconsole/webconsole.js
@@ -10,34 +10,30 @@ const {Cc, Ci, Cu} = require("chrome");
 
 const {Utils: WebConsoleUtils, CONSOLE_WORKER_IDS} = require("devtools/shared/webconsole/utils");
 const promise = require("promise");
 
 loader.lazyServiceGetter(this, "clipboardHelper",
                          "@mozilla.org/widget/clipboardhelper;1",
                          "nsIClipboardHelper");
 loader.lazyImporter(this, "Services", "resource://gre/modules/Services.jsm");
-loader.lazyGetter(this, "EventEmitter", () => require("devtools/shared/event-emitter"));
-loader.lazyGetter(this, "AutocompletePopup",
-                  () => require("devtools/client/shared/autocomplete-popup").AutocompletePopup);
-loader.lazyGetter(this, "ToolSidebar",
-                  () => require("devtools/client/framework/sidebar").ToolSidebar);
-loader.lazyGetter(this, "ConsoleOutput",
-                  () => require("devtools/client/webconsole/console-output").ConsoleOutput);
-loader.lazyGetter(this, "Messages",
-                  () => require("devtools/client/webconsole/console-output").Messages);
-loader.lazyGetter(this, "asyncStorage",
-                  () => require("devtools/shared/async-storage"));
+loader.lazyRequireGetter(this, "EventEmitter", "devtools/shared/event-emitter");
+loader.lazyRequireGetter(this, "AutocompletePopup", "devtools/client/shared/autocomplete-popup", true);
+loader.lazyRequireGetter(this, "ToolSidebar", "devtools/client/framework/sidebar", true);
+loader.lazyRequireGetter(this, "ConsoleOutput", "devtools/client/webconsole/console-output", true);
+loader.lazyRequireGetter(this, "Messages", "devtools/client/webconsole/console-output", true);
+loader.lazyRequireGetter(this, "asyncStorage", "devtools/shared/async-storage");
 loader.lazyRequireGetter(this, "EnvironmentClient", "devtools/shared/client/main", true);
 loader.lazyRequireGetter(this, "ObjectClient", "devtools/shared/client/main", true);
+loader.lazyRequireGetter(this, "system", "devtools/shared/system");
+loader.lazyRequireGetter(this, "Timers", "sdk/timers");
 loader.lazyImporter(this, "VariablesView", "resource://devtools/client/shared/widgets/VariablesView.jsm");
 loader.lazyImporter(this, "VariablesViewController", "resource://devtools/client/shared/widgets/VariablesViewController.jsm");
 loader.lazyImporter(this, "PluralForm", "resource://gre/modules/PluralForm.jsm");
 loader.lazyImporter(this, "gDevTools", "resource://devtools/client/framework/gDevTools.jsm");
-loader.lazyGetter(this, "Timers", () => require("sdk/timers"));
 
 const STRINGS_URI = "chrome://browser/locale/devtools/webconsole.properties";
 var l10n = new WebConsoleUtils.l10n(STRINGS_URI);
 
 const XHTML_NS = "http://www.w3.org/1999/xhtml";
 
 const MIXED_CONTENT_LEARN_MORE = "https://developer.mozilla.org/docs/Security/MixedContent";
 
@@ -523,16 +519,22 @@ WebConsoleFrame.prototype = {
     // Register the controller to handle "select all" properly.
     this._commandController = new CommandController(this);
     this.window.controllers.insertControllerAt(0, this._commandController);
 
     this._contextMenuHandler = new ConsoleContextMenu(this);
 
     let doc = this.document;
 
+    if (system.constants.platform === "macosx") {
+      doc.querySelector("#key_clearOSX").removeAttribute("disabled");
+    } else {
+      doc.querySelector("#key_clear").removeAttribute("disabled");
+    }
+
     this.filterBox = doc.querySelector(".hud-filter-box");
     this.outputNode = doc.getElementById("output-container");
     this.completeNode = doc.querySelector(".jsterm-complete-node");
     this.inputNode = doc.querySelector(".jsterm-input-node");
 
     this._setFilterTextBoxEvents();
     this._initFilterButtons();
 
--- a/devtools/client/webconsole/webconsole.xul
+++ b/devtools/client/webconsole/webconsole.xul
@@ -57,17 +57,21 @@ function goUpdateConsoleCommands() {
     <key key="&fullZoomReduceCmd.commandkey2;" command="cmd_fullZoomReduce" modifiers="accel"/>
     <key id="key_fullZoomEnlarge" key="&fullZoomEnlargeCmd.commandkey;" command="cmd_fullZoomEnlarge" modifiers="accel"/>
     <key key="&fullZoomEnlargeCmd.commandkey2;" command="cmd_fullZoomEnlarge" modifiers="accel"/>
     <key key="&fullZoomEnlargeCmd.commandkey3;" command="cmd_fullZoomEnlarge" modifiers="accel"/>
     <key id="key_fullZoomReset" key="&fullZoomResetCmd.commandkey;" command="cmd_fullZoomReset" modifiers="accel"/>
     <key key="&fullZoomResetCmd.commandkey2;" command="cmd_fullZoomReset" modifiers="accel"/>
     <key key="&findCmd.key;" command="cmd_find" modifiers="accel"/>
     <key key="&closeCmd.key;" command="cmd_close" modifiers="accel"/>
-    <key key="&clearOutputCtrl.key;" command="consoleCmd_clearOutput" modifiers="control"/>
+
+    <!-- The 'clear' key differs by plaform, so the correct one becomes
+         enabled in JS -->
+    <key id="key_clear" disabled="true" key="&clearOutputCtrl.key;" command="consoleCmd_clearOutput" modifiers="control shift"/>
+    <key id="key_clearOSX" disabled="true" key="&clearOutputCtrl.key;" command="consoleCmd_clearOutput" modifiers="control"/>
   </keyset>
   <keyset id="editMenuKeys"/>
 
   <popupset id="mainPopupSet">
     <menupopup id="output-contextmenu" onpopupshowing="goUpdateGlobalEditMenuItems()">
       <menuitem id="saveBodiesContextMenu" type="checkbox" label="&saveBodies.label;"
                 accesskey="&saveBodies.accesskey;"/>
       <menuitem id="menu_openURL" label="&openURL.label;"
copy from mobile/android/gradle/gradle/wrapper/gradle-wrapper.jar
copy to gradle/wrapper/gradle-wrapper.jar
copy from mobile/android/gradle/gradle/wrapper/gradle-wrapper.properties
copy to gradle/wrapper/gradle-wrapper.properties
copy from mobile/android/gradle/gradlew
copy to gradlew
--- a/intl/locales/Makefile.in
+++ b/intl/locales/Makefile.in
@@ -1,12 +1,14 @@
 # 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 $(topsrcdir)/config/rules.mk
 
+ifndef MOZ_EXCLUDE_HYPHENATION_DICTIONARIES
 PATTERN_FILES = $(strip $(wildcard $(srcdir)/*/hyphenation/*.dic))
 
 ifneq (,$(PATTERN_FILES))
 libs::
 	$(INSTALL)  $(PATTERN_FILES) $(FINAL_TARGET)/hyphenation
 endif
+endif # MOZ_EXCLUDE_HYPHENATION_DICTIONARIES
--- a/mobile/android/base/AppConstants.java.in
+++ b/mobile/android/base/AppConstants.java.in
@@ -148,16 +148,23 @@ public class AppConstants {
 
     public static final String MOZ_PKG_SPECIAL =
 //#ifdef MOZ_PKG_SPECIAL
     "@MOZ_PKG_SPECIAL@";
 //#else
     null;
 //#endif
 
+    public static final boolean MOZ_EXCLUDE_HYPHENATION_DICTIONARIES =
+//#ifdef MOZ_EXCLUDE_HYPHENATION_DICTIONARIES
+    true;
+//#else
+    false;
+//#endif
+
     /**
      * Whether this APK was built with constrained resources --
      * no xhdpi+ images, for example.
      */
     public static final boolean MOZ_ANDROID_RESOURCE_CONSTRAINED =
 //#ifdef MOZ_ANDROID_RESOURCE_CONSTRAINED
     true;
 //#else
--- a/mobile/android/base/home/BrowserSearch.java
+++ b/mobile/android/base/home/BrowserSearch.java
@@ -233,16 +233,24 @@ public class BrowserSearch extends HomeF
     @Override
     public void onDestroy() {
         super.onDestroy();
 
         mSearchEngines = null;
     }
 
     @Override
+    public void onHiddenChanged(boolean hidden) {
+        if (!hidden) {
+            GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("SearchEngines:GetVisible", null));
+        }
+        super.onHiddenChanged(hidden);
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
 
         // Fetch engines if we need to.
         if (mSearchEngines.isEmpty() || !Locale.getDefault().equals(mLastLocale)) {
             GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("SearchEngines:GetVisible", null));
         } else {
             updateSearchEngineBar();
@@ -547,16 +555,32 @@ public class BrowserSearch extends HomeF
 
     private void setSavedSuggestions(ArrayList<String> savedSuggestions) {
         ThreadUtils.assertOnUiThread();
 
         mSearchHistorySuggestions = savedSuggestions;
         mAdapter.notifyDataSetChanged();
     }
 
+    private boolean shouldUpdateSearchEngine(ArrayList<SearchEngine> searchEngines) {
+        if (searchEngines.size() != mSearchEngines.size()) {
+            return true;
+        }
+
+        int size = searchEngines.size();
+
+        for (int i = 0; i < size; i++) {
+            if (!mSearchEngines.get(i).name.equals(searchEngines.get(i).name)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     private void setSearchEngines(JSONObject data) {
         ThreadUtils.assertOnUiThread();
 
         // This method is called via a Runnable posted from the Gecko thread, so
         // it's possible the fragment and/or its view has been destroyed by the
         // time we get here. If so, just abort.
         if (mView == null) {
             return;
@@ -592,25 +616,27 @@ public class BrowserSearch extends HomeF
                     // Only create a new instance of SuggestClient if it hasn't been
                     // set yet.
                     maybeSetSuggestClient(suggestTemplate, isPrivate);
                 } else {
                     searchEngines.add(engine);
                 }
             }
 
-            mSearchEngines = Collections.unmodifiableList(searchEngines);
-            mLastLocale = Locale.getDefault();
+            // checking if the new searchEngine is different from mSearchEngine, will have to re-layout if yes
+            boolean change = shouldUpdateSearchEngine(searchEngines);
 
-            if (mAdapter != null) {
+            if (mAdapter != null && change) {
+                mSearchEngines = Collections.unmodifiableList(searchEngines);
+                mLastLocale = Locale.getDefault();
+                updateSearchEngineBar();
+
                 mAdapter.notifyDataSetChanged();
             }
 
-            updateSearchEngineBar();
-
             // Show suggestions opt-in prompt only if suggestions are not enabled yet,
             // user hasn't been prompted and we're not on a private browsing tab.
             if (!mSuggestionsEnabled && !suggestionsPrompted && mSuggestClient != null) {
                 showSuggestionsOptIn();
             }
         } catch (JSONException e) {
             Log.e(LOGTAG, "Error getting search engine JSON", e);
         }
--- a/mobile/android/base/resources/layout-large-v11/tab_strip_item_view.xml
+++ b/mobile/android/base/resources/layout-large-v11/tab_strip_item_view.xml
@@ -1,17 +1,17 @@
 <?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"
        xmlns:gecko="http://schemas.android.com/apk/res-auto">
 
-   <ImageButton
+   <ImageView
         android:id="@+id/favicon"
         android:layout_width="@dimen/browser_toolbar_favicon_size"
         android:layout_height="match_parent"
         android:layout_marginRight="8dp"
         android:scaleType="centerInside"
         android:duplicateParentState="true"/>
 
     <org.mozilla.gecko.widget.FadedSingleColorTextView
--- a/mobile/android/base/widget/RoundedCornerLayout.java
+++ b/mobile/android/base/widget/RoundedCornerLayout.java
@@ -1,31 +1,33 @@
 /* -*- 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.widget;
 
+import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.R;
 
 import android.content.Context;
 import android.graphics.Canvas;
 import android.graphics.Path;
 import android.graphics.RectF;
 import android.util.AttributeSet;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
 import android.widget.LinearLayout;
 
 public class RoundedCornerLayout extends LinearLayout {
     private static final String LOGTAG = "Gecko" + RoundedCornerLayout.class.getSimpleName();
     private float cornerRadius;
 
     private Path path;
+    boolean cannotClipPath;
 
     public RoundedCornerLayout(Context context) {
         super(context);
         init(context);
     }
 
     public RoundedCornerLayout(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -33,33 +35,45 @@ public class RoundedCornerLayout extends
     }
 
     public RoundedCornerLayout(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         init(context);
     }
 
     private void init(Context context) {
+        // Bug 1201081 - clipPath with hardware acceleration crashes on r11-18.
+        cannotClipPath = AppConstants.Versions.feature11Plus && !AppConstants.Versions.feature19Plus;
+
         final DisplayMetrics metrics = context.getResources().getDisplayMetrics();
 
         cornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX,
                 getResources().getDimensionPixelSize(R.dimen.doorhanger_rounded_corner_radius), metrics);
 
         setWillNotDraw(false);
     }
 
     @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
         super.onSizeChanged(w, h, oldw, oldh);
+        if (cannotClipPath) {
+            return;
+        }
+
         final RectF r = new RectF(0, 0, w, h);
         path = new Path();
         path.addRoundRect(r, cornerRadius, cornerRadius, Path.Direction.CW);
         path.close();
     }
 
     @Override
     public void draw(Canvas canvas) {
+        if (cannotClipPath) {
+            super.draw(canvas);
+            return;
+        }
+
         canvas.save();
         canvas.clipPath(path);
         super.draw(canvas);
         canvas.restore();
     }
 }
--- a/mobile/android/gradle/base/build.gradle
+++ b/mobile/android/gradle/base/build.gradle
@@ -93,28 +93,24 @@ android.libraryVariants.all { variant ->
 }
 
 dependencies {
     compile 'com.android.support:support-v4:23.0.1'
     compile 'com.android.support:appcompat-v7:23.0.1'
     compile 'com.android.support:recyclerview-v7:23.0.1'
 
     if (mozconfig.substs.MOZ_NATIVE_DEVICES) {
-        compile 'com.android.support:mediarouter-v7:22.2.1'
+        compile 'com.android.support:mediarouter-v7:23.0.1'
         compile 'com.google.android.gms:play-services-basement:8.1.0'
         compile 'com.google.android.gms:play-services-base:8.1.0'
         compile 'com.google.android.gms:play-services-cast:8.1.0'
     }
 
     compile project(':thirdparty')
 
-    if (mozconfig.substs.MOZ_INSTALL_TRACKING) {
-        compile project(':thirdparty_adjust_sdk')
-    }
-
     testCompile 'junit:junit:4.12'
     testCompile 'org.robolectric:robolectric:3.0'
     testCompile 'org.simpleframework:simple-http:4.1.13'
 }
 
 apply plugin: 'idea'
 
 idea {
--- a/mobile/android/gradle/build.gradle
+++ b/mobile/android/gradle/build.gradle
@@ -18,17 +18,17 @@ buildDir "${topobjdir}/mobile/android/gr
 buildscript {
     repositories {
         jcenter()
 
         // For spoon-gradle-plugin SNAPSHOT release.  This needs to go before
         // the snapshots repository, otherwise we find a remote 1.0.3-SNAPSHOT
         // that doesn't include nalexander's local changes.
         maven {
-            url "file://${topsrcdir}/mobile/android/gradle/m2repo"
+            url "file://${gradle.mozconfig.topsrcdir}/mobile/android/gradle/m2repo"
         }
         // For spoon SNAPSHOT releases.
         maven {
             url 'https://oss.sonatype.org/content/repositories/snapshots'
         }
     }
 
     dependencies {
--- a/mobile/android/gradle/settings.gradle
+++ b/mobile/android/gradle/settings.gradle
@@ -29,21 +29,16 @@ include ':omnijar'
 include ':thirdparty'
 
 def gradleRoot = new File("${json.topobjdir}/mobile/android/gradle")
 project(':app').projectDir = new File(gradleRoot, 'app')
 project(':base').projectDir = new File(gradleRoot, 'base')
 project(':omnijar').projectDir = new File(gradleRoot, 'omnijar')
 project(':thirdparty').projectDir = new File(gradleRoot, 'thirdparty')
 
-if (json.substs.MOZ_INSTALL_TRACKING) {
-    include ':thirdparty_adjust_sdk'
-    project(':thirdparty_adjust_sdk').projectDir = new File(gradleRoot, 'thirdparty_adjust_sdk')
-}
-
 // The Gradle instance is shared between settings.gradle and all the
 // other build.gradle files (see
 // http://forums.gradle.org/gradle/topics/define_extension_properties_from_settings_xml).
 // We use this ext property to pass the per-object-directory mozconfig
 // between scripts.  This lets us execute set-up code before we gradle
 // tries to configure the project even once, and as a side benefit
 // saves invoking |mach environment| multiple times.
 gradle.ext.mozconfig = json
--- a/mobile/android/gradle/thirdparty/build.gradle
+++ b/mobile/android/gradle/thirdparty/build.gradle
@@ -16,18 +16,19 @@ android {
 
     lintOptions {
         abortOnError false
     }
 
     sourceSets {
         main {
             java {
-                // Thirdparty Adjust SDK code is included in the thirdparty_adjust_sdk project.
-                exclude 'com/adjust/**'
+                if (!mozconfig.substs.MOZ_INSTALL_TRACKING) {
+                    exclude 'com/adjust/**'
+                }
             }
         }
     }
 }
 
 dependencies {
     compile 'com.android.support:support-v4:23.0.1'
 }
deleted file mode 100644
--- a/mobile/android/gradle/thirdparty_adjust_sdk/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.adjust.sdk">
-
-</manifest>
deleted file mode 100644
--- a/mobile/android/gradle/thirdparty_adjust_sdk/build.gradle
+++ /dev/null
@@ -1,32 +0,0 @@
-apply plugin: 'com.android.library'
-
-android {
-    compileSdkVersion 23
-    buildToolsVersion "23.0.1"
-
-    defaultConfig {
-        targetSdkVersion 22
-        minSdkVersion 9
-    }
-
-    compileOptions {
-        sourceCompatibility JavaVersion.VERSION_1_7
-        targetCompatibility JavaVersion.VERSION_1_7
-    }
-
-    lintOptions {
-        abortOnError false
-    }
-
-    sourceSets {
-        main {
-            java {
-                srcDir "${topsrcdir}/mobile/android/thirdparty/com/adjust"
-            }
-        }
-    }
-}
-
-dependencies {
-    compile 'com.android.support:support-v4:22.2.0'
-}
--- a/mobile/android/mach_commands.py
+++ b/mobile/android/mach_commands.py
@@ -99,19 +99,16 @@ class MachCommands(MachCommandBase):
             'local.properties',
             defines=defines,
             deps=os.path.join(self.topobjdir, 'mobile/android/gradle/.deps/local.properties.pp'))
 
         srcdir('thirdparty/build.gradle', 'mobile/android/gradle/thirdparty/build.gradle')
         srcdir('thirdparty/src/main/AndroidManifest.xml', 'mobile/android/gradle/thirdparty/AndroidManifest.xml')
         srcdir('thirdparty/src/main/java', 'mobile/android/thirdparty')
 
-        srcdir('thirdparty_adjust_sdk/build.gradle', 'mobile/android/gradle/thirdparty_adjust_sdk/build.gradle')
-        srcdir('thirdparty_adjust_sdk/src/main/AndroidManifest.xml', 'mobile/android/gradle/thirdparty_adjust_sdk/AndroidManifest.xml')
-
         srcdir('omnijar/build.gradle', 'mobile/android/gradle/omnijar/build.gradle')
         srcdir('omnijar/src/main/java/locales', 'mobile/android/locales')
         srcdir('omnijar/src/main/java/chrome', 'mobile/android/chrome')
         srcdir('omnijar/src/main/java/components', 'mobile/android/components')
         srcdir('omnijar/src/main/java/modules', 'mobile/android/modules')
         srcdir('omnijar/src/main/java/themes', 'mobile/android/themes')
 
         srcdir('app/build.gradle', 'mobile/android/gradle/app/build.gradle')
--- a/mobile/android/tests/browser/robocop/testClearPrivateData.java
+++ b/mobile/android/tests/browser/robocop/testClearPrivateData.java
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.tests;
 
 import org.mozilla.gecko.R;
 
 import com.jayway.android.robotium.solo.Condition;
 import android.view.View;
-import android.widget.ImageButton;
+import android.widget.ImageView;
 
 /**
  * This patch tests the clear private data options:
  * - clear history option by: adding and checking that clear private
  * data option removes the history items but not the users bookmarks
  * - clear site settings and clear saved password by: checking
  * each option present in the doorhanger and clearing the settings from
  * the URL bar context menu and settings menu
@@ -121,15 +121,15 @@ public class testClearPrivateData extend
         mAsserter.ok(waitForText(option), "Verify that the option: " + option + " is in the list", "The option is in the list. There are settings to clear");
         mSolo.clickOnButton(button);
     }
 
     private void openSiteSecurityDoorHanger() {
         mSolo.waitForCondition(new Condition() {
             @Override
             public boolean isSatisfied() {
-                ImageButton btn = (ImageButton) mSolo.getView(R.id.favicon);
+                ImageView btn = (ImageView) mSolo.getView(R.id.favicon);
                 mSolo.clickOnView(btn);
                 return true;
             }
         }, TEST_WAIT_MS);
     }
 }
copy from mobile/android/gradle/thirdparty/AndroidManifest.xml
copy to mobile/android/thirdparty/AndroidManifest.xml
--- a/mobile/android/gradle/thirdparty/AndroidManifest.xml
+++ b/mobile/android/thirdparty/AndroidManifest.xml
@@ -1,4 +1,4 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.mozilla.gecko.thirdparty">
+    package="org.mozilla.gecko.thirdparty_unused">
 
 </manifest>
copy from mobile/android/gradle/thirdparty/build.gradle
copy to mobile/android/thirdparty/build.gradle
--- a/mobile/android/gradle/thirdparty/build.gradle
+++ b/mobile/android/thirdparty/build.gradle
@@ -1,8 +1,10 @@
+buildDir "${topobjdir}/gradle/build/mobile/android/thirdparty"
+
 apply plugin: 'com.android.library'
 
 android {
     compileSdkVersion 23
     buildToolsVersion "23.0.1"
 
     defaultConfig {
         targetSdkVersion 22
@@ -15,19 +17,33 @@ android {
     }
 
     lintOptions {
         abortOnError false
     }
 
     sourceSets {
         main {
+            manifest.srcFile 'AndroidManifest.xml'
             java {
-                // Thirdparty Adjust SDK code is included in the thirdparty_adjust_sdk project.
-                exclude 'com/adjust/**'
+                srcDir '.'
+                if (!mozconfig.substs.MOZ_INSTALL_TRACKING) {
+                    exclude 'com/adjust/**'
+                }
             }
         }
     }
 }
 
 dependencies {
     compile 'com.android.support:support-v4:23.0.1'
 }
+
+apply plugin: 'idea'
+
+idea {
+    module {
+        // This is cosmetic.  See the excludes in the root project.
+        if (!mozconfig.substs.MOZ_INSTALL_TRACKING) {
+            excludeDirs += file('com/adjust/sdk')
+        }
+    }
+}
--- a/mobile/android/thirdparty/com/adjust/sdk/AdjustFactory.java
+++ b/mobile/android/thirdparty/com/adjust/sdk/AdjustFactory.java
@@ -1,15 +1,15 @@
 package com.adjust.sdk;
 
 import android.content.Context;
 
-import org.apache.http.client.HttpClient;
-import org.apache.http.impl.client.DefaultHttpClient;
-import org.apache.http.params.HttpParams;
+import ch.boye.httpclientandroidlib.client.HttpClient;
+import ch.boye.httpclientandroidlib.impl.client.DefaultHttpClient;
+import ch.boye.httpclientandroidlib.params.HttpParams;
 
 public class AdjustFactory {
     private static IPackageHandler packageHandler = null;
     private static IRequestHandler requestHandler = null;
     private static IAttributionHandler attributionHandler = null;
     private static IActivityHandler activityHandler = null;
     private static ILogger logger = null;
     private static HttpClient httpClient = null;
--- a/mobile/android/thirdparty/com/adjust/sdk/AttributionHandler.java
+++ b/mobile/android/thirdparty/com/adjust/sdk/AttributionHandler.java
@@ -1,15 +1,15 @@
 package com.adjust.sdk;
 
 import android.net.Uri;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
+import ch.boye.httpclientandroidlib.HttpResponse;
+import ch.boye.httpclientandroidlib.client.HttpClient;
+import ch.boye.httpclientandroidlib.client.methods.HttpGet;
 import org.json.JSONObject;
 
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Map;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
--- a/mobile/android/thirdparty/com/adjust/sdk/RequestHandler.java
+++ b/mobile/android/thirdparty/com/adjust/sdk/RequestHandler.java
@@ -9,25 +9,25 @@
 
 package com.adjust.sdk;
 
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.entity.UrlEncodedFormEntity;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.message.BasicNameValuePair;
+import ch.boye.httpclientandroidlib.HttpResponse;
+import ch.boye.httpclientandroidlib.NameValuePair;
+import ch.boye.httpclientandroidlib.client.ClientProtocolException;
+import ch.boye.httpclientandroidlib.client.HttpClient;
+import ch.boye.httpclientandroidlib.client.entity.UrlEncodedFormEntity;
+import ch.boye.httpclientandroidlib.client.methods.HttpPost;
+import ch.boye.httpclientandroidlib.client.methods.HttpUriRequest;
+import ch.boye.httpclientandroidlib.client.utils.URLEncodedUtils;
+import ch.boye.httpclientandroidlib.message.BasicNameValuePair;
 import org.json.JSONObject;
 
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.lang.ref.WeakReference;
 import java.net.SocketTimeoutException;
 import java.util.ArrayList;
 import java.util.List;
--- a/mobile/android/thirdparty/com/adjust/sdk/Util.java
+++ b/mobile/android/thirdparty/com/adjust/sdk/Util.java
@@ -7,22 +7,22 @@
 //  See the file MIT-LICENSE for copying permission.
 //
 
 package com.adjust.sdk;
 
 import android.content.Context;
 import android.content.pm.PackageManager;
 
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpStatus;
-import org.apache.http.client.HttpClient;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.HttpConnectionParams;
-import org.apache.http.params.HttpParams;
+import ch.boye.httpclientandroidlib.HttpResponse;
+import ch.boye.httpclientandroidlib.HttpStatus;
+import ch.boye.httpclientandroidlib.client.HttpClient;
+import ch.boye.httpclientandroidlib.params.BasicHttpParams;
+import ch.boye.httpclientandroidlib.params.HttpConnectionParams;
+import ch.boye.httpclientandroidlib.params.HttpParams;
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
--- a/python/mozboot/mozboot/archlinux.py
+++ b/python/mozboot/mozboot/archlinux.py
@@ -54,34 +54,85 @@ class ArchlinuxBootstrapper(BaseBootstra
         'xorg-server-xvfb',
         'yasm',
         'zip',
         'gst-libav',
         'gst-plugins-good',
         'networkmanager',
     ]
 
-    AUR_PACKAGES = [
-        'https://aur.archlinux.org/cgit/aur.git/snapshot/uuid.tar.gz'
+    BROWSER_AUR_PACKAGES = [
+        'https://aur.archlinux.org/cgit/aur.git/snapshot/uuid.tar.gz',
+    ]
+
+    MOBILE_ANDROID_COMMON_PACKAGES = [
+        'zlib',  # mobile/android requires system zlib.
+        'jdk7-openjdk', # It would be nice to handle alternative JDKs.  See https://wiki.archlinux.org/index.php/Java.
+        'wget',  # For downloading the Android SDK and NDK.
+        'multilib/lib32-libstdc++5', # See comment about 32 bit binaries and multilib below.
+        'multilib/lib32-ncurses',
+        'multilib/lib32-readline',
+        'multilib/lib32-zlib',
     ]
 
     def __init__(self, version, dist_id, **kwargs):
         print 'Using an experimental bootstrapper for Archlinux.'
         BaseBootstrapper.__init__(self, **kwargs)
 
     def install_system_packages(self):
         self.pacman_install(*self.SYSTEM_PACKAGES)
-        self.aur_install(*self.AUR_PACKAGES)
 
     def install_browser_packages(self):
+        self.aur_install(*self.AUR_BROWSER_PACKAGES)
         self.pacman_install(*self.BROWSER_PACKAGES)
 
     def install_mobile_android_packages(self):
-        raise NotImplementedError('Bootstrap support for mobile-android is '
-                                  'not yet available for Archlinux')
+        import android
+
+        # Multi-part process:
+        # 1. System packages.
+        # 2. Android SDK and NDK.
+        # 3. Android packages.
+
+        # 1. This is hard to believe, but the Android SDK binaries are 32-bit
+        # and that conflicts with 64-bit Arch installations out of the box.  The
+        # solution is to add the multilibs repository; unfortunately, this
+        # requires manual intervention.
+        try:
+            self.pacman_install(*self.MOBILE_ANDROID_COMMON_PACKAGES)
+        except e:
+            print('Failed to install all packages.  The Android developer '
+                  'toolchain requires 32 bit binaries be enabled (see '
+                  'https://wiki.archlinux.org/index.php/Android).  You may need to '
+                  'manually enable the multilib repository following the instructions '
+                  'at https://wiki.archlinux.org/index.php/Multilib.')
+            raise e
+
+        # 2. The user may have an external Android SDK (in which case we save
+        # them a lengthy download), or they may have already completed the
+        # download. We unpack to ~/.mozbuild/{android-sdk-linux, android-ndk-r10e}.
+        mozbuild_path = os.environ.get('MOZBUILD_STATE_PATH', os.path.expanduser(os.path.join('~', '.mozbuild')))
+        self.sdk_path = os.environ.get('ANDROID_SDK_HOME', os.path.join(mozbuild_path, 'android-sdk-linux'))
+        self.ndk_path = os.environ.get('ANDROID_NDK_HOME', os.path.join(mozbuild_path, 'android-ndk-r10e'))
+        self.sdk_url = 'https://dl.google.com/android/android-sdk_r24.0.1-linux.tgz'
+        is_64bits = sys.maxsize > 2**32
+        if is_64bits:
+            self.ndk_url = 'https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin'
+        else:
+            self.ndk_url = 'https://dl.google.com/android/ndk/android-ndk-r10e-linux-x86.bin'
+        android.ensure_android_sdk_and_ndk(path=mozbuild_path,
+                                           sdk_path=self.sdk_path, sdk_url=self.sdk_url,
+                                           ndk_path=self.ndk_path, ndk_url=self.ndk_url)
+        android_tool = os.path.join(self.sdk_path, 'tools', 'android')
+        android.ensure_android_packages(android_tool=android_tool)
+
+    def suggest_mobile_android_mozconfig(self):
+        import android
+        android.suggest_mozconfig(sdk_path=self.sdk_path,
+                                  ndk_path=self.ndk_path)
 
     def _update_package_manager(self):
         self.pacman_update
 
     def upgrade_mercurial(self, current):
         self.pacman_install('mercurial')
 
     def upgrade_python(self, current):
copy from mobile/android/gradle/settings.gradle
copy to settings.gradle
--- a/mobile/android/gradle/settings.gradle
+++ b/settings.gradle
@@ -1,48 +1,41 @@
-// If our root project is in the object directory, we expect to be given
-// topsrcdir from our environment via gradle.properties.  If we don't get it,
-// our root project is in the source directory, so we extract topsrcdir relative
-// to the location of this script.
-if (!hasProperty('topsrcdir')) {
-    // In the source directory, we're not worried about links crossing directories.
-    binding.variables['topsrcdir'] = new File("../../..").getCanonicalPath()
-    logger.warn("topsrcdir is undefined: assuming source directory Gradle invocation with topsrcdir=${topsrcdir}.")
-}
+// You might think topsrcdir is '.', but that's not true when the Gradle build
+// is launched from within IntelliJ.
+def topsrcdir = rootProject.projectDir.absolutePath
 
 def commandLine = ["${topsrcdir}/mach", "environment", "--format", "json", "--verbose"]
 def proc = commandLine.execute(null, new File(topsrcdir))
 def standardOutput = new ByteArrayOutputStream()
 proc.consumeProcessOutput(standardOutput, standardOutput)
 proc.waitFor()
 
 // Only show the output if something went wrong.
 if (proc.exitValue() != 0) {
     throw new GradleException("Process '${commandLine}' finished with non-zero exit value ${proc.exitValue()}:\n\n${standardOutput.toString()}")
 }
 
 import groovy.json.JsonSlurper
 def slurper = new JsonSlurper()
 def json = slurper.parseText(standardOutput.toString())
 
+if (json.substs.MOZ_BUILD_APP != 'mobile/android') {
+    throw new GradleException("Building with Gradle is only supported for Fennec, i.e., MOZ_BUILD_APP == 'mobile/android'.");
+}
+
 include ':app'
 include ':base'
 include ':omnijar'
 include ':thirdparty'
 
 def gradleRoot = new File("${json.topobjdir}/mobile/android/gradle")
 project(':app').projectDir = new File(gradleRoot, 'app')
 project(':base').projectDir = new File(gradleRoot, 'base')
 project(':omnijar').projectDir = new File(gradleRoot, 'omnijar')
-project(':thirdparty').projectDir = new File(gradleRoot, 'thirdparty')
-
-if (json.substs.MOZ_INSTALL_TRACKING) {
-    include ':thirdparty_adjust_sdk'
-    project(':thirdparty_adjust_sdk').projectDir = new File(gradleRoot, 'thirdparty_adjust_sdk')
-}
+project(':thirdparty').projectDir = new File("${json.topsrcdir}/mobile/android/thirdparty")
 
 // The Gradle instance is shared between settings.gradle and all the
 // other build.gradle files (see
 // http://forums.gradle.org/gradle/topics/define_extension_properties_from_settings_xml).
 // We use this ext property to pass the per-object-directory mozconfig
 // between scripts.  This lets us execute set-up code before we gradle
 // tries to configure the project even once, and as a side benefit
 // saves invoking |mach environment| multiple times.
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8831a80588dcaffe9a0e075f3d00066faed3d482
GIT binary patch
literal 7402
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
WE-oSF-FmY>&=h1<Wj;%rhWsC!VsDxN
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b25b4452aa1a52181c324020c39175e0f8f425a2
GIT binary patch
literal 16131
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
CzxRv)
--- a/toolkit/themes/shared/jar.inc.mn
+++ b/toolkit/themes/shared/jar.inc.mn
@@ -12,16 +12,18 @@
   skin/classic/global/aboutCacheEntry.css                  (../../shared/aboutCacheEntry.css)
   skin/classic/global/aboutMemory.css                      (../../shared/aboutMemory.css)
   skin/classic/global/aboutReader.css                      (../../shared/aboutReader.css)
   skin/classic/global/aboutReaderContent.css               (../../shared/aboutReaderContent.css)
 * skin/classic/global/aboutReaderControls.css              (../../shared/aboutReaderControls.css)
   skin/classic/global/aboutSupport.css                     (../../shared/aboutSupport.css)
   skin/classic/global/appPicker.css                        (../../shared/appPicker.css)
   skin/classic/global/config.css                           (../../shared/config.css)
+  skin/classic/global/icons/loading-inverted.png           (../../shared/icons/loading-inverted.png)
+  skin/classic/global/icons/loading-inverted@2x.png        (../../shared/icons/loading-inverted@2x.png)
   skin/classic/global/icons/warning.svg                    (../../shared/incontent-icons/warning.svg)
   skin/classic/global/alerts/alert-common.css              (../../shared/alert-common.css)
   skin/classic/global/menu/shared-menu-check@2x.png        (../../shared/menu-check@2x.png)
   skin/classic/global/menu/shared-menu-check.png           (../../shared/menu-check.png)
   skin/classic/global/menu/shared-menu-check-active.svg    (../../shared/menu-check-active.svg)
   skin/classic/global/menu/shared-menu-check-black.svg     (../../shared/menu-check-black.svg)
   skin/classic/global/menu/shared-menu-check-hover.svg     (../../shared/menu-check-hover.svg)
   skin/classic/global/in-content/check.svg                 (../../shared/in-content/check.svg)
--- a/widget/android/nsAndroidProtocolHandler.cpp
+++ b/widget/android/nsAndroidProtocolHandler.cpp
@@ -64,17 +64,17 @@ NS_IMETHODIMP AndroidInputStream::IsNonB
 }
 
 
 class AndroidChannel : public nsBaseChannel
 {
 private:
     AndroidChannel(nsIURI *aURI, jni::Object::Param aConnection) {
         mConnection = aConnection;
-        mURI = aURI;
+        SetURI(aURI);
 
         auto type = widget::GeckoAppShell::ConnectionGetMimeType(mConnection);
         if (type) {
             SetContentType(nsCString(type));
         }
     }
 
 public: