Merge m-c to m-i
@ -68,7 +68,7 @@ browser/components/customizableui/**
|
||||
browser/components/downloads/**
|
||||
browser/components/feeds/**
|
||||
browser/components/migration/**
|
||||
browser/components/*.js
|
||||
browser/components/nsBrowserGlue.js
|
||||
browser/components/pocket/**
|
||||
browser/components/preferences/**
|
||||
browser/components/privatebrowsing/**
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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="0f86914b89cf8a069533e66b218533a17bad6b43"/>
|
||||
<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="6b1fb5b730b1299f99f9194c1fcf088579cc7977"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
|
||||
<project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
|
||||
<!-- Stock Android things -->
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<project name="platform_hardware_libhardware_moz" path="hardware/libhardware_moz" remote="b2g" revision="fdf3a143dc777e5f9d33a88373af7ea161d3b440"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -1,9 +1,9 @@
|
||||
{
|
||||
"git": {
|
||||
"git_revision": "92ed2a5ffd685bc8797bb15a84307cafe6d04f64",
|
||||
"git_revision": "385ec34c8fe447342e81a40b4e1cc9a80f37fc33",
|
||||
"remote": "https://git.mozilla.org/releases/gaia.git",
|
||||
"branch": ""
|
||||
},
|
||||
"revision": "36973054378673c8a4a8bc5904f1c08f800b5c28",
|
||||
"revision": "c53c24531e4d32550f37c5ff5359eb70af822a73",
|
||||
"repo_path": "integration/gaia-central"
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<project name="valgrind" path="external/valgrind" remote="b2g" revision="5f931350fbc87c3df9db8b0ceb37734b8b471593"/>
|
||||
<project name="vex" path="external/VEX" remote="b2g" revision="48d8c7c950745f1b166b42125e6f0d3293d71636"/>
|
||||
<!-- Stock Android things -->
|
||||
|
@ -21,7 +21,7 @@
|
||||
<!--
|
||||
B2G repositories for all targets
|
||||
-->
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="92ed2a5ffd685bc8797bb15a84307cafe6d04f64"/>
|
||||
<project name="gaia" path="gaia" remote="mozillaorg" revision="385ec34c8fe447342e81a40b4e1cc9a80f37fc33"/>
|
||||
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="35dccb3127db8f39f20b985ad312d2cd44780669"/>
|
||||
<project name="moztt" path="external/moztt" remote="b2g" revision="99c333dab00ed79baff9e1cf76b320aee8e1c123"/>
|
||||
<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="828d68eb7bdc58d4ca4c1401809a97bc7b124212"/>
|
||||
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="bef0632ed8ae0e14aa535549ee472748320198ed"/>
|
||||
<!-- 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"/>
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0"?>
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1452810773000">
|
||||
<blocklist xmlns="http://www.mozilla.org/2006/addons-blocklist" lastupdate="1453149152000">
|
||||
<emItems>
|
||||
<emItem blockID="i58" id="webmaster@buzzzzvideos.info">
|
||||
<versionRange minVersion="0" maxVersion="*">
|
||||
@ -411,6 +411,12 @@
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i1079" id="/^(@9338379C-DD5C-4A45-9A36-9733DC806FAE|9338379C-DD5C-4A45-9A36-9733DC806FAE|@EBC7B466-8A28-4061-81B5-10ACC05FFE53|@bd6a97c0-4b18-40ed-bce7-3b7d3309e3c4222|@bd6a97c0-4b18-40ed-bce7-3b7d3309e3c4|@b2d6a97c0-4b18-40ed-bce7-3b7d3309e3c4222)$/">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i1050" id="87aukfkausiopoawjsuifhasefgased278djasi@jetpack">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
@ -905,6 +911,12 @@
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i1078" id="/^(jid1-W4CLFIRExukJIFW@jetpack|jid1-W4CLFIRExukJIFW@jetpack_1|jid1-W3CLwrP[a-z]+@jetpack)$/">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i515" id="/^({bf9194c2-b86d-4ebc-9b53-1c08b6ff779e}|{61a83e16-7198-49c6-8874-3e4e8faeb4f3}|{f0af464e-5167-45cf-9cf0-66b396d1918c}|{5d9968c3-101c-4944-ba71-72d77393322d}|{01e86e69-a2f8-48a0-b068-83869bdba3d0})$/">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="1">
|
||||
@ -1193,12 +1205,6 @@
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i700" id="2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="1">
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i696" id="/^({fa95f577-07cb-4470-ac90-e843f5f83c52}|ffxtlbr@speedial\.com)$/">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="1">
|
||||
@ -1357,6 +1363,12 @@
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i838" id="{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i812" id="{1e4ea5fc-09e5-4f45-a43b-c048304899fc}">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
@ -2374,8 +2386,8 @@
|
||||
<prefs>
|
||||
</prefs>
|
||||
</emItem>
|
||||
<emItem blockID="i838" id="{87b5a11e-3b54-42d2-9102-0a7cb1f79ebf}">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="3">
|
||||
<emItem blockID="i700" id="2bbadf1f-a5af-499f-9642-9942fcdb7c76@f05a14cc-8842-4eee-be17-744677a917ed.com">
|
||||
<versionRange minVersion="0" maxVersion="*" severity="1">
|
||||
</versionRange>
|
||||
<prefs>
|
||||
</prefs>
|
||||
@ -3545,6 +3557,123 @@
|
||||
</certItem>
|
||||
<certItem issuerName="MEQxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwx0aGF3dGUsIEluYy4xHjAcBgNVBAMTFXRoYXd0ZSBFViBTU0wgQ0EgLSBHMw==">
|
||||
<serialNumber>CrTHPEE6AZSfI3jysin2bA==</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
|
||||
<serialNumber>BAAAAAABCfhiO+s=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
|
||||
<serialNumber>BAAAAAABHhw1vwc=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
|
||||
<serialNumber>BAAAAAABCFiEp9s=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MF8xCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRQwEgYDVQQLEwtQYXJ0bmVycyBDQTEfMB0GA1UEAxMWR2xvYmFsU2lnbiBQYXJ0bmVycyBDQQ==">
|
||||
<serialNumber>BAAAAAABF2Tb8Bc=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABAPpuVh0=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABGMGjftY=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABHkSHlSo=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABJ/ufRdg=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABMrS7t2g=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABBHYoIFs=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABLM/7qjk=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAAA+X/GIyk=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABKB/OGqI=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABKUXDqxw=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABHkSHjz8=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABJQdAjik=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABMxvC9bk=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABGMG0Gmw=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABJZbEU4I=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABJ/ufQg8=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABCUVQ9No=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABA/A35EU=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABHJRKMpA=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABHJRKNmk=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MHExKDAmBgNVBAMTH0dsb2JhbFNpZ24gUm9vdFNpZ24gUGFydG5lcnMgQ0ExHTAbBgNVBAsTFFJvb3RTaWduIFBhcnRuZXJzIENBMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMQswCQYDVQQGEwJCRQ==">
|
||||
<serialNumber>BAAAAAABAJmPjfQ=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>sPNcCSE9Nkg3jy5IN1xe2Q==</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>UU3AP1SMxmyhBFq7MRFZmf0=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>F7PAjw2k0dTX5escPnyVOBo=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>OYBKgxEHpW/8XGAGAlvJyMA=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>UV9aaDeNRNtQuXjRYk4Skhg=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>YRJNfMoc12IpmW+Enpv3Pdo=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>e/fIfg2Dj2tkYIWVu2r82Cc=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>bAOrKSMsmA0MLJyAJ5BRsUM=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>DAk9hy8DhHSo+aQetvPB/fY=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>O2S99lVUxErLSk56GvWRv+E=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>F7PAjw2k0dTX5escPnyVOBo=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MFwxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExGzAZBgNVBAMTElRydXN0ZWQgUm9vdCBDQSBHMg==">
|
||||
<serialNumber>Mq0P6o03FDk0B2bnJ+mYPGo=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MIGBMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVibGlzaGluZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQdWJsaXNoaW5nIENB">
|
||||
<serialNumber>BAAAAAABHkSl7L4=</serialNumber>
|
||||
</certItem>
|
||||
<certItem issuerName="MIGBMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVibGlzaGluZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQdWJsaXNoaW5nIENB">
|
||||
<serialNumber>BAAAAAABI54PryQ=</serialNumber>
|
||||
</certItem>
|
||||
</certItems>
|
||||
|
||||
|
@ -1451,14 +1451,14 @@ pref("browser.uiCustomization.debug", false);
|
||||
pref("browser.uiCustomization.state", "");
|
||||
|
||||
// The remote content URL shown for FxA signup. Must use HTTPS.
|
||||
pref("identity.fxaccounts.remote.signup.uri", "https://accounts.firefox.com/signup?service=sync&context=fx_desktop_v2");
|
||||
pref("identity.fxaccounts.remote.signup.uri", "https://accounts.firefox.com/signup?service=sync&context=fx_desktop_v3");
|
||||
|
||||
// The URL where remote content that forces re-authentication for Firefox Accounts
|
||||
// should be fetched. Must use HTTPS.
|
||||
pref("identity.fxaccounts.remote.force_auth.uri", "https://accounts.firefox.com/force_auth?service=sync&context=fx_desktop_v2");
|
||||
pref("identity.fxaccounts.remote.force_auth.uri", "https://accounts.firefox.com/force_auth?service=sync&context=fx_desktop_v3");
|
||||
|
||||
// The remote content URL shown for signin in. Must use HTTPS.
|
||||
pref("identity.fxaccounts.remote.signin.uri", "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v2");
|
||||
pref("identity.fxaccounts.remote.signin.uri", "https://accounts.firefox.com/signin?service=sync&context=fx_desktop_v3");
|
||||
|
||||
// The remote content URL where FxAccountsWebChannel messages originate.
|
||||
pref("identity.fxaccounts.remote.webchannel.uri", "https://accounts.firefox.com/");
|
||||
@ -1631,3 +1631,5 @@ pref("media.webspeech.synth.enabled", true);
|
||||
#endif
|
||||
|
||||
pref("browser.esedbreader.loglevel", "Error");
|
||||
|
||||
pref("browser.laterrun.enabled", false);
|
||||
|
@ -126,60 +126,65 @@
|
||||
/>
|
||||
</vbox>
|
||||
<!-- Sync is ready to Sync but the "tabs" engine isn't enabled-->
|
||||
<vbox id="PanelUI-remotetabs-tabsdisabledpane"
|
||||
class="PanelUI-remotetabs-instruction-box">
|
||||
<hbox pack="center">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
</hbox>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
|
||||
<hbox pack="center">
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.openprefs.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
<hbox id="PanelUI-remotetabs-tabsdisabledpane" pack="center" flex="1">
|
||||
<vbox class="PanelUI-remotetabs-instruction-box">
|
||||
<hbox pack="center">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
</hbox>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.tabsnotsyncing.label;</label>
|
||||
<hbox pack="center">
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.openprefs.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</hbox>
|
||||
</vbox>
|
||||
</hbox>
|
||||
<!-- Sync is ready to Sync but we are still fetching the tabs to show -->
|
||||
<vbox id="PanelUI-remotetabs-fetching">
|
||||
<label>&appMenuRemoteTabs.fetching.label;</label>
|
||||
</vbox>
|
||||
<!-- Sync has only 1 (ie, this) device connected -->
|
||||
<vbox id="PanelUI-remotetabs-nodevicespane"
|
||||
class="PanelUI-remotetabs-instruction-box">
|
||||
<hbox pack="center">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
</hbox>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.noclients.label;</label>
|
||||
<!-- The inner HTML for PanelUI-remotetabs-mobile-promo is built at runtime -->
|
||||
<label id="PanelUI-remotetabs-mobile-promo"/>
|
||||
</vbox>
|
||||
<hbox id="PanelUI-remotetabs-nodevicespane" pack="center" flex="1">
|
||||
<vbox class="PanelUI-remotetabs-instruction-box">
|
||||
<hbox pack="center">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
</hbox>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.noclients.label;</label>
|
||||
<!-- The inner HTML for PanelUI-remotetabs-mobile-promo is built at runtime -->
|
||||
<label id="PanelUI-remotetabs-mobile-promo"/>
|
||||
</vbox>
|
||||
</hbox>
|
||||
</deck>
|
||||
</vbox>
|
||||
<!-- When Sync is not configured -->
|
||||
<vbox id="PanelUI-remotetabs-setupsync"
|
||||
flex="1"
|
||||
align="center"
|
||||
class="PanelUI-remotetabs-instruction-box"
|
||||
observes="sync-setup-state">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.signin.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</vbox>
|
||||
<!-- When Sync needs re-authentication. This uses the exact same messaging
|
||||
as "Sync is not configured" but remains a separate box so we get
|
||||
the goodness of observing broadcasters to manage the hidden states -->
|
||||
<vbox id="PanelUI-remotetabs-reauthsync"
|
||||
flex="1"
|
||||
align="center"
|
||||
class="PanelUI-remotetabs-instruction-box"
|
||||
observes="sync-reauth-state">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.signin.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</vbox>
|
||||
<!-- a box to ensure contained boxes are centered horizonally -->
|
||||
<hbox pack="center" flex="1">
|
||||
<!-- When Sync is not configured -->
|
||||
<vbox id="PanelUI-remotetabs-setupsync"
|
||||
flex="1"
|
||||
align="center"
|
||||
class="PanelUI-remotetabs-instruction-box"
|
||||
observes="sync-setup-state">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.signin.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</vbox>
|
||||
<!-- When Sync needs re-authentication. This uses the exact same messaging
|
||||
as "Sync is not configured" but remains a separate box so we get
|
||||
the goodness of observing broadcasters to manage the hidden states -->
|
||||
<vbox id="PanelUI-remotetabs-reauthsync"
|
||||
flex="1"
|
||||
align="center"
|
||||
class="PanelUI-remotetabs-instruction-box"
|
||||
observes="sync-reauth-state">
|
||||
<image class="fxaSyncIllustration" alt=""/>
|
||||
<label class="PanelUI-remotetabs-instruction-label">&appMenuRemoteTabs.notsignedin.label;</label>
|
||||
<toolbarbutton class="PanelUI-remotetabs-prefs-button"
|
||||
label="&appMenuRemoteTabs.signin.label;"
|
||||
oncommand="gSyncUI.openSetup();"/>
|
||||
</vbox>
|
||||
</hbox>
|
||||
</vbox>
|
||||
</panelview>
|
||||
|
||||
|
@ -8,6 +8,8 @@ Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Components.utils.import("resource://gre/modules/AppConstants.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "LaterRun",
|
||||
"resource:///modules/LaterRun.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
|
||||
"resource://gre/modules/PrivateBrowsingUtils.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
|
||||
@ -353,7 +355,7 @@ nsBrowserContentHandler.prototype = {
|
||||
var uriparam;
|
||||
try {
|
||||
while ((uriparam = cmdLine.handleFlagWithParam("new-window", false))) {
|
||||
var uri = resolveURIInternal(cmdLine, uriparam);
|
||||
let uri = resolveURIInternal(cmdLine, uriparam);
|
||||
if (!shouldLoadURI(uri))
|
||||
continue;
|
||||
openWindow(null, this.chromeURL, "_blank",
|
||||
@ -368,7 +370,7 @@ nsBrowserContentHandler.prototype = {
|
||||
|
||||
try {
|
||||
while ((uriparam = cmdLine.handleFlagWithParam("new-tab", false))) {
|
||||
var uri = resolveURIInternal(cmdLine, uriparam);
|
||||
let uri = resolveURIInternal(cmdLine, uriparam);
|
||||
handURIToExistingBrowser(uri, nsIBrowserDOMWindow.OPEN_NEWTAB, cmdLine);
|
||||
cmdLine.preventDefault = true;
|
||||
}
|
||||
@ -386,18 +388,18 @@ nsBrowserContentHandler.prototype = {
|
||||
openPreferences();
|
||||
cmdLine.preventDefault = true;
|
||||
} else try {
|
||||
var uri = resolveURIInternal(cmdLine, chromeParam);
|
||||
let isLocal = (uri) => {
|
||||
let resolvedURI = resolveURIInternal(cmdLine, chromeParam);
|
||||
let isLocal = uri => {
|
||||
let localSchemes = new Set(["chrome", "file", "resource"]);
|
||||
if (uri instanceof Components.interfaces.nsINestedURI) {
|
||||
uri = uri.QueryInterface(Components.interfaces.nsINestedURI).innerMostURI;
|
||||
}
|
||||
return localSchemes.has(uri.scheme);
|
||||
};
|
||||
if (isLocal(uri)) {
|
||||
if (isLocal(resolvedURI)) {
|
||||
// If the URI is local, we are sure it won't wrongly inherit chrome privs
|
||||
var features = "chrome,dialog=no,all" + this.getFeatures(cmdLine);
|
||||
openWindow(null, uri.spec, "_blank", features);
|
||||
openWindow(null, resolvedURI.spec, "_blank", features);
|
||||
cmdLine.preventDefault = true;
|
||||
} else {
|
||||
dump("*** Preventing load of web URI as chrome\n");
|
||||
@ -418,11 +420,14 @@ nsBrowserContentHandler.prototype = {
|
||||
try {
|
||||
var privateWindowParam = cmdLine.handleFlagWithParam("private-window", false);
|
||||
if (privateWindowParam) {
|
||||
var uri = resolveURIInternal(cmdLine, privateWindowParam);
|
||||
handURIToExistingBrowser(uri, nsIBrowserDOMWindow.OPEN_NEWTAB, cmdLine, true);
|
||||
let resolvedURI = resolveURIInternal(cmdLine, privateWindowParam);
|
||||
handURIToExistingBrowser(resolvedURI, nsIBrowserDOMWindow.OPEN_NEWTAB, cmdLine, true);
|
||||
cmdLine.preventDefault = true;
|
||||
}
|
||||
} catch (e if e.result == Components.results.NS_ERROR_INVALID_ARG) {
|
||||
} catch (e) {
|
||||
if (e.result != Components.results.NS_ERROR_INVALID_ARG) {
|
||||
throw e;
|
||||
}
|
||||
// NS_ERROR_INVALID_ARG is thrown when flag exists, but has no param.
|
||||
if (cmdLine.handleFlag("private-window", false)) {
|
||||
openWindow(null, this.chromeURL, "_blank",
|
||||
@ -449,10 +454,10 @@ nsBrowserContentHandler.prototype = {
|
||||
var file = cmdLine.resolveFile(fileParam);
|
||||
var ios = Components.classes["@mozilla.org/network/io-service;1"]
|
||||
.getService(Components.interfaces.nsIIOService);
|
||||
var uri = ios.newFileURI(file);
|
||||
openWindow(null, this.chromeURL, "_blank",
|
||||
var fileURI = ios.newFileURI(file);
|
||||
openWindow(null, this.chromeURL, "_blank",
|
||||
"chrome,dialog=no,all" + this.getFeatures(cmdLine),
|
||||
uri.spec);
|
||||
fileURI.spec);
|
||||
cmdLine.preventDefault = true;
|
||||
}
|
||||
|
||||
@ -520,6 +525,8 @@ nsBrowserContentHandler.prototype = {
|
||||
// New profile.
|
||||
overridePage = Services.urlFormatter.formatURLPref("startup.homepage_welcome_url");
|
||||
additionalPage = Services.urlFormatter.formatURLPref("startup.homepage_welcome_url.additional");
|
||||
// Turn on 'later run' pages for new profiles.
|
||||
LaterRun.enabled = true;
|
||||
break;
|
||||
case OVERRIDE_NEW_MSTONE:
|
||||
// Check whether we will restore a session. If we will, we assume
|
||||
@ -561,6 +568,10 @@ nsBrowserContentHandler.prototype = {
|
||||
}
|
||||
}
|
||||
|
||||
if (!additionalPage) {
|
||||
additionalPage = LaterRun.getURL() || "";
|
||||
}
|
||||
|
||||
if (additionalPage && additionalPage != "about:blank") {
|
||||
if (overridePage) {
|
||||
overridePage += "|" + additionalPage;
|
||||
|
@ -1,3 +1,3 @@
|
||||
This is the pdf.js project output, https://github.com/mozilla/pdf.js
|
||||
|
||||
Current extension version is: 1.3.196
|
||||
Current extension version is: 1.3.231
|
||||
|
@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdf = {}));
|
||||
// Use strict in our context only - users might not want it
|
||||
'use strict';
|
||||
|
||||
var pdfjsVersion = '1.3.196';
|
||||
var pdfjsBuild = '5336a53';
|
||||
var pdfjsVersion = '1.3.231';
|
||||
var pdfjsBuild = '58329f7';
|
||||
|
||||
var pdfjsFilePath =
|
||||
typeof document !== 'undefined' && document.currentScript ?
|
||||
@ -441,6 +441,26 @@ function isValidUrl(url, allowRelative) {
|
||||
}
|
||||
PDFJS.isValidUrl = isValidUrl;
|
||||
|
||||
/**
|
||||
* Adds various attributes (href, title, target, rel) to hyperlinks.
|
||||
* @param {HTMLLinkElement} link - The link element.
|
||||
* @param {Object} params - An object with the properties:
|
||||
* @param {string} params.url - An absolute URL.
|
||||
*/
|
||||
function addLinkAttributes(link, params) {
|
||||
var url = params && params.url;
|
||||
link.href = link.title = (url ? removeNullCharacters(url) : '');
|
||||
|
||||
if (url) {
|
||||
if (isExternalLinkTargetSet()) {
|
||||
link.target = LinkTargetStringMap[PDFJS.externalLinkTarget];
|
||||
}
|
||||
// Strip referrer from the URL.
|
||||
link.rel = PDFJS.externalLinkRel;
|
||||
}
|
||||
}
|
||||
PDFJS.addLinkAttributes = addLinkAttributes;
|
||||
|
||||
function shadow(obj, prop, value) {
|
||||
Object.defineProperty(obj, prop, { value: value,
|
||||
enumerable: true,
|
||||
@ -840,6 +860,42 @@ var Util = PDFJS.Util = (function UtilClosure() {
|
||||
return num < 0 ? -1 : 1;
|
||||
};
|
||||
|
||||
var ROMAN_NUMBER_MAP = [
|
||||
'', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',
|
||||
'', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',
|
||||
'', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'
|
||||
];
|
||||
/**
|
||||
* Converts positive integers to (upper case) Roman numerals.
|
||||
* @param {integer} number - The number that should be converted.
|
||||
* @param {boolean} lowerCase - Indicates if the result should be converted
|
||||
* to lower case letters. The default is false.
|
||||
* @return {string} The resulting Roman number.
|
||||
*/
|
||||
Util.toRoman = function Util_toRoman(number, lowerCase) {
|
||||
assert(isInt(number) && number > 0,
|
||||
'The number should be a positive integer.');
|
||||
var pos, romanBuf = [];
|
||||
// Thousands
|
||||
while (number >= 1000) {
|
||||
number -= 1000;
|
||||
romanBuf.push('M');
|
||||
}
|
||||
// Hundreds
|
||||
pos = (number / 100) | 0;
|
||||
number %= 100;
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[pos]);
|
||||
// Tens
|
||||
pos = (number / 10) | 0;
|
||||
number %= 10;
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
|
||||
// Ones
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
|
||||
|
||||
var romanStr = romanBuf.join('');
|
||||
return (lowerCase ? romanStr.toLowerCase() : romanStr);
|
||||
};
|
||||
|
||||
Util.appendToArray = function Util_appendToArray(arr1, arr2) {
|
||||
Array.prototype.push.apply(arr1, arr2);
|
||||
};
|
||||
@ -1464,6 +1520,7 @@ exports.isInt = isInt;
|
||||
exports.isNum = isNum;
|
||||
exports.isString = isString;
|
||||
exports.isValidUrl = isValidUrl;
|
||||
exports.addLinkAttributes = addLinkAttributes;
|
||||
exports.loadJpegStream = loadJpegStream;
|
||||
exports.log2 = log2;
|
||||
exports.readInt8 = readInt8;
|
||||
@ -1490,9 +1547,7 @@ exports.warn = warn;
|
||||
var AnnotationBorderStyleType = sharedUtil.AnnotationBorderStyleType;
|
||||
var AnnotationType = sharedUtil.AnnotationType;
|
||||
var Util = sharedUtil.Util;
|
||||
var isExternalLinkTargetSet = sharedUtil.isExternalLinkTargetSet;
|
||||
var LinkTargetStringMap = sharedUtil.LinkTargetStringMap;
|
||||
var removeNullCharacters = sharedUtil.removeNullCharacters;
|
||||
var addLinkAttributes = sharedUtil.addLinkAttributes;
|
||||
var warn = sharedUtil.warn;
|
||||
var CustomStyle = displayDOMUtils.CustomStyle;
|
||||
|
||||
@ -1692,17 +1747,7 @@ var LinkAnnotationElement = (function LinkAnnotationElementClosure() {
|
||||
this.container.className = 'linkAnnotation';
|
||||
|
||||
var link = document.createElement('a');
|
||||
link.href = link.title = (this.data.url ?
|
||||
removeNullCharacters(this.data.url) : '');
|
||||
|
||||
if (this.data.url && isExternalLinkTargetSet()) {
|
||||
link.target = LinkTargetStringMap[PDFJS.externalLinkTarget];
|
||||
}
|
||||
|
||||
// Strip referrer from the URL.
|
||||
if (this.data.url) {
|
||||
link.rel = PDFJS.externalLinkRel;
|
||||
}
|
||||
addLinkAttributes(link, { url: this.data.url });
|
||||
|
||||
if (!this.data.url) {
|
||||
if (this.data.action) {
|
||||
@ -6460,6 +6505,16 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
|
||||
getDestination: function PDFDocumentProxy_getDestination(id) {
|
||||
return this.transport.getDestination(id);
|
||||
},
|
||||
/**
|
||||
* @return {Promise} A promise that is resolved with: an Array containing
|
||||
* the pageLabels that correspond to the pageIndexes; or null, when no
|
||||
* pageLabels are present in the PDF file.
|
||||
* NOTE: If the pageLabels are all identical to standard page numbering,
|
||||
* i.e. [1, 2, 3, ...], the promise is resolved with an empty Array.
|
||||
*/
|
||||
getPageLabels: function PDFDocumentProxy_getPageLabels() {
|
||||
return this.transport.getPageLabels();
|
||||
},
|
||||
/**
|
||||
* @return {Promise} A promise that is resolved with a lookup table for
|
||||
* mapping named attachments to their content.
|
||||
@ -6484,6 +6539,7 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
|
||||
* italic: boolean,
|
||||
* color: rgb array,
|
||||
* dest: dest obj,
|
||||
* url: string,
|
||||
* items: array of more items like this
|
||||
* },
|
||||
* ...
|
||||
@ -7540,6 +7596,10 @@ var WorkerTransport = (function WorkerTransportClosure() {
|
||||
return this.messageHandler.sendWithPromise('GetDestination', { id: id });
|
||||
},
|
||||
|
||||
getPageLabels: function WorkerTransport_getPageLabels() {
|
||||
return this.messageHandler.sendWithPromise('GetPageLabels', null);
|
||||
},
|
||||
|
||||
getAttachments: function WorkerTransport_getAttachments() {
|
||||
return this.messageHandler.sendWithPromise('GetAttachments', null);
|
||||
},
|
||||
|
291
browser/extensions/pdfjs/content/build/pdf.worker.js
vendored
@ -28,8 +28,8 @@ factory((root.pdfjsDistBuildPdfWorker = {}));
|
||||
// Use strict in our context only - users might not want it
|
||||
'use strict';
|
||||
|
||||
var pdfjsVersion = '1.3.196';
|
||||
var pdfjsBuild = '5336a53';
|
||||
var pdfjsVersion = '1.3.231';
|
||||
var pdfjsBuild = '58329f7';
|
||||
|
||||
var pdfjsFilePath =
|
||||
typeof document !== 'undefined' && document.currentScript ?
|
||||
@ -9480,6 +9480,26 @@ function isValidUrl(url, allowRelative) {
|
||||
}
|
||||
PDFJS.isValidUrl = isValidUrl;
|
||||
|
||||
/**
|
||||
* Adds various attributes (href, title, target, rel) to hyperlinks.
|
||||
* @param {HTMLLinkElement} link - The link element.
|
||||
* @param {Object} params - An object with the properties:
|
||||
* @param {string} params.url - An absolute URL.
|
||||
*/
|
||||
function addLinkAttributes(link, params) {
|
||||
var url = params && params.url;
|
||||
link.href = link.title = (url ? removeNullCharacters(url) : '');
|
||||
|
||||
if (url) {
|
||||
if (isExternalLinkTargetSet()) {
|
||||
link.target = LinkTargetStringMap[PDFJS.externalLinkTarget];
|
||||
}
|
||||
// Strip referrer from the URL.
|
||||
link.rel = PDFJS.externalLinkRel;
|
||||
}
|
||||
}
|
||||
PDFJS.addLinkAttributes = addLinkAttributes;
|
||||
|
||||
function shadow(obj, prop, value) {
|
||||
Object.defineProperty(obj, prop, { value: value,
|
||||
enumerable: true,
|
||||
@ -9879,6 +9899,42 @@ var Util = PDFJS.Util = (function UtilClosure() {
|
||||
return num < 0 ? -1 : 1;
|
||||
};
|
||||
|
||||
var ROMAN_NUMBER_MAP = [
|
||||
'', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM',
|
||||
'', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC',
|
||||
'', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'
|
||||
];
|
||||
/**
|
||||
* Converts positive integers to (upper case) Roman numerals.
|
||||
* @param {integer} number - The number that should be converted.
|
||||
* @param {boolean} lowerCase - Indicates if the result should be converted
|
||||
* to lower case letters. The default is false.
|
||||
* @return {string} The resulting Roman number.
|
||||
*/
|
||||
Util.toRoman = function Util_toRoman(number, lowerCase) {
|
||||
assert(isInt(number) && number > 0,
|
||||
'The number should be a positive integer.');
|
||||
var pos, romanBuf = [];
|
||||
// Thousands
|
||||
while (number >= 1000) {
|
||||
number -= 1000;
|
||||
romanBuf.push('M');
|
||||
}
|
||||
// Hundreds
|
||||
pos = (number / 100) | 0;
|
||||
number %= 100;
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[pos]);
|
||||
// Tens
|
||||
pos = (number / 10) | 0;
|
||||
number %= 10;
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[10 + pos]);
|
||||
// Ones
|
||||
romanBuf.push(ROMAN_NUMBER_MAP[20 + number]);
|
||||
|
||||
var romanStr = romanBuf.join('');
|
||||
return (lowerCase ? romanStr.toLowerCase() : romanStr);
|
||||
};
|
||||
|
||||
Util.appendToArray = function Util_appendToArray(arr1, arr2) {
|
||||
Array.prototype.push.apply(arr1, arr2);
|
||||
};
|
||||
@ -10503,6 +10559,7 @@ exports.isInt = isInt;
|
||||
exports.isNum = isNum;
|
||||
exports.isString = isString;
|
||||
exports.isValidUrl = isValidUrl;
|
||||
exports.addLinkAttributes = addLinkAttributes;
|
||||
exports.loadJpegStream = loadJpegStream;
|
||||
exports.log2 = log2;
|
||||
exports.readInt8 = readInt8;
|
||||
@ -22309,6 +22366,8 @@ var shadow = sharedUtil.shadow;
|
||||
var stringToPDFString = sharedUtil.stringToPDFString;
|
||||
var stringToUTF8String = sharedUtil.stringToUTF8String;
|
||||
var warn = sharedUtil.warn;
|
||||
var isValidUrl = sharedUtil.isValidUrl;
|
||||
var Util = sharedUtil.Util;
|
||||
var Ref = corePrimitives.Ref;
|
||||
var RefSet = corePrimitives.RefSet;
|
||||
var RefSetCache = corePrimitives.RefSetCache;
|
||||
@ -22408,9 +22467,17 @@ var Catalog = (function CatalogClosure() {
|
||||
if (!outlineDict.has('Title')) {
|
||||
error('Invalid outline item');
|
||||
}
|
||||
var dest = outlineDict.get('A');
|
||||
if (dest) {
|
||||
dest = dest.get('D');
|
||||
var actionDict = outlineDict.get('A'), dest = null, url = null;
|
||||
if (actionDict) {
|
||||
var destEntry = actionDict.get('D');
|
||||
if (destEntry) {
|
||||
dest = destEntry;
|
||||
} else {
|
||||
var uriEntry = actionDict.get('URI');
|
||||
if (isString(uriEntry) && isValidUrl(uriEntry, false)) {
|
||||
url = uriEntry;
|
||||
}
|
||||
}
|
||||
} else if (outlineDict.has('Dest')) {
|
||||
dest = outlineDict.getRaw('Dest');
|
||||
if (isName(dest)) {
|
||||
@ -22420,6 +22487,7 @@ var Catalog = (function CatalogClosure() {
|
||||
var title = outlineDict.get('Title');
|
||||
var outlineItem = {
|
||||
dest: dest,
|
||||
url: url,
|
||||
title: stringToPDFString(title),
|
||||
color: outlineDict.get('C') || [0, 0, 0],
|
||||
count: outlineDict.get('Count'),
|
||||
@ -22514,6 +22582,96 @@ var Catalog = (function CatalogClosure() {
|
||||
}
|
||||
return dest;
|
||||
},
|
||||
|
||||
get pageLabels() {
|
||||
var obj = null;
|
||||
try {
|
||||
obj = this.readPageLabels();
|
||||
} catch (ex) {
|
||||
if (ex instanceof MissingDataException) {
|
||||
throw ex;
|
||||
}
|
||||
warn('Unable to read page labels.');
|
||||
}
|
||||
return shadow(this, 'pageLabels', obj);
|
||||
},
|
||||
readPageLabels: function Catalog_readPageLabels() {
|
||||
var obj = this.catDict.getRaw('PageLabels');
|
||||
if (!obj) {
|
||||
return null;
|
||||
}
|
||||
var pageLabels = new Array(this.numPages);
|
||||
var style = null;
|
||||
var prefix = '';
|
||||
var start = 1;
|
||||
|
||||
var numberTree = new NumberTree(obj, this.xref);
|
||||
var nums = numberTree.getAll();
|
||||
var currentLabel = '', currentIndex = 1;
|
||||
|
||||
for (var i = 0, ii = this.numPages; i < ii; i++) {
|
||||
if (nums.hasOwnProperty(i)) {
|
||||
var labelDict = nums[i];
|
||||
assert(isDict(labelDict), 'The PageLabel is not a dictionary.');
|
||||
|
||||
var type = labelDict.get('Type');
|
||||
assert(!type || (isName(type) && type.name === 'PageLabel'),
|
||||
'Invalid type in PageLabel dictionary.');
|
||||
|
||||
var s = labelDict.get('S');
|
||||
assert(!s || isName(s), 'Invalid style in PageLabel dictionary.');
|
||||
style = (s ? s.name : null);
|
||||
|
||||
prefix = labelDict.get('P') || '';
|
||||
assert(isString(prefix), 'Invalid prefix in PageLabel dictionary.');
|
||||
|
||||
start = labelDict.get('St') || 1;
|
||||
assert(isInt(start), 'Invalid start in PageLabel dictionary.');
|
||||
currentIndex = start;
|
||||
}
|
||||
|
||||
switch (style) {
|
||||
case 'D':
|
||||
currentLabel = currentIndex;
|
||||
break;
|
||||
case 'R':
|
||||
case 'r':
|
||||
currentLabel = Util.toRoman(currentIndex, style === 'r');
|
||||
break;
|
||||
case 'A':
|
||||
case 'a':
|
||||
var LIMIT = 26; // Use only the characters A--Z, or a--z.
|
||||
var A_UPPER_CASE = 0x41, A_LOWER_CASE = 0x61;
|
||||
|
||||
var baseCharCode = (style === 'a' ? A_LOWER_CASE : A_UPPER_CASE);
|
||||
var letterIndex = currentIndex - 1;
|
||||
var character = String.fromCharCode(baseCharCode +
|
||||
(letterIndex % LIMIT));
|
||||
var charBuf = [];
|
||||
for (var j = 0, jj = (letterIndex / LIMIT) | 0; j <= jj; j++) {
|
||||
charBuf.push(character);
|
||||
}
|
||||
currentLabel = charBuf.join('');
|
||||
break;
|
||||
default:
|
||||
assert(!style,
|
||||
'Invalid style "' + style + '" in PageLabel dictionary.');
|
||||
}
|
||||
pageLabels[i] = prefix + currentLabel;
|
||||
|
||||
currentLabel = '';
|
||||
currentIndex++;
|
||||
}
|
||||
|
||||
// Ignore PageLabels if they correspond to standard page numbering.
|
||||
for (i = 0, ii = this.numPages; i < ii; i++) {
|
||||
if (pageLabels[i] !== (i + 1).toString()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return (i === ii ? [] : pageLabels);
|
||||
},
|
||||
|
||||
get attachments() {
|
||||
var xref = this.xref;
|
||||
var attachments = null, nameTreeRef;
|
||||
@ -23389,24 +23547,23 @@ var XRef = (function XRefClosure() {
|
||||
})();
|
||||
|
||||
/**
|
||||
* A NameTree is like a Dict but has some advantageous properties, see the
|
||||
* spec (7.9.6) for more details.
|
||||
* TODO: implement all the Dict functions and make this more efficent.
|
||||
* A NameTree/NumberTree is like a Dict but has some advantageous properties,
|
||||
* see the specification (7.9.6 and 7.9.7) for additional details.
|
||||
* TODO: implement all the Dict functions and make this more efficient.
|
||||
*/
|
||||
var NameTree = (function NameTreeClosure() {
|
||||
function NameTree(root, xref) {
|
||||
this.root = root;
|
||||
this.xref = xref;
|
||||
var NameOrNumberTree = (function NameOrNumberTreeClosure() {
|
||||
function NameOrNumberTree(root, xref) {
|
||||
throw new Error('Cannot initialize NameOrNumberTree.');
|
||||
}
|
||||
|
||||
NameTree.prototype = {
|
||||
getAll: function NameTree_getAll() {
|
||||
NameOrNumberTree.prototype = {
|
||||
getAll: function NameOrNumberTree_getAll() {
|
||||
var dict = {};
|
||||
if (!this.root) {
|
||||
return dict;
|
||||
}
|
||||
var xref = this.xref;
|
||||
// reading name tree
|
||||
// Reading Name/Number tree.
|
||||
var processed = new RefSet();
|
||||
processed.put(this.root);
|
||||
var queue = [this.root];
|
||||
@ -23420,45 +23577,43 @@ var NameTree = (function NameTreeClosure() {
|
||||
var kids = obj.get('Kids');
|
||||
for (i = 0, n = kids.length; i < n; i++) {
|
||||
var kid = kids[i];
|
||||
if (processed.has(kid)) {
|
||||
error('invalid destinations');
|
||||
}
|
||||
assert(!processed.has(kid),
|
||||
'Duplicate entry in "' + this._type + '" tree.');
|
||||
queue.push(kid);
|
||||
processed.put(kid);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
var names = obj.get('Names');
|
||||
if (names) {
|
||||
for (i = 0, n = names.length; i < n; i += 2) {
|
||||
dict[xref.fetchIfRef(names[i])] = xref.fetchIfRef(names[i + 1]);
|
||||
var entries = obj.get(this._type);
|
||||
if (isArray(entries)) {
|
||||
for (i = 0, n = entries.length; i < n; i += 2) {
|
||||
dict[xref.fetchIfRef(entries[i])] = xref.fetchIfRef(entries[i + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return dict;
|
||||
},
|
||||
|
||||
get: function NameTree_get(destinationId) {
|
||||
get: function NameOrNumberTree_get(key) {
|
||||
if (!this.root) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var xref = this.xref;
|
||||
var kidsOrNames = xref.fetchIfRef(this.root);
|
||||
var kidsOrEntries = xref.fetchIfRef(this.root);
|
||||
var loopCount = 0;
|
||||
var MAX_NAMES_LEVELS = 10;
|
||||
var MAX_LEVELS = 10;
|
||||
var l, r, m;
|
||||
|
||||
// Perform a binary search to quickly find the entry that
|
||||
// contains the named destination we are looking for.
|
||||
while (kidsOrNames.has('Kids')) {
|
||||
loopCount++;
|
||||
if (loopCount > MAX_NAMES_LEVELS) {
|
||||
warn('Search depth limit for named destionations has been reached.');
|
||||
// contains the key we are looking for.
|
||||
while (kidsOrEntries.has('Kids')) {
|
||||
if (++loopCount > MAX_LEVELS) {
|
||||
warn('Search depth limit reached for "' + this._type + '" tree.');
|
||||
return null;
|
||||
}
|
||||
|
||||
var kids = kidsOrNames.get('Kids');
|
||||
var kids = kidsOrEntries.get('Kids');
|
||||
if (!isArray(kids)) {
|
||||
return null;
|
||||
}
|
||||
@ -23470,12 +23625,12 @@ var NameTree = (function NameTreeClosure() {
|
||||
var kid = xref.fetchIfRef(kids[m]);
|
||||
var limits = kid.get('Limits');
|
||||
|
||||
if (destinationId < xref.fetchIfRef(limits[0])) {
|
||||
if (key < xref.fetchIfRef(limits[0])) {
|
||||
r = m - 1;
|
||||
} else if (destinationId > xref.fetchIfRef(limits[1])) {
|
||||
} else if (key > xref.fetchIfRef(limits[1])) {
|
||||
l = m + 1;
|
||||
} else {
|
||||
kidsOrNames = xref.fetchIfRef(kids[m]);
|
||||
kidsOrEntries = xref.fetchIfRef(kids[m]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -23484,33 +23639,57 @@ var NameTree = (function NameTreeClosure() {
|
||||
}
|
||||
}
|
||||
|
||||
// If we get here, then we have found the right entry. Now
|
||||
// go through the named destinations in the Named dictionary
|
||||
// until we find the exact destination we're looking for.
|
||||
var names = kidsOrNames.get('Names');
|
||||
if (isArray(names)) {
|
||||
// If we get here, then we have found the right entry. Now go through the
|
||||
// entries in the dictionary until we find the key we're looking for.
|
||||
var entries = kidsOrEntries.get(this._type);
|
||||
if (isArray(entries)) {
|
||||
// Perform a binary search to reduce the lookup time.
|
||||
l = 0;
|
||||
r = names.length - 2;
|
||||
r = entries.length - 2;
|
||||
while (l <= r) {
|
||||
// Check only even indices (0, 2, 4, ...) because the
|
||||
// odd indices contain the actual D array.
|
||||
// odd indices contain the actual data.
|
||||
m = (l + r) & ~1;
|
||||
if (destinationId < xref.fetchIfRef(names[m])) {
|
||||
var currentKey = xref.fetchIfRef(entries[m]);
|
||||
if (key < currentKey) {
|
||||
r = m - 2;
|
||||
} else if (destinationId > xref.fetchIfRef(names[m])) {
|
||||
} else if (key > currentKey) {
|
||||
l = m + 2;
|
||||
} else {
|
||||
return xref.fetchIfRef(names[m + 1]);
|
||||
return xref.fetchIfRef(entries[m + 1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
};
|
||||
return NameOrNumberTree;
|
||||
})();
|
||||
|
||||
var NameTree = (function NameTreeClosure() {
|
||||
function NameTree(root, xref) {
|
||||
this.root = root;
|
||||
this.xref = xref;
|
||||
this._type = 'Names';
|
||||
}
|
||||
|
||||
Util.inherit(NameTree, NameOrNumberTree, {});
|
||||
|
||||
return NameTree;
|
||||
})();
|
||||
|
||||
var NumberTree = (function NumberTreeClosure() {
|
||||
function NumberTree(root, xref) {
|
||||
this.root = root;
|
||||
this.xref = xref;
|
||||
this._type = 'Nums';
|
||||
}
|
||||
|
||||
Util.inherit(NumberTree, NameOrNumberTree, {});
|
||||
|
||||
return NumberTree;
|
||||
})();
|
||||
|
||||
/**
|
||||
* "A PDF file can refer to the contents of another file by using a File
|
||||
* Specification (PDF 1.1)", see the spec (7.11) for more details.
|
||||
@ -28097,8 +28276,16 @@ var Font = (function FontClosure() {
|
||||
delete tables['cvt '];
|
||||
this.isOpenType = true;
|
||||
} else {
|
||||
if (!tables.glyf || !tables.loca) {
|
||||
error('Required "glyf" or "loca" tables are not found');
|
||||
if (!tables.loca) {
|
||||
error('Required "loca" table is not found');
|
||||
}
|
||||
if (!tables.glyf) {
|
||||
warn('Required "glyf" table is not found -- trying to recover.');
|
||||
// Note: We use `sanitizeGlyphLocations` to add dummy glyf data below.
|
||||
tables.glyf = {
|
||||
tag: 'glyf',
|
||||
data: new Uint8Array(0),
|
||||
};
|
||||
}
|
||||
this.isOpenType = false;
|
||||
}
|
||||
@ -28305,10 +28492,12 @@ var Font = (function FontClosure() {
|
||||
var glyphId = properties.glyphNames.indexOf(glyphName);
|
||||
if (glyphId > 0 && hasGlyph(glyphId, -1, -1)) {
|
||||
charCodeToGlyphId[charCode] = glyphId;
|
||||
} else {
|
||||
charCodeToGlyphId[charCode] = 0; // notdef
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
charCodeToGlyphId[charCode] = 0; // notdef
|
||||
}
|
||||
}
|
||||
} else if (cmapPlatformId === 0 && cmapEncodingId === 0) {
|
||||
// Default Unicode semantics, use the charcodes as is.
|
||||
@ -40411,6 +40600,12 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
|
||||
}
|
||||
);
|
||||
|
||||
handler.on('GetPageLabels',
|
||||
function wphSetupGetPageLabels(data) {
|
||||
return pdfManager.ensureCatalog('pageLabels');
|
||||
}
|
||||
);
|
||||
|
||||
handler.on('GetAttachments',
|
||||
function wphSetupGetAttachments(data) {
|
||||
return pdfManager.ensureCatalog('attachments');
|
||||
|
@ -278,7 +278,8 @@ See https://github.com/adobe-type-tools/cmap-resources
|
||||
<p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<input type="password" id="password" class="toolbarField" />
|
||||
<!-- The type="password" attribute is set via script, to prevent warnings in Firefox for all http:// documents. -->
|
||||
<input id="password" class="toolbarField" />
|
||||
</div>
|
||||
<div class="buttonRow">
|
||||
<button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
|
||||
|
@ -3014,6 +3014,7 @@ var PasswordPrompt = {
|
||||
|
||||
open: function passwordPromptOpen() {
|
||||
OverlayManager.open(this.overlayName).then(function () {
|
||||
this.passwordField.type = 'password';
|
||||
this.passwordField.focus();
|
||||
|
||||
var promptString = mozL10n.get('password_label', null,
|
||||
@ -3031,6 +3032,7 @@ var PasswordPrompt = {
|
||||
close: function passwordPromptClose() {
|
||||
OverlayManager.close(this.overlayName).then(function () {
|
||||
this.passwordField.value = '';
|
||||
this.passwordField.type = '';
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
@ -5747,6 +5749,10 @@ var PDFOutlineView = (function PDFOutlineViewClosure() {
|
||||
* @private
|
||||
*/
|
||||
_bindLink: function PDFOutlineView_bindLink(element, item) {
|
||||
if (item.url) {
|
||||
PDFJS.addLinkAttributes(element, { url: item.url });
|
||||
return;
|
||||
}
|
||||
var linkService = this.linkService;
|
||||
element.href = linkService.getDestinationHash(item.dest);
|
||||
element.onclick = function goToDestination(e) {
|
||||
|
@ -308,7 +308,7 @@ var pktUI = (function() {
|
||||
if (subview) {
|
||||
// Use the subview's size
|
||||
iframe.style.width = "100%";
|
||||
iframe.style.height = subview.clientHeight + "px";
|
||||
iframe.style.height = subview.parentNode.clientHeight + "px";
|
||||
} else {
|
||||
// Set an explicit size, panel will adapt.
|
||||
iframe.style.width = options.width + "px";
|
||||
@ -535,12 +535,7 @@ var pktUI = (function() {
|
||||
}
|
||||
|
||||
function getSubview() {
|
||||
var frame = getPanelFrame();
|
||||
var view = frame;
|
||||
while (view && view.localName != "panelview") {
|
||||
view = view.parentNode;
|
||||
}
|
||||
|
||||
var view = document.getElementById("PanelUI-pocketView");
|
||||
if (view && view.getAttribute("current") == "true")
|
||||
return view;
|
||||
return null;
|
||||
|
@ -10,3 +10,23 @@
|
||||
% skin pocket-shared classic/1.0 %skin/shared/
|
||||
content/ (content/*)
|
||||
skin/ (skin/*)
|
||||
# windows overrides
|
||||
% override chrome://pocket/skin/menuPanel.png chrome://pocket/skin/menuPanel-aero.png os=WINNT osversion=6
|
||||
% override chrome://pocket/skin/menuPanel.png chrome://pocket/skin/menuPanel-aero.png os=WINNT osversion=6.1
|
||||
% override chrome://pocket/skin/menuPanel@2x.png chrome://pocket/skin/menuPanel-aero@2x.png os=WINNT osversion=6
|
||||
% override chrome://pocket/skin/menuPanel@2x.png chrome://pocket/skin/menuPanel-aero@2x.png os=WINNT osversion=6.1
|
||||
% override chrome://pocket/skin/Toolbar@2x.png chrome://pocket/skin/Toolbar-aero@2x.png os=WINNT osversion=6
|
||||
% override chrome://pocket/skin/Toolbar@2x.png chrome://pocket/skin/Toolbar-aero@2x.png os=WINNT osversion=6.1
|
||||
% override chrome://pocket/skin/Toolbar@2x.png chrome://pocket/skin/Toolbar-win8@2x.png os=WINNT osversion=6.2
|
||||
% override chrome://pocket/skin/Toolbar@2x.png chrome://pocket/skin/Toolbar-win8@2x.png os=WINNT osversion=6.3
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-XP.png os=WINNT osversion<6
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-aero.png os=WINNT osversion=6
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-aero.png os=WINNT osversion=6.1
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-win8.png os=WINNT osversion=6.2
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-win8.png os=WINNT osversion=6.3
|
||||
# osx overrides
|
||||
% override chrome://pocket/skin/Toolbar.png chrome://pocket/skin/Toolbar-yosemite.png os=Darwin osversion>=10.10
|
||||
% override chrome://pocket/skin/Toolbar@2x.png chrome://pocket/skin/Toolbar-yosemite@2x.png os=Darwin osversion>=10.10
|
||||
% override chrome://pocket/skin/menuPanel.png chrome://pocket/skin/menuPanel-yosemite.png os=Darwin osversion>=10.10
|
||||
% override chrome://pocket/skin/menuPanel@2x.png chrome://pocket/skin/menuPanel-yosemite@2x.png os=Darwin osversion>=10.10
|
||||
|
||||
|
BIN
browser/extensions/pocket/skin/linux/Toolbar-inverted.png
Normal file
After Width: | Height: | Size: 743 B |
BIN
browser/extensions/pocket/skin/linux/Toolbar.png
Normal file
After Width: | Height: | Size: 975 B |
BIN
browser/extensions/pocket/skin/linux/menuPanel.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
browser/extensions/pocket/skin/linux/menuPanel@2x.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
@ -1 +1,10 @@
|
||||
@import url("chrome://pocket-shared/skin/pocket.css");
|
||||
|
||||
#nav-bar #pocket-button > .toolbarbutton-icon {
|
||||
padding: 2px 6px;
|
||||
}
|
||||
|
||||
:-moz-any(#TabsToolbar, .widget-overflow-list) #pocket-button > .toolbarbutton-icon {
|
||||
max-width: 18px;
|
||||
padding: 0;
|
||||
}
|
BIN
browser/extensions/pocket/skin/osx/Toolbar-inverted.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
browser/extensions/pocket/skin/osx/Toolbar-inverted@2x.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
browser/extensions/pocket/skin/osx/Toolbar-yosemite.png
Normal file
After Width: | Height: | Size: 958 B |
BIN
browser/extensions/pocket/skin/osx/Toolbar-yosemite@2x.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
browser/extensions/pocket/skin/osx/Toolbar.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
browser/extensions/pocket/skin/osx/Toolbar@2x.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
browser/extensions/pocket/skin/osx/menuPanel-yosemite.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
browser/extensions/pocket/skin/osx/menuPanel-yosemite@2x.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
browser/extensions/pocket/skin/osx/menuPanel.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
browser/extensions/pocket/skin/osx/menuPanel@2x.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
@ -1,17 +1,22 @@
|
||||
@import url("chrome://pocket-shared/skin/pocket.css");
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"] > .toolbarbutton-icon {
|
||||
max-width: 18px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"][open] {
|
||||
-moz-image-region: rect(36px, 774px, 54px, 756px);
|
||||
-moz-image-region: rect(36px, 18px, 54px, 0);
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"] {
|
||||
-moz-image-region: rect(0, 1548px, 36px, 1512px);
|
||||
-moz-image-region: rect(0, 36px, 36px, 0);
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"][open] {
|
||||
-moz-image-region: rect(72px, 1548px, 108px, 1512px);
|
||||
-moz-image-region: rect(72px, 36px, 108px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,12 +34,12 @@
|
||||
|
||||
@media not all and (min-resolution: 1.1dppx) {
|
||||
#pocket-button:hover:active:not([disabled="true"]):not([cui-areatype="menu-panel"]) {
|
||||
-moz-image-region: rect(18px, 774px, 36px, 756px);
|
||||
-moz-image-region: rect(18px, 18px, 36px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
#pocket-button:hover:active:not([disabled="true"]):not([cui-areatype="menu-panel"]) {
|
||||
-moz-image-region: rect(36px, 1548px, 72px, 1512px);
|
||||
-moz-image-region: rect(36px, 36px, 72px, 0);
|
||||
}
|
||||
}
|
||||
|
@ -14,51 +14,52 @@ panelmultiview[mainViewId=PanelUI-pocketView] > .panel-viewcontainer > .panel-vi
|
||||
}
|
||||
|
||||
#pocket-button {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar.png");
|
||||
list-style-image: url("chrome://pocket/skin/Toolbar.png");
|
||||
-moz-image-region: rect(0, 18px, 18px, 0);
|
||||
}
|
||||
|
||||
toolbar[brighttext] #pocket-button {
|
||||
list-style-image: url(chrome://browser/skin/Toolbar-inverted.png);
|
||||
list-style-image: url(chrome://pocket/skin/Toolbar-inverted.png);
|
||||
}
|
||||
|
||||
@media not all and (min-resolution: 1.1dppx) {
|
||||
#pocket-button[cui-areatype="menu-panel"],
|
||||
toolbarpaletteitem[place="palette"] > #pocket-button {
|
||||
list-style-image: var(--menupanel-list-style-image);
|
||||
-moz-image-region: rect(0px, 992px, 32px, 960px);
|
||||
list-style-image: url(chrome://pocket/skin/menuPanel.png);
|
||||
-moz-image-region: rect(0, 32px, 32px, 0);
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="menu-panel"][panel-multiview-anchor=true] {
|
||||
-moz-image-region: rect(32px, 992px, 64px, 960px);
|
||||
-moz-image-region: rect(32px, 32px, 64px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
#pocket-button {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar@2x.png");
|
||||
list-style-image: url("chrome://pocket/skin/Toolbar@2x.png");
|
||||
}
|
||||
|
||||
toolbar[brighttext] #pocket-button {
|
||||
list-style-image: url("chrome://browser/skin/Toolbar-inverted@2x.png");
|
||||
list-style-image: url("chrome://pocket/skin/Toolbar-inverted@2x.png");
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="menu-panel"],
|
||||
toolbarpaletteitem[place="palette"] > #pocket-button {
|
||||
list-style-image: var(--menupanel-list-style-image-2x);
|
||||
-moz-image-region: rect(0px, 1984px, 64px, 1920px);
|
||||
list-style-image: url(chrome://pocket/skin/menuPanel@2x.png);
|
||||
-moz-image-region: rect(0px, 64px, 64px, 0);
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="menu-panel"][panel-multiview-anchor=true] {
|
||||
-moz-image-region: rect(64px, 1984px, 128px, 1920px);
|
||||
-moz-image-region: rect(64px, 64px, 128px, 0);
|
||||
}
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"] {
|
||||
-moz-image-region: rect(0, 774px, 18px, 756px);
|
||||
-moz-image-region: rect(0, 18px, 18px, 0);
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"][open] {
|
||||
-moz-image-region: rect(18px, 774px, 36px, 756px);
|
||||
-moz-image-region: rect(18px, 18px, 36px, 0);
|
||||
}
|
||||
|
||||
#panelMenu_pocket,
|
||||
|
BIN
browser/extensions/pocket/skin/windows/Toolbar-XP.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar-aero.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar-aero@2x.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar-inverted.png
Normal file
After Width: | Height: | Size: 825 B |
BIN
browser/extensions/pocket/skin/windows/Toolbar-inverted@2x.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar-lunaSilver.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar-win8.png
Normal file
After Width: | Height: | Size: 649 B |
BIN
browser/extensions/pocket/skin/windows/Toolbar-win8@2x.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
browser/extensions/pocket/skin/windows/Toolbar.png
Normal file
After Width: | Height: | Size: 635 B |
BIN
browser/extensions/pocket/skin/windows/Toolbar@2x.png
Normal file
After Width: | Height: | Size: 1001 B |
BIN
browser/extensions/pocket/skin/windows/menuPanel-aero.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
browser/extensions/pocket/skin/windows/menuPanel-aero@2x.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
browser/extensions/pocket/skin/windows/menuPanel.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
browser/extensions/pocket/skin/windows/menuPanel@2x.png
Normal file
After Width: | Height: | Size: 2.6 KiB |
@ -1,11 +1,26 @@
|
||||
@import url("chrome://pocket-shared/skin/pocket.css");
|
||||
|
||||
#nav-bar #pocket-button > .toolbarbutton-icon {
|
||||
padding: 2px 6px;
|
||||
}
|
||||
|
||||
:-moz-any(#TabsToolbar, .widget-overflow-list) #pocket-button > .toolbarbutton-icon {
|
||||
max-width: 18px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) {
|
||||
#pocket-button {
|
||||
list-style-image: url(chrome://pocket/skin/toolbar-lunaSilver.png)
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-resolution: 1.1dppx) {
|
||||
#pocket-button[cui-areatype="toolbar"] {
|
||||
-moz-image-region: rect(0, 1548px, 36px, 1512px);
|
||||
-moz-image-region: rect(0, 36px, 36px, 0px);
|
||||
}
|
||||
|
||||
#pocket-button[cui-areatype="toolbar"][open] {
|
||||
-moz-image-region: rect(36px, 1548px, 72px, 1512px);
|
||||
-moz-image-region: rect(36px, 36px, 72px, 0px);
|
||||
}
|
||||
}
|
||||
|
170
browser/modules/LaterRun.jsm
Normal file
@ -0,0 +1,170 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
|
||||
|
||||
this.EXPORTED_SYMBOLS = ["LaterRun"];
|
||||
|
||||
Cu.import("resource://gre/modules/Preferences.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "setInterval", "resource://gre/modules/Timer.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "clearInterval", "resource://gre/modules/Timer.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow", "resource://gre/modules/RecentWindow.jsm");
|
||||
|
||||
const kEnabledPref = "browser.laterrun.enabled";
|
||||
const kPagePrefRoot = "browser.laterrun.pages.";
|
||||
// Number of sessions we've been active in
|
||||
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
|
||||
// Time the profile was created at:
|
||||
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
|
||||
|
||||
// After 50 sessions or 1 month since install, assume we will no longer be
|
||||
// interested in showing anything to "new" users
|
||||
const kSelfDestructSessionLimit = 50;
|
||||
const kSelfDestructHoursLimit = 31 * 24;
|
||||
|
||||
class Page {
|
||||
constructor({pref, minimumHoursSinceInstall, minimumSessionCount, requireBoth, url}) {
|
||||
this.pref = pref;
|
||||
this.minimumHoursSinceInstall = minimumHoursSinceInstall || 0;
|
||||
this.minimumSessionCount = minimumSessionCount || 1;
|
||||
this.requireBoth = requireBoth || false;
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
get hasRun() {
|
||||
return Preferences.get(this.pref + "hasRun", false);
|
||||
}
|
||||
|
||||
applies(sessionInfo) {
|
||||
if (this.hasRun) {
|
||||
return false;
|
||||
}
|
||||
if (this.requireBoth) {
|
||||
return sessionInfo.sessionCount >= this.minimumSessionCount &&
|
||||
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
|
||||
}
|
||||
return sessionInfo.sessionCount >= this.minimumSessionCount ||
|
||||
sessionInfo.hoursSinceInstall >= this.minimumHoursSinceInstall;
|
||||
}
|
||||
}
|
||||
|
||||
let LaterRun = {
|
||||
init() {
|
||||
if (!this.enabled) {
|
||||
return;
|
||||
}
|
||||
// If this is the first run, set the time we were installed
|
||||
if (!Preferences.has(kProfileCreationTime)) {
|
||||
// We need to store seconds in order to fit within int prefs.
|
||||
Preferences.set(kProfileCreationTime, Math.floor(Date.now() / 1000));
|
||||
}
|
||||
this.sessionCount++;
|
||||
|
||||
if (this.hoursSinceInstall > kSelfDestructHoursLimit ||
|
||||
this.sessionCount > kSelfDestructSessionLimit) {
|
||||
this.selfDestruct();
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
// The enabled, hoursSinceInstall and sessionCount properties mirror the
|
||||
// preferences system, and are here for convenience.
|
||||
get enabled() {
|
||||
return Preferences.get(kEnabledPref, false);
|
||||
},
|
||||
|
||||
set enabled(val) {
|
||||
let wasEnabled = this.enabled;
|
||||
Preferences.set(kEnabledPref, val);
|
||||
if (val && !wasEnabled) {
|
||||
this.init();
|
||||
}
|
||||
},
|
||||
|
||||
get hoursSinceInstall() {
|
||||
let installStamp = Preferences.get(kProfileCreationTime, Date.now() / 1000);
|
||||
return Math.floor((Date.now() / 1000 - installStamp) / 3600);
|
||||
},
|
||||
|
||||
get sessionCount() {
|
||||
if (this._sessionCount) {
|
||||
return this._sessionCount;
|
||||
}
|
||||
return this._sessionCount = Preferences.get(kSessionCountPref, 0);
|
||||
},
|
||||
|
||||
set sessionCount(val) {
|
||||
this._sessionCount = val;
|
||||
Preferences.set(kSessionCountPref, val);
|
||||
},
|
||||
|
||||
// Because we don't want to keep incrementing this indefinitely for no reason,
|
||||
// we will turn ourselves off after a set amount of time/sessions (see top of
|
||||
// file).
|
||||
selfDestruct() {
|
||||
Preferences.set(kEnabledPref, false);
|
||||
},
|
||||
|
||||
// Create an array of Page objects based on the currently set prefs
|
||||
readPages() {
|
||||
// Enumerate all the pages.
|
||||
let allPrefsForPages = Services.prefs.getChildList(kPagePrefRoot);
|
||||
let pageDataStore = new Map();
|
||||
for (let pref of allPrefsForPages) {
|
||||
let [slug, prop] = pref.substring(kPagePrefRoot.length).split(".");
|
||||
if (!pageDataStore.has(slug)) {
|
||||
pageDataStore.set(slug, {pref: pref.substring(0, pref.length - prop.length)});
|
||||
}
|
||||
let defaultPrefValue = 0;
|
||||
if (prop == "requireBoth" || prop == "hasRun") {
|
||||
defaultPrefValue = false;
|
||||
} else if (prop == "url") {
|
||||
defaultPrefValue = "";
|
||||
}
|
||||
pageDataStore.get(slug)[prop] = Preferences.get(pref, defaultPrefValue);
|
||||
}
|
||||
let rv = [];
|
||||
for (let [, pageData] of pageDataStore) {
|
||||
if (pageData.url) {
|
||||
let uri = null;
|
||||
try {
|
||||
uri = Services.io.newURI(pageData.url.trim(), null, null);
|
||||
} catch (ex) {
|
||||
Cu.reportError("Invalid LaterRun page URL " + pageData.url + " ignored.");
|
||||
}
|
||||
if (!uri.schemeIs("https")) {
|
||||
Cu.reportError("Insecure LaterRun page URL " + uri.spec + " ignored.");
|
||||
} else {
|
||||
pageData.url = uri.spec;
|
||||
rv.push(new Page(pageData));
|
||||
}
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
},
|
||||
|
||||
// Return a URL for display as a 'later run' page if its criteria are matched,
|
||||
// or null otherwise.
|
||||
// NB: will only return one page at a time; if multiple pages match, it's up
|
||||
// to the preference service which one gets shown first, and the next one
|
||||
// will be shown next startup instead.
|
||||
getURL() {
|
||||
if (!this.enabled) {
|
||||
return null;
|
||||
}
|
||||
let pages = this.readPages();
|
||||
let page = pages.find(page => page.applies(this));
|
||||
if (page) {
|
||||
Services.prefs.setBoolPref(page.pref + "hasRun", true);
|
||||
return page.url;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
};
|
||||
|
||||
LaterRun.init();
|
@ -29,6 +29,7 @@ EXTRA_JS_MODULES += [
|
||||
'FormSubmitObserver.jsm',
|
||||
'FormValidationHandler.jsm',
|
||||
'HiddenFrame.jsm',
|
||||
'LaterRun.jsm',
|
||||
'NetworkPrioritizer.jsm',
|
||||
'offlineAppCache.jsm',
|
||||
'PanelFrame.jsm',
|
||||
|
131
browser/modules/test/xpcshell/test_LaterRun.js
Normal file
@ -0,0 +1,131 @@
|
||||
"use strict";
|
||||
|
||||
const kEnabledPref = "browser.laterrun.enabled";
|
||||
const kPagePrefRoot = "browser.laterrun.pages.";
|
||||
const kSessionCountPref = "browser.laterrun.bookkeeping.sessionCount";
|
||||
const kProfileCreationTime = "browser.laterrun.bookkeeping.profileCreationTime";
|
||||
|
||||
Components.utils.import("resource://gre/modules/Services.jsm");
|
||||
Components.utils.import("resource:///modules/LaterRun.jsm");
|
||||
|
||||
Services.prefs.setBoolPref(kEnabledPref, true);
|
||||
|
||||
add_task(function* test_page_applies() {
|
||||
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
|
||||
|
||||
let pages = LaterRun.readPages();
|
||||
// We have to filter the pages because it's possible Firefox ships with other URLs
|
||||
// that get included in this test.
|
||||
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
|
||||
Assert.equal(pages.length, 1, "Got 1 page");
|
||||
let page = pages[0];
|
||||
Assert.equal(page.pref, kPagePrefRoot + "test_LaterRun_unittest.", "Should know its own pref");
|
||||
Assert.equal(page.minimumHoursSinceInstall, 10, "Needs to have 10 hours since install");
|
||||
Assert.equal(page.minimumSessionCount, 3, "Needs to have 3 sessions");
|
||||
Assert.equal(page.requireBoth, false, "Either requirement is enough");
|
||||
Assert.equal(page.url, "https://www.mozilla.org/", "URL is stored correctly");
|
||||
|
||||
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 3}),
|
||||
"Applies when session count has been met.");
|
||||
Assert.ok(page.applies({hoursSinceInstall: 1, sessionCount: 4}),
|
||||
"Applies when session count has been exceeded.");
|
||||
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 2}),
|
||||
"Applies when total session time has been met.");
|
||||
Assert.ok(page.applies({hoursSinceInstall: 20, sessionCount: 2}),
|
||||
"Applies when total session time has been exceeded.");
|
||||
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
|
||||
"Applies when both time and session count have been met.");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
|
||||
"Does not apply when neither time and session count have been met.");
|
||||
|
||||
page.requireBoth = true;
|
||||
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
|
||||
"Does not apply when only session count has been met.");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
|
||||
"Does not apply when only session count has been exceeded.");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
|
||||
"Does not apply when only total session time has been met.");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
|
||||
"Does not apply when only total session time has been exceeded.");
|
||||
Assert.ok(page.applies({hoursSinceInstall: 10, sessionCount: 3}),
|
||||
"Applies when both time and session count have been met.");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
|
||||
"Does not apply when neither time and session count have been met.");
|
||||
|
||||
// Check that pages that have run never apply:
|
||||
Services.prefs.setBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun", true);
|
||||
page.requireBoth = false;
|
||||
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 3}),
|
||||
"Does not apply when page has already run (sessionCount equal).");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 4}),
|
||||
"Does not apply when page has already run (sessionCount exceeding).");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 2}),
|
||||
"Does not apply when page has already run (hoursSinceInstall equal).");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 20, sessionCount: 2}),
|
||||
"Does not apply when page has already run (hoursSinceInstall exceeding).");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 10, sessionCount: 3}),
|
||||
"Does not apply when page has already run (both criteria equal).");
|
||||
Assert.ok(!page.applies({hoursSinceInstall: 1, sessionCount: 1}),
|
||||
"Does not apply when page has already run (both criteria insufficient anyway).");
|
||||
|
||||
clearAllPagePrefs();
|
||||
});
|
||||
|
||||
add_task(function* test_get_URL() {
|
||||
Services.prefs.setIntPref(kProfileCreationTime, Math.floor((Date.now() - 11 * 60 * 60 * 1000) / 1000));
|
||||
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "https://www.mozilla.org/");
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
|
||||
let pages = LaterRun.readPages();
|
||||
// We have to filter the pages because it's possible Firefox ships with other URLs
|
||||
// that get included in this test.
|
||||
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
|
||||
Assert.equal(pages.length, 1, "Should only be 1 matching page");
|
||||
let page = pages[0];
|
||||
let url;
|
||||
do {
|
||||
url = LaterRun.getURL();
|
||||
// We have to loop because it's possible Firefox ships with other URLs that get triggered by
|
||||
// this test.
|
||||
} while (url && url != "https://www.mozilla.org/");
|
||||
Assert.equal(url, "https://www.mozilla.org/", "URL should be as expected when prefs are set.");
|
||||
Assert.ok(Services.prefs.prefHasUserValue(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref");
|
||||
Assert.ok(Services.prefs.getBoolPref(kPagePrefRoot + "test_LaterRun_unittest.hasRun"), "Should have set pref to true");
|
||||
Assert.ok(page.hasRun, "Other page objects should know it has run, too.");
|
||||
|
||||
clearAllPagePrefs();
|
||||
});
|
||||
|
||||
add_task(function* test_insecure_urls() {
|
||||
Services.prefs.setCharPref(kPagePrefRoot + "test_LaterRun_unittest.url", "http://www.mozilla.org/");
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumHoursSinceInstall", 10);
|
||||
Services.prefs.setIntPref(kPagePrefRoot + "test_LaterRun_unittest.minimumSessionCount", 3);
|
||||
let pages = LaterRun.readPages();
|
||||
// We have to filter the pages because it's possible Firefox ships with other URLs
|
||||
// that get triggered in this test.
|
||||
pages = pages.filter(page => page.pref == kPagePrefRoot + "test_LaterRun_unittest.");
|
||||
Assert.equal(pages.length, 0, "URL with non-https scheme should get ignored");
|
||||
clearAllPagePrefs();
|
||||
});
|
||||
|
||||
add_task(function* test_dynamic_pref_getter_setter() {
|
||||
delete LaterRun._sessionCount;
|
||||
Services.prefs.setIntPref(kSessionCountPref, 0);
|
||||
Assert.equal(LaterRun.sessionCount, 0, "Should start at 0");
|
||||
|
||||
LaterRun.sessionCount++;
|
||||
Assert.equal(LaterRun.sessionCount, 1, "Should increment.");
|
||||
Assert.equal(Services.prefs.getIntPref(kSessionCountPref), 1, "Should update pref");
|
||||
});
|
||||
|
||||
function clearAllPagePrefs() {
|
||||
let allChangedPrefs = Services.prefs.getChildList(kPagePrefRoot);
|
||||
for (let pref of allChangedPrefs) {
|
||||
Services.prefs.clearUserPref(pref);
|
||||
}
|
||||
}
|
||||
|
@ -7,3 +7,4 @@ skip-if = toolkit == 'android' || toolkit == 'gonk'
|
||||
[test_DirectoryLinksProvider.js]
|
||||
[test_SitePermissions.js]
|
||||
[test_TabGroupsMigrator.js]
|
||||
[test_LaterRun.js]
|
||||
|
@ -676,10 +676,11 @@ toolbarpaletteitem[place="palette"] > toolbaritem > toolbarbutton {
|
||||
color: GrayText;
|
||||
}
|
||||
|
||||
/* The boxes with "instructions" get extra padding for space around the
|
||||
illustration and buttons */
|
||||
/* The boxes with "instructions" get extra top and bottom padding for space
|
||||
around the illustration and buttons */
|
||||
.PanelUI-remotetabs-instruction-box {
|
||||
padding: 30px 15px 15px 15px;
|
||||
padding-bottom: 30px;
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
.PanelUI-remotetabs-prefs-button {
|
||||
|
@ -80,8 +80,8 @@ let Screenshot = {
|
||||
let exe = Services.dirsvc.get("GreBinD", Ci.nsIFile);
|
||||
exe.append("screenshot.exe");
|
||||
if (!exe.exists()) {
|
||||
exe = this._extensionPath.QueryInterface(Ci.nsIFileURL).file;
|
||||
exe.append("lib");
|
||||
exe = Services.dirsvc.get("CurWorkD", Ci.nsIFile).parent;
|
||||
exe.append("bin");
|
||||
exe.append("screenshot.exe");
|
||||
}
|
||||
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
|
||||
@ -143,10 +143,15 @@ let Screenshot = {
|
||||
|
||||
_screenshotLinux(filename) {
|
||||
return new Promise((resolve, reject) => {
|
||||
let file = Services.dirsvc.get("GreBinD", Ci.nsIFile);
|
||||
file.append("screentopng");
|
||||
let exe = Services.dirsvc.get("GreBinD", Ci.nsIFile);
|
||||
exe.append("screentopng");
|
||||
if (!exe.exists()) {
|
||||
exe = Services.dirsvc.get("CurWorkD", Ci.nsIFile).parent;
|
||||
exe.append("bin");
|
||||
exe.append("screentopng");
|
||||
}
|
||||
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
|
||||
process.init(file);
|
||||
process.init(exe);
|
||||
|
||||
let args = [filename];
|
||||
process.runAsync(args, args.length, this._processObserver(resolve, reject));
|
||||
|
@ -75,7 +75,8 @@ this.TestRunner = {
|
||||
this._lastCombo = null;
|
||||
|
||||
// Setup some prefs
|
||||
Services.prefs.setCharPref("browser.aboutHomeSnippets.updateUrl", "data:");
|
||||
Services.prefs.setCharPref("browser.aboutHomeSnippets.updateUrl",
|
||||
"data:text/html;charset=utf-8,Generated by mozscreenshots");
|
||||
Services.prefs.setCharPref("extensions.ui.lastCategory", "addons://list/extension");
|
||||
// Don't let the caret blink since it causes false positives for image diffs
|
||||
Services.prefs.setIntPref("ui.caretBlinkTime", -1);
|
||||
|
@ -26,6 +26,8 @@
|
||||
"mozilla/mark-test-function-used": 1,
|
||||
"mozilla/no-aArgs": 1,
|
||||
"mozilla/no-cpows-in-tests": 1,
|
||||
// See bug 1224289.
|
||||
"mozilla/reject-importGlobalProperties": 1,
|
||||
"mozilla/var-only-at-top-level": 1,
|
||||
|
||||
// Disallow using variables outside the blocks they are defined (especially
|
||||
|
@ -50,7 +50,5 @@ function* testColorPickerAppearsOnColorSwatchClick(view, swatch) {
|
||||
ok(!inplaceEditor(swatch.parentNode),
|
||||
"The inplace editor wasn't shown as a result of the color swatch click");
|
||||
|
||||
let onModifications = view.once("ruleview-changed");
|
||||
cPicker.hide();
|
||||
yield onModifications;
|
||||
yield hideTooltipAndWaitForRuleviewChanged(cPicker, view);
|
||||
}
|
||||
|
@ -72,7 +72,5 @@ function* testPickingNewColor(view) {
|
||||
"rgb(0, 0, 0) 100%)",
|
||||
"The gradient has been updated correctly");
|
||||
|
||||
let onModified = view.once("ruleview-changed");
|
||||
cPicker.hide();
|
||||
yield onModified;
|
||||
yield hideTooltipAndWaitForRuleviewChanged(cPicker, view);
|
||||
}
|
||||
|
@ -90,11 +90,7 @@ function* testComplexMultipleColorChanges(inspector, ruleView) {
|
||||
}
|
||||
|
||||
info("Closing the color picker");
|
||||
let onHidden = picker.tooltip.once("hidden");
|
||||
let onModified = ruleView.once("ruleview-changed");
|
||||
picker.tooltip.hide();
|
||||
yield onHidden;
|
||||
yield onModified;
|
||||
yield hideTooltipAndWaitForRuleviewChanged(picker.tooltip, ruleView);
|
||||
}
|
||||
|
||||
function* testOverriddenMultipleColorChanges(inspector, ruleView) {
|
||||
|
@ -66,5 +66,5 @@ function* testAppears(view, swatch) {
|
||||
ok(true, "The cubic-bezier tooltip was shown on click of the cibuc swatch");
|
||||
ok(!inplaceEditor(swatch.parentNode),
|
||||
"The inplace editor wasn't shown as a result of the cibuc swatch click");
|
||||
bezier.hide();
|
||||
yield hideTooltipAndWaitForRuleviewChanged(bezier, view);
|
||||
}
|
||||
|
@ -49,9 +49,11 @@ function* testPressingEnterCommitsChanges(swatch, ruleView) {
|
||||
"The text of the timing-function was updated");
|
||||
|
||||
info("Sending RETURN key within the tooltip document");
|
||||
let onHidden = bezierTooltip.tooltip.once("hidden");
|
||||
// Pressing RETURN ends up doing 2 rule-view updates, one for the preview and
|
||||
// one for the commit when the tooltip closes.
|
||||
let onRuleViewChanged = waitForNEvents(ruleView, "ruleview-changed", 2);
|
||||
EventUtils.sendKey("RETURN", widget.parent.ownerDocument.defaultView);
|
||||
yield onHidden;
|
||||
yield onRuleViewChanged;
|
||||
|
||||
is(content.getComputedStyle(content.document.body).transitionTimingFunction,
|
||||
expected, "The element's timing-function was kept after RETURN");
|
||||
|
@ -17,12 +17,11 @@ add_task(function*() {
|
||||
.querySelector(".ruleview-filterswatch");
|
||||
|
||||
let filterTooltip = view.tooltips.filterEditor;
|
||||
let onShow = filterTooltip.tooltip.once("shown");
|
||||
// Clicking on a cssfilter swatch sets the current filter value in the tooltip
|
||||
// which, in turn, makes the FilterWidget emit an "updated" event that causes
|
||||
// the rule-view to refresh. So we must wait for the ruleview-changed event.
|
||||
let onRuleViewChanged = view.once("ruleview-changed");
|
||||
swatch.click();
|
||||
yield onShow;
|
||||
// Clicking on swatch runs a preview of the current value
|
||||
// and updates the rule-view
|
||||
yield onRuleViewChanged;
|
||||
|
||||
ok(true, "The shown event was emitted after clicking on swatch");
|
||||
@ -30,5 +29,5 @@ add_task(function*() {
|
||||
"The inplace editor wasn't shown as a result of the filter swatch click");
|
||||
|
||||
yield filterTooltip.widget;
|
||||
filterTooltip.hide();
|
||||
yield hideTooltipAndWaitForRuleviewChanged(filterTooltip, view);
|
||||
});
|
||||
|
@ -16,19 +16,26 @@ add_task(function*() {
|
||||
.querySelector(".ruleview-filterswatch");
|
||||
|
||||
let filterTooltip = view.tooltips.filterEditor;
|
||||
let onShow = filterTooltip.tooltip.once("shown");
|
||||
// Clicking on a cssfilter swatch sets the current filter value in the tooltip
|
||||
// which, in turn, makes the FilterWidget emit an "updated" event that causes
|
||||
// the rule-view to refresh. So we must wait for the ruleview-changed event.
|
||||
let onRuleViewChanged = view.once("ruleview-changed");
|
||||
swatch.click();
|
||||
yield onShow;
|
||||
yield onRuleViewChanged;
|
||||
|
||||
let widget = yield filterTooltip.widget;
|
||||
|
||||
onRuleViewChanged = view.once("ruleview-changed");
|
||||
widget.setCssValue("blur(2px)");
|
||||
yield waitForComputedStyleProperty("body", null, "filter", "blur(2px)");
|
||||
yield onRuleViewChanged;
|
||||
|
||||
ok(true, "Changes previewed on the element");
|
||||
|
||||
onRuleViewChanged = view.once("ruleview-changed");
|
||||
info("Pressing RETURN to commit changes");
|
||||
EventUtils.sendKey("RETURN", widget.styleWindow);
|
||||
yield onRuleViewChanged;
|
||||
|
||||
const computed = content.getComputedStyle(content.document.body);
|
||||
is(computed.filter, "blur(2px)",
|
||||
|
@ -280,6 +280,21 @@ function assertHoverTooltipOn(tooltip, element) {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* When a tooltip is closed, this ends up "commiting" the value changed within
|
||||
* the tooltip (e.g. the color in case of a colorpicker) which, in turn, ends up
|
||||
* setting the value of the corresponding css property in the rule-view.
|
||||
* Use this function to close the tooltip and make sure the test waits for the
|
||||
* ruleview-changed event.
|
||||
* @param {Tooltip} tooltip
|
||||
* @param {CSSRuleView} view
|
||||
*/
|
||||
function* hideTooltipAndWaitForRuleviewChanged(tooltip, view) {
|
||||
let onModified = view.once("ruleview-changed");
|
||||
tooltip.hide();
|
||||
yield onModified;
|
||||
}
|
||||
|
||||
/**
|
||||
* Listen for a new tab to open and return a promise that resolves when one
|
||||
* does and completes the load event.
|
||||
|
15
devtools/client/locales/en-US/components.properties
Normal file
@ -0,0 +1,15 @@
|
||||
# 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/.
|
||||
|
||||
# LOCALIZATION NOTE These strings are used in the shared React components,
|
||||
# so files in `devtools/client/shared/components/*`.
|
||||
|
||||
# LOCALIZATION NOTE (frame.unknownSource): When we do not know the source filename of
|
||||
# a frame, we use this string instead.
|
||||
frame.unknownSource=(unknown)
|
||||
|
||||
# LOCALIZATION NOTE (viewsourceindebugger): The label for the tooltip when hovering over
|
||||
# a source link that links to the debugger.
|
||||
# %S represents the URL to match in the debugger.
|
||||
frame.viewsourceindebugger=View source in Debugger → %S
|
@ -100,11 +100,6 @@ diff-snapshots.tooltip=Compare snapshots
|
||||
# memory tool's filter search box.
|
||||
filter.placeholder=Filter
|
||||
|
||||
# LOCALIZATION NOTE (viewsourceindebugger): The label for the tooltip when hovering over
|
||||
# a link in the heap tree to jump to the debugger view.
|
||||
# %S represents the URL to match in the debugger.
|
||||
viewsourceindebugger=View source in Debugger → %S
|
||||
|
||||
# LOCALIZATION NOTE (tree-item.load-more): The label for the links to fetch the
|
||||
# lazily loaded sub trees in the dominator tree view.
|
||||
tree-item.load-more=Load more…
|
||||
@ -275,8 +270,3 @@ heapview.field.totalcount=Total Count
|
||||
|
||||
# LOCALIZATION NOTE (heapview.field.name): The name of the column in the heap view for name.
|
||||
heapview.field.name=Name
|
||||
|
||||
# LOCALIZATION NOTE (unknownSource): When we do not know the source filename of
|
||||
# a frame in the allocation stack breakdown tree view, we use this string
|
||||
# instead.
|
||||
unknownSource=(unknown)
|
||||
|
@ -109,7 +109,7 @@ const MemoryApp = createClass({
|
||||
inverted,
|
||||
onToggleInverted: () =>
|
||||
dispatch(toggleInvertedAndRefresh(heapWorker)),
|
||||
filter,
|
||||
filterString: filter,
|
||||
setFilterString: filterString =>
|
||||
dispatch(setFilterStringAndRefresh(filterString, heapWorker)),
|
||||
diffing,
|
||||
|
@ -6,7 +6,6 @@ const { isSavedFrame } = require("devtools/shared/DevToolsUtils");
|
||||
const { DOM: dom, createClass, createFactory } = require("devtools/client/shared/vendor/react");
|
||||
const { L10N, formatNumber, formatPercent } = require("../utils");
|
||||
const Frame = createFactory(require("devtools/client/shared/components/frame"));
|
||||
const unknownSourceString = L10N.getStr("unknownSource");
|
||||
const { TREE_ROW_HEIGHT } = require("../constants");
|
||||
|
||||
const CensusTreeItem = module.exports = createClass({
|
||||
@ -68,13 +67,11 @@ const CensusTreeItem = module.exports = createClass({
|
||||
|
||||
toLabel(name, linkToDebugger) {
|
||||
if (isSavedFrame(name)) {
|
||||
let onClickTooltipString =
|
||||
L10N.getFormatStr("viewsourceindebugger",`${name.source}:${name.line}:${name.column}`);
|
||||
return Frame({
|
||||
frame: name,
|
||||
onClick: () => linkToDebugger(name),
|
||||
onClickTooltipString,
|
||||
unknownSourceString
|
||||
showFunctionName: true,
|
||||
showHost: true,
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -70,7 +70,8 @@ const DominatorTreeItem = module.exports = createClass({
|
||||
label[i * 2] = Frame({
|
||||
key,
|
||||
onClick: () => onViewSourceInDebugger(piece),
|
||||
frame: piece
|
||||
frame: piece,
|
||||
showFunctionName: true
|
||||
});
|
||||
} else if (piece === "noStack") {
|
||||
label[i * 2] = dom.span({ key, className: "not-available" },
|
||||
|
@ -258,7 +258,7 @@ const Heap = module.exports = createClass({
|
||||
&& census.report.children.length === 1
|
||||
&& census.report.children[0].name === "noStack") {
|
||||
contents.push(dom.div({ className: "error no-allocation-stacks" },
|
||||
L10N.getStr("heapview.noAllocationStacks")));
|
||||
L10N.getStr("heapview.noAllocationStacks")));
|
||||
}
|
||||
|
||||
contents.push(CensusHeader());
|
||||
|
@ -39,10 +39,7 @@ this.test = makeMemoryTest(TEST_URL, function* ({ tab, panel }) {
|
||||
|
||||
// Wait for the dominator tree to be computed and fetched.
|
||||
|
||||
yield waitUntilState(store, state =>
|
||||
state.snapshots[0] &&
|
||||
state.snapshots[0].dominatorTree &&
|
||||
state.snapshots[0].dominatorTree.state === dominatorTreeState.LOADED);
|
||||
yield waitUntilDominatorTreeState(store, [dominatorTreeState.LOADED]);
|
||||
ok(true, "Computed and fetched the dominator tree.");
|
||||
|
||||
// Expand all the dominator tree nodes that are eagerly fetched, except for
|
||||
|
@ -5,9 +5,12 @@
|
||||
|
||||
"use strict";
|
||||
|
||||
const { snapshotState } = require("devtools/client/memory/constants");
|
||||
const { takeSnapshotAndCensus } = require("devtools/client/memory/actions/snapshot");
|
||||
const { toggleInverted } = require("devtools/client/memory/actions/inverted");
|
||||
const {
|
||||
dominatorTreeState,
|
||||
snapshotState,
|
||||
viewState,
|
||||
} = require("devtools/client/memory/constants");
|
||||
const { changeViewAndRefresh } = require("devtools/client/memory/actions/view");
|
||||
|
||||
const TEST_URL = "http://example.com/browser/devtools/client/memory/test/browser/doc_steady_allocation.html";
|
||||
|
||||
@ -27,7 +30,7 @@ this.test = makeMemoryTest(TEST_URL, function* ({ tab, panel }) {
|
||||
EventUtils.synthesizeMouseAtCenter(takeSnapshotButton, {}, panel.panelWin);
|
||||
yield waitUntilSnapshotState(store, [snapshotState.SAVED_CENSUS]);
|
||||
|
||||
const filterInput = doc.getElementById("filter");
|
||||
let filterInput = doc.getElementById("filter");
|
||||
EventUtils.synthesizeMouseAtCenter(filterInput, {}, panel.panelWin);
|
||||
EventUtils.sendString("js::Shape", panel.panelWin);
|
||||
|
||||
@ -36,7 +39,32 @@ this.test = makeMemoryTest(TEST_URL, function* ({ tab, panel }) {
|
||||
|
||||
yield waitUntilSnapshotState(store, [snapshotState.SAVED_CENSUS]);
|
||||
|
||||
const nameElem = doc.querySelector(".heap-tree-item-field.heap-tree-item-name");
|
||||
let nameElem = doc.querySelector(".heap-tree-item-field.heap-tree-item-name");
|
||||
ok(nameElem, "Should get a tree item row with a name");
|
||||
is(nameElem.textContent.trim(), "js::Shape", "and the tree item should be the one we filtered for");
|
||||
is(nameElem.textContent.trim(), "js::Shape", "the tree item should be the one we filtered for");
|
||||
is(filterInput.value, "js::Shape",
|
||||
"and filter input contains the user value");
|
||||
|
||||
// Now switch the dominator view, then switch back to census view
|
||||
// and check that the filter word is still correctly applied
|
||||
dispatch(changeViewAndRefresh(viewState.DOMINATOR_TREE, heapWorker));
|
||||
ok(true, "change view to dominator tree");
|
||||
|
||||
// Wait for the dominator tree to be computed and fetched.
|
||||
yield waitUntilDominatorTreeState(store, [dominatorTreeState.LOADED]);
|
||||
ok(true, "computed and fetched the dominator tree.");
|
||||
|
||||
dispatch(changeViewAndRefresh(viewState.CENSUS, heapWorker));
|
||||
ok(true, "change view back to census");
|
||||
|
||||
yield waitUntilSnapshotState(store, [snapshotState.SAVED_CENSUS]);
|
||||
|
||||
nameElem = doc.querySelector(".heap-tree-item-field.heap-tree-item-name");
|
||||
filterInput = doc.getElementById("filter");
|
||||
|
||||
ok(nameElem, "Should still get a tree item row with a name");
|
||||
is(nameElem.textContent.trim(), "js::Shape",
|
||||
"the tree item should still be the one we filtered for");
|
||||
is(filterInput.value, "js::Shape",
|
||||
"and filter input still contains the user value");
|
||||
});
|
||||
|
@ -96,6 +96,30 @@ function waitUntilSnapshotState (store, expected) {
|
||||
return waitUntilState(store, predicate);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a promise that will resolve when the provided store matches
|
||||
* the expected array. expectedStates is an array of dominatorTree states.
|
||||
* Expectations :
|
||||
* - store.getState().snapshots.length == expected.length
|
||||
* - snapshots[i].dominatorTree.state == expected[i]
|
||||
*
|
||||
* @param {Store} store
|
||||
* @param {Array<string>} expectedStates [description]
|
||||
* @return {Promise}
|
||||
*/
|
||||
function waitUntilDominatorTreeState(store, expected) {
|
||||
let predicate = () => {
|
||||
let snapshots = store.getState().snapshots;
|
||||
return snapshots.length === expected.length &&
|
||||
expected.every((state, i) => {
|
||||
return snapshots[i].dominatorTree &&
|
||||
snapshots[i].dominatorTree.state === state;
|
||||
});
|
||||
};
|
||||
info(`Waiting for dominator trees to be of state: ${expected}`);
|
||||
return waitUntilState(store, predicate);
|
||||
}
|
||||
|
||||
function takeSnapshot (window) {
|
||||
let { gStore, document } = window;
|
||||
let snapshotCount = gStore.getState().snapshots.length;
|
||||
|
@ -8,5 +8,6 @@ support-files =
|
||||
[test_Heap_01.html]
|
||||
[test_Heap_02.html]
|
||||
[test_Heap_03.html]
|
||||
[test_Heap_04.html]
|
||||
[test_Toolbar_01.html]
|
||||
[test_Toolbar_02.html]
|
||||
|
@ -17,6 +17,7 @@ var { immutableUpdate } = DevToolsUtils;
|
||||
|
||||
var constants = require("devtools/client/memory/constants");
|
||||
var {
|
||||
breakdowns,
|
||||
diffingState,
|
||||
dominatorTreeBreakdowns,
|
||||
dominatorTreeState,
|
||||
|
101
devtools/client/memory/test/chrome/test_Heap_04.html
Normal file
@ -0,0 +1,101 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
Test that we show the "hey you're not recording allocation stacks" message at the appropriate times.
|
||||
-->
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Tree component test</title>
|
||||
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="container"></div>
|
||||
<pre id="test">
|
||||
<script src="head.js" type="application/javascript;version=1.8"></script>
|
||||
<script type="application/javascript;version=1.8">
|
||||
window.onload = Task.async(function* () {
|
||||
try {
|
||||
const container = document.getElementById("container");
|
||||
|
||||
yield renderComponent(Heap(immutableUpdate(TEST_HEAP_PROPS, {
|
||||
snapshot: immutableUpdate(TEST_HEAP_PROPS.snapshot, {
|
||||
census: immutableUpdate(TEST_HEAP_PROPS.snapshot.census, {
|
||||
report: {
|
||||
bytes: 1,
|
||||
totalBytes: 1,
|
||||
count: 1,
|
||||
totalCount: 1,
|
||||
id: 1,
|
||||
parent: undefined,
|
||||
children: [
|
||||
{
|
||||
name: "noStack",
|
||||
bytes: 1,
|
||||
totalBytes: 1,
|
||||
count: 1,
|
||||
totalCount: 1,
|
||||
children: undefined,
|
||||
id: 3,
|
||||
parent: 1,
|
||||
}
|
||||
]
|
||||
},
|
||||
breakdown: breakdowns.allocationStack.breakdown,
|
||||
}),
|
||||
}),
|
||||
})), container);
|
||||
|
||||
ok(container.querySelector(".no-allocation-stacks"),
|
||||
"When there are no allocation stacks, we should show the message");
|
||||
|
||||
yield renderComponent(Heap(immutableUpdate(TEST_HEAP_PROPS, {
|
||||
snapshot: immutableUpdate(TEST_HEAP_PROPS.snapshot, {
|
||||
census: immutableUpdate(TEST_HEAP_PROPS.snapshot.census, {
|
||||
report: {
|
||||
bytes: 1,
|
||||
totalBytes: 1,
|
||||
count: 1,
|
||||
totalCount: 1,
|
||||
id: 1,
|
||||
parent: undefined,
|
||||
children: [
|
||||
{
|
||||
name: Cu.getJSTestingFunctions().saveStack(),
|
||||
bytes: 1,
|
||||
totalBytes: 1,
|
||||
count: 1,
|
||||
totalCount: 1,
|
||||
children: undefined,
|
||||
id: 2,
|
||||
parent: 1,
|
||||
},
|
||||
{
|
||||
name: "noStack",
|
||||
bytes: 1,
|
||||
totalBytes: 1,
|
||||
count: 1,
|
||||
totalCount: 1,
|
||||
children: undefined,
|
||||
id: 3,
|
||||
parent: 1,
|
||||
}
|
||||
]
|
||||
},
|
||||
breakdown: breakdowns.allocationStack.breakdown,
|
||||
}),
|
||||
}),
|
||||
})), container);
|
||||
|
||||
ok(!container.querySelector(".no-allocation-stacks"),
|
||||
"When there are allocation stacks, we should not show the message");
|
||||
} catch(e) {
|
||||
ok(false, "Got an error: " + DevToolsUtils.safeErrorString(e));
|
||||
} finally {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -2,34 +2,58 @@
|
||||
* 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/. */
|
||||
|
||||
const { Cu } = require("chrome");
|
||||
Cu.import("resource://devtools/client/shared/widgets/ViewHelpers.jsm");
|
||||
const STRINGS_URI = "chrome://devtools/locale/components.properties";
|
||||
const L10N = new ViewHelpers.L10N(STRINGS_URI);
|
||||
const { DOM: dom, createClass, PropTypes } = require("devtools/client/shared/vendor/react");
|
||||
const { getSourceNames } = require("devtools/client/shared/source-utils");
|
||||
const UNKNOWN_SOURCE_STRING = L10N.getStr("frame.unknownSource");
|
||||
|
||||
const Frame = module.exports = createClass({
|
||||
displayName: "Frame",
|
||||
|
||||
getDefaultProps() {
|
||||
return {
|
||||
showFunctionName: false,
|
||||
showHost: false,
|
||||
};
|
||||
},
|
||||
|
||||
propTypes: {
|
||||
// SavedFrame
|
||||
frame: PropTypes.object.isRequired,
|
||||
// SavedFrame, or an object containing all the required properties.
|
||||
frame: PropTypes.shape({
|
||||
functionDisplayName: PropTypes.string,
|
||||
source: PropTypes.string.isRequired,
|
||||
line: PropTypes.number.isRequired,
|
||||
column: PropTypes.number.isRequired,
|
||||
}).isRequired,
|
||||
// Clicking on the frame link -- probably should link to the debugger.
|
||||
onClick: PropTypes.func.isRequired,
|
||||
// Tooltip to display when hovering over the link to the frame;
|
||||
// Something like "View source in debugger -> http://foo.com/file.js:100:2".
|
||||
onClickTooltipString: PropTypes.string.isRequired,
|
||||
// Source to display when cannot determine a good display name.
|
||||
// Something like "(unknown)".
|
||||
unknownSourceString: PropTypes.string.isRequired,
|
||||
// Option to display a function name before the source link.
|
||||
showFunctionName: PropTypes.bool,
|
||||
// Option to display a host name after the source link.
|
||||
showHost: PropTypes.bool,
|
||||
},
|
||||
|
||||
render() {
|
||||
let { onClick, frame, onClickTooltipString, unknownSourceString } = this.props;
|
||||
const { short, long, host } = getSourceNames(frame.source, unknownSourceString);
|
||||
let { onClick, frame, showFunctionName, showHost } = this.props;
|
||||
|
||||
let func = frame.functionDisplayName || "";
|
||||
let tooltip = `${func} (${long}:${frame.line}:${frame.column})`;
|
||||
const { short, long, host } = getSourceNames(frame.source, UNKNOWN_SOURCE_STRING);
|
||||
|
||||
let tooltip = `${long}:${frame.line}`;
|
||||
if (frame.column) {
|
||||
tooltip += `:${frame.column}`;
|
||||
}
|
||||
|
||||
let sourceString = `${frame.source}:${frame.line}`;
|
||||
if (frame.column) {
|
||||
sourceString += `:${frame.column}`;
|
||||
}
|
||||
|
||||
let onClickTooltipString = L10N.getFormatStr("frame.viewsourceindebugger", sourceString);
|
||||
|
||||
let fields = [
|
||||
dom.span({ className: "frame-link-function-display-name" }, func),
|
||||
dom.a({
|
||||
className: "frame-link-filename",
|
||||
onClick,
|
||||
@ -37,11 +61,18 @@ const Frame = module.exports = createClass({
|
||||
}, short),
|
||||
dom.span({ className: "frame-link-colon" }, ":"),
|
||||
dom.span({ className: "frame-link-line" }, frame.line),
|
||||
dom.span({ className: "frame-link-colon" }, ":"),
|
||||
dom.span({ className: "frame-link-column" }, frame.column)
|
||||
];
|
||||
|
||||
if (host) {
|
||||
if (frame.column != null) {
|
||||
fields.push(dom.span({ className: "frame-link-colon" }, ":"));
|
||||
fields.push(dom.span({ className: "frame-link-column" }, frame.column));
|
||||
}
|
||||
|
||||
if (showFunctionName && frame.functionDisplayName) {
|
||||
fields.unshift(dom.span({ className: "frame-link-function-display-name" }, frame.functionDisplayName));
|
||||
}
|
||||
|
||||
if (showHost && host) {
|
||||
fields.push(dom.span({ className: "frame-link-host" }, host));
|
||||
}
|
||||
|
||||
|
@ -64,9 +64,10 @@ const TreeNode = createFactory(createClass({
|
||||
onCollapse: this.props.onCollapse
|
||||
});
|
||||
|
||||
let isOddRow = this.props.index % 2;
|
||||
return dom.div(
|
||||
{
|
||||
className: "tree-node div",
|
||||
className: `tree-node div ${isOddRow ? "tree-node-odd" : ""}`,
|
||||
onFocus: this.props.onFocus,
|
||||
onClick: this.props.onFocus,
|
||||
onBlur: this.props.onBlur,
|
||||
@ -251,6 +252,7 @@ const Tree = module.exports = createClass({
|
||||
let { item, depth } = toRender[i];
|
||||
nodes.push(TreeNode({
|
||||
key: this.props.getKey(item),
|
||||
index: begin + i,
|
||||
item: item,
|
||||
depth: depth,
|
||||
renderItem: this.props.renderItem,
|
||||
|
@ -41,7 +41,8 @@ addMessageListener("devtools:test:console", function ({ data }) {
|
||||
* { method: the request method (default: "GET"),
|
||||
* url: the url to request (default: content.location.href),
|
||||
* body: the request body to send (default: ""),
|
||||
* nocache: append an unique token to the query string (default: true)
|
||||
* nocache: append an unique token to the query string (default: true),
|
||||
* requestHeaders: set request headers (default: none)
|
||||
* }
|
||||
*
|
||||
* @return Promise A promise that's resolved with object
|
||||
@ -67,9 +68,16 @@ function promiseXHR(data) {
|
||||
});
|
||||
|
||||
xhr.open(method, url);
|
||||
|
||||
// Set request headers
|
||||
if (data.requestHeaders) {
|
||||
data.requestHeaders.forEach(header => {
|
||||
xhr.setRequestHeader(header.name, header.value);
|
||||
});
|
||||
}
|
||||
|
||||
xhr.send(body);
|
||||
return deferred.promise;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -83,7 +91,11 @@ function promiseXHR(data) {
|
||||
* method: "GET",
|
||||
* url: content.location.href,
|
||||
* body: "",
|
||||
* nocache: true, // Adds a cache busting random token to the URL
|
||||
* nocache: true, // Adds a cache busting random token to the URL,
|
||||
* requestHeaders: [{
|
||||
* name: "Content-Type",
|
||||
* value: "application/json"
|
||||
* }]
|
||||
* }
|
||||
*
|
||||
* The handler will respond with devtools:test:xhr message after all requests
|
||||
|
@ -725,7 +725,7 @@ CSSFilterEditorWidget.prototype = {
|
||||
}
|
||||
}
|
||||
|
||||
this.add(name, value, quote);
|
||||
this.add(name, value, quote, true);
|
||||
}
|
||||
|
||||
this.emit("updated", this.getCssValue());
|
||||
@ -745,8 +745,12 @@ CSSFilterEditorWidget.prototype = {
|
||||
* single quote, a double quote, or empty.
|
||||
* @return {Number}
|
||||
* The index of the new filter in the current list of filters
|
||||
* @param {Boolean}
|
||||
* By default, adding a new filter emits an "updated" event, but if
|
||||
* you're calling add in a loop and wait to emit a single event after
|
||||
* the loop yourself, set this parameter to true.
|
||||
*/
|
||||
add: function(name, value, quote) {
|
||||
add: function(name, value, quote, noEvent) {
|
||||
const def = this._definition(name);
|
||||
if (!def) {
|
||||
return false;
|
||||
@ -794,7 +798,9 @@ CSSFilterEditorWidget.prototype = {
|
||||
}
|
||||
|
||||
const index = this.filters.push({value, unit, name, quote}) - 1;
|
||||
this.emit("updated", this.getCssValue());
|
||||
if (!noEvent) {
|
||||
this.emit("updated", this.getCssValue());
|
||||
}
|
||||
|
||||
return index;
|
||||
},
|
||||
|
@ -332,7 +332,7 @@ html, body, #app, #memory-tool {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.tree-node:nth-child(2n) {
|
||||
.tree-node-odd {
|
||||
background-color: var(--row-alt-background-color);
|
||||
}
|
||||
|
||||
|
@ -207,7 +207,6 @@ skip-if = buildapp == 'mulet'
|
||||
tags = mcb
|
||||
skip-if = buildapp == 'mulet'
|
||||
[browser_webconsole_assert.js]
|
||||
[browser_webconsole_basic_net_logging.js]
|
||||
[browser_webconsole_block_mixedcontent_securityerrors.js]
|
||||
tags = mcb
|
||||
skip-if = buildapp == 'mulet'
|
||||
@ -339,6 +338,8 @@ skip-if = e10s # Bug 1042253 - webconsole e10s tests (Linux debug timeout)
|
||||
[browser_webconsole_live_filtering_on_search_strings.js]
|
||||
[browser_webconsole_message_node_id.js]
|
||||
[browser_webconsole_netlogging.js]
|
||||
[browser_webconsole_netlogging_basic.js]
|
||||
[browser_webconsole_netlogging_panel.js]
|
||||
[browser_webconsole_netlogging_reset_filter.js]
|
||||
[browser_webconsole_notifications.js]
|
||||
[browser_webconsole_open-links-without-callback.js]
|
||||
|
@ -7,44 +7,29 @@
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = "data:text/html;charset=utf-8,Web Console network " +
|
||||
"logging tests";
|
||||
|
||||
const TEST_NETWORK_REQUEST_URI =
|
||||
"http://example.com/browser/devtools/client/webconsole/test/" +
|
||||
"test-network-request.html";
|
||||
|
||||
var hud;
|
||||
add_task(function* () {
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
const hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI,
|
||||
"browserConsole");
|
||||
let request = yield finishedRequest;
|
||||
|
||||
function test() {
|
||||
loadTab(TEST_URI).then((tab) => {
|
||||
HUDService.openBrowserConsoleOrFocus().then(aHud => {
|
||||
hud = aHud;
|
||||
HUDService.lastFinishedRequest.callback = testResponse;
|
||||
BrowserTestUtils.loadURI(gBrowser.selectedBrowser,
|
||||
TEST_NETWORK_REQUEST_URI);
|
||||
});
|
||||
});
|
||||
}
|
||||
ok(request, "Page load was logged");
|
||||
|
||||
function testResponse(request) {
|
||||
hud.ui.webConsoleClient.getResponseContent(request.actor,
|
||||
function(contentPacket) {
|
||||
hud.ui.webConsoleClient.getRequestPostData(request.actor,
|
||||
function(postDataPacket) {
|
||||
// Check if page load was logged correctly.
|
||||
ok(request, "Page load was logged");
|
||||
let client = hud.ui.webConsoleClient;
|
||||
let args = [request.actor];
|
||||
const postData = yield getPacket(client, "getRequestPostData", args);
|
||||
const responseContent = yield getPacket(client, "getResponseContent", args);
|
||||
|
||||
is(request.request.url, TEST_NETWORK_REQUEST_URI,
|
||||
"Logged network entry is page load");
|
||||
is(request.request.method, "GET", "Method is correct");
|
||||
ok(!postDataPacket.postData.text, "No request body was stored");
|
||||
ok(postDataPacket.postDataDiscarded, "Request body was discarded");
|
||||
ok(!contentPacket.content.text, "No response body was stored");
|
||||
ok(contentPacket.contentDiscarded || request.fromCache,
|
||||
"Response body was discarded or response came from the cache");
|
||||
|
||||
executeSoon(finishTest);
|
||||
});
|
||||
});
|
||||
}
|
||||
is(request.request.url, TEST_NETWORK_REQUEST_URI,
|
||||
"Logged network entry is page load");
|
||||
is(request.request.method, "GET", "Method is correct");
|
||||
ok(!postData.postData.text, "No request body was stored");
|
||||
ok(postData.postDataDiscarded, "Request body was discarded");
|
||||
ok(!responseContent.content.text, "No response body was stored");
|
||||
ok(responseContent.contentDiscarded || request.fromCache,
|
||||
"Response body was discarded or response came from the cache");
|
||||
});
|
||||
|
@ -2,9 +2,6 @@
|
||||
/*
|
||||
* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*
|
||||
* Contributor(s):
|
||||
* Mihai Șucan <mihai.sucan@gmail.com>
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
@ -12,54 +9,45 @@
|
||||
const TEST_URI = "data:text/html;charset=utf-8,Web Console test for " +
|
||||
"bug 614793: jsterm result scroll";
|
||||
|
||||
"use strict";
|
||||
|
||||
add_task(function* () {
|
||||
yield loadTab(TEST_URI);
|
||||
|
||||
let hud = yield openConsole();
|
||||
|
||||
yield consoleOpened(hud);
|
||||
yield testScrollPosition(hud);
|
||||
});
|
||||
|
||||
function consoleOpened(hud) {
|
||||
let deferred = promise.defer();
|
||||
|
||||
function* testScrollPosition(hud) {
|
||||
hud.jsterm.clearOutput();
|
||||
|
||||
let scrollNode = hud.ui.outputWrapper;
|
||||
|
||||
for (let i = 0; i < 150; i++) {
|
||||
content.console.log("test message " + i);
|
||||
yield ContentTask.spawn(gBrowser.selectedBrowser, i, function*(i) {
|
||||
content.console.log("test message " + i);
|
||||
});
|
||||
}
|
||||
|
||||
let oldScrollTop = -1;
|
||||
|
||||
waitForMessages({
|
||||
yield waitForMessages({
|
||||
webconsole: hud,
|
||||
messages: [{
|
||||
text: "test message 149",
|
||||
category: CATEGORY_WEBDEV,
|
||||
severity: SEVERITY_LOG,
|
||||
}],
|
||||
}).then(() => {
|
||||
oldScrollTop = scrollNode.scrollTop;
|
||||
isnot(oldScrollTop, 0, "scroll location is not at the top");
|
||||
|
||||
hud.jsterm.execute("'hello world'").then(onExecute);
|
||||
});
|
||||
|
||||
function onExecute(msg) {
|
||||
isnot(scrollNode.scrollTop, oldScrollTop, "scroll location updated");
|
||||
oldScrollTop = scrollNode.scrollTop;
|
||||
isnot(oldScrollTop, 0, "scroll location is not at the top");
|
||||
|
||||
oldScrollTop = scrollNode.scrollTop;
|
||||
let msg = yield hud.jsterm.execute("'hello world'");
|
||||
|
||||
msg.scrollIntoView(false);
|
||||
isnot(scrollNode.scrollTop, oldScrollTop, "scroll location updated");
|
||||
|
||||
is(scrollNode.scrollTop, oldScrollTop, "scroll location is the same");
|
||||
oldScrollTop = scrollNode.scrollTop;
|
||||
|
||||
deferred.resolve();
|
||||
}
|
||||
msg.scrollIntoView(false);
|
||||
|
||||
return deferred.promise;
|
||||
is(scrollNode.scrollTop, oldScrollTop, "scroll location is the same");
|
||||
}
|
||||
|
@ -1,171 +1,109 @@
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* ***** BEGIN LICENSE BLOCK *****
|
||||
* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*
|
||||
* Contributor(s):
|
||||
* Julian Viereck <jviereck@mozilla.com>
|
||||
* Patrick Walton <pcwalton@mozilla.com>
|
||||
* Mihai Șucan <mihai.sucan@gmail.com>
|
||||
*
|
||||
* ***** END LICENSE BLOCK ***** */
|
||||
/* 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/. */
|
||||
|
||||
// Tests that network log messages bring up the network panel.
|
||||
// Tests response logging for different request types.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_URI = "data:text/html;charset=utf-8,Web Console network " +
|
||||
"logging tests";
|
||||
|
||||
const TEST_NETWORK_REQUEST_URI =
|
||||
"http://example.com/browser/devtools/client/webconsole/test/" +
|
||||
"test-network-request.html";
|
||||
|
||||
const TEST_IMG = "http://example.com/browser/devtools/client/webconsole/" +
|
||||
"test/test-image.png";
|
||||
|
||||
const TEST_DATA_JSON_CONTENT =
|
||||
'{ id: "test JSON data", myArray: [ "foo", "bar", "baz", "biff" ] }';
|
||||
|
||||
var lastRequest = null;
|
||||
var requestCallback = null;
|
||||
var browser, hud;
|
||||
add_task(function* testPageLoad() {
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
let hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI);
|
||||
let request = yield finishedRequest;
|
||||
|
||||
function test() {
|
||||
loadTab(TEST_URI).then((tab) => {
|
||||
browser = tab.browser;
|
||||
ok(request, "Page load was logged");
|
||||
|
||||
openConsole().then((aHud) => {
|
||||
hud = aHud;
|
||||
let client = hud.ui.webConsoleClient;
|
||||
let args = [request.actor];
|
||||
const postData = yield getPacket(client, "getRequestPostData", args);
|
||||
const responseContent = yield getPacket(client, "getResponseContent", args);
|
||||
|
||||
HUDService.lastFinishedRequest.callback = requestCallbackWrapper;
|
||||
is(request.request.url, TEST_NETWORK_REQUEST_URI,
|
||||
"Logged network entry is page load");
|
||||
is(request.request.method, "GET", "Method is correct");
|
||||
ok(!postData.postData.text, "No request body was stored");
|
||||
ok(!postData.postDataDiscarded,
|
||||
"Request body was not discarded");
|
||||
is(responseContent.content.text.indexOf("<!DOCTYPE HTML>"), 0,
|
||||
"Response body's beginning is okay");
|
||||
});
|
||||
|
||||
executeSoon(testPageLoad);
|
||||
});
|
||||
});
|
||||
}
|
||||
add_task(function* testXhrGet() {
|
||||
let hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI);
|
||||
|
||||
function requestCallbackWrapper(request) {
|
||||
lastRequest = request;
|
||||
|
||||
hud.ui.webConsoleClient.getResponseContent(lastRequest.actor,
|
||||
function(aResponse) {
|
||||
lastRequest.response.content = aResponse.content;
|
||||
lastRequest.discardResponseBody = aResponse.contentDiscarded;
|
||||
|
||||
hud.ui.webConsoleClient.getRequestPostData(lastRequest.actor,
|
||||
function(response) {
|
||||
lastRequest.request.postData = response.postData;
|
||||
lastRequest.discardRequestBody = response.postDataDiscarded;
|
||||
|
||||
if (requestCallback) {
|
||||
requestCallback();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function testPageLoad() {
|
||||
requestCallback = function() {
|
||||
// Check if page load was logged correctly.
|
||||
ok(lastRequest, "Page load was logged");
|
||||
|
||||
is(lastRequest.request.url, TEST_NETWORK_REQUEST_URI,
|
||||
"Logged network entry is page load");
|
||||
is(lastRequest.request.method, "GET", "Method is correct");
|
||||
ok(!lastRequest.request.postData.text, "No request body was stored");
|
||||
ok(!lastRequest.discardRequestBody, "Request body was not discarded");
|
||||
is(lastRequest.response.content.text.indexOf("<!DOCTYPE HTML>"), 0,
|
||||
"Response body's beginning is okay");
|
||||
|
||||
lastRequest = null;
|
||||
requestCallback = null;
|
||||
executeSoon(testXhrGet);
|
||||
};
|
||||
|
||||
content.location = TEST_NETWORK_REQUEST_URI;
|
||||
}
|
||||
|
||||
function testXhrGet() {
|
||||
requestCallback = function() {
|
||||
ok(lastRequest, "testXhrGet() was logged");
|
||||
is(lastRequest.request.method, "GET", "Method is correct");
|
||||
ok(!lastRequest.request.postData.text, "No request body was sent");
|
||||
ok(!lastRequest.discardRequestBody, "Request body was not discarded");
|
||||
is(lastRequest.response.content.text, TEST_DATA_JSON_CONTENT,
|
||||
"Response is correct");
|
||||
|
||||
lastRequest = null;
|
||||
requestCallback = null;
|
||||
executeSoon(testXhrPost);
|
||||
};
|
||||
|
||||
// Start the XMLHttpRequest() GET test.
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
content.wrappedJSObject.testXhrGet();
|
||||
}
|
||||
let request = yield finishedRequest;
|
||||
|
||||
function testXhrPost() {
|
||||
requestCallback = function() {
|
||||
ok(lastRequest, "testXhrPost() was logged");
|
||||
is(lastRequest.request.method, "POST", "Method is correct");
|
||||
is(lastRequest.request.postData.text, "Hello world!",
|
||||
"Request body was logged");
|
||||
is(lastRequest.response.content.text, TEST_DATA_JSON_CONTENT,
|
||||
"Response is correct");
|
||||
ok(request, "testXhrGet() was logged");
|
||||
|
||||
lastRequest = null;
|
||||
requestCallback = null;
|
||||
executeSoon(testFormSubmission);
|
||||
};
|
||||
let client = hud.ui.webConsoleClient;
|
||||
let args = [request.actor];
|
||||
const postData = yield getPacket(client, "getRequestPostData", args);
|
||||
const responseContent = yield getPacket(client, "getResponseContent", args);
|
||||
|
||||
// Start the XMLHttpRequest() POST test.
|
||||
is(request.request.method, "GET", "Method is correct");
|
||||
ok(!postData.postData.text, "No request body was sent");
|
||||
ok(!postData.postDataDiscarded,
|
||||
"Request body was not discarded");
|
||||
is(responseContent.content.text, TEST_DATA_JSON_CONTENT,
|
||||
"Response is correct");
|
||||
});
|
||||
|
||||
add_task(function* testXhrPost() {
|
||||
let hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI);
|
||||
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
content.wrappedJSObject.testXhrPost();
|
||||
}
|
||||
let request = yield finishedRequest;
|
||||
|
||||
function testFormSubmission() {
|
||||
// Start the form submission test. As the form is submitted, the page is
|
||||
// loaded again. Bind to the load event to catch when this is done.
|
||||
requestCallback = function() {
|
||||
ok(lastRequest, "testFormSubmission() was logged");
|
||||
is(lastRequest.request.method, "POST", "Method is correct");
|
||||
isnot(lastRequest.request.postData.text
|
||||
.indexOf("Content-Type: application/x-www-form-urlencoded"), -1,
|
||||
"Content-Type is correct");
|
||||
isnot(lastRequest.request.postData.text
|
||||
.indexOf("Content-Length: 20"), -1, "Content-length is correct");
|
||||
isnot(lastRequest.request.postData.text
|
||||
.indexOf("name=foo+bar&age=144"), -1, "Form data is correct");
|
||||
is(lastRequest.response.content.text.indexOf("<!DOCTYPE HTML>"), 0,
|
||||
"Response body's beginning is okay");
|
||||
ok(request, "testXhrPost() was logged");
|
||||
|
||||
executeSoon(testNetworkPanel);
|
||||
};
|
||||
let client = hud.ui.webConsoleClient;
|
||||
let args = [request.actor];
|
||||
const postData = yield getPacket(client, "getRequestPostData", args);
|
||||
const responseContent = yield getPacket(client, "getResponseContent", args);
|
||||
|
||||
is(request.request.method, "POST", "Method is correct");
|
||||
is(postData.postData.text, "Hello world!", "Request body was logged");
|
||||
is(responseContent.content.text, TEST_DATA_JSON_CONTENT,
|
||||
"Response is correct");
|
||||
});
|
||||
|
||||
add_task(function* testFormSubmission() {
|
||||
let hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI);
|
||||
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
ContentTask.spawn(gBrowser.selectedBrowser, { }, `function()
|
||||
{
|
||||
let form = content.document.querySelector("form");
|
||||
form.submit();
|
||||
}`);
|
||||
}
|
||||
let request = yield finishedRequest;
|
||||
|
||||
function testNetworkPanel() {
|
||||
// Open the NetworkPanel. The functionality of the NetworkPanel is tested
|
||||
// within separate test files.
|
||||
hud.ui.openNetworkPanel(lastRequest.actor).then(() => {
|
||||
let toolbox = gDevTools.getToolbox(hud.target);
|
||||
is(toolbox.currentToolId, "netmonitor", "Network panel was opened");
|
||||
let panel = toolbox.getCurrentPanel();
|
||||
let selected = panel.panelWin.NetMonitorView.RequestsMenu.selectedItem;
|
||||
is(selected.attachment.method, lastRequest.request.method,
|
||||
"The correct request is selected");
|
||||
is(selected.attachment.url, lastRequest.request.url,
|
||||
"The correct request is definitely selected");
|
||||
ok(request, "testFormSubmission() was logged");
|
||||
|
||||
// All tests are done. Shutdown.
|
||||
lastRequest = null;
|
||||
HUDService.lastFinishedRequest.callback = null;
|
||||
browser = requestCallback = hud = null;
|
||||
executeSoon(finishTest);
|
||||
}).then(null, error => {
|
||||
ok(false, "Got an error: " + error.message + "\n" + error.stack);
|
||||
});
|
||||
}
|
||||
let client = hud.ui.webConsoleClient;
|
||||
let args = [request.actor];
|
||||
const postData = yield getPacket(client, "getRequestPostData", args);
|
||||
const responseContent = yield getPacket(client, "getResponseContent", args);
|
||||
|
||||
is(request.request.method, "POST", "Method is correct");
|
||||
isnot(postData.postData.text
|
||||
.indexOf("Content-Type: application/x-www-form-urlencoded"), -1,
|
||||
"Content-Type is correct");
|
||||
isnot(postData.postData.text
|
||||
.indexOf("Content-Length: 20"), -1, "Content-length is correct");
|
||||
isnot(postData.postData.text
|
||||
.indexOf("name=foo+bar&age=144"), -1, "Form data is correct");
|
||||
is(responseContent.content.text.indexOf("<!DOCTYPE HTML>"), 0,
|
||||
"Response body's beginning is okay");
|
||||
});
|
||||
|
@ -17,7 +17,7 @@ add_task(function* () {
|
||||
"logging test");
|
||||
let hud = yield openConsole();
|
||||
|
||||
content.location = TEST_NETWORK_URI;
|
||||
yield BrowserTestUtils.loadURI(gBrowser.selectedBrowser, TEST_NETWORK_URI);
|
||||
|
||||
yield waitForMessages({
|
||||
webconsole: hud,
|
@ -0,0 +1,28 @@
|
||||
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
// Tests that network log messages bring up the network panel.
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_NETWORK_REQUEST_URI =
|
||||
"http://example.com/browser/devtools/client/webconsole/test/" +
|
||||
"test-network-request.html";
|
||||
|
||||
add_task(function* () {
|
||||
let finishedRequest = waitForFinishedRequest();
|
||||
const hud = yield loadPageAndGetHud(TEST_NETWORK_REQUEST_URI);
|
||||
let request = yield finishedRequest;
|
||||
|
||||
yield hud.ui.openNetworkPanel(request.actor);
|
||||
let toolbox = gDevTools.getToolbox(hud.target);
|
||||
is(toolbox.currentToolId, "netmonitor", "Network panel was opened");
|
||||
let panel = toolbox.getCurrentPanel();
|
||||
let selected = panel.panelWin.NetMonitorView.RequestsMenu.selectedItem;
|
||||
is(selected.attachment.method, request.request.method,
|
||||
"The correct request is selected");
|
||||
is(selected.attachment.url, request.request.url,
|
||||
"The correct request is definitely selected");
|
||||
});
|
@ -82,6 +82,45 @@ function closeTab(tab) {
|
||||
return deferred.promise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load the page and return the associated HUD.
|
||||
*
|
||||
* @param string uri
|
||||
* The URI of the page to load.
|
||||
* @param string consoleType [optional]
|
||||
* The console type, either "browserConsole" or "webConsole". Defaults to
|
||||
* "webConsole".
|
||||
* @return object
|
||||
* The HUD associated with the console
|
||||
*/
|
||||
function* loadPageAndGetHud(uri, consoleType) {
|
||||
let { browser } = yield loadTab("data:text/html;charset=utf-8,Loading tab for tests");
|
||||
|
||||
let hud;
|
||||
if (consoleType === "browserConsole") {
|
||||
hud = yield HUDService.openBrowserConsoleOrFocus();
|
||||
} else {
|
||||
hud = yield openConsole();
|
||||
}
|
||||
|
||||
ok(hud, "Console was opened");
|
||||
|
||||
let loaded = loadBrowser(browser);
|
||||
yield BrowserTestUtils.loadURI(gBrowser.selectedBrowser, uri);
|
||||
yield loaded;
|
||||
|
||||
yield waitForMessages({
|
||||
webconsole: hud,
|
||||
messages: [{
|
||||
text: uri,
|
||||
category: CATEGORY_NETWORK,
|
||||
severity: SEVERITY_LOG,
|
||||
}],
|
||||
});
|
||||
|
||||
return hud;
|
||||
}
|
||||
|
||||
function afterAllTabsLoaded(callback, win) {
|
||||
win = win || window;
|
||||
|
||||
@ -1588,6 +1627,23 @@ function checkOutputForInputs(hud, inputTests) {
|
||||
return Task.spawn(runner);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Finish the request and resolve with the request object.
|
||||
*
|
||||
* @return promise
|
||||
* @resolves The request object.
|
||||
*/
|
||||
function waitForFinishedRequest() {
|
||||
registerCleanupFunction(function() {
|
||||
HUDService.lastFinishedRequest.callback = null;
|
||||
});
|
||||
|
||||
return new Promise(resolve => {
|
||||
HUDService.lastFinishedRequest.callback = request => { resolve(request) };
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait for eventName on target.
|
||||
* @param {Object} target An observable object that either supports on/off or
|
||||
@ -1653,6 +1709,21 @@ function getSourceActor(sources, URL) {
|
||||
return item && item.value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a request against an actor and resolve with the packet.
|
||||
* @param object client
|
||||
* The client to use when making the request.
|
||||
* @param function requestType
|
||||
* The client request function to run.
|
||||
* @param array args
|
||||
* The arguments to pass into the function.
|
||||
*/
|
||||
function getPacket(client, requestType, args) {
|
||||
return new Promise(resolve => {
|
||||
client[requestType](...args, packet => resolve(packet));
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify that clicking on a link from a popup notification message tries to
|
||||
* open the expected URL.
|
||||
|
170
devtools/server/actors/breakpoint.js
Normal file
@ -0,0 +1,170 @@
|
||||
/* -*- indent-tabs-mode: nil; js-indent-level: 2; js-indent-level: 2 -*- */
|
||||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
const { ActorClass, method } = require("devtools/server/protocol");
|
||||
|
||||
/**
|
||||
* BreakpointActors exist for the lifetime of their containing thread and are
|
||||
* responsible for deleting breakpoints, handling breakpoint hits and
|
||||
* associating breakpoints with scripts.
|
||||
*/
|
||||
let BreakpointActor = ActorClass({
|
||||
typeName: "breakpoint",
|
||||
|
||||
/**
|
||||
* Create a Breakpoint actor.
|
||||
*
|
||||
* @param ThreadActor threadActor
|
||||
* The parent thread actor that contains this breakpoint.
|
||||
* @param OriginalLocation originalLocation
|
||||
* The original location of the breakpoint.
|
||||
*/
|
||||
initialize: function(threadActor, originalLocation) {
|
||||
// The set of Debugger.Script instances that this breakpoint has been set
|
||||
// upon.
|
||||
this.scripts = new Set();
|
||||
|
||||
this.threadActor = threadActor;
|
||||
this.originalLocation = originalLocation;
|
||||
this.condition = null;
|
||||
this.isPending = true;
|
||||
},
|
||||
|
||||
disconnect: function() {
|
||||
this.removeScripts();
|
||||
},
|
||||
|
||||
hasScript: function(script) {
|
||||
return this.scripts.has(script);
|
||||
},
|
||||
|
||||
/**
|
||||
* Called when this same breakpoint is added to another Debugger.Script
|
||||
* instance.
|
||||
*
|
||||
* @param script Debugger.Script
|
||||
* The new source script on which the breakpoint has been set.
|
||||
*/
|
||||
addScript: function(script) {
|
||||
this.scripts.add(script);
|
||||
this.isPending = false;
|
||||
},
|
||||
|
||||
/**
|
||||
* Remove the breakpoints from associated scripts and clear the script cache.
|
||||
*/
|
||||
removeScripts: function() {
|
||||
for (let script of this.scripts) {
|
||||
script.clearBreakpoint(this);
|
||||
}
|
||||
this.scripts.clear();
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if this breakpoint has a condition that doesn't error and
|
||||
* evaluates to true in frame.
|
||||
*
|
||||
* @param frame Debugger.Frame
|
||||
* The frame to evaluate the condition in
|
||||
* @returns Object
|
||||
* - result: boolean|undefined
|
||||
* True when the conditional breakpoint should trigger a pause,
|
||||
* false otherwise. If the condition evaluation failed/killed,
|
||||
* `result` will be `undefined`.
|
||||
* - message: string
|
||||
* If the condition throws, this is the thrown message.
|
||||
*/
|
||||
checkCondition: function(frame) {
|
||||
let completion = frame.eval(this.condition);
|
||||
if (completion) {
|
||||
if (completion.throw) {
|
||||
// The evaluation failed and threw
|
||||
let message = "Unknown exception";
|
||||
try {
|
||||
if (completion.throw.getOwnPropertyDescriptor) {
|
||||
message = completion.throw.getOwnPropertyDescriptor("message")
|
||||
.value;
|
||||
} else if (completion.toString) {
|
||||
message = completion.toString();
|
||||
}
|
||||
} catch (ex) {}
|
||||
return {
|
||||
result: true,
|
||||
message: message
|
||||
};
|
||||
} else if (completion.yield) {
|
||||
assert(false, "Shouldn't ever get yield completions from an eval");
|
||||
} else {
|
||||
return { result: completion.return ? true : false };
|
||||
}
|
||||
} else {
|
||||
// The evaluation was killed (possibly by the slow script dialog)
|
||||
return { result: undefined };
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* A function that the engine calls when a breakpoint has been hit.
|
||||
*
|
||||
* @param frame Debugger.Frame
|
||||
* The stack frame that contained the breakpoint.
|
||||
*/
|
||||
hit: function (frame) {
|
||||
// Don't pause if we are currently stepping (in or over) or the frame is
|
||||
// black-boxed.
|
||||
let generatedLocation = this.threadActor.sources.getFrameLocation(frame);
|
||||
let { originalSourceActor } = this.threadActor.unsafeSynchronize(
|
||||
this.threadActor.sources.getOriginalLocation(generatedLocation));
|
||||
let url = originalSourceActor.url;
|
||||
|
||||
if (this.threadActor.sources.isBlackBoxed(url)
|
||||
|| frame.onStep) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
let reason = {};
|
||||
|
||||
if (this.threadActor._hiddenBreakpoints.has(this.actorID)) {
|
||||
reason.type = "pauseOnDOMEvents";
|
||||
} else if (!this.condition) {
|
||||
reason.type = "breakpoint";
|
||||
// TODO: add the rest of the breakpoints on that line (bug 676602).
|
||||
reason.actors = [ this.actorID ];
|
||||
} else {
|
||||
let { result, message } = this.checkCondition(frame)
|
||||
|
||||
if (result) {
|
||||
if (!message) {
|
||||
reason.type = "breakpoint";
|
||||
} else {
|
||||
reason.type = "breakpointConditionThrown";
|
||||
reason.message = message;
|
||||
}
|
||||
reason.actors = [ this.actorID ];
|
||||
} else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
return this.threadActor._pauseAndRespond(frame, reason);
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle a protocol request to remove this breakpoint.
|
||||
*/
|
||||
delete: method(function() {
|
||||
// Remove from the breakpoint store.
|
||||
if (this.originalLocation) {
|
||||
this.threadActor.breakpointActorMap.deleteActor(this.originalLocation);
|
||||
}
|
||||
this.threadActor.threadLifetimePool.removeActor(this);
|
||||
// Remove the actual breakpoint from the associated scripts.
|
||||
this.removeScripts();
|
||||
})
|
||||
});
|
||||
|
||||
exports.BreakpointActor = BreakpointActor;
|
@ -284,6 +284,23 @@ var CallWatcherActor = exports.CallWatcherActor = protocol.ActorClass({
|
||||
this.finalize();
|
||||
},
|
||||
|
||||
events: {
|
||||
/**
|
||||
* Events emitted when the `onCall` function isn't provided.
|
||||
*/
|
||||
"call": {
|
||||
type: "call",
|
||||
function: Arg(0, "function-call")
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Lightweight listener invoked whenever an instrumented function is called
|
||||
* while recording. We're doing this to avoid the event emitter overhead,
|
||||
* since this is expected to be a very hot function.
|
||||
*/
|
||||
onCall: null,
|
||||
|
||||
/**
|
||||
* Starts waiting for the current tab actor's document global to be
|
||||
* created, in order to instrument the specified objects and become
|
||||
@ -385,13 +402,6 @@ var CallWatcherActor = exports.CallWatcherActor = protocol.ActorClass({
|
||||
this._functionCalls = [];
|
||||
}),
|
||||
|
||||
/**
|
||||
* Lightweight listener invoked whenever an instrumented function is called
|
||||
* while recording. We're doing this to avoid the event emitter overhead,
|
||||
* since this is expected to be a very hot function.
|
||||
*/
|
||||
onCall: null,
|
||||
|
||||
/**
|
||||
* Invoked whenever the current tab actor's document global is created.
|
||||
*/
|
||||
|
@ -13,6 +13,7 @@ DevToolsModules(
|
||||
'actor-registry.js',
|
||||
'addon.js',
|
||||
'animation.js',
|
||||
'breakpoint.js',
|
||||
'call-watcher.js',
|
||||
'canvas.js',
|
||||
'child-process.js',
|
||||
|