Merge b2g-inbound to m-c a=merge CLOSED TREE
authorWes Kocher <wkocher@mozilla.com>
Wed, 22 Apr 2015 15:44:51 -0700
changeset 240379 a9311ec2dd398db8ef77d23ecfefd05f584c542f
parent 240363 ef1fb0e0911d821a25b4092b151ae391f02a4f33 (current diff)
parent 240378 ba1dd0773b981f65d44d4233d1426906da2686be (diff)
child 240608 a5af73b32ac80d81490a9007708333bab37b9cc7
push id28635
push userkwierso@gmail.com
push dateWed, 22 Apr 2015 22:44:59 +0000
treeherdermozilla-central@a9311ec2dd39 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone40.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 b2g-inbound to m-c a=merge CLOSED TREE
--- 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="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
--- 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="173b3104bfcbd23fc9dccd4b0035fc49aae3d444">
     <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="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="9a9797062c6001d6346504161c51187a2968466b"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="46e1877c0d88b085f7ebc5f432d5bb8f1e2d1f3b"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="4efd19d199ae52656604f794c5a77518400220fd">
     <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="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
--- 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="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
--- 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="173b3104bfcbd23fc9dccd4b0035fc49aae3d444">
     <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="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="9a9797062c6001d6346504161c51187a2968466b"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="46e1877c0d88b085f7ebc5f432d5bb8f1e2d1f3b"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
--- a/b2g/config/flame/sources.xml
+++ b/b2g/config/flame/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="4efd19d199ae52656604f794c5a77518400220fd">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="e95b4ce22c825da44d14299e1190ea39a5260bde"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="471afab478649078ad7c75ec6b252481a59e19b8"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "a7dcc5fb595030dab140d5ff0e7eb5ef04017d51", 
+        "git_revision": "9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "5e00921aa36301b179b4912d352e6bcc0de89edc", 
+    "revision": "6238380e300e25c4ec8aea2a8804d0ca3675f7fb", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="4efd19d199ae52656604f794c5a77518400220fd">
     <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="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/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="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="a7dcc5fb595030dab140d5ff0e7eb5ef04017d51"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="9d4f756aa35cb7f030a92f3c1f65fb55254ddd1d"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="d3868ff4bb3a4b81382795e2784258c210fe6cb8"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="adb24954bf8068f21705b570450475d183336b2d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="90f848a40efad820ab00fa52bec52dff37255b12"/>
--- a/dom/bluetooth/BluetoothInterface.h
+++ b/dom/bluetooth/BluetoothInterface.h
@@ -707,16 +707,17 @@ public:
   /* Start / Stop LE Scan */
   virtual void Scan(int aClientIf, bool aStart,
                     BluetoothGattClientResultHandler* aRes) = 0;
 
   /* Connect / Disconnect */
   virtual void Connect(int aClientIf,
                        const nsAString& aBdAddr,
                        bool aIsDirect, /* auto connect */
+                       BluetoothTransport aTransport,
                        BluetoothGattClientResultHandler* aRes) = 0;
   virtual void Disconnect(int aClientIf,
                           const nsAString& aBdAddr,
                           int aConnId,
                           BluetoothGattClientResultHandler* aRes) = 0;
 
   /* Start / Stop advertisements to listen for incoming connections */
   virtual void Listen(int aClientIf,
@@ -811,16 +812,20 @@ public:
                           bool aIsScanRsp,
                           bool aIsNameIncluded,
                           bool aIsTxPowerIncluded,
                           int aMinInterval,
                           int aMaxInterval,
                           int aApperance,
                           uint8_t aManufacturerLen,
                           const ArrayBuffer& aManufacturerData,
+                          uint8_t aServiceDataLen,
+                          const ArrayBuffer& aServiceData,
+                          uint8_t aServiceUUIDLen,
+                          const ArrayBuffer& aServiceUUID,
                           BluetoothGattClientResultHandler* aRes) = 0;
 
 protected:
   BluetoothGattClientInterface();
   virtual ~BluetoothGattClientInterface();
 };
 
 // TODO: Add GattServerInterface
