Compare commits

...

114 Commits
1.6 ... master

Author SHA1 Message Date
kkapsner 4f366ed86c
New translations 2024-04-17 00:35:54 +02:00
kkapsner 00e60074c3 Don't throw `target.apply is not a function`
For #705
2024-04-17 00:34:19 +02:00
kkapsner 3eedc7b7dc Only check for prototype loops when there is a prototype
For #705
2024-04-17 00:07:16 +02:00
kkapsner bebcec2139 Version 1.11 2024-04-16 14:53:11 +02:00
kkapsner 5181a55071 change "Site specific" to "Site-specific" 2024-04-10 16:06:56 +02:00
kkapsner a8e192fa9b change "non persistent" to "nonpersistent"
For #696
2024-04-09 14:04:51 +02:00
kkapsner 0f3141ee12
New translations
For #696
2024-04-09 14:03:06 +02:00
kkapsner e9ce4668fe
New translations 2024-04-09 14:01:35 +02:00
kkapsner acce01bfeb Mark default value in drop downs settings
For #696
2024-04-08 00:15:55 +02:00
kkapsner d159769997 Added :changed tag
For #696
2024-04-08 00:12:46 +02:00
kkapsner 56401048d1 Added tag search 2024-04-08 00:09:37 +02:00
kkapsner 54c625cd26 Fix function tampering detection via prototype
For #619 and #685
2024-04-08 00:05:50 +02:00
kkapsner 7bb3f00b45 Update releaseNotes.txt 2024-04-08 00:04:53 +02:00
kkapsner b8c6115603 Not using proxy for toString broke google
For #698, #699, #700, #701
2024-04-07 23:59:49 +02:00
kkapsner dacc578e12 Alpha versions must not break with patches 2024-04-07 02:36:20 +02:00
kkapsner 825fa42141 Fix isPointInPath and isPointInStroke
Fixes #696
2024-04-07 01:53:01 +02:00
kkapsner 40a8012ab0 Version 1.10.1 2024-04-04 23:30:20 +02:00
kkapsner ec95cbe11b Bump min version to 100
to avoid warnings in the upload process
2024-03-30 17:27:30 +01:00
kkapsner 36b54f3ab5 Update navigator test to include storage.quota 2024-03-30 13:58:09 +01:00
kkapsner 87790c9731 Remove facebook.com from the convenience preset
Fixes #563
2024-03-30 13:54:47 +01:00
kkapsner 200f6b31f3 Do not use proxy for Function.prototype.toString
Fixes #685
2024-03-29 16:37:07 +01:00
kkapsner 1d8bf95926 Added protection for navigator.storage.estimate()
Fixes #681
2024-03-28 16:53:01 +01:00
kkapsner c6cf48c489 Display version
Fixes #687
2024-03-28 14:43:53 +01:00
kkapsner 9a3745b366 Whitelist also data URL blocking
Fixes #665
2024-03-28 14:40:08 +01:00
kkapsner a18e3ba37d Disable cache when reloading in the browser action 2024-03-28 14:26:20 +01:00
kkapsner 645d0ac550 dictionary update 2024-03-28 14:23:31 +01:00
kkapsner 809c1270c5
New translations 2024-03-28 14:21:13 +01:00
kkapsner a99a0615d0 Update dev dependencies 2024-03-28 14:20:01 +01:00
kkapsner bc13a5e2a2 Fix typos 2024-03-28 14:18:37 +01:00
kkapsner 8176ac83dc
New translations
* New Spanish translations
* New German translations
* New Portuguese translations
* New Russian translations
* New Portuguese (Brazilian) translations
2024-03-28 14:07:25 +01:00
kkapsner 4a2079bf47 Add alpha version to updates.json during build 2024-02-17 00:07:11 +01:00
kkapsner 7229133c8d Update build tool for manifest version v3 2024-02-17 00:02:10 +01:00
kkapsner 8bdedfcb3d Update package-lock.json 2024-02-16 23:48:34 +01:00
kkapsner ae40caed09 Update package-lock.json 2023-07-19 01:22:11 +02:00
kkapsner 053ae6725e remove crowdin.yml from build 2023-05-30 19:04:40 +02:00
kkapsner 2a6c564ed8 Remove usage of deprecated browser.extension.getURL 2023-05-30 19:04:02 +02:00
kkapsner 8a84dd09f3
New translations
Lithuanian
2023-05-30 13:50:52 +02:00
kkapsner df039b0f3c Do not use UTC for alpha version 2023-05-30 13:48:25 +02:00
kkapsner fc5cce23ea Increase bottom padding of options page 2023-05-30 13:42:30 +02:00
kkapsner e9f5f710e6 Replace window.open with browser.tabs.create
Fixes #661
2023-05-30 00:20:54 +02:00
kkapsner 5df98e0cf5 Settings export page did not show whole content in Firefox for Android 2023-05-30 00:11:43 +02:00
kkapsner 6ea89b6318 Improve isMobile
Fixes #658
2023-05-29 21:41:42 +02:00
kkapsner 02dfa8bd1b browser.windows.onRemoved not available on Fenix
Fix #654
2023-05-29 21:39:02 +02:00
kkapsner 8dcfac442f Added eBay and facebook.com to the convenience preset
Fixes #563
2023-05-29 14:48:56 +02:00
kkapsner 27d8d61da6 Update release notes
For #656
2023-05-29 14:44:36 +02:00
kkapsner fb1311a842 Added showPresetsOnInstallation
Fixes #656
2023-05-29 14:05:03 +02:00
kkapsner 114b109340 Enable multiple alpha versions per day 2023-04-19 14:48:47 +02:00
kkapsner 4ce2f98b10 Fix alpha version 2023-04-19 14:48:23 +02:00
kkapsner 2c5b00a55d Always protect about:blank
Fixes #652
2023-04-19 14:34:37 +02:00
kkapsner d6916b013e Version 1.10 2023-04-19 14:24:41 +02:00
kkapsner 3b92824d0f Update web-ext to 7.6.1 2023-04-15 20:00:07 +02:00
kkapsner d3558f0bd7 Update release notes
was missing change for screen API
2023-04-15 16:17:59 +02:00
kkapsner d55921ba92 Added known issue to release notes 2023-04-15 16:07:34 +02:00
kkapsner 1ca13299ec New alpha version 2023-04-15 16:07:15 +02:00
kkapsner 53ce86a21f Update release notes 2023-04-07 17:42:16 +02:00
kkapsner 269574ae17 Respect RFP in offscreenToBlobCallback
Fixes #644
2023-04-07 17:35:57 +02:00
kkapsner 3b08fdaf9b Improve github issue template 2023-04-07 10:01:29 +02:00
kkapsner e0e6926a74 Use correct tab in browserAction (private browsing)
Fixes #649
2023-04-07 09:22:03 +02:00
kkapsner 2ac1ec277d Fix typos with firefoxVersionRV 2023-03-25 11:36:01 +01:00
kkapsner 8e463a6164 Update web-ext to 7.6.0 2023-03-22 13:04:33 +01:00
kkapsner 2cefed00a7 Fix alpha building tool 2023-03-22 13:04:09 +01:00
kkapsner 7cd4b2e9fa Updated browser presets 2023-03-18 14:45:32 +01:00
kkapsner 8d3f489d11 Added {real Firefox version - rv} to Firefox navigator preset
Fixes #641
2023-03-18 14:44:44 +01:00
kkapsner 34bc1730a1 Added dhl.de to the convenience preset
Fixes #532
2023-03-14 20:08:14 +01:00
kkapsner f900c25900
New translations
* New Italian translations
* New Korean translations
2023-03-14 16:50:19 +01:00
kkapsner 6b172a0a4c Update manifest.json for new manifest version 2023-03-14 16:49:37 +01:00
kkapsner 46eb608f4e Update package-lock.json 2023-03-14 16:43:20 +01:00
kkapsner b46341de90 Update web-ext 2022-09-04 15:19:03 +02:00
kkapsner 91b7dcbb11 Update readme regarding built-in fingerprinting protection
Fixes #628
2022-09-04 15:15:50 +02:00
kkapsner 582a962d8d
New translations 2022-08-28 17:47:48 +02:00
kkapsner d9c14d7eed Use public bounce for data-URL test
Fixes #615
2022-05-04 13:30:47 +02:00
kkapsner 4bd0c0c96c Added support for wildcards (*) in domains
Fixes #613
2022-04-26 17:08:28 +02:00
kkapsner cfb09075eb Fetch errors in URL regular expressions creation #2
Fixes #602
2022-04-24 20:50:06 +02:00
kkapsner 4443d0a117 Improve issue template 2022-04-24 20:47:58 +02:00
kkapsner bb71b10c58
Fixed typo in other languages 2022-04-22 10:12:17 +02:00
kkapsner 4d4cda678c Fix typo 2022-04-22 10:08:03 +02:00
kkapsner 6c6012edf4
Update descriptions in all languages
For #591 and #607
2022-04-21 21:24:00 +02:00
kkapsner 05f8f936e9 Update description of the rngs
Fixes #591
2022-04-21 21:11:44 +02:00
kkapsner 1a199a5049 Updated description of webGL vendor and renderer
Fixes #607
2022-04-21 17:18:27 +02:00
kkapsner e5cba569ba Fix npm audit 2022-04-15 13:54:27 +02:00
kkapsner fd09e3d5cf Use inner of top window for all outer computations
For #598
2022-04-04 18:10:16 +02:00
kkapsner 6aab7f68ea
New translations
* Czech
* Chinese Simplified
* Portuguese, Brazilian
* French
* Spanish
2022-03-30 16:48:33 +02:00
kkapsner a92373f412 Update web-ext 2022-03-30 16:46:28 +02:00
kkapsner b4cb52df15 Fix eslint warning 2022-03-17 23:05:46 +01:00
kkapsner d100932236 Allow clicks in url change input
Fixes #600
2022-03-17 22:44:52 +01:00
CommanderRoot bfa355b58d
Replace deprecated String.prototype.substr() 2022-02-21 19:46:02 +01:00
kkapsner dc593daba8 Update eslint and web-ext 2022-02-20 23:31:23 +01:00
kkapsner 029933964f Version 1.9 2022-02-18 19:45:27 +01:00
kkapsner ffd659c7bb Update release notes 2022-02-17 17:39:35 +01:00
kkapsner f788cd4263
New translations 2022-02-17 17:19:05 +01:00
kkapsner 1bd87e6953 Added <option1|option2|...> syntax to webGL
Fixes #493
2022-02-15 19:53:58 +01:00
kkapsner fb231a070b Added {random vendor} and {random renderer}
For #493
2022-02-14 17:37:54 +01:00
kkapsner 740b360485 Linting 2022-02-13 14:57:36 +01:00
kkapsner 3621fef625 Fix slight code problems in svg-test 2022-02-13 14:54:48 +01:00
kkapsner 3d603b84d4 Added notice when dom.webAudio.enabled is set to false
Fixes #592
2022-01-30 17:50:59 +01:00
kkapsner d4fc7027eb Fetch errors in URL regular expressions creation
Fixes #581
2022-01-30 13:11:44 +01:00
kkapsner 4c364a9a72
New translations 2022-01-30 11:16:54 +01:00
kkapsner 863140c1ca Added anchors to FAQ 2022-01-30 11:00:00 +01:00
kkapsner 640bd36b86 Added SVG protection
Fixes #589 and fixes #590
2022-01-30 10:59:41 +01:00
kkapsner 734e76180f Added test for SVG
For #589 and #590
2022-01-30 10:05:52 +01:00
kkapsner 78183f9efc Version 1.8 2021-11-07 16:20:39 +01:00
kkapsner f043acf41c Release preparation 2021-11-07 11:09:53 +01:00
kkapsner 892e4d2c34
New translations 2021-11-01 13:57:01 +01:00
kkapsner d97864436d update release notes 2021-11-01 13:54:59 +01:00
kkapsner 7f154c6cc6 Do not use browser.extension.getURL 2021-11-01 13:18:38 +01:00
kkapsner 6f5cfc1080
New Italian translations 2021-09-09 17:42:29 +02:00
kkapsner cca81c4006 Do not add CSP headers to 304 requests
Fixes #577
2021-09-09 17:40:18 +02:00
kkapsner 2f6ca07bba Added 304 test
For #577
2021-09-08 23:09:08 +02:00
kkapsner 8e4a881288 Close browserAction when a new page is opened
Fixes #576
2021-08-17 19:01:44 +02:00
kkapsner 709093fa4d Update web-ext 2021-07-04 09:28:57 +02:00
kkapsner b9d5eb3d27 Version 1.7 2021-06-21 23:28:36 +02:00
kkapsner e8ee1f8e9c Verion 1.6.1
Fixes #564
2021-06-21 22:01:09 +02:00
kkapsner 4ac02003de wrapped original funtion may gets destroyed before usage
For #564
2021-06-21 20:41:33 +02:00
kkapsner cf0243d487 Version 1.7 2021-06-20 14:42:13 +02:00
81 changed files with 14661 additions and 9381 deletions

View File

@ -14,7 +14,7 @@
foreach (new DirectoryIterator("./") as $file){
if (!$file->isDot() && !$file->isDir() && $file->getExtension() === "md"){
$markdown = $parser->parse(file_get_contents($file->getPathname()));
echo $markdown->view("html");
echo preg_replace("/<h2/", "<h2 id=\"" . str_replace(".md", "", $file->getFilename()) . "\"", $markdown->view("html"), 1);
}
}
?>

View File

@ -2,13 +2,13 @@
## Description
<!--- Provide a more detailed introduction to the issue itself. -->
<!--- Why you consider it to be a bug or a usefull change/improvement? -->
<!--- Why you consider it to be a bug or a useful change/improvement? -->
## Expected Behavior
## Expected Behaviour
<!--- If you're describing a bug, tell us what should happen. -->
<!--- If you're suggesting a change/improvement, tell us how it should work. -->
## Current Behavior
## Current Behaviour
<!--- If describing a bug, tell us what happens instead of the expected behavior. -->
<!--- If suggesting a change/improvement, explain the difference from current behavior. -->
@ -18,10 +18,10 @@
## Steps to Reproduce (for bugs)
<!--- Provide a link to a live example, or an unambiguous set of steps to reproduce this bug. -->
1.
2.
3.
4.
1. create a fresh Firefox profile
2.
3.
4.
## Context
<!--- How has this issue affected you? What are you trying to accomplish? -->
@ -36,6 +36,8 @@
* Installed addons:
## Your Settings
~~~ json
<!--- Copy your CanvasBlocker settings here. -->
<!-- They can be retrieved by checking the expert mode and going to export settings. -->
<!--- You may consider deleting personal data - especially the "persistentRndStorage". -->
<!--- You may consider deleting personal data - especially the "persistentRndStorage". -->
~~~

View File

