mirror of
https://gitlab.com/KevinRoebert/ClearUrls
synced 2025-12-15 13:45:36 +07:00
Merge branch 'master' into poeditor
# Conflicts: # _locales/fr/messages.json
This commit is contained in:
@@ -6,7 +6,7 @@ variables:
|
||||
before_script:
|
||||
- export DEBIAN_FRONTEND= noninteractive
|
||||
- apt-get update -y
|
||||
- apt-get install -y zip unzip nodejs jsonlint
|
||||
- apt-get install -y zip unzip nodejs jsonlint jq
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
53
CHANGELOG.md
53
CHANGELOG.md
@@ -9,7 +9,57 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Add features from the milestone [%1](https://gitlab.com/KevinRoebert/ClearUrls/-/milestones/1)
|
||||
- Dedicated documentation page like [docs.drasyl.org](https://docs.drasyl.org)
|
||||
|
||||
## [1.XX.0] - 20XX-XX-XX
|
||||
## [1.XX.0] - 2022-XX-XX
|
||||
|
||||
### Compatibility note
|
||||
- Require Firefox >= 55
|
||||
- Require Chrome >= 37
|
||||
|
||||
|
||||
## [1.25.0] - 2022-07-27
|
||||
|
||||
### Compatibility note
|
||||
- Require Firefox >= 55
|
||||
- Require Chrome >= 37
|
||||
|
||||
### Changed
|
||||
- ETag filtering now generates random values and does no longer delete the header. As a result, filtering also works under Chrome-based browsers
|
||||
- ETag filtering no longer increases the counter
|
||||
- ETag filtering is now disabled by default
|
||||
- Updated rules URL href
|
||||
- Updated translations. Big update by [IHatePineapples](https://github.com/IHatePineapples)
|
||||
|
||||
### Fixed
|
||||
- [524](https://gitlab.com/KevinRoebert/ClearUrls/-/issues/524)
|
||||
- [67](https://github.com/ClearURLs/Addon/issues/67)
|
||||
- [138](https://github.com/ClearURLs/Addon/issues/138)
|
||||
- [1177](https://gitlab.com/KevinRoebert/ClearUrls/-/issues/1177)
|
||||
- [234](https://github.com/ClearURLs/Addon/issues/234)
|
||||
- [191](https://github.com/ClearURLs/Addon/issues/191)
|
||||
|
||||
## [1.24.1] - 2022-03-25
|
||||
|
||||
### Compatibility note
|
||||
- Require Firefox >= 55
|
||||
- Require Chrome >= 37
|
||||
|
||||
### Changed
|
||||
- Replaced self-written URL parser through `URL` and `URLSearchParams` from the Web API
|
||||
|
||||
### Fixed
|
||||
- Fixed [185](https://github.com/ClearURLs/Addon/issues/185)
|
||||
- Fixed [186](https://github.com/ClearURLs/Addon/issues/186)
|
||||
|
||||
## [1.23.1] - 2022-03-23
|
||||
|
||||
### Compatibility note
|
||||
- Require Firefox >= 55
|
||||
- Require Chrome >= 37
|
||||
|
||||
### Removed
|
||||
- Removed unnecessary `unsafe-eval` content security policy
|
||||
|
||||
## [1.23.0] - 2022-03-22
|
||||
|
||||
### Compatibility note
|
||||
- Require Firefox >= 55
|
||||
@@ -25,6 +75,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
### Changed
|
||||
- Updated `homepage_url` and `author` field in `manifest.json`
|
||||
- Replaced deprecated `String.prototype.substr()` in [!175](https://github.com/ClearURLs/Addon/pull/175). Thanks to [@CommanderRoot](https://github.com/CommanderRoot)
|
||||
|
||||
## [1.22.0] - 2021-12-27
|
||||
|
||||
|
||||
@@ -76,8 +76,9 @@ Please push your translation into the folder `_locales/{language code}/messages.
|
||||
|
||||
* [Uroute](https://github.com/walterl/uroute) used ClearURLs to filter/clean URL before launching browser
|
||||
* [Scrub](https://gitlab.com/CrunchBangDev/cbd-cogs/-/tree/master/Scrub) used ClearURLs to filter/clean URLs as cog for the Red Discord bot
|
||||
* [Unalix](https://github.com/AmanoTeam/Unalix) a simple Python module that removes tracking fields from URLs and unshort shortened URLs
|
||||
* [Unalix-nim](https://github.com/AmanoTeam/Unalix-nim) a simple Nim library that removes tracking fields from URLs and unshort shortened URLs
|
||||
* [Unalix](https://github.com/AmanoTeam/Unalix) small, dependency-free, fast Python package for removing tracking fields from URLs
|
||||
* [Unalix-nim](https://github.com/AmanoTeam/Unalix-nim) small, dependency-free, fast Nim package and CLI tool for removing tracking fields from URLs
|
||||
* [UnalixAndroid](https://github.com/AmanoTeam/UnalixAndroid) simple Android app that removes link masking/tracking and optionally resolves shortened links
|
||||
|
||||
## Recommended by...
|
||||
* [ghacks-user.js](https://github.com/ghacksuserjs/ghacks-user.js/wiki/4.1-Extensions)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"hash_status_code_1": {
|
||||
"message": "à jour",
|
||||
"description": "Les règles ClearURLs sont parfaitement à jour."
|
||||
"description": "Les règles ClearURLs sont à jour."
|
||||
},
|
||||
"hash_status_code_2": {
|
||||
"message": "mis à jour",
|
||||
@@ -9,271 +9,271 @@
|
||||
},
|
||||
"hash_status_code_3": {
|
||||
"message": "mise à jour disponible",
|
||||
"description": "Une mis à jour pour les règles de ClearURLs sont disponibles."
|
||||
"description": "Une mise à jour des règles de ClearURLs est disponible."
|
||||
},
|
||||
"hash_status_code_4": {
|
||||
"message": "erreur",
|
||||
"description": "ClearURLs n’a pas pu démarrer adéquatement pour son bon fonctionnement."
|
||||
"description": "ClearURLs n’a pas pu démarrer correctement."
|
||||
},
|
||||
"hash_status_code_5": {
|
||||
"message": "Quelque chose a dysfonctionné",
|
||||
"description": "Pendant la mis à jour des règles ClearURLs un dysfonctionnement est survenue."
|
||||
"message": "Oh non! Un problème est survenu!",
|
||||
"description": "Un problème est survenu pendant la mis à jour des règles ClearURLs"
|
||||
},
|
||||
"log_redirect": {
|
||||
"message": "Cette URL a été redirigée",
|
||||
"description": "Cette chaîne est utilisée pour les redirections dans le protocole ClearURL."
|
||||
"description": "Cette ligne est pour les redirections par le protocole ClearURL."
|
||||
},
|
||||
"log_domain_blocked": {
|
||||
"message": "Ce domaine est bloqué",
|
||||
"description": "Cette chaîne est utilisée sur les domaines bloqués dans le journal de ClearURLs."
|
||||
"description": "Cette ligne est pour les domaines bloqués dans le journal de ClearURLs."
|
||||
},
|
||||
"check_os_log": {
|
||||
"message": "[ClearURLs]: Une base de données pour les URL a été ajoutée",
|
||||
"description": "Cette chaîne est utilisée au démarrage du journal de ClearURL."
|
||||
"description": "Cette ligne est utilisée au démarrage du journal de ClearURL."
|
||||
},
|
||||
"log_html_page_title": {
|
||||
"message": "Journaux de ClearURLs",
|
||||
"description": "Cette chaîne est utilisée comme en-tête sur la page de journal."
|
||||
"message": "Journal d'événements de ClearURLs",
|
||||
"description": "Cette ligne est utilisée comme en-tête sur la page de journal."
|
||||
},
|
||||
"log_html_table_head_1": {
|
||||
"message": "Avant traitement",
|
||||
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
|
||||
"description": "Cette ligne est utilisée comme titre de tableau sur la page du journal."
|
||||
},
|
||||
"log_html_table_head_2": {
|
||||
"message": "Après traitement. ",
|
||||
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
|
||||
"message": "Après traitement",
|
||||
"description": "Cette ligne est utilisée comme titre de tableau sur la page du journal."
|
||||
},
|
||||
"log_html_table_head_3": {
|
||||
"message": "Règle",
|
||||
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
|
||||
"description": "Cette ligne est utilisée comme titre de tableau sur la page du journal."
|
||||
},
|
||||
"log_html_table_head_4": {
|
||||
"message": "Temps",
|
||||
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
|
||||
"message": "Date",
|
||||
"description": "Cette ligne est utilisée comme titre de tableau sur la page du journal."
|
||||
},
|
||||
"log_html_reset_button": {
|
||||
"message": "Remise à zéro",
|
||||
"description": "Cette chaîne est utilisée comme titre de tableau sur la page de journal."
|
||||
"description": "Cette ligne est utilisée comme titre de tableau sur la page du journal."
|
||||
},
|
||||
"log_html_reset_button_title": {
|
||||
"message": "Réinitialiser les journaux globaux",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le bouton de réinitialisation sur la page de journal."
|
||||
"message": "Réinitialiser entièrement le journal",
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton de réinitialisation sur la page de journal."
|
||||
},
|
||||
"popup_html_configs_head": {
|
||||
"message": "Paramétrages",
|
||||
"description": "Cette chaîne est utilisée comme titre pour les paramétrages sur la page qui affiche les options."
|
||||
"message": "Paramétres",
|
||||
"description": "Cette ligne est utilisée comme titre pour les paramétres de la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_filter": {
|
||||
"message": "Filtre",
|
||||
"description": "Cette chaîne est utilisée comme nom pour le bouton de changement de filtre sur la page qui affiche les options."
|
||||
"description": "Cette ligne est utilisée comme nom pour le bouton de changement de filtre de la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_filter_title": {
|
||||
"message": "Le commutateur de l'extension active ou désactive la fonction de nettoyage de ClearURLs",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le bouton de changement de filtre sur la page qui affiche les options."
|
||||
"message": "L'interrupteur de l'extension active ou désactive la fonction de nettoyage de ClearURLs",
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton de changement de filtre sur la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_log": {
|
||||
"message": "Journalisation",
|
||||
"description": "Cette chaîne est utilisée comme nom pour le bouton du commutateur de journalisation sur la page qui affiche les options."
|
||||
"description": "Cette ligne est utilisée comme nom pour le bouton du interrupteur de journalisation d'evenements sur la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_log_title": {
|
||||
"message": "Les journaux sont enregistrés localement. Si vous n’avez pas besoin de les consulter, nous déconseillons de les activer",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le bouton du commutateur de journalisation sur la page qui affiche les options."
|
||||
"message": "Le journal est sauvé localement. Si vous n’avez pas besoin de le consulter, nous vous déconseillons de l'activer.",
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton du interrupteur de journalisation sur la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_badges": {
|
||||
"message": "Compteur",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_configs_switch_badges_title": {
|
||||
"message": "Afficher le nombre d'URL nettoyées",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_head": {
|
||||
"message": "Statistiques",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_elements": {
|
||||
"message": "Éléments",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_blocked": {
|
||||
"message": "Nb. de bloqués",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_percentage": {
|
||||
"message": "Pourcentage",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_reset_button": {
|
||||
"message": "Remettre à zéro",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_statistics_reset_button_title": {
|
||||
"message": "Remettre à zéro les statistiques globales",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_rules_status_head": {
|
||||
"message": "Règles de la base de données",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_log_head": {
|
||||
"message": "Journaux",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Journal",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_log_head_title": {
|
||||
"message": "Ouvrir les journaux",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Consulter le journal",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"popup_html_report_button": {
|
||||
"message": "Signaler cette URL",
|
||||
"description": "Annotation : actuellement non utilisé."
|
||||
},
|
||||
"popup_html_report_button_title": {
|
||||
"message": "Signaler un dysfonctionnement sur cette URL",
|
||||
"message": "Signaler un problème sur cette URL",
|
||||
"description": "actuellement non utilisé."
|
||||
},
|
||||
"core_save_on_disk": {
|
||||
"message": "[ClearURLs]: Sauvegarder sur le disque.",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"core_error": {
|
||||
"message": "[ClearURLs]: L’extension n’a pu être démarrée.",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "[ClearURLs]: L’extension n’a pas pu démarrer.",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"configs_switch_statistics": {
|
||||
"message": "Statistiques",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"configs_switch_statistics_title": {
|
||||
"message": "Activer ou désactiver les statistiques",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la descriptio de la fonction sur la page des options."
|
||||
},
|
||||
"settings_html_page_title": {
|
||||
"message": "Paramétrages de ClearURLs",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"badged_color_label": {
|
||||
"message": "Couleur du compteur",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_html_reset_button": {
|
||||
"message": "Remettre à l’état initial",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_html_reset_button_title": {
|
||||
"message": "Réinitialisation de tous les paramètres",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_rule_url_label": {
|
||||
"message": "L'URL du fichier data.json (règles)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"settings_html_save_button": {
|
||||
"message": "Sauvegarder et redémarrer l’extension",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"settings_html_save_button_title": {
|
||||
"message": "Sauvegarde les paramétrages",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Sauvegarde les paramétres",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_hash_url_label": {
|
||||
"message": "L'URL du fichier rules.hash (signature de contrôle)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_types_label": {
|
||||
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Types de requête (webRequest)</a> (niveau expert)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_report_server_label": {
|
||||
"message": "Serveur pour signaler des URL",
|
||||
"description": "Annotation : actuellement non utilisé."
|
||||
"description": "Note : actuellement non utilisé."
|
||||
},
|
||||
"success_report_url": {
|
||||
"message": "Nous avons reçu votre signalement. Nous allons vérifier cette URL.",
|
||||
"description": "Annotation : actuellement non utilisé."
|
||||
"description": "Note : actuellement non utilisé."
|
||||
},
|
||||
"error_report_url": {
|
||||
"message": "Il semble que cette URL a déjà été signalée.",
|
||||
"description": "Annotation : actuellement non utilisé."
|
||||
"message": "Il semble que cette URL a déjà été signalé.",
|
||||
"description": "Note : actuellement non utilisé."
|
||||
},
|
||||
"donate_button": {
|
||||
"message": "Subventionner le créateur de ClearURLs.",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Soutenir le créateur de ClearURLs.",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"clipboard_copy_link": {
|
||||
"message": "Copier l’URL sans le traqueur",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Copier l’URL sans les traqueurs",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"context_menu_enabled": {
|
||||
"message": "Activer ClearUrls dans le menu contextuel (le clic droit sur une page)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"history_listener_enabled": {
|
||||
"message": "Empêcher les sites d’aller fouiner dans l'historique. (<a href='https://developer.mozilla.org/fr/docs/Web/Guide/DOM/Manipuler_historique_du_navigateur' target='_blank'>La méthode utilisée est replaceState()</a>)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"cleaning_tool_page_title": {
|
||||
"message": "Outil de nettoyage pour ClearURLs",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"cleaning_tool_description": {
|
||||
"message": "Ici, vous pouvez déposer des URL et ClearURLs les nettoiera par un clic sur le bouton vert. Vous pouvez mettre plusieurs URL mais chaque URL devra être mise sur une ligne séparée.",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"cleaning_tool_btn": {
|
||||
"message": "Nettoyer les URL",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"cleaning_tool_dirty_urls_label": {
|
||||
"message": "Coller ici les URL à nettoyer :",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"cleaning_tool_clean_urls_label": {
|
||||
"message": "Vous trouverez ici les URL nettoyées :",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"local_hosts_skipping": {
|
||||
"message": "Ignorer les IP sur les hôtes locaux, Box, routeur, serveur, etc. (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Ignorer les IP des hôtes locaux, Box, routeurs, serveurs, etc. (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/10, 169.254.0.0/16, 127.0.0.1, localhost)",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"local_hosts_skipping_title": {
|
||||
"message": "Ignorer les IP ou URL sur les hôtes locaux, Box, routeur, serveur ...",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"log_html_export_button": {
|
||||
"message": "Exporter",
|
||||
"description": "Cette chaîne est utilisée pour le bouton d'exportation sur la page du journal."
|
||||
"description": "Cette ligne est utilisée pour le bouton d'exportation sur la page du journal."
|
||||
},
|
||||
"log_html_export_button_title": {
|
||||
"message": "Exporter le journal",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le bouton d'exportation de la page du journal."
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton d'exportation de la page du journal."
|
||||
},
|
||||
"log_html_import_button": {
|
||||
"message": "Importer",
|
||||
"description": "Cette chaîne est utilisée pour le bouton d'importation sur la page de journal."
|
||||
"description": "Cette ligne est utilisée pour le bouton d'importation sur la page de journal."
|
||||
},
|
||||
"log_html_import_button_title": {
|
||||
"message": "Importer le journal",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le bouton d'importation sur la page de journal."
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton d'importation sur la page de journal."
|
||||
},
|
||||
"setting_html_export_button": {
|
||||
"message": "Exporter",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_html_export_button_title": {
|
||||
"message": "Tout exporter",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_html_import_button": {
|
||||
"message": "Importer",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_html_import_button_title": {
|
||||
"message": "Tout importer",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"setting_log_limit_label": {
|
||||
"message": "Nombre d’éléments à enregistrer dans le journal, $LIMIT$ de -1 à l’infini",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options.",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options.",
|
||||
"placeholders": {
|
||||
"limit": {
|
||||
"content": "$1",
|
||||
@@ -283,27 +283,27 @@
|
||||
},
|
||||
"blocked_html_title": {
|
||||
"message": "Site Internet bloqué par <b>ClearURLs</b>",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"blocked_html_body": {
|
||||
"message": "Ce site Internet a été bloqué par l’extension <b>ClearURLs</b> ; il est identifié comme étant problématique, soit publicitaire, soit d’espionnage ; vous pouvez désactiver temporairement le blocage du site dans les paramétrages, soit l’extension, afin de vous y connecter. Il vous faudra recharger la page, soit par le navigateur, soit avec le bouton ci-dessous.",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Ce site Internet a été bloqué par l’extension <b>ClearURLs</b> ; il est identifié comme étant problématique, soit publicitaire, soit d’espionnage ; vous pouvez désactiver temporairement le blocage du site soit dans les paramétres, soit dans l’extension afin de vous y connecter. Il vous faudra raffraichir la page, soit par le navigateur, soit avec le bouton ci-dessous.",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"blocked_html_button": {
|
||||
"message": "Se connecter",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"referral_marketing_enabled": {
|
||||
"message": "Permettre certaines actions commerciales",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"referral_marketing_enabled_title": {
|
||||
"message": "Permettre certaines actions commerciales",
|
||||
"description": "Sert à afficher la signification de la fonction sur la switch"
|
||||
"description": "Sert à afficher la description de la fonction sur la switch."
|
||||
},
|
||||
"watchdog": {
|
||||
"message": "[ClearURLs]: Watchdog, très petit programme qui surveille les attaques de la mémoire vive, a détecté $TIMES$ problème(s)",
|
||||
"description": "Utilisé pour un texte explicatif du Watchdog",
|
||||
"description": "Utilisé pour la description du Watchdog.",
|
||||
"placeholders": {
|
||||
"times": {
|
||||
"content": "$1",
|
||||
@@ -312,40 +312,40 @@
|
||||
}
|
||||
},
|
||||
"domain_blocking_enabled": {
|
||||
"message": "Bloquer les atteintes à la vie privée. Cependant, des sites décèlent la technique de protection et dysfonctionnent délibérément ou affichent des avertissements",
|
||||
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
|
||||
"message": "Bloquer les atteintes à la vie privée. Cependant, des sites peuvent detecter cette technique et refuser de marcher délibérément voire même afficher des avertissements",
|
||||
"description": "Sert à afficher la description de la fonction sur la page des options."
|
||||
},
|
||||
"domain_blocking_enabled_title": {
|
||||
"message": "Autoriser le blocage de domaine (ex : example.com) ; peut poser des problèmes d'affichage sur des sites refusant les bloqueurs de contenu",
|
||||
"description": "Cette chaîne est utilisée comme titre pour le commutateur de blocage de domaine"
|
||||
"message": "Autoriser le blocage par domaine (ex : example.com) ; peut poser des problèmes d'affichage sur des sites refusant les bloqueurs de contenu",
|
||||
"description": "Cette ligne est utilisée comme titre pour le bouton de blocage de domaine."
|
||||
},
|
||||
"log_ping_blocked": {
|
||||
"message": "Bloquer l’espionnage des clics souris sur les liens hypertextes",
|
||||
"description": "Cette chaîne est utilisée pour de l'audit (espionnage) des liens hypertextes dans le journal ClearURLs."
|
||||
"message": "Bloquer l'audit des clics souris sur les liens hypertextes",
|
||||
"description": "Cette ligne est utilisée pour de l'audit (espionnage) des liens hypertextes dans le journal ClearURLs."
|
||||
},
|
||||
"ping_blocking_enabled": {
|
||||
"message": "Bloquer l’espionnage des clics souris sur les liens hypertextes (voyez <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>cet article en anglais</a>)",
|
||||
"description": "Utilisé pour le bouton activer/désactiver l'audit (espionnages) des liens hypertextes"
|
||||
"message": "Bloquer l'audit des clics souris sur les liens hypertextes (voyez <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>cet article en anglais</a>)",
|
||||
"description": "Utilisé pour le bouton activer/désactiver l'audit (espionnages) des liens hypertextes."
|
||||
},
|
||||
"ping_blocking_enabled_title": {
|
||||
"message": "Bloquer l’espionnage auditing",
|
||||
"description": "Utilisé comme titre pour le bouton, commutateur, de l’audit des liens hypertextes"
|
||||
"message": "Bloquer l’espionnage par audit",
|
||||
"description": "Utilisé comme titre pour le bouton de l’audit des liens hypertextes."
|
||||
},
|
||||
"extension_description": {
|
||||
"message": "Retirer les espions dans les adresses Internet.",
|
||||
"description": "Description des fonctions ; utilisez au maximum 132 caractères."
|
||||
"message": "Retirer les traqueurs dans les adresses Internet.",
|
||||
"description": "Description des fonctions ; utilisez maximum 132 caractères."
|
||||
},
|
||||
"eTag_filtering_log": {
|
||||
"message": "L’identification ETag a été supprimée",
|
||||
"description": "Utilisé pour le journal de ClearUrls et indiquer ce qui a été nettoyé"
|
||||
"description": "Utilisé par le journal de ClearUrls et indiquer ce qui a été nettoyé"
|
||||
},
|
||||
"eTag_filtering_enabled": {
|
||||
"message": "Filtrer ETag ; les sites mettent dans le cache du Navigateur, ou Système d’Exploitation, un identifiant pour vous pister",
|
||||
"description": "Titre pour le bouton de filtrage ETag"
|
||||
"message": "Filtrer ETag ; les sites mettent dans le cache du Navigateur, ou Système d’Exploitation, un identifiant pour vous espionner",
|
||||
"description": "Titre par le bouton de filtrage ETag"
|
||||
},
|
||||
"eTag_filtering_enabled_title": {
|
||||
"message": "Filtre les identifications ETag, mais pour la première utilisation, veuillez vider le cache",
|
||||
"description": "Titre pour le bouton de filtrage ETag"
|
||||
"message": "Filtre les identifications ETag, vous devez vider le cache lors de la premiere utilisation",
|
||||
"description": "Titre par le bouton de filtrage ETag"
|
||||
},
|
||||
"popup_html_rules_status_head_title": {
|
||||
"message": " ",
|
||||
@@ -375,4 +375,4 @@
|
||||
"message": " ",
|
||||
"description": "pas nécessaire, seulement pour éviter les exceptions"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
148
clearurls.js
148
clearurls.js
@@ -44,10 +44,10 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
|
||||
let fields = "";
|
||||
let rules = provider.getRules();
|
||||
let changes = false;
|
||||
let cancel = false;
|
||||
let rawRules = provider.getRawRules();
|
||||
let urlObject = new URL(url);
|
||||
|
||||
if (storage.localHostsSkipping && checkLocalURL(pureUrl)) {
|
||||
if (storage.localHostsSkipping && checkLocalURL(urlObject)) {
|
||||
return {
|
||||
"changes": false,
|
||||
"url": url,
|
||||
@@ -55,6 +55,37 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Expand the url by provider redirections. So no tracking on
|
||||
* url redirections form sites to sites.
|
||||
*/
|
||||
let re = provider.getRedirection(url);
|
||||
if (re !== null) {
|
||||
url = decodeURL(re);
|
||||
|
||||
//Log the action
|
||||
if (!quiet) {
|
||||
pushToLog(pureUrl, url, translate('log_redirect'));
|
||||
increaseTotalCounter(1);
|
||||
increaseBadged(false, request)
|
||||
}
|
||||
|
||||
return {
|
||||
"redirect": true,
|
||||
"url": url
|
||||
}
|
||||
}
|
||||
|
||||
if (provider.isCaneling() && storage.domainBlocking) {
|
||||
if (!quiet) pushToLog(pureUrl, pureUrl, translate('log_domain_blocked'));
|
||||
increaseTotalCounter(1);
|
||||
increaseBadged(quiet, request);
|
||||
return {
|
||||
"cancel": true,
|
||||
"url": url
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Apply raw rules to the URL.
|
||||
*/
|
||||
@@ -73,90 +104,65 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
|
||||
}
|
||||
});
|
||||
|
||||
if (existsFragments(url)) {
|
||||
domain = url.replace(new RegExp("#.*", "i"), "");
|
||||
}
|
||||
if (existsFields(url)) {
|
||||
domain = url.replace(new RegExp("\\?.*", "i"), "");
|
||||
}
|
||||
|
||||
/*
|
||||
* Expand the url by provider redirections. So no tracking on
|
||||
* url redirections form sites to sites.
|
||||
*/
|
||||
let re = provider.getRedirection(url);
|
||||
if (re !== null) {
|
||||
url = decodeURL(re);
|
||||
|
||||
//Log the action
|
||||
if (!quiet) {
|
||||
pushToLog(pureUrl, url, translate('log_redirect'));
|
||||
increaseGlobalURLCounter(1);
|
||||
increaseBadged(false, request)
|
||||
}
|
||||
|
||||
return {
|
||||
"redirect": true,
|
||||
"url": url
|
||||
}
|
||||
}
|
||||
|
||||
if (existsFields(url)) {
|
||||
fields = "?" + extractFileds(url).rmEmpty().join("&");
|
||||
}
|
||||
|
||||
if (existsFragments(url)) {
|
||||
fragments = "#" + extractFragments(url).rmEmpty().join("&");
|
||||
}
|
||||
urlObject = new URL(url);
|
||||
fields = urlObject.searchParams;
|
||||
fragments = extractFragments(urlObject);
|
||||
domain = urlWithoutParamsAndHash(urlObject).toString();
|
||||
|
||||
/**
|
||||
* Only test for matches, if there are fields or fragments that can be cleaned.
|
||||
*/
|
||||
if (fields !== "" || fragments !== "") {
|
||||
rules.forEach(function (rule) {
|
||||
let beforeReplace = fields;
|
||||
let beforeReplaceFragments = fragments;
|
||||
fields = fields.replace(new RegExp(rule, "gi"), "");
|
||||
fragments = fragments.replace(new RegExp(rule, "gi"), "");
|
||||
if (fields.toString() !== "" || fragments.toString() !== "") {
|
||||
rules.forEach(rule => {
|
||||
const beforeFields = fields.toString();
|
||||
const beforeFragments = fragments.toString();
|
||||
let localChange = false;
|
||||
|
||||
if (beforeReplace !== fields || beforeReplaceFragments !== fragments) {
|
||||
//Log the action
|
||||
if (storage.loggingStatus) {
|
||||
let tempURL = domain;
|
||||
let tempBeforeURL = domain;
|
||||
|
||||
if (fields !== "") tempURL += "?" + fields.replace("?&", "?").replace("?", "");
|
||||
if (fragments !== "") tempURL += "#" + fragments.replace("#&", "#").replace("#", "");
|
||||
if (beforeReplace !== "") tempBeforeURL += "?" + beforeReplace.replace("?&", "?").replace("?", "");
|
||||
if (beforeReplaceFragments !== "") tempBeforeURL += "#" + beforeReplaceFragments.replace("#&", "#").replace("#", "");
|
||||
|
||||
if (!quiet) pushToLog(tempBeforeURL, tempURL, rule);
|
||||
for (const field of fields.keys()) {
|
||||
if (new RegExp("^"+rule+"$", "gi").test(field)) {
|
||||
fields.delete(field);
|
||||
changes = true;
|
||||
localChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (const fragment of fragments.keys()) {
|
||||
if (new RegExp("^"+rule+"$", "gi").test(fragment)) {
|
||||
fragments.delete(fragment);
|
||||
changes = true;
|
||||
localChange = true;
|
||||
}
|
||||
}
|
||||
|
||||
//Log the action
|
||||
if (localChange && storage.loggingStatus) {
|
||||
let tempURL = domain;
|
||||
let tempBeforeURL = domain;
|
||||
|
||||
if (fields.toString() !== "") tempURL += "?" + fields.toString();
|
||||
if (fragments.toString() !== "") tempURL += "#" + fragments.toString();
|
||||
if (beforeFields.toString() !== "") tempBeforeURL += "?" + beforeFields.toString();
|
||||
if (beforeFragments.toString() !== "") tempBeforeURL += "#" + beforeFragments.toString();
|
||||
|
||||
if (!quiet) pushToLog(tempBeforeURL, tempURL, rule);
|
||||
|
||||
increaseBadged(quiet, request);
|
||||
changes = true;
|
||||
}
|
||||
});
|
||||
|
||||
let finalURL = domain;
|
||||
|
||||
if (fields !== "") finalURL += "?" + fields.replace("?", "");
|
||||
if (fragments !== "") finalURL += "#" + fragments.replace("#", "");
|
||||
if (fields.toString() !== "") finalURL += "?" + fields.toString();
|
||||
if (fragments.toString() !== "") finalURL += "#" + fragments.toString();
|
||||
|
||||
url = finalURL.replace(new RegExp("\\?&"), "?").replace(new RegExp("#&"), "#");
|
||||
}
|
||||
|
||||
if (provider.isCaneling() && storage.domainBlocking) {
|
||||
if (!quiet) pushToLog(pureUrl, pureUrl, translate('log_domain_blocked'));
|
||||
increaseGlobalURLCounter(1);
|
||||
increaseBadged(quiet, request);
|
||||
cancel = true;
|
||||
}
|
||||
|
||||
|
||||
return {
|
||||
"changes": changes,
|
||||
"url": url,
|
||||
"cancel": cancel
|
||||
"url": url
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +246,7 @@ function start() {
|
||||
* Deactivates ClearURLs, if no rules can be downloaded and also no old rules in storage
|
||||
*/
|
||||
function deactivateOnFailure() {
|
||||
if(storage.ClearURLsData.length === 0) {
|
||||
if (storage.ClearURLsData.length === 0) {
|
||||
storage.globalStatus = false;
|
||||
storage.dataHash = "";
|
||||
changeIcon();
|
||||
@@ -430,8 +436,6 @@ function start() {
|
||||
* @param {boolean} isActive Is this rule active?
|
||||
*/
|
||||
this.addRule = function (rule, isActive = true) {
|
||||
rule = "([\\/\\?#]|(&|&))+(" + rule + "=[^&]*)";
|
||||
|
||||
this.applyRule(enabled_rules, disabled_rules, rule, isActive);
|
||||
};
|
||||
|
||||
@@ -476,8 +480,6 @@ function start() {
|
||||
* @param {boolean} isActive Is this rule active?
|
||||
*/
|
||||
this.addReferralMarketing = function (rule, isActive = true) {
|
||||
rule = "([\\/\\?#]|(&|&))+(" + rule + "=[^&]*)";
|
||||
|
||||
this.applyRule(enabled_referralMarketing, disabled_referralMarketing, rule, isActive);
|
||||
};
|
||||
|
||||
@@ -607,7 +609,7 @@ function start() {
|
||||
const URLbeforeReplaceCount = countFields(request.url);
|
||||
|
||||
//Add Fields form Request to global url counter
|
||||
increaseGlobalURLCounter(URLbeforeReplaceCount);
|
||||
increaseTotalCounter(URLbeforeReplaceCount);
|
||||
|
||||
if (storage.globalStatus) {
|
||||
let result = {
|
||||
@@ -620,7 +622,7 @@ function start() {
|
||||
if (storage.pingBlocking && storage.pingRequestTypes.includes(request.type)) {
|
||||
pushToLog(request.url, request.url, translate('log_ping_blocked'));
|
||||
increaseBadged(false, request);
|
||||
increaseGlobalURLCounter(1);
|
||||
increaseTotalCounter(1);
|
||||
return {cancel: true};
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ let badges = {};
|
||||
* Increases the badged by one.
|
||||
*/
|
||||
function increaseBadged(quiet = false, request) {
|
||||
if (!quiet) increaseURLCounter();
|
||||
if (!quiet) increaseCleanedCounter();
|
||||
|
||||
if(request === null) return;
|
||||
|
||||
@@ -74,4 +74,4 @@ function handleUpdated(tabId, changeInfo, tabInfo) {
|
||||
/**
|
||||
* Call by each tab is updated.
|
||||
*/
|
||||
browser.tabs.onUpdated.addListener(handleUpdated);
|
||||
browser.tabs.onUpdated.addListener(handleUpdated);
|
||||
|
||||
@@ -23,24 +23,31 @@
|
||||
*/
|
||||
function eTagFilter(requestDetails) {
|
||||
if(!requestDetails.responseHeaders || !storage.eTagFiltering
|
||||
|| storage.localHostsSkipping && checkLocalURL(requestDetails.url)) return {};
|
||||
const responseHeaders = requestDetails.responseHeaders;
|
||||
|| storage.localHostsSkipping && checkLocalURL(new URL(requestDetails.url))) return {};
|
||||
for(let i=0; i < requestDetails.responseHeaders.length; i++) {
|
||||
const header = requestDetails.responseHeaders[i];
|
||||
|
||||
const filteredHeaders = responseHeaders.filter(header => {
|
||||
return header.name.toLowerCase() !== "etag";
|
||||
});
|
||||
if(header.name.toString().toLowerCase() !== "etag") {
|
||||
continue;
|
||||
}
|
||||
|
||||
// insert dummy etag
|
||||
requestDetails.responseHeaders[i].value = generateDummyEtag();
|
||||
|
||||
if(filteredHeaders.length < responseHeaders.length) {
|
||||
pushToLog(requestDetails.url, requestDetails.url, translate("eTag_filtering_log"));
|
||||
increaseBadged(false, requestDetails);
|
||||
increaseGlobalURLCounter(1);
|
||||
|
||||
return {responseHeaders: filteredHeaders};
|
||||
break;
|
||||
}
|
||||
|
||||
return {responseHeaders: requestDetails.responseHeaders};
|
||||
}
|
||||
|
||||
function generateDummyEtag() {
|
||||
return Math.random().toString();
|
||||
}
|
||||
|
||||
browser.webRequest.onHeadersReceived.addListener(
|
||||
eTagFilter,
|
||||
{urls: ["<all_urls>"]},
|
||||
["blocking", "responseHeaders"]
|
||||
);
|
||||
);
|
||||
|
||||
@@ -23,8 +23,8 @@ var elProgressbar_blocked = document.getElementById('progress_blocked');
|
||||
var elProgressbar_non_blocked = document.getElementById('progress_non_blocked');
|
||||
var elTotal = document.getElementById('statistics_total_elements');
|
||||
var globalPercentage = 0;
|
||||
var globalCounter;
|
||||
var globalurlcounter;
|
||||
var cleanedCounter;
|
||||
var totalCounter;
|
||||
var globalStatus;
|
||||
var badgedStatus;
|
||||
var hashStatus;
|
||||
@@ -47,19 +47,19 @@ function init()
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the globalCounter and globalurlcounter value from the storage
|
||||
* Get the cleanedCounter and totalCounter value from the storage
|
||||
*/
|
||||
function changeStatistics()
|
||||
{
|
||||
globalPercentage = ((globalCounter/globalurlcounter)*100).toFixed(3);
|
||||
globalPercentage = ((cleanedCounter/totalCounter)*100).toFixed(3);
|
||||
|
||||
if(isNaN(Number(globalPercentage))) globalPercentage = 0;
|
||||
|
||||
element.textContent = globalCounter.toLocaleString();
|
||||
element.textContent = cleanedCounter.toLocaleString();
|
||||
elGlobalPercentage.textContent = globalPercentage+"%";
|
||||
elProgressbar_blocked.style.width = globalPercentage+'%';
|
||||
elProgressbar_non_blocked.style.width = (100-globalPercentage)+'%';
|
||||
elTotal.textContent = globalurlcounter.toLocaleString();
|
||||
elTotal.textContent = totalCounter.toLocaleString();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -161,12 +161,12 @@ function setSwitchButton(id, varname)
|
||||
function resetGlobalCounter(){
|
||||
browser.runtime.sendMessage({
|
||||
function: "setData",
|
||||
params: ['globalCounter', 0]
|
||||
params: ['cleanedCounter', 0]
|
||||
}).catch(handleError);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
function: "setData",
|
||||
params: ['globalurlcounter', 0]
|
||||
params: ['totalCounter', 0]
|
||||
}).catch(handleError);
|
||||
|
||||
browser.runtime.sendMessage({
|
||||
@@ -174,15 +174,15 @@ function resetGlobalCounter(){
|
||||
params: []
|
||||
}).catch(handleError);
|
||||
|
||||
globalCounter = 0;
|
||||
globalurlcounter = 0;
|
||||
cleanedCounter = 0;
|
||||
totalCounter = 0;
|
||||
|
||||
changeStatistics();
|
||||
}
|
||||
|
||||
(function() {
|
||||
loadData("globalCounter")
|
||||
.then(() => loadData("globalurlcounter"))
|
||||
loadData("cleanedCounter")
|
||||
.then(() => loadData("totalCounter"))
|
||||
.then(() => loadData("globalStatus"))
|
||||
.then(() => loadData("badgedStatus"))
|
||||
.then(() => loadData("hashStatus"))
|
||||
|
||||
@@ -46,7 +46,7 @@ function _cleaning(url, quiet = false) {
|
||||
|
||||
if (!quiet) {
|
||||
//Add Fields form Request to global url counter
|
||||
increaseGlobalURLCounter(URLbeforeReplaceCount);
|
||||
increaseTotalCounter(URLbeforeReplaceCount);
|
||||
}
|
||||
|
||||
for (let i = 0; i < providers.length; i++) {
|
||||
|
||||
@@ -63,6 +63,13 @@ function storageDataAsString(key) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete key from browser storage.
|
||||
*/
|
||||
function deleteFromDisk(key) {
|
||||
browser.storage.local.remove(key).catch(handleError);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save multiple keys on the disk.
|
||||
* @param {String[]} keys
|
||||
@@ -159,6 +166,20 @@ function setData(key, value) {
|
||||
case "logLimit":
|
||||
storage[key] = Math.max(0, Number(value));
|
||||
break;
|
||||
case "globalurlcounter":
|
||||
// migrate from old key
|
||||
storage["totalCounter"] = value;
|
||||
delete storage[key];
|
||||
deleteFromDisk(key);
|
||||
saveOnExit();
|
||||
break;
|
||||
case "globalCounter":
|
||||
// migrate from old key
|
||||
storage["cleanedCounter"] = value;
|
||||
delete storage[key];
|
||||
deleteFromDisk(key);
|
||||
saveOnExit();
|
||||
break;
|
||||
default:
|
||||
storage[key] = value;
|
||||
}
|
||||
@@ -186,8 +207,8 @@ function initSettings() {
|
||||
storage.dataHash = "";
|
||||
storage.badgedStatus = true;
|
||||
storage.globalStatus = true;
|
||||
storage.globalurlcounter = 0;
|
||||
storage.globalCounter = 0;
|
||||
storage.totalCounter = 0;
|
||||
storage.cleanedCounter = 0;
|
||||
storage.hashStatus = "error";
|
||||
storage.loggingStatus = false;
|
||||
storage.log = {"log": []};
|
||||
@@ -202,7 +223,7 @@ function initSettings() {
|
||||
storage.logLimit = 100;
|
||||
storage.domainBlocking = true;
|
||||
storage.pingBlocking = true;
|
||||
storage.eTagFiltering = true;
|
||||
storage.eTagFiltering = false;
|
||||
storage.watchDogErrorCount = 0;
|
||||
|
||||
if (getBrowser() === "Firefox") {
|
||||
|
||||
110
core_js/tools.js
110
core_js/tools.js
@@ -56,8 +56,7 @@ function isEmpty(obj) {
|
||||
* @param {string} string Name of the attribute used for localization
|
||||
* @param {string[]} placeholders Array of placeholders
|
||||
*/
|
||||
function translate(string, ...placeholders)
|
||||
{
|
||||
function translate(string, ...placeholders) {
|
||||
return browser.i18n.getMessage(string, placeholders);
|
||||
}
|
||||
|
||||
@@ -84,24 +83,22 @@ async function checkOSAndroid() {
|
||||
|
||||
/**
|
||||
* Extract the host without port from an url.
|
||||
* @param {String} url URL as String
|
||||
* @param {URL} url URL as String
|
||||
* @return {String} host as string
|
||||
*/
|
||||
function extractHost(url) {
|
||||
let parsed_url = new URL(url);
|
||||
|
||||
return parsed_url.hostname;
|
||||
return url.hostname;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if the url has a local host.
|
||||
* @param {String} url URL as String
|
||||
* @param {URL} url URL as object
|
||||
* @return {boolean}
|
||||
*/
|
||||
function checkLocalURL(url) {
|
||||
let host = extractHost(url);
|
||||
|
||||
if(!host.match(/^\d/) && host !== 'localhost') {
|
||||
if (!host.match(/^\d/) && host !== 'localhost') {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -117,72 +114,35 @@ function checkLocalURL(url) {
|
||||
* @return {int} Number of Parameters
|
||||
*/
|
||||
function countFields(url) {
|
||||
return extractFileds(url).length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if fields exists.
|
||||
* @param {String} url URL as String
|
||||
* @return {boolean}
|
||||
*/
|
||||
function existsFields(url) {
|
||||
let matches = (url.match(/\?.+/i) || []);
|
||||
let count = matches.length;
|
||||
|
||||
return (count > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the fields from an url.
|
||||
* @param {String} url URL as String
|
||||
* @return {Array} Fields as array
|
||||
*/
|
||||
function extractFileds(url) {
|
||||
if (existsFields(url)) {
|
||||
let fields = url.replace(new RegExp(".*?\\?", "i"), "");
|
||||
if (existsFragments(url)) {
|
||||
fields = fields.replace(new RegExp("#.*", "i"), "");
|
||||
}
|
||||
|
||||
return (fields.match(/[^\/|\?|&]+=?[^&]*/gi) || []);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of fragments query strings.
|
||||
* @param {String} url URL as String
|
||||
* @return {int} Number of fragments
|
||||
*/
|
||||
function countFragments(url) {
|
||||
return extractFragments(url).length;
|
||||
return [...new URL(url).searchParams].length
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract the fragments from an url.
|
||||
* @param {String} url URL as String
|
||||
* @return {Array} fragments as array
|
||||
* @param {URL} url URL as object
|
||||
* @return {URLHashParams} fragments as URLSearchParams object
|
||||
*/
|
||||
function extractFragments(url) {
|
||||
if (existsFragments(url)) {
|
||||
let fragments = url.replace(new RegExp(".*?#", "i"), "");
|
||||
return (fragments.match(/[^&]+=?[^&]*/gi) || []);
|
||||
}
|
||||
|
||||
return [];
|
||||
return new URLHashParams(url)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if fragments exists.
|
||||
* @param {String} url URL as String
|
||||
* @return {boolean}
|
||||
* Returns the given URL without searchParams and hash.
|
||||
* @param {URL} url the URL as object
|
||||
* @return {URL} the url without searchParams and hash
|
||||
*/
|
||||
function existsFragments(url) {
|
||||
let matches = (url.match(/\#.+/i) || []);
|
||||
let count = matches.length;
|
||||
function urlWithoutParamsAndHash(url) {
|
||||
let newURL = url.toString();
|
||||
|
||||
return (count > 0);
|
||||
if (url.search) {
|
||||
newURL = newURL.replace(url.search, "");
|
||||
}
|
||||
|
||||
if (url.hash) {
|
||||
newURL = newURL.replace(url.hash, "");
|
||||
}
|
||||
|
||||
return new URL(newURL);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -194,23 +154,23 @@ function loadOldDataFromStore() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Increase by {number} the GlobalURLCounter
|
||||
* Increase by {number} the total counter
|
||||
* @param {int} number
|
||||
*/
|
||||
function increaseGlobalURLCounter(number) {
|
||||
function increaseTotalCounter(number) {
|
||||
if (storage.statisticsStatus) {
|
||||
storage.globalurlcounter += number;
|
||||
deferSaveOnDisk('globalurlcounter');
|
||||
storage.totalCounter += number;
|
||||
deferSaveOnDisk('totalCounter');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Increase by one the URLCounter
|
||||
* Increase by one the cleaned counter
|
||||
*/
|
||||
function increaseURLCounter() {
|
||||
function increaseCleanedCounter() {
|
||||
if (storage.statisticsStatus) {
|
||||
storage.globalCounter++;
|
||||
deferSaveOnDisk('globalCounter');
|
||||
storage.cleanedCounter++;
|
||||
deferSaveOnDisk('cleanedCounter');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -283,13 +243,13 @@ function getBrowser() {
|
||||
function decodeURL(url) {
|
||||
let rtn = decodeURIComponent(url);
|
||||
|
||||
while(isEncodedURI(rtn)) {
|
||||
while (isEncodedURI(rtn)) {
|
||||
rtn = decodeURIComponent(rtn);
|
||||
}
|
||||
|
||||
// Required (e.g., to fix https://github.com/ClearURLs/Addon/issues/71)
|
||||
if(rtn.substr(0, 4) !== 'http') {
|
||||
rtn = 'http://'+rtn
|
||||
if (!rtn.startsWith('http')) {
|
||||
rtn = 'http://' + rtn
|
||||
}
|
||||
|
||||
return rtn;
|
||||
@@ -367,4 +327,4 @@ async function sha256(message) {
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||
|
||||
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
}
|
||||
|
||||
21
core_js/utils/Multimap.d.ts
vendored
Normal file
21
core_js/utils/Multimap.d.ts
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Models a multimap backed by a {@link Set}.
|
||||
*/
|
||||
export default class Multimap<K, V> implements Iterable<[K, V]> {
|
||||
private _map;
|
||||
private _size;
|
||||
constructor();
|
||||
get size(): number;
|
||||
get(key: K): Set<V>;
|
||||
put(key: K, value: V): boolean;
|
||||
has(key: K): boolean;
|
||||
hasEntry(key: K, value: V): boolean;
|
||||
delete(key: K): boolean;
|
||||
deleteEntry(key: K, value: V): boolean;
|
||||
clear(): void;
|
||||
entries(): IterableIterator<[K, V]>;
|
||||
values(): IterableIterator<V>;
|
||||
keys(): IterableIterator<K>;
|
||||
forEach<T>(callback: (this: T | this, key: K, value: V, map: this) => void, thisArg?: T): void;
|
||||
[Symbol.iterator](): IterableIterator<[K, V]>;
|
||||
}
|
||||
130
core_js/utils/Multimap.js
Normal file
130
core_js/utils/Multimap.js
Normal file
@@ -0,0 +1,130 @@
|
||||
"use strict";
|
||||
/*
|
||||
* ClearURLs
|
||||
* Copyright (c) 2017-2022 Kevin Röbert.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Models a multimap backed by a {@link Set}.
|
||||
*/
|
||||
class Multimap {
|
||||
constructor() {
|
||||
Object.defineProperty(this, "_map", {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: void 0
|
||||
});
|
||||
Object.defineProperty(this, "_size", {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: void 0
|
||||
});
|
||||
this._size = 0;
|
||||
this._map = new Map();
|
||||
}
|
||||
get size() {
|
||||
return this._size;
|
||||
}
|
||||
get(key) {
|
||||
const values = this._map.get(key);
|
||||
if (values) {
|
||||
return new Set(values);
|
||||
}
|
||||
else {
|
||||
return new Set();
|
||||
}
|
||||
}
|
||||
put(key, value) {
|
||||
let values = this._map.get(key);
|
||||
if (!values) {
|
||||
values = new Set();
|
||||
}
|
||||
const count = values.size;
|
||||
values.add(value);
|
||||
if (values.size === count) {
|
||||
return false;
|
||||
}
|
||||
this._map.set(key, values);
|
||||
this._size++;
|
||||
return true;
|
||||
}
|
||||
has(key) {
|
||||
return this._map.has(key);
|
||||
}
|
||||
hasEntry(key, value) {
|
||||
const values = this._map.get(key);
|
||||
if (!values) {
|
||||
return false;
|
||||
}
|
||||
return values.has(value);
|
||||
}
|
||||
delete(key) {
|
||||
const values = this._map.get(key);
|
||||
if (values && this._map.delete(key)) {
|
||||
this._size -= values.size;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
deleteEntry(key, value) {
|
||||
const values = this._map.get(key);
|
||||
if (values) {
|
||||
if (!values.delete(value)) {
|
||||
return false;
|
||||
}
|
||||
this._size--;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
clear() {
|
||||
this._map.clear();
|
||||
this._size = 0;
|
||||
}
|
||||
entries() {
|
||||
const self = this;
|
||||
function* gen() {
|
||||
for (const [key, values] of self._map.entries()) {
|
||||
for (const value of values) {
|
||||
yield [key, value];
|
||||
}
|
||||
}
|
||||
}
|
||||
return gen();
|
||||
}
|
||||
values() {
|
||||
const self = this;
|
||||
function* gen() {
|
||||
for (const [, value] of self.entries()) {
|
||||
yield value;
|
||||
}
|
||||
}
|
||||
return gen();
|
||||
}
|
||||
keys() {
|
||||
return this._map.keys();
|
||||
}
|
||||
forEach(callback, thisArg) {
|
||||
for (const [key, value] of this.entries()) {
|
||||
callback.call(thisArg === undefined ? this : thisArg, key, value, this);
|
||||
}
|
||||
}
|
||||
[Symbol.iterator]() {
|
||||
return this.entries();
|
||||
}
|
||||
}
|
||||
13
core_js/utils/URLHashParams.d.ts
vendored
Normal file
13
core_js/utils/URLHashParams.d.ts
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Models a hash parameter of a given {@link URL}.
|
||||
*/
|
||||
export default class URLHashParams {
|
||||
private _params;
|
||||
constructor(url: URL);
|
||||
append(name: string, value?: string | null): void;
|
||||
delete(name: string): void;
|
||||
get(name: string): string | null;
|
||||
getAll(name: string): Set<string | null>;
|
||||
keys(): IterableIterator<string>;
|
||||
toString(): string;
|
||||
}
|
||||
77
core_js/utils/URLHashParams.js
Normal file
77
core_js/utils/URLHashParams.js
Normal file
@@ -0,0 +1,77 @@
|
||||
"use strict";
|
||||
/*
|
||||
* ClearURLs
|
||||
* Copyright (c) 2017-2022 Kevin Röbert.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Models a hash parameter of a given {@link URL}.
|
||||
*/
|
||||
class URLHashParams {
|
||||
constructor(url) {
|
||||
Object.defineProperty(this, "_params", {
|
||||
enumerable: true,
|
||||
configurable: true,
|
||||
writable: true,
|
||||
value: void 0
|
||||
});
|
||||
this._params = new Multimap();
|
||||
const hash = url.hash.slice(1);
|
||||
const params = hash.split('&');
|
||||
for (const p of params) {
|
||||
const param = p.split('=');
|
||||
if (!param[0])
|
||||
continue;
|
||||
const key = param[0];
|
||||
let value = null;
|
||||
if (param.length === 2 && param[1]) {
|
||||
value = param[1];
|
||||
}
|
||||
this._params.put(key, value);
|
||||
}
|
||||
}
|
||||
append(name, value = null) {
|
||||
this._params.put(name, value);
|
||||
}
|
||||
delete(name) {
|
||||
this._params.delete(name);
|
||||
}
|
||||
get(name) {
|
||||
const [first] = this._params.get(name);
|
||||
if (first) {
|
||||
return first;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
getAll(name) {
|
||||
return this._params.get(name);
|
||||
}
|
||||
keys() {
|
||||
return this._params.keys();
|
||||
}
|
||||
toString() {
|
||||
const rtn = [];
|
||||
this._params.forEach((key, value) => {
|
||||
if (value) {
|
||||
rtn.push(key + '=' + value);
|
||||
}
|
||||
else {
|
||||
rtn.push(key);
|
||||
}
|
||||
});
|
||||
return rtn.join('&');
|
||||
}
|
||||
}
|
||||
@@ -25,13 +25,12 @@
|
||||
* This watchdog restarts the whole Add-on, when the check fails.
|
||||
*/
|
||||
const CHECK_INTERVAL = 60000;
|
||||
const __dirtyURL = "https://clearurls.roebert.eu?utm_source=addon";
|
||||
const __cleanURL = new URL("https://clearurls.roebert.eu").toString();
|
||||
|
||||
setInterval(function() {
|
||||
if(isStorageAvailable() && storage.globalStatus) {
|
||||
const dirtyURL = "https://clearurls.roebert.eu?utm_source=addon";
|
||||
const cleanURL = "https://clearurls.roebert.eu";
|
||||
|
||||
if(pureCleaning(dirtyURL, true) !== cleanURL) {
|
||||
if(new URL(pureCleaning(__dirtyURL, true)).toString() !== __cleanURL) {
|
||||
storage.watchDogErrorCount += 1;
|
||||
console.log(translate('watchdog', storage.watchDogErrorCount));
|
||||
saveOnExit();
|
||||
@@ -41,4 +40,4 @@ setInterval(function() {
|
||||
saveOnExit();
|
||||
}
|
||||
}
|
||||
}, CHECK_INTERVAL);
|
||||
}, CHECK_INTERVAL);
|
||||
|
||||
26
css/core.css
26
css/core.css
@@ -42,6 +42,10 @@ body {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
table {
|
||||
color: var(--page-fg-color) !important;
|
||||
}
|
||||
|
||||
.form-control,
|
||||
.form-control:disabled,
|
||||
.form-control:focus,
|
||||
@@ -75,18 +79,20 @@ body {
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
color:#333;
|
||||
background-color:#fff;
|
||||
border-color:#ccc
|
||||
color: #333;
|
||||
background-color: #fff;
|
||||
border-color: #ccc
|
||||
}
|
||||
|
||||
.btn-default.focus,
|
||||
.btn-default:focus {
|
||||
color:#333;
|
||||
background-color:#e6e6e6;
|
||||
border-color:#8c8c8c
|
||||
color: #333;
|
||||
background-color: #e6e6e6;
|
||||
border-color: #8c8c8c
|
||||
}
|
||||
|
||||
.btn-default:hover {
|
||||
color:#333;
|
||||
background-color:#e6e6e6;
|
||||
border-color:#adadad
|
||||
}
|
||||
color: #333;
|
||||
background-color: #e6e6e6;
|
||||
border-color: #adadad
|
||||
}
|
||||
@@ -484,10 +484,10 @@ function check_single_cidr(addr, cidr) {
|
||||
while ((lastColon = string.indexOf(':', lastColon + 1)) >= 0) {
|
||||
colonCount++;
|
||||
}
|
||||
if (string.substr(0, 2) === '::') {
|
||||
if (string.startsWith('::')) {
|
||||
colonCount--;
|
||||
}
|
||||
if (string.substr(-2, 2) === '::') {
|
||||
if (string.endsWith('::')) {
|
||||
colonCount--;
|
||||
}
|
||||
if (colonCount > parts) {
|
||||
|
||||
@@ -136,7 +136,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
<div class="col-sm-1">
|
||||
<h5><b id="rules_status_head"></b></h5>
|
||||
<div class="text-center">
|
||||
<a href="https://gitlab.com/anti-tracking/ClearURLs/rules/commits/master/data.min.json"
|
||||
<a href="https://gitlab.com/ClearURLs/rules/-/commits/master/data.min.json"
|
||||
id="hashStatus" class="btn btn-primary btn-sm text-wrap" target="_blank"></a>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "ClearURLs",
|
||||
"version": "1.22.0",
|
||||
"version": "1.25.0",
|
||||
"author": "Kevin Roebert",
|
||||
"description": "__MSG_extension_description__",
|
||||
"homepage_url": "https://docs.clearurls.xyz",
|
||||
"default_locale": "en",
|
||||
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'none'",
|
||||
"content_security_policy": "script-src 'self'; object-src 'none'",
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
|
||||
@@ -57,6 +57,8 @@
|
||||
"background": {
|
||||
"scripts": [
|
||||
"browser-polyfill.js",
|
||||
"core_js/utils/Multimap.js",
|
||||
"core_js/utils/URLHashParams.js",
|
||||
"core_js/message_handler.js",
|
||||
"external_js/ip-range-check.js",
|
||||
"core_js/tools.js",
|
||||
|
||||
Reference in New Issue
Block a user