44 Commits

Author SHA1 Message Date
Kevin R
c7c8eca037 Updated README 2025-01-05 13:39:34 +01:00
Kevin R
085f037c98 Updated copyright 2025-01-05 13:32:25 +01:00
Kevin R
31d295da8d Upgraded datatables
* datatables to 2.1.8
2025-01-05 13:30:09 +01:00
Kevin R
4ead0482f2 Upgraded fontawesome
* fontawesome to 6.7.2
2025-01-05 13:16:20 +01:00
Kevin R
7ea94a9799 Upgrade bootstrap
* bootstrap to 4.6.2
2025-01-05 13:12:13 +01:00
Kevin R
1e74217a61 Removed old jQuery 2025-01-05 12:52:19 +01:00
Kevin R
8b91d422ab Upgrade deps
* polyfill to 0.12.0
* Pickr to 1.9.1
* jQuery to 3.7.1
2025-01-05 12:47:06 +01:00
Kevin
deec80b763 Update .gitlab-ci.yml 2024-07-14 14:09:17 +00:00
Kevin
7370e09fd7 Update .gitlab-ci.yml 2024-07-14 14:07:35 +00:00
Kevin R
99b96bcfce Merge remote-tracking branch 'temp2/patch-2' 2024-05-29 17:13:22 +02:00
Mazunki Hoksaas
897c7dc67b remove warning when s is undefined 2024-05-29 17:09:59 +02:00
Evert Heylen
dce06a7f47 Update historyListener.js 2024-05-28 16:28:55 +02:00
Kevin R
92e43b7f61 Fixed URLSearchParams spaces (x sign) bug
See also https://gitlab.com/ClearURLs/ClearUrls/-/merge_requests/108
2023-11-11 15:54:08 +01:00
Kevin R
14a0832973 ETag filtering 2023-05-10 11:28:43 +02:00
Kevin R
7358f0c2a4 Updated README.md 2023-01-31 22:39:53 +01:00
Kevin R
9f52c1e3c8 Updated ZIP 2023-01-31 22:36:55 +01:00
Kevin R
635be47e4c 1.26.1 2023-01-31 22:34:59 +01:00
Kevin R
cf59acb9a8 Merge branch 'master' of gitlab.com:ClearURLs/ClearUrls 2023-01-31 22:31:39 +01:00
Kevin R
04ff2e876b Use „browser_specific_settings“ 2023-01-31 22:31:29 +01:00
Kevin
e672e8cc74 Update README.md 2023-01-02 14:55:38 +00:00
Kevin R
193b3c1299 Bump version 2022-11-26 00:25:11 +01:00
Kevin R
29c8a84e4a Added note to changelog 2022-11-26 00:23:20 +01:00
Kevin R
a32708dcd1 Fixed ETag filtering
Fixed https://github.com/ClearURLs/Addon/issues/276
2022-11-26 00:21:23 +01:00
Kevin R
f1056cd778 Version 1.26.0
+ The popup window is now responsive
2022-11-18 22:26:59 +01:00
Kevin R
acfce04fcc Updated changelog 2022-07-27 00:46:12 +02:00
Kevin R
dbdefbf434 Merge branch 'translation'
# Conflicts:
#	_locales/fr/messages.json
2022-07-27 00:43:04 +02:00
Kevin
848b000ab7 Merge branch 'poeditor' into 'master'
Poeditor

See merge request KevinRoebert/ClearUrls!105
2022-07-26 22:37:59 +00:00
Kevin
7cd0505a46 Updated translations 2022-07-26 22:37:59 +00:00
Kevin R
0d7381f02a Fixed #191
Used first code snippets from ClearURLs v2: https://gitlab.com/ClearURLs/core/-/blob/master/src/utils/URLHashParams.ts
2022-07-27 00:28:15 +02:00
Kevin R
0f08b0f7e3 Fixed counter issue
Fixed https://github.com/ClearURLs/Addon/issues/234
2022-07-26 21:48:08 +02:00
Kevin R
2096fa8382 Added changelog 2022-07-26 20:34:32 +02:00
Kevin
742a344a26 Merge branch 'master' into 'master'
fix: table text color in dark mode

See merge request KevinRoebert/ClearUrls!104
2022-07-26 18:15:45 +00:00
Sanjay Pavan
a930a94224 fix: table text color in dark mode 2022-07-10 22:06:31 +05:30
Kevin R
52fdc1db1c Updated rules href 2022-06-30 21:15:02 +02:00
Kevin R
628faf0e85 Added new ETag filtering 2022-06-07 13:14:11 +02:00
Pineapples
89b2ba0a87 Add missing punctuation
More details
2022-06-02 13:38:47 +00:00
Pineapples
be3b1bd557 Apply suggestions from code review
Fix some of my oversights, thanks

Co-authored-by: Suspense <suspensetm@gmail.com>
2022-06-02 13:27:06 +00:00
Pineapples
716566c20d Update _locales/fr/messages.json
Co-authored-by: Suspense <suspensetm@gmail.com>
2022-06-02 13:18:15 +00:00
Pineapples
441790c48f Improve translation and clarify
Just made some parts a bit more clear and less redundant, also, changed wording in some for better readability.
2022-05-19 08:34:51 +00:00
Kevin
82d987a08e Merge branch 'update' into 'master'
Update "Projects that use parts of ClearURLs" section

See merge request KevinRoebert/ClearUrls!102
2022-04-11 14:28:48 +00:00
Kevin R
b67a656918 Version 1.24.1 2022-03-25 18:29:42 +01:00
Kevin R
63b557cf8c Version 1.24.0 2022-03-25 18:01:59 +01:00
Kevin R
6f5a182c77 Added jq to CI 2022-03-23 14:22:26 +01:00
SnwMds
d5dce95ba9 Update "Projects that use parts of ClearURLs" section 2022-02-24 15:12:31 -03:00
47 changed files with 1034 additions and 757 deletions

View File