@ -14,11 +14,53 @@ const args = yargs
const fs = require("fs");
function getAlphaVersion(manifest){
const versionsPath = path.join(__dirname, "..", "versions");
function getXPIFileName(id, version){
"use strict";
return `${id}-${version}.xpi`;
}
async function addAlphaVersionToUpdatesJSON(version){
"use strict";
const updatesPath = path.join(versionsPath, "updates.json");
const data = JSON.parse(await fs.promises.readFile(updatesPath));
const versions = data.addons["CanvasBlocker-Beta@kkapsner.de"].updates;
if (versions.some(function(entry){
return entry.version === version;
})){
return;
}
versions.push({
version,
update_link: `https://canvasblocker.kkapsner.de/versions/${getXPIFileName("canvasblocker_beta", version)}`
});
await fs.promises.writeFile(updatesPath, JSON.stringify(data, undefined, "\t"));
}
async function getAlphaVersion(manifest){
"use strict";
function f(n){
if (n < 10) return "0" + n.toString(10);
return n.toString(10);
}
const now = new Date();
const date = now.toISOString().substr(0, 10).replace(/-/g, "");
return manifest.version.replace(/^([\d.]+).*$/, "$1Alpha" + date);
const date = `${now.getFullYear()}${f(now.getMonth() + 1)}${f(now.getDate())}`;
const versionParts = manifest.version.split(".");
while (versionParts.length > 2){
versionParts.pop();
}
const baseVersion = `${versionParts.join(".")}.${date}`;
if (!fs.existsSync(path.join(versionsPath, getXPIFileName("canvasblocker_beta", baseVersion)))){
return baseVersion;
}
let dayTry = 1;
while (fs.existsSync(path.join(versionsPath, getXPIFileName("canvasblocker_beta", `${baseVersion}.${dayTry}`)))){
dayTry += 1;
}
return `${baseVersion}.${dayTry}`;
}
function getRCVersion(manifest){
"use strict";
@ -37,15 +79,22 @@ async function run(){
const manifest = require(manifestPath);
if (args.type === "alpha" || args.type === "rc"){
manifest.name = "CanvasBlocker-Beta";
manifest.applications.gecko.id = "CanvasBlocker-Beta@kkapsner.de";
["gecko", "gecko_android"].forEach(function(browserType){
if (!manifest.browser_specific_settings[browserType]) return;
manifest.browser_specific_settings[browserType].id = "CanvasBlocker-Beta@kkapsner.de";
});
}
else {
manifest.name = "CanvasBlocker";
manifest.applications.gecko.id = "CanvasBlocker@kkapsner.de";
delete manifest.applications.gecko.update_url;
["gecko", "gecko_android"].forEach(function(browserType){
if (!manifest.browser_specific_settings[browserType]) return;
manifest.browser_specific_settings[browserType].id = "CanvasBlocker@kkapsner.de";
delete manifest.browser_specific_settings[browserType].update_url;
});
}
if (args.type === "alpha"){
manifest.version = getAlphaVersion(manifest);
manifest.version = await getAlphaVersion(manifest);
addAlphaVersionToUpdatesJSON(manifest.version);
}
else if (args.type === "rc"){
manifest.version = getRCVersion(manifest);
@ -64,6 +113,8 @@ async function run(){
"--ignore-files",
"versions",
"--ignore-files",
"crowdin.yml",
"--ignore-files",
"package*"
];
const child = child_process.spawn("web-ext", childArgs, {stdio: "inherit"});

View File

@ -0,0 +1,164 @@
const data = require("./chromeVendors.json");
function addString(string, currentTree){
"use strict";
if (string.length <= 1){
const nextTree = currentTree[string] || {};
currentTree[string] = nextTree;
}
else {
const firstChar = string.substring(0, 1);
const nextTree = currentTree[firstChar] || {};
currentTree[firstChar] = nextTree;
const nextString = string.substring(1);
addString(nextString, nextTree);
}
}
function output(tree){
"use strict";
const keys = Object.keys(tree);
switch (keys.length){
case 0:
return "";
case 1:
return keys[0] + output(tree[keys[0]]);
default:
return "<" + keys.map(key => key + output(tree[key])).join("|") + ">";
}
}
// every string ends with a ) and does not contain <, >, $ or |
data.forEach(function(string){
"use strict";
if (
!string.endsWith(")") ||
string.match(/[<>|$]/)
){
throw string;
}
});
const tree1 = {};
const tree2 = {};
const tree3 = {};
data.every(function(string){
"use strict";
string = string.substring(0, string.length - 1);
const parts = string.split(" Direct", 2);
const parts2 = parts[0].split(" (Microsoft Corporation", 2);
addString(parts2[0], tree1);
if (parts2.length > 1){
addString(" (Microsoft Corporation" + parts2[1], tree2);
}
else {
addString("", tree2);
}
if (parts.length > 1){
addString(" Direct" + parts[1], tree3);
}
else {
addString("", tree3);
}
return true;
});
// const compressed = output(tree1) + output(tree2) + output(tree3) + ")";
const compressed = output(tree1) + output(tree2) +
"< Direct3D<11 vs_<4_<0 ps_4_0|1 ps_4_1>|5_0 ps_5_0>|9<Ex|> vs_<0_0 ps_<2_0|3_0>|2_0 ps_2_0|3_0 ps_3_0>>|>" + ")";
console.log("compressed length", compressed.length);
// console.log(compressed);
function countWords(string){
"use strict";
const words = {};
string.split(/[^0-9a-z]+/i).filter(word => word.length > 2).forEach(function(word){
const wordStats = words[word] || {count: 0};
words[word] = wordStats;
wordStats.count += 1;
});
return words;
}
function wordCompressor(string){
"use strict";
const words = countWords(string);
const duplicatedWord = Object.keys(words)
.map(function(word){
return {
word,
count: words[word].count
};
})
.filter(word => word.count > 1)
.sort((a, b) => b.word.length*b.count - a.word.length*a.count);
let compressed = string;
let index = 0;
const usedWords = [];
for (let i = 0; i < duplicatedWord.length; i += 1){
const replacement = "$" + index.toString(36);
const word = duplicatedWord[i].word;
if (
replacement.length < word.length &&
(word.length - replacement.length) * duplicatedWord[i].count > word.length + 1
){
compressed = compressed.replace(new RegExp("\\b" + word + "\\b", "g"), replacement);
index += 1;
usedWords.push(word);
}
}
return {compressed, usedWords};
}
const {compressed: compressed2, usedWords} = wordCompressor(compressed);
console.log("compressed 2 length", compressed2.length);
console.log(compressed2);
console.log(usedWords.join("|"));
function decompress(string, words){
"use strict";
return string.replace(/\$([0-9a-z]+)/gi, function(m, index){
return words[parseInt(index, 36)];
});
}
const decompressed2 = decompress(compressed2, usedWords);
console.log("test: ", compressed === decompressed2);
for (let start = 0; start < compressed.length; start += 100){
if (compressed.substring(start, start + 100) !== decompressed2.substring(start, start + 100)){
console.log(start);
console.log(compressed.substring(start, start + 100));
console.log(decompressed2.substring(start, start + 100));
}
}
function pickOne(string){
"use strict";
const options = [];
let cumulate = "";
let index = 0;
for (const l = string.length; index < l; index += 1){
const char = string.charAt(index);
if (char === "|"){
options.push(cumulate);
cumulate = "";
}
else if (char === "<"){
const subPick = pickOne(string.substring(index + 1));
cumulate += subPick.value;
index += 1 + subPick.endIndex;
}
else if (char === ">"){
break;
}
else {
cumulate += char;
}
}
options.push(cumulate);
return {value: options[Math.floor(Math.random() * options.length)], endIndex: index};
}
console.log(pickOne(compressed).value);

693
.tools/chromeVendors.json Normal file
View File

@ -0,0 +1,693 @@
[
"ANGLE (AMD (ATI) FirePro M8900 (FireGL) Mobility Pro Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD 760G (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD 760G Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD 760G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD FirePro 2270 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD FirePro W5000 (FireGL V) Graphics Adapter Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD M880G with ATI Mobility Radeon HD 4200 )",
"ANGLE (AMD M880G with ATI Mobility Radeon HD 4200 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD M880G with ATI Mobility Radeon HD 4250 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5670 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 5800 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6250 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6250M )",
"ANGLE (AMD Radeon HD 6290 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6290 Graphics (Microsoft Corporation- WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6290 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6300 series Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6310 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6310 Graphics )",
"ANGLE (AMD Radeon HD 6310 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6310M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6320 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6320 Graphic Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6320 Graphics )",
"ANGLE (AMD Radeon HD 6320 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6320 Graphics)",
"ANGLE (AMD Radeon HD 6320 series Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6320M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6350 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6370D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6370M)",
"ANGLE (AMD Radeon HD 6400M Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6410D Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6410D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6450 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6450A Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6470M )",
"ANGLE (AMD Radeon HD 6470M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6470M)",
"ANGLE (AMD Radeon HD 6480G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6500M/5600/5700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6510 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6520G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6530D Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6550A Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6570 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6570)",
"ANGLE (AMD Radeon HD 6620G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6630M)",
"ANGLE (AMD Radeon HD 6650A Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6670 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6730M)",
"ANGLE (AMD Radeon HD 6800 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6800 Series)",
"ANGLE (AMD Radeon HD 6900 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 6900M Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7000 series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7290 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7300 Series Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7300 Series)",
"ANGLE (AMD Radeon HD 7310 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7310 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7310M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7340 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7340 Graphics (Microsoft Corporation - WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7340 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7340G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7340M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7400M Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7420G Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7420G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7450 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7470M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7480D Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7480D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7500/7600 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7500G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7500M/7600M Series (Microsoft Corporation - WDDM v1.3) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7520G + 7670M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7520G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7540D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7550M/7650M Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7550M/7650M Graphics)",
"ANGLE (AMD Radeon HD 7560D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7570 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7570M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7580D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7600G + 6400M Dual Graphics)",
"ANGLE (AMD Radeon HD 7600M Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7610M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7610M)",
"ANGLE (AMD Radeon HD 7640G + 7600M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7640G + 7670M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7640G + 8750M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7640G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7650M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7660D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7660D)",
"ANGLE (AMD Radeon HD 7660G + 7600M Dual Graphics)",
"ANGLE (AMD Radeon HD 7660G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7670M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7700 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7800 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 7800 Series)",
"ANGLE (AMD Radeon HD 7900 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8210 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8240 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8250 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8330 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8350 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8400 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8450G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8470 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8470D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8510G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8550G + 8570M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8550G + HD 8600/8700M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8550G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8570D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8610G + 8500M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8610G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8650G + 8670M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8650G + 8750M Dual Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD 8670D Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD6370D Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD6410D Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD7700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon HD7770 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon R7 200 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon R9 200 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon(TM) HD 6380G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon(TM) HD 6480G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon(TM) HD 6520G )",
"ANGLE (AMD Radeon(TM) HD 6520G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon(TM) HD 6620G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (AMD Radeon(TM) HD 7450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH4350 series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH5450 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH5670 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH5770 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH6450 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH6670 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS EAH6970 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS HD7770 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ASUS R9 270 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI FirePro 2450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI FirePro V3700 (FireGL) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI FirePro V3800 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI FirePro V4800 (FireGL) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon 9600/9700 Series)",
"ANGLE (ATI Mobility Radeon HD 2400 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 2400 XT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 2600 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 3400 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 3430 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 3450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 3470 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 3650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4200 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4200 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4250 )",
"ANGLE (ATI Mobility Radeon HD 4250 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4250 Graphics Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4250 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4300 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4300/4500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4330 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4330)",
"ANGLE (ATI Mobility Radeon HD 4500 Series (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4500/5100 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4530 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4570)",
"ANGLE (ATI Mobility Radeon HD 4650 (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 4650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5000 Series (Microsoft Corporation - WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5000 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5145 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5400 Series )",
"ANGLE (ATI Mobility Radeon HD 5400 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5430)",
"ANGLE (ATI Mobility Radeon HD 5450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 545v Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5470 )",
"ANGLE (ATI Mobility Radeon HD 5470 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5470 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5470)",
"ANGLE (ATI Mobility Radeon HD 5650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon HD 5650)",
"ANGLE (ATI Mobility Radeon HD 6370)",
"ANGLE (ATI Mobility Radeon HD 6550 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon X1300 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon X1600 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Mobility Radeon X1600)",
"ANGLE (ATI Radeon 2100 (Microsoft Corporation - WDDM) Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon 2100 Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon 2100)",
"ANGLE (ATI Radeon 3000 Graphics (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon 3000 Graphics Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon 3000 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon 3000 Graphics)",
"ANGLE (ATI Radeon 3100 Graphics (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon 3100 Graphics)",
"ANGLE (ATI Radeon HD 2350 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 Pro )",
"ANGLE (ATI Radeon HD 2400 Pro Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 PRO Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 Pro Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 PRO Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 XT (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 XT )",
"ANGLE (ATI Radeon HD 2400 XT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 XT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2400 XT)",
"ANGLE (ATI Radeon HD 2600 Pro )",
"ANGLE (ATI Radeon HD 2600 PRO)",
"ANGLE (ATI Radeon HD 2600 XT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 2600 XT)",
"ANGLE (ATI Radeon HD 3200 Graphics (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3200 Graphics Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3200 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3300 Graphics Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3300 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3400 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3400 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3450 - Dell Optiplex Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3450 - Dell Optiplex Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3450 (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3470 - Dell Optiplex Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3600 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3600 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 3800 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4200 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4200 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4200)",
"ANGLE (ATI Radeon HD 4250 )",
"ANGLE (ATI Radeon HD 4250 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4250 Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4250)",
"ANGLE (ATI Radeon HD 4300 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4300/4500 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4350 (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4350 )",
"ANGLE (ATI Radeon HD 4350 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4350 Series)",
"ANGLE (ATI Radeon HD 4350)",
"ANGLE (ATI Radeon HD 4550 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4600 Series (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4600 Series )",
"ANGLE (ATI Radeon HD 4600 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4600 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4600 Serisi (Microsoft Corporation- WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4650 (Microsoft Corporation WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4670)",
"ANGLE (ATI Radeon HD 4770 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4800 Series (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4800 Series (Microsoft Corporation WDDM 1.1) )",
"ANGLE (ATI Radeon HD 4800 Series Direct3D11 vs_4_1 ps_4_1)",
"ANGLE (ATI Radeon HD 4800 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4800 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 4800 Series)",
"ANGLE (ATI Radeon HD 4870 X2 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5400 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5450 (Microsoft Corporation - WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5450 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5450)",
"ANGLE (ATI Radeon HD 5570 (Microsoft Corporation - WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5600 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5670 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5700 Series (Microsoft Corporation - WDDM v1.20) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5700 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5700 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 5800 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 6230 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD 6350 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon HD4670 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (ATI Radeon X1050 Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1050 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1200 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1200 Series (Microsoft Corporation - WDDM) Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1200 Series Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1200 Series Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1200 Series)",
"ANGLE (ATI Radeon X1250 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X1270 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X300/X550/X1050 Series Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X300/X550/X1050 Series Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon X300/X550/X1050 Series)",
"ANGLE (ATI Radeon Xpress 1100 Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 1150 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 1150 Series Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 1150 Series Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 1200 Series Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 1250 Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (ATI Radeon Xpress 200 Series Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (Intel(R) 4 Series Internal Chipset Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Intel(R) 4 Series Internal Chipset Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) 82915G/GV/910GL Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) 82945G Express Chipset Family (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) 82945G Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) 82945G Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) 82945G Express Chipset Family)",
"ANGLE (Intel(R) 946GZ Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) 946GZ Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) B43 Express Chipset Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G33/G31 Express Chipset Family (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) G33/G31 Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) G33/G31 Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) G33/G31 Express Chipset Family)",
"ANGLE (Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G41 Express Chipset (Microsoft Corporation - WDDM 1.1))",
"ANGLE (Intel(R) G41 Express Chipset Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G41 Express Chipset Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G41 Express Chipset)",
"ANGLE (Intel(R) G45/G43 Express Chipset (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G45/G43 Express Chipset Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) G965 Express Chipset Family Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) Graphics Media Accelerator 3150 (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Graphics Media Accelerator 3150 Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Graphics Media Accelerator 3150 Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Graphics Media Accelerator 3150)",
"ANGLE (Intel(R) Graphics Media Accelerator 3600 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) Graphics Media Accelerator HD )",
"ANGLE (Intel(R) Graphics Media Accelerator HD Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics 3000 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics 3000)",
"ANGLE (Intel(R) HD Graphics 4000 (Microsoft Corporation - WDDM 1.2) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics 4000 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics 4000)",
"ANGLE (Intel(R) HD Graphics 4400 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics 4600 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics Family Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics Family Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) HD Graphics Family)",
"ANGLE (Intel(R) HD Graphics)",
"ANGLE (Intel(R) Q33 Express Chipset Family (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q33 Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q33 Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q35 Express Chipset Family (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q35 Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q35 Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q45/Q43 Express Chipset (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) Q45/Q43 Express Chipset (Microsoft Corporation - WDDM 1.1))",
"ANGLE (Intel(R) Q45/Q43 Express Chipset Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Intel(R) Q45/Q43 Express Chipset Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Intel(R) Q45/Q43 Express Chipset)",
"ANGLE (Intel(R) Q965/Q963 Express Chipset Family (Microsoft Corporation - WDDM 1.0) Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q965/Q963 Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q965/Q963 Express Chipset Family Direct3D9Ex vs_0_0 ps_2_0)",
"ANGLE (Intel(R) Q965/Q963 Express Chipset Family)",
"ANGLE (Microsoft Basic Render Driver Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) - famiglia Express Chipset 45 (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 4 Series Express Chipset Family (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 4 Series Express Chipset Family Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 4 Series Express Chipset Family Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 4 Series Express Chipset Family)",
"ANGLE (Mobile Intel(R) 45 Express Chipset Family (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family Direct3D9 vs_0_0 ps_2_0)",
"ANGLE (Mobile Intel(R) 915GM/GMS,910GML Express Chipset Family)",
"ANGLE (Mobile Intel(R) 945 Express Chipset Family)",
"ANGLE (Mobile Intel(R) 945GM Express Chipset Family)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family (Microsoft Corporation - WDDM 1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family Direct3D9 vs_0_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family Direct3D9Ex vs_0_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) 965 Express Chipset Family)",
"ANGLE (Mobile Intel(R) HD Graphics Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Mobile Intel(R) HD Graphics)",
"ANGLE (NVIDIA GeForce 210 )",
"ANGLE (NVIDIA GeForce 210 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 210 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 210)",
"ANGLE (NVIDIA GeForce 310 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 310M (Microsoft Corporation - WDDM v1.2) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 310M )",
"ANGLE (NVIDIA GeForce 310M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 310M)",
"ANGLE (NVIDIA GeForce 315 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 315M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 405 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 405)",
"ANGLE (NVIDIA GeForce 405M)",
"ANGLE (NVIDIA GeForce 410M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 605 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6100 nForce 405 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6100 nForce 405 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6100)",
"ANGLE (NVIDIA GeForce 610M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150 LE (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150 LE Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150SE nForce 430 (Microsoft Corporation - WDDM v1.2) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150SE nForce 430 (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150SE nForce 430 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150SE nForce 430 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6150SE nForce 430)",
"ANGLE (NVIDIA GeForce 6200 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6200 TurboCache(TM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6500 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6600 (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6600 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 6600 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7000M / nForce 610M Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7000M / nForce 610M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7025 / NVIDIA nForce 630a (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7025 / NVIDIA nForce 630a )",
"ANGLE (NVIDIA GeForce 7025 / NVIDIA nForce 630a Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7025 / NVIDIA nForce 630a Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7025 / NVIDIA nForce 630a)",
"ANGLE (NVIDIA GeForce 7050 / NVIDIA nForce 620i Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7050 PV / NVIDIA nForce 630a Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7100 / NVIDIA nForce 630i Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7100 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7150M / nForce 630M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 GS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 GT (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 LE (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 LE Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 SE/7200 GS (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 SE/7200 GS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7300 SE/7200 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 7900 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8200 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8200M G Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8200M G)",
"ANGLE (NVIDIA GeForce 8300 GS )",
"ANGLE (NVIDIA GeForce 8300 GS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8300 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400 GS (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400 GS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400 GS)",
"ANGLE (NVIDIA GeForce 8400GS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400M GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8400M GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8500 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8500 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GT (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GT )",
"ANGLE (NVIDIA GeForce 8600 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GT)",
"ANGLE (NVIDIA GeForce 8600 GTS (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GTS Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600 GTS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600GS (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600M GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8600M GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8800 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8800 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8800 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8800 GTS 512 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 8800 GTS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9100 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9200 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9200M GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9300 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9300 GE (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9300 GE Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9300 GE Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9300M GS (Microsoft Corporation - WDDM v1.1))",
"ANGLE (NVIDIA GeForce 9300M GS )",
"ANGLE (NVIDIA GeForce 9300M GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9400 GT (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9400 GT )",
"ANGLE (NVIDIA GeForce 9400 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9400 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9400 GT)",
"ANGLE (NVIDIA GeForce 9400M )",
"ANGLE (NVIDIA GeForce 9500 GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9500 GS)",
"ANGLE (NVIDIA GeForce 9500 GT (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9500 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9500 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9500 GT)",
"ANGLE (NVIDIA GeForce 9500M GS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9600 GSO 512 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9600 GT (Microsoft Corporation - WDDM v1.1))",
"ANGLE (NVIDIA GeForce 9600 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9600 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9600 GT)",
"ANGLE (NVIDIA GeForce 9600M GS)",
"ANGLE (NVIDIA GeForce 9600M GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9600M GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9650M GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9700M GTS Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9800 GT (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9800 GT (Microsoft Corporation - WDDM v1.1))",
"ANGLE (NVIDIA GeForce 9800 GT )",
"ANGLE (NVIDIA GeForce 9800 GT Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9800 GT Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce 9800 GTX/9800 GTX+ Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce FX 5200 Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (NVIDIA GeForce G 103M )",
"ANGLE (NVIDIA GeForce G 105M )",
"ANGLE (NVIDIA GeForce G 105M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce G100 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce G100)",
"ANGLE (NVIDIA GeForce G102M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce G105M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce G210 )",
"ANGLE (NVIDIA GeForce G210 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce G210)",
"ANGLE (NVIDIA GeForce G210M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce Go 7300 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 120M)",
"ANGLE (NVIDIA GeForce GT 220 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 220 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 220)",
"ANGLE (NVIDIA GeForce GT 230 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 230M )",
"ANGLE (NVIDIA GeForce GT 230M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 240 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 240 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 240)",
"ANGLE (NVIDIA GeForce GT 240M )",
"ANGLE (NVIDIA GeForce GT 240M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 320 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 320M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 330 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 330M )",
"ANGLE (NVIDIA GeForce GT 330M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 335M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 420 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 420M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 425M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 430 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 430 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 430)",
"ANGLE (NVIDIA GeForce GT 440 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 440 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 440)",
"ANGLE (NVIDIA GeForce GT 520 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 520 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 520)",
"ANGLE (NVIDIA GeForce GT 520M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 520M)",
"ANGLE (NVIDIA GeForce GT 525M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 530 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 545 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 555M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 610 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 610)",
"ANGLE (NVIDIA GeForce GT 620 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 620)",
"ANGLE (NVIDIA GeForce GT 625 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 630 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 630 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 630M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 635 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 640 )",
"ANGLE (NVIDIA GeForce GT 640 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 640)",
"ANGLE (NVIDIA GeForce GT 640M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 650M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 740M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GT 755M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 240 Direct3D11 vs_4_0 ps_4_0)",
"ANGLE (NVIDIA GeForce GTS 250 (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 250 (Microsoft Corporation - WDDM v1.1))",
"ANGLE (NVIDIA GeForce GTS 250 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 250 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 250)",
"ANGLE (NVIDIA GeForce GTS 350M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 450 )",
"ANGLE (NVIDIA GeForce GTS 450 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 450 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTS 450)",
"ANGLE (NVIDIA GeForce GTX 260 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 275 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 285 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 295 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 460 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 460 SE Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 460)",
"ANGLE (NVIDIA GeForce GTX 460M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 480 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 550 Ti Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 550 Ti)",
"ANGLE (NVIDIA GeForce GTX 560 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 560 Ti )",
"ANGLE (NVIDIA GeForce GTX 560 Ti Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 560M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 570 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 580 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 580M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 650 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 650 Ti BOOST Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 650 Ti Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 650)",
"ANGLE (NVIDIA GeForce GTX 660 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 660 Ti Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 660M )",
"ANGLE (NVIDIA GeForce GTX 660M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 670 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 670)",
"ANGLE (NVIDIA GeForce GTX 675M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 680 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 690 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 760 (192-bit) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 760 Direct3D11 vs_5_0 ps_5_0)",
"ANGLE (NVIDIA GeForce GTX 760 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 770 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA GeForce GTX 780 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA ION Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA MCP67M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA nForce 750a SLI Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 300 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 3100M )",
"ANGLE (NVIDIA NVS 3100M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 4200M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 5100M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 5200M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA NVS 5400M )",
"ANGLE (NVIDIA Quadro 1000M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro 2000M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro 600 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 1500M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 1700 (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 1700 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 1800 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 2500M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 2700M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 3700 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 570 (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 570 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 580 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 770M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro FX 880M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro K3000M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro K600 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 110M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 135M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 140M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 140M)",
"ANGLE (NVIDIA Quadro NVS 160M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 160M)",
"ANGLE (NVIDIA Quadro NVS 285 Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 290 (Microsoft Corporation - WDDM v1.1) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (NVIDIA Quadro NVS 290 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon (TM) HD 6470M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon (TM) HD 6490M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon HD 6470M Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1300/X1550 Series (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1300/X1550 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Radeon X1300/X1550 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1550 64-bit (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1550 Series (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1650 SE Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1650 Series (Microsoft Corporation - WDDM) Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1650 Series )",
"ANGLE (Radeon X1650 Series Direct3D9 vs_3_0 ps_3_0)",
"ANGLE (Radeon X1650 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X1950 Series Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Radeon X300/X550/X1050 Series (Microsoft Corporation - WDDM) Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (Radeon X300/X550/X1050 Series Direct3D9 vs_2_0 ps_2_0)",
"ANGLE (Radeon X800 GTO (Microsoft Corporation - WDDM) Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (RDPDD Chained DD Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (Royal BNA Driver Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (RS880 Direct3D9Ex vs_3_0 ps_3_0)",
"ANGLE (SiS Mirage 3 Graphics Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (SiS Mirage 3 Graphics)",
"ANGLE (VIA Chrome9 HC IGP Family WDDM Direct3D9Ex vs_2_0 ps_2_0)",
"ANGLE (WinFast GT 640(NVIDIA) Direct3D9Ex vs_3_0 ps_3_0)"
]

64
.vscode/settings.json vendored
View File

@ -1,60 +1,63 @@
{
"cSpell.words": [
"arial",
"Benachrichtigungsdetails",
"benachrichtigungsicon",
"Blockiermodi",
"Blockiermodus",
"Captcha",
"Coord",
"Fenix",
"Funktionalitätstest",
"Funktionalitätstests",
"Hyrp",
"Ignorierliste",
"KHTML",
"Krasnaya",
"Maleficient",
"Nachfrageverweigerungsmodus",
"Oakenpants",
"PDFs",
"Palemoon",
"Ploshchad",
"Rect",
"Rects",
"Spoofer",
"Strg",
"Thorin",
"Tiie",
"Vortäuschaktion",
"Vortäuschgröße",
"Vortäuschrate",
"Waterfox",
"arial",
"benachrichtigungsicon",
"canvasblocker",
"Captcha",
"checkmark",
"collapser",
"Coord",
"darkgreen",
"dont",
"fakeable",
"Fenix",
"fragmenter",
"Funktionalitätstest",
"Funktionalitätstests",
"graytext",
"Hyrp",
"iframe",
"ignorelist",
"Ignorierliste",
"KHTML",
"Krasnaya",
"lightgray",
"Maleficient",
"mediump",
"micrococo",
"monero",
"monospace",
"Nachfrageverweigerungsmodus",
"nocanvas",
"Oakenpants",
"onedrive",
"onloaded",
"oscpu",
"Palemoon",
"paypal",
"PDFs",
"Ploshchad",
"prefs",
"promisify",
"recaptcha",
"Rect",
"Rects",
"ruleset",
"spodermenpls",
"Spoofer",
"statechange",
"Strg",
"SVGAPI",
"Thorin",
"Tiie",
"unticking",
"Vortäuschaktion",
"Vortäuschgröße",
"Vortäuschrate",
"Waterfox",
"webgl",
"whitelisted",
"writeln",
@ -68,13 +71,14 @@
"**/vscode-extension/**",
"**/.git/objects/**",
".vscode",
".eslintrc.json"
".eslintrc.json",
".tools/chromeVendors.json"
],
"eslint.validate": [
"javascript",
"php",
"html"
],
"eslint.options": {"--ext": ".js,.html,.php"},
"eslint.lintTask.enable": true
"eslint.lintTask.enable": true,
"cSpell.enabled": true
}

2
.vscode/tasks.json vendored
View File

@ -154,6 +154,8 @@
"--ignore-files",
"versions",
"--ignore-files",
"crowdin.yml",
"--ignore-files",
"package*"
],
"presentation": {

View File

@ -4,7 +4,7 @@ CanvasBlocker [![codebeat badge](https://codebeat.co/badges/0edd6c9f-250a-4f1e-9
This add-on allows users to prevent websites from using some Javascript APIs to fingerprint them. Users can choose to block the APIs entirely on some or all websites (which may break some websites) or just block or fake its fingerprinting-friendly readout API.
**IMPORTANT**: you should only have ONE addon/setting set that protects an API. Otherwise you could face massive performance issues. (E.g. EclipsedMoon for Palemoon has 'canvas.poison' which is known to cause issues: https://github.com/kkapsner/CanvasBlocker/issues/253#issuecomment-459499290)
But setting privacy.resistFingerprinting to true is fine.
But setting privacy.resistFingerprinting to true and/or using the new fingerprinting protection introduced with Firefox 67 is fine.
-----
@ -15,6 +15,7 @@ Protected "fingerprinting" APIs:
* history
* window (disabled by default)
* DOMRect
* SVG
* TextMetrics
* navigator (disabled by default)
* screen

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
"description": ""
},
"addon_description": {
"message": "Verändert einige JS-APIs um Fingerprinting zu verhindern.",
"message": "Verändert einige JS-APIs, um Fingerprinting zu verhindern.",
"description": ""
},
"browserAction_title_default": {
@ -72,7 +72,7 @@
"description": ""
},
"options_title": {
"message": "CanvasBlocker Einstellungen",
"message": "CanvasBlocker-Einstellungen",
"description": ""
},
"optionsIntroduction": {
@ -95,10 +95,18 @@
"message": "Sie haben privacy.resistFingerprinting aktiviert. Dies verändert das Verhalten von CanvasBlocker ein wenig. Weitere Informationen finden Sie {link:hier:https://github.com/kkapsner/CanvasBlocker/issues/158} und {link:hier:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Sie haben dom.webAudio.enabled deaktiviert. Da sehr wenige das tun, macht Sie das mehr nachverfolgbar.",
"description": ""
},
"openInTab": {
"message": "In separatem Tab öffnen",
"description": ""
},
"labelForDefaultOption": {
"message": " (Standard)",
"description": ""
},
"group_general": {
"message": "Allgemein",
"description": ""
@ -108,7 +116,7 @@
"description": ""
},
"group_misc": {
"message": "Vermischtes",
"message": "Sonstiges",
"description": ""
},
"section_asking": {
@ -128,7 +136,7 @@
"description": ""
},
"section_misc": {
"message": "Vermischtes",
"message": "Sonstiges",
"description": ""
},
"section_settings": {
@ -155,6 +163,10 @@
"message": "DOMRect-API",
"description": ""
},
"section_SVG-api": {
"message": "SVG-API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics-API",
"description": ""
@ -299,6 +311,18 @@
"message": "Wollen Sie das Auslesen über die DOMRect-API erlauben?",
"description": ""
},
"askForSVGPermission": {
"message": "Wollen Sie die SVG-API erlauben?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Wollen Sie das Schreiben über die SVG-API erlauben?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Wollen Sie das Auslesen über die SVG-API erlauben?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Wollen Sie die TextMetrics-API erlauben?",
"description": ""
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "nichts (komplett weiß): es wird immer ein weißes Bild zurückgegeben. Hierbei sollte die Option \"Alpha-Kanal auch vortäuschen\" aktiviert werden. ACHTUNG: Nicht im Modus \"Bei Ausgabe vortäuschen\" verwenden.\n\nnicht persistent: die Zufallszahlen werden bei jeder Vortäuschaktion neu bestimmt.\n\nkonstant: innerhalb einer Webseite wird eine Farbe immer gleich verändert.\n\npersistent: für jede Domain werden die Zufallszahlen nur einmal bestimmt.",
"message": "nichts (komplett weiß): es wird immer ein weißes Bild zurückgegeben. Hierbei sollte die Option \"Alpha-Kanal auch vortäuschen\" aktiviert werden. ACHTUNG: Nicht im Modus \"Bei Ausgabe vortäuschen\" verwenden.\n\nnichtpersistent: die Zufallszahlen werden bei jeder Vortäuschaktion neu bestimmt. Beachten Sie, dass für viele APIs ein Zwischenspeicher verwendet wird, um eine Detektion zu verhindern.\n\nkonstant: Variante von nichtpersistent. Wenn die Daten eines Canvas verändert werden, haben gleichfarbige Pixel danach auch die gleiche Farbe.\n\npersistent: für jede Domain werden die Zufallszahlen nur einmal bestimmt.",
"description": ""
},
"rng_options.persistent": {
@ -496,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "nicht persistent",
"message": "nichtpersistent",
"description": ""
},
"rng_options.white": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"vendor\" verwendet. Leer lassen, um den Originalwert zu verwenden.",
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"vendor\" verwendet. Spezielle Werte:\nLeer lassen, um den Originalwert zu verwenden\n\n{undefined}: gibt undefined zurück (#508)\n\n{false}: gibt den Wahrheitsert falsch zurück (#508)\n\n{empty}: gibt eine leere Zeichenkette zurück(#508)\n\n{disabled}: gibt null zurück (#508)\n\n{random vendor}: gibt einen zufälligen \"vendor\" aus der eingebauten Liste zurück (#493)\n\n{random renderer}: gibt einen zufälligen \"renderer\" aus der eingebauten Liste zurück (#493)\n\n<xxx|yyy|zzz>: wählt zufällig eine der Optionen xxx, yyy oder zzz aus (beliebige Anzahl von Optionen) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"renderer\" verwendet. Leer lassen, um den Originalwert zu verwenden.",
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"renderer\" verwendet. Spezielle Werte:\nLeer lassen, um den Originalwert zu verwenden\n\n{undefined}: gibt undefined zurück (#508)\n\n{false}: gibt den Wahrheitsert falsch zurück (#508)\n\n{empty}: gibt eine leere Zeichenkette zurück(#508)\n\n{disabled}: gibt null zurück (#508)\n\n{random vendor}: gibt einen zufälligen \"vendor\" aus der eingebauten Liste zurück (#493)\n\n{random renderer}: gibt einen zufälligen \"renderer\" aus der eingebauten Liste zurück (#493)\n\n<xxx|yyy|zzz>: wählt zufällig eine der Optionen xxx, yyy oder zzz aus (beliebige Anzahl von Optionen) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"unmasked vendor\" verwendet. Leer lassen, um den Originalwert zu verwenden.",
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"unmasked vendor\" verwendet. Spezielle Werte:\nLeer lassen, um den Originalwert zu verwenden\n\n{undefined}: gibt undefined zurück (#508)\n\n{false}: gibt den Wahrheitsert falsch zurück (#508)\n\n{empty}: gibt eine leere Zeichenkette zurück(#508)\n\n{disabled}: gibt null zurück (#508)\n\n{random vendor}: gibt einen zufälligen \"vendor\" aus der eingebauten Liste zurück (#493)\n\n{random renderer}: gibt einen zufälligen \"renderer\" aus der eingebauten Liste zurück (#493)\n\n<xxx|yyy|zzz>: wählt zufällig eine der Optionen xxx, yyy oder zzz aus (beliebige Anzahl von Optionen) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"unmasked renderer\" verwendet. Leer lassen, um den Originalwert zu verwenden.",
"message": "Dieser Wert wird in der webGL-Funktion \"getParameter\" für \"unmasked renderer\" verwendet. Spezielle Werte:\nLeer lassen, um den Originalwert zu verwenden\n\n{undefined}: gibt undefined zurück (#508)\n\n{false}: gibt den Wahrheitsert falsch zurück (#508)\n\n{empty}: gibt eine leere Zeichenkette zurück(#508)\n\n{disabled}: gibt null zurück (#508)\n\n{random vendor}: gibt einen zufälligen \"vendor\" aus der eingebauten Liste zurück (#493)\n\n{random renderer}: gibt einen zufälligen \"renderer\" aus der eingebauten Liste zurück (#493)\n\n<xxx|yyy|zzz>: wählt zufällig eine der Optionen xxx, yyy oder zzz aus (beliebige Anzahl von Optionen) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "DOMRect-Auslese vorgetäuscht auf {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "SVG-Auslese vorgetäuscht auf {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "TextMetrics-Auslese vorgetäuscht auf {url}",
"description": ""
@ -1159,6 +1187,18 @@
"message": "Ein Bruchteil eines Pixels kann durch CSS kontrolliert werden. Eigenschaften eines DOMRect, die multipliziert mit diesem Faktor eine ganze Zahl ergeben, dürfen nicht verändert werden um eine Detektion zu verhindern.",
"description": ""
},
"protectSVG_title": {
"message": "SVG-API beschützen",
"description": ""
},
"protectSVG_description": {
"message": "Dies schützt vor Fingerprinting, das SVGs verwendet.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Um bestimmte Seiten von diesem Schutz auszuschließen, klicken Sie auf den schwarzen Pfeil um das Menü zu öffnen, fügen Sie die gewünschte Domain oder URL mit einem Klick auf \"+\" hinzu und entfernen Sie das zugehörige Häkchen.",
"description": ""
},
"protectTextMetrics_title": {
"message": "TextMetrics-API beschützen",
"description": ""
@ -1520,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "wechsle zu \"nicht persistent\"",
"message": "wechsle zu \"nichtpersistent\"",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -100,11 +100,20 @@
"message": "You have privacy.resistFingerprinting enabled. This slightly changes the behaviour of CanvasBlocker. See further information {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} and {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "You have dom.webAudio.enabled disabled. This makes you more trackable as very few people do this.",
"description": ""
},
"openInTab": {
"message": "Open in separate tab",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "General",
"description": ""
@ -162,6 +171,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -313,6 +326,18 @@
"message": "Do you want to allow DOMRect API readout?",
"description": ""
},
"askForSVGPermission": {
"message": "Do you want to allow the SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Do you want to allow SVG API input?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Do you want to allow the TextMetrics API?",
"description": ""
@ -354,7 +379,7 @@
"description": ""
},
"askOnlyOnce_description": {
"message": "When CanvasBlocker's block mode is set to 'ask permission' or 'ask permission for readout API', a confirm message will appear every time a page tries to access the API or readout API. This setting tries to display the confirm message only once for each page regardless of how many times the page tries to access the API. Nevertheless, multiple confirm messages may still be displayed on some pages.\n\nNo: asking every time\n\nIndividual: each API-type (context, input, readout) has to be confirmed separately\n\ncombined: all API-types get confirmed together",
"message": "When CanvasBlocker's block mode is set to 'ask permission' or 'ask permission for readout API', a confirm message will appear every time a page tries to access the API or readout API. This setting tries to display the confirm message only once for each page regardless of how many times the page tries to access the API. Nevertheless, multiple confirm messages may still be displayed on some pages.\n\nNo: asking every time\n\nIndividual: each API type (context, input, readout) has to be confirmed separately\n\nCombined: all API types get confirmed together",
"description": ""
},
"askOnlyOnce_options.no": {
@ -475,7 +500,7 @@
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -507,7 +532,7 @@
},
"rng_description": {
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnon persistent: the random numbers will be determined freshly for each faking action.\n\nconstant: within one web page a color will always be faked to the same color.\n\npersistent: the random number will only be determined once for every domain.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -519,7 +544,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -652,7 +677,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -660,7 +685,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -668,7 +693,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -676,7 +701,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
@ -751,6 +776,10 @@
"message": "Faked DOMRect readout on {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Faked TextMetrics readout on {url}",
"description": ""
@ -1208,6 +1237,19 @@
"description": ""
},
"protectSVG_title": {
"message": "Protect SVG API",
"description": ""
},
"protectSVG_description": {
"message": "This protects against fingerprinting using SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "To exclude specific websites from this protection, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Protect TextMetrics API",
"description": ""
@ -1584,7 +1626,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -24,11 +24,11 @@
"description": ""
},
"browserAction_status_on": {
"message": "CanvasBlocker on",
"message": "CanvasBlocker activado",
"description": ""
},
"browserAction_status_off": {
"message": "CanvasBlocker off",
"message": "CanvasBlocker desactivado",
"description": ""
},
"more": {
@ -80,7 +80,7 @@
"description": ""
},
"installNotice": {
"message": "Se ha instalado CanvasBlocker. Si quieres poder acceder a está página más adelante, añádela a los marcadores.",
"message": "Se ha instalado CanvasBlocker. Si quiere poder acceder a está página más adelante, añádala a los marcadores.",
"description": ""
},
"updateNotice": {
@ -95,16 +95,24 @@
"message": "Tienes habilitado privacy.resistFingerprinting. Esto cambia ligeramente el comportamiento de CanvasBlocker. Más información {link:aquí:https://github.com/kkapsner/CanvasBlocker/issues/158} y {link:aquí:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Tiene dom.webAudio.enabled desactivado. Esto le hace más rastreable ya que muy poca gente lo hace.",
"description": ""
},
"openInTab": {
"message": "Abrir en una pestaña separada",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "General",
"description": ""
},
"group_APIs": {
"message": "APIs",
"message": "API",
"description": ""
},
"group_misc": {
@ -155,6 +163,10 @@
"message": "API de DOMRect",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "API TextMetrics",
"description": ""
@ -216,39 +228,39 @@
"description": ""
},
"askForInvisiblePermission": {
"message": "¿Quieres permitir los <canvas> invisibles?",
"message": "¿Quiere permitir los <canvas> invisibles?",
"description": ""
},
"askForInvisibleInputPermission": {
"message": "¿Quieres permitir la entrada para los <canvas> invisibles?",
"message": "¿Quiere permitir la entrada para los <canvas> invisibles?",
"description": ""
},
"askForInvisibleReadoutPermission": {
"message": "¿Quieres permitir la lectura para los <canvas> invisibles?",
"message": "¿Quiere permitir la lectura para los <canvas> invisibles?",
"description": ""
},
"askForPermission": {
"message": "¿Quieres permitir los <canvas>?",
"message": "¿Quiere permitir los <canvas>?",
"description": ""
},
"askForInputPermission": {
"message": "¿Quieres permitir la entrada para los <canvas>?",
"message": "¿Quiere permitir la entrada para los <canvas>?",
"description": ""
},
"askForReadoutPermission": {
"message": "¿Quieres permitir la lectura para los <canvas>?",
"message": "¿Quiere permitir la lectura para los <canvas>?",
"description": ""
},
"askForVisiblePermission": {
"message": "¿Quieres permitir los <canvas> con borde rojo?",
"message": "¿Quiere permitir los <canvas> con borde rojo?",
"description": ""
},
"askForVisibleInputPermission": {
"message": "¿Quieres permitir la entrada para los <canvas> con borde rojo?",
"message": "¿Quiere permitir la entrada para los <canvas> con borde rojo?",
"description": ""
},
"askForVisibleReadoutPermission": {
"message": "¿Quieres permitir la lectura de para los <canvas> con borde rojo?",
"message": "¿Quiere permitir la lectura de para los <canvas> con borde rojo?",
"description": ""
},
"askForAudioPermission": {
@ -264,39 +276,51 @@
"description": ""
},
"askForHistoryPermission": {
"message": "¿Quieres permitir la API history?",
"message": "¿Quiere permitir la API de history?",
"description": ""
},
"askForHistoryInputPermission": {
"message": "¿Quieres permitir la entrada para la API history?",
"message": "¿Quiere permitir la entrada para la API de history?",
"description": ""
},
"askForHistoryReadoutPermission": {
"message": "¿Quieres permitir la lectura para la API history?",
"message": "¿Quiere permitir la lectura para la API de history?",
"description": ""
},
"askForWindowPermission": {
"message": "¿Quieres permitir la API window?",
"message": "¿Quiere permitir la API de window?",
"description": ""
},
"askForWindowInputPermission": {
"message": "¿Quieres permitir la entrada para la API window?",
"message": "¿Quiere permitir la entrada para la API de window?",
"description": ""
},
"askForWindowReadoutPermission": {
"message": "¿Quieres permitir la lectura para la API window?",
"message": "¿Quiere permitir la lectura para la API de window?",
"description": ""
},
"askForDOMRectPermission": {
"message": "¿Quieres permitir la API DOMRect?",
"message": "¿Quiere permitir la API de DOMRect?",
"description": ""
},
"askForDOMRectInputPermission": {
"message": "¿Quieres permitir la entrada para la API DOMRect?",
"message": "¿Quiere permitir la entrada para la API de DOMRect?",
"description": ""
},
"askForDOMRectReadoutPermission": {
"message": "¿Quieres permitir la lectura para la API DOMRect?",
"message": "¿Quiere permitir la lectura para la API de DOMRect?",
"description": ""
},
"askForSVGPermission": {
"message": "¿Quiere permitir la API SVG?",
"description": ""
},
"askForSVGInputPermission": {
"message": "¿Quieres permitir la entrada de la API SVG?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "¿Quieres permitir la lectura de la API SVG?",
"description": ""
},
"askForTextMetricsPermission": {
@ -304,35 +328,35 @@
"description": ""
},
"askForTextMetricsInputPermission": {
"message": "¿Quieres permitir la entrada de la API TextMetrics?",
"message": "¿Quiere permitir la entrada de la API de TextMetrics?",
"description": ""
},
"askForTextMetricsReadoutPermission": {
"message": "¿Quieres permitir la lectura de la API TextMetrics?",
"message": "¿Quiere permitir la lectura de la API de TextMetrics?",
"description": ""
},
"askForNavigatorPermission": {
"message": "¿Quieres permitir la API navigator?",
"message": "¿Quiere permitir la API de navigator?",
"description": ""
},
"askForNavigatorInputPermission": {
"message": "¿Quieres permitir la entrada para la API navigator?",
"message": "¿Quiere permitir la entrada para la API de navigator?",
"description": ""
},
"askForNavigatorReadoutPermission": {
"message": "¿Quieres permitir la lectura para la API navigator?",
"message": "¿Quiere permitir la lectura para la API de navigator?",
"description": ""
},
"askForScreenPermission": {
"message": "¿Quieres permitir la API screen?",
"message": "¿Quiere permitir la API de pantalla?",
"description": ""
},
"askForScreenInputPermission": {
"message": "¿Quieres permitir la entrada de la API screen?",
"message": "¿Quiere permitir la entrada de la API de pantalla?",
"description": ""
},
"askForScreenReadoutPermission": {
"message": "¿Quieres permitir la lectura de la API screen?",
"message": "¿Quiere permitir la lectura de la API de pantalla?",
"description": ""
},
"askOnlyOnce_title": {
@ -396,7 +420,7 @@
"description": ""
},
"blockMode_urlSpecific": {
"message": "Para establecer modos de bloqueo individuales para sitios específicos, haz clic en la flecha negra para abrir el menú, añade el dominio o URL haciendo clic en «+» y selecciona el modo de bloqueo deseado.",
"message": "Para establecer modos de bloqueo individuales para sitios específicos, haga clic en la flecha negra para abrir el menú, añada el dominio o URL haciendo clic en «+» y seleccione el modo de bloqueo deseado.",
"description": ""
},
"blockMode_options.allowEverything": {
@ -436,7 +460,7 @@
"description": ""
},
"protectedCanvasPart_urlSpecific": {
"message": "Para proteger partes concretas de sitios web específicos, haz clic en la flecha negra para abrir el menú, añade el dominio o URL haciendo clic en «+» y selecciona la parte deseada.",
"message": "Para proteger partes concretas de sitios web específicos, haga clic en la flecha negra para abrir el menú, añada el dominio o URL haciendo clic en «+» y seleccione la parte deseada.",
"description": ""
},
"protectedCanvasPart_options.nothing": {
@ -476,7 +500,7 @@
"description": ""
},
"maxFakeSize_description": {
"message": "Los «canvas» con un área mayor que este número no se falsean (ingresa un cero para deshabilitarlo). Es un parámetro de rendimiento que puede prevenir bloqueos del navegador y debe ajustarse a la potencia de cálculo del dispositivo.\nPRECAUCIÓN: esto reduce la seguridad del complemento, por lo que es muy recomendable no darle un valor menor que 1000000.",
"message": "Los «canvas» con un área mayor que este número no se falsean (introduzca un cero para deshabilitarlo). Es un parámetro de rendimiento que puede prevenir bloqueos del navegador y debe ajustarse a la potencia de cálculo del dispositivo.\nPRECAUCIÓN: esto reduce la seguridad del complemento, por lo que es muy recomendable no darle un valor menor que 1000000.",
"description": ""
},
"maxFakeSize_title": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "ninguno (totalmente blanco): se devuelve una imagen totalmente blanca. La opción «Falsear el canal alfa» debe activarse junto a esta. PRECAUCIÓN: no usar con el modo «falsear a la entrada».\nno persistente: los números aleatorios se vuelven a calcular para cada acción de falseado.\nconstante: en una página web, un color se falsea siempre por el mismo color.\npersistente: el número aleatorio solo se calcula una vez por cada dominio.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -584,11 +608,11 @@
"description": ""
},
"sharePersistentRndBetweenDomains_description": {
"message": "PRECAUCIÓN: este configuración hace al navegador 100 % rastreable, y por tanto, una amenaza para tu privacidad.",
"message": "PRECAUCIÓN: este ajuste hace al navegador 100% rastreable y es, por tanto, una amenaza para su privacidad.",
"description": ""
},
"sharePersistentRndBetweenDomains_confirmMessage": {
"message": "¿Seguro que quieres compartir la aleatoriedad persistente entre dominios?\nPRECAUCIÓN: esto hace al navegador 100 % rastreable, y por tanto, una amenaza para tu privacidad.",
"message": "¿Seguro que quiere compartir la aleatoriedad persistente entre dominios?\nPRECAUCIÓN: esto hace al nevegador 100% rastreable y es, por tanto, una amenaza para su privacidad.",
"description": ""
},
"ignoreFrequentColors_title": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Valor que debe ser reportado en la función webGL \"getParameter\" para el \"proveedor\". Dejar vacío para utilizar el valor original.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Valor que debe ser reportado en la función webGL \"getParameter\" para el \"renderizador\". Dejar vacío para utilizar el valor original.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Valor que debe ser reportado en la función webGL \"getParameter\" para el \"proveedor desenmascarado\". Dejar vacío para utilizar el valor original.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Valor que debe ser reportado en la función webGL \"getParameter\" para el \"renderizador desenmascarado\". Dejar vacío para utilizar el valor original.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Lectura de DOMRect falseada en {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Lectura SVG falseada en {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Lectura de TextMetrics falseada en {url}",
"description": ""
@ -812,7 +840,7 @@
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "¿Cuál es el tipo de lista blanca?",
"description": ""
},
"whitelistOnlyAPI": {
@ -848,7 +876,7 @@
"description": ""
},
"showNotifications_urlSpecific": {
"message": "Para deshabilitar las notificaciones para sitios web específicos, haz clic en la flecha negra para abrir el menú, añade el dominio o URL haciendo clic en «+» y desmarca la casilla.",
"message": "Para desactivar las notificaciones para sitios web específicos, haga clic en la flecha negra para abrir el menú, añada el dominio o URL haciendo clic en «+» y desmarque la casilla.",
"description": ""
},
"showNotifications_title": {
@ -1000,7 +1028,7 @@
"description": ""
},
"protectAudio_urlSpecific": {
"message": "Para excluir sitios web específicos de esta protección, haz clic en la flecha negra para abrir el menú, añade el dominio o URL haciendo clic en «+» y desmarca la casilla.",
"message": "Para excluir sitios web específicos de esta protección, haga clic en la flecha negra para abrir el menú, añada el dominio o URL haciendo clic en «+» y desmarque la casilla.",
"description": ""
},
"audioFakeRate_title": {
@ -1028,15 +1056,15 @@
"description": ""
},
"audioFakeRate_options.0.1%": {
"message": "0.1% de los valores",
"message": "0,1% de los valores",
"description": ""
},
"audioFakeRate_options.1%": {
"message": "1% de los valores",
"message": "1% de los valores",
"description": ""
},
"audioFakeRate_options.10%": {
"message": "10% de los valores",
"message": "10% de los valores",
"description": ""
},
"audioFakeRate_options.100%": {
@ -1108,7 +1136,7 @@
"description": ""
},
"historyLengthThreshold_urlSpecific": {
"message": "Para cambiar este valor para sitios web específicos, haz clic en la flecha negra para abrir el menú, añadir el dominio o URL haciendo clic en «+» y establecer un valor diferente.",
"message": "Para cambiar este valor para sítios web específicos, haga clic en la flecha negra para abrir el menú, añada el dominio o URL haciendo clic en «+» y ponga un valor distinto.",
"description": ""
},
"protectWindow_title": {
@ -1159,6 +1187,18 @@
"message": "Alguna fracción de un píxel puede ser controlada con CSS. Para prevenir la detección, los valores de un DOMRect que multiplicados por este factor sean números enteros no serán modificados.",
"description": ""
},
"protectSVG_title": {
"message": "Proteger API SVG",
"description": ""
},
"protectSVG_description": {
"message": "Esto protege contra la toma de huellas dactilares usando SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Para excluir sitios web específicos de esta protección, haga clic en la flecha negra para abrir el menú, añada el dominio o la URL haciendo clic en \"+\" y quite su marca de verificación.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Proteger la API TextMetrics",
"description": ""
@ -1276,7 +1316,7 @@
"description": ""
},
"theme_options.default": {
"message": "por defecto",
"message": "predeterminado",
"description": ""
},
"theme_options.light": {

View File

@ -95,10 +95,18 @@
"message": "Vous avez activé le paramètre Firefox privacy.resistFingerprinting. Ceci modifie légèrement le comportement de CanvasBlocker. Pour plus d'informations : {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} et {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Vous avez l'API Web Audio \"dom.webAudio.enabled\" désactivé. Cela vous rend plus facilement détectable car très peu de personnes le font.",
"description": ""
},
"openInTab": {
"message": "Ouvrir dans un onglet séparé",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Général",
"description": ""
@ -155,6 +163,10 @@
"message": "API DOMRect",
"description": ""
},
"section_SVG-api": {
"message": "API SVG",
"description": ""
},
"section_TextMetrics-api": {
"message": "API TextMetrics",
"description": ""
@ -212,7 +224,7 @@
"description": ""
},
"displayHiddenSettings_description": {
"message": "Activer pour afficher les paramètres cachés.",
"message": "Cocher pour afficher les paramètres cachés.",
"description": ""
},
"askForInvisiblePermission": {
@ -288,27 +300,39 @@
"description": ""
},
"askForDOMRectPermission": {
"message": "Donner des informations sur DOMRect ?",
"message": "Autoriser l'API DOMRect ?",
"description": ""
},
"askForDOMRectInputPermission": {
"message": "Autorisez-vous lécriture dans le DOMRect ?",
"message": "Autoriser l'entrée dans l'API DOMRect ?",
"description": ""
},
"askForDOMRectReadoutPermission": {
"message": "Do you want to allow DOMRect API readout?",
"message": "Autoriser la lecture de l'API DOMRect ?",
"description": ""
},
"askForSVGPermission": {
"message": "Voulez-vous autoriser l'API SVG ?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Voulez-vous autoriser l'entrée par l'API SVG ?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Voulez-vous autoriser la lecture par l'API SVG ?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Voulez-vous autoriser l'interface TextMetrics ?",
"message": "Autoriser l'API TextMetrics ?",
"description": ""
},
"askForTextMetricsInputPermission": {
"message": "Voulez-vous autoriser l'envoi de données par le biais de l'interface TextMetrics ?",
"message": "Autoriser l'entrée de données sur l'API TextMetrics ?",
"description": ""
},
"askForTextMetricsReadoutPermission": {
"message": "Voulez-vous autoriser la lecture de données par le biais de l'interface TextMetrics ?",
"message": "Autoriser la lecture de données sur l'API TextMetrics ?",
"description": ""
},
"askForNavigatorPermission": {
@ -428,31 +452,31 @@
"description": ""
},
"protectedCanvasPart_title": {
"message": "Partie protégée de l'API Canvas",
"message": "Fonctions protégées de l'API Canvas",
"description": ""
},
"protectedCanvasPart_description": {
"message": "Rien : aucune fonction de linterface Canvas n'est protégée. \nEntrée : les fonctions de sortie du Canvas sont protégées. Avec le mode \"feindre\", les pixels décrits sont légèrement modifiés lors de l'affichage du texte. Il est donc plus difficile de détecter le complément, mais il est moins sûr. Pour le WebGL, le comportement est identique à celui de \"lire\".\nToute : les fonctions de lecture et de saisie sont protégées. Il est recommandé de ne pas les utiliser avec le mode de blocage \"feindre\", car cela augmente la probabilité d'être détecté.",
"message": "rien : aucune fonction de lAPI Canvas n'est protégée.\nlecture : les fonctions de lecture de l'API Canvas sont protégées.\nentrée : les fonctions d'entrée de l'API Canvas sont protégées. Avec le mode de blocage \"feindre\", les pixels affichés sont légèrement modifiés lors de l'affichage de texte. Ce rend la détection du complément plus difficile mais ce mode est moins sûr. Avec des canvas WebGL, le comportement est identique à celui de \"Lecture\".\ntout : les fonctions de lecture et d'entrée sont protégées. Il n'est pas recommandé de l'utiliser avec le mode de blocage \"feindre\" car cela augmente la probabilité d'être détecté.",
"description": ""
},
"protectedCanvasPart_urlSpecific": {
"message": "Pour protéger individuellement des parties de pages Internet spécifiques, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL souhaité en cliquant sur \"+\" et sélectionnez la partie souhaitée.",
"message": "Pour protéger des parties de sites web spécifiques, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et sélectionnez la partie souhaitée.",
"description": ""
},
"protectedCanvasPart_options.nothing": {
"message": "Rien",
"message": "rien",
"description": ""
},
"protectedCanvasPart_options.input": {
"message": "Donnée saisie",
"message": "entrée",
"description": ""
},
"protectedCanvasPart_options.readout": {
"message": "Donnée à lire",
"message": "lecture",
"description": ""
},
"protectedCanvasPart_options.everything": {
"message": "Toutes",
"message": "tout",
"description": ""
},
"urlSettings_title": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "rien (entièrement blanc) : une image blanche est renvoyée. L'option \"Feindre le canal alpha\" doit aussi être activée avec cette option. ATTENTION : ne pas utiliser avec le mode \" Falsifier en entrée\".\nnon persistant : les nombres aléatoires seront regénérés à chaque action de falsification.\nconstant : dans une page web une couleur sera toujours falsifiée avec la même couleur.\npersistant : le nombre aléatoire sera généré une seule fois pour chaque domaine.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Valeur à renvoyer dans la fonction webGL \"getParameter\" pour le \"vendor\". Laissez vide pour utiliser la valeur d'origine.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Valeur à renvoyer dans la fonction webGL \"getParameter\" pour le \"renderer\". Laissez vide pour utiliser la valeur d'origine.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Valeur à renvoyer dans la fonction webGL \"getParameter\" pour le \"unmasked vendor\". Laissez vide pour utiliser la valeur d'origine.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Valeur à renvoyer dans la fonction webGL \"getParameter\" pour le \"unmasked renderer\". Laissez vide pour utiliser la valeur d'origine.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Lecture DOMRect falsifiée pour {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Lecture SVG truquée sur {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Lecture TextMetrics falsifiée pour {url}",
"description": ""
@ -1116,11 +1144,11 @@
"description": ""
},
"protectWindow_description": {
"message": "Window.opener et Window.name seront protégés, cela peut entrainer des difficultés sur certains sites Internet. Windows.name est le nom de votre onglet certains sites sen servent pour vous suivre. Window.opener sert à vous suivre quand vous cliquez sur des liens qui vont ouvrir un nouvel onglet ou fermez un onglet",
"message": "window.opener et window.name seront protégés. Cela peut entrainer des difficultés sur certains sites Internet. Windows.name est le nom de votre onglet. Certains sites sen servent pour vous suivre. Window.opener sert à vous suivre quand vous cliquez sur des liens qui vont ouvrir un nouvel onglet ou lorsque vous fermez un onglet.",
"description": ""
},
"protectWindow_urlSpecific": {
"message": "Pour exclure des sites Internet spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"protectWindow_askReCaptchaException": {
@ -1148,17 +1176,29 @@
"description": ""
},
"protectDOMRect_urlSpecific": {
"message": "Pour exclure des sites Internet spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"domRectIntegerFactor_title": {
"message": "Valeurs, données à échanger de DONrect",
"message": "Facteur entier pour DOMRect",
"description": ""
},
"domRectIntegerFactor_description": {
"message": "Une fraction de pixel (unité de mesure) peut être contrôlée par le CSS (code informatique pour organiser lhabillage dune page, son visuel). Pour éviter la détection, les valeurs d'un DOMRect qui seront multipliées par ce facteur sont des entiers, lobjet créer par le DOMrect ne sera pas lui modifié, mais ceux qui le pistent recevront de mauvaises valeurs",
"description": ""
},
"protectSVG_title": {
"message": "Protection de l'API SVG",
"description": ""
},
"protectSVG_description": {
"message": "Cela permet de se protéger contre la prise d'empreintes digitales à l'aide de SVG.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Pour exclure des sites web spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Protéger l'API TextMetrics",
"description": ""
@ -1168,7 +1208,7 @@
"description": ""
},
"protectTextMetrics_urlSpecific": {
"message": "Pour exclure des sites Web spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"protectNavigator_title": {
@ -1180,7 +1220,7 @@
"description": ""
},
"protectNavigator_urlSpecific": {
"message": "Pour exclure des sites Internet spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"openNavigatorSettings_title": {
@ -1236,7 +1276,7 @@
"description": ""
},
"protectScreen_urlSpecific": {
"message": "Pour exclure des sites web spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et enlevez sa coche",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"screenSize_title": {
@ -1260,7 +1300,7 @@
"description": ""
},
"fakeMinimalScreenSize_urlSpecific": {
"message": "Pour exclure des sites web spécifiques de la falsification, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et enlevez sa coche",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"theme_title": {
@ -1304,7 +1344,7 @@
"description": ""
},
"blockDataURLs_urlSpecific": {
"message": "Pour exclure des sites web spécifiques de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"message": "Pour exclure des sites web de cette protection, cliquez sur la flèche noire pour ouvrir le menu, ajoutez le domaine ou l'URL en cliquant sur \"+\" et supprimez sa coche.",
"description": ""
},
"showReleaseNotes_title": {
@ -1608,7 +1648,7 @@
"description": ""
},
"preset_stealth_description": {
"message": "Configurer lextension CanvasBlocker pour quelle ne soit pas elle-même détecter par les sites Internet, cela pourrait entraîner une utilisation élevée du processeur et ralentir le navigateur",
"message": "Configurer lextension CanvasBlocker pour quelle soit difficile à détecter. Ceci pourrait entraîner une utilisation élevée du processeur et ralentir le navigateur.",
"description": ""
},
"preset_max_protection_title": {

1670
_locales/hi/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -92,13 +92,21 @@
"description": ""
},
"resistFingerprintingNotice": {
"message": "Hai privacy.resistFingerprinting attivato. Ciò cambia leggermente il comportamento di CanvasBlocker. Vedi ulteriori informazioni {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} e {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"message": "Hai privacy.resistFingerprinting attivato. Ciò cambia leggermente il comportamento di CanvasBlocker. Vedi ulteriori informazioni {link:qui:https://github.com/kkapsner/CanvasBlocker/issues/158} e {link:qui:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Hai dom.webAudio.enabled disattivato. Ciò ti rende maggiormente tracciabile poiché in pochi lo fanno.",
"description": ""
},
"openInTab": {
"message": "Apri in una nuova scheda",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Generale",
"description": ""
@ -155,6 +163,10 @@
"message": "API DOMRect",
"description": ""
},
"section_SVG-api": {
"message": "API SVG",
"description": ""
},
"section_TextMetrics-api": {
"message": "API TextMetrics",
"description": ""
@ -164,7 +176,7 @@
"description": ""
},
"section_Screen-api": {
"message": "API schermo",
"message": "API Schermo",
"description": ""
},
"displayAdvancedSettings_title": {
@ -184,23 +196,23 @@
"description": ""
},
"disruptSessionOnUpdate_title": {
"message": "Disrupt session on update",
"message": "Interrompi la sessione quando si aggiorna",
"description": ""
},
"disruptSessionOnUpdate_description": {
"message": "If set to true the extension will update as soon as the update is available. This might break some tabs that are currently open.",
"message": "Se impostato su vero, l'estensione verrà aggiornata non appena l'aggiornamento sarà disponibile. Ciò potrebbe rovinare alcune schede che sono attualmente aperte.",
"description": ""
},
"reloadExtension_title": {
"message": "Reload extension",
"message": "Ricarica l'estensione",
"description": ""
},
"reloadExtension_description": {
"message": "Perform a pending update.",
"message": "Esegui un aggiornamento in sospeso.",
"description": ""
},
"reloadExtension_label": {
"message": "Reload",
"message": "Ricarica",
"description": ""
},
"hideSetting": {
@ -256,47 +268,59 @@
"description": ""
},
"askForAudioInputPermission": {
"message": "Do you want to allow audio API input?",
"message": "Vuoi consentire l'input di API audio?",
"description": ""
},
"askForAudioReadoutPermission": {
"message": "Do you want to allow audio API readout?",
"message": "Vuoi consentire la lettura di API audio?",
"description": ""
},
"askForHistoryPermission": {
"message": "Do you want to allow the history API?",
"message": "Vuoi consentire l'API cronologia?",
"description": ""
},
"askForHistoryInputPermission": {
"message": "Do you want to allow history API input?",
"message": "Vuoi consentire l'input di API cronologia?",
"description": ""
},
"askForHistoryReadoutPermission": {
"message": "Do you want to allow history API readout?",
"message": "Vuoi permettere la lettura dell'API cronologia?",
"description": ""
},
"askForWindowPermission": {
"message": "Do you want to allow the window API?",
"message": "Vuoi consentire l'API finestra?",
"description": ""
},
"askForWindowInputPermission": {
"message": "Do you want to allow window API input?",
"message": "Vuoi consentire l'input di API finestra?",
"description": ""
},
"askForWindowReadoutPermission": {
"message": "Do you want to allow window API readout?",
"message": "Vuoi consentire la lettura di API finestra?",
"description": ""
},
"askForDOMRectPermission": {
"message": "Do you want to allow the DOMRect API?",
"message": "Vuoi consentire l'API DOMRect?",
"description": ""
},
"askForDOMRectInputPermission": {
"message": "Do you want to allow DOMRect API input?",
"message": "Vuoi consentire l'input di API DOMRect?",
"description": ""
},
"askForDOMRectReadoutPermission": {
"message": "Do you want to allow DOMRect API readout?",
"message": "Vuoi consentire la lettura di API DOMRect?",
"description": ""
},
"askForSVGPermission": {
"message": "Vuoi consentire l'API SVG?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Vuoi consentire l'input di API SVG?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Vuoi consentire la lettura di API SVG?",
"description": ""
},
"askForTextMetricsPermission": {
@ -324,15 +348,15 @@
"description": ""
},
"askForScreenPermission": {
"message": "Do you want to allow the screen API?",
"message": "Vuoi consentire l'API schermo?",
"description": ""
},
"askForScreenInputPermission": {
"message": "Do you want to allow screen API input?",
"message": "Vuoi consentire l'input di API schermo?",
"description": ""
},
"askForScreenReadoutPermission": {
"message": "Do you want to allow screen API readout?",
"message": "Vuoi consentire la lettura di API schermo?",
"description": ""
},
"askOnlyOnce_title": {
@ -436,7 +460,7 @@
"description": ""
},
"protectedCanvasPart_urlSpecific": {
"message": "To protect individual parts for specific websites, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and select the desired part.",
"message": "Per proteggere singole parti per siti web specifici, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e seleziona la parte desiderata.",
"description": ""
},
"protectedCanvasPart_options.nothing": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "nessuno (completamente bianca): viene restituita un'immagine completamente bianca. L'opzione \"Falsifica il canale alpha\" dovrebbe essere attivata insieme a questa. ATTENZIONE: non usare questa insieme alla modalità \"falsifica all'input\".\nnon persistente: nuovi numeri casuali verranno determinati per ogni falsificazione.\ncostante: all'interno di una pagina web un colore sarà falsificato sempre con lo stesso colore.\npersistente: il numero casuale verrà determinato una sola volta per ogni dominio.",
"message": "nessuno (completamente bianca): viene restituita un'immagine completamente bianca. L'opzione \"Falsifica il canale alpha\" dovrebbe essere attivata insieme a questa. ATTENZIONE: non usare questa insieme alla modalità \"falsifica all'input\".\n\nnon persistente: nuovi numeri casuali verranno determinati per ogni falsificazione. Tieni presente che molte protezioni API sono dotate di cache per impedire il rilevamento. \n\ncostante: variante del non persistente, ma quando si modificano i dati dei canvas, anche i pixel dello stesso colore condividono successivamente lo stesso colore.\n\npersistente: il numero casuale verrà determinato una sola volta per ogni dominio.",
"description": ""
},
"rng_options.persistent": {
@ -616,35 +640,35 @@
"description": ""
},
"webGLVendor_title": {
"message": "Reported webGL vendor",
"message": "Vendor webGL segnalato",
"description": ""
},
"webGLVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Leave empty to use the original value.",
"message": "Valore da riportare nella funzione webGL \"getParameter\" per il \"vendor\". Valori speciali:\nLasciare vuoto per utilizzare il valore originale\n\n{undefined}: restituisce undefined (#508)\n\n{false}: restituisce il valore booleano false (#508)\n\n{empty}: restituisce una stringa vuota (#508)\n\n{disabled}: restituisce null (#508)\n\n{random vendor}: restituisce un vendor casuale dall'elenco incorporato (#493)\n\n{random renderer}: restituisce un renderer casuale dall'elenco incorporato (#493)\n\n<xxx|yyy|zzz>: sceglie casualmente una delle opzioni date xxx, yyy oo zzz (numero arbitrario di opzioni) (#493)",
"description": ""
},
"webGLRenderer_title": {
"message": "Reported webGL renderer",
"message": "Renderer webGL segnalato",
"description": ""
},
"webGLRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Leave empty to use the original value.",
"message": "Valore da riportare nella funzione webGL \"getParameter\" per il \"renderer\". Valori speciali:\nLasciare vuoto per utilizzare il valore originale\n\n{undefined}: restituisce undefined (#508)\n\n{false}: restituisce il valore booleano false (#508)\n\n{empty}: restituisce una stringa vuota (#508)\n\n{disabled}: restituisce null (#508)\n\n{random vendor}: restituisce un vendor casuale dall'elenco incorporato (#493)\n\n{random renderer}: restituisce un renderer casuale dall'elenco incorporato (#493)\n\n<xxx|yyy|zzz>: sceglie casualmente una delle opzioni date xxx, yyy oo zzz (numero arbitrario di opzioni) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
"message": "Reported webGL unmasked vendor",
"message": "Vendor webGL non mascherato segnalato",
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Leave empty to use the original value.",
"message": "Valore da riportare nella funzione webGL \"getParameter\" per il \"vendor non mascherato\". Valori speciali:\nLasciare vuoto per utilizzare il valore originale\n\n{undefined}: restituisce undefined (#508)\n\n{false}: restituisce il valore booleano false (#508)\n\n{empty}: restituisce una stringa vuota (#508)\n\n{disabled}: restituisce null (#508)\n\n{random vendor}: restituisce un vendor casuale dall'elenco incorporato (#493)\n\n{random renderer}: restituisce un renderer casuale dall'elenco incorporato (#493)\n\n<xxx|yyy|zzz>: sceglie casualmente una delle opzioni date xxx, yyy oo zzz (numero arbitrario di opzioni) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
"message": "Reported webGL unmasked renderer",
"message": "Renderer webGL non mascherato segnalato",
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Leave empty to use the original value.",
"message": "Valore da riportare nella funzione webGL \"getParameter\" per il \"renderer non mascherato\". Valori speciali:\nLasciare vuoto per utilizzare il valore originale\n\n{undefined}: restituisce undefined (#508)\n\n{false}: restituisce il valore booleano false (#508)\n\n{empty}: restituisce una stringa vuota (#508)\n\n{disabled}: restituisce null (#508)\n\n{random vendor}: restituisce un vendor casuale dall'elenco incorporato (#493)\n\n{random renderer}: restituisce un renderer casuale dall'elenco incorporato (#493)\n\n<xxx|yyy|zzz>: sceglie casualmente una delle opzioni date xxx, yyy oo zzz (numero arbitrario di opzioni) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -656,11 +680,11 @@
"description": ""
},
"protectedAPIFeatures_title": {
"message": "Protected API features",
"message": "Funzioni API protette",
"description": ""
},
"protectedAPIFeatures_description": {
"message": "List of protected API features. When unticking a checkbox, this feature of the API will not be protected.",
"message": "Elenco delle funzionalità API protette. Quando si deseleziona una casella, questa funzione dell'API non sarà protetta.",
"description": ""
},
"disableNotifications": {
@ -715,6 +739,10 @@
"message": "Lettura DOMRect falsificata su {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Lettura SVG falsificata su {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Lettura TextMetrics falsificata su {url}",
"description": ""
@ -736,15 +764,15 @@
"description": ""
},
"ignoreList_title": {
"message": "Elenco esclusi",
"message": "Lista esclusi",
"description": ""
},
"ignoredAPIs_title": {
"message": "Ignored APIs",
"message": "API Ignorate",
"description": ""
},
"ignoredAPIs_description": {
"message": "No notifications will be displayed for the selected APIs.",
"message": "Nessuna notifica verrà visualizzata per le API selezionate.",
"description": ""
},
"localFile": {
@ -760,27 +788,27 @@
"description": ""
},
"selectIgnore": {
"message": "Select domain or URL to add to ignore list:",
"message": "Seleziona il dominio o URL da aggiungere alla lista esclusi:",
"description": ""
},
"inputIgnore": {
"message": "Input domain or URL \"RegExp\" to add to ignore list:",
"message": "Inserisci il dominio o URL \"RegExp\" da aggiungere alla lista esclusi:",
"description": ""
},
"inputIgnoreDomain": {
"message": "Inserisci dominio da aggiungere all'elenco esclusi:",
"message": "Inserisci dominio da aggiungere alla lista esclusi:",
"description": ""
},
"inputIgnoreURL": {
"message": "Input URL \"RegExp\" to add to ignore list:",
"message": "Inserisci l'URL \"RegExp\" da aggiungere alla lista esclusi:",
"description": ""
},
"selectWhitelist": {
"message": "Select domain or URL to add to whitelist:",
"message": "Seleziona il dominio o URL da aggiungere alla lista bianca:",
"description": ""
},
"inputWhitelist": {
"message": "Input domain or URL \"RegExp\" to add to whitelist:",
"message": "Inserisci il dominio o URL \"RegExp\" da aggiungere alla lista bianca:",
"description": ""
},
"inputWhitelistDomain": {
@ -792,35 +820,35 @@
"description": ""
},
"selectSessionWhitelist": {
"message": "Select domain or URL to add to the session whitelist:",
"message": "Seleziona il dominio o URL da aggiungere alla lista bianca della sessione:",
"description": ""
},
"inputSessionWhitelist": {
"message": "Input domain or URL \"RegExp\" to add to the session whitelist:",
"message": "Inserisci il dominio o URL \"RegExp\" da aggiungere alla lista bianca della sessione:",
"description": ""
},
"inputSessionWhitelistDomain": {
"message": "Input domain to add to the session whitelist:",
"message": "Inserisci il dominio da aggiungere alla lista bianca della sessione:",
"description": ""
},
"inputSessionWhitelistURL": {
"message": "Input URL \"RegExp\" to add to the session whitelist:",
"message": "Inserisci l'URL \"RegExp\" da aggiungere alla lista bianca della sessione:",
"description": ""
},
"selectWhitelistScope": {
"message": "What is the scope of the whitelisting?",
"message": "Qual è l'ambito della lista bianca?",
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "Qual è il tipo della lista bianca?",
"description": ""
},
"whitelistOnlyAPI": {
"message": "Whitelist only the {api}",
"message": "Permetti solo l'{api}",
"description": ""
},
"whitelistAllAPIs": {
"message": "Whitelist all APIs",
"message": "Permetti tutte le API",
"description": ""
},
"settings": {
@ -960,23 +988,23 @@
"description": ""
},
"sessionWhiteList_title": {
"message": "Session whitelist",
"message": "Lista bianca della sessione",
"description": ""
},
"sessionWhiteList_description": {
"message": "Domains or URLs which shall be allowed to use all APIs during the current session. To add multiple entries, separate them by commas.",
"message": "Domini o URL che devono essere autorizzati ad utilizzare tutte le API durante la sessione attuale. Per aggiungere più voci, separale con virgole.",
"description": ""
},
"whitelistDomainTemporarily": {
"message": "whitelist domain temporarily",
"message": "permetti dominio temporaneamente",
"description": ""
},
"whitelistURLTemporarily": {
"message": "whitelist URL temporarily",
"message": "permetti URL temporaneamente",
"description": ""
},
"storeNotificationData_title": {
"message": "Store detail data of the notifications",
"message": "Memorizza i dati di dettaglio delle notifiche",
"description": ""
},
"storeNotificationData_description": {
@ -1000,11 +1028,11 @@
"description": ""
},
"protectAudio_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"audioFakeRate_title": {
"message": "Buffer fake rate",
"message": "Quantità di falsificazione del buffer",
"description": ""
},
"audioFakeRate_description": {
@ -1012,39 +1040,39 @@
"description": ""
},
"audioFakeRate_options.1": {
"message": "1 value",
"message": "1 valore",
"description": ""
},
"audioFakeRate_options.10": {
"message": "10 values",
"message": "10 valori",
"description": ""
},
"audioFakeRate_options.100": {
"message": "100 values",
"message": "100 valori",
"description": ""
},
"audioFakeRate_options.1000": {
"message": "1000 values",
"message": "1000 valori",
"description": ""
},
"audioFakeRate_options.0.1%": {
"message": "0.1% of the values",
"message": "0,1% dei valori",
"description": ""
},
"audioFakeRate_options.1%": {
"message": "1% of the values",
"message": "1% dei valori",
"description": ""
},
"audioFakeRate_options.10%": {
"message": "10% of the values",
"message": "10% dei valori",
"description": ""
},
"audioFakeRate_options.100%": {
"message": "100% of the values",
"message": "100% dei valori",
"description": ""
},
"audioNoiseLevel_title": {
"message": "Noise level",
"message": "Livello di rumore",
"description": ""
},
"audioNoiseLevel_description": {
@ -1052,39 +1080,39 @@
"description": ""
},
"audioNoiseLevel_options.minimal": {
"message": "minimal",
"message": "minimo",
"description": ""
},
"audioNoiseLevel_options.low": {
"message": "low",
"message": "basso",
"description": ""
},
"audioNoiseLevel_options.medium": {
"message": "medium",
"message": "medio",
"description": ""
},
"audioNoiseLevel_options.high": {
"message": "high",
"message": "alto",
"description": ""
},
"audioNoiseLevel_options.maximal": {
"message": "maximal",
"message": "massimo",
"description": ""
},
"useAudioCache_title": {
"message": "Use audio cache",
"message": "Usa cache audio",
"description": ""
},
"useAudioCache_description": {
"message": "Enables the audio cache. This can prevent detection but decreases the performance.",
"message": "Attiva la cache audio. Ciò può impedire il rilevamento ma peggiora le prestazioni.",
"description": ""
},
"useAudioCache_urlSpecific": {
"message": "Some pages use a very poorly written audio fingerprinting script which will cause Firefox to slow down. To disable the cache for specific websites, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"message": "Alcune pagine usano script di fingerprinting audio scritti molto male che provocano un rallentamento di Firefox. Per disattivare la cache per siti web specifici, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e rimuovi il segno di spunta.",
"description": ""
},
"audioUseFixedIndices_title": {
"message": "Use fixed indices",
"message": "Usa indici fissi",
"description": ""
},
"audioUseFixedIndices_description": {
@ -1092,7 +1120,7 @@
"description": ""
},
"audioFixedIndices_title": {
"message": "Fixed indices",
"message": "Indici fissi",
"description": ""
},
"audioFixedIndices_description": {
@ -1100,15 +1128,15 @@
"description": ""
},
"historyLengthThreshold_title": {
"message": "History length threshold",
"message": "Soglia lunghezza cronologia",
"description": ""
},
"historyLengthThreshold_description": {
"message": "Maximal length of the history that is reported to the website.",
"message": "Lunghezza massima della cronologia che viene riportata al sito web.",
"description": ""
},
"historyLengthThreshold_urlSpecific": {
"message": "To change this value for specific websites, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and set a different value.",
"message": "Per cambiare questo valore per siti web specifici, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e imposta un valore diverso.",
"description": ""
},
"protectWindow_title": {
@ -1120,23 +1148,23 @@
"description": ""
},
"protectWindow_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"protectWindow_askReCaptchaException": {
"message": "Protecting the window API breaks reCAPTCHA. Do you want to add an exception for it?",
"message": "La protezione dell'API finestra blocca reCAPTCHA. Vuoi consentire l'API window.name nelle pagine incorporate, in modo da farla funzionare di nuovo?",
"description": ""
},
"allowWindowNameInFrames_title": {
"message": "Allow window.name in frames",
"message": "Consenti window.name nei frame",
"description": ""
},
"allowWindowNameInFrames_description": {
"message": "The window.name API is not that dangerous in the context of embedded pages and it is used there for legitimate reasons (e.g. reCAPTCHA). This setting will allow these usages.",
"message": "L'API window.name non è così pericolosa nel contesto delle pagine incorporate ed è utilizzata lì per motivi legittimi (es. reCAPTCHA). Questa impostazione consentirà questi casi d'uso.",
"description": ""
},
"allowWindowNameInFrames_urlSpecific": {
"message": "To allow this only for specific websites, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and set its checkmark.",
"message": "Per consentirlo solo per siti web specifici, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e imposta il segno di spunta.",
"description": ""
},
"protectDOMRect_title": {
@ -1148,15 +1176,27 @@
"description": ""
},
"protectDOMRect_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"domRectIntegerFactor_title": {
"message": "DOMRect integer factor",
"message": "Fattore intero DOMRect",
"description": ""
},
"domRectIntegerFactor_description": {
"message": "Some fraction of a pixel can be controlled by CSS. To prevent detection, values of a DOMRect that multiplied with this factor are integers will not be altered.",
"message": "Alcune frazioni di un pixel possono essere controllate dal CSS. Per impedire il rilevamento, i valori di un DOMRect che moltiplicati con questo fattore sono interi non saranno modificati.",
"description": ""
},
"protectSVG_title": {
"message": "Proteggi API SVG",
"description": ""
},
"protectSVG_description": {
"message": "Ciò protegge dal fingerprinting per mezzo di SVG.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"protectTextMetrics_title": {
@ -1164,11 +1204,11 @@
"description": ""
},
"protectTextMetrics_description": {
"message": "Protegge contro le impronte digitali \"measureText()\" che possono essere utilizzate per incrociare i valori DOMRect.",
"message": "Ciò protegge dal fingerprinting di \"measureText()\" che può essere utilizzato per incrociare i valori DOMRect.",
"description": ""
},
"protectTextMetrics_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"protectNavigator_title": {
@ -1180,11 +1220,11 @@
"description": ""
},
"protectNavigator_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"openNavigatorSettings_title": {
"message": "Navigator settings",
"message": "Impostazioni navigatore",
"description": ""
},
"openNavigatorSettings_description": {
@ -1192,15 +1232,15 @@
"description": ""
},
"openNavigatorSettings_label": {
"message": "Open",
"message": "Apri",
"description": ""
},
"navigatorSettings_title": {
"message": "CanvasBlocker navigator settings",
"message": "Impostazioni navigatore di CanvasBlocker",
"description": ""
},
"navigatorSettings_description": {
"message": "On this page you can set the navigator settings. If using a preset you should always use an operating system and browser preset. After selecting these you can still make modifications.",
"message": "In questa pagina è possibile impostare le impostazioni del navigatore. Se usi una preimpostazione dovresti sempre utilizzare un sistema operativo e una preimpostazione del browser. Dopo aver selezionato queste si possono ancora fare modifiche.",
"description": ""
},
"navigatorSettings_disclaimer": {
@ -1208,7 +1248,7 @@
"description": ""
},
"navigatorSettings_contextualIdentities": {
"message": "Settings for the container {select} are shown.",
"message": "Le impostazioni per il contenitore {select} sono mostrate.",
"description": ""
},
"navigatorSettings_presetSection.os": {
@ -1220,11 +1260,11 @@
"description": ""
},
"navigatorSettings_values": {
"message": "Navigator values",
"message": "Valori del navigatore",
"description": ""
},
"navigatorSettings_reset": {
"message": "Reset",
"message": "Ripristina",
"description": ""
},
"protectScreen_title": {
@ -1232,11 +1272,11 @@
"description": ""
},
"protectScreen_description": {
"message": "Questo protegge dai tentativi di fingerprinting inclusi le dimensioni dello schermo.",
"message": "Ciò protegge dai tentativi di fingerprinting inclusi le dimensioni dello schermo.",
"description": ""
},
"protectScreen_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"screenSize_title": {
@ -1248,7 +1288,7 @@
"description": ""
},
"screenSize_urlSpecific": {
"message": "To provide specific sizes for certain websites, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and enter the desired value.",
"message": "Per fornire dimensioni specifiche per siti web specifici, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e inserisci il valore desiderato.",
"description": ""
},
"fakeMinimalScreenSize_title": {
@ -1260,7 +1300,7 @@
"description": ""
},
"fakeMinimalScreenSize_urlSpecific": {
"message": "To exclude specific websites from the faking, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"message": "Per escludere siti web specifici dalla falsificazione, clicca la freccia nera per aprire il menu, aggiungi il dominio o l'URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"theme_title": {
@ -1292,19 +1332,19 @@
"description": ""
},
"theme_options.none": {
"message": "none",
"message": "nessuno",
"description": ""
},
"blockDataURLs_title": {
"message": "Block data URL pages",
"message": "Blocca pagine Data URL",
"description": ""
},
"blockDataURLs_description": {
"message": "Data URL pages cannot be protected against fingerprinting (see https://bugzilla.mozilla.org/show_bug.cgi?id=1475831). Blocking them prevents the real fingerprint to reach any server.",
"message": "Le pagine Data URL non possono essere protette contro il fingerprinting (vedi https://bugzilla.mozilla.org/show_bug.cgi?id=1475831). Bloccarle impedisce al vero fingerprinting di raggiungere qualsiasi server.",
"description": ""
},
"blockDataURLs_urlSpecific": {
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimouvi la sua spunta.",
"message": "Per escludere siti specifici da questa protezione, clicca la freccia nera per aprire il menu, aggiungi il dominio o URL cliccando \"+\" e rimuovi la sua spunta.",
"description": ""
},
"showReleaseNotes_title": {
@ -1424,7 +1464,7 @@
"description": ""
},
"browserAction_test": {
"message": "Test",
"message": "Prova",
"description": ""
},
"browserAction_review": {
@ -1444,27 +1484,27 @@
"description": ""
},
"sanitation_nothingToComplain": {
"message": "Nothing to complain.",
"message": "Nulla da segnalare.",
"description": ""
},
"sanitation_ruleset.unnecessaryURLValue": {
"message": "Unnecessary URL values",
"message": "Valori URL non necessari",
"description": ""
},
"sanitation_ruleset.disabledFeatures": {
"message": "Disabled features",
"message": "Funzioni disattivate",
"description": ""
},
"sanitation_ruleset.blockMode": {
"message": "Block mode",
"message": "Modalità di blocco",
"description": ""
},
"sanitation_ruleset.thresholds": {
"message": "Thresholds",
"message": "Soglie",
"description": ""
},
"sanitation_ruleset.performance": {
"message": "Performance",
"message": "Prestazioni",
"description": ""
},
"sanitation_ruleset.privacy": {
@ -1476,59 +1516,59 @@
"description": ""
},
"sanitation_resolution.removeURLValue": {
"message": "remove URL value",
"message": "rimuovi valore URL",
"description": ""
},
"sanitation_error.disabledFeatures": {
"message": "All features of {api} are disabled but the protection is enabled.",
"message": "Tutte le funzionalità dell'{api} sono disattivate, ma la protezione è attiva.",
"description": ""
},
"sanitation_error.disabledSomeFeatures": {
"message": "Some features of {api} are disabled. This should only be done for testing or if you really know what the features are doing.",
"message": "Alcune funzionalità dell'{api} sono disattivate. Ciò dovrebbe essere fatto solo per test o se sai davvero cosa stanno facendo le funzionalità.",
"description": ""
},
"sanitation_resolution.disableMainFlag": {
"message": "disable main flag",
"message": "disattiva il flag principale",
"description": ""
},
"sanitation_resolution.enableFeatures": {
"message": "enable features",
"message": "attiva funzionalità",
"description": ""
},
"sanitation_error.badBlockMode": {
"message": "It is recommended to use the \"fake\" or \"ask\" blocking modes.",
"message": "Si consiglia di utilizzare le modalità di blocco \"falsifica\" o \"chiedi\".",
"description": ""
},
"sanitation_resolution.switchToFake": {
"message": "switch to \"fake\"",
"message": "passa a \"falsifica\"",
"description": ""
},
"sanitation_error.blockModeVsProtection": {
"message": "With blocking mode \"{blockMode}\" the {api} protection is not working.",
"message": "Con la modalità di blocco \"{blockMode}\" la protezione {api} non funziona.",
"description": ""
},
"sanitation_resolution.disableFlag": {
"message": "disable \"{flag}\"",
"message": "disattiva \"{flag}\"",
"description": ""
},
"sanitation_error.fakeInputWithWhiteRng": {
"message": "Do not use white random number generator with \"{blockMode}\" and protecting \"{protectedCanvasPart}\".",
"message": "Non usare il generatore di numeri casuali bianchi con \"{blockMode}\" e proteggendo \"{protectedCanvasPart}\".",
"description": ""
},
"sanitation_resolution.switchToProtectReadout": {
"message": "switch to protect readout",
"message": "passa a protezione lettura",
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "passa a \"non persistente\"",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {
"message": "Do not use protect \"{protectedCanvasPart}\" in blocking mode \"{blockMode}\".",
"message": "Non usare la protezione \"{protectedCanvasPart}\" in modalità blocco \"{blockMode}\".",
"description": ""
},
"sanitation_resolution.switchToProtectInput": {
"message": "switch to protect input",
"message": "passa a protezione input",
"description": ""
},
"sanitation_error.valueTooLow": {
@ -1540,23 +1580,23 @@
"description": ""
},
"sanitation_resolution.setTo": {
"message": "set to {value}",
"message": "imposta a {value}",
"description": ""
},
"sanitation_error.storeNotificationData": {
"message": "Storing notification data may lead to slow performance.",
"message": "La memorizzazione dei dati di notifica può portare a prestazioni lente.",
"description": ""
},
"sanitation_error.storeImage": {
"message": "Storing the image for inspection has a high RAM footprint.",
"message": "La memorizzazione dell'immagine per l'ispezione ha un'elevata impronta RAM.",
"description": ""
},
"sanitation_error.doNotSharePersistentRndBetweenDomains": {
"message": "Do not share persistent randomness between domains because this makes the browser 100% trackable.",
"message": "Non condividere la casualità persistente tra domini perché ciò rende il browser tracciabile al 100%.",
"description": ""
},
"sanitation_error.customScreenSize": {
"message": "Do not use a custom screen size as it makes the browser more trackable.",
"message": "Non utilizzare una dimensione personalizzata dello schermo in quanto rende il browser più tracciabile.",
"description": ""
},
"whitelist_inspection_title": {
@ -1564,11 +1604,11 @@
"description": ""
},
"whitelist_inspection_description": {
"message": "Shows which API protections are active for a given site. If you remove a checkmark for an API this API will be not protected for the selected site.",
"message": "Mostra quali protezioni API sono attive per un dato sito. Se rimuovi un segno di spunta per un'API, questa API non sarà protetta per il sito selezionato.",
"description": ""
},
"whitelist_all_apis": {
"message": "All APIs",
"message": "Tutte le API",
"description": ""
},
"presets": {
@ -1588,43 +1628,43 @@
"description": ""
},
"preset_default_title": {
"message": "Default settings",
"message": "Impostazioni predefinite",
"description": ""
},
"preset_default_description": {
"message": "No special settings are applied.",
"message": "Nessuna impostazione speciale applicata.",
"description": ""
},
"preset_convenience_title": {
"message": "Convenient settings",
"message": "Impostazioni convenienti",
"description": ""
},
"preset_convenience_description": {
"message": "Apply some settings to make the browsing experience as convenient as possible. This includes whitelisting some sites.",
"message": "Applica alcune impostazioni per rendere l'esperienza di navigazione il più conveniente possibile. Ciò include la scrittura di alcuni siti in lista bianca.",
"description": ""
},
"preset_stealth_title": {
"message": "Stealth settings",
"message": "Impostazioni furtive",
"description": ""
},
"preset_stealth_description": {
"message": "Configures CanvasBlocker to be hard to detect. This might lead to high CPU usage and might slow down the browser.",
"message": "Configura CanvasBlocker per essere difficile da rilevare. Ciò potrebbe portare ad un elevato utilizzo della CPU e rallentare il browser.",
"description": ""
},
"preset_max_protection_title": {
"message": "Maximum protection",
"message": "Protezione massima",
"description": ""
},
"preset_max_protection_description": {
"message": "Maximizes the protection against fingerprint extraction. These settings will break some pages, might slow down the browser a little bit and might enable sites to detect that CanvasBlocker is used. After applying this preset you should consider applying the reCAPTCHA preset as well.",
"message": "Massimizza la protezione contro l'estrazione di fingerprinting. Queste impostazioni rovineranno alcune pagine, potrebbero rallentare un po' il browser e consentire ai siti di rilevare che è usato CanvasBlocker. Dopo aver applicato questa preimpostazione si dovresti considerare di applicare anche la preimpostazione reCAPTCHA.",
"description": ""
},
"preset_recaptcha_title": {
"message": "reCAPTCHA exception",
"message": "Eccezione reCAPTCHA",
"description": ""
},
"preset_recaptcha_description": {
"message": "Protecting the window API breaks reCAPTCHA. This preset allows the usage of the window.name API in embedded pages which will make it work again.",
"message": "Proteggere l'API finestra rovina reCAPTCHA. Questa preimpostazione consente l'utilizzo dell'API window.name nelle pagine incorporate che lo farà di nuovo funzionare.",
"description": ""
}
}