--- a/dom/bluetooth/bluedroid/BluetoothGattHALInterface.cpp
+++ b/dom/bluetooth/bluedroid/BluetoothGattHALInterface.cpp
@@ -509,36 +509,49 @@ BluetoothGattClientHALInterface::Unregis
       ConvertDefault(status, STATUS_FAIL));
   }
 }
 
 void
 BluetoothGattClientHALInterface::Scan(
   int aClientIf, bool aStart, BluetoothGattClientResultHandler* aRes)
 {
-#if ANDROID_VERSION >= 19
+#if ANDROID_VERSION >= 21
+  int status = mInterface->scan(aStart);
+#elif ANDROID_VERSION >= 19
   int status = mInterface->scan(aClientIf, aStart);
 #else
   int status = BT_STATUS_UNSUPPORTED;
 #endif
 
   if (aRes) {
     DispatchBluetoothGattClientHALResult(
       aRes, &BluetoothGattClientResultHandler::Scan,
       ConvertDefault(status, STATUS_FAIL));
   }
 }
 
 void
 BluetoothGattClientHALInterface::Connect(
   int aClientIf, const nsAString& aBdAddr,
-  bool aIsDirect, BluetoothGattClientResultHandler* aRes)
+  bool aIsDirect, BluetoothTransport aTransport,
+  BluetoothGattClientResultHandler* aRes)
 {
   bt_status_t status;
-#if ANDROID_VERSION >= 19
+#if ANDROID_VERSION >= 21
+  bt_bdaddr_t bdAddr;
+  btgatt_transport_t transport;
+
+  if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr)) ||
+      NS_SUCCEEDED(Convert(aTransport, transport))) {
+    status = mInterface->connect(aClientIf, &bdAddr, aIsDirect, transport);
+  } else {
+    status = BT_STATUS_PARM_INVALID;
+  }
+#elif ANDROID_VERSION >= 19
   bt_bdaddr_t bdAddr;
 
   if (NS_SUCCEEDED(Convert(aBdAddr, bdAddr))) {
     status = mInterface->connect(aClientIf, &bdAddr, aIsDirect);
   } else {
     status = BT_STATUS_PARM_INVALID;
   }
 #else
