merge rev b6dbcbdec116 to SEAMONKEY_2_49_ESR_RELBRANCH. a=frg
SEAMONKEY_2_49_ESR_RELBRANCH
merge rev b6dbcbdec116 to SEAMONKEY_2_49_ESR_RELBRANCH. a=frg
--- a/mail/app/blocklist.xml
+++ b/mail/app/blocklist.xml
@@ -1,10 +1,10 @@
<?xml version='1.0' encoding='UTF-8'?>
-<blocklist lastupdate="1520527480321" xmlns="http://www.mozilla.org/2006/addons-blocklist">
+<blocklist lastupdate="1525377135149" xmlns="http://www.mozilla.org/2006/addons-blocklist">
<emItems>
<emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
</emItem>
<emItem blockID="i1211" id="flvto@hotger.com">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="1"/>
@@ -2071,16 +2071,48 @@
<emItem blockID="f58729ec-f93c-41d9-870d-dd9c9fd811b6" id="/^(addon@fasterweb\.com|\{5f398d3f-25db-47f5-b422-aa2364ff6c0b\}|addon@fasterp\.com|addon@calculator)$/">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
</emItem>
<emItem blockID="3d55fab0-ec1a-4bca-84c9-3b74f5d01509" id="/^.*extension.*@asdf\.pl$/">
<prefs/>
<versionRange minVersion="0" maxVersion="*" severity="3"/>
</emItem>
+ <emItem blockID="547037f2-97ae-435a-863c-efd7532668cd" id="{44685ba6-68b3-4895-879e-4efa29dfb578}">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="baf7f735-d6b6-410a-8cc8-25c60f7c57e2" id="adbeaver@adbeaver.org">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="1"/>
+ </emItem>
+ <emItem blockID="36f97298-8bef-4372-a548-eb829413bee9" id="/(__TEMPLATE__APPLICATION__@ruta-mapa\.com)|(application-3@findizer\.fr)|(application2@allo-pages\.fr)|(application2@bilan-imc\.fr)|(application2@lettres\.net)|(application2@search-maps-finder\.com)|(application-imcpeso@imc-peso\.com)|(application-meuimc@meu-imc\.com)|(application-us2@factorlove)|(application-us@misterdirections)|(application-us@yummmi\.es)|(application@amiouze\.fr)|(application@astrolignes\.com)|(application@blotyn\.com)|(application@bmi-result\.com)|(application@bmi-tw\.com)|(application@calcolo-bmi\.com)|(application@cartes-itineraires\.com)|(application@convertisseur\.pro)|(application@de-findizer\.fr)|(application@de-super-rezepte\.com)|(application@dermabeauty\.fr)|(application@dev\.squel\.v2)|(application@eu-my-drivingdirections\.com)|(application@fr-allo-pages\.fr)|(application@fr-catizz\.com)|(application@fr-mr-traduction\.com)|(application@good-recettes\.com)|(application@horaires\.voyage)|(application@imc-calcular\.com)|(application@imc-peso\.com)|(application@it-mio-percorso\.com)|(application@iti-maps\.fr)|(application@itineraire\.info)|(application@lbc-search\.com)|(application@les-pages\.com)|(application@lovincalculator\.com)|(application@lovintest\.com)|(application@masowe\.com)|(application@matchs\.direct)|(application@mein-bmi\.com)|(application@mes-resultats\.com)|(application@mestaf\.com)|(application@meu-imc\.com)|(application@mon-calcul-imc\.fr)|(application@mon-juste-poids\.com)|(application@mon-trajet\.com)|(application@my-drivingdirections\.com)|(application@people-show\.com)|(application@plans-reduc\.fr)|(application@point-meteo\.fr)|(application@poulixo\.com)|(application@quipage\.fr)|(application@quizdeamor\.com)|(application@quizdoamor\.com)|(application@quotient-retraite\.fr)|(application@recettes\.net)|(application@routenplaner-karten\.com)|(application@ruta-mapa\.com)|(application@satellite\.dev\.squel\.v2)|(application@search-bilan-imc\.fr)|(application@search-maps-finder\.com)|(application@slimness\.fr)|(application@start-bmi\.com)|(application@tests-moi\.com)|(application@tousmesjeux\.fr)|(application@toutlannuaire\.fr)|(application@tuto-diy\.com)|(application@ubersetzung-app\.com)|(application@uk-cookyummy\.com)|(application@uk-howlogin\.me)|(application@uk-myloap\.com)|(application@voyagevoyage\.co)|(application@wikimot\.fr)|(application@www\.plans-reduc\.fr)|(application@yummmi\.es)|(application@yummmies\.be)|(application@yummmies\.ch)|(application@yummmies\.fr)|(application@yummmies\.lu)|(application@zikplay\.fr)|(applicationY@search-maps-finder\.com)|(cmesapps@findizer\.fr)|(findizer-shopping@jetpack)|(\{8aaebb36-1488-4022-b7ec-29b790d12c17\})/">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="1e5f5cb2-346c-422a-9aaa-29d8760949d2" id="{872f20ea-196e-4d11-8835-1cc4c877b1b8}">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="feb2d0d7-1b76-4dba-bf84-42873a92af5f" id="/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="96b137e6-8cb5-44d6-9a34-4a4a76fb5e38" id="/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="3ab9f100-e253-4080-b3e5-652f842ddb7a" id="/((@extcorp\.[a-z]+)|(@brcorporation\.com)|(@brmodcorp\.com)|(@teset\.com)|(@modext\.tech)|(@ext?mod\.net)|(@browcorporation\.org)|(@omegacorporation\.org)|(@browmodule\.com)|(@corpext\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
+ <emItem blockID="3a123214-b4b6-410c-a061-bbaf0d168d31" id="/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\.com )|(corpsearchengine@mail\.ru)|(support@work\.org))$/">
+ <prefs/>
+ <versionRange minVersion="0" maxVersion="*" severity="3"/>
+ </emItem>
</emItems>
<pluginItems>
<pluginItem blockID="p1054">
<match exp="np32dsw_[0-9]+\.dll" name="filename"/>
<infoURL>https://get.adobe.com/shockwave/</infoURL>
<versionRange maxVersion="12.2.0.162" minVersion="0" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1055">
@@ -4343,10 +4375,259 @@
<serialNumber>WDFms0iypljMkohTzBvf4GmTOu0=</serialNumber>
</certItem>
<certItem issuerName="MHExCzAJBgNVBAYTAkRFMRwwGgYDVQQKExNEZXV0c2NoZSBUZWxla29tIEFHMR8wHQYDVQQLExZULVRlbGVTZWMgVHJ1c3QgQ2VudGVyMSMwIQYDVQQDExpEZXV0c2NoZSBUZWxla29tIFJvb3QgQ0EgMg==">
<serialNumber>IsWDgJMv7uY=</serialNumber>
</certItem>
<certItem issuerName="MGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwx0aGF3dGUsIEluYy4xHTAbBgNVBAsTFERvbWFpbiBWYWxpZGF0ZWQgU1NMMSAwHgYDVQQDExd0aGF3dGUgRFYgU1NMIFNIQTI1NiBDQQ==">
<serialNumber>dqN9ZZM/PfFCXStajJdbtQ==</serialNumber>
</certItem>
+ <certItem issuerName="MIGuMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4">
+ <serialNumber>Ag==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGuMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4">
+ <serialNumber>BQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>AKbcLtOIMMwDPSOrzrclZL8=</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>ANjIV8rkvmb5E3Wf3aPV2ys=</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>APy7Z8kyJRVBcM/oki5xZ2M=</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>BlOMLY2hk1OPGflbt/pPXQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>MpG5djdbcIoI5TIkJ7vENA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQ==">
+ <serialNumber>UJ3tpbZLsyrhh60M9CMQaQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>dgkExobSurPQq8GYrxxluA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>A09gcxt2IBLNzwqUBAhkDg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>TpyAwu1JmlIKD9gyf+0d4w==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>ZpLTr9toPH+XRF7OITitfw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>And3HzRA33dI3K772oqBCw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>T3UrJ2tKvT0lyumu37ic6g==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>PxYWUib8jdriX5MSGW7Ozw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>H/Vx9uatDIulnLLrZjXEKg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>ej2u88yEVXEb8BP1K49U6Q==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>BtDaTXIs6tBSClhSLPXdYg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>cepjeevcJiJnbGEvdJE1jg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>Qk03giZwJwxf5QpixTKflQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>dn2My7LvPi25AtUw3aPEmQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>c5EZjjNc7LMOapbOzjEtJA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>dtULH8kD2mThpR/g1YJEtw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>G0UY3ZCa+JfTgAVgvFA8qg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>ajUDfjuO76YmIt3+fyTLXg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>TrUuR7x7VeU7Qvlwt8Sumw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>Hl7MT7aU4GbuanaMzc5eAg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MEgxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdTZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbjEXMBUGA1UEAxMOU2VjdXJlVHJ1c3QgQ0E=">
+ <serialNumber>R4b2Vg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MEgxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdTZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbjEXMBUGA1UEAxMOU2VjdXJlVHJ1c3QgQ0E=">
+ <serialNumber>R4af5Q==</serialNumber>
+ </certItem>
+ <certItem issuerName="MFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjg=">
+ <serialNumber>WV2iHxGL6Vg=</serialNumber>
+ </certItem>
+ <certItem issuerName="MFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjg=">
+ <serialNumber>bYuYcMtVvjo=</serialNumber>
+ </certItem>
+ <certItem issuerName="MFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjg=">
+ <serialNumber>UzAV4JqeuGY=</serialNumber>
+ </certItem>
+ <certItem issuerName="ME4xCzAJBgNVBAYTAk5PMR0wGwYDVQQKDBRCdXlwYXNzIEFTLTk4MzE2MzMyNzEgMB4GA1UEAwwXQnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0E=">
+ <serialNumber>KA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>IL094GkEPSU+HAucglL0Ig==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsMH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsMLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLDCxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAwwGRUMtQUND">
+ <serialNumber>L5tOVjVGKtFP6V84tGEFPg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIIBGDELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMTQwMgYDVQQHEytQYXNzYXRnZSBkZSBsYSBDb25jZXBjaW8gMTEgMDgwMDggQmFyY2Vsb25hMS4wLAYDVQQLEyVTZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvIEVDVi0yMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJDSUMtMiAoYykwMzEfMB0GA1UECxMWVW5pdmVyc2l0YXRzIGkgUmVjZXJjYTEOMAwGA1UEAxMFRUMtVVI=">
+ <serialNumber>JSPC8hAKsUBP6Y3n9JMx8w==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHpMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxLjAsBgNVBAsMJVNlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8gRUNWLTExNjA0BgNVBAsMLVZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlckNJQy0xICAoYykwMzEhMB8GA1UECwwYR2VuZXJhbGl0YXQgZGUgQ2F0YWx1bnlhMRIwEAYDVQQDDAlFQy1HRU5DQVQ=">
+ <serialNumber>On0bAstcoxZP6WERe150Gw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsMH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsMLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLDCxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAwwGRUMtQUND">
+ <serialNumber>IqW4gO46S81PjTpHBA7mUQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsMH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsMLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLDCxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAwwGRUMtQUND">
+ <serialNumber>dfE2CNAy9IxP6VwZ2IU2cA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsMH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsMLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLDCxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAwwGRUMtQUND">
+ <serialNumber>W99Z2UuV5pFP6V8AYIwcVQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UECgwyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsMH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsMLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLDCxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAwwGRUMtQUND">
+ <serialNumber>P0qUU7RhznNP6V9iGYbSbA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>cEBA0P3KPBk/ojwnYepwzg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>BqVfPLKBlSg/4Enn+TGdbA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIIBGDELMAkGA1UEBhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0wODAxMTc2LUkpMTQwMgYDVQQHEytQYXNzYXRnZSBkZSBsYSBDb25jZXBjaW8gMTEgMDgwMDggQmFyY2Vsb25hMS4wLAYDVQQLEyVTZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvIEVDVi0yMTUwMwYDVQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJDSUMtMiAoYykwMzEfMB0GA1UECxMWVW5pdmVyc2l0YXRzIGkgUmVjZXJjYTEOMAwGA1UEAxMFRUMtVVI=">
+ <serialNumber>Y3QACu2RGYVJ6FAnJWZpHA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHpMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxLjAsBgNVBAsTJVNlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8gRUNWLTExNjA0BgNVBAsTLVZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlckNJQy0xICAoYykwMzEhMB8GA1UECxMYR2VuZXJhbGl0YXQgZGUgQ2F0YWx1bnlhMRIwEAYDVQQDEwlFQy1HRU5DQVQ=">
+ <serialNumber>b+8vFPRPzN8+HCEWmIwVNg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>PZfTkwQ5Yio+HE2mvtFzDg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>c+6uFePfrahUGpXs8lhiTw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>VBy0L8eIKnVUGpY97OXrkw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHzMQswCQYDVQQGEwJFUzE7MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYtSSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZlZ2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJhcnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND">
+ <serialNumber>JY5zdgD/mG9A4oB/uzdSwQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHwxCzAJBgNVBAYTAk5MMSIwIAYDVQQKExlLUE4gQ29ycG9yYXRlIE1hcmtldCBCLlYuMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9LUE4gQ29ycG9yYXRlIE1hcmtldCBDbGFzcyAyIENB">
+ <serialNumber>F6sWArGVJv7AwBSxbnnqaw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MGwxCzAJBgNVBAYTAk5MMRkwFwYDVQQKExBLUE4gVGVsZWNvbSBCLlYuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMSEwHwYDVQQDExhLUE4gVGVsZWNvbSBCLlYuIENBIC0gRzI=">
+ <serialNumber>W4sqXNfJgPC3aLKkcOxq9Q==</serialNumber>
+ </certItem>
+ <certItem issuerName="MGwxCzAJBgNVBAYTAk5MMRkwFwYDVQQKExBLUE4gVGVsZWNvbSBCLlYuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMSEwHwYDVQQDExhLUE4gVGVsZWNvbSBCLlYuIENBIC0gRzI=">
+ <serialNumber>I1kCCASG38Q8TKOJaqQtvQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHwxCzAJBgNVBAYTAk5MMS0wKwYDVQQKEyRHZXRyb25pY3MgUGlua1JvY2NhZGUgTmVkZXJsYW5kIEIuVi4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxHTAbBgNVBAMTFEdldHJvbmljcyBDbGFzcyAyIENB">
+ <serialNumber>VhmAg9gQ0IaL5+lKzrKYPQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHwxCzAJBgNVBAYTAk5MMS0wKwYDVQQKEyRHZXRyb25pY3MgUGlua1JvY2NhZGUgTmVkZXJsYW5kIEIuVi4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxHTAbBgNVBAMTFEdldHJvbmljcyBDbGFzcyAyIENB">
+ <serialNumber>MfSUS8xHwG64IFRIU5IHpw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHwxCzAJBgNVBAYTAk5MMSIwIAYDVQQKExlLUE4gQ29ycG9yYXRlIE1hcmtldCBCLlYuMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9LUE4gQ29ycG9yYXRlIE1hcmtldCBDbGFzcyAyIENB">
+ <serialNumber>I+zjm9Bi1ZVKLF0R96thFQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>cIHLIBl0M9N90NNjZwhwSA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>XaqJA1pYkpSOSst7Hmcxew==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yaw==">
+ <serialNumber>HkN+3VDzRBFAw/QQ6XZ2gA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGUMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxRTBDBgNVBAMTPFN5bWFudGVjIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNg==">
+ <serialNumber>VedYmG4aoUcioKT467SDcg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGUMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxRTBDBgNVBAMTPFN5bWFudGVjIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNg==">
+ <serialNumber>U51Qij2xILJB29u2m4ePyw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>bcIU/gztAKdw8elgpRh2vA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGUMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxRTBDBgNVBAMTPFN5bWFudGVjIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNg==">
+ <serialNumber>Bxt4PMyN1f5tIXW8W62DhA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIGUMQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxRTBDBgNVBAMTPFN5bWFudGVjIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNg==">
+ <serialNumber>CpSHXk6RnrLSRVVJhVZEWA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>Baw9WIPUcpFvYe8bilTVVQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>PpIe9Q1JUVu5nN/+4HWAoA==</serialNumber>
+ </certItem>
+ <certItem issuerName="MH4xCzAJBgNVBAYTAk1ZMSQwIgYDVQQKExtNU0MgVHJ1c3RnYXRlLmNvbSBTZG4uIEJoZC4xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMTH01TQyBUcnVzdGdhdGUuY29tIENsYXNzIDIgQ0EtRzM=">
+ <serialNumber>Q0dKwXPiEec83XZPgsQh+g==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHsxCzAJBgNVBAYTAk1ZMR8wHQYDVQQKExZNU0MgVHJ1c3RnYXRlLmNvbSBTZG4uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSowKAYDVQQDEyFNU0MgVHJ1c3RnYXRlLmNvbSBDbGFzcyAyIENBIC0gRzI=">
+ <serialNumber>L3UnLdK9iz8XVM1rbm3tTw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>CAEyq5GePgxvZbmFx5WW6A==</serialNumber>
+ </certItem>
+ <certItem issuerName="MIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMw==">
+ <serialNumber>JFcRHv1L89Vu8gagzuR3Pg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MGcxCzAJBgNVBAYTAktSMRMwEQYDVQQKEwpLRUNBLCBJbmMuMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSIwIAYDVQQDExlDcm9zc0NlcnQgQ2xhc3MgMiBDQSAtIEcz">
+ <serialNumber>fLpClvRi4IMKsokzVKT9Yg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MHwxCzAJBgNVBAYTAk5MMSIwIAYDVQQKExlLUE4gQ29ycG9yYXRlIE1hcmtldCBCLlYuMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMSgwJgYDVQQDEx9LUE4gQ29ycG9yYXRlIE1hcmtldCBDbGFzcyAyIENB">
+ <serialNumber>GARMIB0Iaz3xxucE70O9Qg==</serialNumber>
+ </certItem>
+ <certItem issuerName="MFIxCzAJBgNVBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIy">
+ <serialNumber>CMUHBBak0idMAAAAAAAAAAE=</serialNumber>
+ </certItem>
+ <certItem issuerName="MFIxCzAJBgNVBAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIx">
+ <serialNumber>B6AKfwrKX6H1AAAAAAAAAAE=</serialNumber>
+ </certItem>
+ <certItem issuerName="MGMxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExIjAgBgNVBAMTGVRydXN0ZWQgUm9vdCBDQSBTSEEyNTYgRzI=">
+ <serialNumber>R8MQVHZjYD/8LqGrob8=</serialNumber>
+ </certItem>
+ <certItem issuerName="MEwxIDAeBgNVBAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFI2MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu">
+ <serialNumber>Ro51e1DpnjbH3LKdghY=</serialNumber>
+ </certItem>
+ <certItem issuerName="MGMxCzAJBgNVBAYTAkJFMRUwEwYDVQQLEwxUcnVzdGVkIFJvb3QxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExIjAgBgNVBAMTGVRydXN0ZWQgUm9vdCBDQSBTSEEyNTYgRzI=">
+ <serialNumber>AeUotGv9K4mpvLzWxw==</serialNumber>
+ </certItem>
+ <certItem issuerName="MGAxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xMTAvBgNVBAMMKFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBJbnRlcm1lZGlhaXIgQ0E=">
+ <serialNumber>a5DOAqSUlLm2s6kL0x8gkQ==</serialNumber>
+ </certItem>
+ <certItem issuerName="MFwxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xLTArBgNVBAMMJFN0YWF0IGRlciBOZWRlcmxhbmRlbiBCdXJnZXIgQ0EgLSBHMg==">
+ <serialNumber>ATE7Ow==</serialNumber>
+ </certItem>
+ <certItem issuerName="MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDM=">
+ <serialNumber>VOQX5SLKeMGyQdoF0X9h38gYrks=</serialNumber>
+ </certItem>
+ <certItem issuerName="MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDM=">
+ <serialNumber>Z6RtH7xmDM0r66IKSlpCZNrlRfY=</serialNumber>
+ </certItem>
+ <certItem issuerName="MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDM=">
+ <serialNumber>bdheRp0SfvS84GGiPaBnyFhE8EY=</serialNumber>
+ </certItem>
+ <certItem issuerName="MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDM=">
+ <serialNumber>JJfQeI7SQbQcPQ8Wc4+X2nlpWho=</serialNumber>
+ </certItem>
+ <certItem issuerName="MEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDM=">
+ <serialNumber>KZlCQ0XnAo+GY3mKKJoNoNucjT0=</serialNumber>
+ </certItem>
</certItems>
</blocklist>
--- a/mail/base/content/contentAreaClick.js
+++ b/mail/base/content/contentAreaClick.js
@@ -2,16 +2,18 @@
* 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/. */
/**
* Extract the href from the link click event.
* We look for HTMLAnchorElement, HTMLAreaElement, HTMLLinkElement,
* HTMLInputElement.form.action, and nested anchor tags.
+ * If the clicked element was a HTMLInputElement or HTMLButtonElement
+ * we return the form action.
*
* @return href for the url being clicked
*/
Components.utils.import("resource://gre/modules/PlacesUtils.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
function hRefForClickEvent(aEvent, aDontCheckInputElement)
@@ -30,17 +32,18 @@
}
else if (target instanceof HTMLImageElement &&
target.hasAttribute("overflowing"))
{
// Return if an image is zoomed, otherwise fall through to see if it has
// a link node.
return href;
}
- else if (!aDontCheckInputElement && target instanceof HTMLInputElement)
+ else if (!aDontCheckInputElement && ((target instanceof HTMLInputElement) ||
+ (target instanceof HTMLButtonElement)))
{
if (target.form && target.form.action)
href = target.form.action;
}
else
{
// We may be nested inside of a link node.
var linkNode = aEvent.originalTarget;
--- a/mail/base/content/mailWindowOverlay.js
+++ b/mail/base/content/mailWindowOverlay.js
@@ -3018,17 +3018,17 @@ var gMessageNotificationBar =
buttons);
}
},
isShowingJunkNotification: function() {
return !!this.msgNotificationBar.getNotificationWithValue("junkContent");
},
- setRemoteContentMsg: function(aMsgHdr, aContentURI)
+ setRemoteContentMsg: function(aMsgHdr, aContentURI, aCanOverride)
{
// update the allow remote content for sender string
let emailAddress = MailServices.headerParser.extractHeaderAddressMailboxes(aMsgHdr.author);
var desc = document.getElementById("bundle_messenger")
.getFormattedString("alwaysLoadRemoteContentForSender2",
[emailAddress ? emailAddress : aMsgHdr.author]);
let displayName = MailServices.headerParser.extractHeaderAddressName(aMsgHdr.author);
let brandName = this.brandBundle.getString("brandShortName");
@@ -3046,17 +3046,17 @@ var gMessageNotificationBar =
popup: "remoteContentOptions",
callback: function() { }
}];
if (!this.isShowingRemoteContentNotification()) {
this.msgNotificationBar.appendNotification(remoteContentMsg, "remoteContent",
"chrome://messenger/skin/icons/remote-blocked.png",
this.msgNotificationBar.PRIORITY_WARNING_MEDIUM,
- buttons);
+ (aCanOverride ? buttons : []));
}
// The popup value is a space separated list of all the blocked origins.
let popup = document.getElementById("remoteContentOptions");
let principal = Services.scriptSecurityManager
.createCodebasePrincipal(aContentURI, {});
let origins = popup.value ? popup.value.split(" ") : [];
if (!origins.includes(principal.origin))
--- a/mail/base/content/msgHdrViewOverlay.js
+++ b/mail/base/content/msgHdrViewOverlay.js
@@ -731,19 +731,19 @@ var messageHeaderSink = {
OnMsgParsed(url);
},
onEndMsgHeaders: function(url)
{
OnMsgLoaded(url);
},
- onMsgHasRemoteContent: function(aMsgHdr, aContentURI)
+ onMsgHasRemoteContent: function(aMsgHdr, aContentURI, aCanOverride)
{
- gMessageNotificationBar.setRemoteContentMsg(aMsgHdr, aContentURI);
+ gMessageNotificationBar.setRemoteContentMsg(aMsgHdr, aContentURI, aCanOverride);
},
mSecurityInfo : null,
mSaveHdr: null,
get securityInfo()
{
return this.mSecurityInfo;
},
@@ -1818,16 +1818,29 @@ function AttachmentInfo(contentType, url
this.partID = match && match.split("part=")[1];
url = url.replace(match, "");
}
else {
match = GlodaUtils.PART_RE.exec(url);
this.partID = match && match[1];
}
+ // Make sure to communicate it if it's an external http attachment and not a
+ // local attachment. For feeds attachments (enclosures) are always remote,
+ // so there is nothing to communicate.
+ if (isExternalAttachment && url.startsWith("http") &&
+ !gFolderDisplay.selectedMessageIsFeed) {
+ if (this.name) {
+ this.name = url + " - " + this.name;
+ }
+ else {
+ this.name = url;
+ }
+ }
+
this.url = url;
}
AttachmentInfo.prototype = {
/**
* Save this attachment to a file.
*/
save: function AttachmentInfo_save()
--- a/mail/components/compose/content/MsgComposeCommands.js
+++ b/mail/components/compose/content/MsgComposeCommands.js
@@ -4405,21 +4405,29 @@ nsAttachmentOpener.prototype =
onStartURIOpen: function(uri)
{
return false;
},
doContent: function(contentType, isContentPreferred, request, contentHandler)
{
- return false;
+ // If we came here to display an attached message, make sure we provide a type.
+ if (/[?&]part=/i.test(request.URI.query))
+ request.URI.query += "&type=message/rfc822";
+ let newHandler = Cc["@mozilla.org/uriloader/content-handler;1?type=application/x-message-display"]
+ .createInstance(Components.interfaces.nsIContentHandler);
+ newHandler.handleContent("application/x-message-display", this, request);
+ return true;
},
isPreferred: function(contentType, desiredContentType)
{
+ if (contentType == "message/rfc822")
+ return true;
return false;
},
canHandleContent: function(contentType, isContentPreferred, desiredContentType)
{
return false;
},
--- a/mail/extensions/smime/content/msgHdrViewSMIMEOverlay.js
+++ b/mail/extensions/smime/content/msgHdrViewSMIMEOverlay.js
@@ -12,16 +12,27 @@ var gEncryptedURIService = null;
var gMyLastEncryptedURI = null;
var gSMIMEBundle = null;
// manipulates some globals from msgReadSMIMEOverlay.js
var nsICMSMessageErrors = Components.interfaces.nsICMSMessageErrors;
+/// Get the necko URL for the message URI.
+function neckoURLForMessageURI(aMessageURI)
+{
+ let msgSvc = Components.classes["@mozilla.org/messenger;1"]
+ .createInstance(Components.interfaces.nsIMessenger)
+ .messageServiceFromURI(aMessageURI);
+ let neckoURI = {};
+ msgSvc.GetUrlForUri(aMessageURI, neckoURI, null);
+ return neckoURI.value.spec;
+}
+
var smimeHeaderSink =
{
maxWantedNesting: function()
{
return 1;
},
signedStatus: function(aNestingLevel, aSignatureStatus, aSignerCert)
@@ -112,18 +123,21 @@ var smimeHeaderSink =
else
{
gEncryptedUINode.setAttribute("encrypted", "notok");
gStatusBar.setAttribute("encrypted", "notok");
}
if (gEncryptedURIService)
{
+ // Remember the message URI and the corresponding necko URI.
gMyLastEncryptedURI = gFolderDisplay.selectedMessageUris[0];
gEncryptedURIService.rememberEncrypted(gMyLastEncryptedURI);
+ gEncryptedURIService.rememberEncrypted(
+ neckoURLForMessageURI(gMyLastEncryptedURI));
}
switch (aEncryptionStatus)
{
case nsICMSMessageErrors.SUCCESS:
case nsICMSMessageErrors.ENCRYPT_INCOMPLETE:
break;
default:
@@ -155,16 +169,18 @@ var smimeHeaderSink =
}
};
function forgetEncryptedURI()
{
if (gMyLastEncryptedURI && gEncryptedURIService)
{
gEncryptedURIService.forgetEncrypted(gMyLastEncryptedURI);
+ gEncryptedURIService.forgetEncrypted(
+ neckoURLForMessageURI(gMyLastEncryptedURI));
gMyLastEncryptedURI = null;
}
}
function onSMIMEStartHeaders()
{
gEncryptionStatus = -1;
gSignatureStatus = -1;
--- a/mailnews/base/src/nsMsgContentPolicy.cpp
+++ b/mailnews/base/src/nsMsgContentPolicy.cpp
@@ -8,16 +8,17 @@
#include "nsIPrefService.h"
#include "nsIPrefBranch.h"
#include "nsIAbManager.h"
#include "nsIAbDirectory.h"
#include "nsIAbCard.h"
#include "nsIMsgWindow.h"
#include "nsIMimeMiscStatus.h"
#include "nsIMsgHdr.h"
+#include "nsIEncryptedSMIMEURIsSrvc.h"
#include "nsNetUtil.h"
#include "nsIMsgComposeService.h"
#include "nsMsgCompCID.h"
#include "nsIDocShellTreeItem.h"
#include "nsIWebNavigation.h"
#include "nsContentPolicyUtils.h"
#include "nsIDOMHTMLImageElement.h"
#include "nsIFrameLoader.h"
@@ -295,16 +296,50 @@ nsMsgContentPolicy::ShouldLoad(uint32_t
return NS_OK;
}
// never load unexposed protocols except for http, https and file.
// Protocols like ftp are always blocked.
if (ShouldBlockUnexposedProtocol(aContentLocation))
return NS_OK;
+
+ // Find out the URI that originally initiated the set of requests for this
+ // context.
+ nsCOMPtr<nsIURI> originatorLocation;
+ if (!aRequestingContext && aRequestPrincipal)
+ {
+ // Can get the URI directly from the principal.
+ rv = aRequestPrincipal->GetURI(getter_AddRefs(originatorLocation));
+ }
+ else
+ {
+ rv = GetOriginatingURIForContext(aRequestingContext,
+ getter_AddRefs(originatorLocation));
+ }
+ NS_ENSURE_SUCCESS(rv, NS_OK);
+
+#ifdef DEBUG_MsgContentPolicy
+ fprintf(stderr, "originatorLocation = %s\n", originatorLocation->GetSpecOrDefault().get());
+#endif
+
+ // Don't load remote content for encrypted messages.
+ nsCOMPtr<nsIEncryptedSMIMEURIsService> encryptedURIService =
+ do_GetService("@mozilla.org/messenger-smime/smime-encrypted-uris-service;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool isEncrypted;
+ rv = encryptedURIService->IsEncrypted(aRequestingLocation->GetSpecOrDefault(), &isEncrypted);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (isEncrypted)
+ {
+ *aDecision = nsIContentPolicy::REJECT_REQUEST;
+ NotifyContentWasBlocked(originatorLocation, aContentLocation, false);
+ return NS_OK;
+ }
+
// If we are allowing all remote content...
if (!mBlockRemoteImages)
{
*aDecision = nsIContentPolicy::ACCEPT;
return NS_OK;
}
// Extract the windowtype to handle compose windows separately from mail
@@ -316,35 +351,16 @@ nsMsgContentPolicy::ShouldLoad(uint32_t
if (msgCompose)
{
ComposeShouldLoad(msgCompose, aRequestingContext, aContentLocation,
aDecision);
return NS_OK;
}
}
- // Find out the URI that originally initiated the set of requests for this
- // context.
- nsCOMPtr<nsIURI> originatorLocation;
- if (!aRequestingContext && aRequestPrincipal)
- {
- // Can get the URI directly from the principal.
- rv = aRequestPrincipal->GetURI(getter_AddRefs(originatorLocation));
- }
- else
- {
- rv = GetOriginatingURIForContext(aRequestingContext,
- getter_AddRefs(originatorLocation));
- }
- NS_ENSURE_SUCCESS(rv, NS_OK);
-
-#ifdef DEBUG_MsgContentPolicy
- fprintf(stderr, "originatorLocation = %s\n", originatorLocation->GetSpecOrDefault().get());
-#endif
-
// Allow content when using a remote page.
bool isHttp;
bool isHttps;
rv = originatorLocation->SchemeIs("http", &isHttp);
nsresult rv2 = originatorLocation->SchemeIs("https", &isHttps);
if (NS_SUCCEEDED(rv) && NS_SUCCEEDED(rv2) && (isHttp || isHttps))
{
*aDecision = nsIContentPolicy::ACCEPT;
@@ -528,39 +544,94 @@ nsMsgContentPolicy::ShouldAcceptRemoteCo
return result;
}
class RemoteContentNotifierEvent : public mozilla::Runnable
{
public:
RemoteContentNotifierEvent(nsIMsgWindow *aMsgWindow, nsIMsgDBHdr *aMsgHdr,
- nsIURI *aContentURI)
- : mMsgWindow(aMsgWindow), mMsgHdr(aMsgHdr), mContentURI(aContentURI)
+ nsIURI *aContentURI, bool aCanOverride = true)
+ : mMsgWindow(aMsgWindow), mMsgHdr(aMsgHdr), mContentURI(aContentURI),
+ mCanOverride(aCanOverride)
{}
NS_IMETHOD Run()
{
if (mMsgWindow)
{
nsCOMPtr<nsIMsgHeaderSink> msgHdrSink;
(void)mMsgWindow->GetMsgHeaderSink(getter_AddRefs(msgHdrSink));
if (msgHdrSink)
- msgHdrSink->OnMsgHasRemoteContent(mMsgHdr, mContentURI);
+ msgHdrSink->OnMsgHasRemoteContent(mMsgHdr, mContentURI, mCanOverride);
}
return NS_OK;
}
private:
nsCOMPtr<nsIMsgWindow> mMsgWindow;
nsCOMPtr<nsIMsgDBHdr> mMsgHdr;
nsCOMPtr<nsIURI> mContentURI;
+ bool mCanOverride;
};
/**
+ * This function is used to show a blocked remote content notification.
+ */
+void
+nsMsgContentPolicy::NotifyContentWasBlocked(nsIURI *aOriginatorLocation,
+ nsIURI *aContentLocation,
+ bool aCanOverride)
+{
+ // Is it a mailnews url?
+ nsresult rv;
+ nsCOMPtr<nsIMsgMessageUrl> msgUrl(do_QueryInterface(aOriginatorLocation,
+ &rv));
+ if (NS_FAILED(rv))
+ {
+ return;
+ }
+
+ nsCString resourceURI;
+ rv = msgUrl->GetUri(getter_Copies(resourceURI));
+ NS_ENSURE_SUCCESS_VOID(rv);
+
+ nsCOMPtr<nsIMsgMailNewsUrl> mailnewsUrl(do_QueryInterface(aOriginatorLocation, &rv));
+ NS_ENSURE_SUCCESS_VOID(rv);
+
+ nsCOMPtr<nsIMsgDBHdr> msgHdr;
+ rv = GetMsgDBHdrFromURI(resourceURI.get(), getter_AddRefs(msgHdr));
+ if (NS_FAILED(rv))
+ {
+ // Maybe we can get a dummy header.
+ nsCOMPtr<nsIMsgWindow> msgWindow;
+ rv = mailnewsUrl->GetMsgWindow(getter_AddRefs(msgWindow));
+ if (msgWindow)
+ {
+ nsCOMPtr<nsIMsgHeaderSink> msgHdrSink;
+ rv = msgWindow->GetMsgHeaderSink(getter_AddRefs(msgHdrSink));
+ if (msgHdrSink)
+ rv = msgHdrSink->GetDummyMsgHeader(getter_AddRefs(msgHdr));
+ }
+ }
+
+ nsCOMPtr<nsIMsgWindow> msgWindow;
+ (void)mailnewsUrl->GetMsgWindow(getter_AddRefs(msgWindow));
+ if (msgWindow)
+ {
+ nsCOMPtr<nsIRunnable> event =
+ new RemoteContentNotifierEvent(msgWindow, msgHdr, aContentLocation, aCanOverride);
+ // Post this as an event because it can cause dom mutations, and we
+ // get called at a bad time to be causing dom mutations.
+ if (event)
+ NS_DispatchToCurrentThread(event);
+ }
+}
+
+/**
* This function is used to determine if we allow content for a remote message.
* If we reject loading remote content, then we'll inform the message window
* that this message has remote content (and hence we are not loading it).
*
* See ShouldAcceptRemoteContentForMsgHdr for the actual decisions that
* determine if we are going to allow remote content.
*/
void
--- a/mailnews/base/src/nsMsgContentPolicy.h
+++ b/mailnews/base/src/nsMsgContentPolicy.h
@@ -64,16 +64,19 @@ protected:
bool IsExposedProtocol(nsIURI *aContentLocation);
bool IsExposedChromeProtocol(nsIURI *aContentLocation);
bool ShouldBlockUnexposedProtocol(nsIURI *aContentLocation);
bool ShouldAcceptRemoteContentForSender(nsIMsgDBHdr *aMsgHdr);
int16_t ShouldAcceptRemoteContentForMsgHdr(nsIMsgDBHdr *aMsgHdr,
nsIURI *aRequestingLocation,
nsIURI *aContentLocation);
+ void NotifyContentWasBlocked(nsIURI *aOriginatorLocation,
+ nsIURI *aContentLocation,
+ bool aCanOverride);
void ShouldAcceptContentForPotentialMsg(nsIURI *aOriginatorLocation,
nsIURI *aContentLocation,
int16_t *aDecision);
void ComposeShouldLoad(nsIMsgCompose *aMsgCompose,
nsISupports *aRequestingContext,
nsIURI *aContentLocation, int16_t *aDecision);
already_AddRefed<nsIMsgCompose> GetMsgComposeForContext(nsISupports *aRequestingContext);
--- a/mailnews/base/util/msgDBCacheManager.js
+++ b/mailnews/base/util/msgDBCacheManager.js
@@ -28,24 +28,29 @@ var DBCACHE_INTERVAL_DEFAULT_MS = 60000;
var msgDBCacheManager =
{
_initialized: false,
_msgDBCacheTimer: null,
_msgDBCacheTimerIntervalMS: DBCACHE_INTERVAL_DEFAULT_MS,
+ _dbService: null,
+
/**
* This is called on startup
*/
init: function dbcachemgr_init()
{
if (this._initialized)
return;
+ this._dbService = Cc["@mozilla.org/msgDatabase/msgDBService;1"]
+ .getService(Ci.nsIMsgDBService);
+
// we listen for "quit-application-granted" instead of
// "quit-application-requested" because other observers of the
// latter can cancel the shutdown.
Services.obs.addObserver(this, "quit-application-granted", false);
this.startPeriodicCheck();
this._initialized = true;
@@ -97,74 +102,74 @@ var msgDBCacheManager =
.createInstance(Ci.nsITimer);
this._dbCacheCheckTimer.initWithCallback(
this._dbCacheCheckTimerCallback,
this._msgDBCacheTimerIntervalMS,
Ci.nsITimer.TYPE_REPEATING_SLACK);
}
},
- checkCachedDBs : function ()
+
+ /**
+ * Checks if any DBs need to be closed due to inactivity or too many of them open.
+ */
+ checkCachedDBs: function()
{
- const gDbService = Cc["@mozilla.org/msgDatabase/msgDBService;1"]
- .getService(Ci.nsIMsgDBService);
-
let idleLimit = Services.prefs.getIntPref("mail.db.idle_limit");
let maxOpenDBs = Services.prefs.getIntPref("mail.db.max_open");
// db.lastUseTime below is in microseconds while Date.now and idleLimit pref
// is in milliseconds.
let closeThreshold = (Date.now() - idleLimit) * 1000;
- let cachedDBs = gDbService.openDBs;
- log.info("periodic check of cached dbs, count=" + cachedDBs.length);
- let numOpenDBs = 0;
+ let cachedDBs = this._dbService.openDBs;
+ log.info("Periodic check of cached folder databases (DBs), count=" + cachedDBs.length);
+ // Count databases that are already closed or get closed now due to inactivity.
+ let numClosing = 0;
+ // Count databases whose folder is open in a window.
+ let numOpenInWindow = 0;
+ let dbs = [];
for (let i = 0; i < cachedDBs.length; i++) {
let db = cachedDBs.queryElementAt(i, Ci.nsIMsgDatabase);
if (!db.folder.databaseOpen) {
- log.debug("skipping cachedDB not open in folder: " + db.folder.name);
+ // The DB isn't really open anymore.
+ log.debug("Skipping, DB not open for folder: " + db.folder.name);
+ numClosing++;
continue;
}
if (MailServices.mailSession.IsFolderOpenInWindow(db.folder)) {
- log.debug("folder open in window, name: " + db.folder.name);
- numOpenDBs++;
+ // The folder is open in a window so this DB must not be closed.
+ log.debug("Skipping, DB open in window for folder: " + db.folder.name);
+ numOpenInWindow++;
continue;
}
+
if (db.lastUseTime < closeThreshold)
{
- log.debug("closing expired msgDatabase for folder: " + db.folder.name);
+ // DB open too log without activity.
+ log.debug("Closing expired DB for folder: " + db.folder.name);
db.folder.msgDatabase = null;
+ numClosing++;
+ continue;
}
- else
- numOpenDBs++;
+
+ // Database eligible for closing.
+ dbs.push(db);
}
- cachedDBs = gDbService.openDBs;
- log.info("open db count " + numOpenDBs);
- if (numOpenDBs > maxOpenDBs) {
+ log.info("DBs open in a window: " + numOpenInWindow + ", DBs open: " + dbs.length + ", DBs already closing: " + numClosing);
+ let dbsToClose = Math.max(dbs.length - Math.max(maxOpenDBs - numOpenInWindow, 0), 0);
+ if (dbsToClose > 0) {
// Close some DBs so that we do not have more than maxOpenDBs.
- // However, we do not close DB for a folder that is open in a window
+ // However, we skipped DBs for folders that are open in a window
// so if there are so many windows open, it may be possible for
// more than maxOpenDBs folders to stay open after this loop.
- let dbs = [];
- for (let i = 0; i < cachedDBs.length; i++) {
- let db = cachedDBs.queryElementAt(i, Ci.nsIMsgDatabase);
- if (db.folder.databaseOpen)
- dbs.push(db);
- }
- dbs.sort((a, b) => a.lastUseTime > b.lastUseTime);
- let dbsToClose = dbs.length - maxOpenDBs;
- if (dbsToClose > 0) {
- log.info("trying to close " + dbsToClose + " databases");
- for (let db of dbs) {
- if (MailServices.mailSession.IsFolderOpenInWindow(db.folder))
- {
- log.debug("not closing db open in window, name: " + db.folder.name);
- continue;
- }
- log.debug("closing db for folder: " + db.folder.name);
- db.folder.msgDatabase = null;
- if (--dbsToClose == 0)
- break;
- }
+ log.info("Need to close " + dbsToClose + " more DBs");
+ // Order databases by lowest lastUseTime (oldest) at the end.
+ dbs.sort((a, b) => b.lastUseTime - a.lastUseTime);
+ while (dbsToClose > 0) {
+ let db = dbs.pop();
+ log.debug("Closing DB for folder: " + db.folder.name);
+ db.folder.msgDatabase = null;
+ dbsToClose--;
}
}
},
};
--- a/mailnews/extensions/bayesian-spam-filter/src/nsBayesianFilter.cpp
+++ b/mailnews/extensions/bayesian-spam-filter/src/nsBayesianFilter.cpp
@@ -950,17 +950,18 @@ NS_IMETHODIMP TokenStreamListener::OnEnd
NS_IMETHODIMP TokenStreamListener::OnEndMsgDownload(nsIMsgMailNewsUrl *url)
{
return NS_OK;
}
NS_IMETHODIMP TokenStreamListener::OnMsgHasRemoteContent(nsIMsgDBHdr *aMsgHdr,
- nsIURI *aContentURI)
+ nsIURI *aContentURI,
+ bool aCanOverride)
{
return NS_OK;
}
NS_IMETHODIMP TokenStreamListener::OnEndMsgHeaders(nsIMsgMailNewsUrl *url)
{
return NS_OK;
}
--- a/mailnews/extensions/smime/public/nsIEncryptedSMIMEURIsSrvc.idl
+++ b/mailnews/extensions/smime/public/nsIEncryptedSMIMEURIsSrvc.idl
@@ -8,14 +8,17 @@
that is only accessible from C++.
*/
#include "nsISupports.idl"
[scriptable, uuid(f86e55c9-530b-483f-91a7-10fb5b852488)]
interface nsIEncryptedSMIMEURIsService : nsISupports
{
+ /// Remember that this URI is encrypted.
void rememberEncrypted(in AUTF8String uri);
+ /// Forget that this URI is encrypted.
void forgetEncrypted(in AUTF8String uri);
+ /// Check if this URI is encrypted.
boolean isEncrypted(in AUTF8String uri);
};
--- a/mailnews/imap/src/nsImapProtocol.cpp
+++ b/mailnews/imap/src/nsImapProtocol.cpp
@@ -6875,22 +6875,22 @@ bool nsImapProtocol::RenameHierarchyByHa
&serverName);
PR_FREEIF(currentName);
currentName = serverName;
}
// calculate the new name and do the rename
nsCString newChildName(newParentMailboxName);
newChildName += (currentName + PL_strlen(oldParentMailboxName));
- RenameMailboxRespectingSubscriptions(currentName,
- newChildName.get(),
- nonHierarchicalRename);
- // pass in xNonHierarchicalRename to determine if we should really
- // reanme, or just move subscriptions
- renameSucceeded = GetServerStateParser().LastCommandSuccessful();
+ // Pass in 'nonHierarchicalRename' to determine if we should really
+ // reanme, or just move subscriptions.
+ renameSucceeded =
+ RenameMailboxRespectingSubscriptions(currentName,
+ newChildName.get(),
+ nonHierarchicalRename);
PR_FREEIF(currentName);
}
delete m_deletableChildren;
m_deletableChildren = nullptr;
}
return renameSucceeded;
--- a/mailnews/mime/jsmime/jsmime.js
+++ b/mailnews/mime/jsmime/jsmime.js
@@ -807,16 +807,23 @@ function parseAddressingHeader(header, d
/**
* Add the parsed mailbox object to the address list.
* If it's in the legacy form above, correct the display-name.
* Also reset any faked flags.
* @param {String} displayName display-name as per RFC 5322
* @param {String} addrSpec addr-spec as per RFC 5322
*/
function addToAddrList(displayName, addrSpec) {
+ // Keep the local-part quoted if it needs to be.
+ let lp = addrSpec.substring(0, addrSpec.lastIndexOf("@"));
+ if (/[ !()<>\[\]:;@\\,"]/.exec(lp) !== null) {
+ addrSpec = '"' + lp.replace(/([\\"])/g, "\\$1") + '"' +
+ addrSpec.substring(addrSpec.lastIndexOf("@"));
+ }
+
if (displayName === '' && lastComment !== '') {
// Take last comment content as the display-name.
let offset = lastComment[0] === ' ' ? 2 : 1;
displayName = lastComment.substr(offset, lastComment.length - offset - 1);
}
if (displayName !== '' || addrSpec !== '')
addrlist.push({name: displayName, email: addrSpec});
// Clear pending flags and variables.
@@ -879,19 +886,16 @@ function parseAddressingHeader(header, d
// out the display name for the current production.
if (!inAngle) {
address = localPart;
name = '';
localPart = '';
// The remainder of this mailbox is part of an addr-spec.
inAngle = true;
}
- // Keep the local-part quoted if it needs to be.
- if (/[ !()<>\[\]:;@\\,"]/.exec(address) !== null)
- address = '"' + address.replace(/([\\"])/g, "\\$1") + '"';
address += '@';
} else if (token === ',') {
// A comma ends the current name. If we have something that's kind of a
// name, add it to the result list. If we don't, then our input looks like
// To: , , -> don't bother adding an empty entry.
addToAddrList(name, address);
} else if (token === ';') {
// Add pending name to the list
--- a/mailnews/mime/jsmime/test/test_header.js
+++ b/mailnews/mime/jsmime/test/test_header.js
@@ -203,16 +203,24 @@ suite('headerparser', function () {
[{name: "undisclosed-recipients", group: []}]],
["me@[127.0.0.1]", [{name: "", email: "me@[127.0.0.1]"}]],
["\"me\"@a.com", [{name: "", email: "me@a.com"}]],
["\"!\"@a.com", [{name: "", email: "\"!\"@a.com"}]],
["\"\\!\"@a.com", [{name: "", email: "\"!\"@a.com"}]],
["\"\\\\!\"@a.com", [{name: "", email: "\"\\\\!\"@a.com"}]],
["Coward (not@email) <real@email.com>",
[{name: "Coward (not@email)", email: "real@email.com"}]],
+ ["\"y@example.com\" <xx@example.com>",
+ [{name: "y@example.com", email: "xx@example.com"}]],
+ ["@@@",
+ [{name: "", email: "\"@@\"@"}]],
+ ["@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@",
+ [{name: "", email: "\"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\"@"}]],
+ ["Nat Ex <{admin@example.com|stocks@example.com|stockmarket@example.com|trades@example.com|money@example.com|broker@example.com|deals@example.com|offers@example.com|news@example.com|binary@example.com|forex@example.com|marketing@example.com|mail@example.com|inboxdeals@example.com|packages@example.com>",
+ [{name: "Nat Ex", email: "\"{admin@example.com|stocks@example.com|stockmarket@example.com|trades@example.com|money@example.com|broker@example.com|deals@example.com|offers@example.com|news@example.com|binary@example.com|forex@example.com|marketing@example.com|mail@example.com|inboxdeals@example.com|packages\"@example.com"}]],
["Group: a@b.com, b@c.com;", [{name: "Group", group:
[{name: "", email: "a@b.com"}, {name: "", email: "b@c.com"}]}]],
["a@invalid.invalid, Group: a@b.com;",
[{name: "", email: "a@invalid.invalid"},
{name: "Group", group: [{name: "", email: "a@b.com"}]}]],
["Group A: a@b.com;, Group B: b@b.com;",
[{name: "Group A", group: [{name: "", email: "a@b.com"}]},
{name: "Group B", group: [{name: "", email: "b@b.com"}]}]],
--- a/mailnews/mime/public/nsIMimeMiscStatus.idl
+++ b/mailnews/mime/public/nsIMimeMiscStatus.idl
@@ -55,18 +55,19 @@ interface nsIMsgHeaderSink : nsISupports
attribute nsISupports securityInfo;
/**
* onMsgHasRemoteContent is called each time content policy encounters remote
* content that it will block from loading.
* @param aMsgHdr header of the message the content is located in
* @param aContentURI location that will be blocked.
+ * @param aCanOverride can the blocking be overridden or not
*/
- void onMsgHasRemoteContent(in nsIMsgDBHdr aMsgHdr, in nsIURI aContentURI);
+ void onMsgHasRemoteContent(in nsIMsgDBHdr aMsgHdr, in nsIURI aContentURI, in boolean aCanOverride);
readonly attribute nsIMsgDBHdr dummyMsgHeader;
// used as a hook for extension mime content handlers to store data that can later
// be accessed by other parts of the code, e.g., UI code.
// TODO - Should replace securityInfo
readonly attribute nsIWritablePropertyBag2 properties;
// When streaming a new message, properties should be reset, so that there are
--- a/mailnews/mime/src/mimei.cpp
+++ b/mailnews/mime/src/mimei.cpp
@@ -1694,17 +1694,17 @@ MimeOptions_write(MimeHeaders *hdrs, Mim
// PR_ASSERT(opt->state->first_data_written_p);
if (opt->state->separator_queued_p && user_visible_p)
{
opt->state->separator_queued_p = false;
if (opt->state->separator_suppressed_p)
opt->state->separator_suppressed_p = false;
else {
- const char *sep = "<BR><FIELDSET CLASS=\"mimeAttachmentHeader\">";
+ const char *sep = "<!--'\"--><BR><FIELDSET CLASS=\"mimeAttachmentHeader\">";
int lstatus = opt->output_fn(sep, strlen(sep), closure);
opt->state->separator_suppressed_p = false;
if (lstatus < 0) return lstatus;
nsCString name;
name.Adopt(MimeHeaders_get_name(hdrs, opt));
MimeHeaders_convert_header_value(opt, name, false);
--- a/suite/common/bookmarks/bookmarksManager.css
+++ b/suite/common/bookmarks/bookmarksManager.css
@@ -1,11 +1,11 @@
/* 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/. */
#searchFilter {
- width: 23em;
+ width: 16em;
}
#detailsDeck-splitter {
cursor: default;
}
--- a/suite/common/bookmarks/browser-places.js
+++ b/suite/common/bookmarks/browser-places.js
@@ -177,21 +177,35 @@ var StarUI = {
this._element("editBookmarkPanelRemoveButton").label = label;
this._itemId = aItemId !== undefined ? aItemId : this._itemId;
this.beginBatch();
// Consume dismiss clicks, see bug 400924
this.panel.popupBoxObject
.setConsumeRollupEvent(PopupBoxObject.ROLLUP_CONSUME);
- this.panel.openPopup(aAnchorElement, aPosition);
+
+ let onPanelReady = fn => {
+ let target = this.panel;
+ if (target.parentNode) {
+ // By targeting the panel's parent and using a capturing listener, we
+ // can have our listener called before others waiting for the panel to
+ // be shown (which probably expect the panel to be fully initialized)
+ target = target.parentNode;
+ }
+ target.addEventListener("popupshown", function(event) {
+ fn();
+ }, {"capture": true, "once": true});
+ };
gEditItemOverlay.initPanel(this._itemId,
- { hiddenRows: ["description", "location",
+ { onPanelReady,
+ hiddenRows: ["description", "location",
"keyword"] });
+ this.panel.openPopup(aAnchorElement, aPosition);
},
panelShown:
function SU_panelShown(aEvent) {
if (aEvent.target == this.panel) {
if (!this._element("editBookmarkPanelContent").hidden) {
let fieldToFocus = "editBMPanel_" +
Services.prefs.getCharPref("browser.bookmarks.editDialog.firstEditField");
--- a/suite/common/bookmarks/editBookmarkOverlay.js
+++ b/suite/common/bookmarks/editBookmarkOverlay.js
@@ -14,16 +14,17 @@ var gEditItemOverlay = {
_itemIds: [],
_uris: [],
_tags: [],
_allTags: [],
_multiEdit: false,
_itemType: -1,
_readOnly: false,
_hiddenRows: [],
+ _onPanelReady: false,
_observersAdded: false,
_staticFoldersListBuilt: false,
_initialized: false,
_titleOverride: null,
// the first field which was edited after this panel was initialized for
// a certain item
_firstEditedField: "",
@@ -48,16 +49,18 @@ var gEditItemOverlay = {
if (aInfo && aInfo.hiddenRows)
this._hiddenRows = aInfo.hiddenRows;
else
this._hiddenRows.splice(0, this._hiddenRows.length);
// force-read-only
this._readOnly = aInfo && aInfo.forceReadOnly;
// override title
this._titleOverride = aInfo && aInfo.titleOverride;
+
+ this._onPanelReady = aInfo && aInfo.onPanelReady;
},
_showHideRows: function EIO__showHideRows() {
var isBookmark = this._itemId != -1 &&
this._itemType == Components.interfaces.nsINavBookmarksService.TYPE_BOOKMARK;
var isQuery = false;
if (this._uri)
isQuery = this._uri.schemeIs("place");
@@ -206,17 +209,25 @@ var gEditItemOverlay = {
// Single bookmarks observe any change. History entries and multiEdit
// observe only tags changes, through bookmarks.
if (this._itemId != -1 || this._uri || this._multiEdit)
PlacesUtils.bookmarks.addObserver(this, false);
window.addEventListener("unload", this, false);
this._observersAdded = true;
}
- this._initialized = true;
+ let focusElement = () => {
+ this._initialized = true;
+ };
+
+ if (this._onPanelReady) {
+ this._onPanelReady(focusElement);
+ } else {
+ focusElement();
+ }
},
/**
* Finds tags that are in common among this._tags entries that track tags
* for each selected uri.
* The tags arrays should be kept up-to-date for this to work properly.
*
* @return array of common tags for the selected uris.
@@ -231,20 +242,17 @@ var gEditItemOverlay = {
_initTextField: function(aTextFieldId, aValue, aReadOnly) {
var field = this._element(aTextFieldId);
field.readOnly = aReadOnly !== undefined ? aReadOnly : this._readOnly;
if (field.value != aValue) {
field.value = aValue;
- // clear the undo stack
- var editor = field.editor;
- if (editor)
- editor.transactionManager.clear();
+ this._editorTransactionManagerClear(field);
}
},
/**
* Appends a menu-item representing a bookmarks folder to a menu-popup.
* @param aMenupopup
* The popup to which the menu-item should be added.
* @param aFolderId
@@ -335,16 +343,36 @@ var gEditItemOverlay = {
if (aIID.equals(Components.interfaces.nsIDOMEventListener) ||
aIID.equals(Components.interfaces.nsINavBookmarkObserver) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_ERROR_NO_INTERFACE;
},
+ _editorTransactionManagerClear: function EIO__editorTransactionManagerClear(aItem) {
+ // Clear the editor's undo stack
+ let transactionManager;
+ try {
+ transactionManager = aItem.editor.transactionManager;
+ } catch (e) {
+ // When retrieving the transaction manager, editor may be null resulting
+ // in a TypeError. Additionally, the transaction manager may not
+ // exist yet, which causes access to it to throw NS_ERROR_FAILURE.
+ // In either event, the transaction manager doesn't exist it, so we
+ // don't need to worry about clearing it.
+ if (!(e instanceof TypeError) && e.result != Components.results.NS_ERROR_FAILURE) {
+ throw e;
+ }
+ }
+ if (transactionManager) {
+ transactionManager.clear();
+ }
+ },
+
_element: function EIO__element(aID) {
return document.getElementById("editBMPanel_" + aID);
},
_getItemStaticTitle: function EIO__getItemStaticTitle() {
if (this._titleOverride)
return this._titleOverride;
@@ -355,20 +383,17 @@ var gEditItemOverlay = {
},
_initNamePicker: function EIO_initNamePicker() {
var namePicker = this._element("namePicker");
namePicker.value = this._getItemStaticTitle();
namePicker.readOnly = this._readOnly;
- // clear the undo stack
- var editor = namePicker.editor;
- if (editor)
- editor.transactionManager.clear();
+ this._editorTransactionManagerClear(namePicker);
},
uninitPanel: function EIO_uninitPanel(aHideCollapsibleElements) {
if (aHideCollapsibleElements) {
// hide the folder tree if it was previously visible
var folderTreeRow = this._element("folderTreeRow");
if (!folderTreeRow.collapsed)
this.toggleFolderTreeVisibility();
@@ -904,18 +929,17 @@ var gEditItemOverlay = {
return;
}
switch (aProperty) {
case "title":
var namePicker = this._element("namePicker");
if (namePicker.value != aValue) {
namePicker.value = aValue;
- // clear undo stack
- namePicker.editor.transactionManager.clear();
+ this._editorTransactionManagerClear(namePicker);
}
break;
case "uri":
var locationField = this._element("locationField");
if (locationField.value != aValue) {
this._uri = Components.classes["@mozilla.org/network/io-service;1"]
.getService(Components.interfaces.nsIIOService)
.newURI(aValue, null, null);
--- a/suite/common/history/history.xul
+++ b/suite/common/history/history.xul
@@ -95,21 +95,17 @@
<menuseparator id="toolbarmode-sep"/>
</menupopup>
</menu>
<menu id="tasksMenu"/>
<menu id="windowMenu"/>
<menu id="menu_Help"/>
</menubar>
- </toolbar>
- <toolbar class="chromeclass-toolbar"
- id="placesSearchToolbar"
- align="center"
- grippytooltiptext="&searchBar.tooltip;">
+ <toolbarspring/>
<textbox id="search-box"
clickSelectsAll="true"
type="search"
aria-controls="historyTree"
placeholder="&search.placeholder;"
oncommand="searchHistory(this.value);"/>
</toolbar>
</toolbox>
--- a/suite/common/history/places.css
+++ b/suite/common/history/places.css
@@ -1,7 +1,11 @@
/* 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/. */
tree[type="places"] {
-moz-binding: url("chrome://communicator/content/history/tree.xml#places-tree");
}
+
+#search-box {
+ width: 16em;
+}
--- a/suite/common/jar.mn
+++ b/suite/common/jar.mn
@@ -73,17 +73,16 @@ comm.jar:
content/communicator/helpMessengerOverlay.xul
content/communicator/helpSecurityOverlay.xul
content/communicator/labelsencodings.properties (/mozilla/dom/encoding/labelsencodings.properties)
# the following file is a suite-specific override of the generic license.html, using suite/common/app-license.html as input:
* content/communicator/license.html (/mozilla/toolkit/content/license.html)
content/communicator/nsContextMenu.js
content/communicator/openLocation.js
content/communicator/openLocation.xul
- content/communicator/passwordManager.xul
content/communicator/safeMode.js
content/communicator/safeMode.xul
content/communicator/sanitize.xul
content/communicator/setDesktopBackground.js
content/communicator/setDesktopBackground.xul
content/communicator/tasksOverlay.js
content/communicator/tasksOverlay.xul
content/communicator/utilityOverlay.js
deleted file mode 100644
--- a/suite/common/passwordManager.xul
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0"?> <!-- -*- Mode: SGML; indent-tabs-mode: nil -*- -->
-<!-- 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/. -->
-
-<?xml-stylesheet href="chrome://communicator/skin/" type="text/css"?>
-
-<!DOCTYPE dialog [
-<!ENTITY % managerDTD SYSTEM "chrome://communicator/locale/passwordManager.dtd">
-%managerDTD;
-<!ENTITY % mgrDTD SYSTEM "chrome://passwordmgr/locale/passwordManager.dtd">
-%mgrDTD;
-]>
-
-<dialog id="SignonViewerDialog"
- windowtype="Toolkit:PasswordManager"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
- buttons="accept,help"
- buttonlabelaccept="&closebutton.label;"
- onload="Startup(); SignonsStartup(); RejectsStartup();"
- onunload="Shutdown();"
- ondialoghelp="openHelp('password_mgr', 'chrome://communicator/locale/help/suitehelp.rdf');"
- title="&windowtitle.label;"
- persist="width height screenX screenY">
-
- <script type="application/javascript"
- src="chrome://passwordmgr/content/passwordManagerCommon.js"/>
- <script type="application/javascript"
- src="chrome://passwordmgr/content/passwordManager.js"/>
- <script type="application/javascript"
- src="chrome://passwordmgr/content/passwordManagerExceptions.js"/>
- <script type="application/javascript"
- src="chrome://help/content/contextHelp.js"/>
-
- <stringbundle id="signonBundle"
- src="chrome://passwordmgr/locale/passwordmgr.properties"/>
- <keyset>
- <key key="&windowClose.key;" modifiers="accel" oncommand="window.close();"/>
- <key key="&focusSearch1.key;" modifiers="accel"
- oncommand="if (document.getElementById('signonsTab').selected) FocusFilterBox();"/>
- </keyset>
-
- <popupset id="signonsTreeContextSet">
- <menupopup id="signonsTreeContextMenu"
- onpopupshowing="UpdateCopyPassword();">
- <menuitem id="context-copypassword"
- label="©PasswordCmd.label;"
- accesskey="©PasswordCmd.accesskey;"
- oncommand="CopyPassword();"/>
- </menupopup>
- </popupset>
-
- <tabbox flex="1">
- <tabs>
- <tab id="signonsTab" label="&tab.signonsstored.label;"/>
- <tab id="signonsitesTab" label="&tab.signonsnotstored.label;"/>
- </tabs>
- <tabpanels flex="1">
-
- <!-- saved signons -->
- <vbox id="savedsignons" flex="1">
- <!-- filter -->
- <hbox align="center">
- <textbox id="filter" flex="1" type="search"
- aria-controls="signonsTree"
- placeholder="&search.placeholder;"
- oncommand="_filterPasswords();"/>
- </hbox>
- <separator class="thin"/>
-
- <label control="signonsTree" id="signonsIntro"/>
- <separator class="thin"/>
- <tree id="signonsTree" flex="1"
- style="height: 20em;" hidecolumnpicker="true"
- onkeypress="HandleSignonKeyPress(event)"
- onselect="SignonSelected();"
- context="signonsTreeContextMenu">
- <treecols>
- <treecol id="siteCol" label="&treehead.site.label;" flex="5"
- onclick="SignonColumnSort('hostname');"
- persist="width" sortDirection="ascending"/>
- <splitter class="tree-splitter"/>
- <treecol id="userCol" label="&treehead.username.label;" flex="2"
- onclick="SignonColumnSort('username');" persist="width"/>
- <splitter class="tree-splitter"/>
- <treecol id="passwordCol" label="&treehead.password.label;" flex="2"
- onclick="SignonColumnSort('password');" persist="width"
- hidden="true"/>
- </treecols>
- <treechildren/>
- </tree>
- <separator class="thin"/>
- <hbox id="SignonViewerButtons">
- <button id="removeSignon" disabled="true" icon="remove"
- label="&remove.label;" accesskey="&remove.accesskey;"
- oncommand="DeleteSignon();"/>
- <button id="removeAllSignons" icon="clear"
- label="&removeall.label;" accesskey="&removeall.accesskey;"
- oncommand="DeleteAllSignons();"/>
- <spacer flex="1"/>
- <button id="togglePasswords"
- oncommand="TogglePasswordVisible();"/>
- </hbox>
- </vbox>
-
- <!-- rejected sites -->
- <vbox id="rejectedsites" flex="1">
- <description control="rejectsTree">&loginsSpielExceptions.label;</description>
- <separator class="thin"/>
- <tree id="rejectsTree" flex="1" style="height: 20em;" hidecolumnpicker="true"
- onkeypress="HandleRejectKeyPress(event)"
- onselect="RejectSelected();">
- <treecols>
- <treecol id="rejectCol" label="&treehead.site.label;" flex="5"
- onclick="RejectColumnSort('host');" sortDirection="ascending"/>
- </treecols>
- <treechildren/>
- </tree>
- <separator class="thin"/>
- <hbox>
- <button id="removeReject" disabled="true" icon="remove"
- accesskey="&remove.accesskey;"
- label="&remove.label;" oncommand="DeleteReject();"/>
- <button id="removeAllRejects"
- accesskey="&removeall.accesskey;"
- icon="clear" label="&removeall.label;"
- oncommand="DeleteAllRejects();"/>
- </hbox>
- </vbox>
- </tabpanels>
- </tabbox>
-</dialog>
--- a/suite/common/places/nsPlacesAutoComplete.js
+++ b/suite/common/places/nsPlacesAutoComplete.js
@@ -3,18 +3,16 @@
* 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/. */
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
"resource://gre/modules/PlacesUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStopwatch",
- "resource://gre/modules/TelemetryStopwatch.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
"resource://gre/modules/NetUtil.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Task",
"resource://gre/modules/Task.jsm");
////////////////////////////////////////////////////////////////////////////////
//// Constants
@@ -543,17 +541,16 @@ nsPlacesAutoComplete.prototype = {
[this._getBoundAdaptiveQuery()];
if (this._hasBehavior("openpage")) {
queries.push(this._getBoundOpenPagesQuery(tokens));
}
queries.push(query);
// Start executing our queries.
- this._telemetryStartTime = Date.now();
this._executeQueries(queries);
// Set up our persistent state for the duration of the search.
this._searchTokens = tokens;
this._usedPlaces = {};
},
stopSearch: function PAC_stopSearch()
@@ -800,29 +797,16 @@ nsPlacesAutoComplete.prototype = {
{
let result = this._result;
let resultCode = result.matchCount ? "RESULT_SUCCESS" : "RESULT_NOMATCH";
if (aSearchOngoing) {
resultCode += "_ONGOING";
}
result.setSearchResult(Ci.nsIAutoCompleteResult[resultCode]);
this._listener.onSearchResult(this, result);
- if (this._telemetryStartTime) {
- let elapsed = Date.now() - this._telemetryStartTime;
- if (elapsed > 50) {
- try {
- Services.telemetry
- .getHistogramById("PLACES_AUTOCOMPLETE_1ST_RESULT_TIME_MS")
- .add(elapsed);
- } catch (ex) {
- Components.utils.reportError("Unable to report telemetry.");
- }
- }
- this._telemetryStartTime = null;
- }
},
/**
* Synchronize suggest.* prefs with autocomplete.enabled.
*/
_syncEnabledPref: function PAC_syncEnabledPref()
{
let suggestPrefs = ["suggest.history", "suggest.bookmark", "suggest.openpage"];
--- a/suite/config/version.txt
+++ b/suite/config/version.txt
@@ -1,1 +1,1 @@
-2.49.3
+2.49.4
--- a/suite/locales/en-US/chrome/common/help/composer_help.xhtml
+++ b/suite/locales/en-US/chrome/common/help/composer_help.xhtml
@@ -356,17 +356,17 @@
list, click the bulleted list button) in the Format toolbar.</li>
</ol>
<p>To position indented text below a list item:</p>
<ol>
<li>Click to place the insertion point within the list item.</li>
<li>Press <kbd>Shift</kbd>+<kbd class="mac">Return</kbd><kbd
- class="noMac">Enter</kbd>to create the hanging indent.</li>
+ class="noMac">Enter</kbd> to create the hanging indent.</li>
<li>Type the text you want to indent.</li>
<li>Press <kbd>Shift</kbd>+<kbd class="mac">Return</kbd><kbd
class="noMac">Enter</kbd> to create another indented paragraph, or press
<kbd class="mac">Return</kbd><kbd class="noMac">Enter</kbd> to create the
next list item.</li>
</ol>
<p><strong>Tip</strong>: You can increase or decrease the indentation of list
deleted file mode 100644
--- a/suite/locales/en-US/chrome/common/passwordManager.dtd
+++ /dev/null
@@ -1,8 +0,0 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<!ENTITY windowtitle.label "Password Manager">
-<!ENTITY tab.signonsstored.label "Passwords Saved">
-<!ENTITY tab.signonsnotstored.label "Passwords Never Saved">
-<!ENTITY search.placeholder "Search">
--- a/suite/locales/jar.mn
+++ b/suite/locales/jar.mn
@@ -34,17 +34,16 @@
locale/@AB_CD@/communicator/defaultClientDialog.dtd (%chrome/common/defaultClientDialog.dtd)
locale/@AB_CD@/communicator/feeds/subscribe.dtd (%chrome/common/feeds/subscribe.dtd)
locale/@AB_CD@/communicator/feeds/subscribe.properties (%chrome/common/feeds/subscribe.properties)
locale/@AB_CD@/communicator/gopherAddon.dtd (%chrome/common/gopherAddon.dtd)
locale/@AB_CD@/communicator/notification.dtd (%chrome/common/notification.dtd)
locale/@AB_CD@/communicator/notification.properties (%chrome/common/notification.properties)
locale/@AB_CD@/communicator/openLocation.dtd (%chrome/common/openLocation.dtd)
locale/@AB_CD@/communicator/openLocation.properties (%chrome/common/openLocation.properties)
- locale/@AB_CD@/communicator/passwordManager.dtd (%chrome/common/passwordManager.dtd)
locale/@AB_CD@/communicator/printPreview.dtd (%chrome/common/printPreview.dtd)
locale/@AB_CD@/communicator/safeBrowsing.dtd (%chrome/common/safeBrowsing.dtd)
locale/@AB_CD@/communicator/quitDialog.properties (%chrome/common/quitDialog.properties)
locale/@AB_CD@/communicator/shellservice.properties (%chrome/common/shellservice.properties)
locale/@AB_CD@/communicator/sanitize.dtd (%chrome/common/sanitize.dtd)
locale/@AB_CD@/communicator/setDesktopBackground.dtd (%chrome/common/setDesktopBackground.dtd)
locale/@AB_CD@/communicator/tasksOverlay.dtd (%chrome/common/tasksOverlay.dtd)
locale/@AB_CD@/communicator/typeaheadfind.properties (%chrome/common/typeaheadfind.properties)
--- a/suite/mailnews/msgMail3PaneWindow.js
+++ b/suite/mailnews/msgMail3PaneWindow.js
@@ -294,16 +294,18 @@ var folderListener =
else if (eventType == "AboutToCompact") {
if (gDBView)
gCurrentlyDisplayedMessage = gDBView.currentlyDisplayedMessage;
}
else if (eventType == "CompactCompleted") {
HandleCompactCompleted(folder);
}
else if (eventType == "RenameCompleted") {
+ // Clear this so we don't try to clear its new messages.
+ gMsgFolderSelected = null;
SelectFolder(folder.URI);
}
else if (eventType == "JunkStatusChanged") {
HandleJunkStatusChanged(folder);
}
}
}
--- a/suite/themes/modern/global/autocomplete.css
+++ b/suite/themes/modern/global/autocomplete.css
@@ -34,30 +34,32 @@ textbox[nomatch="true"][highlightnonmatc
.autocomplete-history-dropmarker[open="true"] {
margin-top: 3px;
margin-bottom: 1px;
margin-inline-start: 3px;
margin-inline-end: 1px;
}
-/* ::::: popups ::::: */
+/* ::::: autocomplete popups ::::: */
-.autocomplete-history-popup,
-panel[type="autocomplete"] {
+panel[type="autocomplete"],
+panel[type="autocomplete-richlistbox"],
+.autocomplete-history-popup {
+ -moz-appearance: none;
border: 1px solid;
-moz-border-top-colors: #6B747E;
-moz-border-right-colors: #6B747E;
-moz-border-bottom-colors: #6B747E;
-moz-border-left-colors: #6B747E;
background-color: #FFFFFF;
}
.autocomplete-history-popup {
- max-height: 25em;
+ max-height: 180px;
}
/* ::::: tree ::::: */
.autocomplete-tree {
border: none;
background-color: transparent !important;
}
@@ -80,8 +82,27 @@ panel[type="autocomplete"] {
.autocomplete-treebody::-moz-tree-cell-text(selected) {
color: #FFFFFF !important;
}
.autocomplete-treebody::-moz-tree-image(treecolAutoCompleteValue) {
max-width: 16px;
height: 16px;
}
+
+/* ::::: richlistbox autocomplete ::::: */
+
+.autocomplete-richlistbox {
+ -moz-appearance: none;
+ margin: 0px !important;
+ border: none !important;
+ padding: 0px !important;
+}
+
+/* ::::: textboxes inside toolbarpaletteitems ::::: */
+
+toolbarpaletteitem > toolbaritem > textbox > hbox > hbox > html|*.textbox-input {
+ visibility: hidden;
+}
+
+toolbarpaletteitem > toolbaritem > * > textbox > hbox > hbox > html|*.textbox-input {
+ visibility: hidden;
+}
--- a/suite/themes/modern/jar.mn
+++ b/suite/themes/modern/jar.mn
@@ -569,16 +569,17 @@ modern.jar:
skin/modern/messenger/smime/icons/sbCryptoOk.gif (messenger/smime/icons/sbCryptoOk.gif)
skin/modern/messenger/smime/icons/sbCryptoNotOk.gif (messenger/smime/icons/sbCryptoNotOk.gif)
skin/modern/messenger/smime/icons/hdrSignOk.gif (messenger/smime/icons/hdrSignOk.gif)
skin/modern/messenger/smime/icons/hdrSignUnknown.gif (messenger/smime/icons/hdrSignUnknown.gif)
skin/modern/messenger/smime/icons/hdrSignNotOk.gif (messenger/smime/icons/hdrSignNotOk.gif)
skin/modern/messenger/smime/icons/hdrCryptoOk.gif (messenger/smime/icons/hdrCryptoOk.gif)
skin/modern/messenger/smime/icons/hdrCryptoNotOk.gif (messenger/smime/icons/hdrCryptoNotOk.gif)
skin/modern/messenger-newsblog/feed-subscriptions.css (messenger/newsblog/feed-subscriptions.css)
+ skin/modern/mozapps/aboutNetworking.css (mozapps/aboutNetworking.css)
skin/modern/mozapps/downloads/downloadIcon.png (mozapps/downloads/downloadIcon.png)
skin/modern/mozapps/downloads/downloads.css (mozapps/downloads/downloads.css)
skin/modern/mozapps/downloads/unknownContentType.css (mozapps/downloads/unknownContentType.css)
skin/modern/mozapps/extensions/about.css (mozapps/extensions/about.css)
skin/modern/mozapps/extensions/alerticon-error.png (mozapps/extensions/alerticon-error.png)
skin/modern/mozapps/extensions/alerticon-info-negative.png (mozapps/extensions/alerticon-info-negative.png)
skin/modern/mozapps/extensions/alerticon-info-positive.png (mozapps/extensions/alerticon-info-positive.png)
skin/modern/mozapps/extensions/alerticon-warning.png (mozapps/extensions/alerticon-warning.png)
new file mode 100644
--- /dev/null
+++ b/suite/themes/modern/mozapps/aboutNetworking.css
@@ -0,0 +1,151 @@
+/* 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/. */
+
+@import url("chrome://global/skin/plugins.css");
+@import url("chrome://global/skin/button.css");
+
+html {
+ height: 100%;
+}
+
+body {
+ display: block;
+ align-items: stretch;
+ height: 100%;
+}
+
+#sectionTitle {
+ float: left;
+}
+
+#refreshDiv {
+ text-align: end;
+ margin-bottom: 0.5em;
+}
+
+#refreshButton {
+ vertical-align: middle;
+}
+
+/** Categories **/
+
+#categories > .category
+{
+ -moz-appearance: button;
+ display: inline-block;
+
+ margin: 2px;
+ border: 6px solid;
+ -moz-border-top-colors: transparent transparent transparent #000000 #BBC6D1 #B1BBC9;
+ -moz-border-right-colors: transparent transparent transparent #000000 #A2AEBB #A7B4C1;
+ -moz-border-bottom-colors: transparent transparent transparent #000000 #97A6B6 #9DAAB9;
+ -moz-border-left-colors: transparent transparent transparent #000000 #BBC6D1 #B1BBC9;
+ border-radius: 5px;
+ min-width: 6em;
+ background-color: #AAB6C4;
+ background-clip: padding-box;
+ color: #000000;
+ font: menu;
+}
+
+.category {
+ cursor: pointer;
+ /* Center category names */
+ align-items: center;
+}
+
+.category .category-name {
+ pointer-events: none;
+}
+
+#categories hr {
+ display: none;
+}
+
+/** Warning container **/
+
+/* XXX: a lot of this is duplicated from info-pages.css since that stylesheet
+ is incompatible with this type of layout */
+.warningBackground:not([hidden]) {
+ display: flex;
+}
+
+.warningBackground {
+ flex-direction: column;
+ box-sizing: border-box;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 50%;
+ top: 0;
+ left: 0;
+ position: fixed;
+}
+
+.container {
+ width: 40%;
+ color: #22262F;
+ background-color: #C7D0D9;
+ background-image: url("chrome://global/skin/icons/warning-48.png");
+ background-repeat: no-repeat;
+ background-position: 30px 3em;
+ border: 1px solid #494F5D;
+ border-radius: 10px;
+ padding: 3em;
+ padding-inline-start: 78px;
+}
+
+.title {
+ display: inline-block;
+ font-size: 1rem;
+ position: relative;
+ border-bottom: 1px solid #000000;
+ margin-bottom: 1em;
+ padding-bottom: 0.5em;
+}
+
+.warningBackground button {
+ margin-top: 1em;
+ margin-left: 0;
+ min-width: 100px;
+}
+
+/** Content area **/
+
+.warningBackground:not([hidden]) ~ div
+{
+ display: none;
+}
+
+.main-content {
+ flex: 1;
+ margin: 5px 0px;
+ padding: 5px;
+ border: 1px solid #2D3B49;
+ border-radius: 6px;
+}
+
+.header-name {
+ font-size: 1.5rem;
+ font-weight: bold;
+}
+
+.tab {
+ padding: 0.5em 0;
+}
+
+.tab table {
+ border: 1px solid;
+ width: 100%;
+}
+
+th, td, table {
+ text-align: start;
+}
+
+th {
+ font-size: medium;
+ text-align: start;
+ border-top: 1px dotted #2D3B49;
+}