1670
_locales/ja/messages.json Normal file

File diff suppressed because it is too large Load Diff

1670
_locales/ko/messages.json Normal file

File diff suppressed because it is too large Load Diff

1670
_locales/lt/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -95,10 +95,18 @@
"message": "Du har aktivert privacy.resistFingerprinting. Dette endrer oppførselen til CanvasBlocker litt. Se ytterligere informasjon\n{link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} and {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "You have dom.webAudio.enabled disabled. This makes you more trackable as very few people do this.",
"description": ""
},
"openInTab": {
"message": "Åpne i egen fane",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Generelt",
"description": ""
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -299,6 +311,18 @@
"message": "Do you want to allow DOMRect API readout?",
"description": ""
},
"askForSVGPermission": {
"message": "Do you want to allow the SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Do you want to allow SVG API input?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Do you want to allow the TextMetrics API?",
"description": ""
@ -456,7 +480,7 @@
"description": ""
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnon persistent: the random numbers will be determined freshly for each faking action.\n\nconstant: within one web page a color will always be faked to the same color.\n\npersistent: the random number will only be determined once for every domain.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -496,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Faked DOMRect readout on {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Faked TextMetrics readout on {url}",
"description": ""
@ -1159,6 +1187,18 @@
"message": "Some fraction of a pixel can be controlled by CSS. To prevent detection, values of a DOMRect that multiplied with this factor are integers will not be altered.",
"description": ""
},
"protectSVG_title": {
"message": "Protect SVG API",
"description": ""
},
"protectSVG_description": {
"message": "This protects against fingerprinting using SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "To exclude specific websites from this protection, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Protect TextMetrics API",
"description": ""
@ -1520,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -95,10 +95,18 @@
"message": "Włączono privacy.resistFingerprint. To nieznacznie zmienia zachowanie CanvasBlocker. Zobacz dalsze informacje {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} i {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Masz wyłączone dom.webAudio.enabled. Z tego powodu twoja aktywność jest łatwiejsza do namierzenia, bo nie wiele osób ma tę opcję włączoną.",
"description": ""
},
"openInTab": {
"message": "Otwórz w nowej karcie",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Ogólne",
"description": ""
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -299,6 +311,18 @@
"message": "Do you want to allow DOMRect API readout?",
"description": ""
},
"askForSVGPermission": {
"message": "Do you want to allow the SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Do you want to allow SVG API input?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Czy chcesz zezwolić na API TextMetrics?",
"description": ""
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnon persistent: the random numbers will be determined freshly for each faking action.\n\nconstant: within one web page a color will always be faked to the same color.\n\npersistent: the random number will only be determined once for every domain.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Wartość do podania w funkcji webGL \"getParameter\" dla \"vendor\". Pozostaw puste, aby użyć oryginalnej wartości.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Wartość do podania w funkcji webGL \"getParameter\" dla \"renderer\". Pozostaw puste, aby użyć wartości oryginalnej.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Wartość do podania w funkcji webGL \"getParameter\" dla \"unmasked vendor\". Pozostaw puste, aby użyć wartości oryginalnej.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Wartość do podania w funkcji webGL \"getParameter\" dla \"unmasked renderer\". Pozostaw puste, aby użyć oryginalnej wartości.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Fałszywy odczyt ROMRect na {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Fałszywy odczyt TextMetrics na {url}",
"description": ""
@ -1159,6 +1187,18 @@
"message": "Some fraction of a pixel can be controlled by CSS. To prevent detection, values of a DOMRect that multiplied with this factor are integers will not be altered.",
"description": ""
},
"protectSVG_title": {
"message": "Protect SVG API",
"description": ""
},
"protectSVG_description": {
"message": "This protects against fingerprinting using SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "To exclude specific websites from this protection, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Chroń TextMetrics API",
"description": ""
@ -1520,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -24,11 +24,11 @@
"description": ""
},
"browserAction_status_on": {
"message": "CanvasBlocker on",
"message": "CanvasBlocker ligado",
"description": ""
},
"browserAction_status_off": {
"message": "CanvasBlocker off",
"message": "CanvasBlocker desligado",
"description": ""
},
"more": {
@ -76,15 +76,15 @@
"description": ""
},
"optionsIntroduction": {
"message": "Nesta página você pode ajustar as configurações do CanvasBlocker.",
"message": "Nesta página pode ajustar as configurações do CanvasBlocker.",
"description": ""
},
"installNotice": {
"message": "CanvasBlocker foi instalado. Se quiser aceder esta página futuramente, por favor, adicione-a aos marcadores.",
"message": "CanvasBlocker foi instalado. Se quiser aceder esta página no futuro, por favor, adicione-a aos marcadores.",
"description": ""
},
"updateNotice": {
"message": "CanvasBlocker foi atualizado. Se quiser ser aceder esta página futuramente e ainda não a adicionou aos marcadores, por favor adicione-a.",
"message": "CanvasBlocker foi atualizado. Se quiser aceder a esta página no futuro e ainda não a adicionou aos marcadores, por favor adicione-a.",
"description": ""
},
"dontShowOptionsOnUpdate": {
@ -95,8 +95,16 @@
"message": "Você tem a privacy.resistFingerprinting ativada. Isso muda ligeiramente o comportamento do CanvasBlocker. Veja mais informações {link:aqui:https://github.com/kkapsner/CanvasBlocker/issues/158} e {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Tem o dom.webAudio.enabled desligado. Isto torna-o mais rastreável já que poucas pessoas o fazem.",
"description": ""
},
"openInTab": {
"message": "Abrir num noutro separador",
"message": "Abrir noutro separador",
"description": ""
},
"labelForDefaultOption": {
"message": " (padrão)",
"description": ""
},
"group_general": {
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -184,23 +196,23 @@
"description": ""
},
"disruptSessionOnUpdate_title": {
"message": "Disrupt session on update",
"message": "Interromper sessão ao atualizar",
"description": ""
},
"disruptSessionOnUpdate_description": {
"message": "If set to true the extension will update as soon as the update is available. This might break some tabs that are currently open.",
"message": "Se definido para verdadeiro, a extensão irá atualizar mal a atualização estiver disponível. Isto pode quebrar algumas janelas que estão abertas de momento.",
"description": ""
},
"reloadExtension_title": {
"message": "Reload extension",
"message": "Recarregar extensão",
"description": ""
},
"reloadExtension_description": {
"message": "Perform a pending update.",
"message": "Executar uma atualização pendente.",
"description": ""
},
"reloadExtension_label": {
"message": "Reload",
"message": "Recarregar",
"description": ""
},
"hideSetting": {
@ -299,6 +311,18 @@
"message": "Quer permitir leitura da API DOMRect?",
"description": ""
},
"askForSVGPermission": {
"message": "Quer permitir o SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Quer permitir a entrada da API de SVG?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Quer permitir a leitura da API de SVG?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Quer permitir a API de Métricas de Texto?",
"description": ""
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "nenhum (completamente branco): uma imagem completamente branca é retornada. A opção \"Fake the alpha channel\" deve ser ativada com isso. CUIDADO: Não use isso com o modo \"falso na entrada\".\n\nnão persistente: os números aleatórios serão determinados recentemente para cada ação de falsificação.\n\nconstante: em uma página da Web, uma cor sempre será falsificada para a mesma cor.\n\npersistente: o número aleatório será determinado apenas uma vez para cada domínio.",
"message": "nenhum (completamente branco): uma imagem completamente branca é devolvida. A opção “Falsifique o canal alfa” deve ser ativada com isso. CUIDADO: Não use isso com o modo \"falsificar na entrada\".\n\nnão persistente: os números aleatórios serão determinados no momento para cada ação de falsificação. Lembre-se de que muitas proteções de API possuem caches para evitar detecção.\n\nconstante: variação de não persistente. Mas ao alterar os dados do ecrã, os pixels da mesma cor também compartilham a mesma cor posteriormente.\n\npersistente: o número aleatório será determinado apenas uma vez para cada domínio.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"fornecedor\". Deixe em branco para usar o valor original.",
"message": "Valor a ser informado na função webGL \"getParameter\" para o \"fornecedor\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: devolve indefinido (#508)\n\n{false}: devolve o valor booleano falso (#508)\n\n{empty}: devolve uma string vazia (#508)\n\n{disabled}: devolve nulo (#508)\n\n{random vendor}: devolve um fornecedor aleatório da lista interna (#493)\n\n{random renderer}: devolve um renderizador aleatório da lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções fornecidas xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"renderer\". Deixe em branco para usar o valor original.",
"message": "Valor a ser informado na função webGL \"getParameter\" para o \"renderer\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: devolve indefinido (#508)\n\n{false}: devolve o valor booleano falso (#508)\n\n{empty}: devolve uma string vazia (#508)\n\n{disabled}: devolve nulo (#508)\n\n{random vendor}: devolve um fornecedor aleatório da lista interna (#493)\n\n{random renderer}: devolve um renderizador aleatório da lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções fornecidas xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"fornecedor não-mascarado\". Deixe em branco para usar o valor original.",
"message": "Valor a ser informado na função webGL \"getParameter\" para o \"fornecedor desmascarado\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: devolve indefinido (#508)\n\n{false}: devolve o valor booleano falso (#508)\n\n{empty}: devolve uma string vazia (#508)\n\n{disabled}: devolve nulo (#508)\n\n{random vendor}: devolve um fornecedor aleatório da lista interna (#493)\n\n{random renderer}: devolve um renderizador aleatório da lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções fornecidas xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"renderizador desmascarado\". Deixe em branco para usar o valor original.",
"message": "Valor a ser informado na função webGL \"getParameter\" para o \"renderizador desmascarado\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: devolve indefinido (#508)\n\n{false}: devolve o valor booleano falso (#508)\n\n{empty}: devolve uma string vazia (#508)\n\n{disabled}: devolve nulo (#508)\n\n{random vendor}: devolve um fornecedor aleatório da lista interna (#493)\n\n{random renderer}: devolve um renderizador aleatório da lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções fornecidas xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Leitura de DOMRect falsificada em {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Leitura falsa de SVG em {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Leitor de Textos embutido em {url}",
"description": ""
@ -812,7 +840,7 @@
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "Qual é o tipo de lista branca?",
"description": ""
},
"whitelistOnlyAPI": {
@ -1159,6 +1187,18 @@
"message": "Alguma fração de pixel pode ser controlada pelo CSS. Para prevenir a detecção, valores de um DOMRect que se multiplica com esse fator são inteiros não serão alterados.",
"description": ""
},
"protectSVG_title": {
"message": "Proteger a API de SVG",
"description": ""
},
"protectSVG_description": {
"message": "Isso protege contra o fingerprinting usando SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Para excluir sites específicos desta proteção, clique na seta preta para abrir o menu, adicione o domínio ou URL clicando em \"+\" e remova sua caixa de seleção.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Proteger TextMetrics API",
"description": ""
@ -1564,7 +1604,7 @@
"description": ""
},
"whitelist_inspection_description": {
"message": "Shows which API protections are active for a given site. If you remove a checkmark for an API this API will be not protected for the selected site.",
"message": "Mostra que proteções de API estão ativas para um determinado site. Se remover uma marca de seleção para uma API, esta API não será protegida para o site selecionado.",
"description": ""
},
"whitelist_all_apis": {

View File

@ -4,7 +4,7 @@
"description": ""
},
"addon_description": {
"message": "Altera alguns APIs JS para impedir o fingerprinting.",
"message": "Altera algumas APIs JS para impedir impressões digitais.",
"description": ""
},
"browserAction_title_default": {
@ -24,11 +24,11 @@
"description": ""
},
"browserAction_status_on": {
"message": "CanvasBlocker on",
"message": "CanvasBlocker ligado",
"description": ""
},
"browserAction_status_off": {
"message": "CanvasBlocker off",
"message": "CanvasBlocker desligado",
"description": ""
},
"more": {
@ -84,21 +84,29 @@
"description": ""
},
"updateNotice": {
"message": "CanvasBlocker foi atualizado. Se você quiser ser acessar esta página futuramente e ainda não a favoritou, por favor favorite-a.",
"message": "CanvasBlocker foi atualizado. Se você quiser poder acessar esta página futuramente e ainda não a favoritou, por favor favorite-a.",
"description": ""
},
"dontShowOptionsOnUpdate": {
"message": "Não mostrar novamente após a atualização.",
"message": "Não mostrar novamente após atualizações.",
"description": ""
},
"resistFingerprintingNotice": {
"message": "Você tem a privacy.resistFingerprinting ativada. Isso muda ligeiramente o comportamento do CanvasBlocker. Veja mais informações {link:aqui:https://github.com/kkapsner/CanvasBlocker/issues/158} e {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"message": "Você tem privacy.resistFingerprinting ativado. Isso muda ligeiramente o comportamento do CanvasBlocker. Veja mais informações {link:aqui:https://github.com/kkapsner/CanvasBlocker/issues/158} e {link:aqui:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "Você tem dom.webAudio.enabled desativado. Isso lhe torna mais rastreável já que muito poucas pessoas fazem isso.",
"description": ""
},
"openInTab": {
"message": "Abrir numa aba separada",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Geral",
"description": ""
@ -152,11 +160,15 @@
"description": ""
},
"section_DOMRect-api": {
"message": "DOMRect API",
"message": "API DOMRect",
"description": ""
},
"section_SVG-api": {
"message": "API SVG",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"message": "API TextMetrics",
"description": ""
},
"section_Navigator-api": {
@ -168,7 +180,7 @@
"description": ""
},
"displayAdvancedSettings_title": {
"message": "Modo Expert",
"message": "Modo especialista",
"description": ""
},
"displayAdvancedSettings_description": {
@ -184,27 +196,27 @@
"description": ""
},
"disruptSessionOnUpdate_title": {
"message": "Disrupt session on update",
"message": "Interromper sessão ao atualizar",
"description": ""
},
"disruptSessionOnUpdate_description": {
"message": "If set to true the extension will update as soon as the update is available. This might break some tabs that are currently open.",
"message": "Se definido como verdadeiro, a extensão será atualizada assim que a atualização estiver disponível. Isso pode quebrar algumas abas que podem estar abertas.",
"description": ""
},
"reloadExtension_title": {
"message": "Reload extension",
"message": "Recarregar extensão",
"description": ""
},
"reloadExtension_description": {
"message": "Perform a pending update.",
"message": "Performar uma atualização pendente.",
"description": ""
},
"reloadExtension_label": {
"message": "Reload",
"message": "Recarregar",
"description": ""
},
"hideSetting": {
"message": "Clique aqui para ocultar a configuração.",
"message": "Clique aqui para ocultar esta configuração.",
"description": ""
},
"displayHiddenSettings_title": {
@ -224,7 +236,7 @@
"description": ""
},
"askForInvisibleReadoutPermission": {
"message": "Você quer permitir leitura <canvas> invisível?",
"message": "Você quer permitir leitura invisível de <canvas>?",
"description": ""
},
"askForPermission": {
@ -236,7 +248,7 @@
"description": ""
},
"askForReadoutPermission": {
"message": "Deseja permitir a leitura do <canvas>?",
"message": "Deseja permitir a leitura de <canvas>?",
"description": ""
},
"askForVisiblePermission": {
@ -244,11 +256,11 @@
"description": ""
},
"askForVisibleInputPermission": {
"message": "Deseja permitir entrada nas <canvas> com borda vermelha?",
"message": "Deseja permitir a entrada do <canvas> com borda vermelha?",
"description": ""
},
"askForVisibleReadoutPermission": {
"message": "Deseja permitir a leitura das <canvas> com borda vermelha?",
"message": "Deseja permitir a leitura do <canvas> com borda vermelha?",
"description": ""
},
"askForAudioPermission": {
@ -268,51 +280,63 @@
"description": ""
},
"askForHistoryInputPermission": {
"message": "Deseja permitir a entrada do histórico da API?",
"message": "Deseja permitir a entrada da API de histórico?",
"description": ""
},
"askForHistoryReadoutPermission": {
"message": "Deseja permitir leitura do histórico da API?",
"message": "Deseja permitir a leitura da API de histórico?",
"description": ""
},
"askForWindowPermission": {
"message": "Você deseja permitir a API da janela?",
"message": "Deseja permitir a API de janela?",
"description": ""
},
"askForWindowInputPermission": {
"message": "Você deseja permitir a entrada da API da janela?",
"message": "Deseja permitir a entrada da API de janela?",
"description": ""
},
"askForWindowReadoutPermission": {
"message": "Deseja permitir a leitura da API da janela?",
"message": "Deseja permitir a leitura da API de janela?",
"description": ""
},
"askForDOMRectPermission": {
"message": "Você deseja permitir a API DOMRect?",
"message": "Deseja permitir a API DOMRect?",
"description": ""
},
"askForDOMRectInputPermission": {
"message": "Você deseja permitir a entrada da API DOMRect?",
"message": "Deseja permitir a entrada da API DOMRect?",
"description": ""
},
"askForDOMRectReadoutPermission": {
"message": "Deseja permitir leitura da API DOMRect?",
"message": "Deseja permitir a leitura da API DOMRect?",
"description": ""
},
"askForSVGPermission": {
"message": "Deseja permitir a API SVG?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Deseja permitir a entrada da API SVG?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Deseja permitir a leitura da API SVG?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Deseja permitir a API de Métricas de Texto?",
"message": "Deseja permitir a API TextMetrics?",
"description": ""
},
"askForTextMetricsInputPermission": {
"message": "Deseja permitir a entrada da API de Métricas de Texto?",
"message": "Deseja permitir a entrada da API TextMetrics?",
"description": ""
},
"askForTextMetricsReadoutPermission": {
"message": "Deseja permitir leitura da API de Métricas de Texto?",
"message": "Deseja permitir leitura da API TextMetrics?",
"description": ""
},
"askForNavigatorPermission": {
"message": "Deseja permitir a API de navegador?",
"message": "Deseja permitir a API do navegador?",
"description": ""
},
"askForNavigatorInputPermission": {
@ -320,7 +344,7 @@
"description": ""
},
"askForNavigatorReadoutPermission": {
"message": "Deseja permitir leitura da API do navegador?",
"message": "Deseja permitir a leitura da API do navegador?",
"description": ""
},
"askForScreenPermission": {
@ -332,7 +356,7 @@
"description": ""
},
"askForScreenReadoutPermission": {
"message": "Deseja permitir leitura da API de tela?",
"message": "Deseja permitir a leitura da API de tela?",
"description": ""
},
"askOnlyOnce_title": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "nenhum (completamente branco): uma imagem completamente branca é retornada. A opção \"Fake the alpha channel\" deve ser ativada com isso. CUIDADO: Não use isso com o modo \"falso na entrada\".\n\nnão persistente: os números aleatórios serão determinados recentemente para cada ação de falsificação.\n\nconstante: em uma página da Web, uma cor sempre será falsificada para a mesma cor.\n\npersistente: o número aleatório será determinado apenas uma vez para cada domínio.",
"message": "nenhum (completamente em branco): uma imagem completamente branca é retornada. A opção \"Falsifique o canal alfa\" deve ser ativada juntamente a isso. CUIDADO: Não use isso com o modo \"falsificado na entrada\".\n\nnão persistente: os números aleatórios serão determinados em cada ação de falsificação. Tenha em mente que várias proteções de API têm caches para previnir detecções.\n\nconstante: variação do \"não persistente\". Porém, quando alterando os dados do canvas, pixels de uma mesma cor terão a mesma cor na imagem seguinte.\n\npersistente: os números aleatórios serão determinados apenas uma vez para cada domínio.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"fornecedor\". Deixe em branco para usar o valor original.",
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"vendor\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: retorna indefinido (undefined) (#508)\n\n{false}: retorna o valor booleano falso (#508)\n\n{empty}: retorna uma string vazia (#508)\n\n{disabled}: retorna nulo (null) (#508)\n\n{random vendor}: retorna um vendor aleatório de uma lista interna (#493)\n\n{random renderer}: retorna um renderizador aleatório de uma lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"renderer\". Deixe em branco para usar o valor original.",
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"renderer\". Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: retorna indefinido (undefined) (#508)\n\n{false}: retorna o valor booleano falso (#508)\n\n{empty}: retorna uma string vazia (#508)\n\n{disabled}: retorna nulo (null) (#508)\n\n{random vendor}: retorna um vendor aleatório de uma lista interna (#493)\n\n{random renderer}: retorna um renderizador aleatório de uma lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"fornecedor não-mascarado\". Deixe em branco para usar o valor original.",
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"unmasked vendor\" (vendor sem máscara). Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: retorna indefinido (undefined) (#508)\n\n{false}: retorna o valor booleano falso (#508)\n\n{empty}: retorna uma string vazia (#508)\n\n{disabled}: retorna nulo (null) (#508)\n\n{random vendor}: retorna um vendor aleatório de uma lista interna (#493)\n\n{random renderer}: retorna um renderizador aleatório de uma lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"renderizador desmascarado\". Deixe em branco para usar o valor original.",
"message": "Valor a ser reportado na função webGL \"getParameter\" para o \"unmasked renderer\" (renderer sem máscara). Valores especiais:\nDeixe em branco para usar o valor original\n\n{undefined}: retorna indefinido (undefined) (#508)\n\n{false}: retorna o valor booleano falso (#508)\n\n{empty}: retorna uma string vazia (#508)\n\n{disabled}: retorna nulo (null) (#508)\n\n{random vendor}: retorna um vendor aleatório de uma lista interna (#493)\n\n{random renderer}: retorna um renderizador aleatório de uma lista interna (#493)\n\n<xxx|yyy|zzz>: escolhe uma das opções xxx, yyy ou zzz aleatoriamente (número arbitrário de opções) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Leitura de DOMRect falsificada em {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Leitura de SVG falsificada em {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Leitor de Textos embutido em {url}",
"description": ""
@ -812,7 +840,7 @@
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "Qual é o tipo da lista branca?",
"description": ""
},
"whitelistOnlyAPI": {
@ -1159,6 +1187,18 @@
"message": "Alguma fração de pixel pode ser controlada pelo CSS. Para prevenir a detecção, valores de um DOMRect que se multiplica com esse fator são inteiros não serão alterados.",
"description": ""
},
"protectSVG_title": {
"message": "Proteger API de SVG",
"description": ""
},
"protectSVG_description": {
"message": "Protege contra fingerprinting usando SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Para excluir sites específicos desta proteção, clique na seta preta para abrir o menu, adicione o domínio ou URL clicando em \"+\" e remova sua seleção.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Proteger TextMetrics API",
"description": ""
@ -1564,7 +1604,7 @@
"description": ""
},
"whitelist_inspection_description": {
"message": "Shows which API protections are active for a given site. If you remove a checkmark for an API this API will be not protected for the selected site.",
"message": "Mostra quais proteções de API estão ativas para um dado site. Se remover a marca de uma API, ela não será protegida no site selecionado.",
"description": ""
},
"whitelist_all_apis": {

View File

@ -95,10 +95,18 @@
"message": "Настройка privacy.resistFingerprinting включена. Это немного влияет на работу CanvasBlocker. Подробнее см. {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} и {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}.",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "You have dom.webAudio.enabled disabled. This makes you more trackable as very few people do this.",
"description": ""
},
"openInTab": {
"message": "Открыть в отдельной вкладке",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Основные",
"description": ""
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -299,6 +311,18 @@
"message": "Вы хотите разрешить DOMRect API readout(считывание)?",
"description": ""
},
"askForSVGPermission": {
"message": "Разрешить SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Вы хотите разрешить SVG API input(ввод)?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Разрешить SVG API readout(считывание)?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Вы хотите разрешить TextMetrics API?",
"description": ""
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "отсутствут (полностью белый): возвращается полностью белое изображение. При этом должна быть активирована опция \"подделать альфа-канал\". ВНИМАНИЕ: не используйте это с режимом \"подделать для input(ввод)\".\n\nне постоянный: случайные числа будут определяться по-новому для каждого действия фальсификации.\n\nконстантный: в пределах одной веб-страницы цвет всегда будет подделываться под один и тот же.\n\nпостоянный: случайное число будет определено только один раз для каждого домена.",
"message": "нет (белый цвет): возвращается полностью белое изображение. Должна быть включена опция \"подделывать альфа-канал\". ВНИМАНИЕ: Не используйте вместе с режимом \"подделка ввода(input)\".\n\nнепостоянный: для каждой подделки случайные числа будут генерироваться заново. Имейте ввиду, что большинство функций защиты API хранят кэш для предотвращения обнаружения.\n\nконстантный: вариация непостоянного. Только при изменении данных в <canvas> сохраняется цвет изменённых пикселей и доступен в дальнейшем.\n\nпостоянный: для каждого домена случайное число генерируется единожды.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Сообщать это значение для \"vendor\" в функции \"getParameter\". Если пусто, сообщать реальное значение.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Сообщать это значение для \"renderer\" в функции \"getParameter\". Если пусто, сообщать реальное значение.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Сообщать это значение для \"unmasked vendor\" в функции \"getParameter\". Если пусто, сообщать реальное значение.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Сообщать это значение для \"unmasked renderer\" в функции \"getParameter\". Если пусто, сообщать реальное значение.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Подделан DOMRect readout(чтение) на {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Подделан SVG readout(чтение) на {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Фальшивое считывание TextMetrics на {url}",
"description": ""
@ -1144,7 +1172,7 @@
"description": ""
},
"protectDOMRect_description": {
"message": "Это защищает от снятия отпечатков \"getClientRects()\" и нескольких подобных методов.",
"message": "Защищает от снятия отпечатка \"getClientRects()\" и нескольких подобных методов.",
"description": ""
},
"protectDOMRect_urlSpecific": {
@ -1159,12 +1187,24 @@
"message": "С помощью CSS можно управлять некоторой частью пикселя. Чтобы предотвратить обнаружение, значения DOMRect, которые умножаются на этот коэффициент, целые числа не будут изменены.",
"description": ""
},
"protectSVG_title": {
"message": "Защищать SVG API",
"description": ""
},
"protectSVG_description": {
"message": "Защищает от снятия отпечатка через SVG.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "Чтобы отключить защиту для конкретных сайтов, нажмите на чёрную стрелку открытия меню, добавьте домен или URL нажатием на \"+\" и снимите с него флажок.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Защита API TextMetrics",
"description": ""
},
"protectTextMetrics_description": {
"message": "Это защищает от считывания отпечатка \"measureText()\", который может быть использован для перекрестной проверки значений DOMRect.",
"message": "Защищает от снятия отпечатка \"measureText()\", который может быть использован для перекрестной проверки значений DOMRect.",
"description": ""
},
"protectTextMetrics_urlSpecific": {
@ -1232,7 +1272,7 @@
"description": ""
},
"protectScreen_description": {
"message": "Это защищает от попыток снятия цифровых отпечатков, включая размер экрана.",
"message": "Защищает от попыток снятия отпечатка на основе таких характеристик, как размер экрана.",
"description": ""
},
"protectScreen_urlSpecific": {

View File

@ -95,10 +95,18 @@
"message": "您启用了 privacy.resistFingerprinting这明显改变了 CanvasBlocker 的行为。更多信息请参阅 {link:https://github.com/kkapsner/CanvasBlocker/issues/158} 和 {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}。",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "您禁用了 dom.webAudio这使您更容易被追踪因为很少人这样做。",
"description": ""
},
"openInTab": {
"message": "在新标签页中打开",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "一般",
"description": ""
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -299,6 +311,18 @@
"message": "是否允许 window API 读取?",
"description": ""
},
"askForSVGPermission": {
"message": "是否允许SVG API",
"description": ""
},
"askForSVGInputPermission": {
"message": "是否允许 SVG API 输入?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "是否允许 SVG API 读取?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "是否允许 TextMetrics API",
"description": ""
@ -432,7 +456,7 @@
"description": ""
},
"protectedCanvasPart_description": {
"message": "无保护:不保护任何 Canvas API。\n读保护:保护 Canvas API 当中的读取功能。\n写保护:保护 Canvas API 当中的输入功能。当拦截模式为”伪造“时,展示文本时绘制的像素会有轻微调整。这使得 CanvasBlocker 更难被检测但是同时降低安全性。WebGL 当中读写等效。\n全保护:同时保护 Canvas API 当中的读取与输入功能。由于会增加被检测到的概率,因此不建议与”伪造“模式同时使用。",
"message": "无保护:不保护任何 Canvas API。\n读取:保护 Canvas API 当中的读取功能。\n输入:保护 Canvas API 当中的输入功能。当拦截模式为”伪造“时,展示文本时绘制的像素会有轻微调整。这使得 CanvasBlocker 更难被检测但是同时降低安全性。WebGL 中读写等效。\n全部:同时保护 Canvas API 当中的读取与输入功能。由于会增加被检测到的概率,因此不建议与”伪造“模式同时使用。",
"description": ""
},
"protectedCanvasPart_urlSpecific": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "无(全白):返回一个完全是白色的图像。使用此选项时,也应激活“伪造 alpha 通道”选项。注意:使用“输入时伪造”模式时不应使用此选项。\n非持久化每个伪造行为都确定新的随机数。\n不变同一个网页中一个颜色总被伪造成另一个相同的颜色。\n持久化对每个域名只确定一次随机数。",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -580,7 +604,7 @@
"description": ""
},
"sharePersistentRndBetweenDomains_title": {
"message": "在域名间享持久的随机性",
"message": "在域名间享持久的随机性",
"description": ""
},
"sharePersistentRndBetweenDomains_description": {
@ -588,7 +612,7 @@
"description": ""
},
"sharePersistentRndBetweenDomains_confirmMessage": {
"message": "您确定要在域名间享持久的随机性?\n注意这个设置会使浏览器 100% 会被追踪,并因此威胁你的隐私。",
"message": "您确定要在域名间享持久的随机性?\n注意这个设置会使浏览器 100% 会被追踪,并因此威胁你的隐私。",
"description": ""
},
"ignoreFrequentColors_title": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "在 WebGL 函数 getParameter 当中报告的渲染器的值。留空即为原始值。",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "在 WebGL 函数 getParameter 当中报告的渲染器的值。留空即为原始值。",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "在 WebGL 函数 getParameter 当中报告的渲染器的值。留空即为原始值。",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "在 WebGL 函数 getParameter 当中报告的渲染器的值。留空即为原始值。",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -652,7 +676,7 @@
"description": ""
},
"useCanvasCache_description": {
"message": "启用 Canvas 缓存。这可以防检测并在小画布Canvas被多次读取时增加性能,但对于大画布则降低性能。",
"message": "启用 Canvas 缓存。这可以检测并在小画布Canvas被多次读取时提高性能,但对于大画布则降低性能。",
"description": ""
},
"protectedAPIFeatures_title": {
@ -715,6 +739,10 @@
"message": "{url} 上的 DOMRect 读数已伪造",
"description": ""
},
"fakedSVGReadout": {
"message": "已伪造 {url} 上的 SVG 读取",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "{url} 上的 TextMetrics 读数已伪造",
"description": ""
@ -728,7 +756,7 @@
"description": ""
},
"fakedInput": {
"message": "{url} 上的输入已伪造",
"message": "已伪造 {url} 上的 canvas 输入",
"description": ""
},
"ignoreList_description": {
@ -812,7 +840,7 @@
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "白名单的类型是什么?",
"description": ""
},
"whitelistOnlyAPI": {
@ -988,7 +1016,7 @@
"description": ""
},
"storeImageForInspection_description": {
"message": "启用已伪造画布内容的存储。\n注意这可能消耗大量内存",
"message": "启用存储已伪造画布内容。\n注意这可能消耗大量内存",
"description": ""
},
"protectAudio_title": {
@ -1159,6 +1187,18 @@
"message": "像素的有些部分可以被 CSS 控制。为阻止检测,用这一整数系数增值的 DOMRect 的值将不被改变。",
"description": ""
},
"protectSVG_title": {
"message": "保护 SVG API",
"description": ""
},
"protectSVG_description": {
"message": "这阻止使用SVG生成指纹。",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "如需排除特定网站,请点击黑箭头,然后单击 + 添加域名或 URL 并取消勾选。",
"description": ""
},
"protectTextMetrics_title": {
"message": "保护 TextMetrics API",
"description": ""
@ -1564,7 +1604,7 @@
"description": ""
},
"whitelist_inspection_description": {
"message": "Shows which API protections are active for a given site. If you remove a checkmark for an API this API will be not protected for the selected site.",
"message": "显示指定站点的 API 保护情况。 如果您取消一个 API 的勾选,此 API 将不会对选定的站点进行保护。",
"description": ""
},
"whitelist_all_apis": {

View File

@ -95,10 +95,18 @@
"message": "您啟用了privacy.resistFingerprinting設定。此設定會謏改 CanvasBlocker的行為。詳情参閱 {link:here:https://github.com/kkapsner/CanvasBlocker/issues/158} 和 {link:here:https://github.com/ghacksuserjs/ghacks-user.js/issues/767}。",
"description": ""
},
"settingsNotice.dom.webAudio.enabled": {
"message": "You have dom.webAudio.enabled disabled. This makes you more trackable as very few people do this.",
"description": ""
},
"openInTab": {
"message": "在新的隱身標籤頁中打開",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "一般設定",
"description": ""
@ -155,6 +163,10 @@
"message": "DOMRect API",
"description": ""
},
"section_SVG-api": {
"message": "SVG API",
"description": ""
},
"section_TextMetrics-api": {
"message": "TextMetrics API",
"description": ""
@ -299,6 +311,18 @@
"message": "你想允許DOMRectAPI的讀出嗎?",
"description": ""
},
"askForSVGPermission": {
"message": "Do you want to allow the SVG API?",
"description": ""
},
"askForSVGInputPermission": {
"message": "Do you want to allow SVG API input?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "你想允許TextMetricsAPI嗎?",
"description": ""
@ -340,7 +364,7 @@
"description": ""
},
"askOnlyOnce_description": {
"message": "When CanvasBlocker's block mode is set to 'ask permission' or 'ask permission for readout API', a confirm message will appear every time a page tries to access the API or readout API. This setting tries to display the confirm message only once for each page regardless of how many times the page tries to access the API. Nevertheless, multiple confirm messages may still be displayed on some pages.\n\nNo: asking every time\n\nIndividual: each API-type (context, input, readout) has to be confirmed separately\n\ncombined: all API-types get confirmed together",
"message": "When CanvasBlocker's block mode is set to 'ask permission' or 'ask permission for readout API', a confirm message will appear every time a page tries to access the API or readout API. This setting tries to display the confirm message only once for each page regardless of how many times the page tries to access the API. Nevertheless, multiple confirm messages may still be displayed on some pages.\n\nNo: asking every time\n\nIndividual: each API type (context, input, readout) has to be confirmed separately\n\nCombined: all API types get confirmed together",
"description": ""
},
"askOnlyOnce_options.no": {
@ -484,7 +508,7 @@
"description": ""
},
"rng_description": {
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnon persistent: the random numbers will be determined freshly for each faking action.\n\nconstant: within one web page a color will always be faked to the same color.\n\npersistent: the random number will only be determined once for every domain.",
"message": "none (completely white): a completely white image is returned. The option \"Fake the alpha channel\" should be activated with this. CAUTION: Do not use this with the \"fake at input\" mode.\n\nnonpersistent: the random numbers will be determined freshly for each faking action. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of nonpersistent. But when altering canvas data same colored pixels also share the same color afterwards.\n\npersistent: the random number will only be determined once for every domain.",
"description": ""
},
"rng_options.persistent": {
@ -620,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLRenderer_title": {
@ -628,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
@ -636,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked vendor\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
@ -644,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Leave empty to use the original value.",
"message": "Value to be reported in the webGL function \"getParameter\" for the \"unmasked renderer\". Special values:\nLeave empty to use the original value\n\n{undefined}: returns undefined (#508)\n\n{false}: returns the boolean value false (#508)\n\n{empty}: returns an empty string (#508)\n\n{disabled}: returns null (#508)\n\n{random vendor}: returns a random vendor from the built-in list (#493)\n\n{random renderer}: returns a random renderer from the built-in list (#493)\n\n<xxx|yyy|zzz>: picks one of the given options xxx, yyy or zzz at random (arbitrary number of options) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -715,6 +739,10 @@
"message": "Faked DOMRect readout on {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Faked TextMetrics readout on {url}",
"description": ""
@ -1159,6 +1187,18 @@
"message": "Some fraction of a pixel can be controlled by CSS. To prevent detection, values of a DOMRect that multiplied with this factor are integers will not be altered.",
"description": ""
},
"protectSVG_title": {
"message": "Protect SVG API",
"description": ""
},
"protectSVG_description": {
"message": "This protects against fingerprinting using SVGs.",
"description": ""
},
"protectSVG_urlSpecific": {
"message": "To exclude specific websites from this protection, click on the black arrow to open the menu, add the domain or URL by clicking on \"+\" and remove its checkmark.",
"description": ""
},
"protectTextMetrics_title": {
"message": "Protect TextMetrics API",
"description": ""
@ -1520,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -12,6 +12,7 @@
<div id="reload" class="hidden"></div>
</div>
<div id="actions" class="stackedInputs"></div>
<div id="version" class="versionDisplay"></div>
<script src="../lib/require.js"></script>
<script src="../lib/logging.js"></script>
<script src="../lib/extension.js"></script>

View File

@ -13,7 +13,7 @@
logging.message("Opened browser action");
browser.tabs.query({active: true}).then(async function([currentTab]){
browser.tabs.query({active: true, currentWindow: true}).then(async function([currentTab]){
function isWhitelisted(url){
if (!(url instanceof URL)){
url = new URL(url);
@ -25,7 +25,7 @@
const currentURL = new URL(currentTab.url);
const reloadButton = document.getElementById("reload");
reloadButton.addEventListener("click", async function(){
await browser.tabs.reload(currentTab.id);
await browser.tabs.reload(currentTab.id, {bypassCache: true});
window.close();
});
const addonStatus = document.getElementById("addonStatus");
@ -36,6 +36,9 @@
if (settings.get("blockMode").startsWith("allow")){
settings.set("blockMode", "fake", currentURL.host);
}
if (settings.get("blockDataURLs")){
settingContainers.resetUrlValue("blockDataURLs", currentURL);
}
const entries = lists.get("white").filter(e => e.match(currentURL)).map(e => e.value);
await Promise.all([
lists.removeFrom("white", entries),
@ -44,6 +47,9 @@
}
else {
settings.set("blockMode", "allowEverything", currentURL.hostname);
if (settings.get("blockDataURLs")){
settings.set("blockDataURLs", false, currentURL.hostname);
}
}
update();
});
@ -63,43 +69,48 @@
const actionDefinitions = [
{
label: "settings",
icon: browser.extension.getURL("icons/pageAction-showOptions.svg"),
icon: extension.getURL("icons/pageAction-showOptions.svg"),
action: function(){
if (browser.runtime && browser.runtime.openOptionsPage){
browser.runtime.openOptionsPage();
}
else {
window.open(browser.extension.getURL("options/options.html"), "_blank");
browser.tabs.create({url: extension.getURL("options/options.html")});
}
window.close();
}
},
{
label: "faq",
icon: browser.extension.getURL("icons/browserAction-faq.svg"),
icon: extension.getURL("icons/browserAction-faq.svg"),
action: function(){
window.open("https://canvasblocker.kkapsner.de/faq/", "_blank");
browser.tabs.create({url: "https://canvasblocker.kkapsner.de/faq/"});
window.close();
}
},
{
label: "test",
advanced: true,
icon: browser.extension.getURL("icons/browserAction-test.svg"),
icon: extension.getURL("icons/browserAction-test.svg"),
action: function(){
window.open("https://canvasblocker.kkapsner.de/test", "_blank");
browser.tabs.create({url: "https://canvasblocker.kkapsner.de/test"});
window.close();
}
},
{
label: "review",
icon: browser.extension.getURL("icons/browserAction-review.svg"),
icon: extension.getURL("icons/browserAction-review.svg"),
action: function(){
window.open("https://addons.mozilla.org/firefox/addon/canvasblocker/reviews/", "_blank");
browser.tabs.create({url: "https://addons.mozilla.org/firefox/addon/canvasblocker/reviews/"});
window.close();
}
},
{
label: "reportIssue",
icon: browser.extension.getURL("icons/browserAction-reportIssue.svg"),
icon: extension.getURL("icons/browserAction-reportIssue.svg"),
action: function(){
window.open("https://github.com/kkapsner/CanvasBlocker/issues", "_blank");
browser.tabs.create({url: "https://github.com/kkapsner/CanvasBlocker/issues"});
window.close();
}
},
];
@ -144,13 +155,17 @@
search.addEventListener("keypress", function(event){
if ([10, 13].indexOf(event.keyCode) !== -1){
window.open(browser.extension.getURL(
browser.tabs.create({url: extension.getURL(
"options/options.html" +
"?search=" +
encodeURIComponent(this.value)
));
)});
window.close();
}
});
});
window.addEventListener("load", async function(){
extension.displayVersion("version", 250);
});
}());

View File

@ -88,7 +88,8 @@
audio: _("askForAudioPermission"),
history: _("askForHistoryPermission"),
window: _("askForWindowPermission"),
domRect: _("askForDOMRectPermission")
domRect: _("askForDOMRectPermission"),
svg: _("askForSVGPermission"),
},
askStatus: {
alreadyAsked: {},
@ -103,7 +104,8 @@
audio: _("askForAudioInputPermission"),
history: _("askForHistoryInputPermission"),
window: _("askForWindowInputPermission"),
domRect: _("askForDOMRectInputPermission")
domRect: _("askForDOMRectInputPermission"),
svg: _("askForSVGInputPermission"),
},
askStatus: {
alreadyAsked: {},
@ -118,7 +120,8 @@
audio: _("askForAudioReadoutPermission"),
history: _("askForHistoryReadoutPermission"),
window: _("askForWindowReadoutPermission"),
domRect: _("askForDOMRectReadoutPermission")
domRect: _("askForDOMRectReadoutPermission"),
svg: _("askForSVGReadoutPermission"),
},
askStatus: {
alreadyAsked: {},

View File

@ -52,7 +52,7 @@
logging.message("check url %s for block mode %s", url, blockMode);
switch (url.protocol){
case "about:":
if (url.href === "about:blank"){
if (url.pathname === "blank"){
logging.message("use regular mode on about:blank");
break;
}

View File

@ -47,7 +47,10 @@
scope.init = function(){
function listener(details){
const headers = details.responseHeaders;
if (settings.get("blockDataURLs", new URL(details.url))){
if (
details.statusCode !== 304 &&
settings.get("blockDataURLs", new URL(details.url))
){
const cspMatch = (blockBlob? "": "blob: ") + "filesystem: *";
logging.verbose("Adding CSP header to", details);
setHeader(headers, {

View File

@ -72,7 +72,11 @@
return container;
};
scope.extensionID = browserAvailable? browser.extension.getURL(""): "extensionID";
scope.getURL = function getURL(str){
return browser.runtime.getURL(str);
};
scope.extensionID = browserAvailable? scope.getURL(""): "extensionID";
scope.inIncognitoContext = browserAvailable? browser.extension.inIncognitoContext: false;
@ -137,38 +141,109 @@
};
const proxies = new Map();
const changedToStrings = new WeakMap();
scope.createProxyFunction = function createProxyFunction(window, original, replacement){
if (!changedToStrings.get(window)){
changedToStrings.set(window, true);
const functionPrototype = scope.getWrapped(window).Function.prototype;
const toString = functionPrototype.toString;
scope.changeProperty(window, "toString", {
object: functionPrototype,
name: "toString",
type: "value",
changed: scope.createProxyFunction(
window,
toString,
function(){
return proxies.get(this) || toString.call(this);
}
)
});
const changedWindowsForProxies = new WeakMap();
function setupWindowForProxies(window){
if (changedWindowsForProxies.get(window)){
return;
}
const handler = scope.getWrapped(window).Object.create(null);
handler.apply = scope.exportFunctionWithName(function(_target, thisArgs, args){
const wrappedWindow = scope.getWrapped(window);
const functionPrototype = wrappedWindow.Function.prototype;
const originalToString = functionPrototype.toString;
changedWindowsForProxies.set(window, originalToString);
const alteredToString = scope.createProxyFunction(
window,
originalToString,
function toString(){
if (proxies.has(this)){
return proxies.get(this).string;
}
return originalToString.call(scope.getWrapped(this));
}
);
scope.changeProperty(window, "toString", {
object: functionPrototype,
name: "toString",
type: "value",
changed: alteredToString
});
const wrappedReflect = wrappedWindow.Reflect;
const originalReflectSetPrototypeOf = wrappedReflect.setPrototypeOf;
const alteredReflectSetPrototypeOf = scope.exportFunctionWithName(
function setPrototypeOf(target, prototype){
target = scope.getWrapped(target);
if (proxies.has(target)){
target = proxies.get(target).wrappedOriginal;
}
if (proxies.has(prototype)){
prototype = proxies.get(prototype).wrappedOriginal;
}
if (prototype){
const grandPrototype = wrappedReflect.getPrototypeOf(prototype);
if (proxies.has(grandPrototype)){
const testPrototype = wrappedWindow.Object.create(proxies.get(grandPrototype).wrappedOriginal);
const value = originalReflectSetPrototypeOf.call(wrappedReflect, target, testPrototype);
if (!value){
return false;
}
}
}
const value = originalReflectSetPrototypeOf.call(wrappedReflect, target, scope.getWrapped(prototype));
return value;
}, window, "setPrototypeOf"
);
scope.changeProperty(window, "toString", {
object: wrappedWindow.Reflect,
name: "setPrototypeOf",
type: "value",
changed: alteredReflectSetPrototypeOf
});
}
scope.createProxyFunction = function createProxyFunction(window, original, replacement){
setupWindowForProxies(window);
const wrappedObject = scope.getWrapped(window).Object;
const handler = wrappedObject.create(null);
handler.apply = scope.exportFunctionWithName(function(target, thisArg, args){
try {
return args.length?
replacement.call(thisArgs, ...args):
replacement.call(thisArgs);
replacement.call(thisArg, ...args):
replacement.call(thisArg);
}
catch (error){
return original.apply(thisArgs, args);
try {
return original.apply(thisArg, args);
}
catch (error){
return scope.getWrapped(target).apply(thisArg, args);
}
}
}, window, "");
handler.setPrototypeOf = scope.exportFunctionWithName(function(target, prototype){
target = scope.getWrapped(target);
if (proxies.has(target)){
target = proxies.get(target).wrappedOriginal;
}
if (proxies.has(prototype)){
prototype = proxies.get(prototype).wrappedOriginal;
}
if (prototype){
const grandPrototype = wrappedObject.getPrototypeOf(prototype);
if (proxies.has(grandPrototype)){
const testPrototype = wrappedObject.create(proxies.get(grandPrototype).wrappedOriginal);
wrappedObject.setPrototypeOf(target, testPrototype);
}
}
return wrappedObject.setPrototypeOf(target, scope.getWrapped(prototype));
}, window, "");
const proxy = new window.Proxy(original, handler);
proxies.set(proxy, original.toString());
const proxyData = {
original: original,
wrappedOriginal: scope.getWrapped(original),
string: changedWindowsForProxies.get(window).call(original),
};
proxies.set(proxy, proxyData);
proxies.set(scope.getWrapped(proxy), proxyData);
return scope.getWrapped(proxy);
};
@ -226,5 +301,30 @@
}
};
scope.displayVersion = async function displayVersion(node, displayRefresh = false){
if ("string" === typeof node){
node = document.getElementById(node);
}
if (!node){
throw "display node not found";
}
fetch(scope.getURL("manifest.json")).then(function(response){
return response.json();
}).then(function(manifest){
node.textContent = "Version " + manifest.version;
return manifest.version;
}).catch(function(error){
node.textContent = "Unable to get version: " + error;
});
if (displayRefresh){
// Workaround to hide the scroll bars
window.setTimeout(function(){
node.style.display = "none";
node.style.display = "";
}, displayRefresh);
}
};
Object.seal(scope);
}());

View File

@ -15,6 +15,7 @@
}
const settings = require("./settings");
const logging = require("./logging");
function getDomainRegExpList(domainList){
@ -28,12 +29,24 @@
})
.map(function(entry){
let regExp;
const domain = !!entry.match(/^[A-Za-z0-9_.-]+$/);
const domain = !!entry.match(/^[A-Za-z0-9_.*-]+$/);
if (domain){
regExp = new RegExp("(?:^|\\.)" + entry.replace(/([\\+*?[^\]$(){}=!|.])/g, "\\$1") + "\\.?$", "i");
regExp = new RegExp(
"(?:^|\\.)" + entry.replace(/([\\+?[^\]$(){}=!|.])/g, "\\$1").replace(/\*/g, ".+") + "\\.?$",
"i"
);
}
else {
regExp = new RegExp(entry, "i");
try {
regExp = new RegExp(entry, "i");
}
catch (error){
logging.error("Error in regular expression", entry, error);
regExp = new RegExp(
"(?:^|\\.)" + entry.replace(/([\\+*?[^\]$(){}=!|.])/g, "\\$1") + "\\.?$",
"i"
);
}
}
return {
value: entry,

View File

@ -10,6 +10,7 @@
const persistentRndStorage = require("./persistentRndStorage");
const notification = require("./notification");
const mobile = require("./mobile");
const extension = require("./extension");
const registerSettingsContentScript = (function(){
let unregisterSettingsContentScript = function(){};
@ -161,7 +162,7 @@
!browser.pageAction.openPopup
){
browser.tabs.create({
url: browser.extension.getURL("options/options.html?notice=" + reason)
url: extension.getURL("options/options.html?notice=" + reason)
});
}
}
@ -169,8 +170,12 @@
case "install":
logging.message("CanvasBlocker installed");
openOptions(details.reason);
browser.tabs.create({
url: browser.extension.getURL("options/presets.html?notice=" + details.reason)
settings.onloaded(function(){
if (settings.showPresetsOnInstallation){
browser.tabs.create({
url: extension.getURL("options/presets.html?notice=" + details.reason)
});
}
});
break;
case "update":

View File

@ -16,6 +16,10 @@
const settingDefinitions = require("./settingDefinitions");
scope.isMobile = async function isMobile(){
const platformInfo = await browser.runtime.getPlatformInfo();
if (platformInfo && platformInfo.os === "android"){
return true;
}
// todo: proper mobile check (e.g. over browser.runtime.getBrowserInfo()) and no feature check
return !browser.pageAction ||
!browser.pageAction.show ||

View File

@ -39,6 +39,7 @@
appendModified(require("./modifiedHistoryAPI"));
appendModified(require("./modifiedWindowAPI"));
appendModified(require("./modifiedDOMRectAPI"));
appendModified(require("./modifiedSVGAPI"));
appendModified(require("./modifiedTextMetricsAPI"));
appendModified(require("./modifiedNavigatorAPI"));
appendModified(require("./modifiedScreenAPI"));

View File

@ -258,7 +258,6 @@
const {prefs, notify, window, original} = check;
if (canvasSizeShouldBeFaked(this, prefs)){
try {
const options = args[0];
const canvas = window.document.createElement("canvas");
canvas.width = this.width;
canvas.height = this.height;
@ -268,9 +267,13 @@
if (fakeCanvas !== canvas){
notify("fakedReadout");
}
return new window.Promise(function(resolve){
fakeCanvas.toBlob(resolve, options && options.type, options && options.quality);
});
const fakeContext = getContext(window, fakeCanvas);
const {imageData} = getImageData(window, fakeContext);
const fakeOffscreenCanvas = new window.OffscreenCanvas(this.width, this.height);
const offscreenContext = fakeOffscreenCanvas.getContext("2d");
offscreenContext.putImageData(imageData, 0, 0);
return original.call(fakeOffscreenCanvas, ...args);
}
catch (error){
logging.warning("Error while faking:", error);
@ -424,7 +427,7 @@
return getIsPointValue({
func: (x, y) => original.call(this, x, y, args[2]),
x, y,
index: x + this.width * y,
index: x + this.canvas.width * y,
originalValue, window, prefs
});
}
@ -459,7 +462,7 @@
return getIsPointValue({
func,
x, y,
index: x + this.width * y,
index: x + this.canvas.width * y,
originalValue, window, prefs
});
}

View File

@ -12,7 +12,7 @@
scope = require.register("./modifiedNavigatorAPI", {});
}
const {checkerWrapper, setGetterProperties, getStatusByFlag} = require("./modifiedAPIFunctions");
const {checkerWrapper, setProperties, getStatusByFlag} = require("./modifiedAPIFunctions");
const extension = require("./extension");
const navigator = require("./navigator");
@ -55,7 +55,40 @@
};
});
setGetterProperties(scope.changedGetters, {
scope.changedFunctions = {
estimate: {
objectGetters: [function(window){return window.StorageManager && window.StorageManager.prototype;}],
fakeGenerator: function(checker){
const quota = 10 * 1024 * 1024 * 1024;
return function estimate(){
return checkerWrapper(checker, this, arguments, function(args, check){
const {notify, original, window} = check;
const This = this;
return new window.Promise(async function(resolve, reject){
try {
const originalValue = await original.call(This, ...args);
if (originalValue.quota !== quota){
originalValue.usage = Math.min(
quota,
Math.max(0, quota - (originalValue.quota - originalValue.usage))
);
originalValue.quota = quota;
notify("fakedNavigatorReadout");
}
resolve(originalValue);
}
catch (error){
reject(error);
}
});
});
};
}
}
};
setProperties(scope.changedFunctions, scope.changedGetters, {
type: "readout",
getStatus: getStatusByFlag("protectNavigator"),
api: "navigator"

88
lib/modifiedSVGAPI.js Normal file
View File

@ -0,0 +1,88 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
"use strict";
let scope;
if ((typeof exports) !== "undefined"){
scope = exports;
}
else {
scope = require.register("./modifiedSVGAPI", {});
}
const {checkerWrapper, setProperties, getStatusByFlag} = require("./modifiedAPIFunctions");
const {byteArrayToString: hash} = require("./hash");
let randomSupply = null;
scope.setRandomSupply = function(supply){
randomSupply = supply;
};
function getValueHash(value){
return hash(new Float32Array([value]));
}
const cache = {};
function getFakeValue(value, window){
const valueHash = getValueHash(value);
let cachedValue = cache[valueHash];
if (typeof cachedValue === "number"){
return cachedValue;
}
else {
const rng = randomSupply.getRng(1, window);
const fakedValue = value + 0.01 * (rng(0) / 0xffffffff - 0.5);
const fakedHash = getValueHash(fakedValue);
cache[valueHash] = fakedValue;
cache[fakedHash] = fakedValue;
return fakedValue;
}
}
scope.getFakeValue = getFakeValue;
function getFakeValueCallback(args, check){
const {notify, window, original} = check;
const ret = args.length? original.call(this, ...args): original.call(this);
notify("fakedSVGReadout");
return getFakeValue(ret, window);
}
scope.changedFunctions = {
getTotalLength: {
object: ["SVGGeometryElement"],
fakeGenerator: function(checker){
return function getTotalLength(){
return checkerWrapper(checker, this, arguments, getFakeValueCallback);
};
}
},
getComputedTextLength: {
object: ["SVGTextContentElement"],
fakeGenerator: function(checker){
return function getComputedTextLength(){
return checkerWrapper(checker, this, arguments, getFakeValueCallback);
};
}
},
getSubStringLength: {
object: ["SVGTextContentElement"],
fakeGenerator: function(checker){
return function getSubStringLength(charnum, nchars){
return checkerWrapper(checker, this, arguments, getFakeValueCallback);
};
}
},
};
scope.changedGetters = [];
setProperties(scope.changedFunctions, scope.changedGetters, {
type: "readout",
getStatus: getStatusByFlag("protectSVG"),
api: "svg"
});
}());

View File

@ -184,7 +184,7 @@
getterGenerator: function(checker){
const temp = {
get outerWidth(){
return checkerWrapper(checker, this, arguments, getFaker(window => window.innerWidth));
return checkerWrapper(checker, this, arguments, getFaker(window => window.top.innerWidth));
}
};
return Object.getOwnPropertyDescriptor(temp, "outerWidth").get;
@ -196,7 +196,7 @@
getterGenerator: function(checker){
const temp = {
get outerHeight(){
return checkerWrapper(checker, this, arguments, getFaker(window => window.innerHeight));
return checkerWrapper(checker, this, arguments, getFaker(window => window.top.innerHeight));
}
};
return Object.getOwnPropertyDescriptor(temp, "outerHeight").get;

View File

@ -26,6 +26,7 @@
original[property] = window.navigator[property];
});
original["real Firefox version"] = window.navigator.userAgent.replace(/^.+Firefox\//, "");
original["real Firefox version - rv"] = window.navigator.userAgent.replace(/^.+; rv:([\d.]+).*$/, "$1");
let changedValues = {};

View File

@ -89,15 +89,6 @@
};
}();
browser.windows.onRemoved.addListener(async function(){
const windows = await browser.windows.getAll();
if (windows.every(function(window){
return !window.incognito;
})){
clearIncognito();
}
});
function registerTimeout(){
const interval = getInterval();
if (interval > 0){
@ -173,4 +164,18 @@
scope.setDomainData = setDomainData;
scope.clearDomainData = clearDomainData;
scope.clearContainerData = clearContainerData;
try {
browser.windows.onRemoved.addListener(async function(){
const windows = await browser.windows.getAll();
if (windows.every(function(window){
return !window.incognito;
})){
clearIncognito();
}
});
}
catch (error){
logging.error("Unable to register windows.onRemoved listener", error);
}
}());

View File

@ -19,17 +19,26 @@
texts.push({text: text.toLowerCase(), content});
};
scope.search = function(search){
const resultSets = search.toLowerCase().split(/\s+/).filter(function(term){
const resultSets = search.split(/\s+/).filter(function(term){
return term.trim();
}).map(function(term){
return new RegExp(term);
}).map(function(term){
const matching = new Set();
texts.forEach(function(text){
if (term.test(text.text)){
matching.add(text.content);
}
});
if (term.match(/^:[a-z]+$/i)){
const tag = term.substring(1);
texts.forEach(function(text){
if (text.content.querySelector(`.${tag}`)){
matching.add(text.content);
}
});
}
else {
term = new RegExp(term.toLowerCase());
texts.forEach(function(text){
if (term.test(text.text)){
matching.add(text.content);
}
});
}
return matching;
});
if (resultSets.length){

View File

@ -166,15 +166,24 @@
function initializeUrlSetting(urlSetting){
let regExp;
const domain = !!urlSetting.url.match(/^[A-Za-z0-9_.-]+$/);
const domain = !!urlSetting.url.match(/^[A-Za-z0-9_.*-]+$/);
if (domain){
regExp = new RegExp(
"(?:^|\\.)" + urlSetting.url.replace(/([\\+*?[^\]$(){}=!|.])/g, "\\$1") + "\\.?$",
"(?:^|\\.)" + urlSetting.url.replace(/([\\+?[^\]$(){}=!|.])/g, "\\$1").replace(/\*/g, ".+") + "\\.?$",
"i"
);
}
else {
regExp = new RegExp(urlSetting.url, "i");
try {
regExp = new RegExp(urlSetting.url, "i");
}
catch (error){
logging.error("Error in regular expression", urlSetting.url, error);
regExp = new RegExp(
"(?:^|\\.)" + urlSetting.url.replace(/([\\+*?[^\]$(){}=!|.])/g, "\\$1") + "\\.?$",
"i"
);
}
}
const match = function(url){
if (!url){

View File

@ -124,6 +124,10 @@
"intersectionRect @ domRect",
"boundingClientRect @ domRect",
"rootBounds @ domRect",
{name: "SVG-API", level: 1},
"getTotalLength @ svg",
"getComputedTextLength @ svg",
"getSubStringLength @ svg",
{name: "TextMetrics-API", level: 1},
"width @ textMetrics",
"actualBoundingBoxAscent @ textMetrics",
@ -142,6 +146,7 @@
"appName @ navigator",
"appVersion @ navigator",
"buildID @ navigator",
"estimate @ navigator",
"oscpu @ navigator",
"platform @ navigator",
"product @ navigator",
@ -280,6 +285,7 @@
"history",
"window",
"domRect",
"svg",
"textMetrics",
"navigator",
"screen",
@ -356,6 +362,11 @@
name: "domRectIntegerFactor",
defaultValue: 4
},
{
name: "protectSVG",
defaultValue: true,
urlSpecific: true
},
{
name: "protectTextMetrics",
defaultValue: true,
@ -404,6 +415,10 @@
defaultValue: "auto",
options: ["auto", "default", "light", "dark", "colorful"/*, "none"*/]
},
{
name: "showPresetsOnInstallation",
defaultValue: true
},
{
name: "dontShowOptionsOnUpdate",
defaultValue: false

View File

@ -13,9 +13,10 @@
}
const settings = require("./settings");
const extension = require("./extension");
scope.init = function(page){
const basePath = browser.extension.getURL("themes");
const basePath = extension.getURL("themes");
const baseLink = document.createElement("link");
baseLink.href = `${basePath}/base/layout.css`;

View File

@ -110,9 +110,11 @@
return {webGlCanvas, context};
};
const webglRandom = require("./webglRandom");
let randomSupply = null;
scope.setRandomSupply = function(supply){
randomSupply = supply;
webglRandom.setRandomSupply(supply);
};
function getNumber({originalValue, max, index, window}){
@ -138,6 +140,13 @@
return "";
case "{disabled}":
return null;
case "{random vendor}":
return webglRandom.getRandomVendor(window);
case "{random renderer}":
return webglRandom.getRandomRenderer(window);
}
if (settingValue.startsWith("<") && settingValue.endsWith(">")){
return webglRandom.pickOneFromTree(settingValue, window);
}
return settingValue;
},

173
lib/webglRandom.js Normal file
View File

@ -0,0 +1,173 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
"use strict";
let scope;
if ((typeof exports) !== "undefined"){
scope = exports;
}
else {
scope = require.register("./webglRandom", {});
}
let randomSupply = null;
scope.setRandomSupply = function(supply){
randomSupply = supply;
};
const windowHashes = new WeakMap();
function getWindowStorage(window){
let storage = windowHashes.get(window);
if (!storage){
const vendorRng = randomSupply.getIndexRng(1, scope.vendors.length, window);
const vendorIndex = vendorRng(0);
storage = {vendorIndex};
const vendor = scope.vendors[vendorIndex];
if (vendor.getRandomRenderer){
vendor.renderers = [vendor.getRandomRenderer(window)];
storage.rendererIndex = 0;
}
else {
const rendererRng = randomSupply.getIndexRng(1, vendor.renderers.length, window);
storage.rendererIndex = rendererRng(0);
}
windowHashes.set(window, storage);
}
return storage;
}
function getRandomVendorIndex(window){
return getWindowStorage(window).vendorIndex;
}
function getRandomRendererIndex(window){
return getWindowStorage(window).rendererIndex;
}
scope.getRandomVendor = function getRandomVendor(window){
return scope.vendors[getRandomVendorIndex(window)].vendor;
};
scope.getRandomRenderer = function getRandomRenderer(window){
const vendor = scope.vendors[getRandomVendorIndex(window)];
return vendor.renderers[getRandomRendererIndex(window)];
};
scope.pickOneFromTree = function pickOneFromTree(treeString, window){
function pickOne(string){
const options = [];
let cumulate = "";
let index = 0;
for (const l = string.length; index < l; index += 1){
const char = string.charAt(index);
if (char === "|"){
options.push(cumulate);
cumulate = "";
}
else if (char === "<"){
const subPick = pickOne(string.substring(index + 1));
cumulate += subPick.value;
index += 1 + subPick.endIndex;
}
else if (char === ">"){
break;
}
else {
cumulate += char;
}
}
options.push(cumulate);
const optionRng = randomSupply.getIndexRng(1, options.length, window);
return {value: options[optionRng(0)], endIndex: index};
}
return pickOne(treeString).value;
};
scope.vendors = [
{
vendor: "Chromium",
renderers: [
"Chromium",
]
},
{
vendor: "Intel Inc.",
renderers: [
"Intel GMA X3100 OpenGL Engine",
"Intel HD Graphics 3000 OpenGL Engine",
"Intel HD Graphics 4000 OpenGL Engine",
"Intel HD Graphics 5000 OpenGL Engine",
"Intel Iris OpenGL Engine",
"Intel Iris Pro OpenGL Engine",
]
},
{
vendor: "Intel Open Source Technology Center",
renderers: [
"Mesa DRI Intel(R) Haswell Mobile",
"Mesa DRI Intel(R) Ironlake Mobile",
"Mesa DRI Intel(R) Ivybridge Mobile x86/MMX/SSE2",
"Mesa DRI Intel(R) Ivybridge Mobile",
"Mesa DRI Intel(R) Sandybridge Desktop x86/MMX/SSE2",
"Mesa DRI Intel(R) Sandybridge Desktop",
"Mesa DRI Intel(R) Sandybridge Mobile x86/MMX/SSE2",
"Mesa DRI Intel(R) Sandybridge Mobile",
]
},
{
vendor: "Google Inc.",
getRandomRenderer: function(window){
const words = "Series|Graphics|Chipset|Express|Family|nForce|Dual|NVIDIA|800|600|300|FireGL|Mobility|Radeon|series|FirePro|Optiplex|WDDM|200|400|700|70M|50M|Driver|200M".split("|");
const compressed = "ANGLE (<A<MD <760G|(ATI) $f M8900 ($b) $c Pro $1|$f <2270|W5000 ($b V) $1 Adapter>|M880G with ATI $c $d HD 42<00 |50>|$d< <HD<6<370D $1|410D $1>|77<00 $0|70>| <5<450|5<00 $0|70>|670|$k $0|$8 $0>|6<2<50< $1|M >|90 $1>|3<00 $e $1|10< $1 |M>|20< <$1 |$e $1>|M>|50|70<D|M>>|4<00M $0|10D|50A $1|$l |80G>|5<00< $0|M/5600/5700 $0>|10 $0|20G|30D $1|50A|70>|6<20G|30M|50A $1|70>|7<00 $0|30M>|$8 $0|900< $0|M $0>>|7<000 $e|290 $1|3<00 $0 $1|10< $1|M>|40< $1|G|M>>|4<00M $0|20G|50 $1|$l|80D>|5<00< $0|/7600 $0|G|M/7600M $0>|20G + 7670M $6 $1|40D|$m/7650M $1|60D|70< $1|M>|80D>|6<00<G + 6400M $6 $1|M $0>|10M|40G + <76<00M $6 $1|$l $6 $1>|8750M $6 $1>|$m|60<D|G + 7600M $6 $1>|$l>|$k $0|$8 $0|900 $0>|8<2<10|40|50>|3<30|50>|4<00|50G|70D>|5<10G|50G + <8570M $6 $1|HD 8600/8700M $6 $1>|70D>|6<10G + 8500M $6 $1|50G + 8<670M $6 $1|750M $6 $1>|70D>>>>|R<7 $i $0|9 $i $0>>|(TM) HD <6<380G|480G|520G |620G>|7450>>>|SUS <EAH<4350 $e|5<450 $0|670 $0|770 $0>|6<450 $0|670 $0|970 $0>>|HD7770 $0|R9 270 $0>|TI <$f <2450|V<3<$k ($b)|$8>|4800 ($b)>>|$c $d <9600/9700 $0|HD <2<$j XT|$9>|3<4<00 $0|30|50|70>|650>|4<2<00 $0|50 $1>|3<00< $0|/4500 $0>|30>|5<00< $0|/5100 $0>|30 $0|70>|650>|5<000 $0|145|4<00 $0 |30|5<0|v>|70 >|650>|6<370|550>>|X1<$a|$9>>|$d <2100|3<000 $1|100 $1>|HD<4670| <2<350|$j <P<ro |RO>|$0|XT >|$9 <P<ro |RO>|XT>>|3<$i $1|$a $1|4<00 $0|50 - Dell $g|70 - Dell $g>|6<00 $0|50>|$8 $0>|4<2<00|50 $1>|3<00< $0|/4500 $0>|50 $0>|550|6<00 Seri<es |si>|50|70>|770|8<00 $0|70 X2>>|5<4<00 $0|50>|570|6<00 $0|70>|$k $0|$8 $0>|6<230|350>>>|X<1<050|2<00 $0|50|70>>|$a/X550/X1050 $0|press <1<1<00|50 $0>|2<00 $0|50>>|$i $0>>>>>|Intel(R) <4 $0 Internal $2|829<15G/GV/910GL $3 $2 $4|45G $3 $2 $4>|946GZ $3 $2 $4|B43 $3 $2|G<33/G31 $3 $2 $4|4<1 $3 $2|5/G43 $3 $2>|965 $3 $2 $4|raphics Media Accelerator <3<150|$9 $0>|HD >>|HD $1 <3000|4<000|$j|$9>|$4>|Q<3<3 $3 $2 $4|5 $3 $2 $4>|45/Q43 $3 $2|965/Q963 $3 $2 $4>>|M<icrosoft Basic Render $n|obile Intel(R) <4<5 $3 $2 $4| $0 $3 $2 $4>|9<15GM/GMS,910GML $3 $2 $4|45< $3 $2 $4|GM $3 $2 $4>|65 $3 $2 $4>|- famiglia $3 $2 45|HD $1>>|$7 <GeForce <210 |31<0M |5M>|4<05M|10M>|6<05|1<0<0 $5 405|M>|50< LE|SE $5 430>>|$i TurboCache(TM)|500|$9>|7<0<00M / $5 610M|25 / $7 $5 630a |50 </ $7 $5 620i|PV / $7 $5 630a>>|1<00 </ $7 $5 630i|GS>|$m / $5 630M>|$a <G<S|T>|LE|SE/7200 GS>|900 GS>|8<$o G|$a GS |$j< GS|GS|M G<S|T>>|500 GT|$9< G<S|T< |S>>|GS|M G<S|T>>|$8 G<S|TS 512>>|9<100|$o GS|$a< GE|M GS >|$j< GT |M >|500< G<S|T>|M GS>|6<00< G<SO 512|T>|M G<S|T>>|$m GT>|700M GTS|$8 GT< |X/9800 GTX+>>|FX 5200|G<10<0|2M|5M>|210< |M>| 10<3M |5M >|o 7300|T< <120M|2<20|30M |40M >|3<20M|3<0M |5M>>|4<2<0M|5M>|30|40>|5<2<0M|5M>|30|45|55M>|6<10|2<0|5>|3<0M|5>|40< |M>|$m>|7<40M|55M>>|S <2<40|50>|350M|450 >|X <2<60|75|85|95>|4<60< SE|M>|80>|5<50 Ti|60< Ti |M>|70|80M>|6<50 Ti BOOST|60< Ti|M >|7<0|5M>|80|90>|7<60 (192-bit)|70|80>>>>>|ION|MCP67M|$5 750a SLI|NVS <3<00|100M >|4200M|5<100M|$o|400M >>|Quadro <1000M|2000M|$9|FX <1<500M|$k|$8>|2<500M|700M>|3700|5<70|80>|770M|880M>|K<3000M|$9>|NVS <1<10M|35M|40M|60M>|2<85|90>>>>|R<adeon <(TM) HD 64<$l|90M>|HD 6470M|X<1<$a/X1550 $0|550 <64-bit|$0>|650 S<E|eries >|950 $0>|$a/X550/X1050 $0|$8 GTO>>|DPDD Chained DD|oyal BNA $n|S880>|SiS Mirage 3 $1|VIA Chrome9 HC IGP $4 $h|WinFast GT 640($7)><| (Microsoft Corporation< <$h 1.1) |- $h< <1.<0)|1)|2)>|v1.<1)|2<0)|)>|3)>>|)>>|- $h v1.<1)|20)>>>< Direct3D<11 vs_<4_<0 ps_4_0|1 ps_4_1>|5_0 ps_5_0>|9<Ex|> vs_<0_0 ps_<2_0|3_0>|2_0 ps_2_0|3_0 ps_3_0>>|>)".replace(
/\$([0-9a-z]+)/gi,
function(m, index){
return words[parseInt(index, 36)];
}
);
return scope.pickOneFromTree(compressed, window);
}
},
{
vendor: "NVIDIA Corporation",
renderers: [
"GeForce 8600M GT/PCIe/SSE2",
"GeForce GT 430/PCIe/SSE2",
"GeForce GT 520/PCIe/SSE2",
"GeForce GTX 650 Ti/PCIe/SSE2",
"GeForce GTX 680/PCIe/SSE2",
"GeForce GTX 770/PCIe/SSE2",
"NVIDIA GeForce 320M OpenGL Engine",
"NVIDIA GeForce 8600M GT OpenGL Engine",
"NVIDIA GeForce 8800 GS OpenGL Engine",
"NVIDIA GeForce 8800 GT OpenGL Engine",
"NVIDIA GeForce 9400 OpenGL Engine",
"NVIDIA GeForce 9400M OpenGL Engine",
"NVIDIA GeForce 9600M GT OpenGL Engine",
"NVIDIA GeForce GT 130 OpenGL Engine",
"NVIDIA GeForce GT 330M OpenGL Engine",
"NVIDIA GeForce GT 640M OpenGL Engine",
"NVIDIA GeForce GT 650M OpenGL Engine",
"NVIDIA GeForce GT 750M OpenGL Engine",
"NVIDIA GeForce GTX 660M OpenGL Engine",
"NVIDIA GeForce GTX 675MX OpenGL Engine",
"NVIDIA GeForce GTX 680MX OpenGL Engine",
"Quadro 2000/PCIe/SSE2",
"Quadro 2000M/PCIe/SSE2",
"Quadro FX 1800/PCIe/SSE2",
"Quadro K600/PCIe/SSE2",
]
},
{
vendor: "VMware, Inc.",
renderers: [
"Gallium 0.4 on i915 (chipset: Pineview M)",
"Gallium 0.4 on llvmpipe (LLVM 3.2, 128 bits)",
]
},
{
vendor: "TransGaming Inc.",
renderers: [
"SwiftShader",
]
},
];
}());

View File

@ -2,7 +2,7 @@
{
"name": "CanvasBlocker",
"description": "__MSG_addon_description__",
"version": "1.6",
"version": "1.11",
"icons": {
"48": "icons/icon.svg",
"96": "icons/icon.svg"
@ -42,6 +42,7 @@
"lib/settings.js",
"lib/colorStatistics.js",
"lib/webglRandom.js",
"lib/webgl.js",
"lib/hash.js",
"lib/modifiedAPIFunctions.js",
@ -50,6 +51,7 @@
"lib/modifiedHistoryAPI.js",
"lib/modifiedWindowAPI.js",
"lib/modifiedDOMRectAPI.js",
"lib/modifiedSVGAPI.js",
"lib/modifiedTextMetricsAPI.js",
"lib/navigator.js",
"lib/modifiedNavigatorAPI.js",
@ -96,11 +98,11 @@
"privacy"
],
"applications": {
"browser_specific_settings": {
"gecko": {
"id": "CanvasBlocker@kkapsner.de",
"update_url": "https://canvasblocker.kkapsner.de/versions/updates.json",
"strict_min_version": "68.0"
"strict_min_version": "100.0"
}
},
"default_locale": "en",

View File

@ -6,7 +6,7 @@ html, body {
#settings {
width: 100%;
box-sizing: border-box;
height: 95%;
height: 100%;
}
#settings.invalid {
background-color: var(--input-error-background-color);

View File

@ -274,9 +274,10 @@
const browserPresets = {
Edge: {
browserPreset: "Edge",
chromeVersion: "71.0.3578.98",
edgeVersion: "17.17134",
chromeVersion: "111.0.0.0",
edgeVersion: "111.0.1661.41",
firefoxVersion: undefined,
firefoxVersionRV: undefined,
operaVersion: undefined,
safariVersion: undefined,
@ -290,10 +291,11 @@
},
Opera: {
browserPreset: "Opera",
chromeVersion: "71.0.3578.98",
chromeVersion: "109.0.0.0",
edgeVersion: undefined,
firefoxVersion: undefined,
operaVersion: "58.0.3135.65",
firefoxVersionRV: undefined,
operaVersion: "95.0.0.0",
safariVersion: undefined,
appVersion: "5.0 ({platformDetails}) AppleWebKit/537.36 (KHTML, like Gecko) " +
@ -306,9 +308,10 @@
},
Chrome: {
browserPreset: "Chrome",
chromeVersion: "71.0.3578.98",
chromeVersion: "111.0.0.0",
edgeVersion: undefined,
firefoxVersion: undefined,
firefoxVersionRV: undefined,
operaVersion: undefined,
safariVersion: undefined,
@ -325,8 +328,9 @@
chromeVersion: undefined,
edgeVersion: undefined,
firefoxVersion: undefined,
firefoxVersionRV: undefined,
operaVersion: undefined,
safariVersion: "12.0.3",
safariVersion: "16.3",
appVersion: "5.0 ({platformDetails}) AppleWebKit/605.1.15 (KHTML, like Gecko) " +
"Version/{safariVersion} Safari/605.1.15",
@ -341,6 +345,7 @@
chromeVersion: undefined,
edgeVersion: undefined,
firefoxVersion: "{real Firefox version}",
firefoxVersionRV: "{real Firefox version - rv}",
operaVersion: undefined,
safariVersion: undefined,
@ -350,7 +355,7 @@
return firefoxOscpu[currentProperties.osPreset || ""] || "{original value}";
},
productSub: "20100101",
userAgent: "Mozilla/5.0 ({platformDetails}; rv:{firefoxVersion}) Gecko/20100101 Firefox/{firefoxVersion}",
userAgent: "Mozilla/5.0 ({platformDetails}; rv:{firefoxVersionRV}) Gecko/20100101 Firefox/{firefoxVersion}",
vendor: undefined,
}
};

View File

@ -1,5 +1,5 @@
body.standalone {
padding: 0.5em;
padding: 0.5em 0.5em 2.5em;
}
@media (max-width: 400px){
@ -37,7 +37,7 @@ header .bookmarkNotice .dontShowOptionsOnUpdate input {
vertical-align: sub;
}
.resistFingerprintingNotice {
.resistFingerprintingNotice, .settingsNotice {
margin: 0.5em 0;
padding: 0.5em;
border: 1px solid var(--input-error-background-color);

View File

@ -25,11 +25,11 @@
},
openNavigatorSettings: function(){
logging.verbose("open navigator settings");
window.open("navigator.html", "_blank");
browser.tabs.create({url: "navigator.html"});
},
showReleaseNotes: function(){
logging.verbose("open release notes");
window.open("../releaseNotes.txt", "_blank");
browser.tabs.create({url: extension.getURL("../releaseNotes.txt")});
},
clearPersistentRnd: function(){
logging.message("clear persistent rnd storage");
@ -53,15 +53,15 @@
},
inspectSettings: function(){
logging.verbose("open settings inspection");
window.open("export.html", "_blank");
browser.tabs.create({url: "export.html"});
},
openSettingSanitation: function(){
logging.verbose("open settings sanitation");
window.open("sanitize.html", "_blank");
browser.tabs.create({url: "sanitize.html"});
},
openSettingPresets: function(){
logging.verbose("open setting presets");
window.open("presets.html", "_blank");
browser.tabs.create({url: "presets.html"});
},
saveSettings: function(){
logging.verbose("save settings");
@ -92,7 +92,7 @@
},
inspectWhitelist: function(){
logging.verbose("open whitelist inspection");
window.open("whitelist.html", "_blank");
browser.tabs.create({url: "whitelist.html"});
},
loadSettings: async function(){
logging.verbose("load settings");
@ -234,28 +234,38 @@
groupTabs.classList = "groupTabs";
document.body.appendChild(groupTabs);
if (
browser.privacy &&
browser.privacy.websites &&
browser.privacy.websites.resistFingerprinting &&
browser.privacy.websites.resistFingerprinting.get
){
browser.privacy.websites.resistFingerprinting.get({}).then(function({value}){
if (value){
const rfpNotice = document.createElement("div");
rfpNotice.className = "resistFingerprintingNotice";
rfpNotice.appendChild(
extension.parseTranslation(
extension.getTranslation("resistFingerprintingNotice")
)
);
document.body.insertBefore(rfpNotice, groupTabs);
}
return undefined;
}).catch(function(error){
logging.warning("Unable to read resistFingerprinting:", error);
});
}
[
{
check: async function(){
if (
browser.privacy &&
browser.privacy.websites &&
browser.privacy.websites.resistFingerprinting &&
browser.privacy.websites.resistFingerprinting.get
){
return (await browser.privacy.websites.resistFingerprinting.get({})).value;
}
return false;
},
className: "resistFingerprintingNotice",
text: "resistFingerprintingNotice"
},
{
check: () => !window.AudioContext,
text: "settingsNotice.dom.webAudio.enabled"
},
].forEach(async function(settingsCheck){
if (await settingsCheck.check()){
const settingsNotice = document.createElement("div");
settingsNotice.className = settingsCheck.className || "settingsNotice";
settingsNotice.appendChild(
extension.parseTranslation(
extension.getTranslation(settingsCheck.text)
)
);
document.body.insertBefore(settingsNotice, groupTabs);
}
});
const groups = document.createElement("ul");
groups.className = "groups";
@ -577,7 +587,7 @@
const version = document.createElement("div");
version.className = "version";
fetch(browser.extension.getURL("manifest.json")).then(function(response){
fetch(extension.getURL("manifest.json")).then(function(response){
return response.json();
}).then(function(manifest){
version.textContent = "Version " + manifest.version;

View File

@ -51,10 +51,12 @@
const option = document.createElement("option");
if (typeof value === typeof setting.defaultValue){
option.value = value;
option.text = extension.getTranslation(setting.name + "_options." + value) || value;
if (setting.defaultValue === value){
option.selected = true;
option.selectedText = option.text;
option.notSelectedText = option.text + extension.getTranslation("labelForDefaultOption");
}
option.text = extension.getTranslation(setting.name + "_options." + value) || value;
}
else {
option.disabled = true;
@ -62,10 +64,29 @@
}
select.appendChild(option);
});
select.update = function(){
Array.from(select.options).forEach(function(option){
if (option.notSelectedText){
option.text = option.notSelectedText;
}
});
const selectedOption = select.options[select.selectedIndex];
if (selectedOption.selectedText){
selectedOption.text = selectedOption.selectedText;
}
};
return select;
}
const inputTypes = {
all: {
updateCallback: function(input, value, defaultValue){
if (input.update){
input.update();
}
input.classList[value === defaultValue? "remove": "add"]("changed");
}
},
number: {
input: function(value){
const input = document.createElement("input");
@ -73,8 +94,9 @@
input.value = value;
return input;
},
updateCallback: function(input, value){
updateCallback: function(input, value, defaultValue){
input.value = value;
inputTypes.all.updateCallback(input, value, defaultValue);
return input.value;
},
getValue: function(input){
@ -95,8 +117,9 @@
input.value = value;
return input;
},
updateCallback: function(input, value){
updateCallback: function(input, value, defaultValue){
input.value = value;
inputTypes.all.updateCallback(input, value, defaultValue);
return input.value;
},
getValue: function(input){
@ -111,8 +134,9 @@
input.style.display = "inline-block";
return input;
},
updateCallback: function(input, value){
updateCallback: function(input, value, defaultValue){
input.checked = value;
inputTypes.all.updateCallback(input, value, defaultValue);
return input.checked;
},
getValue: function(input){
@ -169,7 +193,7 @@
container && container.hasOwnProperty(key)?
container[key]:
setting.defaultKeyValue,
url
setting.defaultKeyValue
);
});
keyInput.addEventListener("change", function(){
@ -189,7 +213,7 @@
container && container.hasOwnProperty(key)?
container[key]:
setting.defaultKeyValue,
url
setting.defaultKeyValue
);
logging.message("setting", setting.name, "(", key, ") was not changed");
}
@ -225,11 +249,14 @@
urlCell.removeChild(input);
urlCell.textContent = entry.url;
});
input.addEventListener("click", function(event){
event.stopPropagation();
});
});
urlCell.textContent = entry.url;
row.appendChild(urlCell);
let input = createInput(setting, entry.url);
type.updateCallback(input, setting.get(entry.url));
type.updateCallback(input, setting.get(entry.url), setting.defaultValue);
if (!entry.hasOwnProperty(setting.name)){
input.classList.add("notSpecifiedForUrl");
}
@ -316,14 +343,17 @@
}
}
if (type){
setting.on(function(){type.updateCallback(input, setting.get(url));}, url);
setting.on(function(){
type.updateCallback(input, setting.get(url), setting.defaultValue);
}, url);
input.addEventListener("change", function(){
const value = type.getValue(input);
if (setting.set(value, url)){
type.updateCallback(input, value, setting.defaultValue);
logging.message("changed setting", setting.name, ":", value);
}
else {
type.updateCallback(input, setting.get(url));
type.updateCallback(input, setting.get(url), setting.defaultValue);
logging.message("setting", setting.name, "was not changed");
}
});

View File

@ -3,10 +3,12 @@
"maxFakeSize": 1000000,
"protectDOMRect": {
"mail.google.com": false,
"onedrive.live.com": false
"onedrive.live.com": false,
"^https://[^/]*ebay\\.([a-z]+|com\\.(au|hk|my|sg)|co\\.uk)(/|$)": false
},
"protectWindow": {
"paypal.com": false
"paypal.com": false,
"dhl.de": false
}
},
"stealth": {

View File

@ -83,6 +83,7 @@
{mainFlag: "protectAudio", section: "Audio-API"},
{mainFlag: "protectWindow", section: "Window-API"},
{mainFlag: "protectDOMRect", section: "DOMRect-API"},
{mainFlag: "protectSVG", section: "SVG-API"},
{mainFlag: "protectTextMetrics", section: "TextMetrics-API"},
{mainFlag: "protectNavigator", section: "Navigator-API"},
{mainFlag: "protectScreen", section: "Screen-API"},

View File

@ -627,6 +627,25 @@
},
]
},
{
name: "SVG-API",
settings: [
{
"name": "protectSVG"
},
{
"name": "protectedAPIFeatures",
"replaceKeyPattern": / @ .+$/,
"displayedSection": "SVG-API",
"displayDependencies": [
{
"protectSVG": [true],
"displayAdvancedSettings": [true]
}
]
},
]
},
{
name: "TextMetrics-API",
settings: [

View File

@ -61,6 +61,12 @@
whitelistValue: false,
protectedValue: true
},
{
title: extension.getTranslation("section_SVG-api"),
name: "protectSVG",
whitelistValue: false,
protectedValue: true
},
{
title: extension.getTranslation("section_navigator-api"),
name: "protectNavigator",

13109
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -7,12 +7,12 @@
"test": "test"
},
"devDependencies": {
"eslint": "^6.8.0",
"eslint": "^8.57.0",
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-html": "^6.1.1",
"eslint-plugin-promise": "^4.2.1",
"web-ext": "^6.1.0",
"yargs": "^15.4.1"
"eslint-plugin-html": "^8.0.0",
"eslint-plugin-promise": "^6.1.1",
"web-ext": "^7.11.0",
"yargs": "^17.7.2"
},
"scripts": {},
"repository": {

View File

@ -11,6 +11,7 @@
<ul id="prints">
<li>...</li>
</ul>
<div id="version" class="versionDisplay"></div>
<script src="../lib/require.js"></script>
<script src="../lib/logging.js"></script>
<script src="../lib/extension.js"></script>

View File

@ -9,6 +9,10 @@
const {parseErrorStack} = require("../lib/callingStack");
const logging = require("../lib/logging");
logging.setPrefix("page action script");
window.addEventListener("load", async function(){
extension.displayVersion("version", 250);
});
const domainNotification = require("./domainNotification");
const Notification = require("./Notification");
@ -30,7 +34,7 @@
browser.runtime.openOptionsPage();
}
else {
window.open(browser.extension.getURL("options/options.html"), "_blank");
browser.tabs.create({url: extension.getURL("options/options.html")});
}
}
},
@ -75,6 +79,7 @@
canvas: {name: "protectedCanvasPart", value: "nothing"},
audio: {name: "protectAudio", value: false},
domRect: {name: "protectDOMRect", value: false},
svg: {name: "protectSVG", value: false},
history: {name: "historyLengthThreshold", value: 10000},
navigator: {name: "protectNavigator", value: false},
windows: {name: "protectWindow", value: false},
@ -151,15 +156,12 @@
name: "inspectWhitelist",
isIcon: true,
callback: function({domain, urls}){
window.open(
browser.extension.getURL(
"options/whitelist.html?domain=" +
encodeURIComponent(domain) +
"&urls=" +
encodeURIComponent(JSON.stringify(Array.from(urls.values())))
),
"_blank"
);
browser.tabs.create({url: extension.getURL(
"options/whitelist.html?domain=" +
encodeURIComponent(domain) +
"&urls=" +
encodeURIComponent(JSON.stringify(Array.from(urls.values())))
)});
}
}
];

View File

@ -1,3 +1,107 @@
Version 1.11:
changes:
-
new features:
-
fixes:
-
known issues:
- if a data URL is blocked the page action button does not appear
- canvas and navigator APIs in workers are not protected
Version 1.10.1:
new features:
- added tag search
- added :changed tag
- mark default value in drop downs settings
fixes:
- lag and functionality loss on google sites
- fix function tampering detection via prototype
- isPointInPath and isPointInStroke return undefined with persistent rng
known issues:
- if a data URL is blocked the page action button does not appear
- canvas and navigator APIs in workers are not protected
Version 1.10:
changes:
- added eBay to the convenience preset
- do not use proxy for Function.prototype.toString (causes weird problems sometimes)
new features:
- added setting showPresetsOnInstallation to be able to not show the presets page upon installation
- display version in page and browser action
- added protection for navigator.storage.estimate()
fixes:
- always protect about:blank
- persistent rng not working in Firefox for Android
- mobile default settings were not used in Firefox for Android
- settings export page did not show whole content in Firefox for Android
- new tabs opened from within the extension did not open properly in Firefox for Android
- settings reset confirmation dialog was not properly visible in Firefox for Android
- reload after changing the whitelist state in the browser action has to be done without cache
- data URL blocking was not affected by when changing the whitelist state in the browser action
- prevent unnecessary scroll bars in popups
known issues:
- if a data URL is blocked the page action button does not appear
- canvas and navigator APIs in workers are not protected
Version 1.9:
changes:
- update setting descriptions
- added dhl.de to the convenience preset
- updated browser presets
- screen API: use inner of top window for all outer computations
new features:
- added support for wildcards (*) in domains
- added {real Firefox version - rv} to Firefox navigator preset
fixes:
- errors in URL regular expressions broke CB
- use correct tab in browserAction (private browsing)
- respect RFP in offscreenToBlobCallback
known issues:
- if a data URL is blocked the page action button does not appear
- canvas and navigator APIs in workers are not protected
Version 1.8:
new features:
- added SVG protection
- added notice when dom.webAudio.enabled is set to false
- added {random vendor} and {random renderer} to UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL to use a random value from a given list
- added <option1|option2|...> syntax to UNMASKED_VENDOR_WEBGL and UNMASKED_RENDERER_WEBGL
fixes:
- errors in URL regular expressions broke CB
known issues:
- if a data URL is blocked the page action button does not appear
Version 1.7:
changes:
- Auto close browser action
fixes:
- CSP headers broken on 304 requests
known issues:
- if a data URL is blocked the page action button does not appear
Version 1.6.1:
fixes:
- Google login and account creation did not work
known issues:
- if a data URL is blocked the page action button does not appear
Version 1.6:
changes:
- periodical persistent rnd clearing does not clear in active tabs

View File

@ -18,4 +18,11 @@ addLine("window name after set: " + window.name);
const hashValue = await testAPI.hash(canvasAPI.fingerprint(window).url);
addLine("canvas hash: " + hashValue);
}());
}());
document.getElementById("reloadWith304").addEventListener("click", function(){
"use strict";
document.cookie = "304=1";
location.reload();
});

View File

@ -1,6 +1,12 @@
<?php
header("Content-Security-Policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'");
if (array_key_exists("304", $_COOKIE)){
http_response_code(304);
setcookie("304", "", time() - 1000);
die();
}
else {
header("Content-Security-Policy: default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'");
}
?>
<!DOCTYPE html>
@ -18,11 +24,15 @@ header("Content-Security-Policy: default-src 'none'; img-src 'self'; script-src
<ul>
<li>if the window API protection is active the window name at start is always empty</li>
<li>the canvas hash changes upon reload (depending on CanvasBlocker settings - e.g. not in the stealth preset)</li>
<li>there is no line saying "THIS SHOULD NOT BE VISIBLE!" when reloading with <a id="reloadWith304" href="">this</a> link</li>
</ul>
<h2>Tests</h2>
<div id="results"></div>
<script src="testAPI.js"></script>
<script src="canvasAPI.js"></script>
<script src="cspTest.js"></script>
<script>
addLine("THIS SHOULD NOT BE VISIBLE!");
</script>
</body>
</html>

View File

@ -74,7 +74,7 @@
<script src="dataUrlTest.js"></script>
<div id="log"></div>
<form id="form" method="POST" action="http://localhost/server/POST-echo.php">
<form id="form" method="POST" action="https://bounce.kkapsner.de/requestDetails.php"">
<input name="internalId" value="id to be used to link the requests">
<textarea style="display: block;" name="fingerprint"></textarea>
<button>submit</button>

View File

@ -181,6 +181,16 @@ addTest("toString modified", function(log){
configurable: true
},
log
) | checkPropertyDescriptor(
Function.prototype,
"toString",
{
value: function toString(){},
writable: true,
enumerable: false,
configurable: true
},
log
);
});
addTest("function name", function(log){

View File

@ -16,4 +16,5 @@
Q 90,60 50,90
Q 10,60 10,30 z"/>
<text x="20" y="35" data-name="text" id="text" class="testRect">Text with Unicode &#x1D790;</text>
<text x="20" y="55" data-name="text2" id="text2" class="testRect">&#x73E9A;&#x9843;&#xB3D21;&#x123;&#1337;&#x314;&#xabcde;&#x4a110;&#x7F53A;&#x0815;</text>
</svg>

Before

Width:  |  Height:  |  Size: 470 B

After

Width:  |  Height:  |  Size: 628 B

View File

@ -86,9 +86,28 @@ const iframeAPI = function(){
}
},
{
name: "window.open",
name: "removed iframe",
prepare: async function openWindow(){
const newWindow = window.open("/");
const iframe = document.createElement("iframe");
document.body.appendChild(iframe);
const iframeWindow = iframe.contentWindow;
document.body.removeChild(iframe);
console.log("window of iframe directly after removing", iframeWindow);
return new Promise(function(resolve){
window.setTimeout(function(){
console.log("window of iframe in timeout", iframeWindow);
resolve(iframeWindow);
}, 1000);
});
}
},
];
["/", "about:blank", "about:blank#"].forEach(function(url){
methods.push({
name: "window.open " + url,
prepare: async function openWindow(){
const newWindow = window.open(url);
if (newWindow){
return {
window: newWindow,
@ -106,11 +125,12 @@ const iframeAPI = function(){
});
}
}
}
];
});
});
function getPerformer(callback){
return async function perform(method){
console.log("run iframe method", method.name);
const api = await method.prepare();
callback(api.window, method.name);
api.cleanup();

View File

@ -6,7 +6,7 @@ var log = function(){
str.unshift("color: green");
str.unshift("%cOK");
}
else if (str[str.length - 1].substr(0, 9) === "missmatch"){
else if (str[str.length - 1].startsWith("missmatch")){
str.unshift("color: red");
str.unshift("%cX");
}

View File

@ -18,6 +18,7 @@
<li><a href="audioTest.html">Audio Fingerprint test</a></li>
<li><a href="domRectTest.php">DOMRect Fingerprint test</a></li>
<li><a href="textMetricsTest.html">TextMetrics test</a></li>
<li><a href="svgTest.html">SVG test</a></li>
<li><a href="detectionTest.html">Detection test</a></li>
<li><a href="performanceTest.html">Performance test</a></li>
<li><a href="webGL-Test.html">Support for webGL</a></li>

View File

@ -60,15 +60,28 @@ function processNavigatorObject(navigator, keys, name){
});
}
iframeAPI.forEachMethod(function(windowToUse, name){
iframeAPI.forEachMethod(async function(windowToUse, name){
"use strict";
const navigator = windowToUse.navigator;
processNavigatorObject(navigator, Object.keys(navigator.__proto__), name);
const values = {};
const keys = Object.keys(navigator.__proto__);
keys.forEach(function(property){
const value = navigator[property];
if ((typeof value) === "string"){
values[property] = value;
}
});
const storage = await navigator.storage.estimate();
values.storage_quota = storage.quota.toString(10);
keys.push("storage_quota");
console.log(name, values);
processNavigatorObject(values, keys, name);
});
function processWorkerNavigatorObject(data, name){
"use strict";
console.log(name, data);
processNavigatorObject(data.values, Object.keys(data.values), name);
if (data.nestedValues){
processWorkerNavigatorObject(data.nestedValues, "nested " + name);

View File

@ -1,4 +1,4 @@
(function(){
(async function(){
"use strict";
const values = {};
@ -10,6 +10,8 @@
values[property] = value;
}
});
const storage = await navigator.storage.estimate();
values.storage_quota = storage.quota.toString(10);
const ports = [];
const sources = [];

4
test/screenSizeTest.css Normal file
View File

@ -0,0 +1,4 @@
#iframe {
position: fixed;
top: -2000%;
}

View File

@ -6,9 +6,11 @@
<link href="testIcon.svg" type="image/png" rel="icon">
<link href="testIcon.svg" type="image/png" rel="shortcut icon">
<link rel="stylesheet" href="../default.css" type="text/css">
<link rel="stylesheet" href="./screenSizeTest.css" type="text/css">
<style type="text/css"></style>
</head>
<body>
<iframe id="iframe"></iframe>
<h1>Screen size test</h1>
<h2>Expected result</h2>
<ul>

View File

@ -187,6 +187,14 @@ addResolutionTest("window properties: outer...", function(type){
];
});
addResolutionTest("iframe properties: outer...", function(type){
"use strict";
return document.getElementById("iframe").contentWindow[
"outer" + type.substring(0, 1).toUpperCase() + type.substring(1)
];
});
async function searchValue(tester){
"use strict";

View File

@ -1,7 +1,7 @@
<html>
<body>
<div id="log"></div>
<form id="form" method="POST" action="http://localhost/server/POST-echo.php">
<form id="form" method="POST" action="https://bounce.kkapsner.de/requestDetails.php"">
<input name="internalId" value="id to be used to link the requests">
<textarea style="display: block;" name="fingerprint"></textarea>
<button>submit</button>

43
test/svgTest.css Normal file
View File

@ -0,0 +1,43 @@
#svg {
position: fixed;
top: -2000%;
}
#test {
display: inline-block;
margin: 1em;
}
#test .data table {
border-collapse: collapse;
}
#test .data th {
padding: 0.4em;
}
#test .data td{
border: 1px solid #c7c7c7;
padding: 0.4em;
}
#test .data td.value {
text-align: right;
}
.small {
font-size: 0.8em;
color: gray;
}
.rectHash {
font-size: 4px;
}
.rectHash:hover {
font-size: 100%;
}
.content-hidable.content-hidden .content, .content-hidable .anti-content {
display: none;
}
.content-hidable .content, .content-hidable.content-hidden .anti-content {
display: initial;
}
.content-hidable .toggle {
cursor: pointer;
}

