91 Commits

Author SHA1 Message Date
Kevin Röbert
d58756f716 Merge branch 'master' into next-gen 2020-05-19 17:40:24 +02:00
Kevin Röbert
3ade08f344 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2020-05-19 17:37:37 +02:00
Kevin Röbert
ea256a8081 Exception for api.bilibili.com 2020-05-19 17:37:30 +02:00
Kevin
90ab42a510 Merge branch 'add-privacytools-recommendation' into 'master'
Add PrivacyTools recommendation

See merge request KevinRoebert/ClearUrls!60
2020-05-19 15:34:54 +00:00
Kevin Röbert
c60e33d327 Added exception for zoom.us websocket
#513
2020-05-19 17:26:30 +02:00
Luca Trevisani
9f47a35318 Add PrivacyTools recommendation 2020-05-16 17:25:40 +00:00
Kevin Röbert
e931674dfe Added rules & exceptions
#501
#499
#493
#492
#491
#487
#486
#485
#484
#482
#479
#477
#473
2020-05-15 15:54:14 +02:00
Kevin
ed87f72c75 Merge branch 'patch-1' into 'master'
added some fields for marketscreener.com...

Closes #448

See merge request KevinRoebert/ClearUrls!59
2020-05-15 12:03:31 +00:00
DJCrashdummy
ee2e544223 added some fields for marketscreener.com (https://gitlab.com/KevinRoebert/ClearUrls/-/issues/448#note_343173596) 2020-05-15 09:48:40 +00:00
Kevin
9aaf4718f3 Update README.md 2020-04-28 22:50:21 +00:00
Kevin Röbert
368e96edf1 Merge branch 'master' into next-gen 2020-04-28 02:16:05 +02:00
Kevin Röbert
bdca5d8659 Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2020-04-27 23:57:37 +02:00
Kevin Röbert
caca49b712 Change default logLimit to 100
#475
2020-04-27 23:57:35 +02:00
Röbert
4a1fad9a90 removed overlapping permissions 2020-04-25 15:05:23 +02:00
Kevin Röbert
9fbf5a839a Update rules
#463
#468
#469
#470
2020-04-24 01:19:44 +02:00
Kevin Röbert
8b815c5f50 Revert "Updated rules"
This reverts commit 201f3a9edb.
2020-04-24 01:19:06 +02:00
Kevin Röbert
4370912baa Merge branch 'master' of https://gitlab.com/KevinRoebert/ClearUrls 2020-04-24 01:18:46 +02:00
Kevin Röbert
201f3a9edb Updated rules
#463
#468
#469
#470
2020-04-24 01:17:58 +02:00
Kevin
349c0a79ce Update Bug.md
#478
2020-04-23 22:41:47 +00:00
Kevin Röbert
d74d53c40d Added exception
#471
2020-04-20 22:46:06 +02:00
Kevin Röbert
4030d9325b Update lockdown.yml 2020-04-15 09:05:34 +00:00
Kevin Röbert
fbac0bd1a9 Update lockdown.yml 2020-04-15 09:03:34 +00:00
Kevin Röbert
ec4baefaa1 Merge branch 'master' into next-gen 2020-04-15 01:28:46 +02:00
Kevin Röbert
85ca03fdc0 Merge branch 'KevinRoebert-master-patch-74614' into 'master'
Update .github/lockdown.yml

See merge request KevinRoebert/ClearUrls!58
2020-04-14 23:28:09 +00:00
Kevin Röbert
0fc822a302 Update .github/lockdown.yml 2020-04-14 23:27:57 +00:00
Kevin Röbert
6cc57eae1a Merge branch 'KevinRoebert-master-patch-74450' into 'master'
Update lockdown.yml

See merge request KevinRoebert/ClearUrls!57
2020-04-14 23:26:58 +00:00
Kevin Röbert
694cc4613a Update lockdown.yml 2020-04-14 23:26:16 +00:00
Kevin Röbert
c81dbee1c7 Update data.min.json 2020-04-14 23:12:45 +00:00
Kevin Röbert
3f707bfd3a Version 1.17.0
#457
#462
#445
2020-04-15 00:53:01 +02:00
Kevin Röbert
9d62ddf1b0 Update messages.json (POEditor.com) 2020-04-14 21:26:24 +00:00
Kevin Röbert
1344fd8636 Update messages.json (POEditor.com) 2020-04-14 21:26:23 +00:00
Kevin Röbert
54915cf0de Update messages.json (POEditor.com) 2020-04-14 21:19:19 +00:00
Kevin Röbert
ab325759cd Update messages.json (POEditor.com) 2020-04-14 21:18:17 +00:00
Kevin Röbert
12f63e7f71 Update messages.json (POEditor.com) 2020-04-14 21:16:58 +00:00
Kevin Röbert
7bc3891072 Update messages.json (POEditor.com) 2020-04-14 21:15:14 +00:00
Kevin Röbert
9ff50c965d Update messages.json (POEditor.com) 2020-04-14 21:13:24 +00:00
Kevin Röbert
4014195da8 Update messages.json (POEditor.com) 2020-04-14 21:10:59 +00:00
Kevin Röbert
50aa5e5a73 Update messages.json (POEditor.com) 2020-04-14 21:10:57 +00:00
Kevin Röbert
4a571794dc Update messages.json (POEditor.com) 2020-04-14 21:10:56 +00:00
Kevin Röbert
23d13b0710 Update messages.json (POEditor.com) 2020-04-14 21:10:55 +00:00
Kevin Röbert
d060acae08 Update messages.json (POEditor.com) 2020-04-14 21:10:53 +00:00
Kevin Röbert
28dfe00ff7 Update messages.json (POEditor.com) 2020-04-14 21:10:51 +00:00
Kevin Röbert
5ee667eb92 Update messages.json (POEditor.com) 2020-04-14 21:10:50 +00:00
Kevin Röbert
fda7da7f13 Update messages.json (POEditor.com) 2020-04-14 21:10:48 +00:00
Kevin Röbert
578d4bc48d Update messages.json (POEditor.com) 2020-04-14 21:10:47 +00:00
Kevin Röbert
c7a1c40f9d Update messages.json (POEditor.com) 2020-04-14 21:10:45 +00:00
Kevin Röbert
57e6ed704f Update messages.json (POEditor.com) 2020-04-14 21:10:43 +00:00
Kevin Röbert
9ee55e6536 Update messages.json (POEditor.com) 2020-04-14 21:10:42 +00:00
Kevin Röbert
755db29738 Update messages.json (POEditor.com) 2020-04-14 21:10:40 +00:00
Kevin Röbert
66671aec68 Update messages.json (POEditor.com) 2020-04-14 21:10:38 +00:00
Kevin Röbert
c2f500e060 Update messages.json (POEditor.com) 2020-04-14 21:10:37 +00:00
Kevin Röbert
cfad3d2b23 Update messages.json (POEditor.com) 2020-04-14 21:09:26 +00:00
Kevin Röbert
6d27c8a906 Update messages.json (POEditor.com) 2020-04-14 21:01:06 +00:00
Kevin Röbert
ab19cfd714 Merge branch 'revert-2878af17' into 'master'
Revert "Update messages.json (POEditor.com)"

See merge request KevinRoebert/ClearUrls!56
2020-04-14 20:55:32 +00:00
Kevin Röbert
c64cfbfe86 Revert "Update messages.json (POEditor.com)"
This reverts commit 2878af17b6
2020-04-14 20:55:06 +00:00
Kevin Röbert
b70e0d4912 Update messages.json (POEditor.com) 2020-04-14 20:12:11 +00:00
Kevin Röbert
badc78a954 Added rules and exceptions
#459
#441
#457
#448
#452
2020-04-08 21:20:26 +02:00
Kevin Röbert
c0b7ad9b06 Update README.md 2020-04-02 23:21:38 +00:00
Kevin Röbert
d984b512c0 Update messages.json (POEditor.com) 2020-04-02 22:55:11 +00:00
Kevin Röbert
d4ca4b0362 Update messages.json (POEditor.com) 2020-04-02 22:55:08 +00:00
Kevin Röbert
2878af17b6 Update messages.json (POEditor.com) 2020-04-02 22:55:07 +00:00
Kevin Röbert
86ef50ce91 Update messages.json (POEditor.com) 2020-04-02 22:55:05 +00:00
Kevin Röbert
f46af5615c Merge branch 'master' into next-gen 2020-03-23 23:23:18 +01:00
Kevin Röbert
9afb4fa167 Updated French translation
Special thanks again to Lucifer for the translation into French.
2020-03-23 23:23:06 +01:00
Kevin Röbert
b602b0431a Merge branch 'master' into next-gen 2020-03-20 20:18:37 +01:00
Kevin Röbert
6ee6591019 source fix 2020-03-20 13:20:28 +01:00
Kevin Röbert
eb45b51bcb Updated description 2020-03-20 01:57:46 +01:00
Kevin Röbert
0298792aa1 Version 1.16.0
#362
#440
#429
#428
#431
2020-03-20 01:50:22 +01:00
Kevin Röbert
b1a5b5fcb0 Update README.md 2020-03-19 11:34:27 +00:00
Kevin Röbert
6ae8dd7d22 Add button for MEA 2020-03-19 12:31:00 +01:00
Kevin Röbert
afdf172716 Added rule
#434
#404
2020-03-18 16:12:32 +01:00
Kevin Röbert
31d63fa777 Added rules and exception
#433
#434
#432
#437
#438
2020-03-18 14:52:49 +01:00
Kevin Röbert
59707d7918 Added exception
#427
2020-03-10 20:33:42 +01:00
Kevin Röbert
f0bfe4c8dd Added rules and exception
#409
#411
#414
#418
#419
#420
#421
#424
2020-03-09 22:13:59 +01:00
Kevin Röbert
fa1c3b35ac Merge branch 'master' into next-gen 2020-02-27 17:58:21 +01:00
Kevin Röbert
975ce2fea5 Added new rules 2020-02-27 17:57:32 +01:00
Kevin R
49717332a9 Refactoring 2020-02-27 17:12:47 +01:00
Kevin R
0d5fd4b452 Added new rule
#395
2020-02-27 17:12:09 +01:00
Kevin R
2d9e7c63bb Merge branch 'master' into next-gen 2020-02-27 16:55:46 +01:00
Kevin R
02a26d3231 Added new rules and exceptions
#390 #388 #408
2020-02-27 16:55:31 +01:00
Kevin R
5096150723 Merge branch 'master' into next-gen 2020-02-27 16:06:41 +01:00
Kevin R
88890b853a Fixed spm rule
Added missing question mark
2020-02-27 16:06:06 +01:00
Kevin R
53fb25f43d Added new rules
#402
#405
2020-02-25 21:13:31 +01:00
Kevin Röbert
3370985ee2 Update data.min.json 2020-02-22 21:49:54 +01:00
Kevin Röbert
95fe7eb17d Added new rules
#398
#393
2020-02-22 21:49:23 +01:00
Kevin Röbert
f7949e89f6 Added catch statements 2020-02-20 14:12:06 +01:00
Kevin Röbert
a44e13645c Updated localized extension description 2020-02-20 13:11:19 +01:00
Kevin Röbert
21cf8ec613 Added localized extension description 2020-02-19 18:55:50 +01:00
Kevin Röbert
a8d50a102c Create PRIVACY.md 2020-02-18 16:43:16 +01:00
Kevin Röbert
e79039d210 MS Store promotion 2020-02-17 17:20:55 +01:00
Kevin Röbert
019c2e64a3 Added rules and exception
#385
#387
2020-02-16 17:10:41 +01:00
36 changed files with 1620 additions and 256 deletions

39
.github/lockdown.yml vendored Normal file
View File

@@ -0,0 +1,39 @@
# Configuration for Repo Lockdown - https://github.com/dessant/repo-lockdown
# Skip issues and pull requests created before a given timestamp. Timestamp must
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
#skipCreatedBefore: false
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
#exemptLabels: []
# Comment to post before closing or locking. Set to `false` to disable
#comment: true
# Label to add before closing or locking. Set to `false` to disable
#label: true
# Close issues and pull requests
#close: true
# Lock issues and pull requests
#lock: true
# Limit to only `issues` or `pulls`
#only: pulls
# Optionally, specify configuration settings just for `issues` or `pulls`
issues:
comment: >
This repository is only a mirror of https://gitlab.com/KevinRoebert/ClearUrls. Issues are readed here, but not directly addressed. If possible, please use the GitLab repo or this support mail address: clearurls_1 (at) kevinroebert.de.
lock: false
close: true
pulls:
comment: >
This repository is just a mirror of https://gitlab.com/KevinRoebert/ClearUrls. Only there pull requests accepted.
lock: false
close: true
# Repository to extend settings from
# _extends: repo

View File

@@ -3,7 +3,7 @@ image: debian:latest
before_script:
- export DEBIAN_FRONTEND= noninteractive
- apt-get update -y
- apt-get install -y zip unzip jq nodejs
- apt-get install -y zip unzip nodejs
stages:
- build
@@ -23,30 +23,17 @@ hash rules:
only:
- master
build 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/*
- zip ClearUrls -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
only:
- master
artifacts:
paths:
- ClearUrls_firefox.zip
build chrome:
stage: build
script:
- jq 'del(.applications) | .description=""' 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
- ClearUrls.zip
pages:
stage: deploy

View File

@@ -36,7 +36,7 @@ You do not have to reinstall Firefox or disable all addons. You can just create
* **Version**: [compulsory. you must provide your version]
* **Platform**: [either `uname -a` output, or if Windows, version and 32-bit or
64-bit]
* **Country**: [The country from which you called the page. You can found your country here: http://ip-api.com/json/?fields=country]
* **Country**: [The country from which you called the page. You can found your country here: https://ipapi.co//country_capital]
### Log
<!-- Please enable the log functionality of ClearURLs and attach the exported log to this bug report. -->

View File

@@ -4,6 +4,58 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [1.17.0] - 2020-04-14
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Changed
- Updated some strings of Spanish translation
- Updated some strings of French translation
- Updated some strings of Italian translation
- Updated some strings of Russian translation
- Updated some strings of Swedish translation
- Updated some strings of Turkish translation
- Updated some strings of Ukrainian translation
- Updated some strings of Chinese Simple translation
### Fixed
- Fixed a typo in the path to the Datatables JavaScript file
- Fixed [#445](https://gitlab.com/KevinRoebert/ClearUrls/issues/445)
- Fixed [#462](https://gitlab.com/KevinRoebert/ClearUrls/issues/462)
### Added
- Added check for setBadgeTextColor function (only supported in Firefox)
### Removed
- Removed browser-polyfill content script import (seems no longer needed)
- Removed old `applications` value
## [1.16.0] - 2020-03-20
### Compatibility note
- Require Firefox >= 55
- Require Chrome >= 22
### Added
- Added ETag header filtering [#362](https://gitlab.com/KevinRoebert/ClearUrls/issues/362), [#440](https://gitlab.com/KevinRoebert/ClearUrls/issues/440). Hint: Cache must be cleared before first use, to delete the already existing ETags.
### Fixed
- Fixed spontaneous disappearance of the badged
- Fixed wrong counting of blocked elements (too little was ;D)
### Changed
- Updated all translation
- Changed badged font color to #FFFFFF
- Changed watchdog behavior as follows [#428](https://gitlab.com/KevinRoebert/ClearUrls/issues/428), [#431](https://gitlab.com/KevinRoebert/ClearUrls/issues/431), [#429](https://gitlab.com/KevinRoebert/ClearUrls/issues/429):
- Increased watchdog interval to 60 seconds
- Executed watchdog only if ClearURLs is also active
- Watchdog restarts ClearURLs at most 3 times and only if ClearURLs has rules
- Changed behavior of downloading rules [#428](https://gitlab.com/KevinRoebert/ClearUrls/issues/428), [#431](https://gitlab.com/KevinRoebert/ClearUrls/issues/431), [#429](https://gitlab.com/KevinRoebert/ClearUrls/issues/429):
- If download of hash file fails and no local rules are available, then ClearURLs displays `hash_status_code_5` and deactivates itself
- If download of rules file fails and no local rules are available, then ClearURLs displays `hash_status_code_5` and deactivates itself
## [1.15.0] - 2020-02-16
### Compatibility note

6
PRIVACY.md Normal file
View File

@@ -0,0 +1,6 @@
ClearURLs protects and respects your privacy.
We do not collect any of your usage data. Furthermore ClearURLs has no home server nor embed any kind of analytic hooks in its code.
The only time ClearURLs connects to a remote server (gitlab.io) is to update the rules file and the associated hash file. You can replace the default update address with your own address at any time in the settings.
The project and the rule file is currently hosted on gitlab.com, which is owned by GitLab Inc. and thus is unrelated to ClearURLs.

View File

@@ -1,6 +1,6 @@
<a href="https://www.buymeacoffee.com/KevinRoebert" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="51" width="217"></a>
<a href="https://www.buymeacoffee.com/KevinRoebert" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/default-orange.png" alt="Buy Me A Coffee" height="60"></a>
[<img src="https://addons.cdn.mozilla.net/static/img/addons-buttons/AMO-button_1.png" alt="for Firefox">](https://addons.mozilla.org/en-US/firefox/addon/clearurls/) [<img src="https://developer.chrome.com/webstore/images/ChromeWebStore_BadgeWBorder_v2_206x58.png" alt="for Chrome">](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/en-US/firefox/addon/clearurls/) [<img src="https://gitlab.com/KevinRoebert/ClearUrls/-/raw/master/promotion/MEA-button.png" alt="for Edge" height="60px">](https://microsoftedge.microsoft.com/addons/detail/mdkdmaickkfdekbjdoojfalpbkgaddei) [<img src="https://developer.chrome.com/webstore/images/ChromeWebStore_BadgeWBorder_v2_206x58.png" alt="for Chrome" height="60px">](https://chrome.google.com/webstore/detail/clearurls/lckanjgmijmafbedllaakclkaicjfmnk)
# <sub><img src="https://gitlab.com/KevinRoebert/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs
@@ -29,6 +29,7 @@ Indeed most of the above URL is tracking code. Once ClearURLs has cleaned the ad
* Supports redirection to the destination, without tracking services as middleman
* Adds an entry to the context menu so that links can be copied quickly and cleanly
* Blocks hyperlink auditing, also known as *ping tracking* (see also [this article](https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing))
* Prevents ETag tracking
* Prevents tracking injection over history API (see also: [The replaceState() method](https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method))
* Prevents Google from rewriting the search results (to include tracking elements)
* Prevents Yandex from rewriting the search results (to include tracking elements)
@@ -42,12 +43,10 @@ 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:
[Firefox](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearUrls_firefox.zip?job=build%20firefox)
[Chrome](https://gitlab.com/KevinRoebert/ClearUrls/-/jobs/artifacts/master/raw/ClearUrls_chrome.zip?job=build%20chrome)
[<img src="promotion/download-128.png"/>](https://gitlab.com/KevinRoebert/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://clearurls.roebert.eu/](https://clearurls.roebert.eu/)
If you want to test whether ClearURLs works correctly on your system, you can go to this test page: [https://kevinroebert.gitlab.io/ClearUrls/](https://kevinroebert.gitlab.io/ClearUrls/)
## Contribute
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/KevinRoebert/ClearUrls/issues/new)
@@ -71,10 +70,12 @@ Please push your translation into the folder `_locales/{country code}/messages.j
## Projects that use parts of ClearURLs
* [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
## Recommended by...
* [ghacks-user.js](https://github.com/ghacksuserjs/ghacks-user.js/wiki/4.1-Extensions)
* [Awesome Humane Tech List](https://github.com/humanetech-community/awesome-humane-tech#tracking)
* [PrivacyTools](https://www.privacytools.io/browsers/#addons)
* ClearURLs is part of Mozilla's recommended extensions program
## Permissions

View File

@@ -302,8 +302,14 @@
"description": "Diese Zeichenkette wird als Titel für das Referral-Marketing verwendet."
},
"watchdog": {
"message": "[ClearURLs]: Der Watchdog hat ein Problem festgestellt. ClearURLs wird neugestartet.",
"description": "Diese Zeichenkette wird als Text für den Watchdog verwendet."
"message": "[ClearURLs]: Der Watchdog hat ein Problem festgestellt und ist bereits das $TIMES$-te mal gescheitert.",
"description": "Diese Zeichenkette wird als Text für den Watchdog verwendet.",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"domain_blocking_enabled": {
"message": "Erlaube Domain-Blocking (Kann zu Problemen auf Seiten führen, die AdBlocker nicht erlauben)",
@@ -324,5 +330,21 @@
"ping_blocking_enabled_title": {
"message": "Blockiere Hyperlink Auditing Anfragen",
"description": "Diese Zeichenkette wird als Titel für das Hyperlink Auditing-Blocking verwendet."
},
"extension_description": {
"message": "Entfernt Tracking-Elemente von URLs.",
"description": "Erweiterungsbeschreibung (max. 132 Zeichen)"
},
"eTag_filtering_log": {
"message": "ETag-Header wurde aus dieser Anfrage entfernt",
"description": "Diese Zeichenkette wird für das Filtern von ETag-Headern im ClearURL-Protokoll verwendet."
},
"eTag_filtering_enabled": {
"message": "Filtert die ETag-Header aus den Anfragen (Siehe auch <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>diesen Artikel</a>)",
"description": "Diese Zeichenkette wird als Beschreibung für das Filtern von ETag-Headern verwendet."
},
"eTag_filtering_enabled_title": {
"message": "Filtert ETag-Header. Info: Cache muss vor der ersten Benutzung geleert werden.",
"description": "Diese Zeichenkette wird als Titel für das Filtern von ETag-Headern verwendet."
}
}

View File

@@ -302,8 +302,14 @@
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: The watchdog has detected a problem. ClearURLs is restarting.",
"description": "This string is used as text for the watchdog"
"message": "[ClearURLs]: The watchdog has detected a problem and has already failed $TIMES$ times.",
"description": "This string is used as text for the watchdog",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"domain_blocking_enabled": {
"message": "Allow domain blocking (Can lead to problems on pages that do not allow AdBlockers)",
@@ -324,5 +330,21 @@
"ping_blocking_enabled_title": {
"message": "Block hyperlink auditing",
"description": "This string is used as title for the hyperlink auditing blocking switch"
},
"extension_description": {
"message": "Remove tracking elements from URLs.",
"description": "Extension description (max. 132 characters)"
},
"eTag_filtering_log": {
"message": "ETag header was removed from this request",
"description": "This string is used on ETag header filtering in the ClearURLs log."
},
"eTag_filtering_enabled": {
"message": "Filters ETag headers from requests (See also <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>this article</a>)",
"description": "This string is used as label for the ETag header filtering switch"
},
"eTag_filtering_enabled_title": {
"message": "Filters ETag headers. Hint: Cache must be cleared before first use.",
"description": "This string is used as title for the ETag header filtering switch"
}
}

View File

@@ -299,11 +299,17 @@
},
"referral_marketing_enabled_title": {
"message": "Permettre certaines actions commerciales",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
"description": "Sert à afficher la signification de la fonction sur la switch"
},
"watchdog": {
"message": "[ClearURLs]: Temps ou délais dexécution imparti dépassé. ClearURLs doit redémarrer.",
"description": "Sert à afficher la signification de la fonction sur la page qui affiche les options."
"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",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"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",
@@ -322,7 +328,23 @@
"description": "Utilisé pour le bouton activer/désactiver l'audit (espionnages) des liens hypertextes"
},
"ping_blocking_enabled_title": {
"message": "Bloquer lespionnage des clics souris sur les liens hypertextes",
"description": "Utilisé pour le bouton activer/désactiver de l'audit (espionnages) des liens hypertextes"
"message": "Bloquer lespionnage auditing",
"description": "Utilisé comme titre pour le bouton, commutateur, 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."
},
"eTag_filtering_log": {
"message": "Lidentification ETag a été supprimée",
"description": "Utilisé pour 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"
},
"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"
}
}

View File

@@ -303,7 +303,13 @@
},
"watchdog": {
"message": "[ClearURLs]: сторожевой таймер обнаружил проблему. ClearURLs будет перезапущен.",
"description": "This string is used as text for the watchdog"
"description": "This string is used as text for the watchdog",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"domain_blocking_enabled": {
"message": "Разрешить блокировку домена (может вызвать проблемы на сайтах, которые запрещают AdBlocker)",
@@ -324,5 +330,21 @@
"ping_blocking_enabled_title": {
"message": "Блокировка аудита гиперссылок",
"description": "This string is used as title for the hyperlink auditing blocking switch"
},
"extension_description": {
"message": "Удаление элементов слежения из URL-адресов.",
"description": "Описание расширения"
},
"eTag_filtering_log": {
"message": "Заголовок ETag был удален из этого запроса",
"description": "This string is used on ETag header filtering in the ClearURLs log."
},
"eTag_filtering_enabled": {
"message": "Фильтровать заголовки ETag из запросов (см. <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>эту статью</a>)",
"description": "This string is used as label for the ETag header filtering switch"
},
"eTag_filtering_enabled_title": {
"message": "Фильтрация заголовков ETag. Примечание: очистите кэш перед первым использованием.",
"description": "This string is used as title for the ETag header filtering switch"
}
}

View File

@@ -303,7 +303,13 @@
},
"watchdog": {
"message": "[ClearURL'ler]: Güvenlik Zamanlayıcısı bir sorun tespit etti. ClearURL'ler yeniden başlatıldı.",
"description": "Bu dize güvenlik zamanlayıcısı için metin olarak kullanılır."
"description": "Bu dize güvenlik zamanlayıcısı için metin olarak kullanılır.",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"domain_blocking_enabled": {
"message": "Alan adı engellemeye izin ver (Reklam Engelleyicilere izin vermeyen sayfalarda sorunlara neden olabilir)",
@@ -324,5 +330,21 @@
"ping_blocking_enabled_title": {
"message": "Köprü denetimini engelle",
"description": "Bu dize köprü denetim engelleme anahtarının başlığı olarak kullanılır"
},
"extension_description": {
"message": "İzleme öğelerini URL'lerden kaldırın.",
"description": "Uzantııklaması."
},
"eTag_filtering_log": {
"message": "ETag başlığı bu istekten kaldırıldı",
"description": "Bu dize, ClearURLs günlüğünde ETag üstbilgisi filtrelemesinde kullanılır."
},
"eTag_filtering_enabled": {
"message": "ETag başlıklarını isteklerden filtreler (Ayrıca bkz. <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>Bu makaleye</a>)",
"description": "Bu dize, ETag başlık filtreleme anahtarı için etiket olarak kullanılır"
},
"eTag_filtering_enabled_title": {
"message": "ETag başlıklarını filtreler. İpucu: İlk kullanımdan önce önbellek temizlenmelidir.",
"description": "Bu dize, ETag başlık filtreleme anahtarının başlığı olarak kullanılır"
}
}

View File

@@ -72,7 +72,7 @@
"description": "This string is used as title for the filter switch button on the popup page."
},
"popup_html_configs_switch_log": {
"message": "Журнал",
"message": "Логування",
"description": "This string is used as name for the logging switch button on the popup page."
},
"popup_html_configs_switch_log_title": {
@@ -198,5 +198,153 @@
"donate_button": {
"message": "Внесок для розробників ClearURLs.",
"description": "This string is used to refer to a donation page."
},
"clipboard_copy_link": {
"message": "Скопіювати \"чисте\" посилання",
"description": "This string is used in the context menu to copy clean links."
},
"context_menu_enabled": {
"message": "Відобразити контекстне меню",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Запобігти трекінг через API історії браузеру (див. також: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>Метод replaceState()</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs є утилітою очищення посилань",
"description": "This string is used as title on the cleaning tool page."
},
"cleaning_tool_description": {
"message": "За допомогою цієї утиліти ви можете вставити URL-адреси для ії \"очищення\" після натискання на зелену кнопку. Ви можете вставити відразу кілька URL-адрес, але кожна URL-адреса повинна бути на окремому рядку.",
"description": "This string is used as description of the cleaning tool."
},
"cleaning_tool_btn": {
"message": "\"Чисті\" посилання",
"description": "This string is used as name for the clean url button."
},
"cleaning_tool_dirty_urls_label": {
"message": "Тут ви можете вставити \"брудні\" посилання:",
"description": "This string is used as title on the cleaning tool page for the dirty URLs."
},
"cleaning_tool_clean_urls_label": {
"message": "Тут ви можете знайти \"чисті\" посилання:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "Не фільтрувати посилання на локальних адресах (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": "Не фільтрує посилання на локальних адресах",
"description": "This string is used as title for the local host skipping switch"
},
"log_html_export_button": {
"message": "Експорт",
"description": "This string is used for the export button on the log page."
},
"log_html_export_button_title": {
"message": "Експортувати глобальний лог",
"description": "This string is used as title for the export button on the log page."
},
"log_html_import_button": {
"message": "Імпорт",
"description": "This string is used for the import button on the log page."
},
"log_html_import_button_title": {
"message": "Імпортувати глобальний лог",
"description": "This string is used as title for the import button on the log page."
},
"setting_html_export_button": {
"message": "Експрот",
"description": "This string is used as name for the export button on the settings page."
},
"setting_html_export_button_title": {
"message": "Експортує все",
"description": "This string is used as title for the export button on the settings page."
},
"setting_html_import_button": {
"message": "Імпорт",
"description": "This string is used as name for the reset button on the settings page."
},
"setting_html_import_button_title": {
"message": "Імпортує все",
"description": "This string is used as title for the import button on the settings page."
},
"setting_log_limit_label": {
"message": "Обмежити логування $LIMIT$ записів.",
"description": "This string is used as name for the log limit label.",
"placeholders": {
"limit": {
"content": "$1",
"example": "100"
}
}
},
"blocked_html_title": {
"message": "Цей сайт було заблоковано додатком <b>ClearURLs</b>",
"description": "This string is used as title on the blocked site page."
},
"blocked_html_body": {
"message": "Цей сайт було заблоковано додатком <b>ClearURLs</b>, оскільки ми ідентифікували його як рекламний і/або трекінговий сервіс.\nДля того, щоб відвідати цей сайт, ви повинні тимчасово відключати додаток або виключати блокування доменів в налаштуваннях ClearURLs.\nПісля цього ви зможете натитснути кнопку нижче, щоб завантажити сторінку.",
"description": "This string is used as body on the blocked site page."
},
"blocked_html_button": {
"message": "Відвідати сторінку",
"description": "This string is used as button on the blocked site page."
},
"referral_marketing_enabled": {
"message": "Дозволити реферальний маркетинг",
"description": "This string is used as label for the referral marketing switch"
},
"referral_marketing_enabled_title": {
"message": "Дозволяє реферальний маркетинг",
"description": "This string is used as title for the referral marketing switch"
},
"watchdog": {
"message": "[ClearURLs]: \"Сторожовий пес\" помітив проблему та вилетів $TIMES$ разів.\n",
"description": "This string is used as text for the watchdog",
"placeholders": {
"times": {
"content": "$1",
"example": "3"
}
}
},
"domain_blocking_enabled": {
"message": "Дозволити блокування домену (Може привести до проблем на сайтах, які блокують AdBlocker'и)",
"description": "This string is used as label for the domain blocking switch"
},
"domain_blocking_enabled_title": {
"message": "Дозволити блокування домену (Може привести до проблем на сайтах, які блокують AdBlocker'и)",
"description": "This string is used as title for the domain blocking switch"
},
"log_ping_blocked": {
"message": "Цей аудит гіперпосилань було заблоковано",
"description": "This string is used on hyperlink auditing in the ClearURLs log."
},
"ping_blocking_enabled": {
"message": "Відключити аудит гіперпосилань (див. також <a href='https://html.spec.whatwg.org/multipage/links.html#hyperlink-auditing' target='_blank'>цю статтю</a>)",
"description": "This string is used as label for the hyperlink auditing blocking switch"
},
"ping_blocking_enabled_title": {
"message": "Блокувати аудит гіперпосилань",
"description": "This string is used as title for the hyperlink auditing blocking switch"
},
"extension_description": {
"message": "Видалити елементи трекінгу з посилань",
"description": "Опис додатку (максимум 132 символи)"
},
"eTag_filtering_log": {
"message": "ETag був видалений з цього запиту",
"description": "Ця стрічка використовується для фільтрації заголовків ETag у журналі ClearURL."
},
"eTag_filtering_enabled": {
"message": "Фільтрує ETag заголовки в запитах (див. також <a href='https://en.wikipedia.org/wiki/HTTP_ETag#Tracking_using_ETags' target='_blank'>цю статтю</a>)",
"description": "Цей рядок використовується, як мітка для перемикача фільтра заголовка ETag"
},
"eTag_filtering_enabled_title": {
"message": "Фільтри заголовків ETag. \nПідказка: Кеш повинен бути скинутим перед першим використанням.",
"description": "Цей рядок використовується, як заголовок для перемикача фільтра заголовка ETag"
}
}

View File

@@ -207,10 +207,6 @@
"message": "显示右键选单条目",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (详见: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs的网址清理工具",
"description": "This string is used as title on the cleaning tool page."
@@ -230,5 +226,9 @@
"cleaning_tool_clean_urls_label": {
"message": "清理后的网址:",
"description": "This string is used as title on the cleaning tool page for the clean URLs."
},
"local_hosts_skipping": {
"message": "跳过本地主机链接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"
}
}

View File

@@ -207,10 +207,6 @@
"message": "顯示右鍵選單項目",
"description": "This string is used toggle the context menu entry to copy clean links."
},
"history_listener_enabled": {
"message": "Prevent tracking injection over history API (詳見: <a href='https://developer.mozilla.org/en-US/docs/Web/API/History_API#The_replaceState()_method' target='_blank'>The replaceState() method</a>)",
"description": "This string is used as name for the history API listener label."
},
"cleaning_tool_page_title": {
"message": "ClearURLs的網址清理工具",
"description": "This string is used as title on the cleaning tool page."

View File

@@ -22,24 +22,22 @@
*/
var providers = [];
var prvKeys = [];
var badges = [];
var tabid = 0;
var siteBlockedAlert = 'javascript:void(0)';
var dataHash;
var localDataHash;
var os;
var currentURL;
/**
* Helper function which remove the tracking fields
* for each provider given as parameter.
*
* @param {Provider} provider Provider-Object
* @param pureUrl URL as String
* @param {boolean} quiet if the action should be displayed in log and statistics
* @return {Array} Array with changes and url fields
* @param {string} pureUrl URL as String
* @param {boolean} quiet If the action should be displayed in log and statistics
* @param {requestDetails} request The request details
* @return {object} Object with changes and url fields
*/
function removeFieldsFormURL(provider, pureUrl, quiet = false) {
function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
let url = pureUrl;
let domain = "";
let fragments = "";
@@ -70,7 +68,7 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
pushToLog(beforeReplace, url, rawRule);
}
increaseBadged(quiet);
increaseBadged(quiet, request);
changes = true;
}
});
@@ -84,14 +82,18 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
/*
* Expand the url by provider redirections. So no tracking on
* url redirections form sites to sites.
* url redirections form site to site.
*/
let re = provider.getRedirection(url);
if (re !== null) {
url = decodeURL(re);
//Log the action
if (!quiet) pushToLog(pureUrl, url, translate('log_redirect'));
if (!quiet) {
pushToLog(pureUrl, url, translate('log_redirect'));
increaseGlobalURLCounter(1);
increaseBadged(false, request);
}
return {
"redirect": true,
@@ -131,7 +133,7 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
if (!quiet) pushToLog(tempBeforeURL, tempURL, rule);
}
increaseBadged(quiet);
increaseBadged(quiet, request);
changes = true;
}
});
@@ -146,7 +148,8 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false) {
if (provider.isCaneling() && storage.domainBlocking) {
if (!quiet) pushToLog(pureUrl, pureUrl, translate('log_domain_blocked'));
increaseBadged(quiet);
increaseGlobalURLCounter(1);
increaseBadged(quiet, request);
cancel = true;
}
@@ -228,13 +231,26 @@ function start() {
}
/**
* Get the hash for the rule file on github.
* Deactivates ClearURLs, if no rules can be downloaded and also no old rules in storage
*/
function deactivateOnFailure() {
if(storage.ClearURLsData.length === 0) {
storage.globalStatus = false;
storage.dataHash = "";
changeIcon();
storeHashStatus(5);
saveOnExit();
}
}
/**
* Get the hash for the rule file on GitLab.
* Check the hash with the hash form the local file.
* If the hash has changed, then download the new rule file.
* Else do nothing.
*/
function getHash() {
//Get the target hash from github
//Get the target hash from GitLab
fetch(storage.hashURL)
.then(function (response) {
const responseTextHash = response.clone().text().then(function (responseTextHash) {
@@ -250,6 +266,7 @@ function start() {
}
} else {
dataHash = false;
deactivateOnFailure();
}
});
});
@@ -279,6 +296,8 @@ function start() {
storage.ClearURLsData = JSON.parse(storage.ClearURLsData);
toObject(storage.ClearURLsData);
saveOnDisk(['ClearURLsData', 'dataHash', 'hashStatus']);
} else {
deactivateOnFailure();
}
});
}
@@ -559,7 +578,8 @@ function start() {
if (storage.pingBlocking && storage.pingRequestTypes.includes(request.type)) {
pushToLog(request.url, request.url, translate('log_ping_blocked'));
increaseBadged();
increaseBadged(false, request);
increaseGlobalURLCounter(1);
return {cancel: true};
}
@@ -567,9 +587,8 @@ function start() {
* Call for every provider the removeFieldsFormURL method.
*/
for (let i = 0; i < providers.length; i++) {
if (providers[i].matchURL(request.url)) {
result = removeFieldsFormURL(providers[i], request.url);
result = removeFieldsFormURL(providers[i], request.url, false, request);
}
/*
@@ -579,7 +598,7 @@ function start() {
if (result.redirect) {
if (providers[i].shouldForceRedirect() &&
request.type === 'main_frame') {
browser.tabs.update(request.tabId, {url: result.url});
browser.tabs.update(request.tabId, {url: result.url}).catch(handleError);
return {cancel: true};
}
@@ -595,7 +614,7 @@ function start() {
if (result.cancel) {
if (request.type === 'main_frame') {
const blockingPage = browser.extension.getURL("html/siteBlockedAlert.html?source=" + encodeURIComponent(request.url));
browser.tabs.update(request.tabId, {url: blockingPage});
browser.tabs.update(request.tabId, {url: blockingPage}).catch(handleError);
return {cancel: true};
} else {
@@ -629,39 +648,6 @@ function start() {
getHash();
setBadgedStatus();
/**
* Call by each tab is updated.
* And if url has changed.
*/
function handleUpdated(tabId, changeInfo, tabInfo) {
if (changeInfo.url) {
delete badges[tabId];
}
currentURL = tabInfo.url;
}
/**
* Call by each tab is updated.
*/
browser.tabs.onUpdated.addListener(handleUpdated);
/**
* Call by each tab change to set the actual tab id
*/
function handleActivated(activeInfo) {
tabid = activeInfo.tabId;
browser.tabs.get(tabid).then(function (tab) {
if (!browser.runtime.lastError) { // https://gitlab.com/KevinRoebert/ClearUrls/issues/346
currentURL = tab.url;
}
});
}
/**
* Call by each tab change.
*/
browser.tabs.onActivated.addListener(handleActivated);
/**
* Check the request.
*/
@@ -697,53 +683,3 @@ function start() {
["blocking"]
);
}
/**
* Function to log all activities from ClearUrls.
* Only logging when activated.
* The log is only temporary saved in the cache and will
* permanently saved with the saveLogOnClose function.
*
* @param beforeProcessing the url before the clear process
* @param afterProcessing the url after the clear process
* @param rule the rule that triggered the process
*/
function pushToLog(beforeProcessing, afterProcessing, rule) {
const limit = storage.logLimit;
if (storage.loggingStatus && limit !== 0) {
if (limit > 0 && !isNaN(limit)) {
while (storage.log.log.length >= limit) {
storage.log.log.shift();
}
}
storage.log.log.push(
{
"before": beforeProcessing,
"after": afterProcessing,
"rule": rule,
"timestamp": Date.now()
}
);
deferSaveOnDisk('log');
}
}
/**
* Increases the badged by one.
*/
function increaseBadged(quiet = false) {
if (badges[tabid] == null) badges[tabid] = 0;
if (!quiet) increaseURLCounter();
checkOSAndroid().then((res) => {
if (!res) {
if (storage.badgedStatus && !quiet) {
browser.browserAction.setBadgeText({text: (++badges[tabid]).toString(), tabId: tabid});
} else {
browser.browserAction.setBadgeText({text: "", tabId: tabid});
}
}
});
}

77
core_js/badgedHandler.js Normal file
View File

@@ -0,0 +1,77 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 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/>.
*/
/*jshint esversion: 6 */
/*
* This script is responsible for setting the badged.
*/
let badges = {};
/**
* Increases the badged by one.
*/
function increaseBadged(quiet = false, request) {
if (!quiet) increaseURLCounter();
if(request === null) return;
const tabId = request.tabId;
const url = request.url;
if(tabId === -1) return;
if (badges[tabId] == null) {
badges[tabId] = {
counter: 1,
lastURL: url
};
} else {
badges[tabId].counter += 1;
}
checkOSAndroid().then((res) => {
if (!res) {
if (storage.badgedStatus && !quiet) {
browser.browserAction.setBadgeText({text: (badges[tabId]).counter.toString(), tabId: tabId}).catch(handleError);
} else {
browser.browserAction.setBadgeText({text: "", tabId: tabId}).catch(handleError);
}
}
});
}
/**
* Call by each tab is updated.
* And if url has changed.
*/
function handleUpdated(tabId, changeInfo, tabInfo) {
if(!badges[tabId] || !changeInfo.url) return;
if (badges[tabId].lastURL !== changeInfo.url) {
badges[tabId] = {
counter: 0,
lastURL: tabInfo.url
};
}
}
/**
* Call by each tab is updated.
*/
browser.tabs.onUpdated.addListener(handleUpdated);

View File

@@ -42,7 +42,7 @@ function contextMenuStart() {
if (!results || results[0] !== true) {
return browser.tabs.executeScript(tab.id, {
file: "/external_js/clipboard-helper.js",
});
}).catch(handleError);
}
}).then(() => {
return browser.tabs.executeScript(tab.id, {

46
core_js/eTagFilter.js Normal file
View File

@@ -0,0 +1,46 @@
/*
* ClearURLs
* Copyright (c) 2017-2020 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/>.
*/
/*jshint esversion: 6 */
/**
* Filters eTag headers from web requests.
*/
function eTagFilter(requestDetails) {
if(!requestDetails.responseHeaders || !storage.eTagFiltering
|| storage.localHostsSkipping && checkLocalURL(requestDetails.url)) return {};
const responseHeaders = requestDetails.responseHeaders;
const filteredHeaders = responseHeaders.filter(header => {
return header.name.toLowerCase() !== "etag";
});
if(filteredHeaders.length < responseHeaders.length) {
pushToLog(requestDetails.url, requestDetails.url, translate("eTag_filtering_log"));
increaseBadged(false, requestDetails);
increaseGlobalURLCounter(1);
return {responseHeaders: filteredHeaders};
}
}
browser.webRequest.onHeadersReceived.addListener(
eTagFilter,
{urls: ["<all_urls>"]},
["blocking", "responseHeaders"]
);

View File

@@ -30,7 +30,7 @@
ele.type = 'text/javascript';
ele.textContent = "Object.defineProperty(window, 'rwt', {" +
" value: function() { return false; }," +
" value: function() { return true; }," +
" writable: false," +
" configurable: false" +
"});";

View File

@@ -31,7 +31,7 @@ function resetGlobalLog(){
browser.runtime.sendMessage({
function: "setData",
params: ['log', JSON.stringify(obj)]
});
}).catch(handleError);
location.reload();
}
@@ -72,7 +72,7 @@ function getLog()
"url": getDataTableTranslation()
}
} ).order([3, 'desc']).draw();
});
}).catch(handleError);
}
/**
@@ -107,8 +107,8 @@ function exportGlobalLog() {
'url': URL.createObjectURL(blob),
'filename': 'ClearURLsLogExport.json',
'saveAs': true
});
});
}).catch(handleError);
}).catch(handleError);
}
/**

View File

@@ -99,15 +99,15 @@ function changeSwitchButton(id, storageID)
browser.runtime.sendMessage({
function: "changeIcon",
params: []
});
}).catch(handleError);
}
changeVisibility(id, storageID);
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
});
}).catch(handleError);
}).catch(handleError);
});
}
@@ -162,17 +162,17 @@ function resetGlobalCounter(){
browser.runtime.sendMessage({
function: "setData",
params: ['globalCounter', 0]
});
}).catch(handleError);
browser.runtime.sendMessage({
function: "setData",
params: ['globalurlcounter', 0]
});
}).catch(handleError);
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
}).catch(handleError);
globalCounter = 0;
globalurlcounter = 0;

View File

@@ -107,7 +107,7 @@ function getData()
} else {
$('#logLimit_label').text(translate('setting_log_limit_label', logData.response));
}
});
}).catch(handleError);
loadData("contextMenuEnabled")
.then(() => loadData("historyListenerEnabled"))
@@ -115,6 +115,7 @@ function getData()
.then(() => loadData("referralMarketing"))
.then(() => loadData("domainBlocking"))
.then(() => loadData("pingBlocking"))
.then(() => loadData("eTagFiltering"))
.then(() => {
changeSwitchButton("localHostsSkipping", "localHostsSkipping");
changeSwitchButton("historyListenerEnabled", "historyListenerEnabled");
@@ -122,7 +123,8 @@ function getData()
changeSwitchButton("referralMarketing", "referralMarketing");
changeSwitchButton("domainBlocking", "domainBlocking");
changeSwitchButton("pingBlocking", "pingBlocking");
});
changeSwitchButton("eTagFiltering", "eTagFiltering");
}).catch(handleError);
}
/**
@@ -189,6 +191,8 @@ function setText()
injectText("domain_blocking_enabled", "domain_blocking_enabled");
$('#ping_blocking_enabled').html(translate('ping_blocking_enabled'))
.prop('title', translate('ping_blocking_enabled_title'));
$('#eTag_filtering_enabled').html(translate('eTag_filtering_enabled'))
.prop('title', translate('eTag_filtering_enabled_title'))
}
/**
@@ -205,8 +209,8 @@ function exportSettings() {
'url': URL.createObjectURL(blob),
'filename': 'ClearURLs.conf',
'saveAs': true
});
});
}).catch(handleError);
}).catch(handleError);
}
/**
@@ -262,14 +266,14 @@ function changeSwitchButton(id, storageID)
browser.runtime.sendMessage({
function: "changeIcon",
params: []
});
}).catch(handleError);
}
browser.runtime.sendMessage({
function: "saveOnExit",
params: []
});
});
}).catch(handleError);
}).catch(handleError);
});
setSwitchButton(id, storageID);
}
@@ -279,7 +283,7 @@ function changeSwitchButton(id, storageID)
*
* @param {string} id ID of the HTML element
* @param {string} attribute Name of the attribute used for localization
* @param {boolean} tooltip
* @param {string} tooltip
*/
function injectText(id, attribute, tooltip = "")
{

View File

@@ -75,7 +75,7 @@ function saveOnDisk(keys) {
});
console.log(translate('core_save_on_disk'));
browser.storage.local.set(json);
browser.storage.local.set(json).catch(handleError);
}
/**
@@ -114,7 +114,7 @@ function genesis() {
// Start history listener
historyListenerStart();
}, error);
}, handleError);
}
/**
@@ -164,14 +164,6 @@ function setData(key, value) {
}
}
/**
* Write error on console.
*/
function error(e) {
console.log(translate('core_error'));
console.error(e);
}
/**
* Set default values, if the storage is empty.
* @param {Object} items
@@ -207,9 +199,11 @@ function initSettings() {
storage.historyListenerEnabled = true;
storage.localHostsSkipping = true;
storage.referralMarketing = false;
storage.logLimit = -1;
storage.logLimit = 100;
storage.domainBlocking = true;
storage.pingBlocking = true;
storage.eTagFiltering = true;
storage.watchDogErrorCount = 0;
if (getBrowser() === "Firefox") {
storage.types = ["font", "image", "imageset", "main_frame", "media", "object", "object_subrequest", "other", "script", "stylesheet", "sub_frame", "websocket", "xbl", "xml_dtd", "xmlhttprequest", "xslt"];
@@ -276,6 +270,10 @@ function storeHashStatus(status_code) {
case 3:
status_code = "hash_status_code_3";
break;
case 5:
status_code = "hash_status_code_5";
break;
case 4:
default:
status_code = "hash_status_code_4";
}

View File

@@ -48,9 +48,11 @@ function isEmpty(obj) {
* Translate a string with the i18n API.
*
* @param {string} string Name of the attribute used for localization
* @param {string[]} placeholders Array of placeholders
*/
function translate(string) {
return browser.i18n.getMessage(string);
function translate(string, ...placeholders)
{
return browser.i18n.getMessage(string, placeholders);
}
/**
@@ -181,32 +183,6 @@ function loadOldDataFromStore() {
localDataHash = storage.dataHash;
}
/**
* Save the hash status to the local storage (RAM).
* The status can have the following values:
* 1 "up to date"
* 2 "updated"
* 3 "update available"
* @param status_code the number for the status
*/
function storeHashStatus(status_code) {
switch (status_code) {
case 1:
status_code = "hash_status_code_1";
break;
case 2:
status_code = "hash_status_code_2";
break;
case 3:
status_code = "hash_status_code_3";
break;
default:
status_code = "hash_status_code_4";
}
storage.hashStatus = status_code;
}
/**
* Increase by {number} the GlobalURLCounter
* @param {int} number
@@ -235,9 +211,9 @@ function changeIcon() {
checkOSAndroid().then((res) => {
if (!res) {
if (storage.globalStatus) {
browser.browserAction.setIcon({path: "img/clearurls_128x128.png"});
browser.browserAction.setIcon({path: "img/clearurls_128x128.png"}).catch(handleError);
} else {
browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"});
browser.browserAction.setIcon({path: "img/clearurls_gray_128x128.png"}).catch(handleError);
}
}
});
@@ -256,7 +232,14 @@ function setBadgedStatus() {
color = '#' + storage.badged_color;
browser.browserAction.setBadgeBackgroundColor({
'color': color
});
}).catch(handleError);
// Works only in Firefox: https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction/setBadgeTextColor#Browser_compatibility
if (getBrowser() === "Firefox") {
browser.browserAction.setBadgeTextColor({
color: "#FFFFFF"
}).catch(handleError);
}
}
});
}
@@ -302,3 +285,45 @@ function decodeURL(url) {
Object.prototype.getOrDefault = function (key, defaultValue) {
return this[key] === undefined ? defaultValue : this[key];
};
function handleError(error) {
console.log("[ClearURLs ERROR]:" + error);
}
/**
* Function to log all activities from ClearUrls.
* Only logging when activated.
* The log is only temporary saved in the cache and will
* permanently saved with the saveLogOnClose function.
*
* @param beforeProcessing the url before the clear process
* @param afterProcessing the url after the clear process
* @param rule the rule that triggered the process
*/
function pushToLog(beforeProcessing, afterProcessing, rule) {
const limit = storage.logLimit;
if (storage.loggingStatus && limit !== 0) {
if (limit > 0 && !isNaN(limit)) {
while (storage.log.log.length >= limit) {
storage.log.log.shift();
}
}
storage.log.log.push(
{
"before": beforeProcessing,
"after": afterProcessing,
"rule": rule,
"timestamp": Date.now()
}
);
deferSaveOnDisk('log');
}
}
/**
* Checks if the storage is available.
*/
function isStorageAvailable() {
return storage.ClearURLsData.length !== 0;
}

View File

@@ -24,15 +24,21 @@
*
* This watchdog restarts the whole Add-on, when the check fails.
*/
const CHECK_INTERVAL = 15000;
const CHECK_INTERVAL = 60000;
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) {
console.log(translate('watchdog'));
storage.watchDogErrorCount += 1;
console.log(translate('watchdog', storage.watchDogErrorCount));
saveOnExit();
reload();
if(storage.watchDogErrorCount < 3) reload();
} else if(storage.watchDogErrorCount > 0){
storage.watchDogErrorCount = 0;
saveOnExit();
}
}
}, CHECK_INTERVAL);

