Merge m-c to m-i

This commit is contained in:
Phil Ringnalda 2016-01-23 18:18:48 -08:00
commit d7618989ba
179 changed files with 3073 additions and 1597 deletions

View File

@ -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/**

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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 -->

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"/>

View File

@ -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"
}

View File

@ -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"/>

View File

@ -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 -->

View File

@ -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"/>

View File

@ -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>

View File

@ -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);

View File

@ -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>

View File

@ -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;

View File

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

View File

@ -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);
},

View File

@ -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');

View File

@ -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>

View File

@ -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) {

View File

@ -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;

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 975 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -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;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -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);
}
}

View File

@ -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,

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 825 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1001 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -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);
}
}

View 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();

View File

@ -29,6 +29,7 @@ EXTRA_JS_MODULES += [
'FormSubmitObserver.jsm',
'FormValidationHandler.jsm',
'HiddenFrame.jsm',
'LaterRun.jsm',
'NetworkPrioritizer.jsm',
'offlineAppCache.jsm',
'PanelFrame.jsm',

View 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);
}
}

View File

@ -7,3 +7,4 @@ skip-if = toolkit == 'android' || toolkit == 'gonk'
[test_DirectoryLinksProvider.js]
[test_SitePermissions.js]
[test_TabGroupsMigrator.js]
[test_LaterRun.js]

View File

@ -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 {

View File

@ -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));

View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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) {

View File

@ -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);
}

View File

@ -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");

View File

@ -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);
});

View File

@ -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)",

View File

@ -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.

View 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

View File

@ -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)

View File

@ -109,7 +109,7 @@ const MemoryApp = createClass({
inverted,
onToggleInverted: () =>
dispatch(toggleInvertedAndRefresh(heapWorker)),
filter,
filterString: filter,
setFilterString: filterString =>
dispatch(setFilterStringAndRefresh(filterString, heapWorker)),
diffing,

View File

@ -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,
});
}

View File

@ -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" },

View File

@ -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());

View File

@ -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

View File

@ -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");
});

View File

@ -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;

View File

@ -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]

View File

@ -17,6 +17,7 @@ var { immutableUpdate } = DevToolsUtils;
var constants = require("devtools/client/memory/constants");
var {
breakdowns,
diffingState,
dominatorTreeBreakdowns,
dominatorTreeState,

View 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>

View File

@ -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));
}

View File

@ -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,

View File

@ -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

View File

@ -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;
},

View File

@ -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);
}

View File

@ -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]

View File

@ -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");
});

View File

@ -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");
}

View File

@ -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");
});

View File

@ -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,

View File

@ -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");
});

View File

@ -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.

View 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;

View File

@ -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.
*/

View File

@ -13,6 +13,7 @@ DevToolsModules(
'actor-registry.js',
'addon.js',
'animation.js',
'breakpoint.js',
'call-watcher.js',
'canvas.js',
'child-process.js',

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