Merge m-c to inbound on a CLOSED TREE. a=me

This commit is contained in:
Ryan VanderMeulen 2014-06-07 13:36:44 -04:00
commit 56e2c15baf
36 changed files with 370 additions and 210 deletions

View File

@ -21,6 +21,5 @@
}
},
"b2g_manifest": "emulator.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true
}

View File

@ -19,13 +19,13 @@
<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="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8e4420c0c5c8e8c8e58a000278a7129403769f96"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="a819a94a572c7b32556435491ed8eaab841a95ff"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>

View File

@ -28,6 +28,5 @@
}
},
"b2g_manifest": "emulator-jb.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true
}

View File

@ -17,10 +17,10 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

View File

@ -28,6 +28,5 @@
}
},
"b2g_manifest": "emulator-kk.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true
}

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="276ce45e78b09c4a4ee643646f691d22804754c1">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
@ -23,7 +23,7 @@
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>

View File

@ -27,6 +27,5 @@
}
},
"b2g_manifest": "emulator.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true
}

View File

@ -19,13 +19,13 @@
<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="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8e4420c0c5c8e8c8e58a000278a7129403769f96"/>
<project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="a819a94a572c7b32556435491ed8eaab841a95ff"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
<project name="platform/bionic" path="bionic" revision="c72b8f6359de7ed17c11ddc9dfdde3f615d188a9"/>

View File

@ -31,7 +31,6 @@
"B2G_UPDATE_CHANNEL": "nightly"
},
"b2g_manifest": "flame.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["backup-flame.tar.xz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -17,10 +17,10 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->
@ -118,7 +118,7 @@
<!-- Flame specific things -->
<project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="e8a318f7690092e639ba88891606f4183e846d3f"/>
<project name="device/qcom/common" path="device/qcom/common" revision="34ed8345250bb97262d70a052217a92e83444ede"/>
<project name="device-flame" path="device/t2m/flame" remote="b2g" revision="95423152b66d4a41032414fc3fb8c3d9a0636c7d"/>
<project name="device-flame" path="device/t2m/flame" remote="b2g" revision="ad1229307124c8c8b9a3579dd35dc24ff567c6d8"/>
<project name="kernel/msm" path="kernel" revision="ccfff630163ca9a0530701fa93b501c34042d06c"/>
<project name="platform/bootable/recovery" path="bootable/recovery" revision="f2914eacee9120680a41463708bb6ee8291749fc"/>
<project name="platform/external/bluetooth/bluedroid" path="external/bluetooth/bluedroid" revision="81c4a859d75d413ad688067829d21b7ba9205f81"/>

View File

@ -4,6 +4,6 @@
"remote": "",
"branch": ""
},
"revision": "99abcedfe288d6d29352b2add96b5ace90543985",
"revision": "0a26eafbba1c1cf459dae8b1c44b3c8b6d08f112",
"repo_path": "/integration/gaia-central"
}

View File

@ -22,7 +22,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "hamachi.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["backup-hamachi.tar.xz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -17,12 +17,12 @@
<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="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>
<project name="platform/bionic" path="bionic" revision="d2eb6c7b6e1bc7643c17df2d9d9bcb1704d0b9ab"/>

View File

@ -30,7 +30,6 @@
"ANDROIDFS_DIR": "{workdir}/helix-ics"
},
"b2g_manifest": "helix.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["helix-ics.tar.xz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -15,7 +15,7 @@
<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="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>

View File

@ -29,7 +29,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "inari.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["backup-inari.tar.xz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -30,7 +30,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "leo.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["backup-leo.tar.xz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -29,7 +29,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "nexus-4.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": [],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -30,7 +30,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "nexus-4.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": [],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -17,10 +17,10 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

View File

@ -24,7 +24,6 @@
"MOZ_TELEMETRY_REPORTING": "1"
},
"b2g_manifest": "wasabi.xml",
"b2g_manifest_branch": "master",
"b2g_manifest_intree": true,
"additional_source_tarballs": ["backup-wasabi.tar.gz"],
"gecko_l10n_root": "https://hg.mozilla.org/l10n-central",

View File