@@ -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
@@ -24,26 +24,24 @@ hash rules:
- data.minify.json
- rules.minify.hash
bundle addon firefox:
bundle addon:
stage: build
script:
- zip ClearURLs-firefox -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
only:
- master
- zip ClearURLs -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
artifacts:
paths:
- ClearURLs-firefox.zip
- ClearURLs.zip
bundle addon chrome:
stage: build
script:
- jq 'del(.applications)' manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
- zip ClearURLs-chrome -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
only:
- master
artifacts:
paths:
- ClearURLs-chrome.zip
#bundle addon chrome:
#stage: build
#script:
#- jq 'del(.applications)' manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
#- zip ClearURLs-chrome -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
#only:
# - master
#artifacts:
# paths:
# - ClearURLs-chrome.zip
pages:
stage: deploy
@@ -55,6 +53,8 @@ pages:
- sha256sum public/data/data.min.json | awk '{print $1}' > public/data/rules.min.hash
- node build_tools/minifyDataJSON.js "public/data/data.min.json" "public/data/data.minify.json"
- sha256sum public/data/data.minify.json | awk '{print $1}' > public/data/rules.minify.hash
only:
- master
artifacts:
paths:
- public

View File

@@ -15,6 +15,62 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Require Firefox >= 55
- Require Chrome >= 37
## [1.27.0] - 2023-XX-XX
### Fixed
- [#276](https://github.com/ClearURLs/Addon/issues/276)
- [#196](https://github.com/ClearURLs/Addon/issues/196)
# Removed
- ETag filtering for Firefox. Since Firefox 85, ETags can no longer be used for tracking users over multiple sites.
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 37
## [1.26.0] - 2022-11-18
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 37
### Changed
- The popup window is now responsive
## [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

View File

@@ -2,11 +2,11 @@
<a href="https://liberapay.com/kroeb" target="_blank"><img src="https://raw.githubusercontent.com/KevinRoebert/DonateButtons/master/LiberaPay.png" alt="Buy Me A Coffee" height="55"></a>
<a href="https://www.buymeacoffee.com/KevinRoebert" target="_blank"><img src="https://raw.githubusercontent.com/KevinRoebert/DonateButtons/master/BuyMeACoffee.png" alt="Buy Me A Coffee" height="55"></a>
[<img src="https://blog.mozilla.org/addons/files/2020/04/get-the-addon-fx-apr-2020.svg" alt="for Firefox" height="60px">](https://addons.mozilla.org/firefox/addon/clearurls/) [<img src="https://docs.clearurls.xyz/1.22.0/assets/img/MEA-button.png" alt="for Edge" height="60px">](https://microsoftedge.microsoft.com/addons/detail/mdkdmaickkfdekbjdoojfalpbkgaddei) [<img src="https://storage.googleapis.com/chrome-gcs-uploader.appspot.com/image/WlD8wC6g8khYWPJUsQceQkhXSlv1/HRs9MPufa1J1h5glNhut.png" alt="for Chrome" height="60px">](https://chrome.google.com/webstore/detail/clearurls/lckanjgmijmafbedllaakclkaicjfmnk)
[<img src="https://blog.mozilla.org/addons/files/2020/04/get-the-addon-fx-apr-2020.svg" alt="for Firefox" height="60px">](https://addons.mozilla.org/firefox/addon/clearurls/) [<img src="https://docs.clearurls.xyz/1.22.0/assets/img/MEA-button.png" alt="for Edge" height="60px">](https://microsoftedge.microsoft.com/addons/detail/mdkdmaickkfdekbjdoojfalpbkgaddei)
# <sub><img src="https://gitlab.com/KevinRoebert/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs [![Gitter](https://badges.gitter.im/ClearURLs/ClearURLs.svg)](https://gitter.im/ClearURLs/ClearURLs)
# <sub><img src="https://gitlab.com/ClearURLs/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs [![Gitter](https://badges.gitter.im/ClearURLs/ClearURLs.svg)](https://gitter.im/ClearURLs/ClearURLs)
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and *Chrome* based browsers.
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and some *Chrome* based browsers.
This extension will automatically remove tracking elements from URLs to help protect your privacy when browsing the Internet,
which is regularly updated by us and can be found [here](https://gitlab.com/anti-tracking/ClearURLs/rules/-/raw/master/data.min.json).
@@ -37,7 +37,7 @@ Indeed most of the above URL is tracking code. Once ClearURLs has cleaned the ad
* Prevents Yandex from rewriting the search results (to include tracking elements)
## Permissons
Reasoning for needed permissions can be found under [here](https://gitlab.com/KevinRoebert/ClearUrls/issues/159).
Reasoning for needed permissions can be found under [here](https://gitlab.com/ClearURLs/ClearUrls/issues/159).
## Screenshot
![Interface (version 1.14.0)](https://docs.clearurls.xyz/1.22.0/assets/img/interface.png)
@@ -45,14 +45,13 @@ Reasoning for needed permissions can be found under [here](https://gitlab.com/Ke
## CI/CD Artifacts Download (for Firefox- and Chrome-Dev only)
Here you can download the packed files for the Firefox- and Chrome-Dev:
- [ClearURLs-firefox.zip](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearURLs-firefox.zip?job=bundle%20addon%20firefox)
- [ClearURLs-chrome.zip](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearURLs-chrome.zip?job=bundle%20addon%20chrome)
- [ClearURLs.zip](https://gitlab.com/ClearURLs/ClearUrls/-/jobs/artifacts/master/raw/ClearURLs.zip?job=bundle%20addon)
## Test
If you want to test whether ClearURLs works correctly on your system, you can go to this test page: [https://test.clearurls.xyz/](https://test.clearurls.xyz/)
## Contribute
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/KevinRoebert/ClearUrls/issues/new)
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/ClearURLs/ClearUrls/issues/new)
**Note: If you have any suggestions or complaints regarding the rules, please [create an issue in this repo](https://gitlab.com/anti-tracking/ClearURLs/rules/-/issues/new) or email us rules.support (at) clearurls.xyz (this mail will automatically create a new issue in this repo).**
@@ -65,7 +64,7 @@ You can choose between two options to contribute. You can create a merge request
It is not necessary to translate the description field; in the most cases it is empty.*
#### Merge request
If you want to create a merge request, you must open the path [`_locales/en/messages.json`](https://github.com/KevinRoebert/ClearUrls/blob/master/_locales/en/messages.json) in the ClearURLs repo
If you want to create a merge request, you must open the path [`_locales/en/messages.json`](https://gitlab.com/ClearURLs/ClearUrls/-/blob/master/_locales/en/messages.json) in the ClearURLs repo
and translate the english terms into terms of your language. Once you have translated all the terms, you make a pull request of your translation.
Please push your translation into the folder `_locales/{language code}/messages.json`.
@@ -76,8 +75,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)
@@ -94,14 +94,14 @@ We use some third-party scripts in our add-on. The authors and licenses are list
- [WebExtension browser API Polyfill](https://github.com/mozilla/webextension-polyfill) |
Copyright by Mozilla |
[MPL-2.0](https://github.com/mozilla/webextension-polyfill/blob/master/LICENSE)
- [Bootstrap v4.3.1](https://github.com/twbs/bootstrap/tree/v4.3.1) |
- [Bootstrap](https://github.com/twbs/bootstrap) |
Copyright 2011-2016 Twitter, Inc. |
[MIT](https://github.com/twbs/bootstrap/blob/master/LICENSE)
- [jQuery v3.6.0](https://github.com/jquery/jquery/tree/3.6.0) |
- [jQuery](https://github.com/jquery/jquery/) |
Copyright JS Foundation and other contributors |
[MIT](https://jquery.org/license/)
- [DataTables v1.10.20](https://github.com/DataTables/DataTables/tree/master) | Copyright (c) 2008-2015 SpryMedia Limited | [MIT](https://datatables.net/license/)
- [Pickr v1.7.0](https://github.com/Simonwep/pickr/tree/1.7.0) | Copyright (c) 2018 - 2020 Simon Reinisch |
- [DataTables](https://github.com/DataTables/DataTables/tree/master) | Copyright (c) 2008-2015 SpryMedia Limited | [MIT](https://datatables.net/license/)
- [Pickr](https://github.com/Simonwep/pickr/) | Copyright (c) 2018 - 2020 Simon Reinisch |
[MIT](https://github.com/Simonwep/pickr/blob/master/LICENSE)
- [Font Awesome v5.12.0](https://github.com/FortAwesome/Font-Awesome/tree/5.12.0) | Copyright (c) @fontawesome |
- [Font Awesome](https://github.com/FortAwesome/Font-Awesome/) | Copyright (c) @fontawesome |
[Font Awesome Free License](https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt)

View File

@@ -20,7 +20,7 @@
"description": "Dieser Statuscode besagt, dass beim Aktualisieren der ClearURLs-Regeln ein Fehler aufgetreten ist."
},
"log_redirect": {
"message": "Diese URL wurde weiter geleitet",
"message": "Diese URL wurde weitergeleitet",
"description": "Diese Zeichenfolge wird für Umleitungen im ClearURL-Protokoll verwendet."
},
"log_domain_blocked": {
@@ -176,11 +176,11 @@
"description": "Diese Zeichenfolge wird als Titel für die Schaltfläche zum Speichern und erneuten Laden auf der Einstellungsseite verwendet."
},
"setting_hash_url_label": {
"message": "Die Url zu der rules.hash Datei (Hash)",
"description": "Diese Zeichenfolge wird als Name für die rule.hash URL verwendet."
"message": "Die URL zu der rules.hash-Datei (Hash)",
"description": "Diese Zeichenfolge wird als Name für die rule.hash-URL verwendet."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Request types</a> (Expertenniveau)",
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Anfragetypen</a> (Expertenniveau)",
"description": "Diese Zeichenfolge wird als Name für die Typenbezeichnung verwendet."
},
"setting_report_server_label": {
@@ -312,11 +312,11 @@
}
},
"domain_blocking_enabled": {
"message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"message": "Erlaube Domain-Blocking (kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"description": "Diese Zeichenkette wird als Beschreibung für das Domain-Blocking verwendet."
},
"domain_blocking_enabled_title": {
"message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"message": "Erlaube Domain-Blocking (kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
"description": "Diese Zeichenkette wird als Titel für das Domain-Blocking verwendet."
},
"log_ping_blocked": {

View File

@@ -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 na pas pu démarrer adéquatement pour son bon fonctionnement."
"description": "ClearURLs na 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 navez 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 navez 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]: Lextension na pu être démarrée.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
"message": "[ClearURLs]: Lextension na 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 lextension",
"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 lURL sans le traqueur",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
"message": "Copier lURL 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 daller 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 à linfini",
"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 lextension <b>ClearURLs</b> ; il est identifié comme étant problématique, soit publicitaire, soit despionnage ; vous pouvez désactiver temporairement le blocage du site dans les paramétrages, soit lextension, 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 lextension <b>ClearURLs</b> ; il est identifié comme étant problématique, soit publicitaire, soit despionnage ; vous pouvez désactiver temporairement le blocage du site soit dans les paramétres, soit dans lextension 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,39 +312,67 @@
}
},
"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 lespionnage 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 lespionnage 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 lespionnage auditing",
"description": "Utilisé comme titre pour le bouton, commutateur, de laudit des liens hypertextes"
"message": "Bloquer lespionnage par audit",
"description": "Utilisé comme titre pour le bouton de laudit 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": "Lidentification 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 dExploitation, 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 dExploitation, 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": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"popup_html_statistics_percentage_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"popup_html_statistics_blocked_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"popup_html_statistics_elements_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"popup_html_statistics_head_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"popup_html_configs_head_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
},
"context_menu_enabled_title": {
"message": " ",
"description": "pas nécessaire, seulement pour éviter les exceptions"
}
}
}

View File

@@ -1,38 +1,38 @@
{
"hash_status_code_1": {
"message": "atualizado",
"message": "Atualizadas",
"description": "This status code says, that no update is available for the ClearURLs rules and everything is up to date."
},
"hash_status_code_2": {
"message": "atualizado",
"message": "Atualizadas",
"description": "This status code says, that the ClearURLs rules are successfully updated."
},
"hash_status_code_3": {
"message": "atualização disponível",
"description": "Este código de status diz que uma atualização está disponível para as regras ClearURLs."
"message": "Atualização disponível",
"description": "This status code says, that an update is available for the ClearURLs rules."
},
"hash_status_code_4": {
"message": "erro",
"description": "Este código de estado diz que ClearURLs não pôde ser iniciado corretamente."
"message": "Erro",
"description": "This status code says, that the ClearURLs could not be started correctly."
},
"hash_status_code_5": {
"message": "Oops, algo deu errado!",
"description": "Este código de estado diz que ocorreu um erro ao atualizar as regras da ClearURLs."
"message": "Ops! Algo deu errado.",
"description": "This status code says, that an error occurred while updating the ClearURLs rules."
},
"log_redirect": {
"message": "Esta URL foi redirecionada",
"message": "URL redirecionado",
"description": "This string is used on redirections in the ClearURLs log."
},
"log_domain_blocked": {
"message": "Este domínio foi bloqueado",
"description": "Esta string é usada em redirecionamentos no log ClearURLs. "
"message": "Domínio bloqueado",
"description": "This string is used on blocked domains in the ClearURLs log."
},
"check_os_log": {
"message": "[ClearURLs]: Examinador de registro (log) foi adicionado.",
"message": "[ClearURLs]: auditor de registros implementado.",
"description": "This string is used on ClearURLs log startup."
},
"log_html_page_title": {
"message": "Registro (log) do ClearURLs",
"message": "Registros do ClearURLs",
"description": "This string is used as header on the log page."
},
"log_html_table_head_1": {
@@ -52,11 +52,11 @@
"description": "This string is used as table title on the log page."
},
"log_html_reset_button": {
"message": "Resetar",
"message": "Redefinir",
"description": "This string is used for the reset button on the log page."
},
"log_html_reset_button_title": {
"message": "Resetar o registro global",
"message": "Redefinir o registro global",
"description": "This string is used as title for the reset button on the log page."
},
"popup_html_configs_head": {
@@ -64,11 +64,11 @@
"description": "This string is used as title for the configs on the popup page."
},
"popup_html_configs_switch_filter": {
"message": "Filtrar",
"message": "Filtro",
"description": "This string is used as name for the filter switch button on the popup page."
},
"popup_html_configs_switch_filter_title": {
"message": "O switch de filtros ativa a funcionalidade de limpeza do ClearURLs. Se você desabilitar essa opção, toda a extensão será desativada",
"message": "O interruptor de filtros ativa a funcionalidade de limpeza do ClearURLs. Se essa opção for desativada, a extensão não funcionará.",
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
@@ -76,7 +76,7 @@
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
"message": "O registro (log) é salvo apenas localmente. Não recomendamos esse recurso se você não precisa dele",
"message": "O registro é salvo apenas localmente. Recomendamos desativá-lo caso não precise dele.",
"description": "This string is used as title for the logging switch button on the popup page."
},
"popup_html_configs_switch_badges": {
@@ -84,7 +84,7 @@
"description": "This string is used as name for the badges switch button on the popup page."
},
"popup_html_configs_switch_badges_title": {
"message": "Mostrar o número de URLs limpas",
"message": "Exibir a quantidade de URLs que foram limpos.",
"description": "This string is used as title for the badges switch button on the popup page."
},
"popup_html_statistics_head": {
@@ -104,11 +104,11 @@
"description": "This string is used as name for the percentage of blocked elements on the popup page."
},
"popup_html_statistics_reset_button": {
"message": "Resetar",
"message": "Redefinir",
"description": "This string is used as name for the statistics reset button on the popup page."
},
"popup_html_statistics_reset_button_title": {
"message": "Resetar as estatísticas globais",
"message": "Redefinir as estatísticas globais",
"description": "This string is used as title for the statistics reset button on the popup page."
},
"popup_html_rules_status_head": {
@@ -120,23 +120,23 @@
"description": "This string is used as name for the log button on the popup page."
},
"popup_html_log_head_title": {
"message": "Abrir o registro (log)",
"message": "Abrir o registro",
"description": "This string is used as title for the log button on the popup page."
},
"popup_html_report_button": {
"message": "Reportar URL atual",
"message": "Denunciar URL atual",
"description": "Note: Currently not used."
},
"popup_html_report_button_title": {
"message": "Reportar a URL atual desta aba.",
"message": "Denunciar o URL atual desta aba.",
"description": "Currently not used."
},
"core_save_on_disk": {
"message": "[ClearURLs]: Salvar no disco.",
"message": "[ClearURLs]: salvar no disco.",
"description": "This string is used to tell the user, that ClearURLs saved the settings on disk."
},
"core_error": {
"message": "[ClearURLs]: A extensão não pôde ser inicializada.",
"message": "[ClearURLs]: a extensão não pôde ser inicializada.",
"description": "This string is used to tell the user, that ClearURLs could not be started."
},
"configs_switch_statistics": {
@@ -144,7 +144,7 @@
"description": "This string is used as name for the statistics switch button on the popup page."
},
"configs_switch_statistics_title": {
"message": "Ativar ou desativar função de estatísticas",
"message": "Ativar ou desativar a função de estatísticas.",
"description": "This string is used as title for the statistics switch button on the popup page."
},
"settings_html_page_title": {
@@ -156,23 +156,23 @@
"description": "This string is used as name for the badged color label."
},
"setting_html_reset_button": {
"message": "Resetar",
"message": "Redefinir",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_reset_button_title": {
"message": "Resetar tudo",
"message": "Redefinir tudo",
"description": "This string is used as title for the reset button on the settings page."
},
"setting_rule_url_label": {
"message": "URL do arquivo data.json (regras)",
"description": "Esta string é usada como nome para o rótulo da URL de regra."
"description": "This string is used as name for the rule url label."
},
"settings_html_save_button": {
"message": "Salvar e recarregar extensão",
"description": "This string is used as name for the save&reload button on the settings page."
},
"settings_html_save_button_title": {
"message": "Salva as configurações",
"message": "Salvar as configurações",
"description": "This string is used as title for the save&reload button on the settings page."
},
"setting_hash_url_label": {
@@ -180,35 +180,35 @@
"description": "This string is used as name for the rule.hash url label."
},
"setting_types_label": {
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Tipos de pedidos</a> (nível expert)",
"message": "<a href='https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/ResourceType' target='_blank'>Tipos de solicitações</a> (nível expert) — em inglês",
"description": "This string is used as name for the types label."
},
"setting_report_server_label": {
"message": "Reportar servidor para URLs",
"message": "Denunciar URLs deste servidor",
"description": "Note: Currently not used."
},
"success_report_url": {
"message": "A URL foi reportada com sucesso. Verificaremos essa URL em breve.",
"description": "Nota: Atualmente não usado."
"message": "O URL foi denunciado com sucesso. Verificaremos em breve.",
"description": "Note: Currently not used."
},
"error_report_url": {
"message": "Parece que essa URL ja foi reportada.",
"description": "Nota: Atualmente não usado."
"message": "Parece que este URL já foi denunciado.",
"description": "Note: Currently not used."
},
"donate_button": {
"message": "Uma doação para o criador do ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Copiar local do link limpo",
"message": "Copiar endereço limpo do link",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Mostrar entrada do menu de contexto",
"message": "Exibir entrada no menu contextual",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Impedir a injeção de rastreamento sobre a API de histórico (vide: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>Método replaceState()</a>)",
"message": "Impedir a injeção de rastreamento sobre a API de histórico (veja também: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>O método replaceState()</a> — em inglês)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
@@ -216,7 +216,7 @@
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "Com esta ferramenta, você pode colar URLs e ClearURLs as limpará após um clique no botão verde. Você pode colar várias URLs de uma só vez, mas cada URL deve estar em uma linha separada.",
"message": "Com esta ferramenta, você pode colar URLs e o ClearURLs limpá-los-á após clicar no botão verde. É possível colar múltiplos URLs de uma só vez, mas cada URL deve estar em uma linha separada.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
@@ -224,56 +224,56 @@
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Aqui você pode colar as URLs que deseja limpar:",
"message": "Cole aqui os URLs para limpeza:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Aqui você pode encontrar as URLs limpas:",
"message": "URLs limpos:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Pular URLs em hosts locais (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": "Esta string é usada como rótulo para o switch de salto do host local"
"message": "Ignorar URLs em hosts locais (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": "This string is used as label for the local host skipping switch"
},
"local_hosts_skipping_title": {
"message": "Pula URLs em hosts locais",
"description": "Esta string é usada como título para o switch de salto do host local"
"message": "Ignorar URLs em hosts locais",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Exportar",
"description": "Essa string é usada para o botão de exportação na página de log."
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Exporta o log global",
"description": "Essa string é usada como título para o botão de exportação na página de log."
"message": "Exportar o registro global",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Importar",
"description": "Essa string é usada para o botão de importação na página de log."
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Importar o registro global",
"description": "Esta string é usada como título para o botão de importação na página de log."
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Exportar",
"description": "Essa string é usada como nome para o botão de exportação na página de configurações."
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Exporta tudo",
"description": "Esta string é usada como título para o botão de exportação na página de configurações."
"message": "Exportar tudo",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Importar",
"description": "Esta string é usada como nome para o botão de reset na página de configurações."
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Importa tudo",
"description": "Esta string é usada como título para o botão de importação na página de configurações."
"message": "Importar tudo",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Limitar o registro (log) a $LIMIT$ itens.",
"description": "Essa string é usada como nome para o rótulo de limite de log.",
"message": "Limitar o registro a $LIMIT$ item(ns).",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
@@ -282,28 +282,28 @@
}
},
"blocked_html_title": {
"message": "Este site foi bloqueado por <b>ClearURLs</b>",
"description": "Essa string é usada como título na página do site bloqueada."
"message": "Este site foi bloqueado pelo <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Este site foi bloqueado pela extensão <b>ClearURLs</b> porque o identificamos como um serviço de publicidade ou rastreamento. Para visitar este site, você deve desativar temporariamente a extensão ou desabilitar o bloqueio de domínio nas configurações de ClearURLs. Depois disso, você pode clicar no botão abaixo para carregar a página.",
"description": "Essa string é usada como corpo na página do site bloqueado."
"message": "Este site foi bloqueado pela extensão <b>ClearURLs</b>, pois é considerado como um serviço de anúncios e/ou rastreamento. Para acessá-lo, será necessário desativar temporariamente a extensão ou desativar o bloqueio de domínios nas configurações do ClearURLs. Após isso, clique no botão abaixo para carregar a página.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Visitar a página",
"description": "Essa string é usada como botão na página do site bloqueado."
"message": "Acessar página",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Permitir marketing de referência (\"referral\")",
"description": "Essa string é usada como rótulo para a opção de marketing de referência"
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Permite marketing de referência (\"referral\")",
"description": "Esta string é usada como título para a opção de marketing de referência"
"message": "Permitir marketing de referência (\"referral\")",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: O watchdog detectou um problema e já falhou $TIMES$ vezes.",
"description": "Esta string é usada como texto para o watchdog",
"message": "[ClearURLs]: a vigilância encontrou um problema e já falhou $TIMES$ vez(es).",
"description": "This string is used as text for the watchdog",
"placeholders": {
"times": {
"content": "$1",
@@ -312,67 +312,67 @@
}
},
"domain_blocking_enabled": {
"message": "Permitir bloqueio de domínio (pode causar problemas em páginas que não permitem AdBlockers)",
"description": "Esta string é usada como rótulo para o switch de bloqueio de domínio"
"message": "Permitir bloqueio de domínios (pode causar problemas em páginas que não permitem bloqueadores de anúncios)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Permitir bloqueio de domínio (pode causar problemas em páginas que não permitem AdBlockers)",
"description": "Esta string é usada como título para a chave de bloqueio de domínio"
"message": "Permitir bloqueio de domínios (pode causar problemas em páginas que não permitem bloqueadores de anúncios)",
"description": "This string is used as title for the domain blocking switch"
},
"log_ping_blocked": {
"message": "Esta auditoria de hiperlink foi bloqueada",
"description": "Essa string é usada na auditoria de hiperlink no log ClearURLs."
"message": "Auditoria de hyperlink bloqueada",
"description": "This string is used on hyperlink auditing in the ClearURLs log."
},
"ping_blocking_enabled": {
"message": "Bloquear auditoria de hiperlink (vide <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>artigo sobre \"Hyperlink auditing\"</a>)",
"description": "Esta string é usada como rótulo para o switch de bloqueio de auditoria de hiperlink"
"message": "Bloquear auditoria de hyperlink (mais informações <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>aqui</a> — em inglês)",
"description": "This string is used as label for the hyperlink auditing blocking switch"
},
"ping_blocking_enabled_title": {
"message": "Bloquear auditoria de hiperlink",
"description": "Esta string é usada como título para a chave de bloqueio de auditoria de hiperlink"
"description": "This string is used as title for the hyperlink auditing blocking switch"
},
"extension_description": {
"message": "Remover os elementos de rastreamento de URLs. ",
"description": "Descrição da extensão (máx. 132 caracteres)"
"message": "Remova elementos de rastreamento de URLs.",
"description": "Extension description (max. 132 characters)"
},
"eTag_filtering_log": {
"message": "O cabeçalho ETag foi removido deste pedido",
"description": "Essa string é usada na filtragem de cabeçalho ETag no log ClearURLs."
"message": "Cabeçalho ETag removido",
"description": "This string is used on ETag header filtering in the ClearURLs log."
},
"eTag_filtering_enabled": {
"message": "Filtra cabeçalhos ETag de pedidos (vide <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>artigo sobre \"HTTP ETag\"</a>)",
"description": "Esta string é usada como rótulo para a opção de filtragem de cabeçalho ETag"
"message": "Filtrar cabeçalhos ETag de solicitações (mais informações <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>aqui</a> — em inglês)",
"description": "This string is used as label for the ETag header filtering switch"
},
"eTag_filtering_enabled_title": {
"message": "Filtra cabeçalhos ETag de pedidos. Dica: o cache deve ser limpo antes do primeiro uso.",
"description": "Esta string é usada como título para a opção de filtragem de cabeçalho ETag"
"message": "Filtrar cabeçalhos ETag. Dica: o cache deve ser limpo antes do primeiro uso.",
"description": "This string is used as title for the ETag header filtering switch"
},
"popup_html_rules_status_head_title": {
"message": " ",
"description": "não necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"popup_html_statistics_percentage_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"popup_html_statistics_blocked_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"popup_html_statistics_elements_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"popup_html_statistics_head_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"popup_html_configs_head_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
},
"context_menu_enabled_title": {
"message": " ",
"description": "não é necessário, apenas para evitar exceções"
"description": "not needed, only to prevent exceptions"
}
}

View File

@@ -346,5 +346,26 @@
"eTag_filtering_enabled_title": {
"message": "Фільтри заголовків ETag. \nПідказка: Кеш повинен бути скинутим перед першим використанням.",
"description": "Цей рядок використовується, як заголовок для перемикача фільтра заголовка ETag"
},
"popup_html_rules_status_head_title": {
"message": " "
},
"popup_html_statistics_percentage_title": {
"message": " "
},
"popup_html_statistics_blocked_title": {
"message": " "
},
"popup_html_statistics_elements_title": {
"message": " "
},
"popup_html_statistics_head_title": {
"message": " "
},
"popup_html_configs_head_title": {
"message": " "
},
"context_menu_enabled_title": {
"message": " "
}
}

View File

@@ -10,8 +10,8 @@
factory(mod);
global.browser = mod.exports;
}
})(this, function (module) {
/* webextension-polyfill - v0.4.0 - Wed Feb 06 2019 11:58:31 */
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) {
/* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
@@ -19,9 +19,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) {
if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {
throw new Error("This script should only be loaded in a browser extension.");
}
if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)";
// Wrapping the bulk of this polyfill in a one-time-use function is a minor
// optimization for Firefox. Since Spidermonkey does not fully parse the
@@ -250,6 +252,12 @@
"minArgs": 3,
"maxArgs": 3,
"singleCallbackArg": true
},
"elements": {
"createSidebarPane": {
"minArgs": 1,
"maxArgs": 1
}
}
}
},
@@ -456,10 +464,6 @@
"minArgs": 0,
"maxArgs": 0
},
"getBrowserInfo": {
"minArgs": 0,
"maxArgs": 0
},
"getPlatformInfo": {
"minArgs": 0,
"maxArgs": 0
@@ -596,6 +600,14 @@
"minArgs": 0,
"maxArgs": 1
},
"goBack": {
"minArgs": 0,
"maxArgs": 1
},
"goForward": {
"minArgs": 0,
"maxArgs": 1
},
"highlight": {
"minArgs": 1,
"maxArgs": 1
@@ -694,7 +706,6 @@
}
}
};
if (Object.keys(apiMetadata).length === 0) {
throw new Error("api-metadata.json has not been included in browser-polyfill");
}
@@ -714,12 +725,10 @@
super(items);
this.createItem = createItem;
}
get(key) {
if (!this.has(key)) {
this.set(key, this.createItem(key));
}
return super.get(key);
}
}
@@ -751,13 +760,17 @@
* promise.
* @param {function} promise.resolve
* The promise's resolution function.
* @param {function} promise.rejection
* @param {function} promise.reject
* The promise's rejection function.
* @param {object} metadata
* Metadata about the wrapped method which has created the callback.
* @param {integer} metadata.maxResolvedArgs
* The maximum number of arguments which may be passed to the
* callback created by the wrapped async function.
* @param {boolean} metadata.singleCallbackArg
* Whether or not the promise is resolved with only the first
* argument of the callback, alternatively an array of all the
* callback arguments is resolved. By default, if the callback
* function is invoked with only a single argument, that will be
* resolved to the promise, while all arguments will be resolved as
* an array if multiple are given.
*
* @returns {function}
* The generated callback function.
@@ -765,7 +778,7 @@
const makeCallback = (promise, metadata) => {
return (...callbackArgs) => {
if (extensionAPIs.runtime.lastError) {
promise.reject(extensionAPIs.runtime.lastError);
promise.reject(new Error(extensionAPIs.runtime.lastError.message));
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
promise.resolve(callbackArgs[0]);
} else {
@@ -773,7 +786,6 @@
}
};
};
const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments";
/**
@@ -791,9 +803,13 @@
* The maximum number of arguments which may be passed to the
* function. If called with more than this number of arguments, the
* wrapper will raise an exception.
* @param {integer} metadata.maxResolvedArgs
* The maximum number of arguments which may be passed to the
* callback created by the wrapped async function.
* @param {boolean} metadata.singleCallbackArg
* Whether or not the promise is resolved with only the first
* argument of the callback, alternatively an array of all the
* callback arguments is resolved. By default, if the callback
* function is invoked with only a single argument, that will be
* resolved to the promise, while all arguments will be resolved as
* an array if multiple are given.
*
* @returns {function(object, ...*)}
* The generated wrapper function.
@@ -803,35 +819,37 @@
if (args.length < metadata.minArgs) {
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
}
if (args.length > metadata.maxArgs) {
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
}
return new Promise((resolve, reject) => {
if (metadata.fallbackToNoCallback) {
// This API method has currently no callback on Chrome, but it return a promise on Firefox,
// and so the polyfill will try to call it with a callback first, and it will fallback
// to not passing the callback if the first call fails.
try {
target[name](...args, makeCallback({ resolve, reject }, metadata));
target[name](...args, makeCallback({
resolve,
reject
}, metadata));
} catch (cbError) {
console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", cbError);
target[name](...args);
// Update the API method metadata, so that the next API calls will not try to
// use the unsupported callback anymore.
metadata.fallbackToNoCallback = false;
metadata.noCallback = true;
resolve();
}
} else if (metadata.noCallback) {
target[name](...args);
resolve();
} else {
target[name](...args, makeCallback({ resolve, reject }, metadata));
target[name](...args, makeCallback({
resolve,
reject
}, metadata));
}
});
};
@@ -863,7 +881,6 @@
}
});
};
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
/**
@@ -895,18 +912,14 @@
has(proxyTarget, prop) {
return prop in target || prop in cache;
},
get(proxyTarget, prop, receiver) {
if (prop in cache) {
return cache[prop];
}
if (!(prop in target)) {
return undefined;
}
let value = target[prop];
if (typeof value === "function") {
// This is a method on the underlying object. Check if we need to do
// any wrapping.
@@ -929,6 +942,9 @@
// of. Create a sub-object wrapper for it with the appropriate child
// metadata.
value = wrapObject(value, wrappers[prop], metadata[prop]);
} else if (hasOwnProperty(metadata, "*")) {
// Wrap all properties in * namespace.
value = wrapObject(value, wrappers[prop], metadata["*"]);
} else {
// We don't need to do any wrapping for this property,
// so just forward all access to the underlying object.
@@ -942,14 +958,11 @@
target[prop] = value;
}
});
return value;
}
cache[prop] = value;
return value;
},
set(proxyTarget, prop, value, receiver) {
if (prop in cache) {
cache[prop] = value;
@@ -958,11 +971,9 @@
}
return true;
},
defineProperty(proxyTarget, prop, desc) {
return Reflect.defineProperty(cache, prop, desc);
},
deleteProperty(proxyTarget, prop) {
return Reflect.deleteProperty(cache, prop);
}
@@ -1002,19 +1013,36 @@
addListener(target, listener, ...args) {
target.addListener(wrapperMap.get(listener), ...args);
},
hasListener(target, listener) {
return target.hasListener(wrapperMap.get(listener));
},
removeListener(target, listener) {
target.removeListener(wrapperMap.get(listener));
}
});
const onRequestFinishedWrappers = new DefaultWeakMap(listener => {
if (typeof listener !== "function") {
return listener;
}
// Keep track if the deprecation warning has been logged at least once.
let loggedSendResponseDeprecationWarning = false;
/**
* Wraps an onRequestFinished listener function so that it will return a
* `getContent()` property which returns a `Promise` rather than using a
* callback API.
*
* @param {object} req
* The HAR entry object representing the network request.
*/
return function onRequestFinished(req) {
const wrappedReq = wrapObject(req, {} /* wrappers */, {
getContent: {
minArgs: 0,
maxArgs: 0
}
});
listener(wrappedReq);
};
});
const onMessageWrappers = new DefaultWeakMap(listener => {
if (typeof listener !== "function") {
return listener;
@@ -1039,26 +1067,19 @@
*/
return function onMessage(message, sender, sendResponse) {
let didCallSendResponse = false;
let wrappedSendResponse;
let sendResponsePromise = new Promise(resolve => {
wrappedSendResponse = function (response) {
if (!loggedSendResponseDeprecationWarning) {
console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack);
loggedSendResponseDeprecationWarning = true;
}
didCallSendResponse = true;
resolve(response);
};
});
let result;
try {
result = listener(message, sender, wrappedSendResponse);
} catch (err) {
result = Promise.reject(err);
}
const isResultThenable = result !== true && isThenable(result);
// If the listener didn't returned true or a Promise, or called
@@ -1085,7 +1106,6 @@
} else {
message = "An unexpected error occurred";
}
sendResponse({
__mozWebExtensionPolyfillReject__: true,
message
@@ -1109,8 +1129,10 @@
return true;
};
});
const wrappedSendMessageCallback = ({ reject, resolve }, reply) => {
const wrappedSendMessageCallback = ({
reject,
resolve
}, reply) => {
if (extensionAPIs.runtime.lastError) {
// Detect when none of the listeners replied to the sendMessage call and resolve
// the promise to undefined as in Firefox.
@@ -1118,7 +1140,7 @@
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
resolve();
} else {
reject(extensionAPIs.runtime.lastError);
reject(new Error(extensionAPIs.runtime.lastError.message));
}
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
// Convert back the JSON representation of the error into
@@ -1128,52 +1150,68 @@
resolve(reply);
}
};
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
if (args.length < metadata.minArgs) {
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
}
if (args.length > metadata.maxArgs) {
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
}
return new Promise((resolve, reject) => {
const wrappedCb = wrappedSendMessageCallback.bind(null, { resolve, reject });
const wrappedCb = wrappedSendMessageCallback.bind(null, {
resolve,
reject
});
args.push(wrappedCb);
apiNamespaceObj.sendMessage(...args);
});
};
const staticWrappers = {
devtools: {
network: {
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
}
},
runtime: {
onMessage: wrapEvent(onMessageWrappers),
onMessageExternal: wrapEvent(onMessageWrappers),
sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 1, maxArgs: 3 })
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 1,
maxArgs: 3
})
},
tabs: {
sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 2, maxArgs: 3 })
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
minArgs: 2,
maxArgs: 3
})
}
};
const settingMetadata = {
clear: { minArgs: 1, maxArgs: 1 },
get: { minArgs: 1, maxArgs: 1 },
set: { minArgs: 1, maxArgs: 1 }
clear: {
minArgs: 1,
maxArgs: 1
},
get: {
minArgs: 1,
maxArgs: 1
},
set: {
minArgs: 1,
maxArgs: 1
}
};
apiMetadata.privacy = {
network: {
networkPredictionEnabled: settingMetadata,
webRTCIPHandlingPolicy: settingMetadata
"*": settingMetadata
},
services: {
passwordSavingEnabled: settingMetadata
"*": settingMetadata
},
websites: {
hyperlinkAuditingEnabled: settingMetadata,
referrersEnabled: settingMetadata
"*": settingMetadata
}
};
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
};
@@ -1181,6 +1219,7 @@
// `module` variable available.
module.exports = wrapAPIs(chrome);
} else {
module.exports = browser;
module.exports = globalThis.browser;
}
});
//# sourceMappingURL=browser-polyfill.js.map

View File

@@ -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 += "?" + urlSearchParamsToString(fields);
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 = "([\\/\\?#]|(&|&amp;))+(" + 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 = "([\\/\\?#]|(&|&amp;))+(" + 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};
}

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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);

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -23,24 +23,56 @@
*/
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;
}
const etag = header.value.toLowerCase();
const w = etag.startsWith('w');
const quotes = etag.endsWith('"');
let len = etag.length;
if (w) len -= 2;
if (quotes) len -= 2;
// insert dummy etag
requestDetails.responseHeaders[i].value = generateDummyEtag(len, quotes, w);
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};
}
browser.webRequest.onHeadersReceived.addListener(
eTagFilter,
{urls: ["<all_urls>"]},
["blocking", "responseHeaders"]
);
/**
* Generates a random ETag.
*
* Must be ASCII characters placed between double quotes.
* See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag
*/
function generateDummyEtag(len, quotes = true, w = false) {
let rtn = randomASCII(len);
if (quotes) rtn = '"' + rtn + '"';
if (w) rtn = 'W/' + rtn;
return rtn;
}
/**
* Since Firefox 85, eTags can no longer be
* used for tracking users over multiple sites.
*/
if(getBrowser() !== "Firefox") {
browser.webRequest.onHeadersReceived.addListener(
eTagFilter,
{urls: ["<all_urls>"]},
["blocking", "responseHeaders"]
);
}

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -27,6 +27,9 @@
function injectFunction() {
let ele = document.createElement('script');
let s = document.getElementsByTagName('script')[0];
if (s === undefined) {
return;
}
ele.type = 'text/javascript';
ele.textContent = "Object.defineProperty(window, 'rwt', {" +

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -44,7 +44,7 @@ function historyCleaner(details) {
if(urlBefore !== urlAfter) {
browser.tabs.executeScript(details.tabId, {
frameId: details.frameId,
code: 'history.replaceState({state: "cleaned_history"},"",'+JSON.stringify(urlAfter)+');'
code: 'history.replaceState(null,"",'+JSON.stringify(urlAfter)+');'
}).then(() => {}, onError);
}
}

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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"))

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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++) {

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -147,6 +147,20 @@ function getData() {
changeSwitchButton("domainBlocking", "domainBlocking");
changeSwitchButton("pingBlocking", "pingBlocking");
changeSwitchButton("eTagFiltering", "eTagFiltering");
})
.then(() => {
/**
* Since Firefox 85, eTags can no longer be
* used for tracking users over multiple sites.
*/
browser.runtime.sendMessage({
function: "getBrowser",
params: []
}).then(resp => {
if(resp.response === "Firefox") {
document.getElementById('etag_p').remove();
}
}, null);
}).catch(handleError);
}

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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") {

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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.startsWith('http')) {
rtn = 'http://'+rtn
if (!rtn.startsWith('http')) {
rtn = 'http://' + rtn
}
return rtn;
@@ -367,4 +327,31 @@ async function sha256(message) {
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
}
/**
* Generates a non-secure random ASCII string of length {@code len}.
*
* @returns non-secure random ASCII
*/
function randomASCII(len) {
return [...Array(len)].map(() => (~~(Math.random() * 36)).toString(36)).join('');
}
/**
* Returns an URLSearchParams as string.
* Does handle spaces correctly.
*/
function urlSearchParamsToString(searchParams) {
const rtn = []
searchParams.forEach((value, key) => {
if (value) {
rtn.push(key + '=' + value)
} else {
rtn.push(key)
}
})
return rtn.join('&')
}

21
core_js/utils/Multimap.d.ts vendored Normal file
View 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
View 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
View 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;
}

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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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);

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