36
test/svgTest.html Normal file
View File

@ -0,0 +1,36 @@
<!DOCTYPE html>
<html>
<head>
<title>TextMetrics test</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link href="testIcon.svg" type="image/png" rel="icon">
<link href="testIcon.svg" type="image/png" rel="shortcut icon">
<link rel="stylesheet" href="../default.css" type="text/css">
<link rel="stylesheet" href="./svgTest.css" type="text/css">
<style>
.hash {
font-family: monospace;
font-size: 70%;
}
</style>
</head>
<body>
<h1>SVG test</h1>
<h2>Expected result</h2>
<ol>
<li>the hashes are different to the hashes when CanvasBlocker is disabled</li>
<li>if "refresh" is clicked nothing must change</li>
<li>upon page reload the hash changes (depending on CanvasBlocker settings - e.g. not in the stealth preset)</li>
</ol>
<h2>Tests</h2>
<iframe id="svg" src="domRectSVG.svg"></iframe>
<div id="test">
<h3 class="title">SVG</h3>
Hash: <span class="hash"></span><br>
<span class="content-hidable content-hidden">Data: <span class="toggle"><span class="anti-content">&plus;</span><span class="content">&minus;</span></span><span class="data content"></span></span><br>
<button class="refresh">refresh</button>
</div>
<script src="testAPI.js"></script>
<script src="svgTest.js"></script>
</body>
</html>