@ -17,12 +17,12 @@
<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="3f3963fe6e165c0a7afc6222e1137d0862c70b30"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="2e5636e852a9354a5f8072b179cf16f72647cfd6"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="531cf670e485649c69746e46d567929fcd54cbc5"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="827214fcf38d6569aeb5c6d6f31cb296d1f09272"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="891e5069c0ad330d8191bf8c7b879c814258c89f"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ce95d372e6d285725b96490afdaaf489ad8f9ca9"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="6a68dde81fcbe3c6bbd45bafdeb94c3f269bdc20"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="cabebb87fcd32f8596af08e6b5e80764ee0157dd"/>
<project name="gonk-patches" path="patches" remote="b2g" revision="223a2421006e8f5da33f516f6891c87cae86b0f6"/>
<!-- Stock Android things -->
<project name="platform/abi/cpp" path="abi/cpp" revision="6426040f1be4a844082c9769171ce7f5341a5528"/>

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1400782040000">
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1401837170000">
<emItems>
<emItem blockID="i454" id="sqlmoz@facebook.com">
<versionRange minVersion="0" maxVersion="*" severity="3">
@ -871,6 +871,12 @@
<emItem blockID="i43" id="supportaccessplugin@gmail.com">
<prefs>
</prefs>
</emItem>
<emItem blockID="i588" id="quick_start@gmail.com">
<versionRange minVersion="0" maxVersion="*" severity="3">
</versionRange>
<prefs>
</prefs>
</emItem>
<emItem blockID="i340" id="chiang@programmer.net">
<versionRange minVersion="0" maxVersion="*" severity="3">
@ -1278,8 +1284,8 @@
<prefs>
</prefs>
</emItem>
<emItem blockID="i19" id="{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}">
<versionRange minVersion="1.1b1" maxVersion="1.1b1">
<emItem blockID="i586" id="jid1-0xtMKhXFEs4jIg@jetpack">
<versionRange minVersion="0" maxVersion="*" severity="3">
</versionRange>
<prefs>
</prefs>
@ -1289,6 +1295,12 @@
</versionRange>
<prefs>
</prefs>
</emItem>
<emItem blockID="i19" id="{46551EC9-40F0-4e47-8E18-8E5CF550CFB8}">
<versionRange minVersion="1.1b1" maxVersion="1.1b1">
</versionRange>
<prefs>
</prefs>
</emItem>
<emItem blockID="i531" id="/^(4cb61367-efbf-4aa1-8e3a-7f776c9d5763@cdece6e9-b2ef-40a9-b178-291da9870c59\.com|0efc9c38-1ec7-49ed-8915-53a48b6b7600@e7f17679-2a42-4659-83c5-7ba961fdf75a\.com|6be3335b-ef79-4b0b-a0ba-b87afbc6f4ad@6bbb4d2e-e33e-4fa5-9b37-934f4fb50182\.com)$/">
<versionRange minVersion="0" maxVersion="*" severity="1">
@ -1409,6 +1421,12 @@
</versionRange>
<prefs>
</prefs>
</emItem>
<emItem blockID="i590" id="{94cd2cc3-083f-49ba-a218-4cda4b4829fd}">
<versionRange minVersion="0" maxVersion="*" severity="1">
</versionRange>
<prefs>
</prefs>
</emItem>
<emItem blockID="i544" id="/^(93abedcf-8e3a-4d02-b761-d1441e437c09@243f129d-aee2-42c2-bcd1-48858e1c22fd\.com|9acfc440-ac2d-417a-a64c-f6f14653b712@09f9a966-9258-4b12-af32-da29bdcc28c5\.com|58ad0086-1cfb-48bb-8ad2-33a8905572bc@5715d2be-69b9-4930-8f7e-64bdeb961cfd\.com)$/">
<versionRange minVersion="0" maxVersion="*" severity="1">

View File

@ -510,6 +510,8 @@
background-repeat: no-repeat;
background-position: 0, 1px, 2px;
}
#toolbox-buttons:empty + #toolbox-controls-separator,
#toolbox-controls-separator[invisible] {
visibility: hidden;
}

View File

