Merge mozilla-central to mozilla-inbound

This commit is contained in:
Carsten "Tomcat" Book 2015-12-21 11:54:26 +01:00
commit edb48de851
114 changed files with 31738 additions and 30071 deletions

View File

@ -78,12 +78,10 @@ browser/components/shell/**
browser/components/tabview/**
browser/components/translation/**
browser/components/uitour/**
browser/experiments/**
browser/extensions/pdfjs/**
browser/extensions/shumway/**
browser/fuel/**
browser/locales/**
browser/modules/**
# Loop specific exclusions

View File

@ -108,6 +108,10 @@ var developerHUD = {
this._logging = enabled;
});
SettingsListener.observe('hud.telemetry.logging', _telemetryDebug, enabled => {
_telemetryDebug = enabled;
});
SettingsListener.observe('metrics.selectedMetrics.level', "", level => {
this._telemetry = (level === 'Enhanced');
});

View File

@ -1391,6 +1391,8 @@ Services.obs.addObserver(function resetProfile(subject, topic, data) {
appStartup.quit(Ci.nsIAppStartup.eForceQuit);
}, 'b2g-reset-profile', false);
var showInstallScreen;
if (AppConstants.MOZ_GRAPHENE) {
const restoreWindowGeometry = () => {
let screenX = Services.prefs.getIntPref("b2g.nativeWindowGeometry.screenX");
@ -1428,7 +1430,7 @@ if (AppConstants.MOZ_GRAPHENE) {
const showNativeWindow = () => baseWindow.visibility = true;
const hideNativeWindow = () => baseWindow.visibility = false;
const showInstallScreen = () => {
showInstallScreen = () => {
const grapheneStrings =
Services.strings.createBundle('chrome://b2g-l10n/locale/graphene.properties');
document.querySelector('#installing > .message').textContent =

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -35,7 +35,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- 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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
<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="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -35,7 +35,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- 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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
<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="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -31,7 +31,7 @@
</project>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
<project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
<!-- Stock Android things -->
@ -41,7 +41,7 @@
<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="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="2e7d5348f35575870b3c7e567a9a9f6d66f8d6c5"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="1342fd7b4b000ac3e76a5dfe111a0de9d710b4c8"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" revision="babc41b5ee0e89a140a479b680887a9004a41996"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" revision="78948bc4d41c9657d7e2a1a84a21fa2a0eee2504"/>
<project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="1b26ad444462ccbd97f6319565b4735f7bd779e5"/>
<project name="device/common" path="device/common" revision="4e1a38704dcfadef60ed2da3cfeba02a56b069d2"/>
<project name="device/sample" path="device/sample" revision="b045905b46c8b4ee630d0c2aee7db63eaec722d9"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -34,7 +34,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- 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

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -34,7 +34,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- Stock Android things -->
<project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="ffc05a232799fe8fcb3e47b7440b52b1fb4244c0"/>
<project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="337e0ef5e40f02a1ae59b90db0548976c70a7226"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -35,7 +35,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- 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="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
<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="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>

View File

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "d069027f9af6f835ef869f1f01b52339e5a3f423",
"git_revision": "14aefb2519becfa32f31bcc3c9c995693421f19c",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "87642662c7721f18575be17ae42c81782e5f040a",
"revision": "e384f9eb4a149302c38df25a4aa772ddd1415f7e",
"repo_path": "integration/gaia-central"
}

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -35,7 +35,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- 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

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -32,7 +32,7 @@
<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="apitrace" path="external/apitrace" remote="apitrace" revision="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
<project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
<!-- Stock Android things -->
@ -42,7 +42,7 @@
<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="b89fda71fcd0fa0cf969310e75be3ea33e048b44"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" revision="2e7d5348f35575870b3c7e567a9a9f6d66f8d6c5"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" revision="1342fd7b4b000ac3e76a5dfe111a0de9d710b4c8"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" revision="babc41b5ee0e89a140a479b680887a9004a41996"/>
<project groups="linux,arm" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9" revision="78948bc4d41c9657d7e2a1a84a21fa2a0eee2504"/>
<project groups="linux,x86" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" revision="1b26ad444462ccbd97f6319565b4735f7bd779e5"/>
<project name="device/common" path="device/common" revision="4e1a38704dcfadef60ed2da3cfeba02a56b069d2"/>
<project name="device/sample" path="device/sample" revision="b045905b46c8b4ee630d0c2aee7db63eaec722d9"/>

View File

@ -21,7 +21,7 @@
<!--
B2G repositories for all targets
-->
<project name="gaia" path="gaia" remote="mozillaorg" revision="d069027f9af6f835ef869f1f01b52339e5a3f423"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="14aefb2519becfa32f31bcc3c9c995693421f19c"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="4a962bdab532e18f53e9d2d114c349983262c6b7"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ac7e9ae8a24ab4a3f3da801ca53f95f39a32b89f"/>
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
@ -35,7 +35,7 @@
<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="84e644fc7bb99f865374b55e13b36c6760148e53"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="83032cb35d4a84ba28b3e829feae3f697d13f0b3"/>
<!-- Stock Android things -->
<project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="ffc05a232799fe8fcb3e47b7440b52b1fb4244c0"/>
<project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="337e0ef5e40f02a1ae59b90db0548976c70a7226"/>

View File

@ -14,4 +14,4 @@ DIRS += [
]
# Add the defaults settings.
FINAL_TARGET_FILES.defaults += [ 'b2g/graphene/settings.json' ]
FINAL_TARGET_FILES.defaults += [ 'settings.json' ]

View File

@ -1,5 +1,5 @@
<?xml version="1.0"?>
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1449088954000">
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1450229633000">
<emItems>
<emItem blockID="i58" id="webmaster@buzzzzvideos.info">
<versionRange minVersion="0" maxVersion="*">
@ -455,7 +455,7 @@
</prefs>
</emItem>
<emItem blockID="i1056" id="{82AF8DCA-6DE9-405D-BD5E-43525BDAD38A}">
<versionRange minVersion="0" maxVersion="*" severity="1">
<versionRange minVersion="0" maxVersion="7.5.0.9082" severity="1">
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
<versionRange minVersion="43.0a1" maxVersion="*" />
</targetApplication>

View File

@ -132,6 +132,9 @@ var gContentPane = {
gSubDialog.open("chrome://browser/content/preferences/permissions.xul",
"resizable=yes", params);
Services.telemetry
.getHistogramById("WEB_NOTIFICATION_EXCEPTIONS_OPENED").add();
},
@ -171,7 +174,7 @@ var gContentPane = {
},
/**
*
*
*/
_selectDefaultLanguageGroup: function (aLanguageGroup, aIsSerif)
{
@ -243,7 +246,7 @@ var gContentPane = {
/**
* Displays the fonts dialog, where web page font names and sizes can be
* configured.
*/
*/
configureFonts: function ()
{
gSubDialog.open("chrome://browser/content/preferences/fonts.xul", "resizable=no");

View File

@ -16,6 +16,8 @@ const SCROLL2_X = Math.round(300 * (1 + Math.random()));
const SCROLL2_Y = Math.round(400 * (1 + Math.random()));
const SCROLL2_STR = SCROLL2_X + "," + SCROLL2_Y;
requestLongerTimeout(2);
/**
* This test ensures that we properly serialize and restore scroll positions
* for an average page without any frames.

View File

@ -175,7 +175,7 @@ function addonInstallForURL(url, hash) {
function installedExperimentAddons() {
let deferred = Promise.defer();
AddonManager.getAddonsByTypes(["experiment"], (addons) => {
deferred.resolve([a for (a of addons) if (!a.appDisabled)]);
deferred.resolve(addons.filter(a => !a.appDisabled));
});
return deferred.promise;
}
@ -183,7 +183,7 @@ function installedExperimentAddons() {
// Takes an Array<Addon> and returns a promise that is resolved when the
// addons are uninstalled.
function uninstallAddons(addons) {
let ids = new Set([a.id for (a of addons)]);
let ids = new Set(addons.map(addon => addon.id));
let deferred = Promise.defer();
let listener = {};
@ -463,11 +463,12 @@ Experiments.Experiments.prototype = {
try {
this._log.trace("uninit: waiting on _mainTask");
yield this._mainTask;
} catch (e if e instanceof AlreadyShutdownError) {
// We error out of tasks after shutdown via that exception.
} catch (e) {
this._latestError = e;
throw e;
// We error out of tasks after shutdown via this exception.
if (!(e instanceof AlreadyShutdownError)) {
this._latestError = e;
throw e;
}
}
}
@ -760,19 +761,23 @@ Experiments.Experiments.prototype = {
this._mainTask = Task.spawn(function*() {
try {
yield this._main();
} catch (e if e instanceof CacheWriteError) {
// In this case we want to reschedule
} catch (e) {
this._log.error("_main caught error: " + e);
return;
// In the CacheWriteError case we want to reschedule
if (!(e instanceof CacheWriteError)) {
this._log.error("_main caught error: " + e);
return;
}
} finally {
this._mainTask = null;
}
this._log.trace("_main finished, scheduling next run");
try {
yield this._scheduleNextRun();
} catch (ex if ex instanceof AlreadyShutdownError) {
// We error out of tasks after shutdown via that exception.
} catch (ex) {
// We error out of tasks after shutdown via this exception.
if (!(ex instanceof AlreadyShutdownError)) {
throw ex;
}
}
}.bind(this));
}
@ -866,15 +871,18 @@ Experiments.Experiments.prototype = {
this.disableExperiment(TELEMETRY_LOG.TERMINATION.ADDON_UNINSTALLED);
},
/**
* @returns {Boolean} returns false when we cancel the install.
*/
onInstallStarted: function (install) {
if (install.addon.type != "experiment") {
return;
return true;
}
this._log.trace("onInstallStarted() - " + install.addon.id);
if (install.addon.appDisabled) {
// This is a PreviousExperiment
return;
return true;
}
// We want to be in control of all experiment add-ons: reject installs
@ -894,13 +902,13 @@ Experiments.Experiments.prototype = {
if (this._trackedAddonIds.has(install.addon.id)) {
this._log.info("onInstallStarted allowing install because add-on ID " +
"tracked by us.");
return;
return true;
}
if (gActiveInstallURLs.has(install.sourceURI.spec)) {
this._log.info("onInstallStarted allowing install because install " +
"tracked by us.");
return;
return true;
}
this._log.warn("onInstallStarted cancelling install of unknown " +
@ -985,7 +993,7 @@ Experiments.Experiments.prototype = {
try {
let textData = JSON.stringify({
version: CACHE_VERSION,
data: [e[1].toJSON() for (e of this._experiments.entries())],
data: [...this._experiments.values()].map(e => e.toJSON()),
});
let encoder = new TextEncoder();
@ -1011,9 +1019,13 @@ Experiments.Experiments.prototype = {
try {
let result = yield loadJSONAsync(path, { compression: "lz4" });
this._populateFromCache(result);
} catch (e if e instanceof OS.File.Error && e.becauseNoSuchFile) {
// No cached manifest yet.
this._experiments = new Map();
} catch (e) {
if (e instanceof OS.File.Error && e.becauseNoSuchFile) {
// No cached manifest yet.
this._experiments = new Map();
} else {
throw e;
}
}
}),
@ -1116,7 +1128,7 @@ Experiments.Experiments.prototype = {
},
_getActiveExperiment: function () {
let enabled = [experiment for ([,experiment] of this._experiments) if (experiment._enabled)];
let enabled = [...this._experiments.values()].filter(experiment => experiment._enabled);
if (enabled.length == 1) {
return enabled[0];
@ -1153,7 +1165,7 @@ Experiments.Experiments.prototype = {
return new Set();
}
return new Set([e._addonId for ([,e] of this._experiments) if (e._addonId)]);
return new Set([...this._experiments.values()].map(e => e._addonId));
},
/*
@ -1181,10 +1193,10 @@ Experiments.Experiments.prototype = {
// knowledge for these unknown experiment add-ons.
let installedExperiments = yield installedExperimentAddons();
let expectedAddonIds = this._trackedAddonIds;
let unknownAddons = [a for (a of installedExperiments) if (!expectedAddonIds.has(a.id))];
let unknownAddons = installedExperiments.filter(a => !expectedAddonIds.has(a.id));
if (unknownAddons.length) {
this._log.warn("_evaluateExperiments() - unknown add-ons in AddonManager: " +
[a.id for (a of unknownAddons)].join(", "));
unknownAddons.map(a => a.id).join(", "));
yield uninstallAddons(unknownAddons);
}
@ -2263,18 +2275,18 @@ this.Experiments.PreviousExperimentProvider.prototype = Object.freeze({
return;
}
cb([new PreviousExperimentAddon(e) for (e of this._experimentList)]);
cb(this._experimentList.map(e => new PreviousExperimentAddon(e)));
},
_updateExperimentList: function () {
return this._experiments.getExperiments().then((experiments) => {
let list = [e for (e of experiments) if (!e.active)];
let list = experiments.filter(e => !e.active);
let newMap = new Map([[e.id, e] for (e of list)]);
let oldMap = new Map([[e.id, e] for (e of this._experimentList)]);
let newMap = new Map(list.map(e => [e.id, e]));
let oldMap = new Map(this._experimentList.map(e => [e.id, e]));
let added = [e.id for (e of list) if (!oldMap.has(e.id))];
let removed = [e.id for (e of this._experimentList) if (!newMap.has(e.id))];
let added = [...newMap.keys()].filter(id => !oldMap.has(id));
let removed = [...oldMap.keys()].filter(id => !newMap.has(id));
for (let id of added) {
this._log.trace("updateExperimentList() - adding " + id);

View File

@ -38,9 +38,11 @@ function sha1File(path) {
is.close();
let bytes = hasher.finish(false);
return [("0" + bytes.charCodeAt(byte).toString(16)).slice(-2)
for (byte in bytes)]
.join("");
let rv = "";
for (let i = 0; i < bytes.length; i++) {
rv += ("0" + bytes.charCodeAt(i).toString(16)).substr(-2);
}
return rv;
}
const EXPERIMENT1_ID = "test-experiment-1@tests.mozilla.org";
@ -153,7 +155,7 @@ function getExperimentAddons(previous=false) {
if (previous) {
deferred.resolve(addons);
} else {
deferred.resolve([a for (a of addons) if (!a.appDisabled)]);
deferred.resolve(addons.filter(a => !a.appDisabled));
}
});

View File

@ -156,8 +156,11 @@ add_task(function* test_disableExperiments() {
try {
yield experiments.updateManifest();
} catch (e if e.message == "experiments are disabled") {
// This exception is expected.
} catch (e) {
// This exception is expected, we rethrow everything else
if (e.message != "experiments are disabled") {
throw e;
}
}
experiments.notify();

View File

@ -40,7 +40,7 @@ add_test(function setup() {
run_next_test();
});
add_task(function test_constructor() {
add_task(function* test_constructor() {
Experiments.instance();
yield Experiments._mainTask;
let provider = new ExperimentsProvider();

View File

@ -50,7 +50,7 @@ loop.panel = (function(_, mozL10n) {
),
React.createElement("div", {className: "fte-button-container"},
React.createElement(Button, {additionalClass: "fte-get-started-button",
caption: mozL10n.get("first_time_experience_button_label"),
caption: mozL10n.get("first_time_experience_button_label2"),
htmlId: "fte-button",
onClick: this.handleButtonClick})
)

View File

@ -50,7 +50,7 @@ loop.panel = (function(_, mozL10n) {
</div>
<div className="fte-button-container">
<Button additionalClass="fte-get-started-button"
caption={mozL10n.get("first_time_experience_button_label")}
caption={mozL10n.get("first_time_experience_button_label2")}
htmlId="fte-button"
onClick={this.handleButtonClick} />
</div>

View File

@ -1,3 +1,3 @@
This is the pdf.js project output, https://github.com/mozilla/pdf.js
Current extension version is: 1.3.76
Current extension version is: 1.3.110

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -77,6 +77,10 @@
}
.annotationLayer section {
position: absolute;
}
.annotationLayer .annotLink > a:hover {
opacity: 0.2;
background: #ff0;

View File

@ -12,7 +12,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar,
/* globals PDFJS, PDFBug, FirefoxCom, Stats, ProgressBar,
DownloadManager, getFileName, getPDFFileNameFromURL,
PDFHistory, Preferences, SidebarView, ViewHistory, Stats,
PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
@ -3686,7 +3686,7 @@ var PDFPageView = (function PDFPageViewClosure() {
}
if (redrawAnnotations && this.annotationLayer) {
this.annotationLayer.setupAnnotations(this.viewport, 'display');
this.annotationLayer.render(this.viewport, 'display');
}
},
@ -3907,7 +3907,7 @@ var PDFPageView = (function PDFPageViewClosure() {
this.annotationLayer = this.annotationsLayerFactory.
createAnnotationsLayerBuilder(div, this.pdfPage);
}
this.annotationLayer.setupAnnotations(this.viewport, 'display');
this.annotationLayer.render(this.viewport, 'display');
}
div.setAttribute('data-loaded', true);
@ -4306,8 +4306,6 @@ DefaultTextLayerFactory.prototype = {
* @class
*/
var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
var CustomStyle = PDFJS.CustomStyle;
/**
* @param {AnnotationsLayerBuilderOptions} options
* @constructs AnnotationsLayerBuilder
@ -4319,6 +4317,7 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
this.div = null;
}
AnnotationsLayerBuilder.prototype =
/** @lends AnnotationsLayerBuilder.prototype */ {
@ -4326,118 +4325,47 @@ var AnnotationsLayerBuilder = (function AnnotationsLayerBuilderClosure() {
* @param {PageViewport} viewport
* @param {string} intent (default value is 'display')
*/
setupAnnotations:
function AnnotationsLayerBuilder_setupAnnotations(viewport, intent) {
function bindLink(link, dest) {
link.href = linkService.getDestinationHash(dest);
link.onclick = function annotationsLayerBuilderLinksOnclick() {
if (dest) {
linkService.navigateTo(dest);
}
return false;
};
if (dest) {
link.className = 'internalLink';
}
}
function bindNamedAction(link, action) {
link.href = linkService.getAnchorUrl('');
link.onclick = function annotationsLayerBuilderNamedActionOnClick() {
linkService.executeNamedAction(action);
return false;
};
link.className = 'internalLink';
}
var linkService = this.linkService;
var pdfPage = this.pdfPage;
render: function AnnotationsLayerBuilder_render(viewport, intent) {
var self = this;
var getAnnotationsParams = {
var parameters = {
intent: (intent === undefined ? 'display' : intent),
};
pdfPage.getAnnotations(getAnnotationsParams).then(
function (annotationsData) {
this.pdfPage.getAnnotations(parameters).then(function (annotations) {
viewport = viewport.clone({ dontFlip: true });
var transform = viewport.transform;
var transformStr = 'matrix(' + transform.join(',') + ')';
var data, element, i, ii;
if (self.div) {
// If an annotationLayer already exists, refresh its children's
// transformation matrices
for (i = 0, ii = annotationsData.length; i < ii; i++) {
data = annotationsData[i];
element = self.div.querySelector(
'[data-annotation-id="' + data.id + '"]');
if (element) {
CustomStyle.setProp('transform', element, transformStr);
}
}
// See PDFPageView.reset()
self.div.removeAttribute('hidden');
// transformation matrices.
PDFJS.AnnotationLayer.update(viewport, self.div, annotations);
} else {
for (i = 0, ii = annotationsData.length; i < ii; i++) {
data = annotationsData[i];
if (!data || !data.hasHtml) {
continue;
}
// Create an annotation layer div and render the annotations
// if there is at least one annotation.
if (annotations.length === 0) {
return;
}
element = PDFJS.AnnotationUtils.getHtmlElement(data,
pdfPage.commonObjs);
element.setAttribute('data-annotation-id', data.id);
if (typeof mozL10n !== 'undefined') {
mozL10n.translate(element);
}
self.div = document.createElement('div');
self.div.className = 'annotationLayer';
self.pageDiv.appendChild(self.div);
var rect = data.rect;
var view = pdfPage.view;
rect = PDFJS.Util.normalizeRect([
rect[0],
view[3] - rect[1] + view[1],
rect[2],
view[3] - rect[3] + view[1]
]);
element.style.left = rect[0] + 'px';
element.style.top = rect[1] + 'px';
element.style.position = 'absolute';
CustomStyle.setProp('transform', element, transformStr);
var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
CustomStyle.setProp('transformOrigin', element, transformOriginStr);
if (data.subtype === 'Link' && !data.url) {
var link = element.getElementsByTagName('a')[0];
if (link) {
if (data.action) {
bindNamedAction(link, data.action);
} else {
bindLink(link, ('dest' in data) ? data.dest : null);
}
}
}
if (!self.div) {
var annotationLayerDiv = document.createElement('div');
annotationLayerDiv.className = 'annotationLayer';
self.pageDiv.appendChild(annotationLayerDiv);
self.div = annotationLayerDiv;
}
self.div.appendChild(element);
PDFJS.AnnotationLayer.render(viewport, self.div, annotations,
self.pdfPage, self.linkService);
if (typeof mozL10n !== 'undefined') {
mozL10n.translate(self.div);
}
}
});
},
hide: function () {
hide: function AnnotationsLayerBuilder_hide() {
if (!this.div) {
return;
}
this.div.setAttribute('hidden', 'true');
}
};
return AnnotationsLayerBuilder;
})();

View File

@ -31,7 +31,6 @@ sign_in_again_use_as_guest_button2=Use {{clientSuperShortname}} as a Guest
panel_browse_with_friend_button=Browse this page with a friend
panel_stop_sharing_tabs_button=Stop sharing your tabs
first_time_experience_button_label=Get Started
## LOCALIZATION_NOTE(first_time_experience_subheading2): Message inviting the
## user to create his or her first conversation.
first_time_experience_subheading2=Click the Hello button to browse Web pages with a friend.
@ -39,7 +38,7 @@ first_time_experience_subheading2=Click the Hello button to browse Web pages wit
## LOCALIZATION_NOTE(first_time_experience_content): Message describing
## ways to use Hello project.
first_time_experience_content=Use it to plan together, work together, laugh together.
first_time_experience_button_label=See how it works
first_time_experience_button_label2=See how it works

View File

@ -534,8 +534,12 @@ this.BrowserUITelemetry = {
// items are in there.
let paletteItems =
CustomizableUI.getUnusedWidgets(aWindow.gNavToolbox.palette);
let defaultRemoved = [item.id for (item of paletteItems)
if (DEFAULT_ITEMS.indexOf(item.id) != -1)];
let defaultRemoved = [];
for (item of paletteItems) {
if (DEFAULT_ITEMS.indexOf(item.id) != -1) {
defaultRemoved.push(item.id);
}
}
result.defaultKept = defaultKept;
result.defaultMoved = defaultMoved;

View File

@ -70,7 +70,7 @@ var Chat = {
// Make a new array instead of the live NodeList so this iterator can be
// used for closing/deleting.
let chatboxes = [c for (c of chatbar.children)];
let chatboxes = [...chatbar.children];
for (let chatbox of chatboxes) {
yield chatbox;
}
@ -244,7 +244,7 @@ var Chat = {
// When the buttonSet is coming from an XML attribute, it will be a string.
if (typeof buttonSet == "string") {
buttonSet = [for (button of buttonSet.split(",")) button.trim()];
buttonSet = buttonSet.split(",").map(button => button.trim());
}
// Make sure to keep the current set around.

View File

@ -64,7 +64,7 @@ var ContentClick = {
// This part is based on handleLinkClick.
var where = window.whereToOpenLink(json);
if (where == "current")
return false;
return;
// Todo(903022): code for where == save

View File

@ -35,8 +35,11 @@ function getMessageManagerForWindow(aContentWindow) {
try {
// If e10s is disabled, this throws NS_NOINTERFACE for closed tabs.
return ir.getInterface(Ci.nsIContentFrameMessageManager);
} catch(e if e.result == Cr.NS_NOINTERFACE) {
return null;
} catch(e) {
if (e.result == Cr.NS_NOINTERFACE) {
return null;
}
throw e;
}
}

View File

@ -212,7 +212,7 @@ this.ContentSearch = {
let event = this._eventQueue.shift();
return this._currentEventPromise = Task.spawn(function* () {
this._currentEventPromise = Task.spawn(function* () {
try {
yield this["_on" + event.type](event.data);
} catch (err) {

View File

@ -337,8 +337,11 @@ function getMessageManagerForWindow(aContentWindow) {
try {
// If e10s is disabled, this throws NS_NOINTERFACE for closed tabs.
return ir.getInterface(Ci.nsIContentFrameMessageManager);
} catch(e if e.result == Cr.NS_NOINTERFACE) {
return null;
} catch(e) {
if (e.result == Cr.NS_NOINTERFACE) {
return null;
}
throw e;
}
}

View File

@ -773,7 +773,7 @@ var DirectoryLinksProvider = {
RemoteNewTabUtils.links.addObserver(this);
}
return Task.spawn(function() {
return Task.spawn(function*() {
// get the last modified time of the links file if it exists
let doesFileExists = yield OS.File.exists(this._directoryFilePath);
if (doesFileExists) {
@ -916,7 +916,7 @@ var DirectoryLinksProvider = {
if (!sortedLinks) {
// If NewTabUtils.links.resetCache() is called before getting here,
// sortedLinks may be undefined.
return;
return undefined;
}
// Delete the current suggested tile, if one exists.
@ -939,7 +939,7 @@ var DirectoryLinksProvider = {
// There are no potential suggested links we can show or not
// enough history for a suggested tile, or suggested tile was
// recently blocked and wait time interval has not decayed yet
return;
return undefined;
}
// Create a flat list of all possible links we can show as suggested.
@ -994,7 +994,7 @@ var DirectoryLinksProvider = {
// We might have run out of possible links to show
let numLinks = possibleLinks.size;
if (numLinks == 0) {
return;
return undefined;
}
let flattenedLinks = [...possibleLinks.values()];

View File

@ -11,6 +11,7 @@ var Cu = Components.utils;
this.EXPORTED_SYMBOLS = ["ProcessHangMonitor"];
Cu.import("resource://gre/modules/AppConstants.jsm");
Cu.import("resource://gre/modules/Services.jsm");
/**
@ -176,7 +177,7 @@ var ProcessHangMonitor = {
handleUserInput: function(win, func) {
let report = this.findActiveReport(win.gBrowser.selectedBrowser);
if (!report) {
return;
return null;
}
this.removeActiveReport(report);
@ -322,8 +323,7 @@ var ProcessHangMonitor = {
}
}];
#ifdef MOZ_DEV_EDITION
if (report.hangType == report.SLOW_SCRIPT) {
if (AppConstants.MOZ_DEV_EDITION && report.hangType == report.SLOW_SCRIPT) {
buttons.push({
label: bundle.getString("processHang.button_debug.label"),
accessKey: bundle.getString("processHang.button_debug.accessKey"),
@ -332,7 +332,6 @@ var ProcessHangMonitor = {
}
});
}
#endif
nb.appendNotification(bundle.getString("processHang.label"),
"process-hang",

View File

@ -137,7 +137,9 @@ this.Social = {
},
_updateWorkerState: function(enable) {
[p.enabled = enable for (p of Social.providers) if (p.enabled != enable)];
for (let p of Social.providers) {
p.enabled = enable;
}
},
// Called to update our cache of providers and set the current provider

View File

@ -37,6 +37,10 @@ this.TabGroupsMigrator = {
migrate(stateAsSupportsString) {
stateAsSupportsString.QueryInterface(Ci.nsISupportsString);
let stateStr = stateAsSupportsString.data;
// If this is the very first startup of this profile, this is going to be empty:
if (!stateStr) {
return;
}
let state;
try {
state = JSON.parse(stateStr);

View File

@ -543,7 +543,12 @@ TabWindow.prototype = {
// Previews are internally stored using a map, so we need to iterate the
// tabbrowser's array of tabs to retrieve previews in the same order.
let inorder = [previews.get(t) for (t of tabs) if (previews.has(t))];
let inorder = [];
for (let t of tabs) {
if (previews.has(t)) {
inorder.push(previews.get(t));
}
}
// Since the internal taskbar array has not yet been updated we must force
// on it the sorting order of our local array. To do so we must walk

View File

@ -33,6 +33,7 @@ EXTRA_JS_MODULES += [
'offlineAppCache.jsm',
'PanelFrame.jsm',
'PluginContent.jsm',
'ProcessHangMonitor.jsm',
'ReaderParent.jsm',
'RecentWindow.jsm',
'RemotePrompt.jsm',
@ -46,10 +47,6 @@ EXTRA_JS_MODULES += [
'webrtcUI.jsm',
]
EXTRA_PP_JS_MODULES += [
'ProcessHangMonitor.jsm'
]
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
EXTRA_JS_MODULES += [
'Windows8WindowFrameColor.jsm',

View File

@ -1,102 +1,97 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/*
WHERE'S MAH BUCKET?!
\
___
.-9 9 `\
=(:(::)= ;
|||| \
|||| `-.
,\|\| `,
/ \
; `'---.,
| `\
; / |
\ | /
) \ __,.--\ /
.-' \,..._\ \` .-' .-'
`-=`` `: | /-/-/`
`.__/
*/
"use strict";
function generatorTest() {
let s = {};
Components.utils.import("resource:///modules/BrowserUITelemetry.jsm", s);
let BUIT = s.BrowserUITelemetry;
registerCleanupFunction(function() {
BUIT.setBucket(null);
});
// setBucket
is(BUIT.currentBucket, BUIT.BUCKET_DEFAULT, "Bucket should be default bucket");
BUIT.setBucket("mah-bucket");
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "mah-bucket", "Bucket should have correct name");
BUIT.setBucket(null);
is(BUIT.currentBucket, BUIT.BUCKET_DEFAULT, "Bucket should be reset to default");
// _toTimeStr
is(BUIT._toTimeStr(10), "10ms", "Checking time string reprentation, 10ms");
is(BUIT._toTimeStr(1000 + 10), "1s10ms", "Checking time string reprentation, 1s10ms");
is(BUIT._toTimeStr((20 * 1000) + 10), "20s10ms", "Checking time string reprentation, 20s10ms");
is(BUIT._toTimeStr(60 * 1000), "1m", "Checking time string reprentation, 1m");
is(BUIT._toTimeStr(3 * 60 * 1000), "3m", "Checking time string reprentation, 3m");
is(BUIT._toTimeStr((3 * 60 * 1000) + 1), "3m1ms", "Checking time string reprentation, 3m1ms");
is(BUIT._toTimeStr((60 * 60 * 1000) + (10 * 60 * 1000)), "1h10m", "Checking time string reprentation, 1h10m");
is(BUIT._toTimeStr(100 * 60 * 60 * 1000), "100h", "Checking time string reprentation, 100h");
// setExpiringBucket
BUIT.setExpiringBucket("walrus", [1001, 2001, 3001, 10001]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "1s1ms",
"Bucket should be expiring and have time step of 1s1ms");
waitForCondition(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "2s1ms");
}, nextStep, "Bucket should be expiring and have time step of 2s1ms");
yield undefined;
waitForCondition(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "3s1ms");
}, nextStep, "Bucket should be expiring and have time step of 3s1ms");
yield undefined;
// Interupt previous expiring bucket
BUIT.setExpiringBucket("walrus2", [1002, 2002]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus2" + BUIT.BUCKET_SEPARATOR + "1s2ms",
"Should be new expiring bucket, with time step of 1s2ms");
waitForCondition(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus2" + BUIT.BUCKET_SEPARATOR + "2s2ms");
}, nextStep, "Should be new expiring bucket, with time step of 2s2ms");
yield undefined;
// Let expiring bucket expire
waitForCondition(function() {
return BUIT.currentBucket == BUIT.BUCKET_DEFAULT;
}, nextStep, "Bucket should have expired, default bucket should now be active");
yield undefined;
// Interupt expiring bucket with normal bucket
BUIT.setExpiringBucket("walrus3", [1003, 2003]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus3" + BUIT.BUCKET_SEPARATOR + "1s3ms",
"Should be new expiring bucket, with time step of 1s3ms");
BUIT.setBucket("mah-bucket");
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "mah-bucket", "Bucket should have correct name");
waitForCondition(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "mah-bucket");
}, nextStep, "Next step of old expiring bucket shouldn't have progressed");
yield undefined;
}
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/*
WHERE'S MAH BUCKET?!
\
___
.-9 9 `\
=(:(::)= ;
|||| \
|||| `-.
,\|\| `,
/ \
; `'---.,
| `\
; / |
\ | /
) \ __,.--\ /
.-' \,..._\ \` .-' .-'
`-=`` `: | /-/-/`
`.__/
*/
"use strict";
add_task(function* testBUIT() {
let s = {};
Components.utils.import("resource:///modules/BrowserUITelemetry.jsm", s);
let BUIT = s.BrowserUITelemetry;
registerCleanupFunction(function() {
BUIT.setBucket(null);
});
// setBucket
is(BUIT.currentBucket, BUIT.BUCKET_DEFAULT, "Bucket should be default bucket");
BUIT.setBucket("mah-bucket");
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "mah-bucket", "Bucket should have correct name");
BUIT.setBucket(null);
is(BUIT.currentBucket, BUIT.BUCKET_DEFAULT, "Bucket should be reset to default");
// _toTimeStr
is(BUIT._toTimeStr(10), "10ms", "Checking time string reprentation, 10ms");
is(BUIT._toTimeStr(1000 + 10), "1s10ms", "Checking time string reprentation, 1s10ms");
is(BUIT._toTimeStr((20 * 1000) + 10), "20s10ms", "Checking time string reprentation, 20s10ms");
is(BUIT._toTimeStr(60 * 1000), "1m", "Checking time string reprentation, 1m");
is(BUIT._toTimeStr(3 * 60 * 1000), "3m", "Checking time string reprentation, 3m");
is(BUIT._toTimeStr((3 * 60 * 1000) + 1), "3m1ms", "Checking time string reprentation, 3m1ms");
is(BUIT._toTimeStr((60 * 60 * 1000) + (10 * 60 * 1000)), "1h10m", "Checking time string reprentation, 1h10m");
is(BUIT._toTimeStr(100 * 60 * 60 * 1000), "100h", "Checking time string reprentation, 100h");
// setExpiringBucket
BUIT.setExpiringBucket("walrus", [1001, 2001, 3001, 10001]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "1s1ms",
"Bucket should be expiring and have time step of 1s1ms");
yield waitForConditionPromise(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "2s1ms");
}, "Bucket should be expiring and have time step of 2s1ms");
yield waitForConditionPromise(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus" + BUIT.BUCKET_SEPARATOR + "3s1ms");
}, "Bucket should be expiring and have time step of 3s1ms");
// Interupt previous expiring bucket
BUIT.setExpiringBucket("walrus2", [1002, 2002]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus2" + BUIT.BUCKET_SEPARATOR + "1s2ms",
"Should be new expiring bucket, with time step of 1s2ms");
yield waitForConditionPromise(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "walrus2" + BUIT.BUCKET_SEPARATOR + "2s2ms");
}, "Should be new expiring bucket, with time step of 2s2ms");
// Let expiring bucket expire
yield waitForConditionPromise(function() {
return BUIT.currentBucket == BUIT.BUCKET_DEFAULT;
}, "Bucket should have expired, default bucket should now be active");
// Interupt expiring bucket with normal bucket
BUIT.setExpiringBucket("walrus3", [1003, 2003]);
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "walrus3" + BUIT.BUCKET_SEPARATOR + "1s3ms",
"Should be new expiring bucket, with time step of 1s3ms");
BUIT.setBucket("mah-bucket");
is(BUIT.currentBucket, BUIT.BUCKET_PREFIX + "mah-bucket", "Bucket should have correct name");
yield waitForConditionPromise(function() {
return BUIT.currentBucket == (BUIT.BUCKET_PREFIX + "mah-bucket");
}, "Next step of old expiring bucket shouldn't have progressed");
});

View File

@ -200,7 +200,7 @@ function promiseDirectoryDownloadOnPrefChange(pref, newValue) {
}
function promiseSetupDirectoryLinksProvider(options = {}) {
return Task.spawn(function() {
return Task.spawn(function*() {
let linksURL = options.linksURL || kTestURL;
yield DirectoryLinksProvider.init();
yield promiseDirectoryDownloadOnPrefChange(kLocalePref, options.locale || "en-US");
@ -211,7 +211,7 @@ function promiseSetupDirectoryLinksProvider(options = {}) {
}
function promiseCleanDirectoryLinksProvider() {
return Task.spawn(function() {
return Task.spawn(function*() {
yield promiseDirectoryDownloadOnPrefChange(kLocalePref, "en-US");
yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, kTestURL);
yield DirectoryLinksProvider._clearFrequencyCap();
@ -292,7 +292,7 @@ add_task(function test_shouldUpdateSuggestedTile() {
DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
});
add_task(function test_updateSuggestedTile() {
add_task(function* test_updateSuggestedTile() {
let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
// Initial setup
@ -421,7 +421,7 @@ add_task(function test_updateSuggestedTile() {
DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
});
add_task(function test_suggestedLinksMap() {
add_task(function* test_suggestedLinksMap() {
let data = {"suggested": [suggestedTile1, suggestedTile2, suggestedTile3, suggestedTile4], "directory": [someOtherSite]};
let dataURI = 'data:application/json,' + JSON.stringify(data);
@ -460,7 +460,7 @@ add_task(function test_suggestedLinksMap() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_topSitesWithSuggestedLinks() {
add_task(function* test_topSitesWithSuggestedLinks() {
let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = function(site) {
@ -512,7 +512,7 @@ add_task(function test_topSitesWithSuggestedLinks() {
NewTabUtils.getProviderLinks = origGetProviderLinks;
});
add_task(function test_suggestedAttributes() {
add_task(function* test_suggestedAttributes() {
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = () => true;
@ -569,7 +569,7 @@ add_task(function test_suggestedAttributes() {
DirectoryLinksProvider.removeObserver(gLinks);
});
add_task(function test_frequencyCappedSites_views() {
add_task(function* test_frequencyCappedSites_views() {
Services.prefs.setCharPref(kPingUrlPref, "");
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = () => true;
@ -646,7 +646,7 @@ add_task(function test_frequencyCappedSites_views() {
Services.prefs.setCharPref(kPingUrlPref, kPingUrl);
});
add_task(function test_frequencyCappedSites_click() {
add_task(function* test_frequencyCappedSites_click() {
Services.prefs.setCharPref(kPingUrlPref, "");
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = () => true;
@ -716,7 +716,7 @@ add_task(function test_frequencyCappedSites_click() {
Services.prefs.setCharPref(kPingUrlPref, kPingUrl);
});
add_task(function test_reportSitesAction() {
add_task(function* test_reportSitesAction() {
yield DirectoryLinksProvider.init();
let deferred, expectedPath, expectedPost;
let done = false;
@ -823,7 +823,7 @@ add_task(function test_reportSitesAction() {
done = true;
});
add_task(function test_fetchAndCacheLinks_local() {
add_task(function* test_fetchAndCacheLinks_local() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
// Trigger cache of data or chrome uri files in profD
@ -832,7 +832,7 @@ add_task(function test_fetchAndCacheLinks_local() {
isIdentical(data, kURLData);
});
add_task(function test_fetchAndCacheLinks_remote() {
add_task(function* test_fetchAndCacheLinks_remote() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
// this must trigger directory links json download and save it to cache file
@ -842,7 +842,7 @@ add_task(function test_fetchAndCacheLinks_remote() {
isIdentical(data, kHttpHandlerData[kExamplePath]);
});
add_task(function test_fetchAndCacheLinks_malformedURI() {
add_task(function* test_fetchAndCacheLinks_malformedURI() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
let someJunk = "some junk";
@ -858,7 +858,7 @@ add_task(function test_fetchAndCacheLinks_malformedURI() {
isIdentical(data, "");
});
add_task(function test_fetchAndCacheLinks_unknownHost() {
add_task(function* test_fetchAndCacheLinks_unknownHost() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
let nonExistentServer = "http://localhost:56789/";
@ -874,7 +874,7 @@ add_task(function test_fetchAndCacheLinks_unknownHost() {
isIdentical(data, "");
});
add_task(function test_fetchAndCacheLinks_non200Status() {
add_task(function* test_fetchAndCacheLinks_non200Status() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
yield promiseDirectoryDownloadOnPrefChange(kSourceUrlPref, kFailURL);
@ -884,7 +884,7 @@ add_task(function test_fetchAndCacheLinks_non200Status() {
});
// To test onManyLinksChanged observer, trigger a fetch
add_task(function test_DirectoryLinksProvider__linkObservers() {
add_task(function* test_DirectoryLinksProvider__linkObservers() {
yield DirectoryLinksProvider.init();
let testObserver = new LinksChangeObserver();
@ -899,7 +899,7 @@ add_task(function test_DirectoryLinksProvider__linkObservers() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider__prefObserver_url() {
add_task(function* test_DirectoryLinksProvider__prefObserver_url() {
yield promiseSetupDirectoryLinksProvider({linksURL: kTestURL});
let links = yield fetchData();
@ -928,7 +928,7 @@ add_task(function test_DirectoryLinksProvider__prefObserver_url() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getLinks_noDirectoryData() {
add_task(function* test_DirectoryLinksProvider_getLinks_noDirectoryData() {
let data = {
"directory": [],
};
@ -940,7 +940,7 @@ add_task(function test_DirectoryLinksProvider_getLinks_noDirectoryData() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getLinks_badData() {
add_task(function* test_DirectoryLinksProvider_getLinks_badData() {
let data = {
"en-US": {
"en-US": [{url: "http://example.com", title: "US"}],
@ -966,7 +966,7 @@ add_task(function test_DirectoryLinksProvider_needsDownload() {
DirectoryLinksProvider._lastDownloadMS = 0;
});
add_task(function test_DirectoryLinksProvider_fetchAndCacheLinksIfNecessary() {
add_task(function* test_DirectoryLinksProvider_fetchAndCacheLinksIfNecessary() {
yield DirectoryLinksProvider.init();
yield cleanJsonFile();
// explicitly change source url to cause the download during setup
@ -1008,7 +1008,7 @@ add_task(function test_DirectoryLinksProvider_fetchAndCacheLinksIfNecessary() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_fetchDirectoryOnPrefChange() {
add_task(function* test_DirectoryLinksProvider_fetchDirectoryOnPrefChange() {
yield DirectoryLinksProvider.init();
let testObserver = new LinksChangeObserver();
@ -1029,7 +1029,7 @@ add_task(function test_DirectoryLinksProvider_fetchDirectoryOnPrefChange() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_fetchDirectoryOnShow() {
add_task(function* test_DirectoryLinksProvider_fetchDirectoryOnShow() {
yield promiseSetupDirectoryLinksProvider();
// set lastdownload to 0 to make DirectoryLinksProvider want to download
@ -1043,7 +1043,7 @@ add_task(function test_DirectoryLinksProvider_fetchDirectoryOnShow() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_fetchDirectoryOnInit() {
add_task(function* test_DirectoryLinksProvider_fetchDirectoryOnInit() {
// ensure preferences are set to defaults
yield promiseSetupDirectoryLinksProvider();
// now clean to provider, so we can init it again
@ -1057,7 +1057,7 @@ add_task(function test_DirectoryLinksProvider_fetchDirectoryOnInit() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getLinksFromCorruptedFile() {
add_task(function* test_DirectoryLinksProvider_getLinksFromCorruptedFile() {
yield promiseSetupDirectoryLinksProvider();
// write bogus json to a file and attempt to fetch from it
@ -1069,7 +1069,7 @@ add_task(function test_DirectoryLinksProvider_getLinksFromCorruptedFile() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getAllowedLinks() {
add_task(function* test_DirectoryLinksProvider_getAllowedLinks() {
let data = {"directory": [
{url: "ftp://example.com"},
{url: "http://example.net"},
@ -1090,7 +1090,7 @@ add_task(function test_DirectoryLinksProvider_getAllowedLinks() {
do_check_eq(links[1].url, data["directory"][3].url);
});
add_task(function test_DirectoryLinksProvider_getAllowedImages() {
add_task(function* test_DirectoryLinksProvider_getAllowedImages() {
let data = {"directory": [
{url: "http://example.com", imageURI: "ftp://example.com"},
{url: "http://example.com", imageURI: "http://example.net"},
@ -1111,7 +1111,7 @@ add_task(function test_DirectoryLinksProvider_getAllowedImages() {
do_check_eq(links[1].imageURI, data["directory"][5].imageURI);
});
add_task(function test_DirectoryLinksProvider_getAllowedImages_base() {
add_task(function* test_DirectoryLinksProvider_getAllowedImages_base() {
let data = {"directory": [
{url: "http://example1.com", imageURI: "https://example.com"},
{url: "http://example2.com", imageURI: "https://tiles.cdn.mozilla.net"},
@ -1135,7 +1135,7 @@ add_task(function test_DirectoryLinksProvider_getAllowedImages_base() {
do_check_eq(links[3].url, data["directory"][4].url);
});
add_task(function test_DirectoryLinksProvider_getAllowedEnhancedImages() {
add_task(function* test_DirectoryLinksProvider_getAllowedEnhancedImages() {
let data = {"directory": [
{url: "http://example.com", enhancedImageURI: "ftp://example.com"},
{url: "http://example.com", enhancedImageURI: "http://example.net"},
@ -1156,7 +1156,7 @@ add_task(function test_DirectoryLinksProvider_getAllowedEnhancedImages() {
do_check_eq(links[1].enhancedImageURI, data["directory"][5].enhancedImageURI);
});
add_task(function test_DirectoryLinksProvider_getEnhancedLink() {
add_task(function* test_DirectoryLinksProvider_getEnhancedLink() {
let data = {"enhanced": [
{url: "http://example.net", enhancedImageURI: "data:,net1"},
{url: "http://example.com", enhancedImageURI: "data:,com1"},
@ -1208,7 +1208,7 @@ add_task(function test_DirectoryLinksProvider_getEnhancedLink() {
checkEnhanced("http://example.com", "data:,fresh");
});
add_task(function test_DirectoryLinksProvider_enhancedURIs() {
add_task(function* test_DirectoryLinksProvider_enhancedURIs() {
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = () => true;
let origCurrentTopSiteCount = DirectoryLinksProvider._getCurrentTopSiteCount;
@ -1279,7 +1279,7 @@ add_task(function test_DirectoryLinksProvider_setDefaultEnhanced() {
Services.prefs.clearUserPref("privacy.donottrackheader.value");
});
add_task(function test_timeSensetiveSuggestedTiles() {
add_task(function* test_timeSensetiveSuggestedTiles() {
// make tile json with start and end dates
let testStartTime = Date.now();
// start date is now + 1 seconds
@ -1450,7 +1450,7 @@ add_task(function test_setupStartEndTime() {
do_check_false(link.startTime);
});
add_task(function test_DirectoryLinksProvider_frequencyCapSetup() {
add_task(function* test_DirectoryLinksProvider_frequencyCapSetup() {
yield promiseSetupDirectoryLinksProvider();
yield DirectoryLinksProvider.init();
@ -1526,7 +1526,7 @@ add_task(function test_DirectoryLinksProvider_frequencyCapSetup() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getFrequencyCapLogic() {
add_task(function* test_DirectoryLinksProvider_getFrequencyCapLogic() {
yield promiseSetupDirectoryLinksProvider();
yield DirectoryLinksProvider.init();
@ -1577,7 +1577,7 @@ add_task(function test_DirectoryLinksProvider_getFrequencyCapLogic() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_getFrequencyCapReportSiteAction() {
add_task(function* test_DirectoryLinksProvider_getFrequencyCapReportSiteAction() {
yield promiseSetupDirectoryLinksProvider();
yield DirectoryLinksProvider.init();
@ -1605,7 +1605,7 @@ add_task(function test_DirectoryLinksProvider_getFrequencyCapReportSiteAction()
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_DirectoryLinksProvider_ClickRemoval() {
add_task(function* test_DirectoryLinksProvider_ClickRemoval() {
yield promiseSetupDirectoryLinksProvider();
yield DirectoryLinksProvider.init();
let landingUrl = "http://foo.com";
@ -1709,7 +1709,7 @@ add_task(function test_DirectoryLinksProvider_anonymous() {
do_check_true(DirectoryLinksProvider._newXHR().mozAnon);
});
add_task(function test_sanitizeExplanation() {
add_task(function* test_sanitizeExplanation() {
// Note: this is a basic test to ensure we applied sanitization to the link explanation.
// Full testing for appropriate sanitization is done in parser/xml/test/unit/test_sanitizer.js.
let data = {"suggested": [suggestedTile5]};
@ -1727,7 +1727,7 @@ add_task(function test_sanitizeExplanation() {
do_check_eq(suggestedLink.targetedName, "WE ARE EVIL ");
});
add_task(function test_inadjecentSites() {
add_task(function* test_inadjecentSites() {
let suggestedTile = Object.assign({
check_inadjacency: true
}, suggestedTile1);
@ -1901,7 +1901,7 @@ add_task(function test_inadjecentSites() {
yield promiseCleanDirectoryLinksProvider();
});
add_task(function test_reportPastImpressions() {
add_task(function* test_reportPastImpressions() {
let origIsTopPlacesSite = NewTabUtils.isTopPlacesSite;
NewTabUtils.isTopPlacesSite = () => true;
let origCurrentTopSiteCount = DirectoryLinksProvider._getCurrentTopSiteCount;
@ -2005,7 +2005,7 @@ add_task(function test_reportPastImpressions() {
DirectoryLinksProvider._getCurrentTopSiteCount = origCurrentTopSiteCount;
});
add_task(function test_blockSuggestedTiles() {
add_task(function* test_blockSuggestedTiles() {
// Initial setup
let suggestedTile = suggestedTile1;
let topSites = ["site0.com", "1040.com", "site2.com", "hrblock.com", "site4.com", "freetaxusa.com", "site6.com"];

View File

@ -23,7 +23,7 @@
<button id="rewind-timeline" standalone="true" class="devtools-button"></button>
<button id="pause-resume-timeline" standalone="true" class="devtools-button pause-button paused"></button>
<span id="timeline-rate" standalone="true" class="devtools-button"></span>
<span id="timeline-current-time" class="label"></span>
<span id="timeline-current-time" class="label devtools-toolbarbutton"></span>
</div>
<div id="players"></div>
<div id="error-message">

View File

@ -215,3 +215,6 @@
<!ENTITY simulator_device "Device">
<!ENTITY simulator_screenSize "Screen">
<!ENTITY simulator_pixelRatio "Pixel Ratio">
<!ENTITY simulator_tv_data "TV Simulation">
<!ENTITY simulator_tv_data_open "Config Data">
<!ENTITY simulator_tv_data_open_button "Open Config Directory...">

View File

@ -110,7 +110,6 @@ body {
#timeline-toolbar .label {
padding: 0 5px;
border-style: solid;
border-color: rgba(170, 170, 170, .5);
}
#timeline-toolbar .devtools-button,

View File

@ -187,13 +187,13 @@ body {
* Best effort to match the existing theme, some of the colors
* are duplicated here to prevent weirdness in the main theme. */
.CodeMirror { /* Inherit platform specific font sizing and styles */
.CodeMirror.cm-s-mozilla { /* Inherit platform specific font sizing and styles */
font-family: inherit;
font-size: inherit;
background: transparent;
}
.CodeMirror pre,
.CodeMirror.cm-s-mozilla pre,
.cm-s-mozilla .cm-variable-2,
.cm-s-mozilla .cm-variable-3,
.cm-s-mozilla .cm-operator,

View File

@ -186,13 +186,13 @@ body {
* Best effort to match the existing theme, some of the colors
* are duplicated here to prevent weirdness in the main theme. */
.CodeMirror { /* Inherit platform specific font sizing and styles */
.CodeMirror.cm-s-mozilla { /* Inherit platform specific font sizing and styles */
font-family: inherit;
font-size: inherit;
background: transparent;
}
.CodeMirror pre,
.CodeMirror.cm-s-mozilla pre,
.cm-s-mozilla .cm-variable-2,
.cm-s-mozilla .cm-variable-3,
.cm-s-mozilla .cm-operator,

View File

@ -3,6 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
var Cu = Components.utils;
var Ci = Components.interfaces;
const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
const { GetDevices, GetDeviceString } = require("devtools/client/shared/devices");
@ -117,9 +118,29 @@ var SimulatorEditor = {
this.updateProfileSelector();
this.updateDeviceSelector();
this.updateDeviceFields();
// Change visibility of 'TV Simulator Menu'.
let tvSimMenu = document.querySelector("#tv_simulator_menu");
tvSimMenu.style.visibility = (this._simulator.type === "television")?
"visible" : "hidden";
});
},
// Open the directory of TV Simulator config.
showTVConfigDirectory() {
let profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
profD.append("extensions");
profD.append(this._simulator.addon.id);
profD.append("profile");
profD.append("dummy");
let profileDir = profD.path;
// Show the profile directory.
let nsLocalFile = Components.Constructor("@mozilla.org/file/local;1",
"nsILocalFile", "initWithPath");
new nsLocalFile(profileDir).reveal();
},
// Close the configuration panel.
close() {
this._simulator = null;
@ -317,4 +338,9 @@ window.addEventListener("load", function onLoad() {
// We just loaded, so we probably missed the first configure request.
SimulatorEditor.edit(Simulators._lastConfiguredSimulator);
document.querySelector("#open-tv-dummy-directory").onclick = e => {
SimulatorEditor.showTVConfigDirectory();
e.preventDefault();
};
});

View File

@ -76,6 +76,23 @@
</li>
</ul>
<!-- This menu is shown when simulator type is television-->
<p id="tv_simulator_menu" style="visibility:hidden;">
<h2>&simulator_tv_data;</h2>
<ul>
<li>
<label>
<span class="label">&simulator_tv_data_open;</span>
<button id="open-tv-dummy-directory">
&simulator_tv_data_open_button;
</button>
</label>
</li>
</ul>
</p>
</form>
</body>

View File

@ -296,6 +296,9 @@
sid = params.args.indexOf("-screen");
ok(params.args[sid + 1].includes(device.width + "x" + device.height), "Simulator screen resolution looks right");
// Test Simulator Menu.
is(doc.querySelector("#tv_simulator_menu").style.visibility, "hidden", "OpenTVDummyDirectory Button is not hidden\n");
// Restore default simulator options.
doc.querySelector("#reset").click();
@ -322,6 +325,9 @@
is(form[param].value, String(defaults.television[param]), "Default TV value for device " + param);
}
// Test Simulator Menu
is(doc.querySelector("#tv_simulator_menu").style.visibility, "visible", "OpenTVDummyDirectory Button is not visible");
// Force reload the list of simulators.
Simulators._loadingPromise = null;

View File

@ -0,0 +1,98 @@
# High-Level Inspector Architecture
## UI structure
The Inspector panel is a tab in the toolbox. Like all tabs, it's in its own iframe.
The high-level hierarchy looks something like this:
Toolbox
|
InspectorPanel
|
+-------------+------------------+---------------+
| | | |
MarkupView SelectorSearch HTMLBreadcrumbs ToolSidebar widget (iframes)
|
+- RuleView
|
+- ComputedView
|
+- LayoutView
|
+- FontInspector
|
+- AnimationInspector
## Server dependencies
- The inspector panel relies on a series of actors that live on the server.
- Some of the most important actors are actually instantiated by the toolbox, because these actors are needed for other panels to preview and link to DOM nodes. For example, the webconsole needs to output DOM nodes, highlight them in the page on mouseover, and open them in the inspector on click. This is achieved using some of the same actors that the inspector panel uses.
- See Toolbox.prototype.initInspector: This method instantiates the InspectorActor, WalkerActor and HighlighterActor lazily, whenever they're needed by a panel.
## Panel loading overview
- As with other panels, this starts with Toolbox.prototype.loadTool(id)
- For the inspector though, this calls Toolbox.prototype.initInspector
- When the panel's open method is called:
- It uses the WalkerActor for the first time to know the default selected node (which could be a node that was selected before on the same page).
- It starts listening to the WalkerActor's "new-root" events to know when to display a new DOM tree (when there's a page navigation).
- It creates the breadcrumbs widget, the sidebar widget, the search widget, the markup-view
- Sidebar:
- When this widget initializes, it loads its sub-iframes (rule-view, ...)
- Each of these iframes contain panel that, in turn, listen to inspector events like "new-node-front" to know when to retrieve information about a node (i.e the rule-view will fetch the css rules for a node).
- Markup-view:
- This panel initializes in its iframe, and gets a reference to the WalkerActor. It uses it to know the DOM tree to display. It knows when nodes change (markup-mutations), and knows what root node to start from.
- It only displays the nodes that are supposed to be visible at first (usually html, head, body and direct children of body).
- Then, as you expand nodes, it uses the WalkerActor to get more nodes lazily. It only ever knows data about nodes that have already been expanded once in the UI.
## Server-side structure
Simplified actor hierarchy
InspectorActor
|
+---------------+
| |
WalkerActor PageStyleActor (for rule-view/computed-view)
| |
NodeActor StyleRuleActor
__InspectorActor__
This tab-level actor is the one the inspector-panel connects to. It doesn't do much apart from creating and returning the WalkerActor and PageStyleActor.
__WalkerActor__
- Single most important part of the inspector panel.
- Responsible for walking the DOM on the current page but:
- also walks iframes
- also finds pseudo-elements ::before and ::after
- also finds anonymous content (e.g. in the BrowserToolbox)
- The actor uses an instance of inIDeepTreeWalker to walk the DOM
- Provides a tree of NodeActor objects that reflects the DOM.
- But only has a partial knowledge of the DOM (what is currently displayed/expanded in the MarkupView). It doesn't need to walk the whole tree when you first instantiate it.
- Reflects some of the usual DOM APIs like querySelector.
- Note that methods like querySelector return arbitrarily nested NodeActors, in which case the WalkerActor also sends the list of parents to link the returned nodes to the closest known nodes, so the UI can display the tree correctly.
- Emits events when there are DOM mutations. These events are sent to the front-end and used to, for example refresh the markup-view. This uses an instance of MutationObserver (https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver) configured with, in particular, nativeAnonymousChildList set to true, so that mutation events are also sent when pseudo elements are added/removed via css.
__NodeActor__
- Representation of a single DOM node (tagname, namespace, attributes, parent, sibblings, ...), which panels use to display previews of nodes.
- Also provide useful methods to:
- change attributes
- scroll into view
- get event listeners data
- get image data
- get unique css selector
## Highlighters
One of the important aspects of the inspector is the highlighters.
Some documentation already at: https://wiki.mozilla.org/DevTools/Highlighter
We don't just have 1 highlighter, we have a framework for highlighters:
- a (chrome-only) platform API to inject markup in a native-anonymous node in content (that works on all targets)
- a number of specific highlighter implementations (css transform, rect, selector, geometry, rulers, ...)
- a CustomHighlighterActor to get instances of specific highlighters
The entry point is toolbox-highlighter-utils.js:
- get it with toolbox.highlighterUtils
- use this to easily highlight any node in the page (with the usual box model highlighter),
- also use this to instantiate an other specific highlighter

View File

@ -385,10 +385,27 @@ BluetoothGattManager::Get()
// Create a new instance, register, and return
BluetoothGattManager* manager = new BluetoothGattManager();
NS_ENSURE_TRUE(manager->Init(), nullptr);
sBluetoothGattManager = manager;
return sBluetoothGattManager;
}
bool
BluetoothGattManager::Init()
{
MOZ_ASSERT(NS_IsMainThread());
nsCOMPtr<nsIObserverService> obs = services::GetObserverService();
NS_ENSURE_TRUE(obs, false);
if (NS_FAILED(obs->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false))) {
BT_WARNING("Failed to add observers!");
return false;
}
return true;
}
class BluetoothGattManager::RegisterModuleResultHandler final
: public BluetoothSetupResultHandler
{

View File

@ -203,6 +203,7 @@ private:
class ServerSendIndicationResultHandler;
BluetoothGattManager();
bool Init();
void HandleShutdown();

View File

@ -10,6 +10,7 @@
#include "mozilla/OwningNonNull.h"
#include "mozilla/Preferences.h"
#include "mozilla/Services.h"
#include "mozilla/Telemetry.h"
#include "mozilla/unused.h"
#include "mozilla/dom/AppNotificationServiceOptionsBinding.h"
@ -21,8 +22,10 @@
#include "mozilla/dom/PromiseWorkerProxy.h"
#include "mozilla/dom/ServiceWorkerGlobalScopeBinding.h"
#include "nsAlertsUtils.h"
#include "nsContentPermissionHelper.h"
#include "nsContentUtils.h"
#include "nsCRTGlue.h"
#include "nsDOMJSUtils.h"
#include "nsGlobalWindow.h"
#include "nsIAlertsService.h"
@ -32,8 +35,10 @@
#include "nsILoadContext.h"
#include "nsINotificationStorage.h"
#include "nsIPermissionManager.h"
#include "nsIPermission.h"
#include "nsIScriptSecurityManager.h"
#include "nsIServiceWorkerManager.h"
#include "nsISimpleEnumerator.h"
#include "nsIUUIDGenerator.h"
#include "nsIXPConnect.h"
#include "nsNetUtil.h"
@ -659,6 +664,195 @@ NotificationPermissionRequest::GetTypes(nsIArray** aTypes)
aTypes);
}
NS_IMPL_ISUPPORTS(NotificationTelemetryService, nsIObserver)
NotificationTelemetryService::NotificationTelemetryService()
: mDNDRecorded(false)
{}
NotificationTelemetryService::~NotificationTelemetryService()
{
Unused << NS_WARN_IF(NS_FAILED(RemovePermissionChangeObserver()));
}
/* static */ already_AddRefed<NotificationTelemetryService>
NotificationTelemetryService::GetInstance()
{
nsCOMPtr<nsISupports> telemetrySupports =
do_GetService(NOTIFICATIONTELEMETRYSERVICE_CONTRACTID);
if (!telemetrySupports) {
return nullptr;
}
RefPtr<NotificationTelemetryService> telemetry =
static_cast<NotificationTelemetryService*>(telemetrySupports.get());
return telemetry.forget();
}
nsresult
NotificationTelemetryService::Init()
{
nsresult rv = AddPermissionChangeObserver();
NS_ENSURE_SUCCESS(rv, rv);
RecordPermissions();
return NS_OK;
}
nsresult
NotificationTelemetryService::RemovePermissionChangeObserver()
{
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (!obs) {
return NS_ERROR_OUT_OF_MEMORY;
}
return obs->RemoveObserver(this, "perm-changed");
}
nsresult
NotificationTelemetryService::AddPermissionChangeObserver()
{
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (!obs) {
return NS_ERROR_OUT_OF_MEMORY;
}
return obs->AddObserver(this, "perm-changed", false);
}
void
NotificationTelemetryService::RecordPermissions()
{
if (!Telemetry::CanRecordBase() || !Telemetry::CanRecordExtended()) {
return;
}
nsCOMPtr<nsIPermissionManager> permissionManager =
services::GetPermissionManager();
if (!permissionManager) {
return;
}
nsCOMPtr<nsISimpleEnumerator> enumerator;
nsresult rv = permissionManager->GetEnumerator(getter_AddRefs(enumerator));
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
for (;;) {
bool hasMoreElements;
nsresult rv = enumerator->HasMoreElements(&hasMoreElements);
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
if (!hasMoreElements) {
break;
}
nsCOMPtr<nsISupports> supportsPermission;
rv = enumerator->GetNext(getter_AddRefs(supportsPermission));
if (NS_WARN_IF(NS_FAILED(rv))) {
return;
}
uint32_t capability;
if (!GetNotificationPermission(supportsPermission, &capability)) {
continue;
}
if (capability == nsIPermissionManager::DENY_ACTION) {
Telemetry::Accumulate(Telemetry::WEB_NOTIFICATION_PERMISSIONS, 0);
} else if (capability == nsIPermissionManager::ALLOW_ACTION) {
Telemetry::Accumulate(Telemetry::WEB_NOTIFICATION_PERMISSIONS, 1);
}
}
}
bool
NotificationTelemetryService::GetNotificationPermission(nsISupports* aSupports,
uint32_t* aCapability)
{
nsCOMPtr<nsIPermission> permission = do_QueryInterface(aSupports);
if (!permission) {
return false;
}
nsAutoCString type;
permission->GetType(type);
if (!type.Equals("desktop-notification")) {
return false;
}
permission->GetCapability(aCapability);
return true;
}
void
NotificationTelemetryService::RecordDNDSupported()
{
if (mDNDRecorded) {
return;
}
nsCOMPtr<nsIAlertsService> alertService =
do_GetService(NS_ALERTSERVICE_CONTRACTID);
if (!alertService) {
return;
}
nsCOMPtr<nsIAlertsDoNotDisturb> alertServiceDND =
do_QueryInterface(alertService);
if (!alertServiceDND) {
return;
}
mDNDRecorded = true;
bool isEnabled;
nsresult rv = alertServiceDND->GetManualDoNotDisturb(&isEnabled);
if (NS_FAILED(rv)) {
return;
}
Telemetry::Accumulate(
Telemetry::ALERTS_SERVICE_DND_SUPPORTED_FLAG, true);
}
nsresult
NotificationTelemetryService::RecordSender(nsIPrincipal* aPrincipal)
{
if (!Telemetry::CanRecordBase() || !Telemetry::CanRecordExtended() ||
!nsAlertsUtils::IsActionablePrincipal(aPrincipal)) {
return NS_OK;
}
nsAutoString origin;
nsresult rv = Notification::GetOrigin(aPrincipal, origin);
if (NS_FAILED(rv)) {
return rv;
}
if (!mOrigins.Contains(origin)) {
mOrigins.PutEntry(origin);
Telemetry::Accumulate(Telemetry::WEB_NOTIFICATION_SENDERS, 1);
}
return NS_OK;
}
NS_IMETHODIMP
NotificationTelemetryService::Observe(nsISupports* aSubject,
const char* aTopic,
const char16_t* aData)
{
uint32_t capability;
if (strcmp("perm-changed", aTopic) ||
!NS_strcmp(MOZ_UTF16("cleared"), aData) ||
!GetNotificationPermission(aSubject, &capability)) {
return NS_OK;
}
if (!NS_strcmp(MOZ_UTF16("deleted"), aData)) {
if (capability == nsIPermissionManager::DENY_ACTION) {
Telemetry::Accumulate(
Telemetry::WEB_NOTIFICATION_PERMISSION_REMOVED, 0);
} else if (capability == nsIPermissionManager::ALLOW_ACTION) {
Telemetry::Accumulate(
Telemetry::WEB_NOTIFICATION_PERMISSION_REMOVED, 1);
}
}
return NS_OK;
}
// Observer that the alert service calls to do common tasks and/or dispatch to the
// specific observer for the context e.g. main thread, worker, or service worker.
class NotificationObserver final : public nsIObserver
@ -666,11 +860,14 @@ class NotificationObserver final : public nsIObserver
public:
nsCOMPtr<nsIObserver> mObserver;
nsCOMPtr<nsIPrincipal> mPrincipal;
bool mInPrivateBrowsing;
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
NotificationObserver(nsIObserver* aObserver, nsIPrincipal* aPrincipal)
: mObserver(aObserver), mPrincipal(aPrincipal)
NotificationObserver(nsIObserver* aObserver, nsIPrincipal* aPrincipal,
bool aInPrivateBrowsing)
: mObserver(aObserver), mPrincipal(aPrincipal),
mInPrivateBrowsing(aInPrivateBrowsing)
{
AssertIsOnMainThread();
MOZ_ASSERT(mObserver);
@ -1185,6 +1382,17 @@ NotificationObserver::Observe(nsISupports* aSubject, const char* aTopic,
return NS_OK;
} else if (!strcmp("alertshow", aTopic) ||
!strcmp("alertfinished", aTopic)) {
RefPtr<NotificationTelemetryService> telemetry =
NotificationTelemetryService::GetInstance();
if (telemetry) {
// Record whether "do not disturb" is supported after the first
// notification, to account for falling back to XUL alerts.
telemetry->RecordDNDSupported();
if (!mInPrivateBrowsing) {
// Ignore senders in private windows.
Unused << NS_WARN_IF(NS_FAILED(telemetry->RecordSender(mPrincipal)));
}
}
Unused << NS_WARN_IF(NS_FAILED(AdjustPushQuota(aTopic)));
if (!strcmp("alertshow", aTopic)) {
@ -1425,6 +1633,30 @@ ServiceWorkerNotificationObserver::Observe(nsISupports* aSubject,
return NS_OK;
}
bool
Notification::IsInPrivateBrowsing()
{
nsIDocument* doc = mWorkerPrivate ? mWorkerPrivate->GetDocument()
: GetOwner()->GetExtantDoc();
if (doc) {
nsCOMPtr<nsILoadContext> loadContext = doc->GetLoadContext();
return loadContext && loadContext->UsePrivateBrowsing();
}
if (mWorkerPrivate) {
// Not all workers may have a document, but with Bug 1107516 fixed, they
// should all have a loadcontext.
nsCOMPtr<nsILoadGroup> loadGroup = mWorkerPrivate->GetLoadGroup();
nsCOMPtr<nsILoadContext> loadContext;
NS_QueryNotificationCallbacks(nullptr, loadGroup, NS_GET_IID(nsILoadContext),
getter_AddRefs(loadContext));
return loadContext && loadContext->UsePrivateBrowsing();
}
//XXXnsm Should this default to true?
return false;
}
void
Notification::ShowInternal()
{
@ -1499,7 +1731,8 @@ Notification::ShowInternal()
}
MOZ_ASSERT(observer);
nsCOMPtr<nsIObserver> alertObserver = new NotificationObserver(observer,
GetPrincipal());
GetPrincipal(),
IsInPrivateBrowsing());
#ifdef MOZ_B2G
@ -1550,22 +1783,7 @@ Notification::ShowInternal()
// nsIObserver. Thus the cookie must be unique to differentiate observers.
nsString uniqueCookie = NS_LITERAL_STRING("notification:");
uniqueCookie.AppendInt(sCount++);
//XXXnsm Should this default to true?
bool inPrivateBrowsing = false;
nsIDocument* doc = mWorkerPrivate ? mWorkerPrivate->GetDocument()
: GetOwner()->GetExtantDoc();
if (doc) {
nsCOMPtr<nsILoadContext> loadContext = doc->GetLoadContext();
inPrivateBrowsing = loadContext && loadContext->UsePrivateBrowsing();
} else if (mWorkerPrivate) {
// Not all workers may have a document, but with Bug 1107516 fixed, they
// should all have a loadcontext.
nsCOMPtr<nsILoadGroup> loadGroup = mWorkerPrivate->GetLoadGroup();
nsCOMPtr<nsILoadContext> loadContext;
NS_QueryNotificationCallbacks(nullptr, loadGroup, NS_GET_IID(nsILoadContext),
getter_AddRefs(loadContext));
inPrivateBrowsing = loadContext && loadContext->UsePrivateBrowsing();
}
bool inPrivateBrowsing = IsInPrivateBrowsing();
nsAutoString alertName;
GetAlertName(alertName);

View File

@ -15,6 +15,11 @@
#include "nsIObserver.h"
#include "nsCycleCollectionParticipant.h"
#include "nsHashKeys.h"
#include "nsTHashtable.h"
#define NOTIFICATIONTELEMETRYSERVICE_CONTRACTID \
"@mozilla.org/notificationTelemetryService;1"
class nsIPrincipal;
class nsIVariant;
@ -44,6 +49,35 @@ public:
Notify(JSContext* aCx, workers::Status aStatus) override;
};
// Records telemetry probes at application startup, when a notification is
// shown, and when the notification permission is revoked for a site.
class NotificationTelemetryService final : public nsIObserver
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
NotificationTelemetryService();
static already_AddRefed<NotificationTelemetryService> GetInstance();
nsresult Init();
void RecordDNDSupported();
void RecordPermissions();
nsresult RecordSender(nsIPrincipal* aPrincipal);
private:
virtual ~NotificationTelemetryService();
nsresult AddPermissionChangeObserver();
nsresult RemovePermissionChangeObserver();
bool GetNotificationPermission(nsISupports* aSupports,
uint32_t* aCapability);
bool mDNDRecorded;
nsTHashtable<nsStringHashKey> mOrigins;
};
/*
* Notifications on workers introduce some lifetime issues. The property we
@ -107,6 +141,7 @@ class Notification : public DOMEventTargetHelper
friend class ServiceWorkerNotificationObserver;
friend class WorkerGetRunnable;
friend class WorkerNotificationObserver;
friend class NotificationTelemetryService;
public:
IMPL_EVENT_HANDLER(click)
@ -290,6 +325,7 @@ protected:
const nsAString& aTitle,
const NotificationOptions& aOptions);
bool IsInPrivateBrowsing();
void ShowInternal();
void CloseInternal();

View File

@ -82,4 +82,7 @@
#define SERVICEWORKERMANAGER_CID \
{ 0xc74bde32, 0xbcc7, 0x4840, { 0x84, 0x30, 0xc7, 0x33, 0x35, 0x1b, 0x21, 0x2a } }
#define NOTIFICATIONTELEMETRYSERVICE_CID \
{ 0x5995b782, 0x6a0e, 0x4066, { 0xaa, 0xc5, 0x27, 0x6f, 0x0a, 0x9a, 0xd8, 0xcf } }
#endif /* nsLayoutCID_h__ */

View File

@ -87,6 +87,7 @@
#include "mozilla/dom/quota/QuotaManagerService.h"
#include "mozilla/dom/workers/ServiceWorkerManager.h"
#include "mozilla/dom/workers/WorkerDebuggerManager.h"
#include "mozilla/dom/Notification.h"
#include "mozilla/OSFileConstants.h"
#include "mozilla/Services.h"
@ -273,6 +274,7 @@ using mozilla::dom::UDPSocketChild;
using mozilla::dom::time::TimeService;
using mozilla::net::StreamingProtocolControllerService;
using mozilla::gmp::GeckoMediaPluginService;
using mozilla::dom::NotificationTelemetryService;
// Transformiix
/* 5d5d92cd-6bf8-11d9-bf4a-000a95dc234c */
@ -400,6 +402,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(InputPortData)
NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIPresentationService,
NS_CreatePresentationService)
NS_GENERIC_FACTORY_CONSTRUCTOR(PresentationSessionTransport)
NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NotificationTelemetryService, Init)
//-----------------------------------------------------------------------------
static bool gInitialized = false;
@ -762,6 +765,7 @@ NS_DEFINE_NAMED_CID(NS_TEXTEDITOR_CID);
NS_DEFINE_NAMED_CID(DOMREQUEST_SERVICE_CID);
NS_DEFINE_NAMED_CID(QUOTAMANAGER_SERVICE_CID);
NS_DEFINE_NAMED_CID(SERVICEWORKERMANAGER_CID);
NS_DEFINE_NAMED_CID(NOTIFICATIONTELEMETRYSERVICE_CID);
NS_DEFINE_NAMED_CID(WORKERDEBUGGERMANAGER_CID);
#ifdef MOZ_WIDGET_GONK
NS_DEFINE_NAMED_CID(SYSTEMWORKERMANAGER_CID);
@ -1070,6 +1074,7 @@ static const mozilla::Module::CIDEntry kLayoutCIDs[] = {
{ &kDOMREQUEST_SERVICE_CID, false, nullptr, DOMRequestServiceConstructor },
{ &kQUOTAMANAGER_SERVICE_CID, false, nullptr, QuotaManagerServiceConstructor },
{ &kSERVICEWORKERMANAGER_CID, false, nullptr, ServiceWorkerManagerConstructor },
{ &kNOTIFICATIONTELEMETRYSERVICE_CID, false, nullptr, NotificationTelemetryServiceConstructor },
{ &kWORKERDEBUGGERMANAGER_CID, true, nullptr, WorkerDebuggerManagerConstructor },
#ifdef MOZ_WIDGET_GONK
{ &kSYSTEMWORKERMANAGER_CID, true, nullptr, SystemWorkerManagerConstructor },
@ -1238,6 +1243,7 @@ static const mozilla::Module::ContractIDEntry kLayoutContracts[] = {
{ DOMREQUEST_SERVICE_CONTRACTID, &kDOMREQUEST_SERVICE_CID },
{ QUOTAMANAGER_SERVICE_CONTRACTID, &kQUOTAMANAGER_SERVICE_CID },
{ SERVICEWORKERMANAGER_CONTRACTID, &kSERVICEWORKERMANAGER_CID },
{ NOTIFICATIONTELEMETRYSERVICE_CONTRACTID, &kNOTIFICATIONTELEMETRYSERVICE_CID },
{ WORKERDEBUGGERMANAGER_CONTRACTID, &kWORKERDEBUGGERMANAGER_CID },
#ifdef MOZ_WIDGET_GONK
{ SYSTEMWORKERMANAGER_CONTRACTID, &kSYSTEMWORKERMANAGER_CID },
@ -1352,6 +1358,7 @@ static const mozilla::Module::CategoryEntry kLayoutCategories[] = {
#endif
{ "profile-after-change", "PresentationDeviceManager", PRESENTATION_DEVICE_MANAGER_CONTRACTID },
{ "profile-after-change", "PresentationService", PRESENTATION_SERVICE_CONTRACTID },
{ "profile-after-change", "Notification Telemetry Service", NOTIFICATIONTELEMETRYSERVICE_CONTRACTID },
{ nullptr }
};

View File

@ -4225,18 +4225,28 @@ void ScrollFrameHelper::CurPosAttributeChanged(nsIContent* aContent)
/* ============= Scroll events ========== */
NS_IMETHODIMP
ScrollFrameHelper::ScrollEvent::Run()
ScrollFrameHelper::ScrollEvent::ScrollEvent(ScrollFrameHelper* aHelper)
: mHelper(aHelper)
{
if (mHelper)
mHelper->FireScrollEvent();
return NS_OK;
mHelper->mOuter->PresContext()->RefreshDriver()->AddRefreshObserver(this, Flush_Style);
}
ScrollFrameHelper::ScrollEvent::~ScrollEvent()
{
mHelper->mOuter->PresContext()->RefreshDriver()->RemoveRefreshObserver(this, Flush_Style);
}
void
ScrollFrameHelper::ScrollEvent::WillRefresh(mozilla::TimeStamp aTime)
{
mHelper->FireScrollEvent();
}
void
ScrollFrameHelper::FireScrollEvent()
{
mScrollEvent.Forget();
MOZ_ASSERT(mScrollEvent);
mScrollEvent = nullptr;
ActiveLayerTracker::SetCurrentScrollHandlerFrame(mOuter);
WidgetGUIEvent event(true, eScroll, nullptr);
@ -4263,14 +4273,11 @@ ScrollFrameHelper::FireScrollEvent()
void
ScrollFrameHelper::PostScrollEvent()
{
if (mScrollEvent.IsPending())
if (mScrollEvent)
return;
nsRootPresContext* rpc = mOuter->PresContext()->GetRootPresContext();
if (!rpc)
return;
// The ScrollEvent constructor registers itself with the refresh driver.
mScrollEvent = new ScrollEvent(this);
rpc->AddWillPaintObserver(mScrollEvent.get());
}
NS_IMETHODIMP

View File

@ -19,6 +19,7 @@
#include "nsIReflowCallback.h"
#include "nsBoxLayoutState.h"
#include "nsQueryFrame.h"
#include "nsRefreshDriver.h"
#include "nsExpirationTracker.h"
#include "TextOverflow.h"
#include "ScrollVelocityQueue.h"
@ -101,11 +102,13 @@ public:
bool IsSmoothScrollingEnabled();
class ScrollEvent : public nsRunnable {
class ScrollEvent : public nsARefreshObserver {
public:
NS_DECL_NSIRUNNABLE
explicit ScrollEvent(ScrollFrameHelper *helper) : mHelper(helper) {}
void Revoke() { mHelper = nullptr; }
NS_INLINE_DECL_REFCOUNTING(ScrollEvent, override)
explicit ScrollEvent(ScrollFrameHelper *helper);
void WillRefresh(mozilla::TimeStamp aTime) override;
protected:
virtual ~ScrollEvent();
private:
ScrollFrameHelper *mHelper;
};
@ -417,7 +420,7 @@ public:
nsCOMPtr<nsIContent> mScrollCornerContent;
nsCOMPtr<nsIContent> mResizerContent;
nsRevocableEventPtr<ScrollEvent> mScrollEvent;
RefPtr<ScrollEvent> mScrollEvent;
nsRevocableEventPtr<AsyncScrollPortEvent> mAsyncScrollPortEvent;
nsRevocableEventPtr<ScrolledAreaEvent> mScrolledAreaEvent;
nsIFrame* mHScrollbarBox;

View File

@ -657,11 +657,6 @@ pref("urlclassifier.gethash.timeout_ms", 5000);
pref("urlclassifier.max-complete-age", 2700);
#endif
// URL for posting tiles metrics.
#ifdef RELEASE_BUILD
pref("browser.tiles.reportURL", "https://tiles.services.mozilla.com/v2/links/click");
#endif
// True if this is the first time we are showing about:firstrun
pref("browser.firstrun.show.uidiscovery", true);
pref("browser.firstrun.show.localepicker", false);

View File

@ -35,9 +35,6 @@
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"/>
<uses-permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
<uses-permission android:name="@ANDROID_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"/>
#ifdef MOZ_ANDROID_DOWNLOADS_INTEGRATION
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
#endif
@ -371,10 +368,7 @@
</receiver>
<receiver android:name="org.mozilla.gecko.GeckoMessageReceiver"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER">
<intent-filter>
<action android:name="org.mozilla.gecko.INIT_PW"></action>
</intent-filter>
android:exported="false">
</receiver>
<!-- Catch install referrer so we can do post-install work. -->
@ -421,7 +415,7 @@
<provider android:name="org.mozilla.gecko.db.BrowserProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.db.browser"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
android:exported="false"/>
<!-- Share overlay activity
@ -454,36 +448,35 @@
<provider android:name="org.mozilla.gecko.db.PasswordsProvider"
android:label="@string/sync_configure_engines_title_passwords"
android:authorities="@ANDROID_PACKAGE_NAME@.db.passwords"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"
android:exported="false"
android:process="@MANGLED_ANDROID_PACKAGE_NAME@.PasswordsProvider"/>
<provider android:name="org.mozilla.gecko.db.FormHistoryProvider"
android:label="@string/sync_configure_engines_title_history"
android:authorities="@ANDROID_PACKAGE_NAME@.db.formhistory"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"
android:protectionLevel="signature"/>
android:exported="false"/>
<provider android:name="org.mozilla.gecko.GeckoProfilesProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.profiles"/>
android:authorities="@ANDROID_PACKAGE_NAME@.profiles"
android:exported="false"/>
<provider android:name="org.mozilla.gecko.db.TabsProvider"
android:label="@string/sync_configure_engines_title_tabs"
android:authorities="@ANDROID_PACKAGE_NAME@.db.tabs"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
android:exported="false"/>
<provider android:name="org.mozilla.gecko.db.HomeProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.db.home"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
android:exported="false"/>
<provider android:name="org.mozilla.gecko.db.ReadingListProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.db.readinglist"
android:exported="false"
android:label="@string/reading_list_title"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
android:exported="false"/>
<provider android:name="org.mozilla.gecko.db.SearchHistoryProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.db.searchhistory"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
android:exported="false"/>
<service
android:exported="false"
@ -519,14 +512,4 @@
#endif
</application>
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"
android:protectionLevel="signature"/>
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"
android:protectionLevel="signature"/>
<permission android:name="@ANDROID_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"
android:protectionLevel="signature"/>
</manifest>

View File

@ -9,3 +9,4 @@ Firefox for Android
uitelemetry
adjust
gradle
defaultdomains

View File

@ -1684,11 +1684,6 @@ public class BrowserApp extends GeckoApp
if (Versions.feature16Plus) {
Telemetry.addToHistogram("BROWSER_IS_ASSIST_DEFAULT", (isDefaultBrowser(Intent.ACTION_ASSIST) ? 1 : 0));
}
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(BrowserApp.this);
if (sharedPrefs.getBoolean(GeckoPreferences.PREFS_OPEN_URLS_IN_PRIVATE, false)) {
Telemetry.addToHistogram("FENNEC_OPEN_URLS_IN_PRIVATE", 1);
}
} else if ("Updater:Launch".equals(event)) {
handleUpdaterLaunch();
} else {

View File

@ -855,12 +855,6 @@ public class Tabs implements GeckoEventListener {
boolean desktopMode = (flags & LOADURL_DESKTOP) != 0;
boolean external = (flags & LOADURL_EXTERNAL) != 0;
final SharedPreferences sharedPrefs = GeckoSharedPrefs.forApp(mAppContext);
final boolean isPrivatePref = sharedPrefs.getBoolean(GeckoPreferences.PREFS_OPEN_URLS_IN_PRIVATE, false);
if (isPrivatePref && external) {
isPrivate = true;
}
args.put("url", url);
args.put("engine", searchEngine);
args.put("parentId", parentId);

View File

@ -177,5 +177,4 @@ public interface BrowserDB {
public abstract boolean hasSuggestedImageUrl(String url);
public abstract String getSuggestedImageUrlForUrl(String url);
public abstract int getSuggestedBackgroundColorForUrl(String url);
public abstract int getTrackingIdForUrl(String url);
}

View File

@ -1655,11 +1655,6 @@ public class LocalBrowserDB implements BrowserDB {
return 0;
}
@Override
public int getTrackingIdForUrl(String url) {
return mSuggestedSites.getTrackingIdForUrl(url);
}
private static void appendUrlsFromCursor(List<String> urls, Cursor c) {
if (!c.moveToFirst()) {
return;

View File

@ -10,6 +10,7 @@ import org.mozilla.gecko.CrashHandler;
import org.mozilla.gecko.GeckoApp;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoEvent;
import org.mozilla.gecko.GeckoMessageReceiver;
import org.mozilla.gecko.NSSBridge;
import org.mozilla.gecko.db.BrowserContract.DeletedPasswords;
import org.mozilla.gecko.db.BrowserContract.Passwords;
@ -216,8 +217,10 @@ public class PasswordsProvider extends SQLiteBridgeContentProvider {
@Override
public void initGecko() {
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("Passwords:Init", null));
Intent initIntent = new Intent(GeckoApp.ACTION_INIT_PW);
// We're not in the main process. The receiver of this Intent can
// communicate with Gecko in the main process.
Intent initIntent = new Intent(getContext(), GeckoMessageReceiver.class);
initIntent.setAction(GeckoApp.ACTION_INIT_PW);
mContext.sendBroadcast(initIntent);
}

View File

@ -379,10 +379,6 @@ public class StubBrowserDB implements BrowserDB {
return 0;
}
public int getTrackingIdForUrl(String url) {
return 0;
}
public Cursor getTopSites(ContentResolver cr, int minLimit, int maxLimit) {
return null;
}

View File

@ -83,9 +83,6 @@ public class SuggestedSites {
BrowserContract.SuggestedSites.TITLE,
};
public static final int TRACKING_ID_NONE = -1;
private static final String JSON_KEY_TRACKING_ID = "trackingid";
private static final String JSON_KEY_URL = "url";
private static final String JSON_KEY_TITLE = "title";
private static final String JSON_KEY_IMAGE_URL = "imageurl";
@ -97,11 +94,9 @@ public class SuggestedSites {
public final String title;
public final String imageUrl;
public final String bgColor;
public final int trackingId;
public final boolean restricted;
public Site(JSONObject json) throws JSONException {
this.trackingId = json.isNull(JSON_KEY_TRACKING_ID) ? TRACKING_ID_NONE : json.getInt(JSON_KEY_TRACKING_ID);
this.restricted = !json.isNull(JSON_KEY_RESTRICTED);
this.url = json.getString(JSON_KEY_URL);
this.title = json.getString(JSON_KEY_TITLE);
@ -111,8 +106,7 @@ public class SuggestedSites {
validate();
}
public Site(int trackingId, String url, String title, String imageUrl, String bgColor) {
this.trackingId = trackingId;
public Site(String url, String title, String imageUrl, String bgColor) {
this.url = url;
this.title = title;
this.imageUrl = imageUrl;
@ -135,8 +129,7 @@ public class SuggestedSites {
@Override
public String toString() {
return "{ trackingId = " + trackingId + "\n" +
"url = " + url + "\n" +
return "{ url = " + url + "\n" +
"restricted = " + restricted + "\n" +
"title = " + title + "\n" +
"imageUrl = " + imageUrl + "\n" +
@ -146,10 +139,6 @@ public class SuggestedSites {
public JSONObject toJSON() throws JSONException {
final JSONObject json = new JSONObject();
if (trackingId >= 0) {
json.put(JSON_KEY_TRACKING_ID, trackingId);
}
if (restricted) {
json.put(JSON_KEY_RESTRICTED, true);
}
@ -541,11 +530,6 @@ public class SuggestedSites {
return (site != null ? site.bgColor : null);
}
public int getTrackingIdForUrl(String url) {
final Site site = getSiteForUrl(url);
return (site != null ? site.trackingId : TRACKING_ID_NONE);
}
private Set<String> loadBlacklist() {
Log.d(LOGTAG, "Loading blacklisted suggested sites from SharedPreferences.");
final Set<String> blacklist = new HashSet<String>();

View File

@ -22,10 +22,13 @@ public class FirstrunPagerConfig {
public static List<FirstrunPanelConfig> getDefault(Context context) {
final List<FirstrunPanelConfig> panels = new LinkedList<>();
if (isInExperimentLocal(context, ONBOARDING_A)) {
// The "Import" feature is disabled on devices running Android M+ (Bug 1183559).
// Exclude these users from the experiment to add an "Import" panel.
if (isInExperimentLocal(context, ONBOARDING_A) && AppConstants.Versions.preM) {
panels.add(new FirstrunPanelConfig(WelcomePanel.class.getName(), WelcomePanel.TITLE_RES));
Telemetry.startUISession(TelemetryContract.Session.EXPERIMENT, ONBOARDING_A);
} else if (isInExperimentLocal(context, ONBOARDING_B)) {
} else if (isInExperimentLocal(context, ONBOARDING_B) && AppConstants.Versions.preM) {
// Strings used for first run, pulled from existing strings.
panels.add(new FirstrunPanelConfig(ImportPanel.class.getName(), ImportPanel.TITLE_RES));
panels.add(new FirstrunPanelConfig(SyncPanel.class.getName(), SyncPanel.TITLE_RES));

View File

@ -17,6 +17,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.ListView;
import org.mozilla.gecko.AppConstants;
@ -26,9 +27,7 @@ import org.mozilla.gecko.TelemetryContract;
import org.mozilla.gecko.preferences.AndroidImport;
import org.mozilla.gecko.util.ThreadUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ImportPanel extends FirstrunPanel {
public static final String LOGTAG = "GeckoImportPanel";
@ -51,21 +50,12 @@ public class ImportPanel extends FirstrunPanel {
@Override
public void onClick(View v) {
final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
final List<Integer> checked = new ArrayList<>(Arrays.asList(0, 1));
final boolean[] checked = {true, true};
Telemetry.sendUIEvent(TelemetryContract.Event.ACTION, TelemetryContract.Method.BUTTON, "firstrun-import-action");
// We set ListView.OnItemClickListener later, which overrides OnMultiChoiceClickListener, so don't make one here.
builder.setTitle(R.string.firstrun_import_action)
.setMultiChoiceItems(R.array.pref_import_android_entries, makeBooleanArray(R.array.pref_import_android_defaults), new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int index, boolean isChecked) {
// Add telemetry for toggling checkboxes.
Telemetry.sendUIEvent(TelemetryContract.Event.EDIT, TelemetryContract.Method.DIALOG, "firstrun-import-dialog-checkbox");
if (isChecked && !checked.contains(index)) {
checked.add(index);
} else if (!isChecked && checked.contains(index)) {
checked.remove(checked.indexOf(index));
}
}
})
.setMultiChoiceItems(R.array.pref_import_android_entries, makeBooleanArray(R.array.pref_import_android_defaults), null)
.setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
@ -76,8 +66,8 @@ public class ImportPanel extends FirstrunPanel {
.setPositiveButton(R.string.firstrun_import_dialog_button, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
final boolean importBookmarks = checked.contains(BOOKMARKS_INDEX);
final boolean importHistory = checked.contains(HISTORY_INDEX);
final boolean importBookmarks = checked[BOOKMARKS_INDEX];
final boolean importHistory = checked[HISTORY_INDEX];
runImport(importBookmarks, importHistory);
@ -93,9 +83,18 @@ public class ImportPanel extends FirstrunPanel {
final Button importButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
final ListView listView = dialog.getListView();
// Setting this listView listener is equivalent to setting OnMultiChoiceClickListener.
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Telemetry.sendUIEvent(TelemetryContract.Event.EDIT, TelemetryContract.Method.DIALOG, "firstrun-import-dialog-checkbox");
// Keep track of checked state.
final boolean isChecked = ((CheckedTextView) view).isChecked();
checked[i] = isChecked;
// Update importButton state.
if (AppConstants.Versions.feature11Plus) {
if (listView.getCheckedItemCount() == 0) {
importButton.setEnabled(false);

View File

@ -12,11 +12,9 @@ import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import org.mozilla.gecko.GeckoProfile;
import org.mozilla.gecko.Locales;
import org.mozilla.gecko.R;
import org.mozilla.gecko.Restrictions;
import org.mozilla.gecko.Tab;
@ -35,8 +33,6 @@ import org.mozilla.gecko.home.PinSiteDialog.OnSiteSelectedListener;
import org.mozilla.gecko.home.TopSitesGridView.OnEditPinnedSiteListener;
import org.mozilla.gecko.home.TopSitesGridView.TopSitesGridContextMenuInfo;
import org.mozilla.gecko.restrictions.Restrictable;
import org.mozilla.gecko.tiles.TilesRecorder;
import org.mozilla.gecko.tiles.Tile;
import org.mozilla.gecko.util.StringUtils;
import org.mozilla.gecko.util.ThreadUtils;
@ -221,14 +217,6 @@ public class TopSitesPanel extends HomeFragment {
}
Telemetry.sendUIEvent(TelemetryContract.Event.LOAD_URL, method, Integer.toString(position));
// Record tile click events on non-private tabs.
final Tab tab = Tabs.getInstance().getSelectedTab();
if (!tab.isPrivate()) {
final Locale locale = Locale.getDefault();
final String localeTag = Locales.getLanguageTag(locale);
TilesRecorder.recordAction(tab, TilesRecorder.ACTION_CLICK, position, getTilesSnapshot(), localeTag);
}
mUrlOpenListener.onUrlOpen(url, EnumSet.noneOf(OnUrlOpenListener.Flags.class));
}
} else {
@ -276,27 +264,6 @@ public class TopSitesPanel extends HomeFragment {
registerForContextMenu(mGrid);
}
private List<Tile> getTilesSnapshot() {
final int count = mGrid.getCount();
final ArrayList<Tile> snapshot = new ArrayList<>();
final BrowserDB db = GeckoProfile.get(getActivity()).getDB();
for (int i = 0; i < count; i++) {
final Cursor cursor = (Cursor) mGrid.getItemAtPosition(i);
final int type = cursor.getInt(cursor.getColumnIndexOrThrow(TopSites.TYPE));
if (type == TopSites.TYPE_BLANK) {
snapshot.add(null);
continue;
}
final String url = cursor.getString(cursor.getColumnIndexOrThrow(TopSites.URL));
final int id = db.getTrackingIdForUrl(url);
final boolean pinned = (type == TopSites.TYPE_PINNED);
snapshot.add(new Tile(id, pinned));
}
return snapshot;
}
@Override
public void onDestroyView() {
super.onDestroyView();

View File

@ -131,7 +131,6 @@ OnSharedPreferenceChangeListener
private static final String PREFS_SYNC = NON_PREF_PREFIX + "sync";
private static final String PREFS_TRACKING_PROTECTION = "privacy.trackingprotection.state";
private static final String PREFS_TRACKING_PROTECTION_PB = "privacy.trackingprotection.pbmode.enabled";
public static final String PREFS_OPEN_URLS_IN_PRIVATE = NON_PREF_PREFIX + "openExternalURLsPrivately";
public static final String PREFS_VOICE_INPUT_ENABLED = NON_PREF_PREFIX + "voice_input_enabled";
public static final String PREFS_QRCODE_ENABLED = NON_PREF_PREFIX + "qrcode_enabled";
private static final String PREFS_ADVANCED = NON_PREF_PREFIX + "advanced.enabled";
@ -701,13 +700,6 @@ OnSharedPreferenceChangeListener
i--;
continue;
}
} else if (PREFS_OPEN_URLS_IN_PRIVATE.equals(key)) {
// Remove UI for opening external links in private browsing on non-Nightly builds.
if (!AppConstants.NIGHTLY_BUILD || !Restrictions.isAllowed(this, Restrictable.PRIVATE_BROWSING)) {
preferences.removePreference(pref);
i--;
continue;
}
} else if (PREFS_TRACKING_PROTECTION.equals(key)) {
// Remove UI for global TP pref in non-Nightly builds.
if (!AppConstants.NIGHTLY_BUILD) {

View File

@ -1,18 +0,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/. */
package org.mozilla.gecko.tiles;
/**
* Metadata for a tile shown on the top sites grid.
*/
public class Tile {
public final int id;
public final boolean pinned;
public Tile(int id, boolean pinned) {
this.id = id;
this.pinned = pinned;
}
}

View File

@ -1,108 +0,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/. */
package org.mozilla.gecko.tiles;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.GeckoEvent;
import org.mozilla.gecko.Tab;
import android.util.Log;
public class TilesRecorder {
public static final String ACTION_CLICK = "click";
private static final String LOG_TAG = "GeckoTilesRecorder";
private static final String EVENT_TILES_CLICK = "Tiles:Click";
private TilesRecorder() {
// Empty private constructor to prevent construction
}
public static void recordAction(Tab tab, String action, int index, List<Tile> tiles, String locale) {
final Tile clickedTile = tiles.get(index);
if (tab == null || clickedTile == null) {
throw new IllegalArgumentException("Tab and tile cannot be null");
}
if (clickedTile.id == -1) {
// User clicked a non-distribution tile, so we don't need to report it.
return;
}
try {
final JSONArray tilesJSON = new JSONArray();
int clickedTileIndex = -1;
int currentTileIndex = 0;
for (int i = 0; i < tiles.size(); i++) {
final Tile tile = tiles.get(i);
if (tile == null) {
// Tiles may be null if there are pinned tiles with blank tiles in between.
continue;
}
// jsonForTile will return {} if the tile isn't tracked or pinned. That's fine
// as we still want to record that a tile exists (i.e., is not empty).
tilesJSON.put(jsonForTile(tile, currentTileIndex, i));
// The click index is relative to the tiles array we're building. That index is
// incremented whenever we hit a non-null tile. When we find the tile that was
// clicked, the index will match its position in the new array.
if (clickedTile == tile) {
clickedTileIndex = currentTileIndex;
}
currentTileIndex++;
}
if (clickedTileIndex == -1) {
throw new IllegalStateException("Clicked tile index not set");
}
final JSONObject payload = new JSONObject();
payload.put(action, clickedTileIndex);
payload.put("tiles", tilesJSON);
payload.put("locale", locale);
final JSONObject data = new JSONObject();
data.put("tabId", tab.getId());
data.put("payload", payload.toString());
GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent(EVENT_TILES_CLICK, data.toString()));
} catch (JSONException e) {
Log.e(LOG_TAG, "JSON error", e);
}
}
private static JSONObject jsonForTile(Tile tile, int tileIndex, int viewIndex) throws JSONException {
final JSONObject tileJSON = new JSONObject();
// Set the ID only if it is a distribution tile with a tracking ID.
if (tile.id != -1) {
tileJSON.put("id", tile.id);
}
// Set pinned to true only if the tile is pinned.
if (tile.pinned) {
tileJSON.put("pin", true);
}
// If the tile's index in the new array does not match its index in the view grid, record
// its position in the view grid. This can happen if there are pinned tiles with blank tiles
// in between.
if (tileIndex != viewIndex) {
tileJSON.put("pos", viewIndex);
}
return tileJSON;
}
}

View File

@ -170,8 +170,6 @@
<!ENTITY pref_developer_remotedebugging_wifi "Remote debugging via Wi-Fi">
<!ENTITY pref_developer_remotedebugging_wifi_disabled_summary "Wi-Fi debugging requires your device to have a QR code reader app installed.">
<!ENTITY pref_remember_signons2 "Remember logins">
<!ENTITY pref_open_external_urls_privately_title "Open links in Private browsing">
<!ENTITY pref_open_external_urls_privately_summary "For all external links opened in &brandShortName;">
<!ENTITY pref_manage_logins "Manage logins">
<!ENTITY pref_category_home "Home">

View File

@ -538,8 +538,6 @@ gbjar.sources += ['java/org/mozilla/gecko/' + x for x in [
'TextSelection.java',
'TextSelectionHandle.java',
'ThumbnailHelper.java',
'tiles/Tile.java',
'tiles/TilesRecorder.java',
'toolbar/AutocompleteHandler.java',
'toolbar/BackButton.java',
'toolbar/BrowserToolbar.java',

View File

@ -33,10 +33,5 @@
android:summary="@string/pref_tab_queue_summary"
android:defaultValue="false" />
<CheckBoxPreference android:key="android.not_a_preference.openExternalURLsPrivately"
android:title="@string/pref_open_external_urls_privately_title"
android:summary="@string/pref_open_external_urls_privately_summary"
android:defaultValue="false" />
</PreferenceScreen>

View File

@ -35,10 +35,5 @@
android:summary="@string/pref_tab_queue_summary"
android:defaultValue="false" />
<CheckBoxPreference android:key="android.not_a_preference.openExternalURLsPrivately"
android:title="@string/pref_open_external_urls_privately_title"
android:summary="@string/pref_open_external_urls_privately_summary"
android:defaultValue="false" />
</PreferenceScreen>

View File

@ -39,10 +39,5 @@
android:summary="@string/pref_tab_queue_summary"
android:defaultValue="false" />
<CheckBoxPreference android:key="android.not_a_preference.openExternalURLsPrivately"
android:title="@string/pref_open_external_urls_privately_title"
android:summary="@string/pref_open_external_urls_privately_summary"
android:defaultValue="false" />
</PreferenceScreen>

View File

@ -199,9 +199,6 @@
<string name="pref_remember_signons">&pref_remember_signons2;</string>
<string name="pref_open_external_urls_privately_title">&pref_open_external_urls_privately_title;</string>
<string name="pref_open_external_urls_privately_summary">&pref_open_external_urls_privately_summary;</string>
<string name="pref_manage_logins">&pref_manage_logins;</string>
<string name="pref_cookies_menu">&pref_cookies_menu;</string>

View File

@ -550,15 +550,6 @@ var BrowserApp = {
defaults.setBoolPref("media.autoplay.enabled", false);
}
try {
// Set the tiles click observer only if tiles reporting is enabled (that
// is, a report URL is set in prefs).
gTilesReportURL = Services.prefs.getCharPref("browser.tiles.reportURL");
Services.obs.addObserver(this, "Tiles:Click", false);
} catch (e) {
// Tiles reporting is disabled.
}
InitLater(() => {
// The order that context menu items are added is important
// Make sure the "Open in App" context menu item appears at the bottom of the list
@ -2105,13 +2096,6 @@ var BrowserApp = {
this.computeAcceptLanguages(osLocale, aData);
break;
case "Tiles:Click":
// Set the click data for the given tab to be handled on the next page load.
let data = JSON.parse(aData);
let tab = this.getTabForId(data.tabId);
tab.tilesData = data.payload;
break;
case "Fonts:Reload":
FontEnumerator.updateFontList();
break;
@ -3450,9 +3434,6 @@ nsBrowserAccess.prototype = {
var gScreenWidth = 1;
var gScreenHeight = 1;
// The URL where suggested tile clicks are posted.
var gTilesReportURL = null;
function Tab(aURL, aParams) {
this.filter = null;
this.browser = null;
@ -3469,7 +3450,6 @@ function Tab(aURL, aParams) {
this.desktopMode = false;
this.originalURI = null;
this.hasTouchListener = false;
this.tilesData = null;
this.create(aURL, aParams);
}
@ -4359,27 +4339,6 @@ Tab.prototype = {
ExternalApps.clearPageAction();
}
}
// Upload any pending tile click events.
// Tiles data will be non-null for this tab only if:
// 1) the user just clicked a suggested site with a tracking ID, and
// 2) tiles reporting is enabled (gTilesReportURL != null).
if (this.tilesData) {
let xhr = new XMLHttpRequest();
xhr.open("POST", gTilesReportURL, true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.onload = function (e) {
// Broadcast reply if X-Robocop header is set. Used for testing only.
if (this.status == 200 && this.getResponseHeader("X-Robocop")) {
Messaging.sendRequest({
type: "Robocop:TilesResponse",
response: this.response
});
}
};
xhr.send(this.tilesData);
this.tilesData = null;
}
}
}
},
@ -4427,14 +4386,6 @@ Tab.prototype = {
success = aRequest.status == 0;
}
// At this point, either:
// 1) the page loaded, the pageshow event fired, and the tilesData XHR has been posted, or
// 2) the page did not load, and we're loading a new page.
// Either way, we're done with the tiles data, so clear it out.
if (this.tilesData && (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)) {
this.tilesData = null;
}
// Check to see if we restoring the content from a previous presentation (session)
// since there should be no real network activity
let restoring = (aStateFlags & Ci.nsIWebProgressListener.STATE_RESTORING) > 0;

View File

@ -23,6 +23,8 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm");
// HelperApp Launcher Dialog
// -----------------------------------------------------------------------
XPCOMUtils.defineLazyModuleGetter(this, "Snackbars", "resource://gre/modules/Snackbars.jsm");
XPCOMUtils.defineLazyGetter(this, "ContentAreaUtils", function() {
let ContentAreaUtils = {};
Services.scriptloader.loadSubScript("chrome://global/content/contentAreaUtils.js", ContentAreaUtils);
@ -197,17 +199,11 @@ HelperAppLauncherDialog.prototype = {
_refuseDownload: function(aLauncher) {
aLauncher.cancel(Cr.NS_BINDING_ABORTED);
let win = this.getNativeWindow();
if (!win) {
// Oops.
Services.console.logStringMessage("Refusing download, but can't show a toast.");
return;
}
Services.console.logStringMessage("Refusing download of non-downloadable file.");
let bundle = Services.strings.createBundle("chrome://browser/locale/handling.properties");
let failedText = bundle.GetStringFromName("download.blocked");
win.toast.show(failedText, "long");
Snackbars.show(bundle.GetStringFromName("download.blocked"), Snackbars.LENGTH_LONG);
},
_getPrefName: function getPrefName(mimetype) {

View File

@ -0,0 +1,68 @@
.. -*- Mode: rst; fill-column: 100; -*-
==========================
Shipping Default Domains
==========================
Firefox for Mobile (Android and iOS) ships sets of default content in order to improve the
first-run experience. There are two primary places where default sets of domains are used: URLBar
domain auto-completion, and Top Sites suggested thumbnails.
The source of these domains is typically the Alexa top sites lists, global and by-country. Before
shipping the sets of domains, the lists are sanitized.
Domain Auto-completion
======================
As you type in the URLBar, Firefox will scan your history and auto-complete previously visited
domains that match what you have entered. This can make navigating to web sites faster because it
can avoid significant amounts of typing. During your first few uses, Firefox does not have any
history and you are forced to type full URLs. Shipping a set of top domains provides a fallback.
The top domains list can be localized, but Firefox will fallback to using en-US as the default for all
locales that do not provide a specific set. The list can have several hundred domains, but due to
size concerns, is usually capped to five hundred or less.
Sanitizing Methods
------------------
After getting a source list, e.g. Alexa top global sites, we apply some simple guidelines to the
list of domains:
* Remove any locale-specific domain duplicates. We assume primary URLs (.com) will redirect to the
correct locale (.co.jp) at run-time.
* Remove any explicit adult content domains.
* Remove any sites that use explicit or adult advertising.
* Remove any URL shorteners and redirecters.
* Remove any content/CDN domains. Some sites use separate domains to store images and other
static content.
* Remove any sites primarily used for advertising or management of advertising.
* Remove any sites that fail to load in mobile browsers.
* Remove any time/date specific sites that may have appeared on the list due to seasonal spikes.
Suggested Sites
===============
Suggested sites are default thumbnails, displayed on the Top Sites home panel. A suggested site
consists of a title, thumbnail image, background color and URL. Multiple images are usually
required to handle the variety of device DPIs.
Suggested sites can be localized, but Firefox will fallback to using en-US as the default for all
locales that do not provide a specific set. The list is usually small, with perhaps fewer than ten
sites.
Sanitizing Methods
------------------
After getting a source list, e.g. Alexa top global sites, we apply some simple guidelines to the
list of domains:
* Remove pure search engines. We handle search engines differently and don't consider them to be
suggested sites.
* Remove any locale-specific domain duplicates. We assume primary URLs (.com) will redirect to the
correct locale (.co.jp) at run-time.
* Remove any explicit adult content domains.
* Remove any sites that use explicit or adult advertising.
* Remove any URL shorteners and redirecters.
* Remove any content/CDN domains. Some sites use separate domains to store images and other
static content.

View File

@ -14,6 +14,7 @@ Contents:
localeswitching
uitelemetry
adjust
defaultdomains
Indices and tables
==================

View File

@ -1,6 +1,5 @@
<provider android:name="org.mozilla.gecko.background.healthreport.HealthReportProvider"
android:authorities="@ANDROID_PACKAGE_NAME@.health"
android:permission="@ANDROID_PACKAGE_NAME@.permissions.HEALTH_PROVIDER"
android:exported="false">
</provider>

View File

@ -9,10 +9,6 @@
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="@ANDROID_TARGET_SDK@" />
<uses-permission android:name="@ANDROID_BACKGROUND_TARGET_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
<uses-permission android:name="@ANDROID_BACKGROUND_TARGET_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"/>
<uses-permission android:name="@ANDROID_BACKGROUND_TARGET_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"/>
<application
android:debuggable="true"
android:icon="@drawable/icon"

View File

@ -9,10 +9,6 @@
<uses-sdk android:minSdkVersion="8"
android:targetSdkVersion="@ANDROID_TARGET_SDK@" />
<uses-permission android:name="@ANDROID_BROWSER_TARGET_PACKAGE_NAME@.permissions.BROWSER_PROVIDER"/>
<uses-permission android:name="@ANDROID_BROWSER_TARGET_PACKAGE_NAME@.permissions.FORMHISTORY_PROVIDER"/>
<uses-permission android:name="@ANDROID_BROWSER_TARGET_PACKAGE_NAME@.permissions.PASSWORD_PROVIDER"/>
<application
android:debuggable="true"
android:icon="@drawable/icon"

View File

@ -150,18 +150,11 @@ public class TestSuggestedSites extends InstrumentationTestCase {
}
private String generateSites(int n, String prefix) {
return generateSites(n, false, prefix);
}
private String generateSites(int n, boolean includeIds, String prefix) {
JSONArray sites = new JSONArray();
try {
for (int i = 0; i < n; i++) {
JSONObject site = new JSONObject();
if (includeIds) {
site.put("trackingid", i);
}
site.put("url", prefix + "url" + i);
site.put("title", prefix + "title" + i);
site.put("imageurl", prefix + "imageUrl" + i);
@ -383,38 +376,6 @@ public class TestSuggestedSites extends InstrumentationTestCase {
assertNull(suggestedSites.getBackgroundColorForUrl("foo"));
}
public void testTrackingIds() {
final int count = 3;
// Test suggested sites with IDs.
resources.setSuggestedSitesResource(generateSites(count, true, ""));
SuggestedSites suggestedSites = new SuggestedSites(context);
Cursor c = suggestedSites.get(DEFAULT_LIMIT);
assertEquals(count, c.getCount());
for (int i = 0; i < count; i++) {
c.moveToNext();
String url = c.getString(c.getColumnIndexOrThrow(BrowserContract.SuggestedSites.URL));
assertTrue(suggestedSites.contains(url));
assertEquals(i, suggestedSites.getTrackingIdForUrl(url));
}
c.close();
// Test suggested sites where IDs are undefined.
resources.setSuggestedSitesResource(generateSites(count, false, ""));
suggestedSites = new SuggestedSites(context);
c = suggestedSites.get(DEFAULT_LIMIT);
assertEquals(count, c.getCount());
for (int i = 0; i < count; i++) {
c.moveToNext();
String url = c.getString(c.getColumnIndexOrThrow(BrowserContract.SuggestedSites.URL));
assertTrue(suggestedSites.contains(url));
assertEquals(SuggestedSites.TRACKING_ID_NONE, suggestedSites.getTrackingIdForUrl(url));
}
c.close();
}
public void testLocaleChanges() {
resources.setSuggestedSitesResource(generateSites(3));

View File

@ -1,26 +0,0 @@
/**
* Used with testDistribution.
* Responds by simply echoing back the request data.
*/
const cc = Components.Constructor;
const BinaryInputStream = cc("@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream",
"setInputStream");
function handleRequest(request, response) {
let bodyStream = new BinaryInputStream(request.bodyInputStream);
let avail;
let bytes = [];
while ((avail = bodyStream.available()) > 0) {
Array.prototype.push.apply(bytes, bodyStream.readByteArray(avail));
}
let data = String.fromCharCode.apply(null, bytes);
// Including this header will cause Gecko to broadcast the Robocop:TilesResponse event.
response.setHeader("X-Robocop", "true", false);
response.setHeader("Content-Type", "application/json", false);
response.setHeader("Cache-Control", "no-cache", false);
response.write(data);
}

View File

@ -24,7 +24,6 @@ import org.mozilla.gecko.BrowserLocaleManager;
import org.mozilla.gecko.GeckoProfile;
import org.mozilla.gecko.GeckoSharedPrefs;
import org.mozilla.gecko.db.BrowserContract;
import org.mozilla.gecko.db.SuggestedSites;
import org.mozilla.gecko.distribution.Distribution;
import org.mozilla.gecko.distribution.ReferrerDescriptor;
import org.mozilla.gecko.distribution.ReferrerReceiver;
@ -135,20 +134,6 @@ public class testDistribution extends ContentProviderTest {
// finish. This reduces the chance of us racing with startup pref writes.
waitForBackgroundHappiness();
// Pre-clear distribution pref, override suggested sites and run tiles tests.
clearDistributionPref();
Distribution dist = initDistribution(mockPackagePath);
SuggestedSites suggestedSites = new SuggestedSites(mActivity, dist);
GeckoProfile.get(mActivity).getDB().setSuggestedSites(suggestedSites);
// Test tiles uploading for an en-US OS locale with no app locale.
setOSLocale(Locale.US);
checkTilesReporting("en-US");
// Test tiles uploading for an es-MX OS locale with no app locale.
setOSLocale(new Locale("es", "MX"));
checkTilesReporting("es-MX");
// Pre-clear distribution pref, run basic preferences and en-US localized preferences Tests
clearDistributionPref();
setTestLocale("en-US");
@ -511,45 +496,6 @@ public class testDistribution extends ContentProviderTest {
TestableDistribution.clearReferrerDescriptorForTesting();
}
public void checkTilesReporting(String localeCode) throws JSONException {
// Slight hack: Force top sites grid to reload.
inputAndLoadUrl(mStringHelper.ABOUT_BLANK_URL);
inputAndLoadUrl(mStringHelper.ABOUT_HOME_URL);
// Click the first tracking tile and verify the posted data.
JSONObject response = clickTrackingTile(mStringHelper.DISTRIBUTION1_LABEL);
mAsserter.is(response.getInt("click"), 0, "JSON click index matched");
mAsserter.is(response.getString("locale"), localeCode, "JSON locale code matched");
mAsserter.is(response.getString("tiles"), "[{\"id\":123},{\"id\":456},{\"id\":632},{\"id\":630},{\"id\":631}]", "JSON tiles data matched");
inputAndLoadUrl(mStringHelper.ABOUT_HOME_URL);
// Pin the second tracking tile.
pinTopSite(mStringHelper.DISTRIBUTION2_LABEL);
// Click the second tracking tile and verify the posted data.
response = clickTrackingTile(mStringHelper.DISTRIBUTION2_LABEL);
mAsserter.is(response.getInt("click"), 1, "JSON click index matched");
mAsserter.is(response.getString("tiles"), "[{\"id\":123},{\"id\":456,\"pin\":true},{\"id\":632},{\"id\":630},{\"id\":631}]", "JSON tiles data matched");
inputAndLoadUrl(mStringHelper.ABOUT_HOME_URL);
// Unpin the second tracking tile.
unpinTopSite(mStringHelper.DISTRIBUTION2_LABEL);
}
private JSONObject clickTrackingTile(String text) throws JSONException {
boolean tileFound = waitForText(text);
mAsserter.ok(tileFound, "Found tile: " + text, null);
Actions.EventExpecter loadExpecter = mActions.expectGeckoEvent("Robocop:TilesResponse");
mSolo.clickOnText(text);
String data = loadExpecter.blockForEventData();
JSONObject dataJSON = new JSONObject(data);
String response = dataJSON.getString("response");
return new JSONObject(response);
}
@Override
public void setUp() throws Exception {
// TODO: Set up the content provider after setting the distribution.

View File

@ -1225,4 +1225,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
static const int32_t kUnknownId = -1;
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1458388670842000);
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1458993517672000);

View File

@ -11,10 +11,10 @@ ad-notam.fr: did not receive HSTS header
ad-notam.it: did not receive HSTS header
ad-notam.us: did not receive HSTS header
ada.is: max-age too low: 7776000
adamstas.com: could not connect to host
adhs-chaoten.net: did not receive HSTS header
admin.google.com: did not receive HSTS header (error ignored - included regardless)
adsfund.org: could not connect to host
aerolog.co: did not receive HSTS header
aes256.ru: could not connect to host
aevpn.net: did not receive HSTS header
aeyoun.com: did not receive HSTS header
@ -23,6 +23,7 @@ agrimap.com: did not receive HSTS header
agrios.de: did not receive HSTS header
airbnb.com: did not receive HSTS header
aiticon.de: did not receive HSTS header
akclinics.org: did not receive HSTS header
akselimedia.fi: did not receive HSTS header
al-shami.net: did not receive HSTS header
alecvannoten.be: did not receive HSTS header
@ -33,6 +34,7 @@ altmv.com: max-age too low: 7776000
amigogeek.net: did not receive HSTS header
andreasbreitenlohner.de: did not receive HSTS header
andreasolsson.se: could not connect to host
anime.my: could not connect to host
ankakaak.com: could not connect to host
anycoin.me: could not connect to host
apachelounge.com: did not receive HSTS header
@ -53,9 +55,8 @@ at.search.yahoo.com: max-age too low: 172800
atavio.at: could not connect to host
atavio.ch: could not connect to host
atavio.de: did not receive HSTS header
attotech.com: did not receive HSTS header
au.search.yahoo.com: max-age too low: 172800
aurainfosec.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
aurainfosec.com: could not connect to host
auraredeye.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
auraredshield.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
auszeit.bio: did not receive HSTS header
@ -66,13 +67,11 @@ axado.com.br: max-age too low: 0
az.search.yahoo.com: did not receive HSTS header
azabani.com: did not receive HSTS header
azprep.us: could not connect to host
baff.lu: could not connect to host
bagelsbakery.com: could not connect to host
balcan-underground.net: could not connect to host
baldwinkoo.com: could not connect to host
bccx.com: could not connect to host
bcm.com.au: max-age too low: 0
bcvps.com: did not receive HSTS header
be.search.yahoo.com: did not receive HSTS header
beastowner.com: did not receive HSTS header
beautykat.ru: did not receive HSTS header
@ -83,7 +82,6 @@ bevapehappy.com: did not receive HSTS header
bhatia.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
bi.search.yahoo.com: did not receive HSTS header
bidon.ca: did not receive HSTS header
bigbrownpromotions.com.au: could not connect to host
bigdinosaur.org: did not receive HSTS header
bigshinylock.minazo.net: could not connect to host
billninja.com: did not receive HSTS header
@ -102,11 +100,12 @@ bonigo.de: did not receive HSTS header
bonitabrazilian.co.nz: did not receive HSTS header
bowlroll.net: max-age too low: 0
br.search.yahoo.com: max-age too low: 172800
brage.info: could not connect to host
braintreepayments.com: did not receive HSTS header
brainvation.de: did not receive HSTS header
brakstad.org: did not receive HSTS header
bran.cc: could not connect to host
branchtrack.com: did not receive HSTS header
breeswish.org: could not connect to host
brks.xyz: could not connect to host
browserid.org: did not receive HSTS header
brrr.fr: could not connect to host
@ -140,6 +139,7 @@ chatbot.me: could not connect to host
checkout.google.com: did not receive HSTS header (error ignored - included regardless)
cheesetart.my: could not connect to host
chfr.search.yahoo.com: max-age too low: 172800
chijiokeindustries.co.uk: did not receive HSTS header
chit.search.yahoo.com: max-age too low: 172800
chm.vn: did not receive HSTS header
chontalpa.pw: did not receive HSTS header
@ -147,9 +147,9 @@ chrisupjohn.com: could not connect to host
chrome-devtools-frontend.appspot.com: did not receive HSTS header (error ignored - included regardless)
chrome.google.com: did not receive HSTS header (error ignored - included regardless)
chroniclesofgeorge.com: did not receive HSTS header
citiagent.cz: did not receive HSTS header
cl.search.yahoo.com: max-age too low: 172800
climaprecio.es: did not receive HSTS header
clintonbloodworth.com: did not receive HSTS header
cloudcert.org: did not receive HSTS header
cloudflare.com: did not receive HSTS header
cloudstoragemaus.com: could not connect to host
@ -158,13 +158,14 @@ clycat.ru: could not connect to host
cn.search.yahoo.com: did not receive HSTS header
co.search.yahoo.com: max-age too low: 172800
code.google.com: did not receive HSTS header (error ignored - included regardless)
codereview.chromium.org: did not receive HSTS header (error ignored - included regardless)
codepref.com: could not connect to host
coding.net: did not receive HSTS header
coffeeetc.co.uk: could not connect to host
coffeestrategies.com: did not receive HSTS header
coindam.com: could not connect to host
colognegaming.net: could not connect to host
comdurav.com: did not receive HSTS header
concord-group.co.jp: did not receive HSTS header
conformal.com: could not connect to host
console.python.org: did not receive HSTS header
cordial-restaurant.com: did not receive HSTS header
@ -176,10 +177,12 @@ crbug.com: did not receive HSTS header
crowdcurity.com: did not receive HSTS header
crowdjuris.com: could not connect to host
crypto.is: max-age too low: 7776000
cryptobells.com: could not connect to host
crysadm.com: max-age too low: 1
csawctf.poly.edu: could not connect to host
ct.search.yahoo.com: did not receive HSTS header
cujanovic.com: did not receive HSTS header
culinae.nl: did not receive HSTS header
cyanogenmod.xxx: could not connect to host
cybershambles.com: could not connect to host
cydia-search.io: could not connect to host
@ -194,12 +197,14 @@ daylightcompany.com: did not receive HSTS header
de.search.yahoo.com: max-age too low: 172800
debtkit.co.uk: did not receive HSTS header
decibelios.li: did not receive HSTS header
deliciisanatoase.ro: did not receive HSTS header
demo.swedbank.se: could not connect to host
demuzere.com: could not connect to host
demuzere.eu: could not connect to host
demuzere.net: could not connect to host
depixion.agency: did not receive HSTS header
derevtsov.com: did not receive HSTS header
dergeilstestammderwelt.de: did not receive HSTS header
devh.de: did not receive HSTS header
diablotine.rocks: could not connect to host
diasp.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
@ -243,8 +248,9 @@ email.lookout.com: could not connect to host
en-maktoob.search.yahoo.com: did not receive HSTS header
encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
enterdev.co: did not receive HSTS header
entrepreneur.or.id: did not receive HSTS header
eol34.com: did not receive HSTS header
epoxate.com: did not receive HSTS header
eromixx.com: did not receive HSTS header
eroticen.com: did not receive HSTS header
erotische-aanbiedingen.nl: did not receive HSTS header
errors.zenpayroll.com: could not connect to host
@ -254,9 +260,9 @@ espanol.search.yahoo.com: max-age too low: 172800
espra.com: could not connect to host
etsysecure.com: could not connect to host
expoundite.net: did not receive HSTS header
extreemhost.nl: did not receive HSTS header
ezimoeko.net: could not connect to host
eztv.ch: did not receive HSTS header
f-droid.org: could not connect to host
fabianfischer.de: did not receive HSTS header
factorygw.com: did not receive HSTS header
fant.dk: did not receive HSTS header
@ -266,7 +272,10 @@ festember.com: did not receive HSTS header
fi.search.yahoo.com: max-age too low: 172800
fiftyshadesofluca.ml: could not connect to host
fightr.co: could not connect to host
findmybottleshop.com.au: did not receive HSTS header
firebaseio-demo.com: could not connect to host
firebaseio.com: could not connect to host
firefall.rocks: did not receive HSTS header
firemail.io: could not connect to host
fischer-its.com: max-age too low: 2592000
fixingdns.com: did not receive HSTS header
@ -277,6 +286,7 @@ flowlo.me: could not connect to host
fm83.nl: did not receive HSTS header
fonetiq.io: could not connect to host
food4health.guide: could not connect to host
footballmapped.com: could not connect to host
foreignexchangeresource.com: did not receive HSTS header
fotiu.com: could not connect to host
foxdev.io: did not receive HSTS header
@ -334,8 +344,9 @@ gvt3.com: could not connect to host (error ignored - included regardless)
gwijaya.com: did not receive HSTS header
gyboche.com: could not connect to host
gyboche.science: could not connect to host
h2check.org: could not connect to host
hack.li: could not connect to host
hao2taiwan.com: max-age too low: 0
hao2taiwan.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
happyfabric.me: did not receive HSTS header
hasilocke.de: did not receive HSTS header
haste.ch: could not connect to host
@ -343,16 +354,15 @@ hatoko.net: could not connect to host
haveeruexaminer.com: could not connect to host
heart.ge: max-age too low: 0
heftkaufen.de: did not receive HSTS header
heijblok.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
helpadmin.net: could not connect to host
helpium.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
henriknoerr.com: could not connect to host
herzbotschaft.de: max-age too low: 0
hetmer.com: did not receive HSTS header
hexony.com: did not receive HSTS header
hicn.gq: could not connect to host
hk.search.yahoo.com: max-age too low: 172800
hledejlevne.cz: did not receive HSTS header
hledejpravnika.cz: could not connect to host
hn.search.yahoo.com: did not receive HSTS header
hoerbuecher-und-hoerspiele.de: did not receive HSTS header
homa.website: could not connect to host
@ -361,18 +371,19 @@ hookandloom.com: did not receive HSTS header
horosho.in: could not connect to host
horseboners.xxx: did not receive HSTS header
hostedtalkgadget.google.com: did not receive HSTS header (error ignored - included regardless)
hostelinsplit.com: did not receive HSTS header
hostingactive.it: did not receive HSTS header
howrandom.org: could not connect to host
hsts.date: could not connect to host
hstspreload.appspot.com: did not receive HSTS header
hu.search.yahoo.com: did not receive HSTS header
iban.is: could not connect to host
icq-project.net: could not connect to host
id-co.in: could not connect to host
id-conf.com: did not receive HSTS header
id.search.yahoo.com: max-age too low: 172800
idealsvdr.com: did not receive HSTS header
identitylabs.uk: did not receive HSTS header
ie.search.yahoo.com: did not receive HSTS header
ijohan.nl: could not connect to host
ilikerainbows.co.uk: could not connect to host
illjinx.info: did not receive HSTS header
ilmconpm.de: did not receive HSTS header
@ -384,7 +395,6 @@ infogrfx.com: max-age too low: 0
inksupply.com: did not receive HSTS header
inleaked.com: could not connect to host
inmyarea.com: did not receive HSTS header
instacart.com: did not receive HSTS header
intercom.io: did not receive HSTS header
interserved.com: did not receive HSTS header
ionas-law.ro: did not receive HSTS header
@ -414,13 +424,13 @@ jonas-keidel.de: did not receive HSTS header
jonathan.ir: could not connect to host
jonathandowning.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
jottit.com: could not connect to host
jrvar.com: could not connect to host
julian-kipka.de: did not receive HSTS header
juniwalk.cz: could not connect to host
justlikethat.hosting: did not receive HSTS header
jwilsson.me: could not connect to host
k-dev.de: could not connect to host
kamikano.com: did not receive HSTS header
kamisama.xyz: could not connect to host
kasko.io: did not receive HSTS header
kdm-online.de: did not receive HSTS header
keeley.gq: could not connect to host
@ -433,7 +443,7 @@ kingmanhall.org: could not connect to host
kinnon.enterprises: did not receive HSTS header
kirkforcongress.com: could not connect to host
kirkforsenate.com: did not receive HSTS header
kirkpatrickdavis.com: max-age too low: 3153600
kirkpatrickdavis.com: did not receive HSTS header
kitsta.com: could not connect to host
kiwiirc.com: max-age too low: 5256000
klaxn.com: could not connect to host
@ -443,10 +453,12 @@ komandakovalchuk.com: [Exception... "Component returned failure code: 0x80004005
koop-bremen.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
koordinate.net: did not receive HSTS header
korni22.org: could not connect to host
kotarac.net: did not receive HSTS header
kpvpn.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
kr.search.yahoo.com: did not receive HSTS header
krouzkyliduska.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
kryptera.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
kryx.de: did not receive HSTS header
kweddingplanning.com: did not receive HSTS header
kz.search.yahoo.com: did not receive HSTS header
labaia.info: did not receive HSTS header
@ -457,6 +469,7 @@ landscape.canonical.com: max-age too low: 2592000
ldc.com.br: did not receive HSTS header
ledgerscope.net: max-age too low: 86400
leifdreizler.com: could not connect to host
lelongbank.com: did not receive HSTS header
lentri.com: did not receive HSTS header
leon-jaekel.com: did not receive HSTS header
letras.mus.br: did not receive HSTS header
@ -465,6 +478,7 @@ library.linode.com: did not receive HSTS header
libraryfreedomproject.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-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
lifeguard.aecom.com: max-age too low: 86400
linguaquote.com: did not receive HSTS header
litespeed.io: could not connect to host
login.corp.google.com: max-age too low: 7776000 (error ignored - included regardless)
lognot.net: could not connect to host
logotype.se: did not receive HSTS header
@ -516,16 +530,15 @@ mobilethreat.net: could not connect to host
mobilethreatnetwork.net: could not connect to host
modemagazines.co.uk: did not receive HSTS header
monitman.com: could not connect to host
monitman.solutions: could not connect to host
moparisthebest.biz: could not connect to host
moparisthebest.info: could not connect to host
moriz.net: did not receive HSTS header
movlib.org: could not connect to host
mp3juices.is: could not connect to host
mqas.net: could not connect to host
msc-seereisen.net: did not receive HSTS header
mt.search.yahoo.com: did not receive HSTS header
mu.search.yahoo.com: did not receive HSTS header
musi.cx: did not receive HSTS header
mustika.cf: max-age too low: 0
mutamatic.com: could not connect to host
mw.search.yahoo.com: did not receive HSTS header
@ -552,12 +565,14 @@ nexth.us: could not connect to host
ng-security.com: could not connect to host
nginxnudes.com: could not connect to host
ni.search.yahoo.com: did not receive HSTS header
nicestresser.fr: could not connect to host
nicolaelmer.ch: could not connect to host
niho.jp: max-age too low: 0
nl.search.yahoo.com: max-age too low: 172800
nmctest.net: could not connect to host
no.search.yahoo.com: max-age too low: 172800
nodetemple.com: did not receive HSTS header
nodebrewery.com: could not connect to host
nodetemple.com: could not connect to host
noexpect.org: could not connect to host
nope.website: did not receive HSTS header
noworrywp.com: did not receive HSTS header
@ -581,7 +596,6 @@ ownmovies.fr: could not connect to host
p.linode.com: could not connect to host
p8r.de: could not connect to host
pa.search.yahoo.com: did not receive HSTS header
pantsu.cat: did not receive HSTS header
partirkyoto.jp: max-age too low: 0
partyvan.it: could not connect to host
partyvan.nl: could not connect to host
@ -610,17 +624,22 @@ piratenlogin.de: could not connect to host
pirati.cz: max-age too low: 604800
pisidia.de: did not receive HSTS header
pixel.google.com: did not receive HSTS header (error ignored - included regardless)
pixelcode.com.au: did not receive HSTS header
pk.search.yahoo.com: did not receive HSTS header
pl.search.yahoo.com: max-age too low: 172800
platform.lookout.com: could not connect to host
play.google.com: did not receive HSTS header (error ignored - included regardless)
plothost.com: did not receive HSTS header
pm13.cz: could not connect to host
pm13.org: could not connect to host
poiema.com.sg: did not receive HSTS header
pointiswunderland.de: did not receive HSTS header
pol.in.th: could not connect to host
popcorntime.ws: did not receive HSTS header
posterspy.com: did not receive HSTS header
powercloud.technology: did not receive HSTS header
pr.search.yahoo.com: did not receive HSTS header
prefontaine.name: could not connect to host
preissler.co.uk: could not connect to host
pressfreedomfoundation.org: did not receive HSTS header
prodpad.com: did not receive HSTS header
@ -633,6 +652,7 @@ proxybay.info: did not receive HSTS header
pult.co: could not connect to host
punchr-kamikazee.rhcloud.com: did not receive HSTS header
py.search.yahoo.com: did not receive HSTS header
pypa.io: could not connect to host
qc.search.yahoo.com: max-age too low: 172800
qingxuan.info: did not receive HSTS header
quotehex.com: did not receive HSTS header
@ -650,6 +670,8 @@ regenerescence.com: did not receive HSTS header
renem.net: max-age too low: 0
reserve-online.net: did not receive HSTS header
reviews.anime.my: max-age too low: 5184000
rewardstock.com: max-age too low: 0
rid-wan.com: did not receive HSTS header
rika.me: could not connect to host
rippleunion.com: did not receive HSTS header
rme.li: did not receive HSTS header
@ -657,10 +679,8 @@ ro.search.yahoo.com: max-age too low: 172800
roan24.pl: did not receive HSTS header
roddis.net: did not receive HSTS header
romans-place.me.uk: did not receive HSTS header
ronvandordt.info: could not connect to host
roosterpgplus.nl: did not receive HSTS header
ronvandordt.info: did not receive HSTS header
rr.in.th: could not connect to host
ru-sprachstudio.ch: could not connect to host
ru.search.yahoo.com: max-age too low: 172800
rudloff.pro: did not receive HSTS header
rugirlfriend.com: did not receive HSTS header
@ -696,8 +716,9 @@ seomobo.com: did not receive HSTS header
seowarp.net: max-age too low: 1576800
serverdensity.io: did not receive HSTS header
servergno.me: did not receive HSTS header
seyahatsagliksigortalari.com: could not connect to host
sg.search.yahoo.com: max-age too low: 172800
shamka.ru: max-age too low: 0
shamka.ru: could not connect to host
shanewadleigh.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
shiinko.com: could not connect to host
shoprose.ru: did not receive HSTS header
@ -710,15 +731,18 @@ simon.butcher.name: max-age too low: 2629743
simplelearner.com: could not connect to host
simplyfixit.co.uk: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
sites.google.com: did not receive HSTS header (error ignored - included regardless)
slix.io: could not connect to host
slovakiana.sk: did not receive HSTS header
smartcoin.com.br: did not receive HSTS header
smartlend.se: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
smkn1lengkong.sch.id: did not receive HSTS header
smksi2.com: did not receive HSTS header
smksi2.com: could not connect to host
snailing.org: could not connect to host
soccergif.com: did not receive HSTS header
soci.ml: could not connect to host
sockeye.cc: could not connect to host
sol.io: could not connect to host
soondy.com: did not receive HSTS header
souyar.de: could not connect to host
souyar.net: could not connect to host
souyar.us: could not connect to host
@ -732,11 +756,9 @@ ssl.panoramio.com: did not receive HSTS header
stassi.ch: did not receive HSTS header
stillyarts.com: did not receive HSTS header
stocktrade.de: could not connect to host
stormhub.org: could not connect to host
streamingmagazin.de: could not connect to host
stricted.net: did not receive HSTS header
strongest-privacy.com: could not connect to host
studienportal.eu: could not connect to host
studydrive.net: did not receive HSTS header
subrosa.io: could not connect to host
suite73.org: could not connect to host
@ -747,6 +769,7 @@ suzukikenichi.com: did not receive HSTS header
sv.search.yahoo.com: did not receive HSTS header
svager.cz: could not connect to host
syncer.jp: did not receive HSTS header
synchtu.be: did not receive HSTS header
t.facebook.com: did not receive HSTS header
tablet.facebook.com: did not receive HSTS header
tafoma.com: did not receive HSTS header
@ -758,11 +781,10 @@ tallshoe.com: could not connect to host
tandarts-haarlem.nl: did not receive HSTS header
tanzhijun.com: did not receive HSTS header
tapka.cz: did not receive HSTS header
tazemama.biz: did not receive HSTS header
tbarter.com: did not receive HSTS header
tcao.info: could not connect to host
teamnorthgermany.de: could not connect to host
techhub.ml: could not connect to host
techllage.com: could not connect to host
techloaner.com: could not connect to host
technotonic.com.au: did not receive HSTS header
tegelsensanitaironline.nl: did not receive HSTS header
@ -774,9 +796,12 @@ terrax.info: could not connect to host
terrty.net: could not connect to host
th.search.yahoo.com: max-age too low: 172800
the-sky-of-valkyries.com: could not connect to host
theater.cf: could not connect to host
thecoffeehouse.xyz: could not connect to host
thehistory.me: did not receive HSTS header
thepartywarehouse.co.uk: did not receive HSTS header
therapyportal.com: did not receive HSTS header
theyosh.nl: did not receive HSTS header
thorncreek.net: did not receive HSTS header
thumbtack.com: did not receive HSTS header
thundr.eu: could not connect to host
@ -818,21 +843,22 @@ uk.search.yahoo.com: max-age too low: 172800
ukas.com: did not receive HSTS header
unapp.me: could not connect to host
unbanthe.net: did not receive HSTS header
unila.edu.br: could not connect to host
univz.com: could not connect to host
unun.fi: could not connect to host
uonstaffhub.com: could not connect to host
upay.ru: did not receive HSTS header
uprotect.it: could not connect to host
upstats.eu: could not connect to host
urandom.eu.org: could not connect to host
ustr.gov: max-age too low: 86400
uy.search.yahoo.com: did not receive HSTS header
uz.search.yahoo.com: did not receive HSTS header
vaddder.com: could not connect to host
vallis.net: could not connect to host
vasanth.org: could not connect to host
vbhelp.org: could not connect to host
vbulletin-russia.com: could not connect to host
vbulletinrussia.com: could not connect to host
vcsjones.com: did not receive HSTS header
ve.search.yahoo.com: max-age too low: 172800
vermontcareergateway.org: did not receive HSTS header
vhost.co.id: could not connect to host
@ -852,7 +878,7 @@ webmail.mayfirst.org: did not receive HSTS header
webmaniabr.com: did not receive HSTS header
webswitch.io: could not connect to host
werdeeintimo.de: did not receive HSTS header
wesecom.com: could not connect to host
wesecom.com: did not receive HSTS header
wevahoo.com: could not connect to host
when-release.com: did not receive HSTS header
whitestagforge.com: did not receive HSTS header
@ -860,7 +886,6 @@ wholebites.com: did not receive HSTS header
whyworldhot.com: did not receive HSTS header
wikidsystems.com: did not receive HSTS header
wilf1rst.com: could not connect to host
winsec.nl: could not connect to host
withgoogle.com: did not receive HSTS header (error ignored - included regardless)
withustrading.com: could not connect to host
withyoutube.com: did not receive HSTS header (error ignored - included regardless)
@ -895,15 +920,16 @@ xtream-hosting.com: could not connect to host
xtream-hosting.de: could not connect to host
xtream-hosting.eu: could not connect to host
xtreamhosting.eu: could not connect to host
xtremegaming.it: did not receive HSTS header
y-o-w.com: did not receive HSTS header
yaporn.tv: max-age too low: 0
yenniferallulli.moda: could not connect to host
yetii.net: did not receive HSTS header
yingyj.com: did not receive HSTS header
yobst.tk: could not connect to host
yokeepo.com: max-age too low: 0
yoloprod.fr: could not connect to host
yoloseo.com: could not connect to host
yu.gg: did not receive HSTS header
za.search.yahoo.com: did not receive HSTS header
zachborboa.com: did not receive HSTS header
zarooba.com: did not receive HSTS header
@ -911,6 +937,8 @@ zeitpunkt-kulturmagazin.de: did not receive HSTS header
zenpayroll.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 134" data: no]
zentraler-kreditausschuss.de: max-age too low: 0
zh.search.yahoo.com: did not receive HSTS header
zirtue.io: could not connect to host
zixiao.wang: could not connect to host
zoo24.de: did not receive HSTS header
zx6rninja.de: did not receive HSTS header
zzsec.org: did not receive HSTS header

File diff suppressed because it is too large Load Diff

View File

@ -526,8 +526,10 @@ function sendWheelAndPaint(aTarget, aOffsetX, aOffsetY, aEvent, aCallback, aWind
setTimeout(function() {
utils.advanceTimeAndRefresh(1000);
if (!aCallback)
if (!aCallback) {
utils.advanceTimeAndRefresh(0);
return;
}
var waitForPaints = function () {
SpecialPowers.Services.obs.removeObserver(waitForPaints, "apz-repaints-flushed", false);

View File

@ -225,9 +225,6 @@ user_pref('browser.contentHandlers.types.3.uri', 'http://test1.example.org/rss?u
user_pref('browser.contentHandlers.types.4.uri', 'http://test1.example.org/rss?url=%%s')
user_pref('browser.contentHandlers.types.5.uri', 'http://test1.example.org/rss?url=%%s')
// Set dummy server for Android tiles testing.
user_pref('browser.tiles.reportURL', 'http://%(server)s/tests/robocop/robocop_tiles.sjs')
// We want to collect telemetry, but we don't want to send in the results.
user_pref('toolkit.telemetry.server', 'https://%(server)s/telemetry-dummy/');
// Our current tests expect the unified Telemetry feature to be opt-out,

View File

@ -4,3 +4,21 @@
$inherits:
from: tasks/branches/base_jobs.yml
tests:
gaia-ui-test-functional:
allowed_build_tasks:
tasks/builds/b2g_flame_kk_eng.yml:
task: tasks/tests/flame_kk_gaia_ui_test_functional.yml
gaia-ui-test-functional-dsds:
allowed_build_tasks:
tasks/builds/b2g_flame_kk_eng.yml:
task: tasks/tests/flame_kk_gaia_ui_test_functional_dsds.yml
gaia-ui-test-sanity:
allowed_build_tasks:
tasks/builds/b2g_flame_kk_eng.yml:
task: tasks/tests/flame_kk_gaia_ui_test_sanity.yml
gaia-ui-test-unit:
allowed_build_tasks:
tasks/builds/b2g_flame_kk_eng.yml:
task: tasks/tests/flame_kk_gaia_ui_test_unit.yml

Some files were not shown because too many files have changed in this diff Show More