10
css/bootstrap.min.css vendored

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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
@@ -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
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 Kevin Röbert
* Copyright (c) 2017-2025 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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
external_js/jquery-3.7.1.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
Copyright (c) 2017-2025 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

View File

@@ -1,6 +1,6 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
Copyright (c) 2017-2025 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
@@ -53,6 +53,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
direction: ltr;
cursor: pointer;
}
#logTable_wrapper .dt-paging {
margin-top: 20px;
margin-bottom: 20px;
}
#logTable_wrapper .dt-search, .dt-length{
margin-bottom: 20px;
}
</style>
</head>
<body>
@@ -112,7 +121,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.6.0.min.js"></script>
<script src="../external_js/jquery-3.7.1.min.js"></script>
<script src="../external_js/datatables.min.js"></script>
<script src="../core_js/log.js"></script>
<script src="../core_js/write_version.js"></script>

View File

@@ -1,6 +1,6 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
Copyright (c) 2017-2025 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
@@ -32,9 +32,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</head>
<body>
<div class="container-fluid"
style="min-width: 200px;">
style="min-width: 200px">
<div class="row">
<nav class="col-sm-1 navbar-margin navbar navbar-dark bg-dark">
<nav class="col-sm-12 navbar-margin navbar navbar-dark bg-dark">
<div class="container">
<span class="navbar-brand">
<span class="float-left"><img src="../img/clearurls.svg"
@@ -53,14 +53,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<div class="row" id="references_section">
<div class="col-sm-1 text-center">
<div class="col-sm-4 offset-sm-4 text-center">
<a id="cleaning_tools" target="_blank"><span class="fas fa-tools" style="font-size: 1.5em; margin-right: 1em;"></span></a>
<a id="settings" target="_blank"><span class="fas fa-cog" style="font-size: 1.5em"></span></a>
</div>
</div>
<div class="row" id="config_section">
<div class="col-sm-1">
<div class="col-sm-4 offset-sm-4">
<h5><b id="configs_head"></b></h5>
<label class="switch">
<input type="checkbox" id="globalStatus">
@@ -91,7 +91,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<div class="row" id="statistic_section">
<div class="col-sm-1">
<div class="col-sm-4 offset-sm-4">
<h5><b id="statistics_head"></b></h5>
<div class="progress">
@@ -133,10 +133,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<div class="row" id="status_section">
<div class="col-sm-1">
<div class="col-sm-4 offset-sm-4">
<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>
@@ -145,7 +145,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</div>
<br />
<div class="row" id="log_section">
<div class="col-sm-1">
<div class="col-sm-4 offset-sm-4">
<div class="text-center">
<a id="loggingPage" target="_blank"
class="btn btn-default btn-sm btn-block text-wrap"></a>

View File

@@ -1,6 +1,6 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
Copyright (c) 2017-2025 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
@@ -157,7 +157,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<span class="slider round"></span>
</label>
</p>
<p>
<p id="etag_p">
<label id="eTag_filtering_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="eTagFiltering">

View File

@@ -1,6 +1,6 @@
<!--
ClearURLs
Copyright (c) 2017-2020 Kevin Röbert
Copyright (c) 2017-2025 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

View File

@@ -1,13 +1,13 @@
{
"manifest_version": 2,
"name": "ClearURLs",
"version": "1.23.1",
"version": "1.27.0",
"author": "Kevin Roebert",
"description": "__MSG_extension_description__",
"homepage_url": "https://docs.clearurls.xyz",
"default_locale": "en",
"content_security_policy": "script-src 'self'; object-src 'none'",
"applications": {
"browser_specific_settings": {
"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",