@ -1336,12 +1336,12 @@ this.DOMApplicationRegistry = {
let app = this.webapps[id];
if (!app) {
debug("startDownload: No app found for " + aManifestURL);
return;
throw new Error("NO_SUCH_APP");
}
if (app.downloading) {
debug("app is already downloading. Ignoring.");
return;
throw new Error("APP_IS_DOWNLOADING");
}
// If the caller is trying to start a download but we have nothing to
@ -1355,7 +1355,7 @@ this.DOMApplicationRegistry = {
eventType: "downloaderror",
manifestURL: app.manifestURL
});
return;
throw new Error("NO_DOWNLOAD_AVAILABLE");
}
// First of all, we check if the download is supposed to update an
@ -1412,7 +1412,7 @@ this.DOMApplicationRegistry = {
if (!json) {
debug("startDownload: No update manifest found at " + file.path + " " +
aManifestURL);
return;
throw new Error("MISSING_UPDATE_MANIFEST");
}
let manifest = new ManifestHelper(json, app.manifestURL);
@ -1453,104 +1453,103 @@ this.DOMApplicationRegistry = {
}
}),
applyDownload: function applyDownload(aManifestURL) {
applyDownload: Task.async(function*(aManifestURL) {
debug("applyDownload for " + aManifestURL);
let id = this._appIdForManifestURL(aManifestURL);
let app = this.webapps[id];
if (!app || (app && !app.readyToApplyDownload)) {
return;
if (!app) {
throw new Error("NO_SUCH_APP");
}
if (!app.readyToApplyDownload) {
throw new Error("NOT_READY_TO_APPLY_DOWNLOAD");
}
// We need to get the old manifest to unregister web activities.
this.getManifestFor(aManifestURL).then((aOldManifest) => {
// Move the application.zip and manifest.webapp files out of TmpD
let tmpDir = FileUtils.getDir("TmpD", ["webapps", id], true, true);
let manFile = tmpDir.clone();
manFile.append("manifest.webapp");
let appFile = tmpDir.clone();
appFile.append("application.zip");
let oldManifest = yield this.getManifestFor(aManifestURL);
// Move the application.zip and manifest.webapp files out of TmpD
let tmpDir = FileUtils.getDir("TmpD", ["webapps", id], true, true);
let manFile = tmpDir.clone();
manFile.append("manifest.webapp");
let appFile = tmpDir.clone();
appFile.append("application.zip");
let dir = FileUtils.getDir(DIRECTORY_NAME, ["webapps", id], true, true);
appFile.moveTo(dir, "application.zip");
manFile.moveTo(dir, "manifest.webapp");
let dir = FileUtils.getDir(DIRECTORY_NAME, ["webapps", id], true, true);
appFile.moveTo(dir, "application.zip");
manFile.moveTo(dir, "manifest.webapp");
// Move the staged update manifest to a non staged one.
let staged = dir.clone();
staged.append("staged-update.webapp");
// Move the staged update manifest to a non staged one.
let staged = dir.clone();
staged.append("staged-update.webapp");
// If we are applying after a restarted download, we have no
// staged update manifest.
if (staged.exists()) {
staged.moveTo(dir, "update.webapp");
// If we are applying after a restarted download, we have no
// staged update manifest.
if (staged.exists()) {
staged.moveTo(dir, "update.webapp");
}
try {
tmpDir.remove(true);
} catch(e) { }
// Clean up the deprecated manifest cache if needed.
if (id in this._manifestCache) {
delete this._manifestCache[id];
}
// Flush the zip reader cache to make sure we use the new application.zip
// when re-launching the application.
let zipFile = dir.clone();
zipFile.append("application.zip");
Services.obs.notifyObservers(zipFile, "flush-cache-entry", null);
// Get the manifest, and set properties.
let newManifest = yield this.getManifestFor(aManifestURL);
app.downloading = false;
app.downloadAvailable = false;
app.downloadSize = 0;
app.installState = "installed";
app.readyToApplyDownload = false;
// Update the staged properties.
if (app.staged) {
for (let prop in app.staged) {
app[prop] = app.staged[prop];
}
delete app.staged;
}
try {
tmpDir.remove(true);
} catch(e) { }
delete app.retryingDownload;
// Clean up the deprecated manifest cache if needed.
if (id in this._manifestCache) {
delete this._manifestCache[id];
}
// Update the asm.js scripts we need to compile.
yield ScriptPreloader.preload(app, newManifest);
yield this._saveApps();
// Update the handlers and permissions for this app.
this.updateAppHandlers(oldManifest, newManifest, app);
// Flush the zip reader cache to make sure we use the new application.zip
// when re-launching the application.
let zipFile = dir.clone();
zipFile.append("application.zip");
Services.obs.notifyObservers(zipFile, "flush-cache-entry", null);
let updateManifest = yield AppsUtils.loadJSONAsync(staged.path);
let appObject = AppsUtils.cloneAppObject(app);
appObject.updateManifest = updateManifest;
this.notifyUpdateHandlers(appObject, newManifest, appFile.path);
// Get the manifest, and set properties.
this.getManifestFor(aManifestURL).then((aData) => {
app.downloading = false;
app.downloadAvailable = false;
app.downloadSize = 0;
app.installState = "installed";
app.readyToApplyDownload = false;
// Update the staged properties.
if (app.staged) {
for (let prop in app.staged) {
app[prop] = app.staged[prop];
}
delete app.staged;
}
delete app.retryingDownload;
// Update the asm.js scripts we need to compile.
ScriptPreloader.preload(app, aData)
.then(() => this._saveApps()).then(() => {
// Update the handlers and permissions for this app.
this.updateAppHandlers(aOldManifest, aData, app);
AppsUtils.loadJSONAsync(staged.path).then((aUpdateManifest) => {
let appObject = AppsUtils.cloneAppObject(app);
appObject.updateManifest = aUpdateManifest;
this.notifyUpdateHandlers(appObject, aData, appFile.path);
});
if (supportUseCurrentProfile()) {
PermissionsInstaller.installPermissions(
{ manifest: aData,
origin: app.origin,
manifestURL: app.manifestURL },
true);
}
this.updateDataStore(this.webapps[id].localId, app.origin,
app.manifestURL, aData, app.appStatus);
this.broadcastMessage("Webapps:UpdateState", {
app: app,
manifest: aData,
manifestURL: app.manifestURL
});
this.broadcastMessage("Webapps:FireEvent", {
eventType: "downloadapplied",
manifestURL: app.manifestURL
});
});
});
if (supportUseCurrentProfile()) {
PermissionsInstaller.installPermissions(
{ manifest: newManifest,
origin: app.origin,
manifestURL: app.manifestURL },
true);
}
this.updateDataStore(this.webapps[id].localId, app.origin,
app.manifestURL, newManifest, app.appStatus);
this.broadcastMessage("Webapps:UpdateState", {
app: app,
manifest: newManifest,
manifestURL: app.manifestURL
});
},
this.broadcastMessage("Webapps:FireEvent", {
eventType: "downloadapplied",
manifestURL: app.manifestURL
});
}),
startOfflineCacheDownload: function(aManifest, aApp, aProfileDir, aIsUpdate) {
if (!aManifest.appcache_path) {
@ -2776,9 +2775,11 @@ this.DOMApplicationRegistry = {
if (oldPackage) {
debug("package's etag or hash unchanged; sending 'applied' event");
// The package's Etag or hash has not changed.
// We send a "applied" event right away.
// We send an "applied" event right away so code awaiting that event
// can proceed to access the app. We also throw an error to alert
// the caller that the package wasn't downloaded.
this._sendAppliedEvent(aNewApp, oldApp, id);
return;
throw new Error("PACKAGE_UNCHANGED");
}
let newManifest = yield this._openAndReadPackage(zipFile, oldApp, aNewApp,
@ -3491,6 +3492,8 @@ this.DOMApplicationRegistry = {
});
});
AppDownloadManager.remove(aNewApp.manifestURL);
throw aError;
},
doUninstall: function(aData, aMm) {

View File

@ -19,7 +19,9 @@ import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoEvent;
import org.mozilla.gecko.GeckoProfile;
import org.mozilla.gecko.gfx.BitmapUtils;
import org.mozilla.gecko.util.GeckoEventListener;
import org.mozilla.gecko.util.EventCallback;
import org.mozilla.gecko.util.NativeEventListener;
import org.mozilla.gecko.util.NativeJSObject;
import org.mozilla.gecko.util.ThreadUtils;
import android.content.Context;
@ -27,7 +29,7 @@ import android.graphics.Bitmap;
import android.net.Uri;
import android.util.Log;
public class InstallHelper implements GeckoEventListener {
public class InstallHelper implements NativeEventListener {
private static final String LOGTAG = "GeckoWebappInstallHelper";
private static final String[] INSTALL_EVENT_NAMES = new String[] {"Webapps:Postinstall"};
private final Context mContext;
@ -36,7 +38,7 @@ public class InstallHelper implements GeckoEventListener {
public static interface InstallCallback {
// on the GeckoThread
void installCompleted(InstallHelper installHelper, String event, JSONObject message);
void installCompleted(InstallHelper installHelper, String event, NativeJSObject message);
// on the GeckoBackgroundThread
void installErrored(InstallHelper installHelper, Exception exception);
@ -162,7 +164,7 @@ public class InstallHelper implements GeckoEventListener {
}
@Override
public void handleMessage(String event, JSONObject message) {
public void handleMessage(String event, NativeJSObject message, EventCallback callback) {
EventDispatcher.getInstance().unregisterGeckoThreadListener(this, INSTALL_EVENT_NAMES);
if (mCallback != null) {

View File

@ -18,6 +18,7 @@ import org.mozilla.gecko.GeckoThread;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Tab;
import org.mozilla.gecko.Tabs;
import org.mozilla.gecko.util.NativeJSObject;
import org.mozilla.gecko.webapp.InstallHelper.InstallCallback;
import android.content.Intent;
@ -325,13 +326,13 @@ public class WebappImpl extends GeckoApp implements InstallCallback {
}
@Override
public void installCompleted(InstallHelper installHelper, String event, JSONObject message) {
public void installCompleted(InstallHelper installHelper, String event, NativeJSObject message) {
if (event == null) {
return;
}
if (event.equals("Webapps:Postinstall")) {
String origin = message.optString("origin");
String origin = message.optString("origin", null);
launchWebapp(origin);
}
}

View File

@ -158,37 +158,46 @@ this.WebappManager = {
return deferred.promise;
},
askInstall: function(aData) {
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
file.initWithPath(aData.profilePath);
_deleteAppcachePath: function(aManifest) {
// We don't yet support pre-installing an appcache because it isn't clear
// how to do it without degrading the user experience (since users expect
// apps to be available after the system tells them they've been installed,
// which has already happened) and because nsCacheService shuts down
// when we trigger the native install dialog and doesn't re-init itself
// afterward (TODO: file bug about this behavior).
if ("appcache_path" in aData.app.manifest) {
debug("deleting appcache_path from manifest: " + aData.app.manifest.appcache_path);
delete aData.app.manifest.appcache_path;
if ("appcache_path" in aManifest) {
debug("deleting appcache_path from manifest: " + aManifest.appcache_path);
delete aManifest.appcache_path;
}
},
askInstall: function(aData) {
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
file.initWithPath(aData.profilePath);
this._deleteAppcachePath(aData.app.manifest);
DOMApplicationRegistry.registryReady.then(() => {
DOMApplicationRegistry.confirmInstall(aData, file, (function(aManifest) {
let localeManifest = new ManifestHelper(aManifest, aData.app.origin);
// aData.app.origin may now point to the app: url that hosts this app.
sendMessageToJava({
type: "Webapps:Postinstall",
apkPackageName: aData.app.apkPackageName,
origin: aData.app.origin,
});
this.writeDefaultPrefs(file, localeManifest);
this._postInstall(aData.profilePath, aManifest, aData.app.origin, aData.app.apkPackageName);
}).bind(this));
});
},
_postInstall: function(aProfilePath, aNewManifest, aOrigin, aApkPackageName) {
// aOrigin may now point to the app: url that hosts this app.
sendMessageToJava({
type: "Webapps:Postinstall",
apkPackageName: aApkPackageName,
origin: aOrigin,
});
let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
file.initWithPath(aProfilePath);
let localeManifest = new ManifestHelper(aNewManifest, aOrigin);
this.writeDefaultPrefs(file, localeManifest);
},
launch: function({ manifestURL, origin }) {
debug("launchWebapp: " + manifestURL);
@ -211,11 +220,16 @@ this.WebappManager = {
},
autoInstall: function(aData) {
let oldApp = DOMApplicationRegistry.getAppByManifestURL(aData.manifestURL);
if (oldApp) {
// If the app is already installed, update the existing installation.
this._autoUpdate(aData, oldApp);
return;
debug("autoInstall " + aData.manifestURL);
// If the app is already installed, update the existing installation.
// We should be able to use DOMApplicationRegistry.getAppByManifestURL,
// but it returns a mozIApplication, while _autoUpdate needs the original
// object from DOMApplicationRegistry.webapps in order to modify it.
for (let [ , app] in Iterator(DOMApplicationRegistry.webapps)) {
if (app.manifestURL == aData.manifestURL) {
return this._autoUpdate(aData, app);
}
}
let mm = {
@ -276,13 +290,39 @@ this.WebappManager = {
}
if (aData.type == "hosted") {
this._deleteAppcachePath(aData.manifest);
let oldManifest = yield DOMApplicationRegistry.getManifestFor(aData.manifestURL);
DOMApplicationRegistry.updateHostedApp(aData, aOldApp.id, aOldApp, oldManifest, aData.manifest);
yield DOMApplicationRegistry.updateHostedApp(aData, aOldApp.id, aOldApp, oldManifest, aData.manifest);
} else {
DOMApplicationRegistry.updatePackagedApp(aData, aOldApp.id, aOldApp, aData.manifest);
yield this._autoUpdatePackagedApp(aData, aOldApp);
}
this._postInstall(aData.profilePath, aData.manifest, aOldApp.origin, aOldApp.apkPackageName);
}).bind(this)); },
_autoUpdatePackagedApp: Task.async(function*(aData, aOldApp) {
debug("_autoUpdatePackagedApp: " + aData.manifestURL);
if (aData.updateManifest && aData.zipFilePath) {
aData.updateManifest.package_path = aData.zipFilePath;
}
// updatePackagedApp just prepares the update, after which we must
// download the package via the misnamed startDownload and then apply it
// via applyDownload.
yield DOMApplicationRegistry.updatePackagedApp(aData, aOldApp.id, aOldApp, aData.updateManifest);
try {
yield DOMApplicationRegistry.startDownload(aData.manifestURL);
} catch (ex if ex.message == "PACKAGE_UNCHANGED") {
debug("package unchanged");
// If the package is unchanged, then there's nothing more to do.
return;
}
yield DOMApplicationRegistry.applyDownload(aData.manifestURL);
}),
_checkingForUpdates: false,
checkForUpdates: function(userInitiated) { return Task.spawn((function*() {

View File

@ -145,7 +145,7 @@ void ARTPConnection::MakePortPair(
unsigned start = (unsigned)((rand() * 1000ll) / RAND_MAX) + 15550;
start &= ~1;
for (uint16_t port = start; port < 65536; port += 2) {
for (uint32_t port = start; port < 65536; port += 2) {
PRNetAddr addr;
addr.inet.family = PR_AF_INET;
addr.inet.ip = PR_htonl(PR_INADDR_ANY);
@ -278,7 +278,7 @@ void ARTPConnection::onPollStreams() {
moz_xcalloc(pollCount, sizeof(PRPollDesc));
// |pollIndex| is used to map different RTP & RTCP socket pairs.
int numSocketsToPoll = 0, pollIndex = 0;
uint32_t numSocketsToPoll = 0, pollIndex = 0;
for (List<StreamInfo>::iterator it = mStreams.begin();
it != mStreams.end(); ++it, pollIndex += 2) {
if (pollIndex >= pollCount) {

View File

@ -56,10 +56,10 @@ ARTSPConnection::ARTSPConnection(bool uidValid, uid_t uid)
mUID(uid),
mState(DISCONNECTED),
mAuthType(NONE),
mSocket(nullptr),
mConnectionID(0),
mNextCSeq(0),
mReceiveResponseEventPending(false),
mSocket(nullptr),
mNumSocketPollTimeoutRetries(0) {
MakeUserAgent(&mUserAgent);
}

View File

@ -41,10 +41,6 @@
#include "prnetdb.h"
extern PRLogModuleInfo* gRtspLog;
#define LOGI(msg, ...) PR_LOG(gRtspLog, PR_LOG_ALWAYS, ("RTSP" msg, ##__VA_ARGS__))
#define LOGV(msg, ...) PR_LOG(gRtspLog, PR_LOG_DEBUG, (msg, ##__VA_ARGS__))
#define LOGE(msg, ...) PR_LOG(gRtspLog, PR_LOG_ERROR, (msg, ##__VA_ARGS__))
#define LOGW(msg, ...) PR_LOG(gRtspLog, PR_LOG_WARNING, (msg, ##__VA_ARGS__))
// If no access units are received within 2 secs, assume that the rtp
// stream has ended and signal end of stream.

View File

@ -1,12 +1,11 @@
admin.google.com: did not receive HSTS header (error ignored - included regardless)
adsfund.org: could not connect to host
airbnb.com: did not receive HSTS header
alpha.irccloud.com: could not connect to host
alpha.irccloud.com: did not receive HSTS header
anycoin.me: did not receive HSTS header
api.lookout.com: could not connect to host
api.mega.co.nz: could not connect to host
api.recurly.com: did not receive HSTS header
api.simple.com: did not receive HSTS header
apis.google.com: did not receive HSTS header (error ignored - included regardless)
app.lookout.com: could not connect to host
appengine.google.com: did not receive HSTS header (error ignored - included regardless)
@ -42,10 +41,10 @@ edmodo.com: did not receive HSTS header
email.lookout.com: could not connect to host
emailprivacytester.com: did not receive HSTS header
encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
epoxate.com: did not receive HSTS header
errors.zenpayroll.com: could not connect to host
espra.com: could not connect to host
fatzebra.com.au: did not receive HSTS header
fj.simple.com: did not receive HSTS header
get.zenpayroll.com: did not receive HSTS header
glass.google.com: did not receive HSTS header (error ignored - included regardless)
gmail.com: did not receive HSTS header (error ignored - included regardless)
@ -92,6 +91,7 @@ play.google.com: did not receive HSTS header (error ignored - included regardles
prodpad.com: did not receive HSTS header
profiles.google.com: did not receive HSTS header (error ignored - included regardless)
rapidresearch.me: did not receive HSTS header
riseup.net: could not connect to host
sah3.net: could not connect to host
saturngames.co.uk: did not receive HSTS header
script.google.com: did not receive HSTS header (error ignored - included regardless)
@ -120,8 +120,8 @@ talkgadget.google.com: did not receive HSTS header (error ignored - included reg
translate.googleapis.com: did not receive HSTS header (error ignored - included regardless)
uprotect.it: could not connect to host
wallet.google.com: did not receive HSTS header (error ignored - included regardless)
waveapps.com: max-age too low: 0
webmail.mayfirst.org: did not receive HSTS header
wepay.com: max-age too low: 2592000
whonix.org: did not receive HSTS header
www.calyxinstitute.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-hsts-000000000000000/getHSTSPreloadList.js :: processStsHeader :: line 125" data: no]
www.cueup.com: did not receive HSTS header
@ -143,5 +143,4 @@ www.paypal.com: [Exception... "Component returned failure code: 0x80004005 (NS_E
www.roddis.net: did not receive HSTS header
www.sandbox.mydigipass.com: could not connect to host
www.surfeasy.com: did not receive HSTS header
www.wepay.com: max-age too low: 2592000
zoo24.de: max-age too low: 2592000

View File

@ -8,7 +8,7 @@
/*****************************************************************************/
#include <stdint.h>
const PRTime gPreloadListExpirationTime = INT64_C(1412417246070000);
const PRTime gPreloadListExpirationTime = INT64_C(1413022251299000);
class nsSTSPreload
{
@ -24,8 +24,8 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "admin.google.com", true },
{ "adsfund.org", true },
{ "aladdinschools.appspot.com", false },
{ "alpha.irccloud.com", false },
{ "api.intercom.io", false },
{ "api.simple.com", false },
{ "api.xero.com", false },
{ "apis.google.com", true },
{ "app.manilla.com", true },
@ -86,7 +86,6 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "encircleapp.com", true },
{ "encrypted.google.com", true },
{ "entropia.de", false },
{ "epoxate.com", false },
{ "errors.zenpayroll.com", false },
{ "espra.com", true },
{ "f-droid.org", true },
@ -95,6 +94,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "faq.lookout.com", false },
{ "feedbin.com", false },
{ "fiken.no", true },
{ "fj.simple.com", false },
{ "forum.linode.com", false },
{ "forum.quantifiedself.com", true },
{ "gernert-server.de", true },
@ -229,13 +229,13 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "vmoagents.com", false },
{ "w-spotlight.appspot.com", true },
{ "wallet.google.com", true },
{ "waveapps.com", true },
{ "webfilings-eu-mirror.appspot.com", true },
{ "webfilings-eu.appspot.com", true },
{ "webfilings-mirror-hrd.appspot.com", true },
{ "webfilings.appspot.com", true },
{ "webmail.gigahost.dk", false },
{ "webmail.onlime.ch", false },
{ "wepay.com", false },
{ "wf-bigsky-master.appspot.com", true },
{ "wf-demo-eu.appspot.com", true },
{ "wf-demo-hrd.appspot.com", true },
@ -280,6 +280,7 @@ static const nsSTSPreload kSTSPreloadList[] = {
{ "www.torproject.org", false },
{ "www.twitter.com", false },
{ "www.usaa.com", false },
{ "www.wepay.com", false },
{ "www.zenpayroll.com", false },
{ "xbrlsuccess.appspot.com", true },
{ "zenpayroll.com", false },

View File

@ -240,8 +240,11 @@ this.FxAccountsClient.prototype = {
* @param lifetime
* The lifetime of the certificate
* @return Promise
* Returns a promise that resolves to the signed certificate. The certificate
* can be used to generate a Persona assertion.
* Returns a promise that resolves to the signed certificate.
* The certificate can be used to generate a Persona assertion.
* @throws a new Error
* wrapping any of these HTTP code/errno pairs:
* https://github.com/mozilla/fxa-auth-server/blob/master/docs/api.md#response-12
*/
signCertificate: function (sessionTokenHex, serializedPublicKey, lifetime) {
let creds = this._deriveHawkCredentials(sessionTokenHex, "sessionToken");

View File

@ -152,8 +152,82 @@ this.FxAccountsManager = {
);
},
/**
* Determine whether the incoming error means that the current account
* has new server-side state via deletion or password change, and if so,
* spawn the appropriate UI (sign in or refresh); otherwise re-reject.
*
* As of May 2014, the only HTTP call triggered by this._getAssertion()
* is to /certificate/sign via:
* FxAccounts.getAssertion()
* FxAccountsInternal.getCertificateSigned()
* FxAccountsClient.signCertificate()
* See the latter method for possible (error code, errno) pairs.
*/
_handleGetAssertionError: function(reason, aAudience) {
let errno = (reason ? reason.errno : NaN) || NaN;
// If the previously valid email/password pair is no longer valid ...
if (errno == ERRNO_INVALID_AUTH_TOKEN) {
return this._fxAccounts.accountStatus().then(
(exists) => {
// ... if the email still maps to an account, the password
// must have changed, so ask the user to enter the new one ...
if (exists) {
return this.getAccount().then(
(user) => {
return this._refreshAuthentication(aAudience, user.email);
}
);
// ... otherwise, the account was deleted, so ask for Sign In/Up
} else {
return this._localSignOut().then(
() => {
return this._uiRequest(UI_REQUEST_SIGN_IN_FLOW, aAudience);
},
(reason) => { // reject primary problem, not signout failure
log.error("Signing out in response to server error threw: " + reason);
return this._error(reason);
}
);
}
}
);
}
return rejection;
},
_getAssertion: function(aAudience) {
return this._fxAccounts.getAssertion(aAudience);
return this._fxAccounts.getAssertion(aAudience).then(
(result) => {
return result;
},
(reason) => {
return this._handleGetAssertionError(reason, aAudience);
}
);
},
_refreshAuthentication: function(aAudience, aEmail) {
this._refreshing = true;
return this._uiRequest(UI_REQUEST_REFRESH_AUTH,
aAudience, aEmail).then(
(assertion) => {
this._refreshing = false;
return assertion;
},
(reason) => {
this._refreshing = false;
return this._signOut().then(
() => {
return this._error(reason);
}
);
}
);
},
_localSignOut: function() {
return this._fxAccounts.signOut(true);
},
_signOut: function() {
@ -167,7 +241,7 @@ this.FxAccountsManager = {
// in case that we have network connection.
let sessionToken = this._activeSession.sessionToken;
return this._fxAccounts.signOut(true).then(
return this._localSignOut().then(
() => {
// At this point the local session should already be removed.
@ -362,36 +436,41 @@ this.FxAccountsManager = {
},
/*
* Try to get an assertion for the given audience.
* Try to get an assertion for the given audience. Here we implement
* the heart of the response to navigator.mozId.request() on device.
* (We can also be called via the IAC API, but it's request() that
* makes this method complex.) The state machine looks like this,
* ignoring simple errors:
* If no one is signed in, and we aren't suppressing the UI:
* trigger the sign in flow.
* else if we were asked to refresh and the grace period is up:
* trigger the refresh flow.
* else ask the core code for an assertion, which might itself
* trigger either the sign in or refresh flows (if our account
* changed on the server).
*
* aOptions can include:
*
* refreshAuthentication - (bool) Force re-auth.
*
* silent - (bool) Prevent any UI interaction.
* I.e., try to get an automatic assertion.
*
*/
getAssertion: function(aAudience, aOptions) {
if (!aAudience) {
return this._error(ERROR_INVALID_AUDIENCE);
}
if (Services.io.offline) {
return this._error(ERROR_OFFLINE);
}
return this.getAccount().then(
user => {
if (user) {
// We cannot get assertions for unverified accounts.
// Three have-user cases to consider. First: are we unverified?
if (!user.verified) {
return this._error(ERROR_UNVERIFIED_ACCOUNT, {
user: user
});
}
// RPs might require an authentication refresh.
// Second case: do we need to refresh?
if (aOptions &&
(typeof(aOptions.refreshAuthentication) != "undefined")) {
let gracePeriod = aOptions.refreshAuthentication;
@ -399,44 +478,24 @@ this.FxAccountsManager = {
return this._error(ERROR_INVALID_REFRESH_AUTH_VALUE);
}
// Forcing refreshAuth to silent is a contradiction in terms,
// though it will sometimes succeed silently.
// though it might succeed silently if we didn't reject here.
if (aOptions.silent) {
return this._error(ERROR_NO_SILENT_REFRESH_AUTH);
}
if ((Date.now() / 1000) - this._activeSession.authAt > gracePeriod) {
// Grace period expired, so we sign out and request the user to
// authenticate herself again. If the authentication succeeds, we
// will return the assertion. Otherwise, we will return an error.
this._refreshing = true;
return this._uiRequest(UI_REQUEST_REFRESH_AUTH,
aAudience, user.email).then(
(assertion) => {
this._refreshing = false;
return assertion;
},
(reason) => {
this._refreshing = false;
return this._signOut().then(
() => {
return this._error(reason);
}
);
}
);
let secondsSinceAuth = (Date.now() / 1000) - this._activeSession.authAt;
if (secondsSinceAuth > gracePeriod) {
return this._refreshAuthentication(aAudience, user.email);
}
}
// Third case: we are all set *locally*. Probably we just return
// the assertion, but the attempt might lead to the server saying
// we are deleted or have a new password, which will trigger a flow.
return this._getAssertion(aAudience);
}
log.debug("No signed in user");
if (aOptions && aOptions.silent) {
return Promise.resolve(null);
}
// If there is no currently signed in user, we trigger the signIn UI
// flow.
return this._uiRequest(UI_REQUEST_SIGN_IN_FLOW, aAudience);
}
);

View File

@ -12,6 +12,10 @@ Cu.import("resource://gre/modules/Promise.jsm");
// === Mocks ===
// Globals representing server state
let passwordResetOnServer = false;
let deletedOnServer = false;
// Override FxAccountsUIGlue.
const kFxAccountsUIGlueUUID = "{8f6d5d87-41ed-4bb5-aa28-625de57564c5}";
const kFxAccountsUIGlueContractID =
@ -54,6 +58,7 @@ let FxAccountsUIGlue = {
if (this._reject) {
deferred.reject(this._error);
} else {
passwordResetOnServer = false;
FxAccountsManager._activeSession = this._activeSession || {
email: "user@domain.org",
verified: false,
@ -68,6 +73,7 @@ let FxAccountsUIGlue = {
},
signInFlow: function() {
deletedOnServer = false;
this._signInFlowCalled = true;
return this._promise();
},
@ -104,13 +110,23 @@ FxAccountsManager._fxAccounts = {
this._reject = false;
},
accountStatus: function() {
let deferred = Promise.defer();
deferred.resolve(!deletedOnServer);
return deferred.promise;
},
getAssertion: function() {
if (!this._signedInUser) {
return null;
}
let deferred = Promise.defer();
deferred.resolve(this._assertion);
if (passwordResetOnServer || deletedOnServer) {
deferred.reject({errno: ERRNO_INVALID_AUTH_TOKEN});
} else {
deferred.resolve(this._assertion);
}
return deferred.promise;
},
@ -376,6 +392,38 @@ add_test(function(test_getAssertion_refreshAuth) {
);
});
add_test(function(test_getAssertion_server_state_change) {
FxAccountsManager._fxAccounts._signedInUser.verified = true;
FxAccountsManager._activeSession.verified = true;
passwordResetOnServer = true;
FxAccountsManager.getAssertion("audience").then(
(result) => {
// For password reset, the UIGlue mock simulates sucessful
// refreshAuth which supplies new password, not signin/signup.
do_check_true(FxAccountsUIGlue._refreshAuthCalled);
do_check_false(FxAccountsUIGlue._signInFlowCalled)
do_check_eq(result, "assertion");
FxAccountsUIGlue._refreshAuthCalled = false;
}
).then(
() => {
deletedOnServer = true;
FxAccountsManager.getAssertion("audience").then(
(result) => {
// For account deletion, the UIGlue's signin/signup is called.
do_check_true(FxAccountsUIGlue._signInFlowCalled)
do_check_false(FxAccountsUIGlue._refreshAuthCalled);
do_check_eq(result, "assertion");
deletedOnServer = false;
passwordResetOnServer = false;
FxAccountsUIGlue._reset()
run_next_test();
}
);
}
);
});
add_test(function(test_getAssertion_refreshAuth_NaN) {
do_print("= getAssertion refreshAuth NaN=");
let gracePeriod = "NaN";