114
test/svgTest.js Normal file
View File

@ -0,0 +1,114 @@
/* globals testAPI */
(function(){
"use strict";
function byteArrayToHex(arrayBuffer){
const chunks = [];
(new Uint32Array(arrayBuffer)).forEach(function(num){
chunks.push(num.toString(16));
});
return chunks.map(function(chunk){
return "0".repeat(8 - chunk.length) + chunk;
}).join("");
}
function formatNumber(number){
const str = number.toString();
return "<span class=small>" + str.substring(0, str.length - 2) + "</span>" +
str.substring(str.length - 2);
}
const svg = document.getElementById("svg");
const output = document.getElementById("test");
function getElements(){
const doc = svg.contentDocument;
return Array.from(doc.querySelectorAll(".testRect"));
}
const tests = [];
function addTest(title, callback){
tests.push({title, callback});
}
async function performTests(){
const elements = getElements();
const results = await Promise.all(tests.map(async function(test){
return {
name: test.title,
data: await Promise.all(elements.map(async function(svgElement){
return await test.callback(svgElement);
}))
};
}));
const data = new Float64Array(elements.length * tests.length);
results.forEach(function(svgData, i){
svgData.data.forEach(function(testData, j){
if ((typeof testData) === "number"){
data[i * elements.length + j] = testData;
}
});
});
const hash = await crypto.subtle.digest("SHA-256", data);
output.querySelector(".hash").textContent = byteArrayToHex(hash);
const dataNode = output.querySelector(".data");
dataNode.innerHTML = "<table><tr><th></th>" +
elements.map(function(svgElement){
return "<th>" + svgElement.dataset.name + "</th>";
}).join("") +
results.map(function(result){
return "<tr><th>" + result.name + "</th>" + result.data.map(function(value){
if ((typeof value) === "number"){
return "<td class=\"value\">" +
formatNumber(value) +
"</td>";
}
else {
return "<td class=\"value unavailable\">--</td>";
}
}).join("") + "</tr>";
}).join("") +
"</table>";
}
svg.addEventListener("load", function(){
addTest("getTotalLength", function(element){
if (!element.getTotalLength){
return null;
}
return element.getTotalLength();
});
addTest("getComputedTextLength", function(element){
if (!element.getComputedTextLength){
return null;
}
return element.getComputedTextLength();
});
[{start: 3, end: 7}, {start: 7, end: 11}, {start: 3, end: 11}].forEach(function(substringDefinition){
addTest(
`getSubStringLength(${substringDefinition.start}, ${substringDefinition.end})`,
function(element){
if (!element.getSubStringLength){
return null;
}
return element.getSubStringLength(substringDefinition.start, substringDefinition.end);
}
);
});
output.querySelector(".refresh").addEventListener("click", function(){
performTests();
});
performTests();
document.querySelectorAll(".content-hidable").forEach(function(parentNode){
parentNode.querySelector(".toggle").addEventListener("click", function(){
parentNode.classList.toggle("content-hidden");
});
});
});
}());

View File

@ -106,4 +106,12 @@ input[type=checkbox]:checked::before {
box-sizing: border-box;
cursor: initial;
background-color: var(--input-background-color);
}
.versionDisplay {
text-align: right;
font-size: 0.6em;
opacity: 0.5;
margin: 0.3em 0.5em 0.2em;
clear: both;
}

View File

@ -193,6 +193,150 @@
{
"version": "1.6Alpha20210613",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.6Alpha20210613-an+fx.xpi"
},
{
"version": "1.7Alpha20210620",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.7Alpha20210620-an+fx.xpi"
},
{
"version": "1.7Alpha20210621",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.7Alpha20210621-an+fx.xpi"
},
{
"version": "1.7Alpha20211101",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.7Alpha20211101-an+fx.xpi"
},
{
"version": "1.8Alpha20211107",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.8Alpha20211107-an+fx.xpi"
},
{
"version": "1.8Alpha20220130",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.8Alpha20220130-an+fx.xpi"
},
{
"version": "1.8Alpha20220214",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.8Alpha20220214-an+fx.xpi"
},
{
"version": "1.8Alpha20220215",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.8Alpha20220215-an+fx.xpi"
},
{
"version": "1.9Alpha20220218",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20220218-an+fx.xpi"
},
{
"version": "1.9Alpha20220424",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20220424-an+fx.xpi"
},
{
"version": "1.9Alpha20220426",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20220426-an+fx.xpi"
},
{
"version": "1.9Alpha20230318",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20230318.xpi"
},
{
"version": "1.9Alpha20230325",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20230325.xpi"
},
{
"version": "1.9Alpha20230407",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20230407.xpi"
},
{
"version": "1.9Alpha20230408",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.9Alpha20230408.xpi"
},
{
"version": "1.10Alpha20230419",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10Alpha20230419.xpi"
},
{
"version": "1.10Alpha20230529",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10Alpha20230529.xpi"
},
{
"version": "1.10Alpha20230530",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10Alpha20230530.xpi"
},
{
"version": "1.10Alpha20230531",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10Alpha20230531.xpi"
},
{
"version": "1.10Alpha20240216",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10Alpha20240216.xpi"
},
{
"version": "1.10.20240217",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.xpi"
},
{
"version": "1.10.20240217.1",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.1.xpi"
},
{
"version": "1.10.20240217.2",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.2.xpi"
},
{
"version": "1.10.20240217.3",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.3.xpi"
},
{
"version": "1.10.20240217.4",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.4.xpi"
},
{
"version": "1.10.20240217.5",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240217.5.xpi"
},
{
"version": "1.10.20240218",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240218.xpi"
},
{
"version": "1.10.20240218.1",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240218.1.xpi"
},
{
"version": "1.10.20240218.2",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240218.2.xpi"
},
{
"version": "1.10.20240218.3",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240218.3.xpi"
},
{
"version": "1.10.20240328",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240328.xpi"
},
{
"version": "1.10.20240330",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240330.xpi"
},
{
"version": "1.10.1.20240405",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.1.20240405.xpi"
},
{
"version": "1.10.20240407",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240407.xpi"
},
{
"version": "1.10.20240407.1",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240407.1.xpi"
},
{
"version": "1.10.20240408",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.10.20240408.xpi"
},
{
"version": "1.11.20240417",
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.11.20240417.xpi"
}
]
}