@@ -1014,20 +1027,44 @@ BluetoothGattClientHALInterface::GetDevi
   }
 }
 
 void
 BluetoothGattClientHALInterface::SetAdvData(
   int aServerIf, bool aIsScanRsp, bool aIsNameIncluded,
   bool aIsTxPowerIncluded, int aMinInterval, int aMaxInterval, int aApperance,
   uint8_t aManufacturerLen, const ArrayBuffer& aManufacturerData,
+  uint8_t aServiceDataLen, const ArrayBuffer& aServiceData,
+  uint8_t aServiceUUIDLen, const ArrayBuffer& aServiceUUID,
   BluetoothGattClientResultHandler* aRes)
 {
+  /* FIXME: This method allocates a large amount of memory on the
+   * stack. It should be rewritten to prevent the pending stack
+   * overflow. Additionally |ArrayBuffer| seems like the wrong data
+   * type here. Why not use plain pointers instead?
+   */
+
   bt_status_t status;
-#if ANDROID_VERSION >= 19
+#if ANDROID_VERSION >= 21
+  char manufacturerData[aManufacturerLen + 1];
+  char serviceData[aServiceDataLen + 1];
+  char serviceUUID[aServiceUUIDLen + 1];
+
+  if (NS_SUCCEEDED(Convert(aManufacturerData, manufacturerData)) ||
+      NS_SUCCEEDED(Convert(aServiceData, serviceData)) ||
+      NS_SUCCEEDED(Convert(aServiceUUID, serviceUUID))) {
+    status = mInterface->set_adv_data(
+      aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded,
+      aMinInterval, aMaxInterval, aApperance,
+      aManufacturerLen, manufacturerData,
+      aServiceDataLen, serviceData, aServiceUUIDLen, serviceUUID);
+  } else {
+    status = BT_STATUS_PARM_INVALID;
+  }
+#elif ANDROID_VERSION >= 19
   char value[aManufacturerLen + 1];
 
   if (NS_SUCCEEDED(Convert(aManufacturerData, value))) {
     status = mInterface->set_adv_data(
       aServerIf, aIsScanRsp, aIsNameIncluded, aIsTxPowerIncluded, aMinInterval,
       aMaxInterval, aApperance, aManufacturerLen, value);
   } else {
     status = BT_STATUS_PARM_INVALID;
--- a/dom/bluetooth/bluedroid/BluetoothGattHALInterface.h
+++ b/dom/bluetooth/bluedroid/BluetoothGattHALInterface.h
@@ -33,16 +33,17 @@ public:
   /* Start / Stop LE Scan */
   void Scan(int aClientIf, bool aStart,
             BluetoothGattClientResultHandler* aRes);
 
   /* Connect / Disconnect */
   void Connect(int aClientIf,
                const nsAString& aBdAddr,
                bool aIsDirect, /* auto connect */
+               BluetoothTransport aTransport,
                BluetoothGattClientResultHandler* aRes);
   void Disconnect(int aClientIf,
                   const nsAString& aBdAddr,
                   int aConnId,
                   BluetoothGattClientResultHandler* aRes);
 
   /* Start / Stop advertisements to listen for incoming connections */
   void Listen(int aClientIf,
@@ -134,16 +135,18 @@ public:
                   bool aIsScanRsp,
                   bool aIsNameIncluded,
                   bool aIsTxPowerIncluded,
                   int aMinInterval,
                   int aMaxInterval,
                   int aApperance,
                   uint8_t aManufacturerLen,
                   const ArrayBuffer& aManufacturerData,
+                  uint8_t aServiceDataLen, const ArrayBuffer& aServiceData,
+                  uint8_t aServiceUUIDLen, const ArrayBuffer& aServiceUUID,
                   BluetoothGattClientResultHandler* aRes);
 
 protected:
   BluetoothGattClientHALInterface(
 #if ANDROID_VERSION >= 19
     const btgatt_client_interface_t* aInterface
 #endif
     );
--- a/dom/bluetooth/bluedroid/BluetoothGattManager.cpp
+++ b/dom/bluetooth/bluedroid/BluetoothGattManager.cpp
@@ -134,31 +134,16 @@ public:
 
   BluetoothGattClient(const nsAString& aAppUuid, const nsAString& aDeviceAddr)
   : mAppUuid(aAppUuid)
   , mDeviceAddr(aDeviceAddr)
   , mClientIf(0)
   , mConnId(0)
   { }
 
-  ~BluetoothGattClient()
-  {
-    mConnectRunnable = nullptr;
-    mDisconnectRunnable = nullptr;
-    mDiscoverRunnable = nullptr;
-    mUnregisterClientRunnable = nullptr;
-    mReadRemoteRssiRunnable = nullptr;
-    mRegisterNotificationsRunnable = nullptr;
-    mDeregisterNotificationsRunnable = nullptr;
-    mReadCharacteristicState.Reset();
-    mWriteCharacteristicState.Reset();
-    mReadDescriptorState.Reset();
-    mWriteDescriptorState.Reset();
-  }
-
   void NotifyDiscoverCompleted(bool aSuccess)
   {
     MOZ_ASSERT(!mAppUuid.IsEmpty());
     MOZ_ASSERT(mDiscoverRunnable);
 
     BluetoothService* bs = BluetoothService::Get();
     NS_ENSURE_TRUE_VOID(bs);
 
@@ -204,16 +189,20 @@ public:
   /**
    * These temporary arrays are used only during discover operations.
    * All of them are empty if there are no ongoing discover operations.
    */
   nsTArray<BluetoothGattServiceId> mServices;
   nsTArray<BluetoothGattServiceId> mIncludedServices;
   nsTArray<BluetoothGattCharAttribute> mCharacteristics;
   nsTArray<BluetoothGattId> mDescriptors;
+
+private:
+  ~BluetoothGattClient()
+  { }
 };
 
 NS_IMPL_ISUPPORTS0(BluetoothGattClient)
 
 class UuidComparator
 {
 public:
   bool Equals(const nsRefPtr<BluetoothGattClient>& aClient,
@@ -552,16 +541,17 @@ BluetoothGattManager::Connect(const nsAS
 
   nsRefPtr<BluetoothGattClient> client = sClients->ElementAt(index);
   client->mConnectRunnable = aRunnable;
 
   if (client->mClientIf > 0) {
     sBluetoothGattClientInterface->Connect(client->mClientIf,
                                            aDeviceAddr,
                                            true, // direct connect
+                                           TRANSPORT_AUTO,
                                            new ConnectResultHandler(client));
   } else {
     BluetoothUuid uuid;
     StringToUuid(NS_ConvertUTF16toUTF8(aAppUuid).get(), uuid);
 
     // connect will be proceeded after client registered
     sBluetoothGattClientInterface->RegisterClient(
       uuid, new RegisterClientResultHandler(client));
@@ -1262,16 +1252,17 @@ BluetoothGattManager::RegisterClientNoti
   bs->DistributeSignal(
     NS_LITERAL_STRING("ClientRegistered"),
     uuid, BluetoothValue(uint32_t(aClientIf)));
 
   // Client just registered, proceed remaining connect request.
   if (client->mConnectRunnable) {
     sBluetoothGattClientInterface->Connect(
       aClientIf, client->mDeviceAddr, true /* direct connect */,
+      TRANSPORT_AUTO,
       new ConnectResultHandler(client));
   }
 }
 
 void
 BluetoothGattManager::ScanResultNotification(
   const nsAString& aBdAddr, int aRssi,
   const BluetoothGattAdvData& aAdvData)
--- a/dom/bluetooth/bluedroid/BluetoothGattManager.h
+++ b/dom/bluetooth/bluedroid/BluetoothGattManager.h
@@ -21,17 +21,16 @@ class BluetoothGattManager final : publi
 {
 public:
   NS_DECL_ISUPPORTS
   NS_DECL_NSIOBSERVER
 
   static BluetoothGattManager* Get();
   static void InitGattInterface(BluetoothProfileResultHandler* aRes);
   static void DeinitGattInterface(BluetoothProfileResultHandler* aRes);
-  virtual ~BluetoothGattManager();
 
   void Connect(const nsAString& aAppUuid,
                const nsAString& aDeviceAddr,
                BluetoothReplyRunnable* aRunnable);
 
   void Disconnect(const nsAString& aAppUuid,
                   const nsAString& aDeviceAddr,
                   BluetoothReplyRunnable* aRunnable);
@@ -81,16 +80,18 @@ public:
     const nsAString& aAppUuid,
     const BluetoothGattServiceId& aServiceId,
     const BluetoothGattId& aCharacteristicId,
     const BluetoothGattId& aDescriptorId,
     const nsTArray<uint8_t>& aValue,
     BluetoothReplyRunnable* aRunnable);
 
 private:
+  ~BluetoothGattManager();
+
   class CleanupResultHandler;
   class CleanupResultHandlerRunnable;
   class InitGattResultHandler;
   class RegisterClientResultHandler;
   class UnregisterClientResultHandler;
   class ConnectResultHandler;
   class DisconnectResultHandler;
   class DiscoverResultHandler;
--- a/dom/bluetooth/bluedroid/BluetoothHALHelpers.cpp
+++ b/dom/bluetooth/bluedroid/BluetoothHALHelpers.cpp
@@ -321,16 +321,34 @@ Convert(const btgatt_notify_params_t& aI
 
   memcpy(aOut.mValue, aIn.value, aIn.len);
   aOut.mLength = aIn.len;
   aOut.mIsNotify = (aIn.is_notify != 0);
 
   return NS_OK;
 }
 #endif // ANDROID_VERSION >= 19
+
+#if ANDROID_VERSION >= 21
+nsresult
+Convert(const BluetoothTransport& aIn, btgatt_transport_t& aOut)
+{
+  static const btgatt_transport_t sTransport[] = {
+    CONVERT(TRANSPORT_AUTO, GATT_TRANSPORT_AUTO),
+    CONVERT(TRANSPORT_BREDR, GATT_TRANSPORT_BREDR),
+    CONVERT(TRANSPORT_LE, GATT_TRANSPORT_LE)
+  };
+  if (aIn >= MOZ_ARRAY_LENGTH(sTransport)) {
+    aOut = static_cast<btgatt_transport_t>(0); // silence compiler warning
+    return NS_ERROR_ILLEGAL_VALUE;
+  }
+  aOut = sTransport[aIn];
+  return NS_OK;
+}
+#endif
 #else
 // TODO: Support GATT
 #endif
 
 #if ANDROID_VERSION >= 21
 nsresult
 Convert(const bt_activity_energy_info& aIn, BluetoothActivityEnergyInfo& aOut)
 {
--- a/dom/bluetooth/bluedroid/BluetoothHALHelpers.h
+++ b/dom/bluetooth/bluedroid/BluetoothHALHelpers.h
@@ -900,16 +900,21 @@ Convert(const btgatt_notify_params_t& aI
 
 inline nsresult
 Convert(const ArrayBuffer& aIn, char* aOut)
 {
   aIn.ComputeLengthAndData();
   memcpy(aOut, aIn.Data(), aIn.Length());
   return NS_OK;
 }
+
+#if ANDROID_VERSION >= 21
+nsresult
+Convert(const BluetoothTransport& aIn, btgatt_transport_t& aOut);
+#endif
 #else
 // TODO: Support GATT
 #endif
 
 #if ANDROID_VERSION >= 21
 inline nsresult
 Convert(BluetoothTransport aIn, int& aOut)
 {
--- a/dom/bluetooth/bluetooth2/BluetoothProfileController.cpp
+++ b/dom/bluetooth/bluetooth2/BluetoothProfileController.cpp
@@ -34,22 +34,22 @@ public:
   NS_DECL_NSITIMERCALLBACK
 
   CheckProfileStatusCallback(BluetoothProfileController* aController)
     : mController(aController)
   {
     MOZ_ASSERT(aController);
   }
 
+private:
   virtual ~CheckProfileStatusCallback()
   {
     mController = nullptr;
   }
 
-private:
   nsRefPtr<BluetoothProfileController> mController;
 };
 
 BluetoothProfileController::BluetoothProfileController(
                                    bool aConnect,
                                    const nsAString& aDeviceAddress,
                                    BluetoothReplyRunnable* aRunnable,
                                    BluetoothProfileControllerCallback aCallback,
--- a/dom/bluetooth/bluetooth2/BluetoothService.cpp
+++ b/dom/bluetooth/bluetooth2/BluetoothService.cpp
@@ -162,16 +162,20 @@ public:
     return NS_OK;
   }
 
   NS_IMETHOD HandleError(const nsAString& aName)
   {
     BT_WARNING("Unable to get value for '" BLUETOOTH_ENABLED_SETTING "'");
     return NS_OK;
   }
+
+private:
+  ~StartupTask()
+  { }
 };
 
 NS_IMPL_ISUPPORTS(BluetoothService::StartupTask, nsISettingsServiceCallback);
 
 NS_IMPL_ISUPPORTS(BluetoothService, nsIObserver)
 
 bool
 BluetoothService::IsToggling() const
--- a/dom/telephony/TelephonyCall.cpp
+++ b/dom/telephony/TelephonyCall.cpp
@@ -82,55 +82,55 @@ TelephonyCall::WrapObject(JSContext* aCx
   return TelephonyCallBinding::Wrap(aCx, this, aGivenProto);
 }
 
 void
 TelephonyCall::ChangeStateInternal(uint16_t aCallState, bool aFireEvents)
 {
   nsRefPtr<TelephonyCall> kungFuDeathGrip(this);
 
-  nsString stateString;
+  // Update the internal state.
+  mCallState = aCallState;
+
+  // Indicate whether the external state have been changed.
+  bool externalStateChanged = true;
   switch (aCallState) {
     // These states are used internally to mark this call is currently being
     // controlled, and we should block consecutive requests of the same type
     // according to these states.
     case nsITelephonyService::CALL_STATE_CONNECTING:
     case nsITelephonyService::CALL_STATE_DISCONNECTING:
     case nsITelephonyService::CALL_STATE_HOLDING:
     case nsITelephonyService::CALL_STATE_RESUMING:
+      externalStateChanged = false;
       break;
     // These states will be translated into literal strings which are used to
     // show the current status of this call.
     case nsITelephonyService::CALL_STATE_DIALING:
-      stateString.AssignLiteral("dialing");
+      mState.AssignLiteral("dialing");
       break;
     case nsITelephonyService::CALL_STATE_ALERTING:
-      stateString.AssignLiteral("alerting");
+      mState.AssignLiteral("alerting");
       break;
     case nsITelephonyService::CALL_STATE_CONNECTED:
-      stateString.AssignLiteral("connected");
+      mState.AssignLiteral("connected");
       break;
     case nsITelephonyService::CALL_STATE_HELD:
-      stateString.AssignLiteral("held");
+      mState.AssignLiteral("held");
       break;
     case nsITelephonyService::CALL_STATE_DISCONNECTED:
-      stateString.AssignLiteral("disconnected");
+      mState.AssignLiteral("disconnected");
       break;
     case nsITelephonyService::CALL_STATE_INCOMING:
-      stateString.AssignLiteral("incoming");
+      mState.AssignLiteral("incoming");
       break;
     default:
       NS_NOTREACHED("Unknown state!");
   }
 
-  mCallState = aCallState;
-  if (!stateString.IsEmpty()) {
-    mState = stateString;
-  }
-
   if (aCallState == nsITelephonyService::CALL_STATE_DISCONNECTED) {
     NS_ASSERTION(mLive, "Should be live!");
     mLive = false;
     if (mGroup) {
       mGroup->RemoveCall(this);
     } else {
       mTelephony->RemoveCall(this);
     }
@@ -139,26 +139,26 @@ TelephonyCall::ChangeStateInternal(uint1
     mLive = true;
     if (mGroup) {
       mGroup->AddCall(this);
     } else {
       mTelephony->AddCall(this);
     }
   }
 
-  if (aFireEvents) {
+  if (aFireEvents && externalStateChanged) {
     nsresult rv = DispatchCallEvent(NS_LITERAL_STRING("statechange"), this);
     if (NS_FAILED(rv)) {
       NS_WARNING("Failed to dispatch specific event!");
     }
 
     // This can change if the statechange handler called back here... Need to
     // figure out something smarter.
     if (mCallState == aCallState) {
-      rv = DispatchCallEvent(stateString, this);
+      rv = DispatchCallEvent(mState, this);
       if (NS_FAILED(rv)) {
         NS_WARNING("Failed to dispatch specific event!");
       }
     }
   }
 }
 
 nsresult
--- a/dom/telephony/TelephonyCallGroup.cpp
+++ b/dom/telephony/TelephonyCallGroup.cpp
@@ -82,51 +82,57 @@ TelephonyCallGroup::NotifyError(const ns
 }
 
 void
 TelephonyCallGroup::ChangeState(uint16_t aCallState)
 {
   if (mCallState == aCallState) {
     return;
   }
+  // Update the internal state.
+  mCallState = aCallState;
 
-  nsString stateString;
+  // Indicate whether the external state should be changed.
+  bool externalStateChanged = true;
   switch (aCallState) {
+    // These states are used internally to mark this CallGroup is currently
+    // being controlled, and we should block consecutive requests of the same
+    // type according to these states.
+    case nsITelephonyService::CALL_STATE_HOLDING:
+    case nsITelephonyService::CALL_STATE_RESUMING:
+      externalStateChanged = false;
+      break;
+    // These states will be translated into literal strings which are used to
+    // show the current status of this CallGroup.
     case nsITelephonyService::CALL_STATE_UNKNOWN:
+      mState.AssignLiteral("");
       break;
     case nsITelephonyService::CALL_STATE_CONNECTED:
-      stateString.AssignLiteral("connected");
-      break;
-    case nsITelephonyService::CALL_STATE_HOLDING:
-      stateString.AssignLiteral("holding");
+      mState.AssignLiteral("connected");
       break;
     case nsITelephonyService::CALL_STATE_HELD:
-      stateString.AssignLiteral("held");
-      break;
-    case nsITelephonyService::CALL_STATE_RESUMING:
-      stateString.AssignLiteral("resuming");
+      mState.AssignLiteral("held");
       break;
     default:
       NS_NOTREACHED("Unknown state!");
   }
 
-  mState = stateString;
-  mCallState = aCallState;
-
-  nsresult rv = DispatchCallEvent(NS_LITERAL_STRING("statechange"), nullptr);
-  if (NS_FAILED(rv)) {
-    NS_WARNING("Failed to dispatch specific event!");
-  }
-  if (!stateString.IsEmpty()) {
-    // This can change if the statechange handler called back here... Need to
-    // figure out something smarter.
-    if (mCallState == aCallState) {
-      rv = DispatchCallEvent(stateString, nullptr);
-      if (NS_FAILED(rv)) {
-        NS_WARNING("Failed to dispatch specific event!");
+  if (externalStateChanged) {
+    nsresult rv = DispatchCallEvent(NS_LITERAL_STRING("statechange"), nullptr);
+    if (NS_FAILED(rv)) {
+      NS_WARNING("Failed to dispatch specific event!");
+    }
+    if (!mState.IsEmpty()) {
+      // This can change if the statechange handler called back here... Need to
+      // figure out something smarter.
+      if (mCallState == aCallState) {
+        rv = DispatchCallEvent(mState, nullptr);
+        if (NS_FAILED(rv)) {
+          NS_WARNING("Failed to dispatch specific event!");
+        }
       }
     }
   }
 
   for (uint32_t index = 0; index < mCalls.Length(); index++) {
     nsRefPtr<TelephonyCall> call = mCalls[index];
     call->ChangeState(aCallState);
 
--- a/dom/telephony/TelephonyCallGroup.h
+++ b/dom/telephony/TelephonyCallGroup.h
@@ -65,19 +65,17 @@ public:
   void
   GetState(nsString& aState) const
   {
     aState = mState;
   }
 
   IMPL_EVENT_HANDLER(statechange)
   IMPL_EVENT_HANDLER(connected)
-  IMPL_EVENT_HANDLER(holding)
   IMPL_EVENT_HANDLER(held)
-  IMPL_EVENT_HANDLER(resuming)
   IMPL_EVENT_HANDLER(callschanged)
   IMPL_EVENT_HANDLER(error)
 
   static already_AddRefed<TelephonyCallGroup>
   Create(Telephony* aTelephony);
 
   void
   AddCall(TelephonyCall* aCall);
--- a/dom/telephony/test/marionette/head.js
+++ b/dom/telephony/test/marionette/head.js
@@ -772,18 +772,17 @@ let emulator = (function() {
     log("Holding the conference call.");
 
     let promises = [];
 
     for (let call of callsInConference) {
       promises.push(waitForNamedStateEvent(call, "held"));
     }
 
-    let promise = waitForNamedStateEvent(conference, "holding")
-      .then(() => waitForNamedStateEvent(conference, "held"))
+    let promise = waitForNamedStateEvent(conference, "held")
       .then(() => {
         if (typeof heldCallback === "function") {
           heldCallback();
         }
       });
     promises.push(promise);
 
     promises.push(conference.hold());
@@ -805,18 +804,17 @@ let emulator = (function() {
     log("Resuming the held conference call.");
 
     let promises = [];
 
     for (let call of callsInConference) {
       promises.push(waitForNamedStateEvent(call, "connected"));
     }
 
-    let promise = waitForNamedStateEvent(conference, "resuming")
-      .then(() => waitForNamedStateEvent(conference, "connected"))
+    let promise = waitForNamedStateEvent(conference, "connected")
       .then(() => {
         if (typeof connectedCallback === "function") {
           connectedCallback();
         }
       });
     promises.push(promise);
 
     promises.push(conference.resume());
--- a/dom/webidl/TelephonyCallGroup.webidl
+++ b/dom/webidl/TelephonyCallGroup.webidl
@@ -25,14 +25,12 @@ interface TelephonyCallGroup : EventTarg
 
   [NewObject, Throws]
   Promise<void> resume();
 
   readonly attribute DOMString state;
 
   attribute EventHandler onstatechange;
   attribute EventHandler onconnected;
-  attribute EventHandler onholding;
   attribute EventHandler onheld;
-  attribute EventHandler onresuming;
   attribute EventHandler oncallschanged;
   attribute EventHandler onerror;
 };
--- a/toolkit/devtools/apps/Simulator.jsm
+++ b/toolkit/devtools/apps/Simulator.jsm
@@ -1,16 +1,26 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 Components.utils.import("resource://gre/modules/devtools/event-emitter.js");
 
+/**
+ * TODO (Bug 1132453) The `Simulator` module is deprecated, and should be
+ * removed once all simulator addons stop using it (see bug 1132452).
+ *
+ * If you want to register, unregister, or otherwise deal with installed
+ * simulators, please use the `Simulators` module defined in:
+ *
+ *   browser/devtools/webide/modules/simulators.js
+ */
+
 const EXPORTED_SYMBOLS = ["Simulator"];
 
 const Simulator = {
   _simulators: {},
 
   register: function (name, simulator) {
     // simulators register themselves as "Firefox OS X.Y"
     this._simulators[name] = simulator;