View File

@@ -33,7 +33,11 @@
"aaxitk",
"hsa_cr_id",
"sb-ci-[a-zA-Z]+",
"rnid"
"rnid",
"dchild",
"camp",
"creative",
"s"
],
"referralMarketing": [
"tag"
@@ -42,7 +46,9 @@
".*(amazon\\.).*(\\/gp).*\\/redirector.html\\/.*",
".*(amazon\\.).*(\\/hz\\/reviews-render\\/ajax\\/).*",
".*(amazon\\.).*(\\/gp).*\\/cart\\/ajax-update.html\\/.*",
".*(amazon\\.).*\\/message-us\\?.*"
".*(amazon\\.).*\\/message-us\\?.*",
".*(amazon\\.).*(\\/gp).*\\/video\\/api\\/.*",
".*(amazon\\.).*\\/s\\?.*"
],
"rawRules": [
"\\/ref=[^\\/\\?]*"
@@ -50,6 +56,54 @@
"redirections": [],
"forceRedirection": false
},
"amazon search": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(amazon)(\\.[a-zA-Z]{2,}).*\\/s.*\\?.*",
"completeProvider": false,
"rules": [
"pf_rd_[a-zA-Z]",
"qid",
"sr",
"srs",
"pd_rd_[a-zA-Z]*",
"__mk_[a-zA-Z]{1,3}_[a-zA-Z]{1,3}",
"spIA",
"ms3_c",
"[a-zA-Z%0-9]*ie",
"refRID",
"colid",
"coliid",
"[^a-zA-Z%0-9]adId",
"qualifier",
"_encoding",
"smid",
"field-lbr_brands_browse-bin",
"ref_?",
"th",
"sprefix",
"crid",
"keywords",
"cv_ct_[a-zA-Z]+",
"linkCode",
"creativeASIN",
"ascsubtag",
"aaxitk",
"hsa_cr_id",
"sb-ci-[a-zA-Z]+",
"rnid",
"dchild",
"camp",
"creative"
],
"referralMarketing": [
"tag"
],
"rawRules": [
"\\/ref=[^\\/\\?]*"
],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"fls-na.amazon": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(fls-na\\.amazon)(\\.[a-zA-Z]{2,}).*",
"completeProvider": true,
@@ -96,7 +150,9 @@
"aqs",
"sourceid",
"sxsrf",
"rlz"
"rlz",
"i-would-rather-use-firefox",
"stick"
],
"referralMarketing": [
"referrer"
@@ -125,6 +181,19 @@
],
"forceRedirection": true
},
"googleSearch": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(google)(\\.[a-zA-Z]{2,})\\/search\\?.*",
"completeProvider": false,
"rules": [
"client",
"sclient"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"googlesyndication": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(googlesyndication)(\\.[a-zA-Z]{2,}).*",
"completeProvider": true,
@@ -163,7 +232,7 @@
"urlPattern": ".*",
"completeProvider": false,
"rules": [
"(%3F)?utm(_[a-zA-Z]*)?",
"(%3F)?utm(_[a-zA-Z_]*)?",
"(%3F)?ga_[a-zA-Z_]+",
"(%3F)?yclid",
"(%3F)?_openstat",
@@ -191,7 +260,10 @@
"(%3F)?wtrid",
"(%3F)?[a-zA-Z]?mc",
"(%3F)?dclid",
"Echobox"
"Echobox",
"(%3F)?spm",
"(%3F)?vn(_[a-zA-Z]*)+",
"(%3F)?cid"
],
"referralMarketing": [],
"rawRules": [],
@@ -223,7 +295,19 @@
"(https:\\/\\/|http:\\/\\/)(support\\.)(steampowered\\.com).*\\?.*",
"(https:\\/\\/|http:\\/\\/)(privacy\\.)(vakmedianet\\.nl).*\\?.*ref=.*",
"(https:\\/\\/|http:\\/\\/)(sso\\.)(serverplan\\.com)\\/manage2fa\\/check\\?ref=.*",
"(https:\\/\\/|http:\\/\\/)(login\\.)(meijer\\.com)\\/.*\\?ref=.*"
"(https:\\/\\/|http:\\/\\/)(login\\.)(meijer\\.com)\\/.*\\?ref=.*",
".*(facebook\\.)\\w{2,}.*(\\/login_alerts\\/).*",
".*(facebook\\.)\\w{2,}.*(\\/should_add_browser\\/).*",
".*(facebook\\.)\\w{2,}.*(\\/ajax\\/).*",
".*(api\\.taiga\\.io).*",
".*(\\.gog\\.com\\/click\\.html).*",
".*(login\\.progressive\\.com).*",
".*(sephora\\.com\\/api\\/).*",
".*(contestgirl\\.com).*",
".*agenciatributaria.gob.es.*",
".*login\\.ingbank\\.pl.*",
"wss?:\\/\\/.*zoom\\.us.*",
".*api\\.bilibili\\.com.*"
],
"redirections": [],
"forceRedirection": false
@@ -337,7 +421,8 @@
"padding",
"ls_ref",
"action_history",
"fbid"
"fbid",
"comment_id"
],
"referralMarketing": [],
"rawRules": [],
@@ -373,7 +458,18 @@
"reddit": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(reddit)(\\.[a-zA-Z]{2,}).*",
"completeProvider": false,
"rules": [],
"rules": [
"%24deep_link",
"\\$deep_link",
"correlation_id",
"ref_campaign",
"ref_source",
"%243p",
"\\$3p",
"%24original_url",
"\\$original_url",
"_branch_match_id"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
@@ -479,7 +575,9 @@
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"exceptions": [
".*indeed\\.com\\/rc\\/clk.*"
],
"redirections": [],
"forceRedirection": false
},
@@ -598,7 +696,6 @@
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(youku\\.com).*",
"completeProvider": false,
"rules": [
"spm",
"tpa"
],
"referralMarketing": [],
@@ -788,7 +885,6 @@
"btsid",
"algo_expid",
"algo_pvid",
"spm",
"gps-id",
"scm[_a-zA-Z\\-]*",
"pvid"
@@ -1025,14 +1121,15 @@
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"redirections": [
".*u=([^&]*)"
],
"forceRedirection": false
},
"lazada.com.my": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(lazada\\.com)(\\.my).*",
"completeProvider": false,
"rules": [
"spm",
"ad_src",
"did",
"pa",
@@ -1299,6 +1396,557 @@
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"diepresse.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(diepresse)(\\.com).*",
"completeProvider": false,
"rules": [
"from",
"xtor",
"xt_at"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"newsletter.lidl.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(newsletter\\.lidl)(\\.com).*",
"completeProvider": false,
"rules": [
"x"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"allegro.pl": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(allegro)(\\.pl).*",
"completeProvider": false,
"rules": [
"reco_id",
"sid"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"backcountry.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(backcountry)(\\.com).*",
"completeProvider": false,
"rules": [
"CMP_SKU",
"MER",
"mr:trackingCode",
"mr:device",
"mr:adType",
"iv_",
"CMP_ID",
"k_clickid",
"rmatt",
"INT_ID",
"ti",
"fl"
],
"referralMarketing": [
"mr:referralID"
],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},"meetup.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(meetup)(\\.com).*",
"completeProvider": false,
"rules": [
"rv",
"_xtd"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},"apple.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(apple)(\\.com).*",
"completeProvider": false,
"rules": [
"app",
"ign-itsc[a-zA-Z]+"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},"alabout.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(alabout)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)"
],
"forceRedirection": false
},"newyorker.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(newyorker)(\\.com).*",
"completeProvider": false,
"rules": [
"source",
"bxid",
"cndid",
"esrc",
"mbid"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
}, "gog.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(gog)(\\.com).*",
"completeProvider": false,
"rules": [
"track_click",
"link_id"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"tradedoubler.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(tradedoubler)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)",
".*_td_deeplink=([^&]*)"
],
"forceRedirection": false
},
"theguardian.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(theguardian)(\\.com).*",
"completeProvider": false,
"rules": [
"CMP"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"srvtrck.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(srvtrck)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)"
],
"forceRedirection": false
},
"mysku.ru": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(mysku)(\\.ru).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*r=([^&]*)"
],
"forceRedirection": false
},
"admitad.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(admitad)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*ulp=([^&]*)"
],
"forceRedirection": false
},
"taobao.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(taobao)(\\.com).*",
"completeProvider": false,
"rules": [
"price",
"sourceType",
"suid",
"ut_sk",
"un",
"share_crt_v",
"sp_tk",
"cpp",
"shareurl",
"short_name",
"app",
"scm[_a-zA-Z\\-]*",
"pvid",
"algo_expid",
"algo_pvid",
"ns",
"abbucket",
"ali_refid",
"ali_trackid",
"acm",
"utparam",
"pos",
"abtest",
"trackInfo",
"user_number_id",
"utkn",
"scene",
"mytmenu",
"turing_bucket",
"lygClk",
"impid",
"bftTag",
"bftRwd"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"tmall.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(tmall)(\\.com).*",
"completeProvider": false,
"rules": [
"price",
"sourceType",
"suid",
"ut_sk",
"un",
"share_crt_v",
"sp_tk",
"cpp",
"shareurl",
"short_name",
"app",
"scm[_a-zA-Z\\-]*",
"pvid",
"algo_expid",
"algo_pvid",
"ns",
"abbucket",
"ali_refid",
"ali_trackid",
"acm",
"utparam",
"pos",
"abtest",
"trackInfo",
"user_number_id",
"utkn",
"scene",
"mytmenu",
"turing_bucket",
"lygClk",
"impid",
"bftTag",
"bftRwd",
"activity_id"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"tb.cn": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(tb)(\\.cn).*",
"completeProvider": false,
"rules": [
"sm"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"bilibili.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(bilibili)(\\.com).*",
"completeProvider": false,
"rules": [
"callback",
"spm_id_from",
"from_source",
"from",
"seid"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [
".*(api\\.bilibili\\.com)\\/.*"
],
"redirections": [],
"forceRedirection": false
},
"marketscreener.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(marketscreener)(\\.com).*",
"completeProvider": false,
"rules": [
"type_recherche",
"mots",
"noredirect",
"RewriteLast",
"lien",
"aComposeInputSearch",
"type_recherche_forum",
"add_mots"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [
".*\\/search\\/.*\\?.*"
],
"redirections": [],
"forceRedirection": false
},
"marketscreener.com search": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(marketscreener)(\\.com).*\\/search\\/.*\\?.*",
"completeProvider": false,
"rules": [
"type_recherche",
"noredirect",
"RewriteLast",
"lien",
"aComposeInputSearch",
"type_recherche_forum"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"bestbuy.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(bestbuy)(\\.com).*",
"completeProvider": false,
"rules": [
"irclickid",
"irgwc",
"loc",
"acampID",
"mpid",
"intl"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"digidip.net": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(digidip)(\\.net).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)"
],
"forceRedirection": false
},
"tiktok.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(tiktok)(\\.com).*",
"completeProvider": false,
"rules": [
"u_code",
"preview_pb",
"language",
"_d",
"timestamp",
"user_id",
"share_app_name",
"share_iid",
"source"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"autoplus.fr": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(autoplus)(\\.fr).*",
"completeProvider": false,
"rules": [
"idprob",
"hash",
"sending_id",
"site_id",
"dr_tracker"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"bigfishgames.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(bigfishgames)(\\.com).*",
"completeProvider": false,
"rules": [
"pc",
"npc",
"npv[0-9]+",
"npi"
],
"referralMarketing": [],
"rawRules": [
"\\?pc$"
],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"dpbolvw.net": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(dpbolvw)(\\.net).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)"
],
"forceRedirection": false
},
"humblebundle.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(humblebundle)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [
"partner"
],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"cafepedagogique.net": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(cafepedagogique)(\\.net).*",
"completeProvider": false,
"rules": [
"actId",
"actCampaignType",
"actSource"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"bloculus.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(bloculus)(\\.com).*",
"completeProvider": false,
"rules": [
"tl_[a-zA-Z_]+"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"mailpanion.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(mailpanion)(\\.com).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*destination=([^&]*)"
],
"forceRedirection": false
},
"signtr.website": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(signtr)(\\.website).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*redirect=([^&]*)"
],
"forceRedirection": false
},
"mailtrack.io": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(mailtrack)(\\.io).*",
"completeProvider": false,
"rules": [],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [
".*url=([^&]*)"
],
"forceRedirection": false
},
"zillow.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(zillow)(\\.com).*",
"completeProvider": false,
"rules": [
"rtoken"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"realtor.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(realtor)(\\.com).*",
"completeProvider": false,
"rules": [
"ex",
"identityID",
"MID",
"RID"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
},
"redfin.com": {
"urlPattern": "(https:\\/\\/|http:\\/\\/)([a-zA-Z0-9-.]*\\.)?(redfin)(\\.com).*",
"completeProvider": false,
"rules": [
"riftinfo"
],
"referralMarketing": [],
"rawRules": [],
"exceptions": [],
"redirections": [],
"forceRedirection": false
}
}
}

