mirror of
https://gitlab.com/KevinRoebert/ClearUrls
synced 2025-12-18 23:25:36 +07:00
Compare commits
68 Commits
update-dep
...
poeditor
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eef2bdb753 | ||
|
|
bd64e39e02 | ||
|
|
4a90d63539 | ||
|
|
6f76f2f167 | ||
|
|
8e1cba2eb7 | ||
|
|
1360111f15 | ||
|
|
f4e5ec70de | ||
|
|
c1b2cdbda0 | ||
|
|
71484d1488 | ||
|
|
394dda1157 | ||
|
|
854460ef50 | ||
|
|
0d49080a52 | ||
|
|
08630fbb7b | ||
|
|
93630cb8db | ||
|
|
d8e0e9fe96 | ||
|
|
42117aff9c | ||
|
|
ddc1dac829 | ||
|
|
2c12ce2def | ||
|
|
1dd91ef59a | ||
|
|
7ef8faef2f | ||
|
|
acacd6e2c4 | ||
|
|
a0ec22affb | ||
|
|
4d43f5cd07 | ||
|
|
7f8c096368 | ||
|
|
ba6fc13937 | ||
|
|
2cd54fcf28 | ||
|
|
8f5404c632 | ||
|
|
b4b2fe5bfe | ||
|
|
4c0b953972 | ||
|
|
d3ddd31d02 | ||
|
|
8f547660b9 | ||
|
|
465b76dbb2 | ||
|
|
7bb4deb83a | ||
|
|
b99263f85d | ||
|
|
d81041afe4 | ||
|
|
09c4504e5e | ||
|
|
1f7a471ec3 | ||
|
|
804e08098c | ||
|
|
55581cc6b8 | ||
|
|
23279d0c70 | ||
|
|
cff3184751 | ||
|
|
3a45f0f3bd | ||
|
|
39aef0bf19 | ||
|
|
56a91be236 | ||
|
|
99439f8dc9 | ||
|
|
20dd141d3c | ||
|
|
d4c50c037a | ||
|
|
710c1ff527 | ||
|
|
c9be70d0e8 | ||
|
|
188f83b7a0 | ||
|
|
ee32041537 | ||
|
|
e016af23a9 | ||
|
|
003ed087f7 | ||
|
|
cb22c98074 | ||
|
|
f04da7c3b2 | ||
|
|
dde6a52e4b | ||
|
|
d1950a12e8 | ||
|
|
d9c2e895c9 | ||
|
|
b60f46bd34 | ||
|
|
b2547e2564 | ||
|
|
d63727b8b7 | ||
|
|
c3e3148b88 | ||
|
|
ee8916d14a | ||
|
|
7bb4e29768 | ||
|
|
f7fbbbbe88 | ||
|
|
355b724824 | ||
|
|
b53fbc5e76 | ||
|
|
e95a59e5cc |
@@ -24,24 +24,26 @@ hash rules:
|
|||||||
- data.minify.json
|
- data.minify.json
|
||||||
- rules.minify.hash
|
- rules.minify.hash
|
||||||
|
|
||||||
bundle addon:
|
bundle addon firefox:
|
||||||
stage: build
|
stage: build
|
||||||
script:
|
script:
|
||||||
- zip ClearURLs -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
|
- zip ClearURLs-firefox -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
|
||||||
|
only:
|
||||||
|
- master
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- ClearURLs.zip
|
- ClearURLs-firefox.zip
|
||||||
|
|
||||||
#bundle addon chrome:
|
bundle addon chrome:
|
||||||
#stage: build
|
stage: build
|
||||||
#script:
|
script:
|
||||||
#- jq 'del(.applications)' manifest.json > manifest.json.tmp && mv manifest.json.tmp manifest.json
|
- 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/*
|
- zip ClearURLs-chrome -r -FS clearurls.js browser-polyfill.js manifest.json img/* external_js/* html/* core_js/* css/* fonts/* _locales/*
|
||||||
#only:
|
only:
|
||||||
# - master
|
- master
|
||||||
#artifacts:
|
artifacts:
|
||||||
# paths:
|
paths:
|
||||||
# - ClearURLs-chrome.zip
|
- ClearURLs-chrome.zip
|
||||||
|
|
||||||
pages:
|
pages:
|
||||||
stage: deploy
|
stage: deploy
|
||||||
@@ -53,8 +55,6 @@ pages:
|
|||||||
- sha256sum public/data/data.min.json | awk '{print $1}' > public/data/rules.min.hash
|
- 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"
|
- 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
|
- sha256sum public/data/data.minify.json | awk '{print $1}' > public/data/rules.minify.hash
|
||||||
only:
|
|
||||||
- master
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- public
|
- public
|
||||||
|
|||||||
21
CHANGELOG.md
21
CHANGELOG.md
@@ -15,27 +15,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- Require Firefox >= 55
|
- Require Firefox >= 55
|
||||||
- Require Chrome >= 37
|
- 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
|
## [1.25.0] - 2022-07-27
|
||||||
|
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -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://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>
|
<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://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)
|
||||||
|
|
||||||
# <sub><img src="https://gitlab.com/ClearURLs/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs [](https://gitter.im/ClearURLs/ClearURLs)
|
# <sub><img src="https://gitlab.com/KevinRoebert/ClearUrls/raw/master/img/clearurls.svg" width="64px" height="64px"></sub> ClearURLs [](https://gitter.im/ClearURLs/ClearURLs)
|
||||||
|
|
||||||
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and some *Chrome* based browsers.
|
**ClearURLs** is an add-on based on the new WebExtensions technology and is optimized for *Firefox* and *Chrome* based browsers.
|
||||||
|
|
||||||
This extension will automatically remove tracking elements from URLs to help protect your privacy when browsing the Internet,
|
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).
|
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)
|
* Prevents Yandex from rewriting the search results (to include tracking elements)
|
||||||
|
|
||||||
## Permissons
|
## Permissons
|
||||||
Reasoning for needed permissions can be found under [here](https://gitlab.com/ClearURLs/ClearUrls/issues/159).
|
Reasoning for needed permissions can be found under [here](https://gitlab.com/KevinRoebert/ClearUrls/issues/159).
|
||||||
|
|
||||||
## Screenshot
|
## Screenshot
|
||||||

|

|
||||||
@@ -45,13 +45,14 @@ Reasoning for needed permissions can be found under [here](https://gitlab.com/Cl
|
|||||||
## CI/CD Artifacts Download (for Firefox- and Chrome-Dev only)
|
## CI/CD Artifacts Download (for Firefox- and Chrome-Dev only)
|
||||||
Here you can download the packed files for the Firefox- and Chrome-Dev:
|
Here you can download the packed files for the Firefox- and Chrome-Dev:
|
||||||
|
|
||||||
- [ClearURLs.zip](https://gitlab.com/ClearURLs/ClearUrls/-/jobs/artifacts/master/raw/ClearURLs.zip?job=bundle%20addon)
|
- [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)
|
||||||
|
|
||||||
## Test
|
## 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/)
|
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
|
## Contribute
|
||||||
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/ClearURLs/ClearUrls/issues/new)
|
If you have any suggestions or complaints, please [create an issue.](https://gitlab.com/KevinRoebert/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).**
|
**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).**
|
||||||
|
|
||||||
@@ -64,7 +65,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.*
|
It is not necessary to translate the description field; in the most cases it is empty.*
|
||||||
|
|
||||||
#### Merge request
|
#### Merge request
|
||||||
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
|
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
|
||||||
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.
|
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`.
|
Please push your translation into the folder `_locales/{language code}/messages.json`.
|
||||||
|
|
||||||
@@ -94,14 +95,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) |
|
- [WebExtension browser API Polyfill](https://github.com/mozilla/webextension-polyfill) |
|
||||||
Copyright by Mozilla |
|
Copyright by Mozilla |
|
||||||
[MPL-2.0](https://github.com/mozilla/webextension-polyfill/blob/master/LICENSE)
|
[MPL-2.0](https://github.com/mozilla/webextension-polyfill/blob/master/LICENSE)
|
||||||
- [Bootstrap](https://github.com/twbs/bootstrap) |
|
- [Bootstrap v4.3.1](https://github.com/twbs/bootstrap/tree/v4.3.1) |
|
||||||
Copyright 2011-2016 Twitter, Inc. |
|
Copyright 2011-2016 Twitter, Inc. |
|
||||||
[MIT](https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
[MIT](https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
||||||
- [jQuery](https://github.com/jquery/jquery/) |
|
- [jQuery v3.6.0](https://github.com/jquery/jquery/tree/3.6.0) |
|
||||||
Copyright JS Foundation and other contributors |
|
Copyright JS Foundation and other contributors |
|
||||||
[MIT](https://jquery.org/license/)
|
[MIT](https://jquery.org/license/)
|
||||||
- [DataTables](https://github.com/DataTables/DataTables/tree/master) | Copyright (c) 2008-2015 SpryMedia Limited | [MIT](https://datatables.net/license/)
|
- [DataTables v1.10.20](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 |
|
- [Pickr v1.7.0](https://github.com/Simonwep/pickr/tree/1.7.0) | Copyright (c) 2018 - 2020 Simon Reinisch |
|
||||||
[MIT](https://github.com/Simonwep/pickr/blob/master/LICENSE)
|
[MIT](https://github.com/Simonwep/pickr/blob/master/LICENSE)
|
||||||
- [Font Awesome](https://github.com/FortAwesome/Font-Awesome/) | Copyright (c) @fontawesome |
|
- [Font Awesome v5.12.0](https://github.com/FortAwesome/Font-Awesome/tree/5.12.0) | Copyright (c) @fontawesome |
|
||||||
[Font Awesome Free License](https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt)
|
[Font Awesome Free License](https://github.com/FortAwesome/Font-Awesome/blob/master/LICENSE.txt)
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
factory(mod);
|
factory(mod);
|
||||||
global.browser = mod.exports;
|
global.browser = mod.exports;
|
||||||
}
|
}
|
||||||
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (module) {
|
})(this, function (module) {
|
||||||
/* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */
|
/* webextension-polyfill - v0.4.0 - Wed Feb 06 2019 11:58:31 */
|
||||||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||||
/* vim: set sts=2 sw=2 et tw=80: */
|
/* vim: set sts=2 sw=2 et tw=80: */
|
||||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
@@ -19,11 +19,9 @@
|
|||||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {
|
if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) {
|
||||||
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 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
|
// 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
|
// optimization for Firefox. Since Spidermonkey does not fully parse the
|
||||||
@@ -252,12 +250,6 @@
|
|||||||
"minArgs": 3,
|
"minArgs": 3,
|
||||||
"maxArgs": 3,
|
"maxArgs": 3,
|
||||||
"singleCallbackArg": true
|
"singleCallbackArg": true
|
||||||
},
|
|
||||||
"elements": {
|
|
||||||
"createSidebarPane": {
|
|
||||||
"minArgs": 1,
|
|
||||||
"maxArgs": 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -464,6 +456,10 @@
|
|||||||
"minArgs": 0,
|
"minArgs": 0,
|
||||||
"maxArgs": 0
|
"maxArgs": 0
|
||||||
},
|
},
|
||||||
|
"getBrowserInfo": {
|
||||||
|
"minArgs": 0,
|
||||||
|
"maxArgs": 0
|
||||||
|
},
|
||||||
"getPlatformInfo": {
|
"getPlatformInfo": {
|
||||||
"minArgs": 0,
|
"minArgs": 0,
|
||||||
"maxArgs": 0
|
"maxArgs": 0
|
||||||
@@ -600,14 +596,6 @@
|
|||||||
"minArgs": 0,
|
"minArgs": 0,
|
||||||
"maxArgs": 1
|
"maxArgs": 1
|
||||||
},
|
},
|
||||||
"goBack": {
|
|
||||||
"minArgs": 0,
|
|
||||||
"maxArgs": 1
|
|
||||||
},
|
|
||||||
"goForward": {
|
|
||||||
"minArgs": 0,
|
|
||||||
"maxArgs": 1
|
|
||||||
},
|
|
||||||
"highlight": {
|
"highlight": {
|
||||||
"minArgs": 1,
|
"minArgs": 1,
|
||||||
"maxArgs": 1
|
"maxArgs": 1
|
||||||
@@ -706,6 +694,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (Object.keys(apiMetadata).length === 0) {
|
if (Object.keys(apiMetadata).length === 0) {
|
||||||
throw new Error("api-metadata.json has not been included in browser-polyfill");
|
throw new Error("api-metadata.json has not been included in browser-polyfill");
|
||||||
}
|
}
|
||||||
@@ -725,10 +714,12 @@
|
|||||||
super(items);
|
super(items);
|
||||||
this.createItem = createItem;
|
this.createItem = createItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
get(key) {
|
get(key) {
|
||||||
if (!this.has(key)) {
|
if (!this.has(key)) {
|
||||||
this.set(key, this.createItem(key));
|
this.set(key, this.createItem(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.get(key);
|
return super.get(key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -760,17 +751,13 @@
|
|||||||
* promise.
|
* promise.
|
||||||
* @param {function} promise.resolve
|
* @param {function} promise.resolve
|
||||||
* The promise's resolution function.
|
* The promise's resolution function.
|
||||||
* @param {function} promise.reject
|
* @param {function} promise.rejection
|
||||||
* The promise's rejection function.
|
* The promise's rejection function.
|
||||||
* @param {object} metadata
|
* @param {object} metadata
|
||||||
* Metadata about the wrapped method which has created the callback.
|
* Metadata about the wrapped method which has created the callback.
|
||||||
* @param {boolean} metadata.singleCallbackArg
|
* @param {integer} metadata.maxResolvedArgs
|
||||||
* Whether or not the promise is resolved with only the first
|
* The maximum number of arguments which may be passed to the
|
||||||
* argument of the callback, alternatively an array of all the
|
* callback created by the wrapped async function.
|
||||||
* 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}
|
* @returns {function}
|
||||||
* The generated callback function.
|
* The generated callback function.
|
||||||
@@ -778,7 +765,7 @@
|
|||||||
const makeCallback = (promise, metadata) => {
|
const makeCallback = (promise, metadata) => {
|
||||||
return (...callbackArgs) => {
|
return (...callbackArgs) => {
|
||||||
if (extensionAPIs.runtime.lastError) {
|
if (extensionAPIs.runtime.lastError) {
|
||||||
promise.reject(new Error(extensionAPIs.runtime.lastError.message));
|
promise.reject(extensionAPIs.runtime.lastError);
|
||||||
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
|
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
|
||||||
promise.resolve(callbackArgs[0]);
|
promise.resolve(callbackArgs[0]);
|
||||||
} else {
|
} else {
|
||||||
@@ -786,6 +773,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments";
|
const pluralizeArguments = numArgs => numArgs == 1 ? "argument" : "arguments";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -803,13 +791,9 @@
|
|||||||
* The maximum number of arguments which may be passed to the
|
* The maximum number of arguments which may be passed to the
|
||||||
* function. If called with more than this number of arguments, the
|
* function. If called with more than this number of arguments, the
|
||||||
* wrapper will raise an exception.
|
* wrapper will raise an exception.
|
||||||
* @param {boolean} metadata.singleCallbackArg
|
* @param {integer} metadata.maxResolvedArgs
|
||||||
* Whether or not the promise is resolved with only the first
|
* The maximum number of arguments which may be passed to the
|
||||||
* argument of the callback, alternatively an array of all the
|
* callback created by the wrapped async function.
|
||||||
* 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, ...*)}
|
* @returns {function(object, ...*)}
|
||||||
* The generated wrapper function.
|
* The generated wrapper function.
|
||||||
@@ -819,37 +803,35 @@
|
|||||||
if (args.length < metadata.minArgs) {
|
if (args.length < metadata.minArgs) {
|
||||||
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.length > metadata.maxArgs) {
|
if (args.length > metadata.maxArgs) {
|
||||||
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (metadata.fallbackToNoCallback) {
|
if (metadata.fallbackToNoCallback) {
|
||||||
// This API method has currently no callback on Chrome, but it return a promise on Firefox,
|
// 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
|
// 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.
|
// to not passing the callback if the first call fails.
|
||||||
try {
|
try {
|
||||||
target[name](...args, makeCallback({
|
target[name](...args, makeCallback({ resolve, reject }, metadata));
|
||||||
resolve,
|
|
||||||
reject
|
|
||||||
}, metadata));
|
|
||||||
} catch (cbError) {
|
} catch (cbError) {
|
||||||
console.warn(`${name} API method doesn't seem to support the callback parameter, ` + "falling back to call it without a callback: ", 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);
|
target[name](...args);
|
||||||
|
|
||||||
// Update the API method metadata, so that the next API calls will not try to
|
// Update the API method metadata, so that the next API calls will not try to
|
||||||
// use the unsupported callback anymore.
|
// use the unsupported callback anymore.
|
||||||
metadata.fallbackToNoCallback = false;
|
metadata.fallbackToNoCallback = false;
|
||||||
metadata.noCallback = true;
|
metadata.noCallback = true;
|
||||||
|
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
} else if (metadata.noCallback) {
|
} else if (metadata.noCallback) {
|
||||||
target[name](...args);
|
target[name](...args);
|
||||||
resolve();
|
resolve();
|
||||||
} else {
|
} else {
|
||||||
target[name](...args, makeCallback({
|
target[name](...args, makeCallback({ resolve, reject }, metadata));
|
||||||
resolve,
|
|
||||||
reject
|
|
||||||
}, metadata));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -881,6 +863,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -912,14 +895,18 @@
|
|||||||
has(proxyTarget, prop) {
|
has(proxyTarget, prop) {
|
||||||
return prop in target || prop in cache;
|
return prop in target || prop in cache;
|
||||||
},
|
},
|
||||||
|
|
||||||
get(proxyTarget, prop, receiver) {
|
get(proxyTarget, prop, receiver) {
|
||||||
if (prop in cache) {
|
if (prop in cache) {
|
||||||
return cache[prop];
|
return cache[prop];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(prop in target)) {
|
if (!(prop in target)) {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
let value = target[prop];
|
let value = target[prop];
|
||||||
|
|
||||||
if (typeof value === "function") {
|
if (typeof value === "function") {
|
||||||
// This is a method on the underlying object. Check if we need to do
|
// This is a method on the underlying object. Check if we need to do
|
||||||
// any wrapping.
|
// any wrapping.
|
||||||
@@ -942,9 +929,6 @@
|
|||||||
// of. Create a sub-object wrapper for it with the appropriate child
|
// of. Create a sub-object wrapper for it with the appropriate child
|
||||||
// metadata.
|
// metadata.
|
||||||
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
||||||
} else if (hasOwnProperty(metadata, "*")) {
|
|
||||||
// Wrap all properties in * namespace.
|
|
||||||
value = wrapObject(value, wrappers[prop], metadata["*"]);
|
|
||||||
} else {
|
} else {
|
||||||
// We don't need to do any wrapping for this property,
|
// We don't need to do any wrapping for this property,
|
||||||
// so just forward all access to the underlying object.
|
// so just forward all access to the underlying object.
|
||||||
@@ -958,11 +942,14 @@
|
|||||||
target[prop] = value;
|
target[prop] = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
cache[prop] = value;
|
cache[prop] = value;
|
||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
set(proxyTarget, prop, value, receiver) {
|
set(proxyTarget, prop, value, receiver) {
|
||||||
if (prop in cache) {
|
if (prop in cache) {
|
||||||
cache[prop] = value;
|
cache[prop] = value;
|
||||||
@@ -971,9 +958,11 @@
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
defineProperty(proxyTarget, prop, desc) {
|
defineProperty(proxyTarget, prop, desc) {
|
||||||
return Reflect.defineProperty(cache, prop, desc);
|
return Reflect.defineProperty(cache, prop, desc);
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteProperty(proxyTarget, prop) {
|
deleteProperty(proxyTarget, prop) {
|
||||||
return Reflect.deleteProperty(cache, prop);
|
return Reflect.deleteProperty(cache, prop);
|
||||||
}
|
}
|
||||||
@@ -1013,36 +1002,19 @@
|
|||||||
addListener(target, listener, ...args) {
|
addListener(target, listener, ...args) {
|
||||||
target.addListener(wrapperMap.get(listener), ...args);
|
target.addListener(wrapperMap.get(listener), ...args);
|
||||||
},
|
},
|
||||||
|
|
||||||
hasListener(target, listener) {
|
hasListener(target, listener) {
|
||||||
return target.hasListener(wrapperMap.get(listener));
|
return target.hasListener(wrapperMap.get(listener));
|
||||||
},
|
},
|
||||||
|
|
||||||
removeListener(target, listener) {
|
removeListener(target, listener) {
|
||||||
target.removeListener(wrapperMap.get(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.
|
||||||
* Wraps an onRequestFinished listener function so that it will return a
|
let loggedSendResponseDeprecationWarning = false;
|
||||||
* `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 => {
|
const onMessageWrappers = new DefaultWeakMap(listener => {
|
||||||
if (typeof listener !== "function") {
|
if (typeof listener !== "function") {
|
||||||
return listener;
|
return listener;
|
||||||
@@ -1067,19 +1039,26 @@
|
|||||||
*/
|
*/
|
||||||
return function onMessage(message, sender, sendResponse) {
|
return function onMessage(message, sender, sendResponse) {
|
||||||
let didCallSendResponse = false;
|
let didCallSendResponse = false;
|
||||||
|
|
||||||
let wrappedSendResponse;
|
let wrappedSendResponse;
|
||||||
let sendResponsePromise = new Promise(resolve => {
|
let sendResponsePromise = new Promise(resolve => {
|
||||||
wrappedSendResponse = function (response) {
|
wrappedSendResponse = function (response) {
|
||||||
|
if (!loggedSendResponseDeprecationWarning) {
|
||||||
|
console.warn(SEND_RESPONSE_DEPRECATION_WARNING, new Error().stack);
|
||||||
|
loggedSendResponseDeprecationWarning = true;
|
||||||
|
}
|
||||||
didCallSendResponse = true;
|
didCallSendResponse = true;
|
||||||
resolve(response);
|
resolve(response);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
let result;
|
let result;
|
||||||
try {
|
try {
|
||||||
result = listener(message, sender, wrappedSendResponse);
|
result = listener(message, sender, wrappedSendResponse);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
result = Promise.reject(err);
|
result = Promise.reject(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
const isResultThenable = result !== true && isThenable(result);
|
const isResultThenable = result !== true && isThenable(result);
|
||||||
|
|
||||||
// If the listener didn't returned true or a Promise, or called
|
// If the listener didn't returned true or a Promise, or called
|
||||||
@@ -1106,6 +1085,7 @@
|
|||||||
} else {
|
} else {
|
||||||
message = "An unexpected error occurred";
|
message = "An unexpected error occurred";
|
||||||
}
|
}
|
||||||
|
|
||||||
sendResponse({
|
sendResponse({
|
||||||
__mozWebExtensionPolyfillReject__: true,
|
__mozWebExtensionPolyfillReject__: true,
|
||||||
message
|
message
|
||||||
@@ -1129,10 +1109,8 @@
|
|||||||
return true;
|
return true;
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
const wrappedSendMessageCallback = ({
|
|
||||||
reject,
|
const wrappedSendMessageCallback = ({ reject, resolve }, reply) => {
|
||||||
resolve
|
|
||||||
}, reply) => {
|
|
||||||
if (extensionAPIs.runtime.lastError) {
|
if (extensionAPIs.runtime.lastError) {
|
||||||
// Detect when none of the listeners replied to the sendMessage call and resolve
|
// Detect when none of the listeners replied to the sendMessage call and resolve
|
||||||
// the promise to undefined as in Firefox.
|
// the promise to undefined as in Firefox.
|
||||||
@@ -1140,7 +1118,7 @@
|
|||||||
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
|
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
|
||||||
resolve();
|
resolve();
|
||||||
} else {
|
} else {
|
||||||
reject(new Error(extensionAPIs.runtime.lastError.message));
|
reject(extensionAPIs.runtime.lastError);
|
||||||
}
|
}
|
||||||
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
|
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
|
||||||
// Convert back the JSON representation of the error into
|
// Convert back the JSON representation of the error into
|
||||||
@@ -1150,68 +1128,52 @@
|
|||||||
resolve(reply);
|
resolve(reply);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
|
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
|
||||||
if (args.length < metadata.minArgs) {
|
if (args.length < metadata.minArgs) {
|
||||||
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.length > metadata.maxArgs) {
|
if (args.length > metadata.maxArgs) {
|
||||||
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const wrappedCb = wrappedSendMessageCallback.bind(null, {
|
const wrappedCb = wrappedSendMessageCallback.bind(null, { resolve, reject });
|
||||||
resolve,
|
|
||||||
reject
|
|
||||||
});
|
|
||||||
args.push(wrappedCb);
|
args.push(wrappedCb);
|
||||||
apiNamespaceObj.sendMessage(...args);
|
apiNamespaceObj.sendMessage(...args);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const staticWrappers = {
|
const staticWrappers = {
|
||||||
devtools: {
|
|
||||||
network: {
|
|
||||||
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
runtime: {
|
runtime: {
|
||||||
onMessage: wrapEvent(onMessageWrappers),
|
onMessage: wrapEvent(onMessageWrappers),
|
||||||
onMessageExternal: wrapEvent(onMessageWrappers),
|
onMessageExternal: wrapEvent(onMessageWrappers),
|
||||||
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 1, maxArgs: 3 })
|
||||||
minArgs: 1,
|
|
||||||
maxArgs: 3
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
tabs: {
|
tabs: {
|
||||||
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
sendMessage: wrappedSendMessage.bind(null, "sendMessage", { minArgs: 2, maxArgs: 3 })
|
||||||
minArgs: 2,
|
|
||||||
maxArgs: 3
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
const settingMetadata = {
|
const settingMetadata = {
|
||||||
clear: {
|
clear: { minArgs: 1, maxArgs: 1 },
|
||||||
minArgs: 1,
|
get: { minArgs: 1, maxArgs: 1 },
|
||||||
maxArgs: 1
|
set: { minArgs: 1, maxArgs: 1 }
|
||||||
},
|
|
||||||
get: {
|
|
||||||
minArgs: 1,
|
|
||||||
maxArgs: 1
|
|
||||||
},
|
|
||||||
set: {
|
|
||||||
minArgs: 1,
|
|
||||||
maxArgs: 1
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
apiMetadata.privacy = {
|
apiMetadata.privacy = {
|
||||||
network: {
|
network: {
|
||||||
"*": settingMetadata
|
networkPredictionEnabled: settingMetadata,
|
||||||
|
webRTCIPHandlingPolicy: settingMetadata
|
||||||
},
|
},
|
||||||
services: {
|
services: {
|
||||||
"*": settingMetadata
|
passwordSavingEnabled: settingMetadata
|
||||||
},
|
},
|
||||||
websites: {
|
websites: {
|
||||||
"*": settingMetadata
|
hyperlinkAuditingEnabled: settingMetadata,
|
||||||
|
referrersEnabled: settingMetadata
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
|
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1219,7 +1181,6 @@
|
|||||||
// `module` variable available.
|
// `module` variable available.
|
||||||
module.exports = wrapAPIs(chrome);
|
module.exports = wrapAPIs(chrome);
|
||||||
} else {
|
} else {
|
||||||
module.exports = globalThis.browser;
|
module.exports = browser;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//# sourceMappingURL=browser-polyfill.js.map
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ function removeFieldsFormURL(provider, pureUrl, quiet = false, request = null) {
|
|||||||
|
|
||||||
let finalURL = domain;
|
let finalURL = domain;
|
||||||
|
|
||||||
if (fields.toString() !== "") finalURL += "?" + urlSearchParamsToString(fields);
|
if (fields.toString() !== "") finalURL += "?" + fields.toString();
|
||||||
if (fragments.toString() !== "") finalURL += "#" + fragments.toString();
|
if (fragments.toString() !== "") finalURL += "#" + fragments.toString();
|
||||||
|
|
||||||
url = finalURL.replace(new RegExp("\\?&"), "?").replace(new RegExp("#&"), "#");
|
url = finalURL.replace(new RegExp("\\?&"), "?").replace(new RegExp("#&"), "#");
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -31,16 +31,8 @@ function eTagFilter(requestDetails) {
|
|||||||
continue;
|
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
|
// insert dummy etag
|
||||||
requestDetails.responseHeaders[i].value = generateDummyEtag(len, quotes, w);
|
requestDetails.responseHeaders[i].value = generateDummyEtag();
|
||||||
|
|
||||||
pushToLog(requestDetails.url, requestDetails.url, translate("eTag_filtering_log"));
|
pushToLog(requestDetails.url, requestDetails.url, translate("eTag_filtering_log"));
|
||||||
|
|
||||||
@@ -50,29 +42,12 @@ function eTagFilter(requestDetails) {
|
|||||||
return {responseHeaders: requestDetails.responseHeaders};
|
return {responseHeaders: requestDetails.responseHeaders};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
function generateDummyEtag() {
|
||||||
* Generates a random ETag.
|
return Math.random().toString();
|
||||||
*
|
|
||||||
* 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
browser.webRequest.onHeadersReceived.addListener(
|
||||||
* Since Firefox 85, eTags can no longer be
|
eTagFilter,
|
||||||
* used for tracking users over multiple sites.
|
{urls: ["<all_urls>"]},
|
||||||
*/
|
["blocking", "responseHeaders"]
|
||||||
if(getBrowser() !== "Firefox") {
|
);
|
||||||
browser.webRequest.onHeadersReceived.addListener(
|
|
||||||
eTagFilter,
|
|
||||||
{urls: ["<all_urls>"]},
|
|
||||||
["blocking", "responseHeaders"]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -27,9 +27,6 @@
|
|||||||
function injectFunction() {
|
function injectFunction() {
|
||||||
let ele = document.createElement('script');
|
let ele = document.createElement('script');
|
||||||
let s = document.getElementsByTagName('script')[0];
|
let s = document.getElementsByTagName('script')[0];
|
||||||
if (s === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ele.type = 'text/javascript';
|
ele.type = 'text/javascript';
|
||||||
ele.textContent = "Object.defineProperty(window, 'rwt', {" +
|
ele.textContent = "Object.defineProperty(window, 'rwt', {" +
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -44,7 +44,7 @@ function historyCleaner(details) {
|
|||||||
if(urlBefore !== urlAfter) {
|
if(urlBefore !== urlAfter) {
|
||||||
browser.tabs.executeScript(details.tabId, {
|
browser.tabs.executeScript(details.tabId, {
|
||||||
frameId: details.frameId,
|
frameId: details.frameId,
|
||||||
code: 'history.replaceState(null,"",'+JSON.stringify(urlAfter)+');'
|
code: 'history.replaceState({state: "cleaned_history"},"",'+JSON.stringify(urlAfter)+');'
|
||||||
}).then(() => {}, onError);
|
}).then(() => {}, onError);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -147,20 +147,6 @@ function getData() {
|
|||||||
changeSwitchButton("domainBlocking", "domainBlocking");
|
changeSwitchButton("domainBlocking", "domainBlocking");
|
||||||
changeSwitchButton("pingBlocking", "pingBlocking");
|
changeSwitchButton("pingBlocking", "pingBlocking");
|
||||||
changeSwitchButton("eTagFiltering", "eTagFiltering");
|
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);
|
}).catch(handleError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -328,30 +328,3 @@ async function sha256(message) {
|
|||||||
|
|
||||||
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
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('&')
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
10
css/bootstrap.min.css
vendored
10
css/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
6
css/datatables.min.css
vendored
6
css/datatables.min.css
vendored
File diff suppressed because one or more lines are too long
3
css/pickr.nano.min.css
vendored
3
css/pickr.nano.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ClearURLs
|
* ClearURLs
|
||||||
* Copyright (c) 2017-2025 Kevin Röbert
|
* Copyright (c) 2017-2020 Kevin Röbert
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
10
external_js/bootstrap.min.js
vendored
10
external_js/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
205
external_js/datatables.min.js
vendored
205
external_js/datatables.min.js
vendored
File diff suppressed because one or more lines are too long
5
external_js/fontawesome/all.min.js
vendored
5
external_js/fontawesome/all.min.js
vendored
File diff suppressed because one or more lines are too long
2
external_js/jquery-3.6.0.min.js
vendored
Normal file
2
external_js/jquery-3.6.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
external_js/jquery-3.7.1.min.js
vendored
2
external_js/jquery-3.7.1.min.js
vendored
File diff suppressed because one or more lines are too long
6
external_js/pickr.min.js
vendored
6
external_js/pickr.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
ClearURLs
|
ClearURLs
|
||||||
Copyright (c) 2017-2025 Kevin Röbert
|
Copyright (c) 2017-2020 Kevin Röbert
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
ClearURLs
|
ClearURLs
|
||||||
Copyright (c) 2017-2025 Kevin Röbert
|
Copyright (c) 2017-2020 Kevin Röbert
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
@@ -53,15 +53,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
direction: ltr;
|
direction: ltr;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
#logTable_wrapper .dt-paging {
|
|
||||||
margin-top: 20px;
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#logTable_wrapper .dt-search, .dt-length{
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -121,7 +112,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
<!-- Optional JavaScript -->
|
<!-- Optional JavaScript -->
|
||||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||||
<script src="../browser-polyfill.js"></script>
|
<script src="../browser-polyfill.js"></script>
|
||||||
<script src="../external_js/jquery-3.7.1.min.js"></script>
|
<script src="../external_js/jquery-3.6.0.min.js"></script>
|
||||||
<script src="../external_js/datatables.min.js"></script>
|
<script src="../external_js/datatables.min.js"></script>
|
||||||
<script src="../core_js/log.js"></script>
|
<script src="../core_js/log.js"></script>
|
||||||
<script src="../core_js/write_version.js"></script>
|
<script src="../core_js/write_version.js"></script>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
ClearURLs
|
ClearURLs
|
||||||
Copyright (c) 2017-2025 Kevin Röbert
|
Copyright (c) 2017-2020 Kevin Röbert
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
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>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container-fluid"
|
<div class="container-fluid"
|
||||||
style="min-width: 200px">
|
style="min-width: 200px;">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<nav class="col-sm-12 navbar-margin navbar navbar-dark bg-dark">
|
<nav class="col-sm-1 navbar-margin navbar navbar-dark bg-dark">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<span class="navbar-brand">
|
<span class="navbar-brand">
|
||||||
<span class="float-left"><img src="../img/clearurls.svg"
|
<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>
|
||||||
|
|
||||||
<div class="row" id="references_section">
|
<div class="row" id="references_section">
|
||||||
<div class="col-sm-4 offset-sm-4 text-center">
|
<div class="col-sm-1 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="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>
|
<a id="settings" target="_blank"><span class="fas fa-cog" style="font-size: 1.5em"></span></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row" id="config_section">
|
<div class="row" id="config_section">
|
||||||
<div class="col-sm-4 offset-sm-4">
|
<div class="col-sm-1">
|
||||||
<h5><b id="configs_head"></b></h5>
|
<h5><b id="configs_head"></b></h5>
|
||||||
<label class="switch">
|
<label class="switch">
|
||||||
<input type="checkbox" id="globalStatus">
|
<input type="checkbox" id="globalStatus">
|
||||||
@@ -91,7 +91,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row" id="statistic_section">
|
<div class="row" id="statistic_section">
|
||||||
<div class="col-sm-4 offset-sm-4">
|
<div class="col-sm-1">
|
||||||
<h5><b id="statistics_head"></b></h5>
|
<h5><b id="statistics_head"></b></h5>
|
||||||
|
|
||||||
<div class="progress">
|
<div class="progress">
|
||||||
@@ -133,7 +133,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row" id="status_section">
|
<div class="row" id="status_section">
|
||||||
<div class="col-sm-4 offset-sm-4">
|
<div class="col-sm-1">
|
||||||
<h5><b id="rules_status_head"></b></h5>
|
<h5><b id="rules_status_head"></b></h5>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<a href="https://gitlab.com/ClearURLs/rules/-/commits/master/data.min.json"
|
<a href="https://gitlab.com/ClearURLs/rules/-/commits/master/data.min.json"
|
||||||
@@ -145,7 +145,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
<div class="row" id="log_section">
|
<div class="row" id="log_section">
|
||||||
<div class="col-sm-4 offset-sm-4">
|
<div class="col-sm-1">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<a id="loggingPage" target="_blank"
|
<a id="loggingPage" target="_blank"
|
||||||
class="btn btn-default btn-sm btn-block text-wrap"></a>
|
class="btn btn-default btn-sm btn-block text-wrap"></a>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
ClearURLs
|
ClearURLs
|
||||||
Copyright (c) 2017-2025 Kevin Röbert
|
Copyright (c) 2017-2020 Kevin Röbert
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
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>
|
<span class="slider round"></span>
|
||||||
</label>
|
</label>
|
||||||
</p>
|
</p>
|
||||||
<p id="etag_p">
|
<p>
|
||||||
<label id="eTag_filtering_enabled" style="font-weight: bold;"></label><br />
|
<label id="eTag_filtering_enabled" style="font-weight: bold;"></label><br />
|
||||||
<label class="switch">
|
<label class="switch">
|
||||||
<input type="checkbox" id="eTagFiltering">
|
<input type="checkbox" id="eTagFiltering">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!--
|
<!--
|
||||||
ClearURLs
|
ClearURLs
|
||||||
Copyright (c) 2017-2025 Kevin Röbert
|
Copyright (c) 2017-2020 Kevin Röbert
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
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
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 2,
|
"manifest_version": 2,
|
||||||
"name": "ClearURLs",
|
"name": "ClearURLs",
|
||||||
"version": "1.27.0",
|
"version": "1.25.0",
|
||||||
"author": "Kevin Roebert",
|
"author": "Kevin Roebert",
|
||||||
"description": "__MSG_extension_description__",
|
"description": "__MSG_extension_description__",
|
||||||
"homepage_url": "https://docs.clearurls.xyz",
|
"homepage_url": "https://docs.clearurls.xyz",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"content_security_policy": "script-src 'self'; object-src 'none'",
|
"content_security_policy": "script-src 'self'; object-src 'none'",
|
||||||
"browser_specific_settings": {
|
"applications": {
|
||||||
"gecko": {
|
"gecko": {
|
||||||
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
|
"id": "{74145f27-f039-47ce-a470-a662b129930a}"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user