Merge m-c to inbound, a=merge CLOSED TREE
authorWes Kocher <wkocher@mozilla.com>
Tue, 20 Oct 2015 15:28:33 -0700
changeset 303837 a407c3c5ec9360b25b9fd54086e00f4a98fb96d2
parent 303836 f7e6d2a69f8c3b9ec43336aeb42e530690163a92 (current diff)
parent 303764 f397034950304b845175f8dab8fccbdd0e8bf995 (diff)
child 303838 d3659c740f48f143bba6370dcafa91f19063d93a
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)
reviewersmerge
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 inbound, a=merge CLOSED TREE
mobile/android/base/resources/layout/tabs_panel_back_button.xml
mobile/android/gradle/branding/AndroidManifest.xml
mobile/android/gradle/branding/build.gradle
mobile/android/gradle/preprocessed_code/AndroidManifest.xml
mobile/android/gradle/preprocessed_code/build.gradle
mobile/android/gradle/preprocessed_resources/AndroidManifest.xml
mobile/android/gradle/preprocessed_resources/build.gradle
--- 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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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": "3491a49da4d4ce45b8a682e95d0ce68892c2b8ea", 
+        "git_revision": "11eb5d4cb2675d359d277ae17772bc75f7ccedbc", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "6458b8861154bf7e28971ce85d49e404ac96da29", 
+    "revision": "6575311e4b9daab959d80f17cf77bea4c91660a6", 
     "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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="c1bbb66f52f9e2d76ce97e7b3aa0cb29957cd7d8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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="3491a49da4d4ce45b8a682e95d0ce68892c2b8ea"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="11eb5d4cb2675d359d277ae17772bc75f7ccedbc"/>
   <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="31a7849fe9a8b743d6f5e5facc212f0ef9d57499"/>
   <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/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -795,16 +795,28 @@
 @RESPATH@/res/table-add-row-before-hover.gif
 @RESPATH@/res/table-add-row-before.gif
 @RESPATH@/res/table-remove-column-active.gif
 @RESPATH@/res/table-remove-column-hover.gif
 @RESPATH@/res/table-remove-column.gif
 @RESPATH@/res/table-remove-row-active.gif
 @RESPATH@/res/table-remove-row-hover.gif
 @RESPATH@/res/table-remove-row.gif
+@RESPATH@/res/accessiblecaret.png
+@RESPATH@/res/accessiblecaret@1.5x.png
+@RESPATH@/res/accessiblecaret@2.25x.png
+@RESPATH@/res/accessiblecaret@2x.png
+@RESPATH@/res/accessiblecaret_tilt_left.png
+@RESPATH@/res/accessiblecaret_tilt_left@1.5x.png
+@RESPATH@/res/accessiblecaret_tilt_left@2.25x.png
+@RESPATH@/res/accessiblecaret_tilt_left@2x.png
+@RESPATH@/res/accessiblecaret_tilt_right.png
+@RESPATH@/res/accessiblecaret_tilt_right@1.5x.png
+@RESPATH@/res/accessiblecaret_tilt_right@2.25x.png
+@RESPATH@/res/accessiblecaret_tilt_right@2x.png
 @RESPATH@/res/text_caret.png
 @RESPATH@/res/text_caret@1.5x.png
 @RESPATH@/res/text_caret@2.25x.png
 @RESPATH@/res/text_caret@2x.png
 @RESPATH@/res/text_caret_tilt_left.png
 @RESPATH@/res/text_caret_tilt_left@1.5x.png
 @RESPATH@/res/text_caret_tilt_left@2.25x.png
 @RESPATH@/res/text_caret_tilt_left@2x.png
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -671,17 +671,17 @@
              overflowable="true"
              overflowbutton="nav-bar-overflow-button"
              overflowtarget="widget-overflow-list"
              overflowpanel="widget-overflow"
              context="toolbar-context-menu">
 
       <hbox id="nav-bar-customization-target" flex="1">
         <toolbaritem id="urlbar-container" flex="400" persist="width"
-                     title="&locationItem.title;" removable="false"
+                     removable="false"
                      class="chromeclass-location" overflows="false">
           <toolbarbutton id="back-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
                          label="&backCmd.label;"
                          command="Browser:BackOrBackDuplicate"
                          onclick="checkForMiddleClick(this, event);"
                          tooltip="back-button-tooltip"
                          context="backForwardMenu"/>
           <hbox id="urlbar-wrapper" flex="1">
@@ -794,26 +794,23 @@
               </hbox>
               <hbox id="userContext-icons">
                 <label id="userContext-label"/>
                 <image id="userContext-indicator"/>
               </hbox>
               <toolbarbutton id="urlbar-go-button"
                              class="chromeclass-toolbar-additional"
                              onclick="gURLBar.handleCommand(event);"
-                             aria-label="&goEndCap.tooltip;"
                              tooltiptext="&goEndCap.tooltip;"/>
               <toolbarbutton id="urlbar-reload-button"
                              class="chromeclass-toolbar-additional"
                              command="Browser:ReloadOrDuplicate"
                              onclick="checkForMiddleClick(this, event);"
-                             aria-label="&reloadButton.tooltip;"
                              tooltiptext="&reloadButton.tooltip;"/>
               <toolbarbutton id="urlbar-stop-button"
-                             aria-label="&stopButton.tooltip;"
                              class="chromeclass-toolbar-additional"
                              command="Browser:Stop"
                              tooltiptext="&stopButton.tooltip;"/>
             </textbox>
           </hbox>
         </toolbaritem>
 
         <toolbaritem id="search-container" title="&searchItem.title;"
--- a/browser/base/content/test/alerts/browser.ini
+++ b/browser/base/content/test/alerts/browser.ini
@@ -1,7 +1,9 @@
 [DEFAULT]
 support-files =
   file_dom_notifications.html
 
 [browser_notification_open_settings.js]
+[browser_notification_remove_permission.js]
+skip-if = e10s
 [browser_notification_tab_switching.js]
 skip-if = buildapp == 'mulet' || e10s # Bug 1100662 - content access causing uncaught exception - Error: cannot ipc non-cpow object at chrome://mochitests/content/browser/browser/base/content/test/general/browser_notification_tab_switching.js:32 (or in RemoteAddonsChild.jsm)
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/alerts/browser_notification_remove_permission.js
@@ -0,0 +1,79 @@
+"use strict";
+
+var tab;
+var notification;
+var notificationURL = "http://example.org/browser/browser/base/content/test/alerts/file_dom_notifications.html";
+var alertWindowClosed = false;
+var permRemoved = false;
+
+function test () {
+  waitForExplicitFinish();
+
+  let pm = Services.perms;
+  registerCleanupFunction(function() {
+    pm.remove(makeURI(notificationURL), "desktop-notification");
+    gBrowser.removeTab(tab);
+    window.restore();
+  });
+
+  pm.add(makeURI(notificationURL), "desktop-notification", pm.ALLOW_ACTION);
+
+  tab = gBrowser.addTab(notificationURL);
+  gBrowser.selectedTab = tab;
+  tab.linkedBrowser.addEventListener("load", onLoad, true);
+}
+
+function onLoad() {
+  tab.linkedBrowser.removeEventListener("load", onLoad, true);
+  let win = tab.linkedBrowser.contentWindow.wrappedJSObject;
+  notification = win.showNotification2();
+  notification.addEventListener("show", onAlertShowing);
+}
+
+function onAlertShowing() {
+  info("Notification alert showing");
+  notification.removeEventListener("show", onAlertShowing);
+
+  let alertWindow = Services.wm.getMostRecentWindow("alert:alert");
+  if (!alertWindow) {
+    ok(true, "Notifications don't use XUL windows on all platforms.");
+    notification.close();
+    finish();
+    return;
+  }
+  ok(Services.perms.testExactPermission(makeURI(notificationURL), "desktop-notification"),
+     "Permission should exist prior to removal");
+  let disableForOriginMenuItem = alertWindow.document.getElementById("disableForOriginMenuItem");
+  is(disableForOriginMenuItem.localName, "menuitem", "menuitem found");
+  Services.obs.addObserver(permObserver, "perm-changed", false);
+  alertWindow.addEventListener("beforeunload", onAlertClosing);
+  disableForOriginMenuItem.click();
+  info("Clicked on disable-for-origin menuitem")
+}
+
+function permObserver(subject, topic, data) {
+  if (topic != "perm-changed") {
+    return;
+  }
+
+  let permission = subject.QueryInterface(Ci.nsIPermission);
+  is(permission.type, "desktop-notification", "desktop-notification permission changed");
+  is(data, "deleted", "desktop-notification permission deleted");
+
+  Services.obs.removeObserver(permObserver, "perm-changed");
+  permRemoved = true;
+  if (alertWindowClosed) {
+    finish();
+  }
+}
+
+function onAlertClosing(event) {
+  event.target.removeEventListener("beforeunload", onAlertClosing);
+
+  alertWindowClosed = true;
+  if (permRemoved) {
+    finish();
+  }
+}
+
+
--- a/browser/base/content/test/alerts/browser_notification_tab_switching.js
+++ b/browser/base/content/test/alerts/browser_notification_tab_switching.js
@@ -55,17 +55,17 @@ function onLoad() {
 }
 
 function onAlertShowing() {
   info("Notification alert showing");
   notification.removeEventListener("show", onAlertShowing);
 
   let alertWindow = Services.wm.getMostRecentWindow("alert:alert");
   if (!alertWindow) {
-    todo(false, "Notifications don't use XUL windows on all platforms.");
+    ok(true, "Notifications don't use XUL windows on all platforms.");
     notification.close();
     newWindowOpenedFromTab.close();
     finish();
     return;
   }
   gBrowser.tabContainer.addEventListener("TabSelect", onTabSelect);
   EventUtils.synthesizeMouseAtCenter(alertWindow.document.getElementById("alertTitleLabel"), {}, alertWindow);
   info("Clicked on notification");
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -744,16 +744,28 @@
 @RESPATH@/res/table-add-row-before-hover.gif
 @RESPATH@/res/table-add-row-before.gif
 @RESPATH@/res/table-remove-column-active.gif
 @RESPATH@/res/table-remove-column-hover.gif
 @RESPATH@/res/table-remove-column.gif
 @RESPATH@/res/table-remove-row-active.gif
 @RESPATH@/res/table-remove-row-hover.gif
 @RESPATH@/res/table-remove-row.gif
+@RESPATH@/res/accessiblecaret.png
+@RESPATH@/res/accessiblecaret@1.5x.png
+@RESPATH@/res/accessiblecaret@2.25x.png
+@RESPATH@/res/accessiblecaret@2x.png
+@RESPATH@/res/accessiblecaret_tilt_left.png
+@RESPATH@/res/accessiblecaret_tilt_left@1.5x.png
+@RESPATH@/res/accessiblecaret_tilt_left@2.25x.png
+@RESPATH@/res/accessiblecaret_tilt_left@2x.png
+@RESPATH@/res/accessiblecaret_tilt_right.png
+@RESPATH@/res/accessiblecaret_tilt_right@1.5x.png
+@RESPATH@/res/accessiblecaret_tilt_right@2.25x.png
+@RESPATH@/res/accessiblecaret_tilt_right@2x.png
 @RESPATH@/res/text_caret.png
 @RESPATH@/res/text_caret@1.5x.png
 @RESPATH@/res/text_caret@2.25x.png
 @RESPATH@/res/text_caret@2x.png
 @RESPATH@/res/text_caret_tilt_left.png
 @RESPATH@/res/text_caret_tilt_left@1.5x.png
 @RESPATH@/res/text_caret_tilt_left@2.25x.png
 @RESPATH@/res/text_caret_tilt_left@2x.png
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -213,18 +213,16 @@ These should match what Safari and other
 <!ENTITY urlbar.pointerLockNotificationAnchor.label     "Change whether the site can hide the pointer">
 <!ENTITY urlbar.servicesNotificationAnchor.label        "View the service install message">
 <!ENTITY urlbar.translateNotificationAnchor.label       "Translate this page">
 <!ENTITY urlbar.translatedNotificationAnchor.label      "Manage page translation">
 <!ENTITY urlbar.emeNotificationAnchor.label             "Manage use of DRM software">
 
 <!ENTITY urlbar.toggleAutocomplete.label                "Toggle the autocomplete popup">
 
-
-<!ENTITY locationItem.title           "Location">
 <!ENTITY searchItem.title             "Search">
 
 <!-- Toolbar items --> 
 <!ENTITY homeButton.label             "Home">
 
 <!ENTITY tabGroupsButton.label        "Tab Groups">
 
 <!ENTITY bookmarksButton.label          "Bookmarks">
--- a/browser/locales/en-US/chrome/browser/devtools/inspector.dtd
+++ b/browser/locales/en-US/chrome/browser/devtools/inspector.dtd
@@ -120,8 +120,13 @@
      shown in the inspector contextual-menu for recursively collapsing
      mark-up elements -->
 <!ENTITY inspectorCollapseNode.label       "Collapse">
 
 <!-- LOCALIZATION NOTE (inspectorScreenshotNode.label): This is the label
      shown in the inspector contextual-menu for the item that lets users take
      a screenshot of the currently selected node. -->
 <!ENTITY inspectorScreenshotNode.label       "Screenshot Node">
+
+<!-- LOCALIZATION NOTE (inspectorDuplicateNode.label): This is the label
+     shown in the inspector contextual-menu for the item that lets users
+     duplicate the currently selected node. -->
+<!ENTITY inspectorDuplicateNode.label       "Duplicate Node">
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -888,17 +888,17 @@ toolbar .toolbarbutton-1:-moz-any(@prima
   -moz-margin-start: 0;
 }
 
 .urlbar-history-dropmarker {
   -moz-appearance: toolbarbutton-dropdown;
   transition: opacity 0.15s ease;
 }
 
-#navigator-toolbox:not(:hover) .urlbar-history-dropmarker {
+#navigator-toolbox:not(:hover) #urlbar:not([focused]) > .urlbar-textbox-container > .urlbar-history-dropmarker {
   opacity: 0;
 }
 
 #urlbar-container {
   -moz-box-align: center;
 }
 
 @conditionalForwardWithUrlbar@ > #urlbar {
--- a/browser/themes/linux/linuxShared.inc
+++ b/browser/themes/linux/linuxShared.inc
@@ -1,10 +1,10 @@
 /* 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/. */
 
 %filter substitution
 
-%define toolbarHighlight rgba(255,255,255,.3)
+%define toolbarHighlight rgba(255,255,255,.4)
 %define fgTabTexture linear-gradient(transparent 2px, @toolbarHighlight@ 2px, @toolbarHighlight@)
 %define fgTabTextureLWT @fgTabTexture@
 %define fgTabBackgroundColor -moz-dialog
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -1692,17 +1692,17 @@ toolbar .toolbarbutton-1 > .toolbarbutto
 
 .urlbar-history-dropmarker {
   padding: 0 3px;
   list-style-image: var(--urlbar-dropmarker-url);
   -moz-image-region: var(--urlbar-dropmarker-region);
   transition: opacity 0.15s ease;
 }
 
-#navigator-toolbox:not(:hover) .urlbar-history-dropmarker {
+#navigator-toolbox:not(:hover) #urlbar:not([focused]) > .urlbar-textbox-container > .urlbar-history-dropmarker {
   opacity: 0;
 }
 
 .urlbar-history-dropmarker[open="true"],
 .urlbar-history-dropmarker:hover:active {
   -moz-image-region: var(--urlbar-dropmarker-active-region);
 }
 
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -1405,17 +1405,17 @@ html|*.urlbar-input:-moz-lwtheme::-moz-p
   background-color: transparent;
   border: none;
   width: auto;
   list-style-image: var(--urlbar-dropmarker-url);
   -moz-image-region: var(--urlbar-dropmarker-region);
   transition: opacity 0.15s ease;
 }
 
-#navigator-toolbox:not(:hover) .urlbar-history-dropmarker {
+#navigator-toolbox:not(:hover) #urlbar:not([focused]) > .urlbar-textbox-container > .urlbar-history-dropmarker {
   opacity: 0;
 }
 
 .urlbar-history-dropmarker:hover {
   -moz-image-region: var(--urlbar-dropmarker-hover-region);
 }
 
 .urlbar-history-dropmarker:hover:active,
--- a/browser/themes/windows/windowsShared.inc
+++ b/browser/themes/windows/windowsShared.inc
@@ -1,13 +1,13 @@
 /* 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/. */
 
 %filter substitution
 
-%define toolbarHighlight rgba(255,255,255,.3)
+%define toolbarHighlight rgba(255,255,255,.4)
 %define fgTabTexture linear-gradient(transparent 2px, @toolbarHighlight@ 2px, @toolbarHighlight@)
 %define fgTabBackgroundColor -moz-dialog
 %define fgTabTextureLWT @fgTabTexture@
 
 % Aero-only defines
 %define customToolbarColor hsl(210,75%,92%)
--- a/build/autoconf/icu.m4
+++ b/build/autoconf/icu.m4
@@ -94,23 +94,17 @@ if test -n "$USE_ICU"; then
         case "$OS_TARGET" in
             WINNT)
                 ICU_LIB_NAMES="icuin icuuc icudt"
                 MOZ_ICU_DBG_SUFFIX=
                 if test -n "$MOZ_DEBUG" -a -z "$MOZ_NO_DEBUG_RTL"; then
                     MOZ_ICU_DBG_SUFFIX=d
                 fi
                 ;;
-            Android)
-                if test -z "$gonkdir"; then
-                    AC_MSG_ERROR([ECMAScript Internationalization API is not yet supported on this platform])
-                fi
-                ICU_LIB_NAMES="icui18n icuuc icudata"
-                ;;
-            Darwin|Linux|DragonFly|FreeBSD|NetBSD|OpenBSD|GNU/kFreeBSD|SunOS)
+            Darwin|Linux|DragonFly|FreeBSD|NetBSD|OpenBSD|GNU/kFreeBSD|SunOS|Android)
                 ICU_LIB_NAMES="icui18n icuuc icudata"
                 ;;
             *)
                 AC_MSG_ERROR([ECMAScript Internationalization API is not yet supported on this platform])
         esac
     fi
 fi
 
@@ -274,16 +268,18 @@ if test -z "$BUILDING_JS" -o -n "$JS_STA
             if test -z "$MOZ_OPTIMIZE"; then
                 ICU_CFLAGS="$ICU_CFLAGS -Od"
                 ICU_CXXFLAGS="$ICU_CXXFLAGS -Od"
             fi
         fi
 
         if test -n "$gonkdir"; then
             ICU_CXXFLAGS="-I$gonkdir/abi/cpp/include $ICU_CXXFLAGS"
+        elif test "$OS_TARGET" = Android -a "$MOZ_ANDROID_CXX_STL" = mozstlport; then
+            ICU_CXXFLAGS="-I$_topsrcdir/build/gabi++/include $ICU_CXXFLAGS"
         fi
 
         if test -z "$MOZ_SHARED_ICU"; then
           ICU_CXXFLAGS="$ICU_CXXFLAGS -DU_STATIC_IMPLEMENTATION"
           ICU_CFLAGS="$ICU_CFLAGS -DU_STATIC_IMPLEMENTATION"
           if test "$GNU_CC"; then
             ICU_CFLAGS="$ICU_CFLAGS -fvisibility=hidden"
             ICU_CXXFLAGS="$ICU_CXXFLAGS -fvisibility=hidden"