View File

@@ -114,7 +114,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<script src="../browser-polyfill.js"></script>
<script src="../external_js/jquery-3.4.1.min.js"></script>
<script src="../external_js/bootstrap.min.js"></script>
<script src="../external_js/dataTables.min.js"></script>
<script src="../external_js/datatables.min.js"></script>
<script src="../external_js/fontawesome/all.min.js"></script>
<script src="../core_js/log.js"></script>
<script src="../core_js/write_version.js"></script>

View File

@@ -161,6 +161,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<span class="slider round"></span>
</label>
</p>
<p>
<label id="eTag_filtering_enabled" style="font-weight: bold;"></label><br />
<label class="switch">
<input type="checkbox" id="eTagFiltering">
<span class="slider round"></span>
</label>
</p>
<br />
<p class="text-center">
<button type="button" id="save_settings_btn"

View File

@@ -1,16 +1,11 @@
{
"manifest_version": 2,
"name": "ClearURLs",
"version": "1.15.0",
"version": "1.17.0",
"author": "Kevin Röbert",
"description": "Remove tracking elements from URLs.",
"description": "__MSG_extension_description__",
"homepage_url": "https://gitlab.com/KevinRoebert/ClearUrls",
"default_locale": "en",
"applications": {
"gecko": {
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
}
},
"icons": {
"16": "img/clearurls_16x16.png",
"19": "img/clearurls_19x19.png",
@@ -43,7 +38,6 @@
"default_popup": "html/popup.html"
},
"permissions": [
"*://*/*",
"<all_urls>",
"webRequest",
"webRequestBlocking",
@@ -63,23 +57,17 @@
"core_js/message_handler.js",
"external_js/ip-range-check.js",
"core_js/tools.js",
"core_js/badgedHandler.js",
"core_js/pureCleaning.js",
"core_js/context_menu.js",
"core_js/historyListener.js",
"clearurls.js",
"core_js/storage.js",
"core_js/watchdog.js"
"core_js/watchdog.js",
"core_js/eTagFilter.js"
]
},
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": [
"browser-polyfill.js"
]
},
{
"all_frames": true,
"matches": [

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

BIN
promotion/MEA-button.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

290
promotion/MEA-button.svg Normal file
View File

@@ -0,0 +1,290 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="173mm"
height="62mm"
viewBox="0 0 173 62"
version="1.1"
id="svg8"
inkscape:version="0.92.1 r15371"
sodipodi:docname="MEA-button.svg">
<defs
id="defs2">
<style
id="style4487">.cls-1{fill:url(#linear-gradient);}.cls-2{opacity:0.35;fill:url(#radial-gradient);}.cls-2,.cls-4{isolation:isolate;}.cls-3{fill:url(#linear-gradient-2);}.cls-4{opacity:0.41;fill:url(#radial-gradient-2);}.cls-5{fill:url(#radial-gradient-3);}.cls-6{fill:url(#radial-gradient-4);}</style>
<linearGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,-1,0,266)"
y2="84.03"
x2="241.67"
y1="84.03"
x1="63.33"
id="linear-gradient">
<stop
id="stop4489"
stop-color="#0c59a4"
offset="0" />
<stop
id="stop4491"
stop-color="#114a8b"
offset="1" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,-0.95,0,248.84)"
r="95.38"
cy="68.91"
cx="161.83"
id="radial-gradient">
<stop
id="stop4494"
stop-opacity="0"
offset="0.72" />
<stop
id="stop4496"
stop-opacity="0.53"
offset="0.95" />
<stop
id="stop4498"
offset="1" />
</radialGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,-1,0,266)"
y2="40.06"
x2="45.96"
y1="161.39"
x1="157.35"
id="linear-gradient-2">
<stop
id="stop4501"
stop-color="#1b9de2"
offset="0" />
<stop
id="stop4503"
stop-color="#1595df"
offset="0.16" />
<stop
id="stop4505"
stop-color="#0680d7"
offset="0.67" />
<stop
id="stop4507"
stop-color="#0078d4"
offset="1" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.15,-0.99,-0.8,-0.12,176.64,-125.4)"
r="143.24"
cy="62.99"
cx="-340.29"
id="radial-gradient-2">
<stop
id="stop4510"
stop-opacity="0"
offset="0.76" />
<stop
id="stop4512"
stop-opacity="0.5"
offset="0.95" />
<stop
id="stop4514"
offset="1" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-0.04,1,2.13,0.08,-1179.54,-106.69)"
r="202.43"
cy="570.21"
cx="113.37"
id="radial-gradient-3">
<stop
id="stop4517"
stop-color="#35c1f1"
offset="0" />
<stop
id="stop4519"
stop-color="#34c1ed"
offset="0.11" />
<stop
id="stop4521"
stop-color="#2fc2df"
offset="0.23" />
<stop
id="stop4523"
stop-color="#2bc3d2"
offset="0.31" />
<stop
id="stop4525"
stop-color="#36c752"
offset="0.67" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.28,0.96,0.78,-0.23,-303.76,-148.5)"
r="97.34"
cy="567.97"
cx="376.52"
id="radial-gradient-4">
<stop
id="stop4528"
stop-color="#66eb6e"
offset="0" />
<stop
id="stop4530"
stop-opacity="0"
stop-color="#66eb6e"
offset="1" />
</radialGradient>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="680.12936"
inkscape:cy="17.153298"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1377"
inkscape:window-x="-8"
inkscape:window-y="32"
inkscape:window-maximized="1" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Ebene 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-235)">
<rect
style="opacity:1;fill:#20989a;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill"
id="rect4485"
width="172"
height="60"
x="0.75595236"
y="236.24405"
ry="9.0862904"
inkscape:export-filename="F:\Programmieren\Git\Firefox Addons\ClearUrls\promotion\MEA-button.png"
inkscape:export-xdpi="25.4"
inkscape:export-ydpi="25.4" />
<g
id="g4586"
transform="matrix(0.18042983,0,0,0.18191038,10.112503,242.71284)"
inkscape:export-filename="F:\Programmieren\Git\Firefox Addons\ClearUrls\promotion\MEA-button.png"
inkscape:export-xdpi="25.4"
inkscape:export-ydpi="25.4">
<path
id="path4537"
transform="translate(-4.63,-4.92)"
d="m 235.68,195.46 a 93.73,93.73 0 0 1 -10.54,4.71 101.87,101.87 0 0 1 -35.9,6.46 c -47.32,0 -88.54,-32.55 -88.54,-74.32 A 31.48,31.48 0 0 1 117.13,105 c -42.8,1.8 -53.8,46.4 -53.8,72.53 0,73.88 68.09,81.37 82.76,81.37 7.91,0 19.84,-2.3 27,-4.56 l 1.31,-0.44 a 128.34,128.34 0 0 0 66.6,-52.8 4,4 0 0 0 -5.32,-5.64 z"
class="cls-1"
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient)" />
<path
id="path4539"
transform="translate(-4.63,-4.92)"
d="m 235.68,195.46 a 93.73,93.73 0 0 1 -10.54,4.71 101.87,101.87 0 0 1 -35.9,6.46 c -47.32,0 -88.54,-32.55 -88.54,-74.32 A 31.48,31.48 0 0 1 117.13,105 c -42.8,1.8 -53.8,46.4 -53.8,72.53 0,73.88 68.09,81.37 82.76,81.37 7.91,0 19.84,-2.3 27,-4.56 l 1.31,-0.44 a 128.34,128.34 0 0 0 66.6,-52.8 4,4 0 0 0 -5.32,-5.64 z"
class="cls-2"
inkscape:connector-curvature="0"
style="opacity:0.35;isolation:isolate;fill:url(#radial-gradient)" />
<path
id="path4541"
transform="translate(-4.63,-4.92)"
d="M 110.34,246.34 A 79.2,79.2 0 0 1 87.6,225 80.72,80.72 0 0 1 117.13,105 c 3.12,-1.47 8.45,-4.13 15.54,-4 a 32.35,32.35 0 0 1 25.69,13 31.88,31.88 0 0 1 6.36,18.66 c 0,-0.21 24.46,-79.6 -80,-79.6 -43.9,0 -80,41.66 -80,78.21 a 130.15,130.15 0 0 0 12.11,56 128,128 0 0 0 156.38,67.11 75.55,75.55 0 0 1 -62.78,-8 z"
class="cls-3"
inkscape:connector-curvature="0"
style="fill:url(#linear-gradient-2)" />
<path
id="path4543"
transform="translate(-4.63,-4.92)"
d="M 110.34,246.34 A 79.2,79.2 0 0 1 87.6,225 80.72,80.72 0 0 1 117.13,105 c 3.12,-1.47 8.45,-4.13 15.54,-4 a 32.35,32.35 0 0 1 25.69,13 31.88,31.88 0 0 1 6.36,18.66 c 0,-0.21 24.46,-79.6 -80,-79.6 -43.9,0 -80,41.66 -80,78.21 a 130.15,130.15 0 0 0 12.11,56 128,128 0 0 0 156.38,67.11 75.55,75.55 0 0 1 -62.78,-8 z"
class="cls-4"
inkscape:connector-curvature="0"
style="opacity:0.41000001;isolation:isolate;fill:url(#radial-gradient-2)" />
<path
id="path4545"
transform="translate(-4.63,-4.92)"
d="m 156.94,153.78 c -0.81,1.05 -3.3,2.5 -3.3,5.66 0,2.61 1.7,5.12 4.72,7.23 14.38,10 41.49,8.68 41.56,8.68 a 59.56,59.56 0 0 0 30.27,-8.35 61.38,61.38 0 0 0 30.43,-52.88 c 0.26,-22.41 -8,-37.31 -11.34,-43.91 C 228.09,28.76 182.35,4.92 132.61,4.92 a 128,128 0 0 0 -128,126.2 c 0.48,-36.54 36.8,-66.05 80,-66.05 3.5,0 23.46,0.34 42,10.07 16.34,8.58 24.9,18.94 30.85,29.21 6.18,10.67 7.28,24.15 7.28,29.52 0,5.37 -2.74,13.33 -7.8,19.91 z"
class="cls-5"
inkscape:connector-curvature="0"
style="fill:url(#radial-gradient-3)" />
<path
id="path4547"
transform="translate(-4.63,-4.92)"
d="m 156.94,153.78 c -0.81,1.05 -3.3,2.5 -3.3,5.66 0,2.61 1.7,5.12 4.72,7.23 14.38,10 41.49,8.68 41.56,8.68 a 59.56,59.56 0 0 0 30.27,-8.35 61.38,61.38 0 0 0 30.43,-52.88 c 0.26,-22.41 -8,-37.31 -11.34,-43.91 C 228.09,28.76 182.35,4.92 132.61,4.92 a 128,128 0 0 0 -128,126.2 c 0.48,-36.54 36.8,-66.05 80,-66.05 3.5,0 23.46,0.34 42,10.07 16.34,8.58 24.9,18.94 30.85,29.21 6.18,10.67 7.28,24.15 7.28,29.52 0,5.37 -2.74,13.33 -7.8,19.91 z"
class="cls-6"
inkscape:connector-curvature="0"
style="fill:url(#radial-gradient-4)" />
</g>
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:14.11111069px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
x="63.122021"
y="270.91965"
id="text4594"
inkscape:export-filename="F:\Programmieren\Git\Firefox Addons\ClearUrls\promotion\MEA-button.png"
inkscape:export-xdpi="25.4"
inkscape:export-ydpi="25.4"><tspan
sodipodi:role="line"
id="tspan4592"
x="63.122021"
y="283.79364"
style="font-size:14.11111069px;fill:#ffffff;stroke-width:0.26458332" /></text>
<g
id="g4607"
transform="translate(67.73337,2.7074)"
inkscape:export-filename="F:\Programmieren\Git\Firefox Addons\ClearUrls\promotion\MEA-button.png"
inkscape:export-xdpi="25.4"
inkscape:export-ydpi="25.4">
<text
id="text4590"
y="260.3363"
x="-0.79237193"
style="font-style:normal;font-weight:normal;font-size:14.11111069px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="font-size:14.11111069px;fill:#ffffff;stroke-width:0.26458332"
y="260.3363"
x="-0.79237193"
id="tspan4588"
sodipodi:role="line">GET THE</tspan></text>
<text
id="text4598"
y="276.43811"
x="-0.23151043"
style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:16.93333244px;font-family:sans-serif;-inkscape-font-specification:'sans-serif Bold';fill:#ffffff;stroke-width:0.26458332"
y="276.43811"
x="-0.23151043"
id="tspan4596"
sodipodi:role="line"><tspan
id="tspan4600"
style="font-size:19.75555611px">ADD</tspan>-ON</tspan></text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

BIN
promotion/download-128.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB