1
0
mirror of https://github.com/kkapsner/CanvasBlocker synced 2024-09-20 16:41:42 +02:00

Compare commits

...

25 Commits
1.10 ... master

Author SHA1 Message Date
kkapsner
5a1a318b91 Use wrapped arguments in proxy function
Fixes #714
2024-08-21 17:23:16 +02:00
kkapsner
e549267085 Do not fail if navigator is not available 2024-08-21 17:23:16 +02:00
kkapsner
cee0f75293 Code simplification 2024-08-21 17:23:16 +02:00
kkapsner
91dd283b9a
New Czech translation 2024-08-20 17:51:45 +02:00
kkapsner
af5365b4eb Added iFrame tests 2024-08-15 16:58:24 +02:00
kkapsner
1b76df7cbc "removed iframe" method needs to provide a cleanup 2024-07-03 20:58:17 +02:00
kkapsner
474e929638 Update web-ext 2024-07-03 16:42:55 +02:00
kkapsner
642d518110
New Japanese translations 2024-07-03 16:39:45 +02:00
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
32 changed files with 3585 additions and 2002 deletions

View File

@ -46,7 +46,11 @@ async function getAlphaVersion(manifest){
}
const now = new Date();
const date = `${now.getFullYear()}${f(now.getMonth() + 1)}${f(now.getDate())}`;
const baseVersion = `${manifest.version}.${date}`;
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;
}

View File

@ -103,6 +103,10 @@
"message": "Otevřít v samostatném panelu",
"description": ""
},
"labelForDefaultOption": {
"message": " (výchozí)",
"description": ""
},
"group_general": {
"message": "Obecné",
"description": ""
@ -224,7 +228,7 @@
"description": ""
},
"askForInvisiblePermission": {
"message": "Do you want to allow invisible <canvas>?",
"message": "Chcete povolit neviditelný <canvas>?",
"description": ""
},
"askForInvisibleInputPermission": {
@ -232,7 +236,7 @@
"description": ""
},
"askForInvisibleReadoutPermission": {
"message": "Do you want to allow invisible <canvas> readout?",
"message": "Chcete povolit čtení neviditelného <canvas>?",
"description": ""
},
"askForPermission": {
@ -244,11 +248,11 @@
"description": ""
},
"askForReadoutPermission": {
"message": "Do you want to allow <canvas> readout?",
"message": "Chcete povolit čtení <canvas>?",
"description": ""
},
"askForVisiblePermission": {
"message": "Do you want to allow the red bordered <canvas>?",
"message": "Chcete povolit červeně ohraničený <canvas>?",
"description": ""
},
"askForVisibleInputPermission": {
@ -256,7 +260,7 @@
"description": ""
},
"askForVisibleReadoutPermission": {
"message": "Do you want to allow the readout of the red bordered <canvas>?",
"message": "Chcete povolit čtení červeně ohraničeného <canvas>?",
"description": ""
},
"askForAudioPermission": {
@ -268,7 +272,7 @@
"description": ""
},
"askForAudioReadoutPermission": {
"message": "Do you want to allow audio API readout?",
"message": "Chcete povolit čtení audio API?",
"description": ""
},
"askForHistoryPermission": {
@ -280,7 +284,7 @@
"description": ""
},
"askForHistoryReadoutPermission": {
"message": "Do you want to allow history API readout?",
"message": "Chcete povolit čtení API historie?",
"description": ""
},
"askForWindowPermission": {
@ -292,7 +296,7 @@
"description": ""
},
"askForWindowReadoutPermission": {
"message": "Do you want to allow window API readout?",
"message": "Chcete povolit čtení API okna?",
"description": ""
},
"askForDOMRectPermission": {
@ -304,7 +308,7 @@
"description": ""
},
"askForDOMRectReadoutPermission": {
"message": "Do you want to allow DOMRect API readout?",
"message": "Chcete povolit čtení DOMRect API?",
"description": ""
},
"askForSVGPermission": {
@ -316,31 +320,31 @@
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"message": "Chcete povolit čtení API SVG?",
"description": ""
},
"askForTextMetricsPermission": {
"message": "Do you want to allow the TextMetrics API?",
"message": "Chcete povolit TextMetrics API?",
"description": ""
},
"askForTextMetricsInputPermission": {
"message": "Do you want to allow TextMetrics API input?",
"message": "Chcete povolit vstup TextMetrics API?",
"description": ""
},
"askForTextMetricsReadoutPermission": {
"message": "Do you want to allow TextMetrics API readout?",
"message": "Chcete povolit čtení TextMetrics API?",
"description": ""
},
"askForNavigatorPermission": {
"message": "Do you want to allow the navigator API?",
"message": "Chcete povolit navigator API?",
"description": ""
},
"askForNavigatorInputPermission": {
"message": "Do you want to allow navigator API input?",
"message": "Chcete povolit vstup navigator API?",
"description": ""
},
"askForNavigatorReadoutPermission": {
"message": "Do you want to allow navigator API readout?",
"message": "Chcete povolit čtení navigator API?",
"description": ""
},
"askForScreenPermission": {
@ -352,7 +356,7 @@
"description": ""
},
"askForScreenReadoutPermission": {
"message": "Do you want to allow screen API readout?",
"message": "Chcete povolit čtení API obrazovky?",
"description": ""
},
"askOnlyOnce_title": {
@ -408,7 +412,7 @@
"description": ""
},
"blackList_title": {
"message": "Blacklist",
"message": "Seznam zakázaných",
"description": ""
},
"blockMode_description": {
@ -424,7 +428,7 @@
"description": ""
},
"blockMode_options.block": {
"message": "allow only whitelist",
"message": "povolit pouze seznam povolených",
"description": ""
},
"blockMode_options.ask": {
@ -436,11 +440,11 @@
"description": ""
},
"blockMode_options.allow": {
"message": "block only blacklist",
"message": "blokovat pouze seznam zakázaných",
"description": ""
},
"blockMode_options.fake": {
"message": "fake",
"message": "zkreslit",
"description": ""
},
"blockMode_title": {
@ -448,11 +452,11 @@
"description": ""
},
"protectedCanvasPart_title": {
"message": "Protected part of the canvas API",
"message": "Chráněna část canvas API",
"description": ""
},
"protectedCanvasPart_description": {
"message": "nothing: no features of the canvas API are protected.\n\nreadout: the readout features of the canvas API are protected.\n\ninput: the input features of the canvas API are protected. With blocking mode \"fake\" the drawn pixels get modified slightly when displaying text. This makes the detection of the add-on harder but is less secure. With WebGL canvases the behaviour is identical to \"readout\".\n\neverything: both the readout and input features are protected. It's not recommended to use this with \"fake\" block mode as it increases the probability to be detected.",
"message": "nic: nejsou chráněny žádné funkce canvas API.\n\nčtení: funkce čtení canvas API jsou chráněny.\n\nvstup: vstupní funkce canvas API jsou chráněny. V režimu blokování \"zkreslit\" se nakreslené pixely při zobrazení textu mírně upraví. Díky tomu je detekce doplňku složitější, ale je to méně bezpečné. S WebGL canvasy je chování totožné s \"čtením\".\n\nvše: jak čtení, tak vstupní funkce jsou chráněny. Není doporučeno použít toto s režimem blokování nastaveným na \"zkreslit\", protože se zvyšuje pravděpodobnost detekce.",
"description": ""
},
"protectedCanvasPart_urlSpecific": {
@ -460,7 +464,7 @@
"description": ""
},
"protectedCanvasPart_options.nothing": {
"message": "nothing",
"message": "nic",
"description": ""
},
"protectedCanvasPart_options.input": {
@ -468,7 +472,7 @@
"description": ""
},
"protectedCanvasPart_options.readout": {
"message": "readout",
"message": "čtení",
"description": ""
},
"protectedCanvasPart_options.everything": {
@ -484,7 +488,7 @@
"description": ""
},
"inputURL": {
"message": "Input domain or URL \"RegExp\":",
"message": "Zadejte doménu nebo URL \"RegExp\":",
"description": ""
},
"minFakeSize_description": {
@ -636,35 +640,35 @@
"description": ""
},
"webGLVendor_title": {
"message": "Reported webGL vendor",
"message": "Nahlášený webGL dodavatel",
"description": ""
},
"webGLVendor_description": {
"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)",
"message": "Hodnota, která má být hlášena ve funkci webGL \"getParameter\" pro \"vendor\". Speciální hodnoty:\nPro použití původní hodnoty nechte prázdné.\n\n{undefined}: vrací nedefinovanou hodnotu (#508)\n\n{false}: vrací logickou hodnotu false (#508).\n\n{empty}: vrací prázdný řetězec (#508)\n\n{disabled}: vrací null (#508)\n\n{random vendor}: vrací náhodného dodavatele z vestavěného seznamu (#493).\n\n{random renderer}: vrací náhodný renderer z vestavěného seznamu (#493)\n\n<xxx|yyy|zzz>: náhodně vybere jednu ze zadaných možností xxx, yyy nebo zzz (libovolný počet možností) (#493)",
"description": ""
},
"webGLRenderer_title": {
"message": "Reported webGL renderer",
"message": "Nahlášené vykreslování webGL",
"description": ""
},
"webGLRenderer_description": {
"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)",
"message": "Hodnota, která má být hlášena ve funkci webGL \"getParameter\" pro \"vykreslování\". Speciální hodnoty:\nPro použití původní hodnoty nechte prázdné.\n\n{undefined}: vrací nedefinovanou hodnotu (#508)\n\n{false}: vrací logickou hodnotu false (#508).\n\n{empty}: vrací prázdný řetězec (#508)\n\n{disabled}: vrací null (#508)\n\n{random vendor}: vrací náhodného dodavatele z vestavěného seznamu (#493).\n\n{random renderer}: vrací náhodný renderer z vestavěného seznamu (#493)\n\n<xxx|yyy|zzz>: náhodně vybere jednu ze zadaných možností xxx, yyy nebo zzz (libovolný počet možností) (#493)",
"description": ""
},
"webGLUnmaskedVendor_title": {
"message": "Reported webGL unmasked vendor",
"message": "Nahlášen webGL nezamaskovaný dodavatel",
"description": ""
},
"webGLUnmaskedVendor_description": {
"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)",
"message": "Hodnota, která má být hlášena ve funkci webGL \"getParameter\" pro \"nezamaskovaného dodavatele\". Speciální hodnoty:\nPro použití původní hodnoty nechte prázdné.\n\n{undefined}: vrací nedefinovanou hodnotu (#508)\n\n{false}: vrací logickou hodnotu false (#508).\n\n{empty}: vrací prázdný řetězec (#508)\n\n{disabled}: vrací null (#508)\n\n{random vendor}: vrací náhodného dodavatele z vestavěného seznamu (#493).\n\n{random renderer}: vrací náhodný renderer z vestavěného seznamu (#493)\n\n<xxx|yyy|zzz>: náhodně vybere jednu ze zadaných možností xxx, yyy nebo zzz (libovolný počet možností) (#493)",
"description": ""
},
"webGLUnmaskedRenderer_title": {
"message": "Reported webGL unmasked renderer",
"message": "Nahlášeno webGL nezamaskované vykreslování",
"description": ""
},
"webGLUnmaskedRenderer_description": {
"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)",
"message": "Hodnota, která má být hlášena ve funkci webGL \"getParameter\" pro \"nezamaskované vykreslování\". Speciální hodnoty:\nPro použití původní hodnoty nechte prázdné.\n\n{undefined}: vrací nedefinovanou hodnotu (#508)\n\n{false}: vrací logickou hodnotu false (#508).\n\n{empty}: vrací prázdný řetězec (#508)\n\n{disabled}: vrací null (#508)\n\n{random vendor}: vrací náhodného dodavatele z vestavěného seznamu (#493).\n\n{random renderer}: vrací náhodný renderer z vestavěného seznamu (#493)\n\n<xxx|yyy|zzz>: náhodně vybere jednu ze zadaných možností xxx, yyy nebo zzz (libovolný počet možností) (#493)",
"description": ""
},
"useCanvasCache_title": {
@ -692,7 +696,7 @@
"description": ""
},
"displayCallingStack": {
"message": "display calling stack",
"message": "zobrazit zásobník volání",
"description": ""
},
"displayFullURL": {
@ -704,7 +708,7 @@
"description": ""
},
"enableStackList_title": {
"message": "Use file specific whitelist",
"message": "Použít seznam povolených s ohledem na soubor",
"description": ""
},
"preBlock": {
@ -716,39 +720,39 @@
"description": ""
},
"fakedReadout": {
"message": "Faked canvas readout on {url}",
"message": "Zkresleno čtení canvasu na {url}",
"description": ""
},
"fakedAudioReadout": {
"message": "Faked audio readout on {url}",
"message": "Zkresleno čtení audia na {url}",
"description": ""
},
"fakedHistoryReadout": {
"message": "Faked history readout on {url}",
"message": "Zkresleno čtení historie na {url}",
"description": ""
},
"fakedWindowReadout": {
"message": "Faked window readout on {url}",
"message": "Zkresleno čtení okna na {url}",
"description": ""
},
"fakedDOMRectReadout": {
"message": "Faked DOMRect readout on {url}",
"message": "Zkresleno čtení DOMRect na {url}",
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"message": "Zkresleno čtení SVG na {url}",
"description": ""
},
"fakedTextMetricsReadout": {
"message": "Faked TextMetrics readout on {url}",
"message": "Zkresleno čtení TextMetrics na {url}",
"description": ""
},
"fakedNavigatorReadout": {
"message": "Faked navigator readout on {url}",
"message": "Zkresleno čtení navigator na {url}",
"description": ""
},
"fakedScreenReadout": {
"message": "Faked screen readout on {url}",
"message": "Zkresleno čtení obrazovky na {url}",
"description": ""
},
"fakedInput": {
@ -776,7 +780,7 @@
"description": ""
},
"ignorelistDomain": {
"message": "silence domain",
"message": "umlčet doménu",
"description": ""
},
"ignorelistURL": {
@ -788,7 +792,7 @@
"description": ""
},
"inputIgnore": {
"message": "Input domain or URL \"RegExp\" to add to ignore list:",
"message": "Vložte doménu nebo URL \"RegExp\" pro přidání do seznamu ignorovaných:",
"description": ""
},
"inputIgnoreDomain": {
@ -796,7 +800,7 @@
"description": ""
},
"inputIgnoreURL": {
"message": "Input URL \"RegExp\" to add to ignore list:",
"message": "Zadejte URL \"RegExp\" pro přidání do seznamu ignorovaných:",
"description": ""
},
"selectWhitelist": {
@ -804,7 +808,7 @@
"description": ""
},
"inputWhitelist": {
"message": "Input domain or URL \"RegExp\" to add to whitelist:",
"message": "Zadejte doménu nebo URL \"RegExp\" pro přidání do seznamu povolených:",
"description": ""
},
"inputWhitelistDomain": {
@ -812,7 +816,7 @@
"description": ""
},
"inputWhitelistURL": {
"message": "Input URL \"RegExp\" to add to whitelist:",
"message": "Zadejte URL \"RegExp\" pro přidání do seznamu povolených:",
"description": ""
},
"selectSessionWhitelist": {
@ -820,7 +824,7 @@
"description": ""
},
"inputSessionWhitelist": {
"message": "Input domain or URL \"RegExp\" to add to the session whitelist:",
"message": "Zadejte doménu nebo URL \"RegExp\" pro přidání do seznamu povolených v rámci relace:",
"description": ""
},
"inputSessionWhitelistDomain": {
@ -828,7 +832,7 @@
"description": ""
},
"inputSessionWhitelistURL": {
"message": "Input URL \"RegExp\" to add to the session whitelist:",
"message": "Zadejte URL \"RegExp\" pro přidání do seznamu povolených v rámci relace:",
"description": ""
},
"selectWhitelistScope": {
@ -856,7 +860,7 @@
"description": ""
},
"showCallingFile_title": {
"message": "Show calling file",
"message": "Zobrazit soubor volání",
"description": ""
},
"showCompleteCallingStack_description": {
@ -864,7 +868,7 @@
"description": ""
},
"showCompleteCallingStack_title": {
"message": "Display complete calling stack",
"message": "Zobrazit celý zásobník volání",
"description": ""
},
"showNotifications_description": {
@ -936,11 +940,11 @@
"description": ""
},
"sourceOutput": {
"message": "Calling file",
"message": "Soubor volání",
"description": ""
},
"stackEntryOutput": {
"message": "{url} line {line} column {column}",
"message": "{url} řádek {line} sloupec {column}",
"description": ""
},
"stackList_description": {
@ -948,11 +952,11 @@
"description": ""
},
"stackList_title": {
"message": "File specific whitelist",
"message": "Seznam povolených s ohledem na soubor",
"description": ""
},
"whiteList_title": {
"message": "Whitelist",
"message": "Seznam povolených",
"description": ""
},
"whiteList_description": {
@ -984,7 +988,7 @@
"description": ""
},
"sessionWhiteList_title": {
"message": "Session whitelist",
"message": "Seznam povolených v rámci relace",
"description": ""
},
"sessionWhiteList_description": {
@ -1140,7 +1144,7 @@
"description": ""
},
"protectWindow_description": {
"message": "window.opener and window.name will be protected. This can render some webpages unusable.",
"message": "window.opener a window.name budou chráněny. To může způsobit nefunkčnost některých stránek.",
"description": ""
},
"protectWindow_urlSpecific": {
@ -1152,7 +1156,7 @@
"description": ""
},
"allowWindowNameInFrames_title": {
"message": "Allow window.name in frames",
"message": "Povolit window.name v rámech",
"description": ""
},
"allowWindowNameInFrames_description": {
@ -1196,11 +1200,11 @@
"description": ""
},
"protectTextMetrics_title": {
"message": "Protect TextMetrics API",
"message": "Chránit TextMetrics API",
"description": ""
},
"protectTextMetrics_description": {
"message": "This protects against the \"measureText()\" fingerprinting which can be used to cross validate DOMRect values.",
"message": "Toto chrání před sběrem otisků \"measureText()\", který lze použít ke křížovému ověření hodnot DOMRect.",
"description": ""
},
"protectTextMetrics_urlSpecific": {
@ -1208,11 +1212,11 @@
"description": ""
},
"protectNavigator_title": {
"message": "Protect navigator API",
"message": "Chránit navigator API",
"description": ""
},
"protectNavigator_description": {
"message": "This page allows for changes in the navigator API. Enabling this protection does not change anything by default. Open the navigator settings to specify the changes you want to have there.",
"message": "Tato stránka umožňuje změny v navigator API. Povolení této ochrany ve výchozím nastavení nic nemění. Otevřete nastavení navigátora pro stanovení změn, které zde chcete provést.",
"description": ""
},
"protectNavigator_urlSpecific": {
@ -1220,7 +1224,7 @@
"description": ""
},
"openNavigatorSettings_title": {
"message": "Navigator settings",
"message": "Nastavení navigator",
"description": ""
},
"openNavigatorSettings_description": {
@ -1232,11 +1236,11 @@
"description": ""
},
"navigatorSettings_title": {
"message": "CanvasBlocker navigator settings",
"message": "CanvasBlocker navigator nastavení",
"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": "Na této stránce můžete zvolit nastavení navigator. Pokud používáte přednastavení, měli byste vždy použít předvolbu operačního systému a prohlížeče. Po jejich výběru stále můžete provést úpravy.",
"description": ""
},
"navigatorSettings_disclaimer": {
@ -1256,7 +1260,7 @@
"description": ""
},
"navigatorSettings_values": {
"message": "Navigator values",
"message": "Navigator hodnoty",
"description": ""
},
"navigatorSettings_reset": {
@ -1328,15 +1332,15 @@
"description": ""
},
"theme_options.none": {
"message": "none",
"message": "nic",
"description": ""
},
"blockDataURLs_title": {
"message": "Block data URL pages",
"message": "Blokovat stránky 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": "Data URL stránky nelze chránit před otisky (viz https://bugzilla.mozilla.org/show_bug.cgi?id=1475831). Jejich blokování brání skutečnému otisku dosáhnout jakéhokoli serveru.",
"description": ""
},
"blockDataURLs_urlSpecific": {
@ -1524,7 +1528,7 @@
"description": ""
},
"sanitation_resolution.disableMainFlag": {
"message": "disable main flag",
"message": "zakázat hlavní vlajku",
"description": ""
},
"sanitation_resolution.enableFeatures": {
@ -1532,11 +1536,11 @@
"description": ""
},
"sanitation_error.badBlockMode": {
"message": "It is recommended to use the \"fake\" or \"ask\" blocking modes.",
"message": "Doporučuje se používat režimy blokování \"zkreslit\" nebo \"zeptat se\".",
"description": ""
},
"sanitation_resolution.switchToFake": {
"message": "switch to \"fake\"",
"message": "přepněte na \"zkreslit\"",
"description": ""
},
"sanitation_error.blockModeVsProtection": {
@ -1544,7 +1548,7 @@
"description": ""
},
"sanitation_resolution.disableFlag": {
"message": "disable \"{flag}\"",
"message": "zakázat \"{flag}\"",
"description": ""
},
"sanitation_error.fakeInputWithWhiteRng": {
@ -1552,11 +1556,11 @@
"description": ""
},
"sanitation_resolution.switchToProtectReadout": {
"message": "switch to protect readout",
"message": "přepněte na ochranu čtení",
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "přepněte na \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {
@ -1564,7 +1568,7 @@
"description": ""
},
"sanitation_resolution.switchToProtectInput": {
"message": "switch to protect input",
"message": "přepněte na ochranu vstupu",
"description": ""
},
"sanitation_error.valueTooLow": {
@ -1596,7 +1600,7 @@
"description": ""
},
"whitelist_inspection_title": {
"message": "CanvasBlocker whitelist inspection",
"message": "CanvasBlocker inspekce seznamu povolených",
"description": ""
},
"whitelist_inspection_description": {

View File

@ -103,6 +103,10 @@
"message": "In separatem Tab öffnen",
"description": ""
},
"labelForDefaultOption": {
"message": " (Standard)",
"description": ""
},
"group_general": {
"message": "Allgemein",
"description": ""
@ -504,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. Beachten Sie, dass für viele APIs ein Zwischenspeicher verwendet wird, um eine Detektion zu verhindern.\n\nkonstant: Variante von nicht persistent. 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.",
"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": {
@ -516,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "nicht persistent",
"message": "nichtpersistent",
"description": ""
},
"rng_options.white": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "wechsle zu \"nicht persistent\"",
"message": "wechsle zu \"nichtpersistent\"",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -109,6 +109,11 @@
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "General",
"description": ""
@ -495,7 +500,7 @@
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -527,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -539,7 +544,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -1621,7 +1626,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -103,6 +103,10 @@
"message": "Abrir en una pestaña separada",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "General",
"description": ""
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {

View File

@ -103,6 +103,10 @@
"message": "Ouvrir dans un onglet séparé",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Général",
"description": ""
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {

View File

@ -103,6 +103,10 @@
"message": "अलग टैब में खोलें",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "जनरल",
"description": ""
@ -476,7 +480,7 @@
"description": ""
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -516,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -103,6 +103,10 @@
"message": "Apri in una nuova scheda",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Generale",
"description": ""

1670
_locales/ja/messages.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -103,6 +103,10 @@
"message": "별도의 탭에서 열기",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "일반 설정",
"description": ""
@ -476,7 +480,7 @@
"description": ""
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -516,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -103,6 +103,10 @@
"message": "Open in separate tab",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "General",
"description": ""
@ -476,7 +480,7 @@
"description": ""
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -516,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -103,6 +103,10 @@
"message": "Åpne i egen fane",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Generelt",
"description": ""
@ -476,7 +480,7 @@
"description": ""
},
"urlSettings_title": {
"message": "Site specific values",
"message": "Site-specific values",
"description": ""
},
"urlSettings_description": {
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -516,7 +520,7 @@
"description": ""
},
"rng_options.nonPersistent": {
"message": "non persistent",
"message": "nonpersistent",
"description": ""
},
"rng_options.white": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -103,6 +103,10 @@
"message": "Otwórz w nowej karcie",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Ogólne",
"description": ""
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -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": {
@ -100,7 +100,11 @@
"description": ""
},
"openInTab": {
"message": "Abrir num noutro separador",
"message": "Abrir noutro separador",
"description": ""
},
"labelForDefaultOption": {
"message": " (padrão)",
"description": ""
},
"group_general": {
@ -312,11 +316,11 @@
"description": ""
},
"askForSVGInputPermission": {
"message": "Do you want to allow SVG API input?",
"message": "Quer permitir a entrada da API de SVG?",
"description": ""
},
"askForSVGReadoutPermission": {
"message": "Do you want to allow SVG API readout?",
"message": "Quer permitir a leitura da API de SVG?",
"description": ""
},
"askForTextMetricsPermission": {
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -640,7 +644,7 @@
"description": ""
},
"webGLVendor_description": {
"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)",
"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": {
@ -648,7 +652,7 @@
"description": ""
},
"webGLRenderer_description": {
"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)",
"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": {
@ -656,7 +660,7 @@
"description": ""
},
"webGLUnmaskedVendor_description": {
"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)",
"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": {
@ -664,7 +668,7 @@
"description": ""
},
"webGLUnmaskedRenderer_description": {
"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)",
"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": {
@ -736,7 +740,7 @@
"description": ""
},
"fakedSVGReadout": {
"message": "Faked SVG readout on {url}",
"message": "Leitura falsa de SVG em {url}",
"description": ""
},
"fakedTextMetricsReadout": {
@ -836,7 +840,7 @@
"description": ""
},
"selectWhitelistType": {
"message": "What is the type of the whitelisting?",
"message": "Qual é o tipo de lista branca?",
"description": ""
},
"whitelistOnlyAPI": {
@ -1184,15 +1188,15 @@
"description": ""
},
"protectSVG_title": {
"message": "Protect SVG API",
"message": "Proteger a API de SVG",
"description": ""
},
"protectSVG_description": {
"message": "This protects against fingerprinting using SVGs.",
"message": "Isso protege contra o fingerprinting usando 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.",
"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": {
@ -1600,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

@ -103,6 +103,10 @@
"message": "Abrir numa aba separada",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Geral",
"description": ""

View File

@ -103,6 +103,10 @@
"message": "Открыть в отдельной вкладке",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "Основные",
"description": ""

View File

@ -103,6 +103,10 @@
"message": "在新标签页中打开",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "一般",
"description": ""
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {

View File

@ -103,6 +103,10 @@
"message": "在新的隱身標籤頁中打開",
"description": ""
},
"labelForDefaultOption": {
"message": " (default)",
"description": ""
},
"group_general": {
"message": "一般設定",
"description": ""
@ -504,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. Keep in mind that many API protections have caches in place to prevent detection.\n\nconstant: variation of non persistent. 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.",
"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": {
@ -1556,7 +1560,7 @@
"description": ""
},
"sanitation_resolution.switchToNonPersistentRng": {
"message": "switch to \"non persistent\" rng",
"message": "switch to \"nonpersistent\" rng",
"description": ""
},
"sanitation_error.fakeEverythingInCanvas": {

View File

@ -141,41 +141,110 @@
};
const proxies = new Map();
const changedToStrings = new WeakMap();
scope.createProxyFunction = function createProxyFunction(window, original, replacement){
if (!changedToStrings.get(window)){
const functionPrototype = scope.getWrapped(window).Function.prototype;
const originalToString = functionPrototype.toString;
changedToStrings.set(window, originalToString);
const alteredToString = scope.exportFunctionWithName(function toString(){
return proxies.get(this) || originalToString.call(this);
}, window, "toString");
proxies.set(alteredToString, originalToString.call(originalToString));
scope.changeProperty(window, "toString", {
object: functionPrototype,
name: "toString",
type: "value",
changed: alteredToString
});
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){
args = scope.getWrapped(args);
try {
return args.length?
replacement.call(thisArgs, ...args):
replacement.call(thisArgs);
replacement.call(thisArg, ...args):
replacement.call(thisArg);
}
catch (error){
try {
return original.apply(thisArgs, args);
return original.apply(thisArg, args);
}
catch (error){
return target.apply(thisArgs, args);
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, changedToStrings.get(window).call(original));
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);
};

View File

@ -344,15 +344,11 @@
let changed;
if (type ==="value"){
if (changedFunction.fakeGenerator){
const generated = changedFunction.fakeGenerator(checker, original, windowToProcess);
if ((changedFunction.exportOptions || {}).allowCallbacks){
changed = extension.exportFunctionWithName(
changedFunction.fakeGenerator(checker, original, windowToProcess),
windowToProcess,
original.name
);
changed = extension.exportFunctionWithName(generated, windowToProcess, original.name);
}
else {
const generated = changedFunction.fakeGenerator(checker, original, windowToProcess);
changed = extension.createProxyFunction(windowToProcess, original, generated);
}
}

View File

@ -427,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
});
}
@ -462,7 +462,7 @@
return getIsPointValue({
func,
x, y,
index: x + this.width * y,
index: x + this.canvas.width * y,
originalValue, window, prefs
});
}

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

@ -2,7 +2,7 @@
{
"name": "CanvasBlocker",
"description": "__MSG_addon_description__",
"version": "1.10",
"version": "1.11",
"icons": {
"48": "icons/icon.svg",
"96": "icons/icon.svg"

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");
}
@ -232,7 +256,7 @@
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");
}
@ -319,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");
}
});

3247
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@
"eslint-plugin-eslint-comments": "^3.2.0",
"eslint-plugin-html": "^8.0.0",
"eslint-plugin-promise": "^6.1.1",
"web-ext": "^7.11.0",
"web-ext": "^8.2.0",
"yargs": "^17.7.2"
},
"scripts": {},

View File

@ -1,3 +1,32 @@
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

View File

@ -96,7 +96,10 @@ const iframeAPI = function(){
return new Promise(function(resolve){
window.setTimeout(function(){
console.log("window of iframe in timeout", iframeWindow);
resolve(iframeWindow);
resolve({
window: iframeWindow,
cleanup: function(){}
});
}, 1000);
});
}

View File

@ -66,15 +66,24 @@ iframeAPI.forEachMethod(async function(windowToUse, name){
const navigator = windowToUse.navigator;
const values = {};
const keys = Object.keys(navigator.__proto__);
let hasPropertyError = false;
keys.forEach(function(property){
const value = navigator[property];
if ((typeof value) === "string"){
values[property] = value;
try {
const value = navigator[property];
if ((typeof value) === "string"){
values[property] = value;
}
}
catch (error){
hasPropertyError = true;
console.warn(name, error);
}
});
const storage = await navigator.storage.estimate();
values.storage_quota = storage.quota.toString(10);
keys.push("storage_quota");
if (!hasPropertyError){
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);
});

View File

@ -102,5 +102,6 @@
</div>
<script src="testAPI.js"></script>
<script src="canvasAPI.js"></script>
<script src="iframeAPI.js"></script>
<script src="test.js"></script>
</body></html>

View File

@ -157,4 +157,14 @@ async function offscreenTest(){
await offscreenCanvas.toBlob();
return {url: await testAPI.readBlob(blob)};
}
}
iframeAPI.forEachMethod(async function(windowToUse, name){
"use strict";
const {url, imageData, isPointInPath} = canvasAPI.fingerprint(windowToUse);
const hashes = await Promise.all([
testAPI.hash(url),
imageData? testAPI.hash(imageData.data): ""
]);
console.log(name, hashes[0], "/", hashes[1], isPointInPath);
});

View File

@ -261,6 +261,82 @@
{
"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"
}
]
}