new file mode 100644
--- /dev/null
+++ b/build/gabi++/Android.mk
@@ -0,0 +1,55 @@
+LOCAL_PATH:= $(call my-dir)
+
+libgabi++_cflags := \
+	-I$(LOCAL_PATH)/include 
+
+libgabi++_common_src_files := \
+	src/array_type_info.cc \
+	src/class_type_info.cc \
+        src/delete.cc \
+	src/dynamic_cast.cc \
+	src/enum_type_info.cc \
+	src/function_type_info.cc \
+        src/new.cc \
+	src/pbase_type_info.cc \
+	src/pointer_type_info.cc \
+	src/pointer_to_member_type_info.cc \
+	src/si_class_type_info.cc \
+	src/type_info.cc \
+	src/vmi_class_type_info.cc
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_CPP_EXTENSION := .cc
+
+LOCAL_SRC_FILES:= $(libgabi++_common_src_files)
+
+LOCAL_MODULE:= libgabi++
+
+LOCAL_CFLAGS := $(libgabi++_cflags)
+
+LOCAL_RTTI_FLAG := -frtti
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+include $(BUILD_SHARED_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_CPP_EXTENSION := .cc
+
+LOCAL_SRC_FILES:= $(libgabi++_common_src_files)
+
+LOCAL_MODULE:= libgabi++
+
+LOCAL_CFLAGS := $(libgabi++_cflags)
+
+LOCAL_RTTI_FLAG := -frtti
+
+LOCAL_SYSTEM_SHARED_LIBRARIES := libc
+
+include $(BUILD_STATIC_LIBRARY)
new file mode 100644
--- /dev/null
+++ b/build/gabi++/README.mozilla
@@ -0,0 +1,1 @@
+This copy of libgabi++ is from Android 5.0 source code on https://android.googlesource.com/platform/abi/cpp/.  Tag is android-5.0.0_r1.
new file mode 100644
--- /dev/null
+++ b/build/gabi++/include/cxxabi.h
@@ -0,0 +1,183 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+
+#ifndef __GABIXX_CXXABI_H__
+#define __GABIXX_CXXABI_H__
+
+#include <typeinfo>
+
+namespace __cxxabiv1
+{
+  extern "C" void __cxa_pure_virtual();
+
+  // Derived types of type_info below are based on 2.9.5 of C++ ABI.
+
+  // Typeinfo for fundamental types.
+  class __fundamental_type_info : public std::type_info
+  {
+  public:
+    ~__fundamental_type_info();
+  };
+
+  // Typeinfo for array types.
+  class __array_type_info : public std::type_info
+  {
+  public:
+    ~__array_type_info();
+  };
+
+  // Typeinfo for function types.
+  class __function_type_info : public std::type_info
+  {
+  public:
+    ~__function_type_info();
+  };
+
+  // Typeinfo for enum types.
+  class __enum_type_info : public std::type_info
+  {
+  public:
+    ~__enum_type_info();
+  };
+
+  // Typeinfo for classes with no bases.
+  class __class_type_info : public std::type_info
+  {
+  public:
+    ~__class_type_info();
+
+    enum class_type_info_code
+      {
+        CLASS_TYPE_INFO_CODE,
+        SI_CLASS_TYPE_INFO_CODE,
+        VMI_CLASS_TYPE_INFO_CODE
+      };
+
+    virtual class_type_info_code
+    code() const { return CLASS_TYPE_INFO_CODE; }
+  };
+
+  // Typeinfo for classes containing only a single, public, non-virtual base at
+  // offset zero.
+  class __si_class_type_info : public __class_type_info
+  {
+  public:
+    ~__si_class_type_info();
+    const __class_type_info *__base_type;
+
+    virtual __class_type_info::class_type_info_code
+    code() const { return SI_CLASS_TYPE_INFO_CODE; }
+  };
+
+  struct __base_class_type_info
+  {
+  public:
+    const __class_type_info *__base_type;
+
+    // All but the lower __offset_shift bits of __offset_flags are a signed
+    // offset. For a non-virtual base, this is the offset in the object of the
+    // base subobject. For a virtual base, this is the offset in the virtual
+    // table of the virtual base offset for the virtual base referenced
+    // (negative).
+    long __offset_flags;
+
+    enum __offset_flags_masks
+      {
+        __virtual_mask = 0x1,
+        __public_mask = 0x2,
+        __offset_shift = 8
+      };
+
+    bool inline
+    is_virtual() const { return (__offset_flags & __virtual_mask) != 0; }
+
+    bool inline
+    is_public() const { return (__offset_flags & __public_mask) != 0; }
+
+    // FIXME: Right-shift of signed integer is implementation dependent.
+    long inline
+    offset() const { return __offset_flags >> __offset_shift; }
+
+    long inline
+    flags() const { return __offset_flags & ((1L << __offset_shift) - 1); }
+  };
+
+  // Typeinfo for classes with bases that do not satisfy the
+  // __si_class_type_info constraints.
+  class __vmi_class_type_info : public __class_type_info
+  {
+  public:
+    ~__vmi_class_type_info();
+    unsigned int __flags;
+    unsigned int __base_count;
+    __base_class_type_info __base_info[1];
+
+    enum __flags_masks
+      {
+        __non_diamond_repeat_mask = 0x1,
+        __diamond_shaped_mask = 0x2
+      };
+
+    virtual __class_type_info::class_type_info_code
+    code() const { return VMI_CLASS_TYPE_INFO_CODE; }
+  };
+
+  class __pbase_type_info : public std::type_info
+  {
+  public:
+    ~__pbase_type_info();
+    unsigned int __flags;
+    const std::type_info *__pointee;
+
+    enum __masks
+      {
+        __const_mask = 0x1,
+        __volatile_mask = 0x2,
+        __restrict_mask = 0x4,
+        __incomplete_mask = 0x8,
+        __incomplete_class_mask = 0x10
+      };
+  };
+
+  class __pointer_type_info : public __pbase_type_info
+  {
+  public:
+    ~__pointer_type_info();
+  };
+
+  class __pointer_to_member_type_info : public __pbase_type_info
+  {
+  public:
+    ~__pointer_to_member_type_info();
+  };
+}
+
+namespace abi = __cxxabiv1;
+
+#endif /* defined(__GABIXX_CXXABI_H__) */
+
new file mode 100644
--- /dev/null
+++ b/build/gabi++/include/new
@@ -0,0 +1,56 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// new: Dynamic storage management.
+
+#ifndef __GABIXX_NEW__
+#define __GABIXX_NEW__
+
+#include <cstddef>
+
+namespace std
+{
+  struct nothrow_t {};
+  extern const nothrow_t nothrow;
+  typedef void (*new_handler)();
+}
+
+// FIXME: Need to handle exceptions.
+void* operator new(std::size_t size) throw(/*std::bad_alloc*/);
+void* operator new(std::size_t size, const std::nothrow_t&) throw();
+void  operator delete(void* ptr) throw();
+void  operator delete(void*, const std::nothrow_t&) throw();
+void* operator new[](std::size_t size) throw(/*std::bad_alloc*/);
+void* operator new[](std::size_t size, const std::nothrow_t&) throw();
+void  operator delete[](void* ptr) throw();
+void  operator delete[](void* const, std::nothrow_t&) throw();
+void* operator new(std::size_t size, void* ptr) throw();
+void* operator new[](std::size_t size, void* ptr) throw();
+void  operator delete(void* ptr, void*) throw();
+void  operator delete[](void* ptr, void*) throw();
+
+#endif // __GABIXX_NEW__
new file mode 100644
--- /dev/null
+++ b/build/gabi++/include/typeinfo
@@ -0,0 +1,76 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// typeinfo: RTTI support header.
+//
+// References:
+// Itanium C++ ABI at http://www.codesourcery.com/public/cxx-abi/abi.html.
+// IHI0041A C++ Application Binary Interface for the ARM architecture.
+// Linux Standard Base C++ Specification for S390X 4.1.
+//
+
+#ifndef __GABIXX_TYPEINFO__
+#define __GABIXX_TYPEINFO__
+
+namespace std
+{
+  // Defintion of type_info based on example in C++ ABI section 2.9.3
+  class type_info
+  {
+  public:
+    virtual
+    ~type_info();
+
+    // Whether two type_infos corresponds to the same types.
+    bool
+    operator==(const type_info &ti) const;
+
+    // Whether two type_infos corresponds to the different types.
+    bool
+    operator!=(const type_info &ti) const;
+
+    bool
+    before(const type_info &ti) const;
+
+    // Return name of type.
+    const char*
+    name() const { return __type_name; }
+
+  private:
+    // Assignment of type_info is not allowed.
+    type_info (const type_info& rhs);
+
+    type_info&
+    operator=(const type_info& rhs);
+
+    // Mangled name of type.
+    const char *__type_name;
+  };
+
+} // namespace std
+
+#endif // _GABIXX_TYPEINFO_
new file mode 100644
--- /dev/null
+++ b/build/gabi++/moz.build
@@ -0,0 +1,36 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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/.
+
+Library('gabi++')
+
+SOURCES += [
+    'src/array_type_info.cc',
+    'src/class_type_info.cc',
+    'src/delete.cc',
+    'src/dynamic_cast.cc',
+    'src/enum_type_info.cc',
+    'src/function_type_info.cc',
+    'src/fundamental_type_info.cc',
+    'src/new.cc',
+    'src/pbase_type_info.cc',
+    'src/pointer_to_member_type_info.cc',
+    'src/pointer_type_info.cc',
+    'src/si_class_type_info.cc',
+    'src/type_info.cc',
+    'src/vmi_class_type_info.cc',
+]
+
+LOCAL_INCLUDES += [
+    'include'
+]
+
+DISABLE_STL_WRAPPING = True
+NO_VISIBILITY_FLAGS = True
+
+CXXFLAGS += [
+    '-fexceptions',
+    '-frtti'
+]
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/array_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// fundamental_type_info.cc: Methods for __fundamental_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __fundamental_type_info::~__fundamental_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/class_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// class_type_info.cc: Methods for __class_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __class_type_info::~__class_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/delete.cc
@@ -0,0 +1,38 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// delete.cc: delete operator
+
+#include <stdlib.h>
+#include <new>
+
+void
+operator delete(void* ptr) throw()
+{
+  if (ptr)
+    free(ptr);
+}
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/dynamic_cast.cc
@@ -0,0 +1,356 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// dynamic_cast.cc: RTTI support.
+//
+// References:
+// Itanium C++ ABI at http://www.codesourcery.com/public/cxx-abi/abi.html
+// IHI0041A C++ Application Binary Interface for the ARM architecture.
+//
+
+#include <cxxabi.h>
+
+#include <cstddef>
+#include <cassert>
+
+namespace
+{
+  // Adjust a pointer by an offset.
+
+  const void*
+  adjust_pointer(const void* p, std::ptrdiff_t off)
+  {
+    // FIXME: should we align pointer after adjustment?
+    const char *cp = reinterpret_cast<const char*>(p) + off;
+    return reinterpret_cast<const void*>(cp);
+  }
+
+  // Return the vtable pointer of a polymorphic object pointed by p.
+
+  inline const void*
+  get_vtable(const void* p)
+  {
+    return *reinterpret_cast<void*const*>(p);
+  }
+
+  // Return a pointer to a __class_type_info in a vtable.
+
+  inline const abi::__class_type_info*
+  get_class_type_info(const void* vtable)
+  {
+    const void* type_info_ptr = adjust_pointer(vtable, -sizeof(void*));
+    return *reinterpret_cast<abi::__class_type_info*const*>(type_info_ptr);
+  }
+
+  // Return offset to object in a vtable.
+
+  inline std::ptrdiff_t
+  get_offset_to_top(const void* vtable)
+  {
+    const void* type_info_ptr_address = adjust_pointer(vtable, -sizeof(void*));
+    const void* offset_to_top_address =
+      adjust_pointer(type_info_ptr_address, -sizeof(std::ptrdiff_t));
+    return *reinterpret_cast<const std::ptrdiff_t*>(offset_to_top_address);
+  }
+
+  // Return the virtual pointer to the most derived object of referred by a
+  // pointer p.
+
+  const void*
+  get_most_derived_object(const void* p)
+  {
+    const void* vtable = get_vtable(p);
+    std::ptrdiff_t offset_to_top = get_offset_to_top(vtable);
+    return adjust_pointer(p, offset_to_top);
+  }
+
+  // We assume that -1 cannot be a valid pointer to object.
+  const void * const ambiguous_object =
+    reinterpret_cast<const void*>(-1);
+
+  // Return a pointer to the subobject described by base_info.
+
+  const void*
+  get_subobject(const void* object,
+                const void* vtable,
+                const abi::__base_class_type_info* base_info)
+  {
+    long offset = base_info->offset();
+    if (base_info->is_virtual())
+      {
+        const std::ptrdiff_t* virtual_base_offset_address =
+          static_cast<const std::ptrdiff_t*> (adjust_pointer(vtable, offset));
+        offset = *virtual_base_offset_address;
+      }
+    return adjust_pointer(object, offset);
+  }
+
+  // Helper of __dyanmic_cast to walk the type tree of an object.
+
+  const void *
+  walk_object(const void *object,
+              const abi::__class_type_info *type,
+              const void *match_object,
+              const abi::__class_type_info *match_type)
+  {
+    if (*type == *match_type)
+      return (match_object == NULL || object == match_object) ? object : NULL;
+
+    switch(type->code())
+      {
+      case abi::__class_type_info::CLASS_TYPE_INFO_CODE:
+        // This isn't not the class you're looking for.
+        return NULL;
+
+      case abi::__class_type_info::SI_CLASS_TYPE_INFO_CODE:
+        // derived type has a single public base at offset 0.
+        {
+          const abi::__si_class_type_info* ti =
+            static_cast<const abi::__si_class_type_info*>(type);
+          return walk_object(object, ti->__base_type, match_object,
+                             match_type);
+        }
+
+      case abi::__class_type_info::VMI_CLASS_TYPE_INFO_CODE:
+        {
+          const void* vtable = get_vtable(object);
+          const abi::__vmi_class_type_info* ti =
+            static_cast<const abi::__vmi_class_type_info*>(type);
+
+          // Look at all direct bases.
+          const void* result = NULL;
+          for (unsigned i = 0; i < ti->__base_count; ++i)
+            {
+              if (!ti->__base_info[i].is_public())
+                continue;
+
+              const void *subobject =
+                get_subobject(object, vtable, &ti->__base_info[i]);
+              const void* walk_subobject_result =
+                walk_object(subobject, ti->__base_info[i].__base_type,
+                            match_object, match_type);
+
+              if (walk_subobject_result == ambiguous_object)
+                return ambiguous_object;
+              else if (walk_subobject_result != NULL)
+                {
+                  if (result == NULL)
+                    {
+                      result = walk_subobject_result;
+                    }
+                  else if (result != walk_subobject_result)
+                    return ambiguous_object;
+                }
+            }
+          return result;
+        }
+
+      default:
+        assert(0);
+      }
+    return NULL;
+  }
+
+  // Bookkeeping structure for derived-to-base cast in the general case.
+  struct cast_context
+  {
+  public:
+    const void* object;
+    const abi::__class_type_info *src_type;
+    const abi::__class_type_info *dst_type;
+    std::ptrdiff_t src2dst_offset;
+
+    const void* dst_object;
+    const void* result;
+
+    cast_context(const void* obj, const abi::__class_type_info *src,
+                 const abi::__class_type_info *dst, std::ptrdiff_t offset)
+      : object(obj), src_type(src), dst_type(dst), src2dst_offset(offset),
+        dst_object(NULL), result(NULL)
+    { }
+  };
+
+  // based-to-derive cast in the general case.
+
+  void
+  base_to_derived_cast(const void *object,
+                       const abi::__class_type_info *type,
+                       cast_context* context)
+  {
+    const void* saved_dst_object = context->dst_object;
+    bool is_dst_type = *type == *context->dst_type;
+    if (is_dst_type)
+      context->dst_object = object;
+
+    if (object == context->object
+        && context->dst_object != NULL
+        && *type == *context->src_type)
+      {
+        if (context->result == NULL)
+          context->result = context->dst_object;
+        else if (context->result != context->dst_object)
+          context->result = ambiguous_object;
+        context->dst_object = saved_dst_object;
+        return;
+      }
+
+    switch(type->code())
+      {
+      case abi::__class_type_info::CLASS_TYPE_INFO_CODE:
+        // This isn't not the class you're looking for.
+        break;
+
+      case abi::__class_type_info::SI_CLASS_TYPE_INFO_CODE:
+        // derived type has a single public base at offset 0.
+        {
+          const abi::__si_class_type_info* ti =
+            static_cast<const abi::__si_class_type_info*>(type);
+          base_to_derived_cast(object, ti->__base_type, context);
+          break;
+        }
+
+      case abi::__class_type_info::VMI_CLASS_TYPE_INFO_CODE:
+        {
+          const void* vtable = get_vtable(object);
+          const abi::__vmi_class_type_info* ti =
+            static_cast<const abi::__vmi_class_type_info*>(type);
+
+          // Look at all direct bases.
+          for (unsigned i = 0; i < ti->__base_count; ++i)
+            {
+              if (!ti->__base_info[i].is_public())
+                continue;
+
+              const void *subobject =
+                get_subobject(object, vtable, &ti->__base_info[i]);
+              base_to_derived_cast(subobject, ti->__base_info[i].__base_type,
+                                   context);
+
+              // FIXME: Use flags in base_info to optimize search.
+              if (context->result == ambiguous_object)
+                break;
+            }
+          break;
+        }
+
+      default:
+        assert(0);
+      }
+     context->dst_object = saved_dst_object;
+  }
+} // namespace
+
+namespace __cxxabiv1
+{
+#define DYNAMIC_CAST_NO_HINT -1
+#define DYNAMIC_CAST_NOT_PUBLIC_BASE -2
+#define DYNAMIC_CAST_MULTIPLE_PUBLIC_NONVIRTUAL_BASE -3
+
+  /* v: source address to be adjusted; nonnull, and since the
+   *    source object is polymorphic, *(void**)v is a virtual pointer.
+   * src: static type of the source object.
+   * dst: destination type (the "T" in "dynamic_cast<T>(v)").
+   * src2dst_offset: a static hint about the location of the
+   *    source subobject with respect to the complete object;
+   *    special negative values are:
+   *       -1: no hint
+   *       -2: src is not a public base of dst
+   *       -3: src is a multiple public base type but never a
+   *           virtual base type
+   *    otherwise, the src type is a unique public nonvirtual
+   *    base type of dst at offset src2dst_offset from the
+   *    origin of dst.
+   */
+  extern "C" void*
+  __dynamic_cast (const void *v,
+                  const abi::__class_type_info *src,
+                  const abi::__class_type_info *dst,
+                  std::ptrdiff_t src2dst_offset)
+  {
+    const void* most_derived_object = get_most_derived_object(v);
+    const void* vtable = get_vtable(most_derived_object);
+    const abi::__class_type_info* most_derived_class_type_info =
+      get_class_type_info(vtable);
+
+    // If T is not a public base type of the most derived class referred
+    // by v, the cast always fails.
+    void* t_object =
+      const_cast<void*>(walk_object(most_derived_object,
+                                    most_derived_class_type_info, NULL, dst));
+    if (t_object == NULL)
+      return NULL;
+
+    // C++ ABI 2.9.7 The dynamic_cast Algorithm:
+    //
+    // If, in the most derived object pointed (referred) to by v, v points
+    // (refers) to a public base class subobject of a T object [note: this can
+    // be checked at compile time], and if only one object of type T is derived
+    // from the subobject pointed (referred) to by v, the result is a pointer
+    // (an lvalue referring) to that T object.
+
+    // We knew that src is not a public base, so base-to-derived cast
+    // is not possible.  This works even if there are multiple subobjects
+    // of type T in the most derived object.
+    if (src2dst_offset != DYNAMIC_CAST_NOT_PUBLIC_BASE)
+      {
+        // If it is known that v points to a public base class subobject
+        // of a T object, simply adjust the pointer by the offset.
+        if (t_object != ambiguous_object && src2dst_offset >= 0)
+          return const_cast<void*>(adjust_pointer(v, -src2dst_offset));
+
+        // If there is only one T type subobject, we only need to look at
+        // there.  Otherwise, look for the subobject referred by v in the
+        // most derived object.
+        cast_context context(v, src, dst, src2dst_offset);
+        if (t_object != ambiguous_object)
+          base_to_derived_cast(t_object, dst, &context);
+        else
+          base_to_derived_cast(most_derived_object,
+                               most_derived_class_type_info, &context);
+
+        if (context.result != NULL && context.result != ambiguous_object)
+          return const_cast<void*>(context.result);
+      }
+
+    // C++ ABI 2.9.7 The dynamic_cast Algorithm:
+    //
+    // Otherwise, if v points (refers) to a public base class subobject of the
+    // most derived object, and the type of the most derived object has an
+    // unambiguous public base class of type T, the result is a pointer (an
+    // lvalue referring) to the T subobject of the most derived object.
+    // Otherwise, the run-time check fails.
+
+    // Check to see if T is a unambiguous public base class.
+    if (t_object == ambiguous_object)
+      return NULL;
+
+    // See if v refers to a public base class subobject.
+    const void* v_object =
+      walk_object(most_derived_object, most_derived_class_type_info, v, src);
+    return v_object == v ? t_object : NULL;
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/enum_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// enum_type_info.cc: Methods for __enum_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __enum_type_info::~__enum_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/function_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// function_type_info.cc: Methods for __function_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __function_type_info::~__function_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/fundamental_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// array_type_info.cc: Methods for __array_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __array_type_info::~__array_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/new.cc
@@ -0,0 +1,42 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+
+#include <stdlib.h>
+#include <new>
+
+// FIXME: need to handle exceptions
+void*
+operator new(std::size_t size) throw (/*std::bad_alloc*/)
+{
+  void* ptr = malloc(size);
+#if 0
+  if (ptr == NULL)
+    throw std::bad_alloc();
+#endif
+  return ptr;
+}
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/pbase_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// pbase_type_info.cc: Methods for __pbase_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __pbase_type_info::~__pbase_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/pointer_to_member_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// pointer_to_member_type_info.cc: Methods for __pointer_to_member_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __pointer_to_member_type_info::~__pointer_to_member_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/pointer_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// pointer_type_info.cc: Methods for __pointer_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __pointer_type_info::~__pointer_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/si_class_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// si_class_type_info.cc: Methods for __si_class_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __si_class_type_info::~__si_class_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/type_info.cc
@@ -0,0 +1,75 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// type_info.cc: Methods for std::type_info.
+//
+
+#include <cxxabi.h>
+#ifdef __ARM_EABI__
+// ARM EABI requires string comprison for mangled type names for type_info
+// equality.
+#include <string.h>
+#endif
+
+#include <typeinfo>
+
+namespace std
+{
+  type_info::~type_info()
+  {
+  }
+
+  bool
+  type_info::operator==(const type_info& rhs) const
+  {
+#ifdef __ARM_EABI__
+    // IHI0041A CPPABI 3.2.5.6.  Because of weak linkage and share libraries,
+    // we perform string comparison.
+    return strcmp(this->__type_name, rhs.__type_name) == 0;
+#else
+    return this == &rhs;
+#endif
+  }
+
+  bool
+  type_info::operator!=(const type_info& rhs) const
+  {
+    return !this->operator==(rhs);
+  }
+
+  bool
+  type_info::before(const type_info& rhs) const
+  {
+#ifdef __ARM_EABI__
+    // IHI0041A CPPABI 3.2.5.6.  Because of weak linkage and share libraries,
+    // we perform string comparison.
+    return strcmp(this->__type_name, rhs.__type_name) < 0;
+#else
+    return this < &rhs;
+#endif
+  }
+} // end namespace std
new file mode 100644
--- /dev/null
+++ b/build/gabi++/src/vmi_class_type_info.cc
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 The Android Open Source Project
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+//    notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+//    notice, this list of conditions and the following disclaimer in the
+//    documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the project nor the names of its contributors
+//    may be used to endorse or promote products derived from this software
+//    without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+// SUCH DAMAGE.
+//
+// vmi_class_type_info.cc: Methods for __vmi_class_type_info.
+
+#include <cxxabi.h>
+
+namespace __cxxabiv1
+{
+  __vmi_class_type_info::~__vmi_class_type_info()
+  {
+  }
+} // namespace __cxxabiv1
new file mode 100644
--- /dev/null
+++ b/build/gabi++/use_rtti.mk
@@ -0,0 +1,8 @@
+# To use RTTI, "include abi/cpp/use_rtti.mk" in your target.
+
+LOCAL_C_INCLUDES := \
+	abi/cpp/include \
+	$(LOCAL_C_INCLUDES)
+
+LOCAL_RTTI_FLAG := -frtti
+LOCAL_SHARED_LIBRARIES += libgabi++
--- a/build/moz.build
+++ b/build/moz.build
@@ -12,16 +12,18 @@ SPHINX_TREES['buildsystem'] = 'docs'
 
 if CONFIG['OS_ARCH'] == 'WINNT':
     DIRS += ['win32']
 else:
     DIRS += ['unix']
 
 if CONFIG['OS_TARGET'] == 'Android' and CONFIG['MOZ_ANDROID_CXX_STL'] == 'mozstlport':
     DIRS += ['stlport']
+    if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android' and CONFIG['ENABLE_INTL_API']:
+        DIRS += ['gabi++']
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android':
     DIRS += ['annotationProcessors']
     TEST_DIRS += [
         'mobile/sutagent/android',
         'mobile/sutagent/android/watcher',
         'mobile/sutagent/android/ffxcp',
         'mobile/sutagent/android/fencp',
--- a/config/external/icu/moz.build
+++ b/config/external/icu/moz.build
@@ -16,8 +16,12 @@ else:
             l,
             CONFIG['MOZ_ICU_DBG_SUFFIX']
         )]
 
     if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
         OS_LIBS += [
             'gabi++',
         ]
+    if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android' and CONFIG['MOZ_ANDROID_CXX_STL'] == 'mozstlport':
+        USE_LIBS += [
+            'gabi++'
+        ]
--- a/configure.in
+++ b/configure.in
@@ -9105,22 +9105,20 @@ HAVE_SYS_STATFS_H
 HAVE_SYS_VFS_H
 HAVE_SYS_MOUNT_H
 "
 
 dnl ========================================================
 dnl ICU Support
 dnl ========================================================
 
-# Internationalization isn't built or exposed by default in non-desktop
-# builds.  Bugs to enable:
-#
-#   Android:  bug 864843
-
-if test "$MOZ_WIDGET_TOOLKIT" = "android"; then
+# Internationalization is not built or exposed on Fennec.
+# See Bug 1215256
+
+if test "$MOZ_BUILD_APP" = "mobile/android"; then
     _INTL_API=no
 else
     _INTL_API=yes
 fi
 
 if test "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then
     USE_ICU=1
 fi
--- a/devtools/client/inspector/inspector-panel.js
+++ b/devtools/client/inspector/inspector-panel.js
@@ -649,16 +649,19 @@ InspectorPanel.prototype = {
   /**
    * Disable the delete item if needed. Update the pseudo classes.
    */
   _setupNodeMenu: function() {
     let isSelectionElement = this.selection.isElementNode() &&
                              !this.selection.isPseudoElementNode();
     let isEditableElement = isSelectionElement &&
                             !this.selection.isAnonymousNode();
+    let isDuplicatableElement = isSelectionElement &&
+                                !this.selection.isAnonymousNode() &&
+                                !this.selection.isRoot();
     let isScreenshotable = isSelectionElement &&
                            this.canGetUniqueSelector &&
                            this.selection.nodeFront.isTreeDisplayed;
 
     // Set the pseudo classes
     for (let name of ["hover", "active", "focus"]) {
       let menu = this.panelDoc.getElementById("node-menu-pseudo-" + name);
 
@@ -678,16 +681,17 @@ InspectorPanel.prototype = {
     } else {
       deleteNode.setAttribute("disabled", "true");
     }
 
     // Disable / enable "Copy Unique Selector", "Copy inner HTML",
     // "Copy outer HTML", "Scroll Into View" & "Screenshot Node" as appropriate
     let unique = this.panelDoc.getElementById("node-menu-copyuniqueselector");
     let screenshot = this.panelDoc.getElementById("node-menu-screenshotnode");
+    let duplicateNode = this.panelDoc.getElementById("node-menu-duplicatenode");
     let copyInnerHTML = this.panelDoc.getElementById("node-menu-copyinner");
     let copyOuterHTML = this.panelDoc.getElementById("node-menu-copyouter");
     let scrollIntoView = this.panelDoc.getElementById("node-menu-scrollnodeintoview");
     let expandAll = this.panelDoc.getElementById("node-menu-expand");
     let collapse = this.panelDoc.getElementById("node-menu-collapse");
 
     expandAll.setAttribute("disabled", "true");
     collapse.setAttribute("disabled", "true");
@@ -695,20 +699,30 @@ InspectorPanel.prototype = {
     let markUpContainer = this.markup.importNode(this.selection.nodeFront, false);
     if (this.selection.isNode() && markUpContainer.hasChildren) {
       if (markUpContainer.expanded) {
         collapse.removeAttribute("disabled");
       }
       expandAll.removeAttribute("disabled");
     }
 
+    this._target.actorHasMethod("domwalker", "duplicateNode").then(value => {
+      duplicateNode.hidden = !value;
+    });
     this._target.actorHasMethod("domnode", "scrollIntoView").then(value => {
       scrollIntoView.hidden = !value;
     });
 
+    if (isDuplicatableElement) {
+      duplicateNode.removeAttribute("disabled");
+    }
+    else {
+      duplicateNode.setAttribute("disabled", "true");
+    }
+
     if (isSelectionElement) {
       unique.removeAttribute("disabled");
       copyInnerHTML.removeAttribute("disabled");
       copyOuterHTML.removeAttribute("disabled");
       scrollIntoView.removeAttribute("disabled");
     } else {
       unique.setAttribute("disabled", "true");
       copyInnerHTML.setAttribute("disabled", "true");
@@ -1173,16 +1187,30 @@ InspectorPanel.prototype = {
     if (!this.selection.isNode()) {
       return;
     }
 
     this.selection.nodeFront.scrollIntoView();
   },
 
   /**
+   * Duplicate the selected node
+   */
+  duplicateNode: function() {
+    let selection = this.selection;
+    if (!selection.isElementNode() ||
+        selection.isRoot() ||
+        selection.isAnonymousNode() ||
+        selection.isPseudoElementNode()) {
+      return;
+    }
+    this.walker.duplicateNode(selection.nodeFront).catch(e => console.error(e));
+  },
+
+  /**
    * Delete the selected node.
    */
   deleteNode: function() {
     if (!this.selection.isNode() ||
          this.selection.isRoot()) {
       return;
     }
 
--- a/devtools/client/inspector/inspector.xul
+++ b/devtools/client/inspector/inspector.xul
@@ -98,16 +98,19 @@
       <menuseparator/>
       <menuitem id="node-menu-scrollnodeintoview"
         label="&inspectorScrollNodeIntoView.label;"
         accesskey="&inspectorScrollNodeIntoView.accesskey;"
         oncommand="inspector.scrollNodeIntoView()"/>
       <menuitem id="node-menu-screenshotnode"
         label="&inspectorScreenshotNode.label;"
         oncommand="inspector.screenshotNode()" />
+      <menuitem id="node-menu-duplicatenode"
+        label="&inspectorDuplicateNode.label;"
+        oncommand="inspector.duplicateNode()"/>
       <menuitem id="node-menu-delete"
         label="&inspectorHTMLDelete.label;"
         accesskey="&inspectorHTMLDelete.accesskey;"
         oncommand="inspector.deleteNode()"/>
       <menuseparator id="node-menu-link-separator"/>
       <menuitem id="node-menu-link-follow"
         oncommand="inspector.onFollowLink()"/>
       <menuitem id="node-menu-link-copy"
--- a/devtools/client/inspector/test/browser_inspector_menu-05-other.js
+++ b/devtools/client/inspector/test/browser_inspector_menu-05-other.js
@@ -1,53 +1,68 @@
 /* vim: set ts=2 et sw=2 tw=80: */
 /* Any copyright is dedicated to the Public Domain.
 http://creativecommons.org/publicdomain/zero/1.0/ */
 "use strict";
 
 // Tests for menuitem functionality that doesn't fit into any specific category
-
 const TEST_URL = TEST_URL_ROOT + "doc_inspector_menu.html";
-
 add_task(function* () {
   let { inspector, toolbox, testActor } = yield openInspectorForURL(TEST_URL);
-
   yield testShowDOMProperties();
+  yield testDuplicateNode();
   yield testDeleteNode();
   yield testDeleteRootNode();
   yield testScrollIntoView();
-
   function* testShowDOMProperties() {
     info("Testing 'Show DOM Properties' menu item.");
     let showDOMPropertiesNode = inspector.panelDoc.getElementById("node-menu-showdomproperties");
     ok(showDOMPropertiesNode, "the popup menu has a show dom properties item");
 
     let consoleOpened = toolbox.once("webconsole-ready");
 
     info("Triggering 'Show DOM Properties' and waiting for inspector open");
     dispatchCommandEvent(showDOMPropertiesNode);
     yield consoleOpened;
 
     let webconsoleUI = toolbox.getPanel("webconsole").hud.ui;
     let messagesAdded = webconsoleUI.once("new-messages");
     yield messagesAdded;
-
     info("Checking if 'inspect($0)' was evaluated");
     ok(webconsoleUI.jsterm.history[0] === 'inspect($0)');
+    yield toolbox.toggleSplitConsole();
+  }
+  function* testDuplicateNode() {
+    info("Testing 'Duplicate Node' menu item for normal elements.");
 
-    yield toolbox.toggleSplitConsole();
+    yield selectNode(".duplicate", inspector);
+    is((yield testActor.getNumberOfElementMatches(".duplicate")), 1,
+       "There should initially be 1 .duplicate node");
+
+    let menuItem = inspector.panelDoc.getElementById("node-menu-duplicatenode");
+    ok(menuItem, "'Duplicate node' menu item should exist");
+
+    info("Triggering 'Duplicate Node' and waiting for inspector to update");
+    let updated = inspector.once("markupmutation");
+    dispatchCommandEvent(menuItem);
+    yield updated;
+
+    is((yield testActor.getNumberOfElementMatches(".duplicate")), 2,
+       "The duplicated node should be in the markup.");
+
+    let container = yield getContainerForSelector(".duplicate + .duplicate",
+                                                   inspector);
+    ok(container, "A MarkupContainer should be created for the new node");
   }
 
   function* testDeleteNode() {
     info("Testing 'Delete Node' menu item for normal elements.");
-
     yield selectNode("#delete", inspector);
     let deleteNode = inspector.panelDoc.getElementById("node-menu-delete");
     ok(deleteNode, "the popup menu has a delete menu item");
-
     let updated = inspector.once("inspector-updated");
 
     info("Triggering 'Delete Node' and waiting for inspector to update");
     dispatchCommandEvent(deleteNode);
     yield updated;
 
     ok(!(yield testActor.hasNode("#delete")), "Node deleted");
   }
--- a/devtools/client/inspector/test/doc_inspector_menu.html
+++ b/devtools/client/inspector/test/doc_inspector_menu.html
@@ -10,16 +10,17 @@
         <h1>Inspector Tree Menu Test</h1>
         <p class="inner">Unset</p>
         <p class="adjacent">
           <span class="ref">3</span>
         </p>
       </div>
       <p data-id="copy">Paragraph for testing copy</p>
       <p id="sensitivity">Paragraph for sensitivity</p>
+      <p class="duplicate">This will be duplicated</p>
       <p id="delete">This has to be deleted</p>
       <img id="copyimage" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQYV2P4DwABAQEAWk1v8QAAAABJRU5ErkJggg==" />
       <div id="hiddenElement" style="display: none;">
         <p id="nestedHiddenElement">Visible element nested inside a non-visible element</p>
       </div>
       <p id="console-var">Paragraph for testing console variables</p>
       <p id="console-var-multi">Paragraph for testing multiple console variables</p>
     </div>
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -219,24 +219,24 @@ devtools.jar:
     skin/themes/images/editor-debug-location@2x.png (themes/images/editor-debug-location@2x.png)
 *   skin/themes/webconsole.css (themes/webconsole.css)
     skin/themes/images/webconsole.svg (themes/images/webconsole.svg)
     skin/themes/images/breadcrumbs-divider@2x.png (themes/images/breadcrumbs-divider@2x.png)
     skin/themes/images/breadcrumbs-scrollbutton.png (themes/images/breadcrumbs-scrollbutton.png)
     skin/themes/images/breadcrumbs-scrollbutton@2x.png (themes/images/breadcrumbs-scrollbutton@2x.png)
     skin/themes/animationinspector.css (themes/animationinspector.css)
     skin/themes/eyedropper.css (themes/eyedropper.css)
-*   skin/themes/canvasdebugger.css (themes/canvasdebugger.css)
+    skin/themes/canvasdebugger.css (themes/canvasdebugger.css)
     skin/themes/debugger.css (themes/debugger.css)
 *   skin/themes/netmonitor.css (themes/netmonitor.css)
     skin/themes/performance.css (themes/performance.css)
     skin/themes/memory.css (themes/memory.css)
     skin/themes/promisedebugger.css (themes/promisedebugger.css)
     skin/themes/images/timeline-filter.svg (themes/images/timeline-filter.svg)
-*   skin/themes/scratchpad.css (themes/scratchpad.css)
+    skin/themes/scratchpad.css (themes/scratchpad.css)
     skin/themes/shadereditor.css (themes/shadereditor.css)
     skin/themes/storage.css (themes/storage.css)
 *   skin/themes/splitview.css (themes/splitview.css)
     skin/themes/styleeditor.css (themes/styleeditor.css)
     skin/themes/webaudioeditor.css (themes/webaudioeditor.css)
     skin/themes/images/magnifying-glass.png (themes/images/magnifying-glass.png)
     skin/themes/images/magnifying-glass@2x.png (themes/images/magnifying-glass@2x.png)
     skin/themes/images/magnifying-glass-light.png (themes/images/magnifying-glass-light.png)
--- a/devtools/client/shared/test/test-actor.js
+++ b/devtools/client/shared/test/test-actor.js
@@ -77,16 +77,31 @@ var TestActor = exports.TestActor = prot
       selector = selector.shift();
     }
     let node = document.querySelector(selector);
     if (!node) {
       throw new Error("Unable to find element with selector \"" + selector + "\"");
     }
     return node;
   },
+  /**
+   * Helper to get the number of elements matching a selector
+   * @param {string} CSS selector.
+   */
+  getNumberOfElementMatches: protocol.method(function (selector,
+                                                       root=this.content.document) {
+    return root.querySelectorAll(selector).length;
+  }, {
+    request: {
+      selector: Arg(0, "string"),
+    },
+    response: {
+      value: RetVal("number")
+    }
+  }),
 
   /**
    * Get a value for a given attribute name, on one of the elements of the box
    * model highlighter, given its ID.
    * @param {Object} msg The msg.data part expects the following properties
    * - {String} nodeID The full ID of the element to get the attribute for
    * - {String} name The name of the attribute to get
    * - {String} actorID The highlighter actor ID
--- a/devtools/client/themes/canvasdebugger.css
+++ b/devtools/client/themes/canvasdebugger.css
@@ -1,20 +1,18 @@
 /* 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/. */
 
-%filter substitution
-%define darkCheckerboardBackground #000
-%define lightCheckerboardBackground #fff
-%define checkerboardCell rgba(128,128,128,0.2)
-%define checkerboardPattern linear-gradient(45deg, @checkerboardCell@ 25%, transparent 25%, transparent 75%, @checkerboardCell@ 75%, @checkerboardCell@), linear-gradient(45deg, @checkerboardCell@ 25%, transparent 25%, transparent 75%, @checkerboardCell@ 75%, @checkerboardCell@)
-%define gutterWidth 3em
-%define gutterPaddingStart 22px
-
+:root {
+  --gutter-width: 3em;
+  --gutter-padding-start: 22px;
+  --checkerboard-pattern: linear-gradient(45deg, rgba(128,128,128,0.2) 25%, transparent 25%, transparent 75%, rgba(128,128,128,0.2) 75%, rgba(128,128,128,0.2)),
+                          linear-gradient(45deg, rgba(128,128,128,0.2) 25%, transparent 25%, transparent 75%, rgba(128,128,128,0.2) 75%, rgba(128,128,128,0.2));
+}
 /* Reload and waiting notices */
 
 .notice-container {
   margin-top: -50vh;
   background-color: var(--theme-toolbar-background);
   color: var(--theme-body-color-alt);
 }
 
@@ -30,62 +28,45 @@
 }
 
 #waiting-notice {
   font-size: 110%;
 }
 
 /* Snapshots pane */
 
-#snapshots-pane > tabs {
-  -moz-border-end: 1px solid;
-}
-
+#snapshots-pane > tabs,
 #snapshots-pane .devtools-toolbar {
-  -moz-border-end: 1px solid;
-}
-
-.theme-dark #snapshots-pane > tabs,
-.theme-dark #snapshots-pane .devtools-toolbar {
-  -moz-border-end-color: black; /* Match the splitter color. */
-}
-
-.theme-light #snapshots-pane > tabs,
-.theme-light #snapshots-pane .devtools-toolbar {
-  -moz-border-end-color: #aaa; /* Match the splitter color. */
+  -moz-border-end: 1px solid var(--theme-splitter-color);
 }
 
 #record-snapshot {
   list-style-image: url("chrome://devtools/skin/themes/images/profiler-stopwatch.svg");
 }
 
 #record-snapshot[checked] {
   list-style-image: url("chrome://devtools/skin/themes/images/profiler-stopwatch-checked.svg");
 }
 
 /* Snapshots items */
 
 .snapshot-item-thumbnail {
   image-rendering: -moz-crisp-edges;
-  background-image: @checkerboardPattern@;
+  background-image: var(--checkerboard-pattern);
   background-size: 12px 12px, 12px 12px;
   background-position: 0px 0px, 6px 6px;
   background-repeat: repeat, repeat;
 }
 
 .snapshot-item-thumbnail[flipped=true] {
   transform: scaleY(-1);
 }
 
-.theme-dark .snapshot-item-thumbnail {
-  background-color: @darkCheckerboardBackground@;
-}
-
-.theme-light .snapshot-item-thumbnail {
-  background-color: @lightCheckerboardBackground@;
+.snapshot-item-thumbnail {
+  background-color: var(--theme-body-background);
 }
 
 .snapshot-item-details {
   -moz-padding-start: 6px;
 }
 
 .snapshot-item-calls {
   padding-top: 4px;
@@ -229,19 +210,19 @@
   background-color: rgba(223,128,255,0.15);
 }
 
 .theme-light .call-item-view[interesting-call] {
   background-color: rgba(184,46,229,0.1);
 }
 
 .call-item-gutter {
-  width: calc(@gutterWidth@ + @gutterPaddingStart@);
-  -moz-padding-start: @gutterPaddingStart@;
-  -moz-padding-end: 4px;
+  width: calc(var(--gutter-width) + var(--gutter-padding-start));
+  padding-inline-start: var(--gutter-padding-start);
+  padding-inline-end: 4px;
   padding-top: 2px;
   padding-bottom: 2px;
   -moz-border-end: 1px solid;
   -moz-margin-end: 6px;
 }
 
 .selected .call-item-gutter {
   background-image: url("images/editor-debug-location.png");
@@ -295,17 +276,17 @@
   border-color: #111;
 }
 
 .theme-light .call-item-location {
   border-color: #eee;
 }
 
 .call-item-stack {
-  -moz-padding-start: calc(@gutterWidth@ + @gutterPaddingStart@);
+  -moz-padding-start: calc(var(--gutter-width) + var(--gutter-padding-start));
   padding-bottom: 10px;
 }
 
 .theme-dark .call-item-stack {
   background: rgba(0,0,0,0.9);
 }
 
 .theme-light .call-item-stack {
@@ -340,30 +321,23 @@
 #calls-list .selected .call-item-contents > label:not(.call-item-gutter) {
   /* Text inside a selected item should not be custom colored. */
   color: inherit !important;
 }
 
 /* Rendering preview */
 
 #screenshot-container {
-  background-image: @checkerboardPattern@;
+  background-color: var(--theme-body-background);
+  background-image: var(--checkerboard-pattern);
   background-size: 30px 30px, 30px 30px;
   background-position: 0px 0px, 15px 15px;
   background-repeat: repeat, repeat;
 }
 
-.theme-dark #screenshot-container {
-  background-color: @darkCheckerboardBackground@;
-}
-
-.theme-light #screenshot-container {
-  background-color: @lightCheckerboardBackground@;
-}
-
 @media (min-width: 701px) {
   #screenshot-container {
     width: 30vw;
     max-width: 50vw;
     min-width: 100px;
   }
 }
 
@@ -398,57 +372,46 @@
 
 .theme-light #screenshot-dimensions {
   background-color: rgba(255,255,255,0.8);
 }
 
 /* Snapshot filmstrip */
 
 #snapshot-filmstrip {
+  border-top: 1px solid var(--theme-splitter-color);
   overflow: hidden;
 }
 
 .theme-dark #snapshot-filmstrip {
-  border-top: 1px solid #000;
   color: var(--theme-selection-color);
 }
 
 .theme-light #snapshot-filmstrip {
-  border-top: 1px solid #aaa;
   color: var(--theme-body-color-alt);
 }
 
 .filmstrip-thumbnail {
   image-rendering: -moz-crisp-edges;
-  background-image: @checkerboardPattern@;
+  background-color: var(--theme-body-background);
+  background-image: var(--checkerboard-pattern);
   background-size: 12px 12px, 12px 12px;
   background-position: 0px -1px, 6px 5px;
   background-repeat: repeat, repeat;
   background-origin: content-box;
   cursor: pointer;
   padding-top: 1px;
   padding-bottom: 1px;
+  border-inline-end: 1px solid var(--theme-splitter-color);
   transition: opacity 0.1s ease-in-out;
 }
 
 .filmstrip-thumbnail[flipped=true] {
   transform: scaleY(-1);
 }
 
-.theme-dark .filmstrip-thumbnail {
-  background-color: @darkCheckerboardBackground@;
-}
-
-.theme-light .filmstrip-thumbnail {
-  background-color: @lightCheckerboardBackground@;
-}
-
-.filmstrip-thumbnail {
-  -moz-border-end: 1px solid var(--theme-splitter-color)
-}
-
 #snapshot-filmstrip > .filmstrip-thumbnail:hover,
 #snapshot-filmstrip:not(:hover) > .filmstrip-thumbnail[highlighted] {
   border: 1px solid var(--theme-highlight-blue);
   margin: 0 0 0 -1px;
   padding: 0;
   opacity: 0.66;
 }
--- a/devtools/client/themes/scratchpad.css
+++ b/devtools/client/themes/scratchpad.css
@@ -1,13 +1,11 @@
-%if 0
 /* 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
 
 #scratchpad-sidebar > tabs {
   height: 0;
   border: none;
 }
 
 #sp-toolbar {
   border: none;
--- a/devtools/client/themes/styleeditor.css
+++ b/devtools/client/themes/styleeditor.css
@@ -62,24 +62,17 @@
 
 .splitview-nav.empty > p {
   padding: 0 10px;
 }
 
 .stylesheet-sidebar {
   max-width: 400px;
   min-width: 100px;
-}
-
-.theme-light .stylesheet-sidebar {
-  border-color: #aaa; /* Splitters */
-}
-
-.theme-dark .stylesheet-sidebar {
-  border-color: #000;  /* Splitters */
+  border-color: var(--theme-splitter-color);
 }
 
 .theme-light .media-rule-label {
   border-bottom-color: #cddae5; /* Grey */
 }
 
 .theme-dark .media-rule-label {
   border-bottom-color: #303b47; /* Grey */
--- a/devtools/client/themes/toolbars.inc.css
+++ b/devtools/client/themes/toolbars.inc.css
@@ -558,57 +558,31 @@
 }
 
 .devtools-sidebar-tabs tabs > tab[selected],
 .devtools-sidebar-tabs tabs > tab[selected] + tab {
   border-image: linear-gradient(var(--theme-splitter-color), var(--theme-splitter-color)) 1 1;
 }
 
 .devtools-sidebar-tabs tabs > tab:first-child {
-  -moz-border-start-width: 0;
-}
-
-.theme-dark .devtools-sidebar-tabs tabs > tab:hover {
-  background: hsla(206,37%,4%,.2);
+  border-inline-start-width: 0;
 }
 
-.theme-dark .devtools-sidebar-tabs tabs > tab:hover:active {
-  background: hsla(206,37%,4%,.4);
-}
-
-.theme-dark .devtools-sidebar-tabs tabs > tab[selected] + tab:hover {
-  background: hsla(206,37%,4%,.2);
-}
-
-.theme-dark .devtools-sidebar-tabs tabs > tab[selected] + tab:hover:active {
-  background: hsla(206,37%,4%,.4);
+.devtools-sidebar-tabs tabs > tab:hover {
+  background: rgba(0, 0, 0, 0.12);
 }
 
-.theme-dark .devtools-sidebar-tabs tabs > tab[selected],
-.theme-dark .devtools-sidebar-tabs tabs > tab[selected]:hover:active {
-  color: var(--theme-selection-color);
-  background: #1d4f73;
-}
-
-.theme-light .devtools-sidebar-tabs tabs > tab:hover {
-  background: #ddd;
+.devtools-sidebar-tabs tabs > tab:hover:active {
+  background: rgba(0, 0, 0, 0.2);
 }
 
-.theme-light .devtools-sidebar-tabs tabs > tab:hover:active {
-  background: #ddd;
-}
-
-.theme-light .devtools-sidebar-tabs tabs > tab[selected] + tab:hover {
-  background: #ddd;
-}
-
-.theme-light .devtools-sidebar-tabs tabs > tab[selected],
-.theme-light .devtools-sidebar-tabs tabs > tab[selected]:hover:active {
+.devtools-sidebar-tabs tabs > tab[selected],
+.devtools-sidebar-tabs tabs > tab[selected]:hover:active {
   color: var(--theme-selection-color);
-  background: #4c9ed9;
+  background: var(--theme-selection-background);
 }
 
 /* Toolbox - moved from toolbox.css.
  * Rules that apply to the global toolbox like command buttons,
  * devtools tabs, docking buttons, etc. */
 
 #toolbox-controls > toolbarbutton,
 #toolbox-dock-buttons > toolbarbutton {
--- a/devtools/client/themes/webaudioeditor.css
+++ b/devtools/client/themes/webaudioeditor.css
@@ -25,49 +25,43 @@ svg {
 
 /* Edges in graph */
 .edgePath path {
   stroke-width: 1px;
   fill: none;
 }
 
 .theme-dark .edgePath path {
-  stroke: #b6babf; /* Grey foreground text */
+  stroke: var(--theme-body-color-alt);
 }
 .theme-light .edgePath path {
-  stroke: #aaaaaa; /* Splitters */
+  stroke: var(--theme-splitter-color);
 }
 
 /* AudioParam connection edges */
 g.edgePath.param-connection {
   stroke-dasharray: 5,5;
 }
 
 .theme-dark .edgePath.param-connection path {
-  stroke: #b6babf; /* Grey foreground text */
+  stroke: var(--theme-body-color-alt);
 }
 .theme-light .edgePath.param-connection path {
-  stroke: #aaaaaa; /* Splitters */
+  stroke: var(--theme-splitter-color);
 }
 
 /* Labels in AudioParam connection should have background that match
  * the main background so there's whitespace around the label, on top of the
  * dotted lines. */
-.theme-dark g.edgeLabel rect {
-  fill: #14171a;
-}
-.theme-light g.edgeLabel rect {
-  fill: #fcfcfc; /* Background - Editor */
+g.edgeLabel rect {
+  fill: var(--theme-body-background);
 }
-.theme-dark g.edgeLabel tspan {
+g.edgeLabel tspan {
   fill: var(--theme-body-color-alt);
 }
-.theme-light g.edgeLabel tspan {
-  fill: #585959; /* Grey foreground text */
-}
 
 /* Audio Nodes */
 .nodes rect {
   stroke-width: 1px;
   cursor: pointer;
 }
 
 .nodes rect {
@@ -214,21 +208,18 @@ text {
   list-style-image: url(images/power.svg);
 }
 
 #audio-node-toolbar toolbarbutton[disabled] {
   opacity: 0.5;
   background-color: transparent;
 }
 
-.theme-dark #audio-node-toolbar toolbarbutton[checked] {
-  background-color: #1d4f73; /* Select Highlight Blue */
-}
-.theme-light #audio-node-toolbar toolbarbutton[checked] {
-  background-color: #4c9ed9; /* Select Highlight Blue */
+#audio-node-toolbar toolbarbutton[checked] {
+  background-color: var(--theme-selection-background);
 }
 
 /* don't invert checked buttons so we can have white icons on light theme */
 #audio-node-toolbar toolbarbutton[checked] > .toolbarbutton-icon {
   filter: none;
 }
 
 
--- a/devtools/client/themes/webconsole.css
+++ b/devtools/client/themes/webconsole.css
@@ -21,17 +21,17 @@ a {
   padding: 0 7px;
   width: 100%;
   box-sizing: border-box;
 }
 
 .message > .prefix,
 .message > .timestamp {
   flex: none;
-  color: GrayText;
+  color: var(--theme-comment);
   margin: 3px 6px 0 0;
 }
 
 .message > .indent {
   flex: none;
 }
 
 .message > .icon {
@@ -126,21 +126,16 @@ a {
   flex: 1 1 auto;
   vertical-align: middle;
 }
 
 .message-flex-body > .message-location {
   margin-top: 0;
 }
 
-.jsterm-input-container {
-  border-top-width: 1px;
-  border-top-style: solid;
-}
-
 #output-wrapper {
   direction: ltr;
   overflow: auto;
 }
 
 #output-container {
   -moz-user-select: text;
   -moz-box-flex: 1;
@@ -248,21 +243,21 @@ a {
 }
 
 .message[category=network] .status {
   flex: none;
   -moz-margin-start: 6px;
 }
 
 .message[category=network].mixed-content .url {
-  color: #FF0000;
+  color: var(--theme-highlight-red);
 }
 
 .message .learn-more-link {
-  color: -moz-nativehyperlinktext;
+  color: var(--theme-highlight-blue);
   margin: 0 6px;
 }
 
 .message[category=network] .xhr {
   background-color: var(--theme-body-color-alt);
   color: var(--theme-body-background);
   border-radius: 3px;
   font-weight: bold;
@@ -355,28 +350,45 @@ a {
   background-position: -48px -36px;
 }
 
 .message[category=output] > .icon::before {
   background-position: -60px -36px;
 }
 
 /* JSTerm Styles */
+.jsterm-input-container {
+  background-color: var(--theme-tab-toolbar-background);
+  border-top: 1px solid var(--theme-splitter-color);
+}
+
+.theme-light .jsterm-input-container {
+  /* For light theme use a white background for the input - it looks better
+     than off-white */
+  background-color: #fff;
+  border-top-color: #e0e0e0;
+}
+
 .jsterm-input-node,
 .jsterm-complete-node {
   border: none;
   padding: 0 0 0 16px;
   -moz-appearance: none;
   background-color: transparent;
 }
 
+.jsterm-complete-node {
+  color: var(--theme-comment);
+}
+
 .jsterm-input-node {
   background-image: -moz-image-rect(url("chrome://devtools/skin/themes/images/commandline-icon.png"), 0, 32, 16, 16);
   background-repeat: no-repeat;
   background-size: 16px 16px;
+  color: var(--theme-content-color1);
 }
 
 @media (min-resolution: 1.1dppx) {
   .jsterm-input-node {
     background-image: -moz-image-rect(url('chrome://devtools/skin/themes/images/commandline-icon@2x.png'), 0, 64, 32, 32);
   }
 }
 
@@ -393,17 +405,17 @@ a {
   min-height: 200px;
 }
 .inlined-variables-view iframe {
   display: block;
   flex: 1;
   margin-top: 5px;
   margin-bottom: 15px;
   -moz-margin-end: 15px;
-  border: 1px solid rgba(128, 128, 128, .5);
+  border: 1px solid var(--theme-splitter-color);
   border-radius: 3px;
 }
 
 #webconsole-sidebar > tabs {
   height: 0;
   border: none;
 }
 
@@ -437,26 +449,31 @@ a {
   margin-top: 6px;
   margin-bottom: 6px;
   font-size: 0.9em;
 }
 
 .navigation-marker .url {
   -moz-padding-end: 9px;
   text-decoration: none;
+  background: var(--theme-body-background);
+}
+
+.theme-light .navigation-marker .url {
+  background: #fff;
 }
 
 .stacktrace {
   display: none;
   list-style: none;
   padding: 0 1em 0 1.5em;
   margin: 5px 0 0 0;
   max-height: 10em;
   overflow-y: auto;
-  border: 1px solid rgb(200,200,200);
+  border: 1px solid var(--theme-splitter-color);
   border-radius: 3px;
 }
 
 .consoletable {
   margin: 5px 0 0 0;
 }
 
 .theme-light .message[severity=error] .stacktrace {
@@ -509,59 +526,16 @@ a {
 .open-inspector:hover {
   background-position: -32px 0;
 }
 
 .open-inspector:active {
   background-position: -16px 0;
 }
 
-.jsterm-input-container {
-  background-color: var(--theme-tab-toolbar-background);
-  border-color: var(--theme-body-background);
-}
-
-.jsterm-input-node {
-  color: var(--theme-content-color1);
-}
-
-.jsterm-complete-node {
-  color: var(--theme-comment);
-}
-
-.navigation-marker .url {
-  background: var(--theme-body-background);
-}
-
-.theme-dark .inlined-variables-view iframe {
-  border-color: #333;
-}
-
-.theme-dark .stacktrace {
-  border-color: #333;
-}
-
-.theme-light .jsterm-input-container {
-  /* For light theme use a white background for the input - it looks better
-     than off-white */
-  background-color: #fff;
-  border-color: ThreeDShadow;
-}
-.theme-light .navigation-marker .url {
-  background: #fff;
-}
-
-.theme-light .inlined-variables-view iframe {
-  border-color: #ccc;
-}
-
-.theme-light .stacktrace {
-  border-color: #ccc;
-}
-
 @media (max-width: 500px) {
   .message > .timestamp {
     display: none;
   }
   .hud-console-filter-toolbar .webconsole-filter-button .toolbarbutton-text {
     display: none;
   }
   .hud-console-filter-toolbar .webconsole-filter-button {
--- a/devtools/server/actors/inspector.js
+++ b/devtools/server/actors/inspector.js
@@ -2588,16 +2588,31 @@ var WalkerActor = protocol.ActorClass({
       node: Arg(0, "domnode"),
       position: Arg(1, "string"),
       value: Arg(2, "string")
     },
     response: RetVal("disconnectedNodeArray")
   }),
 
   /**
+   * Duplicate a specified node
+   *
+   * @param {NodeActor} node The node to duplicate.
+   */
+  duplicateNode: method(function({rawNode}) {
+    let clonedNode = rawNode.cloneNode(true);
+    rawNode.parentNode.insertBefore(clonedNode, rawNode.nextSibling);
+  }, {
+    request: {
+      node: Arg(0, "domnode")
+    },
+    response: {}
+  }),
+
+  /**
    * Test whether a node is a document or a document element.
    *
    * @param {NodeActor} node The node to remove.
    * @return {boolean} True if the node is a document or a document element.
    */
   isDocumentOrDocumentElementNode: function(node) {
       return ((node.rawNode.ownerDocument &&
         node.rawNode.ownerDocument.documentElement === this.rawNode) ||
--- a/devtools/server/tests/mochitest/chrome.ini
+++ b/devtools/server/tests/mochitest/chrome.ini
@@ -52,16 +52,17 @@ skip-if = buildapp == 'mulet'
 [test_framerate_06.html]
 skip-if = buildapp == 'mulet'
 [test_getProcess.html]
 skip-if = buildapp == 'mulet'
 [test_inspector-anonymous.html]
 [test_inspector-changeattrs.html]
 [test_inspector-changevalue.html]
 [test_inspector-dead-nodes.html]
+[test_inspector-duplicate-node.html]
 [test_inspector_getImageData.html]
 skip-if = buildapp == 'mulet'
 [test_inspector_getImageDataFromURL.html]
 skip-if = buildapp == 'mulet'
 [test_inspector_getImageData-wait-for-load.html]
 skip-if = buildapp == 'mulet'
 [test_inspector_getNodeFromActor.html]
 [test_inspector-hide.html]
--- a/devtools/server/tests/mochitest/inspector-traversal-data.html
+++ b/devtools/server/tests/mochitest/inspector-traversal-data.html
@@ -75,17 +75,16 @@
   <div id="longlist-sibling">
     <div id="longlist-sibling-firstchild"></div>
   </div>
   <p id="edit-html"></p>
 
   <select multiple><option>one</option><option>two</option></select>
   <div id="pseudo"><span>middle</span></div>
   <div id="pseudo-empty"></div>
-
   <div id="shadow">light dom</div>
-
   <object>
       <div id="1"></div>
   </object>
+  <div class="node-to-duplicate"></div>
   <div id="scroll-into-view" style="margin-top: 1000px;">scroll</div>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/mochitest/test_inspector-duplicate-node.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1208864
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1208864</title>
+
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
+  <script type="application/javascript;version=1.8" src="inspector-helpers.js"></script>
+  <script type="application/javascript;version=1.8">
+const inspector = require("devtools/server/actors/inspector");
+
+window.onload = function() {
+  SimpleTest.waitForExplicitFinish();
+  runNextTest();
+}
+
+var gInspectee = null;
+var gClient = null;
+var gWalker = null;
+
+function assertOwnership() {
+  assertOwnershipTrees(gWalker);
+}
+
+addTest(function setup() {
+  let url = document.getElementById("inspectorContent").href;
+  attachURL(url, function(err, client, tab, doc) {
+    gInspectee = doc;
+    let {InspectorFront} = require("devtools/server/actors/inspector");
+    let inspector = InspectorFront(client, tab);
+    promiseDone(inspector.getWalker().then(walker => {
+      ok(walker, "getWalker() should return an actor.");
+      gClient = client;
+      gWalker = walker;
+    }).then(runNextTest));
+  });
+});
+
+addTest(Task.async(function* testDuplicateNode() {
+  let className = ".node-to-duplicate";
+  let matches = yield gWalker.querySelectorAll(gWalker.rootNode, className);
+  is(matches.length, 1, "There should initially be one node to duplicate.");
+
+  let nodeFront = yield gWalker.querySelector(gWalker.rootNode, className);
+  yield gWalker.duplicateNode(nodeFront);
+
+  matches = yield gWalker.querySelectorAll(gWalker.rootNode, className);
+  is(matches.length, 2, "The node should now be duplicated.");
+
+  runNextTest();
+}));
+
+addTest(function cleanup() {
+  delete gWalker;
+  delete gInspectee;
+  delete gClient;
+  runNextTest();
+});
+  </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1208864">Mozilla Bug 1208864</a>
+<a id="inspectorContent" target="_blank" href="inspector-traversal-data.html">Test Document</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
--- a/devtools/shared/DevToolsUtils.js
+++ b/devtools/shared/DevToolsUtils.js
@@ -453,16 +453,35 @@ exports.dbg_assert = function dbg_assert
     }
   }
 
   if (!cond) {
     return e;
   }
 };
 
+exports.defineLazyGetter(this, "AppConstants", () => {
+  const scope = {};
+  Cu.import("resource://gre/modules/AppConstants.jsm", scope);
+  return scope.AppConstants;
+});
+
+/**
+ * No operation. The empty function.
+ */
+exports.noop = function () { };
+
+function reallyAssert(condition, message) {
+  if (!condition) {
+    const err = new Error("Assertion failure: " + message);
+    exports.reportException("DevToolsUtils.assert", err);
+    throw err;
+  }
+}
+
 /**
  * DevToolsUtils.assert(condition, message)
  *
  * @param Boolean condition
  * @param String message
  *
  * Assertions are enabled when any of the following are true:
  *   - This is a DEBUG_JS_MODULES build
@@ -472,33 +491,21 @@ exports.dbg_assert = function dbg_assert
  * If assertions are enabled, then `condition` is checked and if false-y, the
  * assertion failure is logged and then an error is thrown.
  *
  * If assertions are not enabled, then this function is a no-op.
  *
  * This is an improvement over `dbg_assert`, which doesn't actually cause any
  * fatal behavior, and is therefore much easier to accidentally ignore.
  */
-exports.defineLazyGetter(exports, "assert", () => {
-  function noop(condition, msg) { }
-
-  function assert(condition, message) {
-    if (!condition) {
-      const err = new Error("Assertion failure: " + message);
-      exports.reportException("DevToolsUtils.assert", err);
-      throw err;
-    }
-  }
-
-  const scope = {};
-  Cu.import("resource://gre/modules/AppConstants.jsm", scope);
-  const { DEBUG, DEBUG_JS_MODULES } = scope.AppConstants;
-
-  return (DEBUG || DEBUG_JS_MODULES || exports.testing) ? assert : noop;
-});
+Object.defineProperty(exports, "assert", {
+  get: () => (AppConstants.DEBUG || AppConstants.DEBUG_JS_MODULES || this.testing)
+    ? reallyAssert
+    : exports.noop,
+})
 
 /**
  * Defines a getter on a specified object for a module.  The module will not
  * be imported until first use.
  *
  * @param aObject
  *        The object to define the lazy getter on.
  * @param aName
--- a/devtools/shared/heapsnapshot/HeapSnapshot.h
+++ b/devtools/shared/heapsnapshot/HeapSnapshot.h
@@ -5,16 +5,17 @@
 
 #ifndef mozilla_devtools_HeapSnapshot__
 #define mozilla_devtools_HeapSnapshot__
 
 #include "js/HashTable.h"
 #include "mozilla/ErrorResult.h"
 #include "mozilla/devtools/DeserializedNode.h"
 #include "mozilla/dom/BindingDeclarations.h"
+#include "mozilla/dom/Nullable.h"
 #include "mozilla/HashFunctions.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/RefCounted.h"
 #include "mozilla/RefPtr.h"
 #include "mozilla/TimeStamp.h"
 #include "mozilla/UniquePtr.h"
 
 #include "CoreDump.pb.h"
@@ -134,16 +135,25 @@ public:
     auto p = nodes.lookup(rootId);
     MOZ_ASSERT(p);
     const DeserializedNode& node = *p;
     return JS::ubi::Node(const_cast<DeserializedNode*>(&node));
   }
 
   void TakeCensus(JSContext* cx, JS::HandleObject options,
                   JS::MutableHandleValue rval, ErrorResult& rv);
+
+  dom::Nullable<uint64_t> GetCreationTime() {
+    static const uint64_t maxTime = uint64_t(1) << 53;
+    if (timestamp.isSome() && timestamp.ref() <= maxTime) {
+      return dom::Nullable<uint64_t>(timestamp.ref());
+    }
+
+    return dom::Nullable<uint64_t>();
+  }
 };
 
 // A `CoreDumpWriter` is given the data we wish to save in a core dump and
 // serializes it to disk, or memory, or a socket, etc.
 class CoreDumpWriter
 {
 public:
   virtual ~CoreDumpWriter() { };
new file mode 100644
--- /dev/null
+++ b/devtools/shared/heapsnapshot/tests/unit/test_HeapSnapshot_creationTime_01.js
@@ -0,0 +1,29 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// HeapSnapshot.prototype.creationTime returns the expected time.
+
+function waitForTenMilliseconds() {
+  const start = Date.now();
+  while (Date.now() - start < 10) ;
+}
+
+function run_test() {
+  const start = Date.now() * 1000;
+  do_print("start                 = " + start);
+
+  // Because Date.now() is less precise than the snapshot's time stamp, give it
+  // a little bit of head room.
+  waitForTenMilliseconds();
+  const path = ChromeUtils.saveHeapSnapshot({ runtime: true });
+  waitForTenMilliseconds();
+
+  const end = Date.now() * 1000;
+  do_print("end                   = " + end);
+
+  const snapshot = ChromeUtils.readHeapSnapshot(path);
+  do_print("snapshot.creationTime = " + snapshot.creationTime);
+
+  ok(snapshot.creationTime >= start);
+  ok(snapshot.creationTime <= end);
+}
--- a/devtools/shared/heapsnapshot/tests/unit/xpcshell.ini
+++ b/devtools/shared/heapsnapshot/tests/unit/xpcshell.ini
@@ -20,16 +20,17 @@ support-files =
 [test_census-tree-node-03.js]
 [test_HeapAnalyses_readHeapSnapshot_01.js]
 [test_HeapAnalyses_takeCensusDiff_01.js]
 [test_HeapAnalyses_takeCensus_01.js]
 [test_HeapAnalyses_takeCensus_02.js]
 [test_HeapAnalyses_takeCensus_03.js]
 [test_HeapAnalyses_takeCensus_04.js]
 [test_HeapAnalyses_takeCensus_05.js]
+[test_HeapSnapshot_creationTime_01.js]
 [test_HeapSnapshot_takeCensus_01.js]
 [test_HeapSnapshot_takeCensus_02.js]
 [test_HeapSnapshot_takeCensus_03.js]
 [test_HeapSnapshot_takeCensus_04.js]
 [test_HeapSnapshot_takeCensus_05.js]
 [test_HeapSnapshot_takeCensus_06.js]
 [test_HeapSnapshot_takeCensus_07.js]
 [test_HeapSnapshot_takeCensus_08.js]
--- a/devtools/shared/tests/unit/head_devtools.js
+++ b/devtools/shared/tests/unit/head_devtools.js
@@ -4,16 +4,21 @@ var Ci = Components.interfaces;
 var Cu = Components.utils;
 var Cr = Components.results;
 
 var {require} = Cu.import("resource://gre/modules/devtools/shared/Loader.jsm");
 const DevToolsUtils = require("devtools/shared/DevToolsUtils");
 
 // Register a console listener, so console messages don't just disappear
 // into the ether.
+
+// If for whatever reason the test needs to post console errors that aren't
+// failures, set this to true.
+var ALLOW_CONSOLE_ERRORS = false;
+
 var errorCount = 0;
 var listener = {
   observe: function (aMessage) {
     errorCount++;
     try {
       // If we've been given an nsIScriptError, then we can print out
       // something nicely formatted, for tools like Emacs to pick up.
       var scriptError = aMessage.QueryInterface(Ci.nsIScriptError);
@@ -30,14 +35,17 @@ var listener = {
         var string = "<error converting error message to string>";
       }
     }
 
     // Make sure we exit all nested event loops so that the test can finish.
     while (DebuggerServer.xpcInspector.eventLoopNestLevel > 0) {
       DebuggerServer.xpcInspector.exitNestedEventLoop();
     }
-    do_throw("head_dbg.js got console message: " + string + "\n");
+
+    if (!ALLOW_CONSOLE_ERRORS) {
+      do_throw("head_devtools.js got console message: " + string + "\n");
+    }
   }
 };
 
 var consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
 consoleService.registerListener(listener);
new file mode 100644
--- /dev/null
+++ b/devtools/shared/tests/unit/test_assert.js
@@ -0,0 +1,36 @@
+/* -*- js-indent-level: 2; indent-tabs-mode: nil -*- */
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test DevToolsUtils.assert
+
+ALLOW_CONSOLE_ERRORS = true;
+
+function run_test() {
+  // Enable assertions.
+  DevToolsUtils.testing = true;
+
+  const { assert } = DevToolsUtils;
+  equal(typeof assert, "function");
+
+  try {
+    assert(true, "this assertion should not fail");
+  } catch (e) {
+    // If you catch assertion failures in practice, I will hunt you down. I get
+    // email notifications every time it happens.
+    ok(false, "Should not get an error for an assertion that should not fail. Got "
+       + DevToolsUtils.safeErrorString(e));
+  }
+
+  let assertionFailed = false;
+  try {
+    assert(false, "this assertion should fail");
+  } catch (e) {
+    ok(e.message.startsWith("Assertion failure:"),
+       "Should be an assertion failure error");
+    assertionFailed = true;
+  }
+
+  ok(assertionFailed,
+     "The assertion should have failed, which should throw an error when assertions are enabled.");
+}
--- a/devtools/shared/tests/unit/xpcshell.ini
+++ b/devtools/shared/tests/unit/xpcshell.ini
@@ -1,16 +1,17 @@
 [DEFAULT]
 tags = devtools
 head = head_devtools.js
 tail =
 skip-if = toolkit == 'android' || toolkit == 'gonk'
 support-files =
   exposeLoader.js
 
+[test_assert.js]
 [test_fetch-chrome.js]
 [test_fetch-file.js]
 [test_fetch-http.js]
 [test_fetch-resource.js]
 [test_indentation.js]
 [test_independent_loaders.js]
 [test_invisible_loader.js]
 [test_safeErrorString.js]
--- a/dom/bluetooth/bluedroid/hfp-fallback/BluetoothHfpManager.cpp
+++ b/dom/bluetooth/bluedroid/hfp-fallback/BluetoothHfpManager.cpp
@@ -86,17 +86,17 @@ void
 BluetoothHfpManager::OnGetServiceChannel(const nsAString& aDeviceAddress,
                                          const nsAString& aServiceUuid,
                                          int aChannel)
 {
   MOZ_ASSERT(false);
 }
 
 void
-BluetoothHfpManager::OnUpdateSdpRecords(const nsAString& aDeviceAddress)
+BluetoothHfpManager::OnUpdateSdpRecords(const BluetoothAddress& aDeviceAddress)
 {
   MOZ_ASSERT(false);
 }
 
 /**
  * BluetoothHfpManagerBase function
  */
 bool
--- a/dom/bluetooth/common/BluetoothRilListener.cpp
+++ b/dom/bluetooth/common/BluetoothRilListener.cpp
@@ -236,22 +236,16 @@ TelephonyListener::CallStateChanged(uint
 
 NS_IMETHODIMP
 TelephonyListener::EnumerateCallState(nsITelephonyCallInfo* aInfo)
 {
   return HandleCallInfo(aInfo, false);
 }
 
 NS_IMETHODIMP
-TelephonyListener::ConferenceCallStateChanged(uint16_t aCallState)
-{
-  return NS_OK;
-}
-
-NS_IMETHODIMP
 TelephonyListener::EnumerateCallStateComplete()
 {
   return NS_OK;
 }
 
 NS_IMETHODIMP
 TelephonyListener::SupplementaryServiceNotification(uint32_t aServiceId,
                                                     int32_t aCallIndex,
--- a/dom/settings/SettingsDB.jsm
+++ b/dom/settings/SettingsDB.jsm
@@ -35,17 +35,17 @@ const TYPED_ARRAY_THINGS = new Set([
   "Uint16Array",
   "Int32Array",
   "Uint32Array",
   "Float32Array",
   "Float64Array",
 ]);
 
 this.SETTINGSDB_NAME = "settings";
-this.SETTINGSDB_VERSION = 5;
+this.SETTINGSDB_VERSION = 6;
 this.SETTINGSSTORE_NAME = "settings";
 
 Cu.import("resource://gre/modules/IndexedDBHelper.jsm");
 Cu.import("resource://gre/modules/FileUtils.jsm");
 Cu.import("resource://gre/modules/NetUtil.jsm");
 
 this.SettingsDB = function SettingsDB() {}
 
--- a/dom/telephony/Telephony.cpp
+++ b/dom/telephony/Telephony.cpp
@@ -339,17 +339,17 @@ Telephony::HandleCallInfo(nsITelephonyCa
                       isConference, isSwitchable, isMergeable);
     // The newly created call is an incoming call.
     if (call &&
         state == TelephonyCallState::Incoming) {
       nsresult rv = DispatchCallEvent(NS_LITERAL_STRING("incoming"), call);
       NS_ENSURE_SUCCESS(rv, rv);
     }
     return NS_OK;
-  } 
+  }
 
   // Update an existing call
   call->UpdateEmergency(isEmergency);
   call->UpdateSwitchable(isSwitchable);
   call->UpdateMergeable(isMergeable);
 
   nsAutoString number;
   aInfo->GetNumber(number);
@@ -718,49 +718,42 @@ Telephony::WindowAudioCaptureChanged()
   return NS_OK;
 }
 
 // nsITelephonyListener
 
 NS_IMETHODIMP
 Telephony::CallStateChanged(uint32_t aLength, nsITelephonyCallInfo** aAllInfo)
 {
+  // Update call state
   nsresult rv;
   for (uint32_t i = 0; i < aLength; ++i) {
     rv = HandleCallInfo(aAllInfo[i]);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
   }
 
+  // Update conference state
+  mGroup->ChangeState();
+
   rv = HandleAudioAgentState();
   if (NS_WARN_IF(NS_FAILED(rv))) {
     return rv;
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
 Telephony::EnumerateCallState(nsITelephonyCallInfo* aInfo)
 {
   return HandleCallInfo(aInfo);
 }
 
 NS_IMETHODIMP
-Telephony::ConferenceCallStateChanged(uint16_t aCallState)
-{
-  // The current design of Telephony Stack gaurantees that the calls within a
-  // call group are updated before this method being called, so we can let a
-  // call update its state by its own, and we can discard |aCallState| here.
-  // Anyway, this method is going to be deprecated in Bug 1155072.
-  mGroup->ChangeState();
-  return NS_OK;
-}
-
-NS_IMETHODIMP
 Telephony::EnumerateCallStateComplete()
 {
   // Set conference state.
   mGroup->ChangeState();
 
   HandleAudioAgentState();
   if (mReadyPromise) {
     mReadyPromise->MaybeResolve(JS::UndefinedHandleValue);
--- a/dom/telephony/gonk/TelephonyService.js
+++ b/dom/telephony/gonk/TelephonyService.js
@@ -364,17 +364,16 @@ MobileConnectionListener.prototype = {
 
 function TelephonyService() {
   this._numClients = gRadioInterfaceLayer.numRadioInterfaces;
   this._listeners = [];
 
   this._isDialing = false;
   this._cachedDialRequest = null;
   this._currentCalls = {};
-  this._currentConferenceState = nsITelephonyService.CALL_STATE_UNKNOWN;
   this._audioStates = [];
   this._ussdSessions = [];
 
   this._cdmaCallWaitingNumber = null;
 
   this._updateDebugFlag();
   this.defaultServiceId = this._getDefaultServiceId();
 
@@ -2035,17 +2034,16 @@ TelephonyService.prototype = {
       let calls = [];
       for (let index in this._currentCalls[aClientId]) {
         let call = this._currentCalls[aClientId][index];
         call.state = nsITelephonyService.CALL_STATE_CONNECTED;
         call.isConference = true;
         calls.push(call);
       }
       this._handleCallStateChanged(aClientId, calls);
-      this._handleConferenceCallStateChanged(nsITelephonyService.CALL_STATE_CONNECTED);
 
       aCallback.notifySuccess();
     });
   },
 
   conferenceCall: function(aClientId, aCallback) {
     if (Object.keys(this._currentCalls[aClientId]).length < 2) {
       aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
@@ -2079,17 +2077,16 @@ TelephonyService.prototype = {
     let parentCall = this._currentCalls[aClientId][CDMA_FIRST_CALL_INDEX];
 
     this._disconnectCalls(aClientId, [childCall]);
 
     parentCall.isConference = false;
     parentCall.isSwitchable = true;
     parentCall.isMergeable = true;
     this._handleCallStateChanged(aClientId, [childCall, parentCall]);
-    this._handleConferenceCallStateChanged(nsITelephonyService.CALL_STATE_UNKNOWN);
   },
 
   // See 3gpp2, S.R0006-522-A v1.0. Table 4, XID 6S.
   // Release the third party. Optionally apply a warning tone. Connect the
   // controlling subscriber and the second party. Go to the 2-way state.
   _separateCallCdma: function(aClientId, aCallIndex, aCallback) {
     this._sendToRilWorker(aClientId, "cdmaFlash", null, response => {
       if (response.errorMsg) {
@@ -2123,21 +2120,34 @@ TelephonyService.prototype = {
     // In cdma, ril only maintains one call index.
     if (this._isCdmaClient(aClientId)) {
       this._sendToRilWorker(aClientId, "hangUpCall",
                             { callIndex: CDMA_FIRST_CALL_INDEX },
                             this._defaultCallbackHandler.bind(this, aCallback));
       return;
     }
 
-    let foreground = this._currentConferenceState == nsITelephonyService.CALL_STATE_CONNECTED;
-    this._sendToRilWorker(aClientId,
-                          foreground ? "hangUpForeground" : "hangUpBackground",
-                          null,
-                          this._defaultCallbackHandler.bind(this, aCallback));
+    // Find a conference call, and send the corresponding request to RIL worker.
+    for (let index in this._currentCalls[aClientId]) {
+      let call = this._currentCalls[aClientId][index];
+      if (!call.isConference) {
+        continue;
+      }
+
+      let command = call.state === nsITelephonyService.CALL_STATE_CONNECTED ?
+                    "hangUpForeground" : "hangUpBackground";
+      this._sendToRilWorker(aClientId, command, null,
+                            this._defaultCallbackHandler.bind(this, aCallback));
+      return;
+    }
+
+    // There is no conference call.
+    if (DEBUG) debug("hangUpConference: " +
+                     "No conference call in modem[" + aClientId + "].");
+    aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
   },
 
   _switchConference: function(aClientId, aCallback) {
     // Cannot hold/resume a conference in cdma.
     if (this._isCdmaClient(aClientId)) {
       aCallback.notifyError(RIL.GECKO_ERROR_GENERIC_FAILURE);
       return;
     }
@@ -2349,22 +2359,16 @@ TelephonyService.prototype = {
     disconnectedCalls.forEach(call => changedCalls.add(call));
 
     // Detect conference and update isConference flag.
     let [newConferenceState, conferenceChangedCalls] = this._updateConference(aClientId);
     conferenceChangedCalls.forEach(call => changedCalls.add(call));
 
     this._handleCallStateChanged(aClientId, [...changedCalls]);
 
-    // Should handle conferenceCallStateChange after callStateChanged and
-    // callDisconnected.
-    if (newConferenceState != this._currentConferenceState) {
-      this._handleConferenceCallStateChanged(newConferenceState);
-    }
-
     this._updateAudioState(aClientId);
 
     // Handle cached dial request.
     if (this._cachedDialRequest && !this._isActive(aClientId)) {
       if (DEBUG) debug("All calls held. Perform the cached dial request.");
 
       let request = this._cachedDialRequest;
       this._sendDialCallRequest(request.clientId, request.options,
@@ -2434,22 +2438,16 @@ TelephonyService.prototype = {
         }
       }
     }
 
     this._notifyAllListeners("supplementaryServiceNotification",
                              [aClientId, callIndex, notification]);
   },
 
-  _handleConferenceCallStateChanged: function(aState) {
-    if (DEBUG) debug("handleConferenceCallStateChanged: " + aState);
-    this._currentConferenceState = aState;
-    this._notifyAllListeners("conferenceCallStateChanged", [aState]);
-  },
-
   notifyUssdReceived: function(aClientId, aMessage, aSessionEnded) {
     if (DEBUG) {
       debug("notifyUssdReceived for " + aClientId + ": " +
             aMessage + " (sessionEnded : " + aSessionEnded + ")");
     }
 
     let oldSession = this._ussdSessions[aClientId];
     this._ussdSessions[aClientId] =
--- a/dom/telephony/gonk/TelephonyUtils.jsm
+++ b/dom/telephony/gonk/TelephonyUtils.jsm
@@ -92,17 +92,16 @@ this.TelephonyUtils = {
         enumerateCallStateComplete: function() {},
         enumerateCallState: function() {},
         callStateChanged: function() {
           if (!self.hasAnyCalls(aClientId)) {
             TelephonyService.unregisterListener(this);
             resolve();
           }
         },
-        conferenceCallStateChanged: function() {},
         supplementaryServiceNotification: function() {},
         notifyError: function() {},
         notifyCdmaCallWaiting: function() {},
         notifyConferenceError: function() {}
       };
 
       TelephonyService.registerListener(listener);
     });
--- a/dom/telephony/ipc/PTelephony.ipdl
+++ b/dom/telephony/ipc/PTelephony.ipdl
@@ -124,18 +124,16 @@ sync protocol PTelephony {
   manager PContent;
   manages PTelephonyRequest;
 
 child:
   NotifyCallStateChanged(nsTelephonyCallInfo[] aAllInfo);
 
   NotifyCdmaCallWaiting(uint32_t aClientId, IPCCdmaWaitingCallData aData);
 
-  NotifyConferenceCallStateChanged(uint16_t aCallState);
-
   NotifyConferenceError(nsString aName, nsString aMessage);
 
   NotifySupplementaryService(uint32_t aClientId, int32_t aCallIndex,
                              uint16_t aNotification);
 
 parent:
   /**
    * Sent when the child no longer needs to use PTelephony.
--- a/dom/telephony/ipc/TelephonyChild.cpp
+++ b/dom/telephony/ipc/TelephonyChild.cpp
@@ -76,25 +76,16 @@ TelephonyChild::RecvNotifyCdmaCallWaitin
                                   aData.number(),
                                   aData.numberPresentation(),
                                   aData.name(),
                                   aData.namePresentation());
   return true;
 }
 
 bool
-TelephonyChild::RecvNotifyConferenceCallStateChanged(const uint16_t& aCallState)
-{
-  MOZ_ASSERT(mService);
-
-  mService->ConferenceCallStateChanged(aCallState);
-  return true;
-}
-
-bool
 TelephonyChild::RecvNotifyConferenceError(const nsString& aName,
                                           const nsString& aMessage)
 {
   MOZ_ASSERT(mService);
 
   mService->NotifyConferenceError(aName, aMessage);
   return true;
 }
--- a/dom/telephony/ipc/TelephonyChild.h
+++ b/dom/telephony/ipc/TelephonyChild.h
@@ -37,19 +37,16 @@ protected:
   virtual bool
   RecvNotifyCallStateChanged(nsTArray<nsITelephonyCallInfo*>&& aAllInfo) override;
 
   virtual bool
   RecvNotifyCdmaCallWaiting(const uint32_t& aClientId,
                             const IPCCdmaWaitingCallData& aData) override;
 
   virtual bool
-  RecvNotifyConferenceCallStateChanged(const uint16_t& aCallState) override;
-
-  virtual bool
   RecvNotifyConferenceError(const nsString& aName,
                             const nsString& aMessage) override;
 
   virtual bool
   RecvNotifySupplementaryService(const uint32_t& aClientId,
                                  const int32_t& aCallIndex,
                                  const uint16_t& aNotification) override;
 
--- a/dom/telephony/ipc/TelephonyIPCService.cpp
+++ b/dom/telephony/ipc/TelephonyIPCService.cpp
@@ -372,25 +372,16 @@ TelephonyIPCService::CallStateChanged(ui
 {
   for (uint32_t i = 0; i < mListeners.Length(); i++) {
     mListeners[i]->CallStateChanged(aLength, aAllInfo);
   }
   return NS_OK;
 }
 
 NS_IMETHODIMP
-TelephonyIPCService::ConferenceCallStateChanged(uint16_t aCallState)
-{
-  for (uint32_t i = 0; i < mListeners.Length(); i++) {
-    mListeners[i]->ConferenceCallStateChanged(aCallState);
-  }
-  return NS_OK;
-}
-
-NS_IMETHODIMP
 TelephonyIPCService::EnumerateCallStateComplete()
 {
   MOZ_CRASH("Not a EnumerateCalls request!");
 }
 
 NS_IMETHODIMP
 TelephonyIPCService::EnumerateCallState(nsITelephonyCallInfo* aInfo)
 {
--- a/dom/telephony/ipc/TelephonyParent.cpp
+++ b/dom/telephony/ipc/TelephonyParent.cpp
@@ -282,25 +282,16 @@ TelephonyParent::CallStateChanged(uint32
   for (uint32_t i = 0; i < aLength; i++) {
     allInfo.AppendElement(aAllInfo[i]);
   }
 
   return SendNotifyCallStateChanged(allInfo) ? NS_OK : NS_ERROR_FAILURE;
 }
 
 NS_IMETHODIMP
-TelephonyParent::ConferenceCallStateChanged(uint16_t aCallState)
-{
-  NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
-
-  return SendNotifyConferenceCallStateChanged(aCallState) ? NS_OK
-                                                          : NS_ERROR_FAILURE;
-}
-
-NS_IMETHODIMP
 TelephonyParent::EnumerateCallStateComplete()
 {
   MOZ_CRASH("Not a EnumerateCalls request!");
 }
 
 NS_IMETHODIMP
 TelephonyParent::EnumerateCallState(nsITelephonyCallInfo* aInfo)
 {
@@ -377,22 +368,16 @@ TelephonyRequestParent::SendResponse(con
 
 NS_IMETHODIMP
 TelephonyRequestParent::CallStateChanged(uint32_t aLength, nsITelephonyCallInfo** aAllInfo)
 {
   MOZ_CRASH("Not a TelephonyParent!");
 }
 
 NS_IMETHODIMP
-TelephonyRequestParent::ConferenceCallStateChanged(uint16_t aCallState)
-{
-  MOZ_CRASH("Not a TelephonyParent!");
-}
-
-NS_IMETHODIMP
 TelephonyRequestParent::EnumerateCallStateComplete()
 {
   NS_ENSURE_TRUE(!mActorDestroyed, NS_ERROR_FAILURE);
 
   return Send__delete__(this, EnumerateCallsResponse()) ? NS_OK : NS_ERROR_FAILURE;
 }
 
 NS_IMETHODIMP
--- a/dom/telephony/nsITelephonyService.idl
+++ b/dom/telephony/nsITelephonyService.idl
@@ -2,17 +2,17 @@
  * 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 "nsISupports.idl"
 
 interface nsIMobileCallForwardingOptions;
 interface nsITelephonyCallInfo;
 
-[scriptable, uuid(80faf34e-286b-4487-bd55-135bd92668b9)]
+[scriptable, uuid(baa9f5f3-5cab-40e0-81e9-ae0abd917907)]
 interface nsITelephonyListener : nsISupports
 {
   /**
    * Called when enumeration asked by nsITelephonyService::enumerateCalls
    * is completed.
    */
   void enumerateCallStateComplete();
 
@@ -25,27 +25,16 @@ interface nsITelephonyListener : nsISupp
 
   /**
    * Notified when a telephony call changes state.
    */
   void callStateChanged(in unsigned long length,
                         [array, size_is(length)] in nsITelephonyCallInfo allInfo);
 
   /**
-   * Called when participants of a conference call have been updated, and the
-   * conference call state changes.
-   *
-   * @param callState
-   *        Possible values are: nsITelephonyService::CALL_STATE_UNKNOWN,
-   *        nsITelephonyService::CALL_STATE_HELD,
-   *        nsITelephonyService::CALL_STATE_CONNECTED.
-   */
-  void conferenceCallStateChanged(in unsigned short callState);
-
-  /**
    * Notify when RIL receives supplementary service notification.
    *
    * @param clientId
             Indicate the RIL client, 0 ~ (number of client - 1).
    * @param callIndex
    *        Call identifier assigned by the RIL. -1 if not specified
    * @param notification
    *        One of the nsITelephonyService::NOTIFICATION_* values.
--- a/dom/telephony/test/marionette/test_TelephonyUtils.js
+++ b/dom/telephony/test/marionette/test_TelephonyUtils.js
@@ -40,17 +40,16 @@ function waitForStateChanged(aPredicate)
 
       callStateChanged: function(length, allInfo) {
         if (aPredicate(allInfo)) {
           resolve(allInfo);
           TelephonyService.unregisterListener(listener);
         }
       },
 
-      conferenceCallStateChanged: function() {},
       supplementaryServiceNotification: function() {},
       notifyError: function() {},
       notifyCdmaCallWaiting: function() {},
       notifyConferenceError: function() {}
     };
 
     TelephonyService.registerListener(listener);
   });
--- a/dom/webidl/HeapSnapshot.webidl
+++ b/dom/webidl/HeapSnapshot.webidl
@@ -5,16 +5,22 @@
  */
 
 /**
  * A HeapSnapshot represents a snapshot of the heap graph
  */
 [ChromeOnly, Exposed=(Window,System,Worker)]
 interface HeapSnapshot {
   /**
+   * A time stamp of when the heap snapshot was taken, if available. Units are
+   * microseconds since midnight (00:00:00) 1 January 1970 UTC.
+   */
+  readonly attribute unsigned long long? creationTime;
+
+  /**
    * Take a census of the heap snapshot.
    *
    * This is the same as |Debugger.Memory.prototype.takeCensus|, but operates on
    * the offline heap snapshot's serialized heap graph rather than the live heap
    * graph. The same optional configuration options that can be passed to that
    * function can be passed here.
    *
    * The returned value is determined by the `"breakdown"` option used, and is
--- a/editor/composer/moz.build
+++ b/editor/composer/moz.build
@@ -22,16 +22,28 @@ UNIFIED_SOURCES += [
     'nsComposerRegistration.cpp',
     'nsComposeTxtSrvFilter.cpp',
     'nsEditingSession.cpp',
     'nsEditorSpellCheck.cpp',
 ]
 
 FINAL_LIBRARY = 'xul'
 RESOURCE_FILES += [
+    'res/accessiblecaret.png',
+    'res/accessiblecaret@1.5x.png',
+    'res/accessiblecaret@2.25x.png',
+    'res/accessiblecaret@2x.png',
+    'res/accessiblecaret_tilt_left.png',
+    'res/accessiblecaret_tilt_left@1.5x.png',
+    'res/accessiblecaret_tilt_left@2.25x.png',
+    'res/accessiblecaret_tilt_left@2x.png',
+    'res/accessiblecaret_tilt_right.png',
+    'res/accessiblecaret_tilt_right@1.5x.png',
+    'res/accessiblecaret_tilt_right@2.25x.png',
+    'res/accessiblecaret_tilt_right@2x.png',
     'res/EditorOverride.css',
     'res/grabber.gif',
     'res/table-add-column-after-active.gif',
     'res/table-add-column-after-hover.gif',
     'res/table-add-column-after.gif',
     'res/table-add-column-before-active.gif',
     'res/table-add-column-before-hover.gif',
     'res/table-add-column-before.gif',
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..828315b9a720ed7b73460700890d9ad0f2433368
GIT binary patch
literal 15965
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8b27c3c20aa1a3ab7a4eb4683e90364dc609131c
GIT binary patch
literal 16477
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
TsOK})4*+<&E#nj|4omzSK$IVh
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..685670e01aa9b2a644f73f8cbc87c70234bae9c0
GIT binary patch
literal 17193
zc%1E=dpuNI|Hn6_GD3H8=!~gU#N08H874DwX(V(I#a#AW+-8~?_Y_K`BPTi$5>D<#
zxs;IZNeM|gDVJ^>l`gt?iu9Wi<#9Q`^Sqwt&%Ix-z4y#_t<UGZ*LSV8*ZOB>ubu5W
zWtavG003nxORBx}PM4k=XU&ja6Seg0q&G#OrHdE<l;+D$IUqT8F#r%U`Hs#KXZm^~
zOW<R`U<;U_L7<NikR2wbfkFn$3zWc_AeZk;LcFd#kAU;pB!m;5j-m_AK_1^SSOhu*
z+d8s>y;uY`!jud%2_#Ald_V~U9_ZukD<%e#5W~Ji>1SCOiGUARk$9016j=e>nQjL+
z7l=SO-oQ|wg)%gP8xai9cq1d6(P}sbg~lUMSR@vukHHdgC?XC6A2|?YnDlBQVsnW0
zRErUu^cxAmlSqU_Br+f%z#sr?AP{kpXaa$NL}8E^jJ~vnzBtHN!U)v&6)*i}GU`JG
z#ViqDDB%ly;j-@xroc}^LLgx9F~>-|e1vrRca*PqBzw|4A_EyhB-#Ll^zlJXrW8x;
zLC)VR#g0Kj5NQvJ1%4tHD6PJ9awD3*<UcW@`GdZaNv))<`Fo?uL~Pb~jnGfzJ)CGZ
z3kiCIK2nZYszXnz6Y>NSftV+l0{OjoO0a~_nIeI*k|||iAb$#(tmK=F{6l9l+{Hwy
zfaND^j}?_H4H&TbY@#s*jX{~Or5RFCSTvf3UyDT>(P%~%6e<NxAsEt3kQ1a6Y^{97
z5{54e9I@p~Z7~=_3<o0}o=g;$rH^BCjP)5zG*+KQAmEH}Xd@#-EPB*>jC|q~gCf2^
z$hHs(e1=D{kRcL-vVlNCjE;n{?UV_J$0U(I@tLqVEX|mJqEZMJ1Zh)o6pA^{0%x(-
z2!}`EC^(7<a)NX+XZFM-jyTi)KWFx&NkmR)>cl*35b>oiE{6Ai(Sws%Ou$(3#S(!i
zXk5ExiFW|E{d;t@z?=UMJLY>5r8Aw#V98!gWHCe9Vp(>^#HJQa(x?AyoK28V%?RLu
zzGT^(S|5$lN8=sQMnsGe5s%VC852>cQLEuvQ=5nd97zB}1X8%tJd?jI4R)ii0=T*P
z@KOL@NoTP5zOvw|QQv<TP7Pr37`|MPO-7CiM*|bO2>Gp##`P$2Vwa8%lZit>Ha3Xn
zB9I}CI|>Be|ExjdMU(k~ROu<pHclU9sE@`vqVYtWbZJD7W_w)CaUOI5o6iXv^_Z&1
z#?>6}AzjDW3<={Oxs0tl#)r)!as(nDhJ?)bVQ@jD(3fk1{1F^e^ZR;0G#7XaMAF9s
z$ygKQWZ^L?*-9XrzS1$l7@i{1Aw3~BzP__;8hZN;ml<JD(gTT>T}Py2i^oe{{$A?x
zH_{(Pn|%2aGG;_FE<8phTduyf+CjQS1IdPXJQi<)93LL9u;T}U-p*9M^hG8feoUhg
z&G>>zg)TqJjnQL;E)#^`rplPj)VG})a%8I}-6bNwZxbh*u>bo5f<O=m0zn`M1c4wB
z1cE>i2m(PM2n2y35Cnoi5C{T6AP5A3AP@wCKoAH5K_CbOfglhBf<O=m0zn`M1c4wB
z1cE>i2m(PM2n6{bLtsCCcnSKlNr(W1DOpZuFbn_yILp$W4gkT+0U&G_0DSr?z4ris
z9|{1TdjJ422>{dt@$OeG06<aBib`<|Y<-y;B6Pf~Rdc@kVMzaxTfY7Y-b;2bTei$>
zdd7h$#|wQrm<5>MKBq@7JdS8$m_5t5WUPBV><Marv+Zi;v)h+uXMx)vrDqu*vR7cN
zbWDphOZ&;cB(AcuKkbg`JlBjz+TP^>Z+CG0{W$?2Uy_c#8~9THI^dNcQCQFTYhbU&
ztl7L7xM{7u%j!QVn^st7-r4mSd@!T`L3?q2OU0K>I_?>TU4=F_CH-eB<HU{Sy>5H;
zf5W^p>R#_oyd-QWuoRYe9(i+}z0%syY115vC@GYbCa*oCRIm2wt(#~1t3xVuqguCE
z(l4a8u$-^uMg^-k66b3RJ6y3b(aa5~dn$A*v-J({%lFs@KMcFKcbU`aHLSYJaqp;u
z@hyinBhIySTD^MYuuqwnxQcsC>25Pq>-yo~Ri)*#Zy(vzS$&4He+e_iH=QtZ|4q>^
z`wy$uhub!(<NuWJPJfHVyiVD|H=72}2H_#C5wuLb615Fihz)s;3MM)s#o799-o3Y9
zKhM}W$3w4RH=zjUm*LVEa_JX;a9VBX`>ehE&?r*2MQb5ZWgpGsMqSFwBX9PtpcHNI
zxx$Vt;%K{FE^tswE_-TgJP`NtJ*kD1P|5vuyGNNu1y6z7qG_XuySV1<sl>h|ThLE$
z<dJvH<H;*2*sE#m+mo@|V92!YQhRoli(bd{h1M=^)$LW&Jx^Zk(K3A(d%RYxR5oix
z@>QJIMunKP2Yty;-^M!a+OhrUmIDR47lOVX&wJPL{@1iLMSvNs6V0y1qn(vJPR9?e
zbbgcadwfm*ZVgzcMboT9(Uj7hxSPqC0Ij)K)bBOPW!!5^nM<td|5$<x`DB(Syj@wa
zzB)6<WwpNpD^IjIyDH70%JfLdfz96aUOvlKarvIcfY^2;=WX!`FB;b(w&`ASYM{E}
zrBqkUMiIDEqsVm2LXzKK@^Llx9ZmCwf{pdo_3H<L-8J!RDlHU0Cu}Y%=FOol7#LXM
zR+Z!NsukVLoEcXm7oT~Eb3@ncRo$~VW8EEt8q=TuI`D$RD{hGiD}XiId8sy(N1cgL
zClt)T)xEVVCf<_3%T8r({@2Sj4G&@ls?%?1hn+G2{Cf)XcRy%KHPtw~Uh%UHOU;%n
z2Tyu`IVpv3TF2@Bhq|*Q-lNB{UaQ+~cAeto-U%+&i%ZJo$#b9ASF~o`+1y?fD}jBQ
zQIuzMsO?~z7OlZ2=>9Km=r~%dul`AY4UfHx%_8$39=>UGOtsKDf8BDe<fJZ(N14iE
zpR6xOH?|Ho+MCRshIcIxbF0fY_jUECZSFc4bh+uXN(haAqUGv=`3Xx=-HGI9A;Q}A
zYZbmwN)lD;u2%^@!j?CBpC5#8w8=YQ$R2#ky-C_sVl7dipUk=3-x#mn{CsiK*6lC4
zU(Ib*JDCy^_+h&z{f;Wmwe|?@W4rmH_I&%UkeV~)vqKtg41}thtf8tk=HB0PoUf!K
zx2!w3{t7PqnxomAEvK90&Sx&F{MfiG!2eK|>wQg>Lhz!5%fg3fNiO&0udrJgLHQiz
zxtfJclET+|y%`G4kFO_~oOQrQarCNL@^h)Ma{-$~DmqaI3_Y5+WTzr})8|r3VgB9l
zW6?>P;aTZb4>vn*EL6m;RVaUzXYgCGlDItCQrR;#+&Wuc*QGSv;)KfW&2G0hoFt^$
z-Ce-Qjz~TsU-l;qUyOTxjN_`9kr}y^R&j+ea~3>E9I9~@#|(#qVRPV-#21G(BTpP}
z%2LLyrLK)$xJswq(JrAaUl~__@k3gwAJGf8Bo0GQ-zJ=a*WQKQa<{uBwUlj9b=Dw1
zHVeIoizZx9pJt`)NnHRxO44Y&)^w0cRm2^6wm0c`j>TiIm;dUFft8&ovzpIay+|=K
zZm>6cUd3WWL=vKURT%BE?!G<G%eHL*9_`$*&7fVFtzt#AekHO=sIx3JOtr$bXx%OL
zh+BCgc4ljW#h1!l4?p;JNypwdr@pv*!FnINpAM~KZM2B4-swrp1qxS2rx};4hGj0t
zW%YKx+Ic1A#r~c)THe+D&TU5B5d-ZV+Z>)Od%|oMzUdfhOEH{p)l_m=?qFtbCpRQB
zN9E^cO^vYYR~t_6SWsjtj!!<`$kMi^bFQQ`%p5#g)xQQ%B$=64^*jvkQr%HWJGqAP
zzAJlon4MgB!`E`s_NV*407(Yva=(4~xv*owps1yTmZ(}m_}r!0>>cG6Fi5@p+UdM<
zXLiW)_=>i?N1Yk(%50ogBsa|1T{^q>;x-k8HQ;o2PpsZO-4n|0ZFPnBmp20NzFUcF
zo_i)9f8?3!P(rt1!XsvB--`WA*X!_XEAd$xcI;v8tC%ag&pSSB^|_qw)Dm7g)59l5
zG=F;3PqD7<9qlK<ySf0qR->|@`1a>LxAa;JhZuByr-c^!XYM`Dy+7k(7xi7e`%d9d
zZ&t%J<KLSVdh%^80UaRga6(tz$F{F^-WPkya<xq_IJf-ny4&nz&aM?q-ov45r#}a{
zyVY)b<^`OpH(%1CRVujnjQBY=xBlq4$NZ4j6c_78)kVrH)HJ){@ruj}wZ8j*+)_^2
z8k+O$59Jqfsnh42?W=jOsLT`W@waZTV%*0o?dVZ|_wIHCK34bQqS6k%bLxSb@CBK7
zl!Vt@$!_P*Y<uwH#nX}+a&I)_Z9&OBWT^m@v-3dyY`jX`mymEIAoj#Doq{V*g(2%y
zYd&n6r`2JVJInJ__#Alo&X(|O({p8i^j=uudN$rz#jHB*qP?63FbmM6;u2k9H)d9@
zb5!;FWxtkpUsu4=%=aBGr{ipfxb(#J@zY`=s9vF=e>J+F?|a=|>_iR?EYeU}LJb+H
z4F0n9h(=@ei(-|vk@B9W5|g$^((1#X3^>DXz-T!uTqWh$=vr@W$AiWW3lBxtuGWC%
zh9A22XXKL{<c^_k^Hbul#H){QJGfb;%FQW1q}Q&}SnU<G2v7mk0k?Eq>>TFI-0AYI
z=#uHiaiYT0;eRYNQwp<-`l(&G=V*ST!5OkcO-bWhxYkfD@u6+c$=qX-2R!-SDBUMT
z7l!v1$#S>CIM>5CX4rJ~#@W0*BO8v4ud{)Ll+I5atlxFnpIKPZY^jB7JtF=ORLP9c
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bad59253f9564a0e9e9cb013f3a132258d372b1f
GIT binary patch
literal 17190
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b96f674c28bcfb72a2f7e290b826d354e8a78a2b
GIT binary patch
literal 15894
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
F{6F<+`rH5j
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..840b2186825c54c5ab7321a30113a3d3b803e180
GIT binary patch
literal 16342
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..d69ca4fe4b36a360d9a2453e8604f3dc8c34789f
GIT binary patch
literal 17063
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f76cb333c3215ed1b1768c8a059f72a42a1fd42a
GIT binary patch
literal 16756
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
YYK9v-qSWU}|1W|&V~*>uE{m4`2ev1NjQ{`u
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6a95a96648d6fa1e5acd317eb9adb8ae0a4ea8b7
GIT binary patch
literal 15886
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..02dde485c10b8d441ac534d6f1abe951d3770d36
GIT binary patch
literal 16360
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
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..ec6a50f0a75dfbf466ca1ff1e0a29eece4a0befe
GIT binary patch
literal 17087
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
Fe*hL{J4FBh
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c24e66d0adc1969b67a4cc1cb12ffb736d4d24bd
GIT binary patch
literal 16763
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
--- a/js/src/jit/Snapshots.cpp
+++ b/js/src/jit/Snapshots.cpp
@@ -309,17 +309,17 @@ RValueAllocation::readPayload(CompactBuf
         break;
     }
 }
 
 RValueAllocation
 RValueAllocation::read(CompactBufferReader& reader)
 {
     uint8_t mode = reader.readByte();
-    const Layout& layout = layoutFromMode(Mode(mode & MODE_MASK));
+    const Layout& layout = layoutFromMode(Mode(mode & MODE_BITS_MASK));
     Payload arg1, arg2;
 
     readPayload(reader, layout.type1, &mode, &arg1);
     readPayload(reader, layout.type2, &mode, &arg2);
     return RValueAllocation(Mode(mode), arg1, arg2);
 }
 
 void
--- a/js/src/jit/Snapshots.h
+++ b/js/src/jit/Snapshots.h
@@ -75,17 +75,17 @@ class RValueAllocation
         // set on the mode, this inform the snapshot iterator that even if the
         // allocation is readable, the content of if might be incomplete unless
         // all side-effects are executed.
         RECOVER_SIDE_EFFECT_MASK = 0x80,
 
         // This mask represents the set of bits which can be used to encode a
         // value in a snapshot. The mode is used to determine how to interpret
         // the union of values and how to pack the value in memory.
-        MODE_MASK           = 0x17f,
+        MODE_BITS_MASK           = 0x17f,
 
         INVALID = 0x100,
     };
 
     enum { PACKED_TAG_MASK = 0x0f };
 
     // See Payload encoding in Snapshots.cpp
     enum PayloadType {
@@ -289,17 +289,17 @@ class RValueAllocation
 
     void writeHeader(CompactBufferWriter& writer, JSValueType type, uint32_t regCode) const;
   public:
     static RValueAllocation read(CompactBufferReader& reader);
     void write(CompactBufferWriter& writer) const;
 
   public:
     Mode mode() const {
-        return Mode(mode_ & MODE_MASK);
+        return Mode(mode_ & MODE_BITS_MASK);
     }
     bool needSideEffect() const {
         return mode_ & RECOVER_SIDE_EFFECT_MASK;
     }
 
     uint32_t index() const {
         MOZ_ASSERT(layoutFromMode(mode()).type1 == PAYLOAD_INDEX);
         return arg1_.index;
--- a/layout/base/tests/marionette/test_selectioncarets.py
+++ b/layout/base/tests/marionette/test_selectioncarets.py
@@ -294,21 +294,27 @@ class CommonCaretsTestCase(object):
         self.actions.flick(el, caret1_x, caret1_y, caret2_x, caret2_y).perform()
 
         # We make two hit tests targeting the left edge of the left tilted caret
         # and the right edge of the right tilted caret. If either of the hits is
         # missed, selection would be collapsed and both carets should not be
         # draggable.
         (caret3_x, caret3_y), (caret4_x, caret4_y) = sel.selection_carets_location()
 
-        # The following values are from ua.css.
-        caret_width = 44
-        caret_margin_left = -23
-        tilt_right_margin_left = 18
-        tilt_left_margin_left = -17
+        # The following values are from ua.css and all.js
+        if self.carets_tested_pref == 'selectioncaret.enabled':
+            caret_width = 44
+            caret_margin_left = -23
+            tilt_right_margin_left = 18
+            tilt_left_margin_left = -17
+        elif self.carets_tested_pref == 'layout.accessiblecaret.enabled':
+            caret_width = float(self.marionette.get_pref('layout.accessiblecaret.width'))
+            caret_margin_left = float(self.marionette.get_pref('layout.accessiblecaret.margin-left'))
+            tilt_right_margin_left = 0.41 * caret_width;
+            tilt_left_margin_left = -0.39 * caret_width;
 
         left_caret_left_edge_x = caret3_x + caret_margin_left + tilt_left_margin_left
         el.tap(left_caret_left_edge_x + 2, caret3_y)
 
         right_caret_right_edge_x = (caret4_x + caret_margin_left +
                                     tilt_right_margin_left + caret_width)
         el.tap(right_caret_right_edge_x - 2, caret4_y)
 
--- a/layout/style/ua.css
+++ b/layout/style/ua.css
@@ -338,72 +338,72 @@ div:-moz-native-anonymous.moz-accessible
   background-color: #008aa0;
 }
 
 div:-moz-native-anonymous.moz-accessiblecaret.no-bar > div.bar {
   display: none;
 }
 
 div:-moz-native-anonymous.moz-accessiblecaret.normal > div.image {
-  background-image: url("resource://gre/res/text_caret.png");
+  background-image: url("resource://gre/res/accessiblecaret.png");
 }
 
 div:-moz-native-anonymous.moz-accessiblecaret.left > div.image {
-  background-image: url("resource://gre/res/text_caret_tilt_left.png");
+  background-image: url("resource://gre/res/accessiblecaret_tilt_left.png");
   margin-left: -39%;
 }
 
 div:-moz-native-anonymous.moz-accessiblecaret.right > div.image {
-  background-image: url("resource://gre/res/text_caret_tilt_right.png");
+  background-image: url("resource://gre/res/accessiblecaret_tilt_right.png");
   margin-left: 41%;
 }
 
 div:-moz-native-anonymous.moz-accessiblecaret.none {
   display: none;
 }
 
 @media (min-resolution: 1.5dppx) {
   div:-moz-native-anonymous.moz-accessiblecaret.normal > div.image {
-    background-image: url("resource://gre/res/text_caret@1.5x.png");
+    background-image: url("resource://gre/res/accessiblecaret@1.5x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.left > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_left@1.5x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_left@1.5x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.right > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_right@1.5x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_right@1.5x.png");
   }
 }
 
 @media (min-resolution: 2dppx) {
   div:-moz-native-anonymous.moz-accessiblecaret.normal > div.image {
-    background-image: url("resource://gre/res/text_caret@2x.png");
+    background-image: url("resource://gre/res/accessiblecaret@2x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.left > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_left@2x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_left@2x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.right > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_right@2x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_right@2x.png");
   }
 }
 
 @media (min-resolution: 2.25dppx) {
   div:-moz-native-anonymous.moz-accessiblecaret.normal > div.image {
-    background-image: url("resource://gre/res/text_caret@2.25x.png");
+    background-image: url("resource://gre/res/accessiblecaret@2.25x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.left > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_left@2.25x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_left@2.25x.png");
   }
 
   div:-moz-native-anonymous.moz-accessiblecaret.right > div.image {
-    background-image: url("resource://gre/res/text_caret_tilt_right@2.25x.png");
+    background-image: url("resource://gre/res/accessiblecaret_tilt_right@2.25x.png");
   }
 }
 
 div:-moz-native-anonymous.moz-touchcaret,
 div:-moz-native-anonymous.moz-selectioncaret-left,
 div:-moz-native-anonymous.moz-selectioncaret-right {
   position: fixed;
   width: 44px;
--- a/mobile/android/base/Makefile.in
+++ b/mobile/android/base/Makefile.in
@@ -458,17 +458,19 @@ update-generated-wrappers:
 	$(MAKE) -C ../app
 	$(MAKE) -C ../themes/core
 	$(MAKE) -C ../installer stage-package
 	$(MKDIR) -p $(@D)
 	rsync --update $(DIST)/fennec/$(notdir $(OMNIJAR_NAME)) $@
 	$(RM) $(DIST)/fennec/$(notdir $(OMNIJAR_NAME))
 
 # Targets built very early during a Gradle build.
-gradle-targets: .aapt.deps
+gradle-targets: $(foreach f,$(constants_PP_JAVAFILES),$(f))
+gradle-targets: $(abspath AndroidManifest.xml)
+gradle-targets: $(ANDROID_GENERATED_RESFILES)
 
 gradle-omnijar: $(abspath $(DIST)/fennec/$(OMNIJAR_NAME))
 
 .PHONY: gradle-targets gradle-omnijar
 
 ifndef MOZ_DISABLE_GECKOVIEW
 libs:: geckoview_resources.zip
 	$(INSTALL) geckoview_resources.zip $(FINAL_TARGET)
--- a/mobile/android/base/moz.build
+++ b/mobile/android/base/moz.build
@@ -812,16 +812,17 @@ if CONFIG['MOZ_INSTALL_TRACKING']:
 # Putting branding earlier allows branders to override default resources.
 ANDROID_RES_DIRS += [
     '/' + CONFIG['MOZ_BRANDING_DIRECTORY'] + '/res',
     'resources',
     '!res',
 ]
 
 ANDROID_GENERATED_RESFILES += [
+    'res/raw/browsersearch.json',
     'res/raw/suggestedsites.json',
     'res/values/strings.xml',
 ]
 
 ANDROID_ASSETS_DIRS += [
     '/mobile/android/app/assets',
 ]
 
deleted file mode 100644
--- a/mobile/android/base/resources/layout/tabs_panel_back_button.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?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/. -->
-
-<org.mozilla.gecko.tabs.TabPanelBackButton xmlns:android="http://schemas.android.com/apk/res/android"
-                                           xmlns:gecko="http://schemas.android.com/apk/res-auto"
-                                           android:id="@+id/nav_back"
-                                           android:layout_width="@dimen/tabs_panel_button_width"
-                                           android:layout_height="match_parent"
-                                           android:minWidth="@dimen/tabs_panel_button_width"
-                                           android:src="@drawable/tabs_panel_nav_back"
-                                           android:contentDescription="@string/back"
-                                           android:background="@drawable/action_bar_button_inverse"
-                                           gecko:dividerVerticalPadding="@dimen/tab_panel_divider_vertical_padding"
-                                           gecko:rightDivider="@drawable/tab_indicator_divider"/>
-
--- a/mobile/android/base/resources/layout/tabs_panel_default.xml
+++ b/mobile/android/base/resources/layout/tabs_panel_default.xml
@@ -13,20 +13,26 @@
                     android:layout_width="match_parent"
                     android:layout_height="@dimen/browser_toolbar_height">
 
         <view class="org.mozilla.gecko.tabs.TabsPanel$TabsPanelToolbar"
               android:layout_width="match_parent"
               android:layout_height="@dimen/browser_toolbar_height"
               android:background="@color/text_and_tabs_tray_grey">
 
-            <ViewStub android:id="@+id/nav_back_stub"
-                      android:layout="@layout/tabs_panel_back_button"
-                      android:layout_width="wrap_content"
-                      android:layout_height="match_parent"/>
+            <org.mozilla.gecko.tabs.TabPanelBackButton
+                android:id="@+id/nav_back"
+                android:layout_width="@dimen/tabs_panel_button_width"
+                android:layout_height="match_parent"
+                android:minWidth="@dimen/tabs_panel_button_width"
+                android:src="@drawable/tabs_panel_nav_back"
+                android:contentDescription="@string/back"
+                android:background="@drawable/action_bar_button_inverse"
+                gecko:dividerVerticalPadding="@dimen/tab_panel_divider_vertical_padding"
+                gecko:rightDivider="@drawable/tab_indicator_divider"/>
 
             <org.mozilla.gecko.widget.IconTabWidget android:id="@+id/tab_widget"
                                                     android:layout_width="wrap_content"
                                                     android:layout_height="match_parent"
                                                     android:tabStripEnabled="false"
                                                     android:divider="@drawable/tab_indicator_divider"
                                                     android:dividerPadding="@dimen/tab_panel_divider_vertical_padding"
                                                     android:layout="@layout/tabs_panel_indicator"/>
--- a/mobile/android/base/tabs/TabsLayoutItemView.java
+++ b/mobile/android/base/tabs/TabsLayoutItemView.java
@@ -91,19 +91,17 @@ public class TabsLayoutItemView extends 
     @Override
     protected void onFinishInflate() {
         super.onFinishInflate();
         mTitle = (TextView) findViewById(R.id.title);
         mThumbnail = (TabsPanelThumbnailView) findViewById(R.id.thumbnail);
         mCloseButton = (ImageView) findViewById(R.id.close);
         mThumbnailWrapper = (TabThumbnailWrapper) findViewById(R.id.wrapper);
 
-        if (HardwareUtils.isTablet() || AppConstants.NIGHTLY_BUILD) {
-            growCloseButtonHitArea();
-        }
+        growCloseButtonHitArea();
     }
 
     private void growCloseButtonHitArea() {
         getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
             @Override
             public boolean onPreDraw() {
                 getViewTreeObserver().removeOnPreDrawListener(this);
 
--- a/mobile/android/base/tabs/TabsPanel.java
+++ b/mobile/android/base/tabs/TabsPanel.java
@@ -159,26 +159,23 @@ public class TabsPanel extends LinearLay
         mMenuButton = findViewById(R.id.menu);
         mMenuButton.setOnClickListener(new Button.OnClickListener() {
             @Override
             public void onClick(View view) {
                 showMenu();
             }
         });
 
-        if (AppConstants.NIGHTLY_BUILD || HardwareUtils.isTablet()) {
-            ViewStub backButtonStub = (ViewStub) findViewById(R.id.nav_back_stub);
-            mNavBackButton = (ImageButton) backButtonStub.inflate( );
-            mNavBackButton.setOnClickListener(new Button.OnClickListener() {
-                @Override
-                public void onClick(View view) {
-                    mActivity.onBackPressed();
-                }
-            });
-        }
+        mNavBackButton = (ImageButton) findViewById(R.id.nav_back);
+        mNavBackButton.setOnClickListener(new Button.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                mActivity.onBackPressed();
+            }
+        });
     }
 
     public void showMenu() {
         final Menu menu = mPopupMenu.getMenu();
 
         // Each panel has a "+" shortcut button, so don't show it for that panel.
         menu.findItem(R.id.new_tab).setVisible(mCurrentPanel != Panel.NORMAL_TABS);
         menu.findItem(R.id.new_private_tab).setVisible(mCurrentPanel != Panel.PRIVATE_TABS
@@ -244,49 +241,22 @@ public class TabsPanel extends LinearLay
         if (itemId == R.id.new_tab || itemId == R.id.new_private_tab) {
             hide();
         }
 
         return mActivity.onOptionsItemSelected(item);
     }
 
     private static int getTabContainerHeight(TabsLayoutContainer tabsContainer) {
-        Resources resources = tabsContainer.getContext().getResources();
-
-        int screenHeight = resources.getDisplayMetrics().heightPixels;
-
-        int actionBarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height);
-
-        if (HardwareUtils.isTablet() || AppConstants.NIGHTLY_BUILD) {
-            return screenHeight - actionBarHeight;
-        }
-
-        PanelView panelView = tabsContainer.getCurrentPanelView();
-        if (panelView != null && !panelView.shouldExpand()) {
+        final Resources resources = tabsContainer.getContext().getResources();
 
-            // This allows us to accommodate varying height tab previews across different devices.
-            // We should be able to remove once we remove the list view and remove the chrome again
-            return resources.getDimensionPixelSize(R.dimen.tab_thumbnail_height)
-                 + resources.getDimensionPixelSize(R.dimen.tab_title_height)
-                 + 2 * (resources.getDimensionPixelSize(R.dimen.tab_highlight_stroke_width)
-                      + resources.getDimensionPixelSize(R.dimen.tab_vertical_padding)
-                      + resources.getDimensionPixelSize(R.dimen.tab_thumbnail_padding)
-                      + resources.getDimensionPixelSize(R.dimen.tab_thumbnail_margin));
-        }
+        final int screenHeight = resources.getDisplayMetrics().heightPixels;
+        final int actionBarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height);
 
-        Rect windowRect = new Rect();
-        tabsContainer.getWindowVisibleDisplayFrame(windowRect);
-        int windowHeight = windowRect.bottom - windowRect.top;
-
-        // The web content area should have at least 1.5x the height of the action bar.
-        // The tabs panel shouldn't take less than 50% of the screen height and can take
-        // up to 80% of the window height.
-        return (int) Math.max(screenHeight * 0.5f,
-                Math.min(windowHeight - 2.5f * actionBarHeight, windowHeight * 0.8f) - actionBarHeight);
-
+        return screenHeight - actionBarHeight;
     }
 
     @Override
     public void onAttachedToWindow() {
         super.onAttachedToWindow();
         mTheme.addListener(this);
     }
 
--- a/mobile/android/base/tabs/TabsPanelThumbnailView.java
+++ b/mobile/android/base/tabs/TabsPanelThumbnailView.java
@@ -1,16 +1,15 @@
 /* -*- 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.tabs;
 
-import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.ThumbnailHelper;
 import org.mozilla.gecko.widget.CropImageView;
 
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 
@@ -30,21 +29,17 @@ public class TabsPanelThumbnailView exte
     }
 
     public TabsPanelThumbnailView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
     }
 
     @Override
     protected float getAspectRatio() {
-        if (AppConstants.NIGHTLY_BUILD) {
-            return ThumbnailHelper.TABS_PANEL_THUMBNAIL_ASPECT_RATIO;
-        } else {
-            return ThumbnailHelper.TOP_SITES_THUMBNAIL_ASPECT_RATIO;
-        }
+        return ThumbnailHelper.TABS_PANEL_THUMBNAIL_ASPECT_RATIO;
     }
 
     @Override
     public void setImageDrawable(Drawable drawable) {
         boolean resize = true;
 
         if (drawable == null) {
             drawable = getResources().getDrawable(R.drawable.tab_panel_tab_background);
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -1313,16 +1313,17 @@ var BrowserApp = {
    * @param  aURL URL to look for
    * @param  aOptions Options for the search. Currently supports:
    **  @option startsWith a Boolean indicating whether to search for a tab who's url starts with the
    *           requested url. Useful if you want to ignore hash codes on the end of a url. For instance
    *           to have about:downloads match about:downloads#123.
    * @return the tab with the given URL, or null if no such tab exists
    */
   getTabWithURL: function getTabWithURL(aURL, aOptions) {
+    aOptions = aOptions || {};
     let uri = Services.io.newURI(aURL, null, null);
     for (let i = 0; i < this._tabs.length; ++i) {
       let tab = this._tabs[i];
       if (aOptions.startsWith) {
         if (tab.browser.currentURI.spec.startsWith(aURL)) {
           return tab;
         }
       } else {
--- a/mobile/android/gradle/app/build.gradle
+++ b/mobile/android/gradle/app/build.gradle
@@ -2,16 +2,19 @@ apply plugin: 'com.android.application'
 
 android {
     compileSdkVersion 23
     buildToolsVersion "23.0.1"
 
     defaultConfig {
         targetSdkVersion 22
         minSdkVersion 9
+        applicationId mozconfig.substs.ANDROID_PACKAGE_NAME
+        testApplicationId 'org.mozilla.roboexample.test'
+        testInstrumentationRunner 'org.mozilla.gecko.FennecInstrumentationTestRunner'
     }
 
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_7
         targetCompatibility JavaVersion.VERSION_1_7
     }
 
     lintOptions {
@@ -20,23 +23,23 @@ android {
 
     buildTypes {
         release {
             minifyEnabled true
             proguardFile "${topsrcdir}/mobile/android/config/proguard/proguard.cfg"
         }
     }
 
-    defaultConfig {
-        testApplicationId 'org.mozilla.roboexample.test'
-        testInstrumentationRunner 'org.mozilla.gecko.FennecInstrumentationTestRunner'
-    }
+    sourceSets {
+        main {
+            manifest.srcFile "${topobjdir}/mobile/android/base/AndroidManifest.xml"
+        }
 
-    sourceSets {
         androidTest {
+            manifest.srcFile "${topobjdir}/build/mobile/robocop/AndroidManifest.xml"
             java {
                 srcDir "src/robocop_harness"
                 srcDir "src/robocop"
                 srcDir "src/background"
                 srcDir "src/browser"
                 srcDir "src/javaaddons"
             }
         }
--- a/mobile/android/gradle/base/build.gradle
+++ b/mobile/android/gradle/base/build.gradle
@@ -41,21 +41,28 @@ android {
                 }
 
                 if (mozconfig.substs.MOZ_WEBRTC) {
                     srcDir 'src/webrtc_audio_device'
                     srcDir 'src/webrtc_video_capture'
                     srcDir 'src/webrtc_video_render'
                 }
 
-                // Adjust helpers are included in the preprocessed_code project.
-                exclude 'org/mozilla/gecko/adjust/**'
+                if (mozconfig.substs.MOZ_INSTALL_TRACKING) {
+                    exclude 'org/mozilla/gecko/adjust/StubAdjustHelper.java'
+                } else {
+                    exclude 'org/mozilla/gecko/adjust/AdjustHelper.java'
+                }
+
+                srcDir "${project.buildDir}/generated/source/preprocessed_code" // See syncPreprocessedCode.
             }
 
             res {
+                srcDir "src/branding/res"
+                srcDir "${project.buildDir}/generated/source/preprocessed_resources" // See syncPreprocessedResources.
                 if (mozconfig.substs.MOZ_CRASHREPORTER) {
                     srcDir "src/crashreporter/res"
                 }
             }
         }
 
         test {
             java {
@@ -64,33 +71,50 @@ android {
 
             resources {
                 srcDir "resources/background_junit4"
             }
         }
     }
 }
 
+
+task syncPreprocessedCode(type: Sync, dependsOn: rootProject.generateCodeAndResources) {
+    into("${project.buildDir}/generated/source/preprocessed_code")
+    from("${topobjdir}/mobile/android/base/generated/preprocessed")
+}
+
+task syncPreprocessedResources(type: Sync, dependsOn: rootProject.generateCodeAndResources) {
+    into("${project.buildDir}/generated/source/preprocessed_resources")
+    from("${topobjdir}/mobile/android/base/res")
+}
+
+android.libraryVariants.all { variant ->
+    variant.preBuild.dependsOn syncPreprocessedCode
+    variant.preBuild.dependsOn syncPreprocessedResources
+}
+
 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.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(':branding')
-    compile project(':preprocessed_code')
-    compile project(':preprocessed_resources')
     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 {
deleted file mode 100644
--- a/mobile/android/gradle/branding/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.mozilla.gecko.branding">
-
-</manifest>
deleted file mode 100644
--- a/mobile/android/gradle/branding/build.gradle
+++ /dev/null
@@ -1,20 +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
-    }
-}
--- a/mobile/android/gradle/build.gradle
+++ b/mobile/android/gradle/build.gradle
@@ -77,23 +77,26 @@ gradle.taskGraph.beforeTask {
 }
 
 afterEvaluate {
     subprojects {
         if (!hasProperty('android')) {
             return
         }
         android.applicationVariants.all {
-            checkManifest.dependsOn rootProject.generateCodeAndResources
+            preBuild.dependsOn rootProject.generateCodeAndResources
         }
         android.libraryVariants.all {
-            checkManifest.dependsOn rootProject.generateCodeAndResources
+            preBuild.dependsOn rootProject.generateCodeAndResources
         }
     }
 }
 
 apply plugin: 'idea'
 
 idea {
     project {
         languageLevel = '1.7'
     }
 }
+
+task wrapper(type: Wrapper) {
+}
index c97a8bdb9088d370da7e88784a7a093b971aa23a..e8c6bf7bb47dff6b81c2cf7a349eb7e912c9fbe2
GIT binary patch
literal 53638
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
b_+P^+@1?;Ze)}-s*ALRKR{B%tZ%6+Rs1GVa
--- a/mobile/android/gradle/gradle/wrapper/gradle-wrapper.properties
+++ b/mobile/android/gradle/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Sun Dec 21 20:16:49 PST 2014
+#Sun Oct 18 17:00:46 PDT 2015
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.7-bin.zip
--- a/mobile/android/gradle/gradlew
+++ b/mobile/android/gradle/gradlew
@@ -37,21 +37,16 @@ case "`uname`" in
   Darwin* )
     darwin=true
     ;;
   MINGW* )
     msys=true
     ;;
 esac
 
-# For Cygwin, ensure paths are in UNIX format before anything is touched.
-if $cygwin ; then
-    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
-fi
-
 # Attempt to set APP_HOME
 # Resolve links: $0 may be a link
 PRG="$0"
 # Need this for relative symlinks.
 while [ -h "$PRG" ] ; do
     ls=`ls -ld "$PRG"`
     link=`expr "$ls" : '.*-> \(.*\)$'`
     if expr "$link" : '/.*' > /dev/null; then
@@ -109,16 +104,17 @@ fi
 if $darwin; then
     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 fi
 
 # For Cygwin, switch paths to Windows format before running java
 if $cygwin ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
 
     # We build the pattern for arguments to be converted via cygpath
     ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
     SEP=""
     for dir in $ROOTDIRSRAW ; do
         ROOTDIRS="$ROOTDIRS$SEP$dir"
         SEP="|"
     done
deleted file mode 100644
--- a/mobile/android/gradle/preprocessed_code/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.mozilla.gecko.preprocessed_code">
-
-</manifest>
deleted file mode 100644
--- a/mobile/android/gradle/preprocessed_code/build.gradle
+++ /dev/null
@@ -1,53 +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 "${project.buildDir}/generated/source/java"
-
-                srcDir 'src/adjust/java'
-                if (mozconfig.substs.MOZ_INSTALL_TRACKING) {
-                    exclude 'org/mozilla/gecko/adjust/StubAdjustHelper.java'
-                } else {
-                    exclude 'org/mozilla/gecko/adjust/AdjustHelper.java'
-                }
-            }
-        }
-    }
-}
-
-task syncGeneratedSources(type: Sync) {
-    into("${project.buildDir}/generated/source/java")
-    from("${topobjdir}/mobile/android/base/generated/preprocessed")
-}
-
-android.libraryVariants.all { variant ->
-    // variant does not expose its generate sources task.
-    def name = variant.buildType.name
-    def generateSourcesTask = tasks.findByName("generate${name.capitalize()}Sources")
-    generateSourcesTask.dependsOn syncGeneratedSources
-}
-
-dependencies {
-    if (mozconfig.substs.MOZ_INSTALL_TRACKING) {
-        compile project(':thirdparty_adjust_sdk')
-    }
-}
deleted file mode 100644
--- a/mobile/android/gradle/preprocessed_resources/AndroidManifest.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.mozilla.gecko.preprocessed_resources">
-
-</manifest>
deleted file mode 100644
--- a/mobile/android/gradle/preprocessed_resources/build.gradle
+++ /dev/null
@@ -1,44 +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 {
-            res {
-                srcDir "${project.buildDir}/generated/source/preprocessed_resources"
-            }
-        }
-    }
-}
-
-task syncPreprocessedResources(type: Sync) {
-    into("${project.buildDir}/generated/source/preprocessed_resources")
-    from("${topobjdir}/mobile/android/base/res")
-}
-
-android.libraryVariants.all { variant ->
-    // variant does not expose its generate debug res values task.
-    def name = variant.buildType.name
-    def generateResValuesTask = tasks.findByName("generate${name.capitalize()}ResValues")
-    generateResValuesTask.dependsOn syncPreprocessedResources
-}
-
-dependencies {
-    compile project(':branding')
-}
--- a/mobile/android/gradle/settings.gradle
+++ b/mobile/android/gradle/settings.gradle
@@ -20,29 +20,23 @@ if (proc.exitValue() != 0) {
 }
 
 import groovy.json.JsonSlurper
 def slurper = new JsonSlurper()
 def json = slurper.parseText(standardOutput.toString())
 
 include ':app'
 include ':base'
-include ':branding'
 include ':omnijar'
-include ':preprocessed_code'
-include ':preprocessed_resources'
 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(':branding').projectDir = new File(gradleRoot, 'branding')
 project(':omnijar').projectDir = new File(gradleRoot, 'omnijar')
-project(':preprocessed_code').projectDir = new File(gradleRoot, 'preprocessed_code')
-project(':preprocessed_resources').projectDir = new File(gradleRoot, 'preprocessed_resources')
 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
--- a/mobile/android/mach_commands.py
+++ b/mobile/android/mach_commands.py
@@ -75,19 +75,16 @@ class MachCommands(MachCommandBase):
         conditions=[conditions.is_android])
     def gradle_install(self, quiet=False):
         import mozpack.manifests
         m = mozpack.manifests.InstallManifest()
 
         def srcdir(dst, src):
             m.add_symlink(os.path.join(self.topsrcdir, src), dst)
 
-        def objdir(dst, src):
-            m.add_symlink(os.path.join(self.topobjdir, src), dst)
-
         srcdir('build.gradle', 'mobile/android/gradle/build.gradle')
         srcdir('settings.gradle', 'mobile/android/gradle/settings.gradle')
 
         m.add_pattern_copy(os.path.join(self.topsrcdir, 'mobile/android/gradle/gradle/wrapper'), '**', 'gradle/wrapper')
         m.add_copy(os.path.join(self.topsrcdir, 'mobile/android/gradle/gradlew'), 'gradlew')
 
         defines = {
             'topsrcdir': self.topsrcdir,
@@ -98,44 +95,31 @@ class MachCommands(MachCommandBase):
             'gradle.properties',
             defines=defines,
             deps=os.path.join(self.topobjdir, 'mobile/android/gradle/.deps/gradle.properties.pp'))
         m.add_preprocess(os.path.join(self.topsrcdir, 'mobile/android/gradle/local.properties.in'),
             'local.properties',
             defines=defines,
             deps=os.path.join(self.topobjdir, 'mobile/android/gradle/.deps/local.properties.pp'))
 
-        srcdir('branding/build.gradle', 'mobile/android/gradle/branding/build.gradle')
-        srcdir('branding/src/main/AndroidManifest.xml', 'mobile/android/gradle/branding/AndroidManifest.xml')
-        srcdir('branding/src/main/res', os.path.join(self.substs['MOZ_BRANDING_DIRECTORY'], 'res'))
-
-        srcdir('preprocessed_code/build.gradle', 'mobile/android/gradle/preprocessed_code/build.gradle')
-        srcdir('preprocessed_code/src/main/AndroidManifest.xml', 'mobile/android/gradle/preprocessed_code/AndroidManifest.xml')
-        srcdir('preprocessed_code/src/adjust/java/org/mozilla/gecko/adjust', 'mobile/android/base/adjust')
-
-        srcdir('preprocessed_resources/build.gradle', 'mobile/android/gradle/preprocessed_resources/build.gradle')
-        srcdir('preprocessed_resources/src/main/AndroidManifest.xml', 'mobile/android/gradle/preprocessed_resources/AndroidManifest.xml')
-
         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')
-        objdir('app/src/main/AndroidManifest.xml', 'mobile/android/base/AndroidManifest.xml')
-        objdir('app/src/androidTest/AndroidManifest.xml', 'build/mobile/robocop/AndroidManifest.xml')
         srcdir('app/src/androidTest/res', 'build/mobile/robocop/res')
         srcdir('app/src/androidTest/assets', 'mobile/android/tests/browser/robocop/assets')
         # Test code.
         srcdir('app/src/robocop_harness/org/mozilla/gecko', 'build/mobile/robocop')
         srcdir('app/src/robocop/org/mozilla/gecko/tests', 'mobile/android/tests/browser/robocop')
         srcdir('app/src/background/org/mozilla/gecko/background', 'mobile/android/tests/background/junit3/src')
         srcdir('app/src/browser', 'mobile/android/tests/browser/junit3/src')
         srcdir('app/src/javaaddons', 'mobile/android/tests/javaaddons/src')
@@ -150,16 +134,17 @@ class MachCommands(MachCommandBase):
         srcdir('base/src/main/java/org/mozilla/search', 'mobile/android/search/java/org/mozilla/search')
         srcdir('base/src/main/java/org/mozilla/javaaddons', 'mobile/android/javaaddons/java/org/mozilla/javaaddons')
         srcdir('base/src/webrtc_audio_device/java', 'media/webrtc/trunk/webrtc/modules/audio_device/android/java/src')
         srcdir('base/src/webrtc_video_capture/java', 'media/webrtc/trunk/webrtc/modules/video_capture/android/java/src')
         srcdir('base/src/webrtc_video_render/java', 'media/webrtc/trunk/webrtc/modules/video_render/android/java/src')
         srcdir('base/src/main/res', 'mobile/android/base/resources')
         srcdir('base/src/main/assets', 'mobile/android/app/assets')
         srcdir('base/src/crashreporter/res', 'mobile/android/base/crashreporter/res')
+        srcdir('base/src/branding/res', os.path.join(self.substs['MOZ_BRANDING_DIRECTORY'], 'res'))
         # JUnit 4 test code.
         srcdir('base/src/background_junit4', 'mobile/android/tests/background/junit4/src')
         srcdir('base/resources/background_junit4', 'mobile/android/tests/background/junit4/resources')
 
         manifest_path = os.path.join(self.topobjdir, 'mobile', 'android', 'gradle.manifest')
         with FileAvoidWrite(manifest_path) as f:
             m.write(fileobj=f)
 
--- a/mobile/android/tests/browser/chrome/chrome.ini
+++ b/mobile/android/tests/browser/chrome/chrome.ini
@@ -22,13 +22,14 @@ support-files =
 [test_java_addons.html]
 [test_jni.html]
 [test_migrate_ui.html]
 [test_network_manager.html]
 [test_offline_page.html]
 [test_reader_view.html]
 [test_resource_substitutions.html]
 [test_restricted_profiles.html]
+[test_selectoraddtab.html]
 [test_session_form_data.html]
 [test_shared_preferences.html]
 [test_simple_discovery.html]
 [test_video_discovery.html]
 [test_web_channel.html]
new file mode 100644
--- /dev/null
+++ b/mobile/android/tests/browser/chrome/test_selectoraddtab.html
@@ -0,0 +1,105 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1216047
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1216047</title>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://global/skin"/>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+  <script type="application/javascript" src="head.js"></script>
+  <script type="application/javascript;version=1.7">
+
+  "use strict";
+
+  const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
+
+  Cu.import("resource://gre/modules/Services.jsm");
+  Cu.import("resource://gre/modules/Messaging.jsm");
+  Cu.import("resource://gre/modules/Task.jsm");
+
+  function promiseTabEvent(container, eventType) {
+    return new Promise((resolve) => {
+      function handle(event) {
+        info("Received event " + eventType + " from container");
+        container.removeEventListener(eventType, handle, true);
+        resolve(event);
+      }
+
+      container.addEventListener(eventType, handle, true);
+      info("Now waiting for " + eventType + " event from container");
+    });
+  }
+
+  // The chrome window
+  let chromeWin;
+
+  // Track the <browser>s where the tests are happening
+  let browserBlank;
+  let browserTest;
+
+  const kTestPage = "http://mochi.test:8888/chrome/mobile/android/tests/browser/chrome/basic_article.html";
+
+  add_task(function* test_selectOrAdd() {
+    chromeWin = Services.wm.getMostRecentWindow("navigator:browser");
+    let BrowserApp = chromeWin.BrowserApp;
+
+    SimpleTest.registerCleanupFunction(function() {
+      BrowserApp.closeTab(BrowserApp.getTabForBrowser(browserBlank));
+      BrowserApp.closeTab(BrowserApp.getTabForBrowser(browserTest));
+    });
+
+    // Add a new tab with a blank page
+    browserBlank = BrowserApp.addTab("about:blank", { selected: true, parentId: BrowserApp.selectedTab.id }).browser;
+
+    // Now, let's force the target browser to be added
+    browserTest = BrowserApp.selectOrAddTab(kTestPage, { selected: true, parentId: BrowserApp.selectedTab.id }).browser;
+    yield promiseBrowserEvent(browserTest, "DOMContentLoaded");
+
+    // Check that basic_article is now selected
+    is(BrowserApp.selectedBrowser, browserTest, "Target browser is selected after being added.");
+
+    // Switch back to about:blank
+    BrowserApp.selectTab(BrowserApp.getTabForBrowser(browserBlank));
+    yield promiseTabEvent(BrowserApp.deck, "TabSelect");
+
+    // Check that about:blank is selected
+    is(BrowserApp.selectedBrowser, browserBlank, "about:blank is selected.");
+
+    // Use selectOrAddTab to select the existing tab
+    BrowserApp.selectOrAddTab(kTestPage, { selected: true, parentId: BrowserApp.selectedTab.id }).browser;
+    yield promiseTabEvent(BrowserApp.deck, "TabSelect");
+
+    // Check that basic_article is now selected
+    is(BrowserApp.selectedBrowser, browserTest, "Target browser is selected.");
+
+    // Switch back to about:blank
+    BrowserApp.selectTab(BrowserApp.getTabForBrowser(browserBlank));
+    yield promiseTabEvent(BrowserApp.deck, "TabSelect");
+
+    // Check that about:blank is selected
+    is(BrowserApp.selectedBrowser, browserBlank, "about:blank is selected.");
+
+    // Use selectOrAddTab to select the existing tab using the startsWith flag
+    BrowserApp.selectOrAddTab(kTestPage, { selected: true, parentId: BrowserApp.selectedTab.id }, { startsWith: kTestPage }).browser;
+    yield promiseTabEvent(BrowserApp.deck, "TabSelect");
+
+    // Check that basic_article is now selected
+    is(BrowserApp.selectedBrowser, browserTest, "Target browser is selected.");
+  });
+
+  </script>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1216047">Mozilla Bug 1216047</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -4859,19 +4859,19 @@ pref("touchcaret.extendedvisibility", fa
 // Desktop and b2g don't need to open or close the Android
 // TextSelection (Actionbar) utility.
 pref("caret.manages-android-actionbar", false);
 
 // New implementation to unify touch-caret and selection-carets.
 pref("layout.accessiblecaret.enabled", false);
 
 // CSS attributes of the AccessibleCaret in CSS pixels.
-pref("layout.accessiblecaret.width", "44.0");
-pref("layout.accessiblecaret.height", "47.0");
-pref("layout.accessiblecaret.margin-left", "-23.5");
+pref("layout.accessiblecaret.width", "34.0");
+pref("layout.accessiblecaret.height", "36.0");
+pref("layout.accessiblecaret.margin-left", "-18.5");
 pref("layout.accessiblecaret.bar.width", "2.0");
 
 // Timeout in milliseconds to hide the accessiblecaret under cursor mode while
 // no one touches it. Set the value to 0 to disable this feature.
 pref("layout.accessiblecaret.timeout_ms", 3000);
 
 // Simulate long tap to select words on the platforms where APZ is not enabled
 // or long tap events does not fired by APZ.
--- a/testing/taskcluster/tests/test_commit_parser.py
+++ b/testing/taskcluster/tests/test_commit_parser.py
@@ -80,17 +80,21 @@ class TestCommitParser(unittest.TestCase
             },
             'tests': {}
         }
 
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'post-build': [],
+                'interactive': False
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_flag_aliasing(self):
         commit = 'try: -b o -p magic-alias -u none -t none'
@@ -116,17 +120,21 @@ class TestCommitParser(unittest.TestCase
             },
             'tests': {}
         }
 
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
+                'post-build': []
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_try_flag_in_middle_of_commit(self):
         '''
@@ -153,17 +161,21 @@ class TestCommitParser(unittest.TestCase
             },
             'tests': {}
         }
 
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
+                'post-build': []
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
 
     def test_commit_all_builds_no_tests(self):
@@ -190,16 +202,20 @@ class TestCommitParser(unittest.TestCase
             },
             'tests': {}
         }
 
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [],
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
                 'additional-parameters': {}
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_some_test_tasks_restricted(self):
@@ -234,28 +250,36 @@ class TestCommitParser(unittest.TestCase
                 }
             }
         }
 
         expected = [
             {
                 'task': 'task/linux-debug',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'debug',
+                'interactive': False,
             },
             {
                 'task': 'task/linux',
                 'dependents': [{
                     'allowed_build_tasks': {
                         'task/linux': {
                             'task':'task/web-platform-tests'
                         }
                     }
                 }],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_specific_test_platforms(self):
         '''
@@ -311,22 +335,30 @@ class TestCommitParser(unittest.TestCase
                 }
             }
         }
 
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
             },
             {
                 'task': 'task/linux-debug',
                 'dependents': [],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'debug',
+                'interactive': False,
             },
             {
                 'task': 'task/win32',
                 'dependents': [
                     {
                         'allowed_build_tasks': {
                             'task/linux': {
                                 'task': 'task/web-platform-tests',
@@ -342,17 +374,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/mochitest',
                             },
                             'task/win32': {
                                 'task': 'task/mochitest',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'win32',
+                'build_type': 'opt',
+                'interactive': False,
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_specific_test_platforms_with_specific_platform(self):
         '''
@@ -418,17 +454,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/mochitest',
                             },
                             'task/win32': {
                                 'task': 'task/mochitest',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'win32',
+                'build_type': 'opt',
+                'interactive': False,
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_specific_chunks(self):
         '''
@@ -473,17 +513,21 @@ class TestCommitParser(unittest.TestCase
                             'task/linux': {
                                 'task': 'task/mochitest',
                                 'chunks': 5,
                                 'only_chunks': set([1, 2])
                             },
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'post-build': [],
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'interactive': False,
             }
         ]
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
     def test_commit_with_builds_and_tests(self):
         '''
         This test covers the broad case of a commit which has both builds and
@@ -677,17 +721,16 @@ class TestCommitParser(unittest.TestCase
                         },
                         'task/linux64-debug': {
                             'task': 'task/web-platform-tests',
                         }
                     }
                 }
             }
         }
-
         expected = [
             {
                 'task': 'task/linux',
                 'dependents': [
                     {
                         'allowed_build_tasks': {
                             'task/linux': {
                                 'task': 'task/web-platform-tests',
@@ -699,17 +742,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/web-platform-tests',
                             },
                             'task/linux64-debug': {
                                 'task': 'task/web-platform-tests',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux',
+                'build_type': 'opt',
+                'post-build': [],
+                'interactive': False
             },
             {
                 'task': 'task/linux-debug',
                 'dependents': [
                     {
                         'allowed_build_tasks': {
                             'task/linux': {
                                 'task': 'task/web-platform-tests',
@@ -721,17 +768,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/web-platform-tests',
                             },
                             'task/linux64-debug': {
                                 'task': 'task/web-platform-tests',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux',
+                'build_type': 'debug',
+                'post-build': [],
+                'interactive': False
             },
             {
                 'task': 'task/linux64',
                 'dependents': [
                     {
                         'allowed_build_tasks': {
                             'task/linux': {
                                 'task': 'task/web-platform-tests',
@@ -743,17 +794,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/web-platform-tests',
                             },
                             'task/linux64-debug': {
                                 'task': 'task/web-platform-tests',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux64',
+                'build_type': 'opt',
+                'post-build': [],
+                'interactive': False
             },
             {
                 'task': 'task/linux64-debug',
                 'dependents': [
                     {
                         'allowed_build_tasks': {
                             'task/linux': {
                                 'task': 'task/web-platform-tests',
@@ -765,17 +820,21 @@ class TestCommitParser(unittest.TestCase
                                 'task': 'task/web-platform-tests',
                             },
                             'task/linux64-debug': {
                                 'task': 'task/web-platform-tests',
                             }
                         }
                     }
                 ],
-                'additional-parameters': {}
+                'additional-parameters': {},
+                'build_name': 'linux64',
+                'build_type': 'debug',
+                'post-build': [],
+                'interactive': False
             }
         ]
 
         result = parse_commit(commit, jobs)
         self.assertEqual(expected, result)
 
 
 if __name__ == '__main__':
--- a/toolkit/components/alerts/nsAlertsUtils.cpp
+++ b/toolkit/components/alerts/nsAlertsUtils.cpp
@@ -5,58 +5,27 @@
 #include "nsAlertsUtils.h"
 
 #include "nsCOMPtr.h"
 #include "nsContentUtils.h"
 #include "nsIStringBundle.h"
 #include "nsIURI.h"
 #include "nsXPIDLString.h"
 
-#define ALERTS_BUNDLE "chrome://alerts/locale/alert.properties"
-
 /* static */
 bool
 nsAlertsUtils::IsActionablePrincipal(nsIPrincipal* aPrincipal)
 {
   return aPrincipal &&
          !nsContentUtils::IsSystemOrExpandedPrincipal(aPrincipal) &&
          !aPrincipal->GetIsNullPrincipal();
 }
 
 /* static */
 void
-nsAlertsUtils::GetSource(nsIPrincipal* aPrincipal, nsAString& aSource)
-{
-  nsAutoString hostPort;
-  GetSourceHostPort(aPrincipal, hostPort);
-  if (hostPort.IsEmpty()) {
-    return;
-  }
-  nsCOMPtr<nsIStringBundleService> stringService(
-    mozilla::services::GetStringBundleService());
-  if (!stringService) {
-    return;
-  }
-  nsCOMPtr<nsIStringBundle> alertsBundle;
-  if (NS_WARN_IF(NS_FAILED(stringService->CreateBundle(ALERTS_BUNDLE,
-      getter_AddRefs(alertsBundle))))) {
-    return;
-  }
-  const char16_t* params[1] = { hostPort.get() };
-  nsXPIDLString result;
-  if (NS_WARN_IF(NS_FAILED(
-      alertsBundle->FormatStringFromName(MOZ_UTF16("source.label"), params, 1,
-      getter_Copies(result))))) {
-    return;
-  }
-  aSource = result;
-}
-
-/* static */
-void
 nsAlertsUtils::GetSourceHostPort(nsIPrincipal* aPrincipal,
                                  nsAString& aHostPort)
 {
   if (!IsActionablePrincipal(aPrincipal)) {
     return;
   }
   nsCOMPtr<nsIURI> principalURI;
   if (NS_WARN_IF(NS_FAILED(
--- a/toolkit/components/alerts/nsAlertsUtils.h
+++ b/toolkit/components/alerts/nsAlertsUtils.h
@@ -18,22 +18,15 @@ public:
    * Indicates whether an alert from |aPrincipal| should include the source
    * string and action buttons. Returns false if |aPrincipal| is |nullptr|, or
    * a system, expanded, or null principal.
    */
   static bool
   IsActionablePrincipal(nsIPrincipal* aPrincipal);
 
   /**
-   * Sets |aSource| to the localized notification source string, or an empty
-   * string if |aPrincipal| is not actionable.
-   */
-  static void
-  GetSource(nsIPrincipal* aPrincipal, nsAString& aSource);
-
-  /**
    * Sets |aHostPort| to the host and port from |aPrincipal|'s URI, or an
    * empty string if |aPrincipal| is not actionable.
    */
   static void
   GetSourceHostPort(nsIPrincipal* aPrincipal, nsAString& aHostPort);
 };
 #endif /* nsAlertsUtils_h */
--- a/toolkit/components/alerts/nsXULAlerts.cpp
+++ b/toolkit/components/alerts/nsXULAlerts.cpp
@@ -140,17 +140,17 @@ nsXULAlerts::ShowAlertNotification(const
   rv = argsArray->AppendElement(ifptr);
   NS_ENSURE_SUCCESS(rv, rv);
 
   // The source contains the host and port of the site that sent the
   // notification. It is empty for system alerts.
   nsCOMPtr<nsISupportsString> scriptableAlertSource (do_CreateInstance(NS_SUPPORTS_STRING_CONTRACTID));
   NS_ENSURE_TRUE(scriptableAlertSource, NS_ERROR_FAILURE);
   nsAutoString source;
-  nsAlertsUtils::GetSource(aPrincipal, source);
+  nsAlertsUtils::GetSourceHostPort(aPrincipal, source);
   scriptableAlertSource->SetData(source);
   rv = argsArray->AppendElement(scriptableAlertSource);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsCOMPtr<nsIDOMWindow> newWindow;
   nsAutoCString features("chrome,dialog=yes,titlebar=no,popup=yes");
   if (aInPrivateBrowsing) {
     features.AppendLiteral(",private");
--- a/toolkit/components/alerts/resources/content/alert.js
+++ b/toolkit/components/alerts/resources/content/alert.js
@@ -27,24 +27,38 @@ function prefillAlertInfo() {
   // arguments[2] --> the alert text
   // arguments[3] --> is the text clickable?
   // arguments[4] --> the alert cookie to be passed back to the listener
   // arguments[5] --> the alert origin reported by the look and feel
   // arguments[6] --> bidi
   // arguments[7] --> lang
   // arguments[8] --> replaced alert window (nsIDOMWindow)
   // arguments[9] --> an optional callback listener (nsIObserver)
-  // arguments[10] -> the localized alert source string
+  // arguments[10] -> the nsIURI.hostPort of the origin, optional
 
   switch (window.arguments.length) {
     default:
     case 11: {
       if (window.arguments[10]) {
-        document.getElementById('alertBox').setAttribute('hasOrigin', true);
-        document.getElementById('alertSourceLabel').setAttribute('value', window.arguments[10]);
+        let alertBox = document.getElementById("alertBox");
+        alertBox.setAttribute("hasOrigin", true);
+
+        let hostPort = window.arguments[10];
+        const ALERT_BUNDLE = Services.strings.createBundle(
+          "chrome://alerts/locale/alert.properties");
+        let label = document.getElementById("alertSourceLabel");
+        label.setAttribute("value",
+          ALERT_BUNDLE.formatStringFromName("source.label",
+                                            [hostPort],
+                                            1));
+        let disableForOrigin = document.getElementById("disableForOriginMenuItem");
+        disableForOrigin.setAttribute("label",
+          ALERT_BUNDLE.formatStringFromName("webActions.disableForOrigin.label",
+                                            [hostPort],
+                                            1));
       }
     }
     case 10:
       gAlertListener = window.arguments[9];
     case 9:
       gReplacedWindow = window.arguments[8];
     case 8:
       if (window.arguments[7]) {
@@ -212,16 +226,21 @@ function onAlertClick() {
   if (alertBox.getAttribute("animate") == "true") {
     // Closed when the animation ends.
     alertBox.setAttribute("clicked", "true");
   } else {
     window.close();
   }
 }
 
+function disableForOrigin() {
+  gAlertListener.observe(null, "alertdisablecallback", gAlertCookie);
+  onAlertClose();
+}
+
 function onAlertClose() {
   let alertBox = document.getElementById("alertBox");
   if (alertBox.getAttribute("animate") == "true") {
     // Closed when the animation ends.
     alertBox.setAttribute("closing", "true");
   } else {
     window.close();
   }
--- a/toolkit/components/alerts/resources/content/alert.xul
+++ b/toolkit/components/alerts/resources/content/alert.xul
@@ -38,17 +38,23 @@
         <image id="alertImage"/>
       </hbox>
 
       <vbox id="alertTextBox" class="alertTextBox">
         <label id="alertTextLabel" class="alertText plain"/>
         <spacer flex="1"/>
         <box id="alertFooter">
           <label id="alertSourceLabel" class="alertSource plain"/>
-          <button type="menu" id="alertSettings" tooltiptext="&settings.label;"/>
+          <button type="menu" id="alertSettings" tooltiptext="&settings.label;"
+                  onclick="event.stopPropagation();">
+            <menupopup position="after_end">
+              <menuitem id="disableForOriginMenuItem"
+                        oncommand="disableForOrigin();"/>
+            </menupopup>
+          </button>
         </box>
       </vbox>
     </box>
   </vbox>
 
   <!-- This method is called inline because we want to make sure we establish the width
        and height of the alert before we fire the onload handler. -->
   <script type="application/javascript">prefillAlertInfo();</script>
--- a/toolkit/locales/en-US/chrome/alerts/alert.properties
+++ b/toolkit/locales/en-US/chrome/alerts/alert.properties
@@ -3,15 +3,17 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 # LOCALIZATION NOTE(closeButton.title): Used as the close button text for web notifications on OS X.
 # This should ideally match the string that OS X uses for the close button on alert-type
 # notifications. OS X will truncate the value if it's too long.
 closeButton.title = Close
 # LOCALIZATION NOTE(actionButton.label): Used as the button label to provide more actions on OS X notifications. OS X will truncate this if it's too long.
 actionButton.label = …
-webActions.disable.label = Disable notifications from this site
+# LOCALIZATION NOTE(webActions.disableForOrigin.label): %S is replaced
+# with the hostname origin of the notification.
+webActions.disableForOrigin.label = Disable notifications from %S
 
 # LOCALIZATION NOTE(source.label): Used to show the URL of the site that
 # sent the notification (e.g., "via mozilla.org"). "%1$S" is the source host
 # and port.
 source.label=via %1$S
 webActions.settings.label = Notification settings
--- a/toolkit/themes/shared/alert-common.css
+++ b/toolkit/themes/shared/alert-common.css
@@ -60,25 +60,24 @@ label {
 }
 
 #alertSettings {
   -moz-appearance: none;
   background-color: transparent;
   border-width: 0;
   min-width: 0;
   list-style-image: url("chrome://mozapps/skin/extensions/utilities.svg#utilities");
-  visibility: hidden; /* Temporary until bug 1209602 or bug 1205172 is fixed. */
 }
 
 #alertSettings:hover {
   background-color: rgba(107,107,107,.2);
   border-radius: 20px;
 }
 
-#alertSettings["open"],
+#alertSettings[open],
 #alertSettings:hover:active {
   background-color: rgba(107,107,107,.4);
 }
 
 #alertSettings > .button-box > .button-menu-dropmarker,
 #alertSettings > .button-box > .box-inherit > .button-text {
   display: none;
 }
--- a/widget/cocoa/OSXNotificationCenter.mm
+++ b/widget/cocoa/OSXNotificationCenter.mm
@@ -240,37 +240,49 @@ OSXNotificationCenter::ShowAlertNotifica
   NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
 
   Class unClass = NSClassFromString(@"NSUserNotification");
   id<FakeNSUserNotification> notification = [[unClass alloc] init];
   notification.title = nsCocoaUtils::ToNSString(aAlertTitle);
 
   nsAutoString hostPort;
   nsAlertsUtils::GetSourceHostPort(aPrincipal, hostPort);
+  nsCOMPtr<nsIStringBundle> bundle;
+  nsCOMPtr<nsIStringBundleService> sbs = do_GetService(NS_STRINGBUNDLE_CONTRACTID);
+  nsresult rv = sbs->CreateBundle("chrome://alerts/locale/alert.properties", getter_AddRefs(bundle));
+
   if (!hostPort.IsEmpty()) {
-    notification.subtitle = nsCocoaUtils::ToNSString(hostPort);
+    const char16_t* formatStrings[] = { hostPort.get() };
+    nsXPIDLString notificationSource;
+    bundle->FormatStringFromName(NS_LITERAL_STRING("source.label").get(),
+                                 formatStrings,
+                                 ArrayLength(formatStrings),
+                                 getter_Copies(notificationSource));
+    notification.subtitle = nsCocoaUtils::ToNSString(notificationSource);
   }
 
   notification.informativeText = nsCocoaUtils::ToNSString(aAlertText);
   notification.soundName = NSUserNotificationDefaultSoundName;
   notification.hasActionButton = NO;
 
   // If this is not an application/extension alert, show additional actions dealing with permissions.
   if (nsAlertsUtils::IsActionablePrincipal(aPrincipal)) {
-    nsCOMPtr<nsIStringBundleService> sbs = do_GetService(NS_STRINGBUNDLE_CONTRACTID);
-    nsCOMPtr<nsIStringBundle> bundle;
-    nsresult rv = sbs->CreateBundle("chrome://alerts/locale/alert.properties", getter_AddRefs(bundle));
     if (NS_SUCCEEDED(rv)) {
       nsXPIDLString closeButtonTitle, actionButtonTitle, disableButtonTitle, settingsButtonTitle;
       bundle->GetStringFromName(NS_LITERAL_STRING("closeButton.title").get(),
                                 getter_Copies(closeButtonTitle));
       bundle->GetStringFromName(NS_LITERAL_STRING("actionButton.label").get(),
                                 getter_Copies(actionButtonTitle));
-      bundle->GetStringFromName(NS_LITERAL_STRING("webActions.disable.label").get(),
-                                getter_Copies(disableButtonTitle));
+      if (!hostPort.IsEmpty()) {
+        const char16_t* formatStrings[] = { hostPort.get() };
+        bundle->FormatStringFromName(NS_LITERAL_STRING("webActions.disableForOrigin.label").get(),
+                                     formatStrings,
+                                     ArrayLength(formatStrings),
+                                     getter_Copies(disableButtonTitle));
+      }
       bundle->GetStringFromName(NS_LITERAL_STRING("webActions.settings.label").get(),
                                 getter_Copies(settingsButtonTitle));
 
       notification.hasActionButton = YES;
       notification.otherButtonTitle = nsCocoaUtils::ToNSString(closeButtonTitle);
       notification.actionButtonTitle = nsCocoaUtils::ToNSString(actionButtonTitle);
       [(NSObject*)notification setValue:@(YES) forKey:@"_showsButtons"];
       [(NSObject*)notification setValue:@(YES) forKey:@"_alwaysShowAlternateActionMenu"];